@kb-labs/release-manager-core 2.109.0 → 2.110.0

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.
package/dist/index.d.ts CHANGED
@@ -142,6 +142,20 @@ interface FlowConfig {
142
142
  * back into a flow (`resolveFlowFromTag`) — see `./tag.ts`.
143
143
  */
144
144
  tagPattern?: string;
145
+ /** Replaces global build config for this flow. */
146
+ build?: BuildConfig;
147
+ }
148
+ interface BuildConfig {
149
+ /**
150
+ * Name of a script in the repo root package.json to build all packages
151
+ * in the flow as one unit (run as `pnpm run <script>`, e.g.
152
+ * "build:affected"). Replaces the built-in per-package tsup build
153
+ * entirely — use this if you already have a build tool (topological
154
+ * ordering, caching, etc.) and don't want the release pipeline
155
+ * reimplementing it. Exit code 0 = success. When unset, falls back to
156
+ * the built-in safe-build strategy (`buildPackages` in build.ts).
157
+ */
158
+ script?: string;
145
159
  }
146
160
  interface PackagesFilter {
147
161
  /** Glob dirs to scan, e.g. ['packages/*', 'apps/*'].
@@ -189,6 +203,8 @@ interface ReleaseConfig {
189
203
  type?: 'pnpm' | 'npm' | 'yarn';
190
204
  root?: string;
191
205
  };
206
+ /** Global build config — overridable per flow. See BuildConfig. */
207
+ build?: BuildConfig;
192
208
  /** Filter which packages are discovered and released. */
193
209
  packages?: PackagesFilter;
194
210
  /** Per-scope overrides — packages filter merged with global, checks replace global entirely. */
@@ -631,6 +647,11 @@ declare function runReleasePipeline(options: PipelineOptions): Promise<PipelineR
631
647
  /**
632
648
  * Build all packages in a plan using safe build strategy.
633
649
  * Stops on first failure.
650
+ *
651
+ * Packages are topologically sorted first so an intra-release dependency
652
+ * (e.g. @kb-labs/sdk) always builds before its dependants — otherwise a
653
+ * dependant can fail to resolve the dependency's subpath exports in a
654
+ * fresh worktree where nothing has a pre-existing dist/ yet.
634
655
  */
635
656
  declare function buildPackages(packages: PackageVersion[], options?: {
636
657
  logger?: PluginLogger;
@@ -756,4 +777,4 @@ declare function verifyAgainstRegistry(packages: PublishablePackage[], options:
756
777
  */
757
778
  declare function resolveScopePath(repoRoot: string, scope: string): Promise<string>;
758
779
 
759
- export { type AuditSummary, type BuildResult, type ChangelogGenerator, type CheckId, type CheckResult, type CheckResultDetails, type CustomCheckConfig, DEFAULT_ROOT_CHANGELOG_PATH, DEFAULT_TAG_PATTERN, type FlowConfig, type PackagePublisher, type PackageVersion, type PackagesFilter, type PipelineOptions, type PipelineResult, type PlannerOptions, type PluginLogger, type PublishResult, type PublishablePackage, type ReleaseChannel, type ReleaseConfig, type ReleaseContext, type ReleasePlan, type ReleaseReport, type ReleaseResult, type ReleaseStage, type RollbackSnapshot, type StrategyOptions, type VerifyResult, type VersionBump, type VersionStrategy, applyCanarySuffix, applyVersionStrategy, buildPackages, buildReleaseTag, commitAndTagRelease, copyChangelogToPackages, createExecaShellAdapter, discoverCurrentPackages, isBuildCommand, isVersionPublished, matchesPackagePattern, mergeConfigWithFlow, mergeRootChangelog, planRelease, renderJson, renderMarkdown, renderText, resolveFlowFromTag, resolvePublishRegistry, resolvePublishTag, resolveRootChangelogRelPath, resolveScopePath, restoreSnapshot, runReleaseChecks, runReleasePipeline, runSafeBuild, saveSnapshot, spawnCommand, updatePackageVersion, updatePackageVersions, verifyAgainstRegistry, verifyExtractedTarball, verifyPackage, verifyPackages };
780
+ export { type AuditSummary, type BuildConfig, type BuildResult, type ChangelogGenerator, type CheckId, type CheckResult, type CheckResultDetails, type CustomCheckConfig, DEFAULT_ROOT_CHANGELOG_PATH, DEFAULT_TAG_PATTERN, type FlowConfig, type PackagePublisher, type PackageVersion, type PackagesFilter, type PipelineOptions, type PipelineResult, type PlannerOptions, type PluginLogger, type PublishResult, type PublishablePackage, type ReleaseChannel, type ReleaseConfig, type ReleaseContext, type ReleasePlan, type ReleaseReport, type ReleaseResult, type ReleaseStage, type RollbackSnapshot, type StrategyOptions, type VerifyResult, type VersionBump, type VersionStrategy, applyCanarySuffix, applyVersionStrategy, buildPackages, buildReleaseTag, commitAndTagRelease, copyChangelogToPackages, createExecaShellAdapter, discoverCurrentPackages, isBuildCommand, isVersionPublished, matchesPackagePattern, mergeConfigWithFlow, mergeRootChangelog, planRelease, renderJson, renderMarkdown, renderText, resolveFlowFromTag, resolvePublishRegistry, resolvePublishTag, resolveRootChangelogRelPath, resolveScopePath, restoreSnapshot, runReleaseChecks, runReleasePipeline, runSafeBuild, saveSnapshot, spawnCommand, updatePackageVersion, updatePackageVersions, verifyAgainstRegistry, verifyExtractedTarball, verifyPackage, verifyPackages };
package/dist/index.js CHANGED
@@ -110,7 +110,8 @@ function mergeConfigWithFlow(config, flowName) {
110
110
  ...config,
111
111
  ...flow.packages !== void 0 && { packages: flow.packages },
112
112
  ...flow.versioningStrategy && { versioningStrategy: flow.versioningStrategy },
113
- ...flow.checks !== void 0 && { checks: flow.checks }
113
+ ...flow.checks !== void 0 && { checks: flow.checks },
114
+ ...flow.build !== void 0 && { build: flow.build }
114
115
  };
115
116
  }
116
117
  async function isVersionPublished(name, version, registry) {
@@ -1012,9 +1013,72 @@ function resolvePublishRegistry(config, channel) {
1012
1013
  }
1013
1014
  return config.registry ?? DEFAULT_NPM_REGISTRY;
1014
1015
  }
1016
+ function buildIntraDeps(packages, nameSet) {
1017
+ const deps = /* @__PURE__ */ new Map();
1018
+ for (const pkg of packages) {
1019
+ const intra = /* @__PURE__ */ new Set();
1020
+ try {
1021
+ const pkgJson = JSON.parse(readFileSync(join(pkg.path, "package.json"), "utf-8"));
1022
+ for (const section of ["dependencies", "peerDependencies"]) {
1023
+ for (const depName of Object.keys(pkgJson[section] ?? {})) {
1024
+ if (nameSet.has(depName)) {
1025
+ intra.add(depName);
1026
+ }
1027
+ }
1028
+ }
1029
+ } catch {
1030
+ }
1031
+ deps.set(pkg.name, intra);
1032
+ }
1033
+ return deps;
1034
+ }
1035
+ function buildDependantsMap(names, deps) {
1036
+ const dependants = /* @__PURE__ */ new Map();
1037
+ for (const name of names) {
1038
+ for (const dep of deps.get(name) ?? []) {
1039
+ if (!dependants.has(dep)) {
1040
+ dependants.set(dep, /* @__PURE__ */ new Set());
1041
+ }
1042
+ dependants.get(dep).add(name);
1043
+ }
1044
+ }
1045
+ return dependants;
1046
+ }
1047
+ function topoSortForBuild(packages) {
1048
+ const byName = new Map(packages.map((p) => [p.name, p]));
1049
+ const nameSet = new Set(packages.map((p) => p.name));
1050
+ const deps = buildIntraDeps(packages, nameSet);
1051
+ const dependants = buildDependantsMap([...nameSet], deps);
1052
+ const remaining = new Map(
1053
+ packages.map((p) => [p.name, (deps.get(p.name) ?? /* @__PURE__ */ new Set()).size])
1054
+ );
1055
+ const ordered = [];
1056
+ while (remaining.size > 0) {
1057
+ const ready = [...remaining.entries()].filter(([, count]) => count === 0).map(([name]) => name);
1058
+ if (ready.length === 0) {
1059
+ for (const name of remaining.keys()) {
1060
+ ordered.push(byName.get(name));
1061
+ }
1062
+ break;
1063
+ }
1064
+ for (const name of ready) {
1065
+ ordered.push(byName.get(name));
1066
+ remaining.delete(name);
1067
+ for (const dependant of dependants.get(name) ?? []) {
1068
+ if (remaining.has(dependant)) {
1069
+ remaining.set(dependant, (remaining.get(dependant) ?? 1) - 1);
1070
+ }
1071
+ }
1072
+ }
1073
+ }
1074
+ return ordered;
1075
+ }
1076
+
1077
+ // src/build.ts
1015
1078
  async function buildPackages(packages, options) {
1016
1079
  const results = [];
1017
- for (const pkg of packages) {
1080
+ const ordered = topoSortForBuild(packages);
1081
+ for (const pkg of ordered) {
1018
1082
  options?.logger?.info?.(`Building ${pkg.name}...`);
1019
1083
  const result = await runSafeBuild(pkg.path, pkg.name);
1020
1084
  results.push({ ...result, name: pkg.name });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/versioning-strategies.ts","../src/planner.ts","../src/checkpoint.ts","../src/tag.ts","../src/publisher.ts","../src/rollback.ts","../src/reporters/json.ts","../src/reporters/markdown.ts","../src/reporters/text.ts","../src/shell-adapter.ts","../src/channel.ts","../src/build.ts","../src/checks.ts","../src/verifier.ts","../src/verdaccio-verify.ts","../src/lock.ts","../src/pipeline.ts","../src/scope.ts"],"names":["semver","resolve","isPathPattern","join","existsSync","readFile","simpleGit","mkdir","writeFile","formatTiming","readFileSync","tmpdir","randomBytes","mkdirSync","writeFileSync","exports","dirname","spawnSync","readdirSync","rmSync","unlinkSync","scopeDir","historyDir","globby"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Versioning strategies for monorepo package releases\n *\n * - lockstep: All packages get the same version (maximum bump)\n * - independent: Each package has its own version\n * - adaptive: Lockstep if breaking changes, otherwise independent\n */\n\nimport semver from 'semver';\nimport type { PackageVersion, VersionBump } from './types';\n\nexport type VersionStrategy = 'lockstep' | 'independent' | 'adaptive';\n\nexport interface StrategyOptions {\n strategy: VersionStrategy;\n umbrellaPath?: string; // path to umbrella root (for filtering)\n}\n\n/**\n * Apply versioning strategy to packages\n */\nexport function applyVersionStrategy(\n packages: PackageVersion[],\n options: StrategyOptions\n): PackageVersion[] {\n if (options.strategy === 'lockstep') {\n return applyLockstep(packages);\n }\n\n if (options.strategy === 'adaptive') {\n return applyAdaptive(packages);\n }\n\n // independent (default) - no changes needed\n return packages;\n}\n\n/**\n * Lockstep: All packages get the maximum version bump\n *\n * Example:\n * - Package A: 1.0.0 -> 1.1.0 (minor)\n * - Package B: 1.0.0 -> 2.0.0 (major)\n * Result: Both get 2.0.0 (maximum bump = major)\n */\nfunction applyLockstep(packages: PackageVersion[]): PackageVersion[] {\n if (packages.length === 0) {return packages;}\n\n // Find the maximum bump level\n const maxBump = getMaxBump(packages);\n\n // Find the highest current version\n const maxVersion = packages.reduce((max, pkg) => {\n return semver.gt(pkg.currentVersion, max) ? pkg.currentVersion : max;\n }, packages[0]!.currentVersion); // ! safe: length already checked\n\n // Compute next version from max version + max bump\n // Filter out 'auto' since semver.inc expects ReleaseType\n const releaseType = maxBump === 'auto' ? 'patch' : maxBump;\n const nextVersion = semver.inc(maxVersion, releaseType) || maxVersion;\n\n // Apply to all packages\n return packages.map(pkg => ({\n ...pkg,\n bump: maxBump,\n nextVersion,\n }));\n}\n\n/**\n * Adaptive: Lockstep if breaking changes, otherwise independent\n *\n * This is useful for umbrellas where you want to keep versions in sync\n * when there are breaking changes, but allow independent releases otherwise.\n */\nfunction applyAdaptive(packages: PackageVersion[]): PackageVersion[] {\n const hasBreaking = packages.some(pkg => pkg.bump === 'major');\n\n // If any package has breaking changes, use lockstep\n if (hasBreaking) {\n return applyLockstep(packages);\n }\n\n // Otherwise, use independent (no changes)\n return packages;\n}\n\n/**\n * Apply a canary prerelease suffix to already-computed nextVersion values.\n *\n * Runs AFTER applyVersionStrategy() (lockstep/independent/adaptive) has\n * resolved the base bump — canary is orthogonal to bump size, so it's a\n * pure post-processing step rather than a VersionBump variant. Given a\n * short git SHA, `1.2.3` (base next version) becomes `1.2.3-canary.<sha>`.\n *\n * Deterministic per (nextVersion, shortSha) pair — retrying the same commit\n * reproduces the same canary version, so publish-side idempotency handling\n * (already-published patterns) makes retries safe without extra state.\n */\nexport function applyCanarySuffix(packages: PackageVersion[], shortSha: string): PackageVersion[] {\n if (!shortSha) {\n throw new Error('applyCanarySuffix: shortSha is required to build a canary version');\n }\n return packages.map(pkg => ({\n ...pkg,\n nextVersion: `${pkg.nextVersion}-canary.${shortSha}`,\n }));\n}\n\n/**\n * Get the maximum bump level from a list of packages\n *\n * Priority: major > minor > patch\n */\nfunction getMaxBump(packages: PackageVersion[]): VersionBump {\n let maxBump: VersionBump = 'patch';\n\n for (const pkg of packages) {\n if (pkg.bump === 'major') {\n return 'major'; // Can't go higher than major\n }\n if (pkg.bump === 'minor') {\n maxBump = 'minor';\n }\n }\n\n return maxBump;\n}\n","/**\n * Release planner - detects changes and suggests version bumps\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, relative, resolve } from 'node:path';\nimport simpleGit from 'simple-git';\nimport semver from 'semver';\nimport globby from 'globby';\nimport { discoverSubRepoPaths } from '@kb-labs/sdk';\nimport type { PackageVersion, VersionBump, ReleaseConfig, ReleasePlan, ReleaseChannel } from './types';\nimport { applyVersionStrategy, applyCanarySuffix, type VersionStrategy } from './versioning-strategies';\n\n/**\n * Find the most recent git tag for a package.\n * For scoped packages: looks for \"<name>@<version>\" tags.\n * For lockstep repos: looks for \"v<version>\" tags.\n * Returns null if no tag found (initial release).\n */\nasync function findLastReleaseTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n): Promise<string | null> {\n try {\n // Try package-scoped tag first: @kb-labs/foo@1.2.3\n const tags = await git.tags(['--sort=-version:refname', `--list`, `${pkgName}@*`]);\n if (tags.all.length > 0) {\n return tags.all[0]!;\n }\n // Try lockstep tag: v1.2.3\n const vTags = await git.tags(['--sort=-version:refname', '--list', 'v*']);\n if (vTags.all.length > 0) {\n return vTags.all[0]!;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get commits since last release tag, scoped to a path.\n * Returns empty array if git log fails.\n */\nasync function getCommitsSinceTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n relPath: string,\n): Promise<string[]> {\n const lastTag = await findLastReleaseTag(git, pkgName);\n try {\n // git log [<tag>..HEAD] [--] <path>\n // Without a tag (initial release): git log -- <path>\n const args = ['log', '--format=%s', ...(lastTag ? [`${lastTag}..HEAD`] : []), '--', relPath];\n const raw = await git.raw(args);\n return raw.split('\\n').map((s: string) => s.trim()).filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Check if there are any file changes since last release tag.\n * Covers: uncommitted, committed-not-pushed, committed-and-pushed.\n */\nasync function hasChangesSinceTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n pkgRelPath: string,\n): Promise<boolean> {\n // 1. Uncommitted changes (working tree + index)\n const status = await git.status();\n const uncommitted = status.files.map(f => f.path);\n const hasUncommitted = uncommitted.some(p => p === pkgRelPath || p.startsWith(pkgRelPath + '/'));\n if (hasUncommitted) {return true;}\n\n // 2. Committed changes since last tag\n const commits = await getCommitsSinceTag(git, pkgName, pkgRelPath);\n return commits.length > 0;\n}\n\nexport interface PlannerOptions {\n cwd: string;\n config: ReleaseConfig;\n scope?: string;\n /** Named flow — selects a release config profile. Completely replaces global packages/versioning/checks. */\n flow?: string;\n bumpOverride?: VersionBump;\n /** Release track. Defaults to 'stable'. See ReleaseChannel. */\n channel?: ReleaseChannel;\n}\n\n/**\n * Merge base config with a named flow's config.\n * Flow completely REPLACES packages, versioningStrategy, and checks — no array merging.\n * All other config fields (registry, publish, rollback, git, changelog) remain from global.\n */\nexport function mergeConfigWithFlow(config: ReleaseConfig, flowName: string): ReleaseConfig {\n const flow = config.flows?.[flowName];\n if (!flow) {\n throw new Error(`Flow \"${flowName}\" is not defined in config.flows`);\n }\n return {\n ...config,\n ...(flow.packages !== undefined && { packages: flow.packages }),\n ...(flow.versioningStrategy && { versioningStrategy: flow.versioningStrategy }),\n ...(flow.checks !== undefined && { checks: flow.checks }),\n };\n}\n\n/**\n * Check whether a specific package version is already published on the npm registry.\n * Fail-open: returns false on any network/registry error.\n */\nexport async function isVersionPublished(name: string, version: string, registry: string): Promise<boolean> {\n try {\n const encoded = name.startsWith('@') ? `@${encodeURIComponent(name.slice(1))}` : name;\n const url = `${registry.replace(/\\/$/, '')}/${encoded}/${version}`;\n const res = await fetch(url, { method: 'HEAD', signal: AbortSignal.timeout(5000) });\n return res.status === 200;\n } catch {\n return false;\n }\n}\n\n/**\n * Discover release-candidate packages for a scope, at their CURRENT\n * package.json version — no git-diff-based bump computation. Shared by\n * planRelease() (which then computes bumps on top) and `kb release\n * promote` (which needs the already-released versions as-is, since\n * recomputing bumps from git history would be wrong for a promote).\n */\nexport async function discoverCurrentPackages(\n cwd: string,\n scope: string | undefined,\n config: ReleaseConfig,\n): Promise<PackageVersion[]> {\n const allPackages = await discoverPackages(cwd, config);\n\n if (!scope || scope === 'root') {\n return allPackages;\n }\n\n const isWorkspace = existsSync(join(cwd, '.gitmodules'));\n if (isWorkspace) {\n // In workspace mode, scope matches a sub-repo root.\n // Re-discover inside that sub-repo using standard discoverPackages (glob-based).\n const matchedRoots = filterByScope(allPackages, scope, config);\n const innerPackages: PackageVersion[] = [];\n for (const root of matchedRoots) {\n // Include root itself\n innerPackages.push(root);\n // Discover inner packages using standard glob logic (respects config, skips private)\n const inner = await discoverPackages(root.path, config);\n for (const pkg of inner) {\n if (!innerPackages.some(p => p.name === pkg.name)) {\n innerPackages.push(pkg);\n }\n }\n }\n return innerPackages;\n }\n\n return filterByScope(allPackages, scope, config);\n}\n\n/**\n * Plan release by detecting changes and computing version bumps\n */\nexport async function planRelease(options: PlannerOptions): Promise<ReleasePlan> {\n const { cwd, scope, bumpOverride, channel = 'stable' } = options;\n\n // Flow resolution — completely replaces packages/versioningStrategy/checks in config.\n // MUST happen before discoverPackages so globally-excluded packages can appear in a flow.\n const config = options.flow\n ? mergeConfigWithFlow(options.config, options.flow)\n : options.config;\n\n // Step 1-2: discover candidates and apply scope filtering.\n const packages = await discoverCurrentPackages(cwd, scope, config);\n\n // Workspace root with submodules: each sub-repo has its own git,\n // so we skip workspace-level detectModifiedPackages and use per-repo git.\n const isWorkspaceRoot = existsSync(join(cwd, '.gitmodules')) && !scope;\n\n let modifiedPackages: PackageVersion[];\n if (isWorkspaceRoot) {\n // All sub-repos are candidates — change detection happens per-repo\n modifiedPackages = packages;\n } else if (config.versioningStrategy === 'lockstep') {\n // Lockstep: all packages release together regardless of individual changes\n modifiedPackages = packages;\n } else {\n const git = simpleGit(cwd, { timeout: { block: 60000 } });\n modifiedPackages = await detectModifiedPackages(git, packages, cwd);\n }\n\n // Compute version bumps\n const registry = config.registry ?? 'https://registry.npmjs.org';\n let planPackages: PackageVersion[] = [];\n for (const pkg of modifiedPackages) {\n const bump = bumpOverride || config.bump || 'auto';\n\n // For workspace root, use per-sub-repo git instance\n const gitCwd = isWorkspaceRoot ? pkg.path : cwd;\n const git = simpleGit(gitCwd, { timeout: { block: 60000 } });\n\n let gitRoot = pkg.gitRoot;\n if (!gitRoot) {\n gitRoot = await git.revparse(['--show-toplevel']).catch(() => pkg.path);\n }\n\n // Idempotent check: if package.json was bumped in a previous run but git wasn't committed,\n // currentVersion > HEAD version. If that version is already on npm, reuse it (don't double-bump).\n const pkgRelPath = relative(gitRoot, join(pkg.path, 'package.json'));\n const headPkgRaw = await git.raw(['show', `HEAD:${pkgRelPath}`]).catch(() => null);\n const headVersion: string | null = headPkgRaw ? (() => { try { return (JSON.parse(headPkgRaw) as { version?: string }).version ?? null; } catch { return null; } })() : null;\n\n if (headVersion && headVersion !== pkg.currentVersion) {\n // package.json was bumped beyond HEAD — check if that version is already on npm\n const alreadyPublished = await isVersionPublished(pkg.name, pkg.currentVersion, registry);\n if (alreadyPublished) {\n planPackages.push({\n ...pkg,\n gitRoot,\n nextVersion: pkg.currentVersion,\n bump: detectBumpType(headVersion, pkg.currentVersion),\n isPublished: true,\n });\n continue;\n }\n }\n\n const nextVersion = await computeNextVersion(\n pkg.path,\n pkg.currentVersion,\n bump,\n git,\n gitCwd,\n pkg.name,\n );\n\n planPackages.push({\n ...pkg,\n gitRoot,\n nextVersion,\n bump: bump === 'auto' ? detectBumpType(pkg.currentVersion, nextVersion) : bump,\n });\n }\n\n // Apply versioning strategy (lockstep/independent/adaptive)\n // Scope-level override takes highest priority, then top-level, then legacy changelog.bumpStrategy\n const scopeVersioningStrategy = scope ? config.scopes?.[scope]?.versioningStrategy : undefined;\n const bumpStrategy = scopeVersioningStrategy || config.versioningStrategy || config.changelog?.bumpStrategy || 'independent';\n const versionStrategy = mapBumpStrategyToVersionStrategy(bumpStrategy);\n\n planPackages = applyVersionStrategy(planPackages, {\n strategy: versionStrategy,\n umbrellaPath: scope,\n });\n\n // Canary: suffix the already-computed base version with -canary.<shortsha>.\n // Runs last so canary and stable share the exact same bump-computation path.\n if (channel === 'canary') {\n const git = simpleGit(cwd, { timeout: { block: 60000 } });\n const shortSha = (await git.revparse(['--short', 'HEAD'])).trim();\n planPackages = applyCanarySuffix(planPackages, shortSha);\n }\n\n return {\n packages: planPackages,\n strategy: config.strategy || 'semver',\n registry: config.registry || 'https://registry.npmjs.org',\n rollbackEnabled: config.rollback?.enabled ?? true,\n channel,\n };\n}\n\n/**\n * Map changelog.bumpStrategy to VersionStrategy\n */\nfunction mapBumpStrategyToVersionStrategy(\n bumpStrategy: 'independent' | 'ripple' | 'lockstep' | 'adaptive'\n): VersionStrategy {\n if (bumpStrategy === 'lockstep') {return 'lockstep';}\n if (bumpStrategy === 'ripple' || bumpStrategy === 'adaptive') {return 'adaptive';}\n return 'independent';\n}\n\n/**\n * Discover all release candidates according to config.packages (paths/include/exclude).\n * Does NOT apply scope filtering — that's done separately in filterByScope().\n */\nasync function discoverPackages(cwd: string, config?: ReleaseConfig): Promise<PackageVersion[]> {\n // Workspace root with .gitmodules → sub-repos are the release units\n const isWorkspaceRoot = existsSync(join(cwd, '.gitmodules'));\n if (isWorkspaceRoot) {\n return discoverSubRepoPackages(cwd, config);\n }\n\n const packages: PackageVersion[] = [];\n\n // Scan dirs from config.packages.paths, or full tree\n const configPaths = config?.packages?.paths;\n const pattern = configPaths?.length\n ? configPaths.map(p => `${p}/package.json`)\n : '**/package.json';\n\n const packageJsonPaths = await globby(pattern, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.*/**',\n ],\n });\n\n for (let i = 0; i < packageJsonPaths.length; i++) {\n if (i % 10 === 0) {\n await new Promise((resolve) => { setImmediate(resolve); });\n }\n\n const packageJsonPath = packageJsonPaths[i]!;\n const packagePath = join(packageJsonPath, '..');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n const isRootPackageJson = packageJsonPath === join(cwd, 'package.json');\n\n if (packageJson.private) {continue;}\n if (isRootPackageJson && existsSync(join(packagePath, 'pnpm-workspace.yaml'))) {continue;}\n if (isRootPackageJson && !packageJson.name) {continue;}\n\n // Apply global include/exclude from config.packages\n const globalFilter = config?.packages;\n if (globalFilter?.include?.length || globalFilter?.exclude?.length) {\n const rel = relative(cwd, packagePath);\n if (globalFilter.include?.length && !matchesPackagePattern(packageJson.name, rel, globalFilter.include)) {continue;}\n if (globalFilter.exclude?.length && matchesPackagePattern(packageJson.name, rel, globalFilter.exclude)) {continue;}\n }\n\n packages.push({\n name: packageJson.name,\n path: packagePath,\n gitRoot: '',\n currentVersion: packageJson.version,\n nextVersion: packageJson.version,\n bump: 'auto',\n isPublished: false,\n });\n }\n\n // Deduplicate by package name — keep the entry with the shortest path\n // (avoids duplicates when nested package.json files share the same name)\n const seen = new Map<string, PackageVersion>();\n for (const pkg of packages) {\n const existing = seen.get(pkg.name);\n if (!existing || pkg.path.length < existing.path.length) {\n seen.set(pkg.name, pkg);\n }\n }\n\n return Array.from(seen.values());\n}\n\n/**\n * Filter discovered packages by scope with clear error messages.\n * Scope can be: exact name (@kb-labs/core), wildcard (@kb-labs/*), or path glob (packages/*).\n * Also applies per-scope include/exclude from config.scopes[scope].\n */\nfunction filterByScope(\n packages: PackageVersion[],\n scope: string,\n config?: ReleaseConfig,\n): PackageVersion[] {\n // Per-scope package overrides\n const scopeFilter = config?.scopes?.[scope]?.packages;\n const globalFilter = config?.packages;\n const mergedInclude = [...(globalFilter?.include ?? []), ...(scopeFilter?.include ?? [])];\n const mergedExclude = [...(globalFilter?.exclude ?? []), ...(scopeFilter?.exclude ?? [])];\n\n // Build scope matcher\n const isExactName = !scope.includes('*') && (scope.startsWith('@') || !scope.includes('/'));\n const scopeRegex = new RegExp(\n '^' + scope.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '[^/]*') + '$'\n );\n\n const result: PackageVersion[] = [];\n\n for (const pkg of packages) {\n // Match by name or relative path depending on scope format\n const isPathPattern = scope.includes('/') && !scope.startsWith('@');\n const matchTarget = isPathPattern ? pkg.path : pkg.name;\n const matches = isExactName ? pkg.name === scope : scopeRegex.test(matchTarget);\n if (!matches) {continue;}\n\n // Apply per-scope include/exclude on top\n if (mergedInclude.length && !matchesPackagePattern(pkg.name, pkg.path, mergedInclude)) {continue;}\n if (mergedExclude.length && matchesPackagePattern(pkg.name, pkg.path, mergedExclude)) {continue;}\n\n result.push(pkg);\n }\n\n if (result.length === 0) {\n // Check if the scope would have matched something if not for exclude\n const wouldMatchExcluded = packages.some(p => {\n const matchTarget = isPathPattern(scope) ? p.path : p.name;\n const scopeMatches = isExactName ? p.name === scope : scopeRegex.test(matchTarget);\n if (!scopeMatches) {return false;}\n return mergedExclude.length > 0 && matchesPackagePattern(p.name, p.path, mergedExclude);\n });\n\n if (wouldMatchExcluded) {\n throw new Error(`Scope \"${scope}\" matches packages that are excluded by configuration`);\n }\n\n const globalInclude = globalFilter?.include;\n if (globalInclude?.length) {\n throw new Error(`Scope \"${scope}\" did not match any packages. Note: packages.include restricts discovery to: ${globalInclude.join(', ')}`);\n }\n\n throw new Error(`Scope \"${scope}\" did not match any discovered packages`);\n }\n\n return result;\n}\n\nfunction isPathPattern(scope: string): boolean {\n return scope.includes('/') && !scope.startsWith('@');\n}\n\n/**\n * Discover sub-repos as release units via .gitmodules.\n * Each sub-repo root package.json is a release unit (even if private).\n */\nasync function discoverSubRepoPackages(workspaceRoot: string, config?: ReleaseConfig): Promise<PackageVersion[]> {\n const subRepoPaths = discoverSubRepoPaths(workspaceRoot);\n const packages: PackageVersion[] = [];\n const globalFilter = config?.packages;\n\n for (const subRepoPath of subRepoPaths) {\n try {\n const pkgJson = JSON.parse(\n await readFile(join(subRepoPath, 'package.json'), 'utf-8')\n );\n if (!pkgJson.name) {continue;}\n\n const rel = relative(workspaceRoot, subRepoPath);\n\n // Apply global include/exclude\n if (globalFilter?.include?.length && !matchesPackagePattern(pkgJson.name, rel, globalFilter.include)) {continue;}\n if (globalFilter?.exclude?.length && matchesPackagePattern(pkgJson.name, rel, globalFilter.exclude)) {continue;}\n\n packages.push({\n name: pkgJson.name,\n path: subRepoPath,\n gitRoot: subRepoPath,\n currentVersion: pkgJson.version || '0.0.0',\n nextVersion: pkgJson.version || '0.0.0',\n bump: 'auto',\n isPublished: false,\n });\n } catch {\n // Sub-repo without valid package.json — skip\n }\n }\n\n return packages;\n}\n\n/**\n * Check if file should be ignored (node_modules, dist, etc.)\n */\nfunction shouldIgnoreFile(file: string): boolean {\n const ignoredPaths = [\n 'node_modules/',\n '.git/',\n 'dist/',\n 'build/',\n '.next/',\n '.nuxt/',\n 'coverage/',\n '.cache/',\n 'tmp/',\n ];\n\n return ignoredPaths.some(path => file.includes(path));\n}\n\nasync function detectModifiedPackages(\n git: ReturnType<typeof simpleGit>,\n packages: PackageVersion[],\n cwd: string,\n): Promise<PackageVersion[]> {\n const modified: PackageVersion[] = [];\n\n for (let i = 0; i < packages.length; i++) {\n if (i % 10 === 0) {\n await new Promise((res) => { setImmediate(res); });\n }\n\n const pkg = packages[i]!;\n const pkgRel = relative(resolve(cwd), resolve(pkg.path));\n const changed = await hasChangesSinceTag(git, pkg.name, pkgRel);\n\n if (changed) {\n modified.push(pkg);\n }\n }\n\n return modified;\n}\n\nasync function computeNextVersion(\n packagePath: string,\n currentVersion: string,\n bump: VersionBump,\n git: ReturnType<typeof simpleGit>,\n gitCwd: string,\n pkgName: string,\n): Promise<string> {\n if (bump === 'auto') {\n const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd, pkgName);\n return semver.inc(currentVersion, detectedBump) || currentVersion;\n }\n return semver.inc(currentVersion, bump) || currentVersion;\n}\n\nasync function detectVersionFromCommits(\n git: ReturnType<typeof simpleGit>,\n packagePath: string,\n gitCwd: string,\n pkgName: string,\n): Promise<'major' | 'minor' | 'patch'> {\n try {\n const relPath = relative(resolve(gitCwd), resolve(packagePath));\n const messages = await getCommitsSinceTag(git, pkgName, relPath);\n\n let hasMinor = false;\n let hasBreaking = false;\n\n for (const message of messages) {\n const msg = message.toLowerCase();\n if (msg.includes('!:') || msg.includes('breaking change')) {\n hasBreaking = true;\n } else if (msg.startsWith('feat') || msg.startsWith('feature')) {\n hasMinor = true;\n }\n }\n\n if (hasBreaking) {return 'major';}\n if (hasMinor) {return 'minor';}\n return 'patch';\n } catch {\n return 'patch';\n }\n}\n\nfunction detectBumpType(currentVersion: string, nextVersion: string): VersionBump {\n if (semver.major(currentVersion) < semver.major(nextVersion)) {\n return 'major';\n }\n if (semver.minor(currentVersion) < semver.minor(nextVersion)) {\n return 'minor';\n }\n return 'patch';\n}\n\n/**\n * Match a package against a list of patterns.\n * - Patterns starting with '@' or without '/' → matched against package name.\n * - Patterns containing '/' (non-scoped) → matched against relative path.\n * - Supports '*' wildcard (single path segment, not separator).\n */\nexport function matchesPackagePattern(pkgName: string, relativePath: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n const isPathPattern = pattern.includes('/') && !pattern.startsWith('@');\n const target = isPathPattern ? relativePath : pkgName;\n const regex = new RegExp(\n '^' + pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '[^/]*') + '$'\n );\n if (regex.test(target)) {return true;}\n }\n return false;\n}\n\n","/**\n * Release checkpoint — persists publish state across pipeline runs.\n *\n * Written after successful npm publish, updated per git root after each\n * commit/tag/push. Allows recovery from partial failures without\n * re-publishing already-published packages or re-bumping versions.\n *\n * File: <repoRoot>/.kb/release/checkpoint.json\n * Deleted automatically after full pipeline success.\n */\n\nimport { readFileSync, writeFileSync, unlinkSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface GitRootState {\n committed: boolean;\n tagged: string[];\n pushed: boolean;\n}\n\nexport interface ReleaseCheckpoint {\n /** Identifies this checkpoint — must match current plan to be usable. */\n flow: string;\n /** Lockstep version (all packages same) or 'independent'. */\n version: string;\n publishedPackages: Array<{\n name: string;\n version: string;\n path: string;\n gitRoot: string;\n }>;\n /** Per git-root git operation state. Key = absolute path. */\n gitRoots: Record<string, GitRootState>;\n createdAt: string;\n completedAt?: string;\n}\n\nfunction checkpointPath(repoRoot: string): string {\n return join(repoRoot, '.kb', 'release', 'checkpoint.json');\n}\n\nexport function loadCheckpoint(repoRoot: string): ReleaseCheckpoint | null {\n const path = checkpointPath(repoRoot);\n if (!existsSync(path)) {return null;}\n try {\n return JSON.parse(readFileSync(path, 'utf-8')) as ReleaseCheckpoint;\n } catch {\n return null;\n }\n}\n\nexport function writeCheckpoint(repoRoot: string, checkpoint: Omit<ReleaseCheckpoint, 'createdAt'>): void {\n mkdirSync(join(repoRoot, '.kb', 'release'), { recursive: true });\n const data: ReleaseCheckpoint = { ...checkpoint, createdAt: new Date().toISOString() };\n writeFileSync(checkpointPath(repoRoot), JSON.stringify(data, null, 2));\n}\n\nexport function updateCheckpointGitRoot(repoRoot: string, gitRoot: string, state: GitRootState): void {\n const checkpoint = loadCheckpoint(repoRoot);\n if (!checkpoint) {return;}\n checkpoint.gitRoots[gitRoot] = state;\n writeFileSync(checkpointPath(repoRoot), JSON.stringify(checkpoint, null, 2));\n}\n\nexport function markCheckpointComplete(repoRoot: string): void {\n const checkpoint = loadCheckpoint(repoRoot);\n if (!checkpoint) {return;}\n checkpoint.completedAt = new Date().toISOString();\n writeFileSync(checkpointPath(repoRoot), JSON.stringify(checkpoint, null, 2));\n}\n\nexport function deleteCheckpoint(repoRoot: string): void {\n try { unlinkSync(checkpointPath(repoRoot)); } catch { /* already gone */ }\n}\n\n/**\n * Check if an existing checkpoint is usable for the current release.\n * A checkpoint is usable if it matches flow + version and publish is done but git is not.\n */\nexport function isCheckpointResumable(\n checkpoint: ReleaseCheckpoint,\n flow: string,\n version: string,\n): boolean {\n if (checkpoint.completedAt) {return false;}\n if (checkpoint.flow !== flow) {return false;}\n if (checkpoint.version !== version && version !== 'independent') {return false;}\n // Usable if publish happened but at least one git root is not fully pushed\n return checkpoint.publishedPackages.length > 0 &&\n Object.values(checkpoint.gitRoots).some(s => !s.pushed);\n}\n","/**\n * Git tag grammar for release flows — one place that both generates a\n * flow's release tag and parses a tag back into a flow. Keeping generation\n * and resolution on the same template prevents them from drifting apart\n * (previously tag-building was inlined ad hoc in `commitAndTagRelease` and\n * nothing parsed a tag back into a flow at all — CI guessed via bash).\n *\n * Only stable-channel releases ever produce a git tag (canary is ephemeral,\n * npm-only — see pipeline.ts), so a resolved tag always implies `channel:\n * 'stable'`; it is never inferred from the tag itself.\n */\n\nimport type { ReleaseChannel, ReleaseConfig } from './types';\n\nexport const DEFAULT_TAG_PATTERN = '{flow}-v{version}';\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Matches a bare semver, optionally with a prerelease/build suffix. */\nconst SEMVER_SRC = '\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[0-9A-Za-z.-]+)?(?:\\\\+[0-9A-Za-z.-]+)?';\n\n/**\n * Build the release tag for a flow. `tagPattern` defaults to\n * `{flow}-v{version}` (e.g. `platform-v2.105.0`) when omitted.\n */\nexport function buildReleaseTag(flowName: string, version: string, tagPattern?: string): string {\n const pattern = tagPattern ?? DEFAULT_TAG_PATTERN;\n return pattern.replace('{flow}', flowName).replace('{version}', version);\n}\n\n/**\n * Anchored regex matching exactly the tags `buildReleaseTag(flowName, ...,\n * tagPattern)` can produce — literal segments of the pattern are escaped,\n * `{flow}` is substituted with the (escaped) flow name, `{version}` with a\n * semver-capturing group.\n */\nfunction buildTagRegex(flowName: string, tagPattern: string): RegExp {\n const escapedPattern = escapeRegex(tagPattern);\n const src = escapedPattern\n .replace(escapeRegex('{flow}'), escapeRegex(flowName))\n .replace(escapeRegex('{version}'), `(${SEMVER_SRC})`);\n return new RegExp(`^${src}$`);\n}\n\n/**\n * Resolve a git tag back into the flow (and channel) that produced it, by\n * matching it against every configured flow's tag pattern. Returns `null`\n * if no configured flow's pattern matches — callers (e.g. `deliver`) must\n * treat that as a hard failure, never a guess.\n */\nexport function resolveFlowFromTag(\n config: ReleaseConfig,\n tag: string,\n): { flowName: string; channel: ReleaseChannel } | null {\n const flows = config.flows ?? {};\n for (const [flowName, flowConfig] of Object.entries(flows)) {\n const regex = buildTagRegex(flowName, flowConfig.tagPattern ?? DEFAULT_TAG_PATTERN);\n if (regex.test(tag)) {\n return { flowName, channel: 'stable' };\n }\n }\n return null;\n}\n","/**\n * Publisher - handles package publishing and changelog updates\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { PackageVersion, ReleasePlan } from './types';\nimport { updateCheckpointGitRoot, markCheckpointComplete } from './checkpoint';\nimport { buildReleaseTag } from './tag';\n\n/**\n * Update package.json version to nextVersion\n * Should be called BEFORE generating changelog so versions match\n */\nexport async function updatePackageVersion(pkg: PackageVersion): Promise<void> {\n const packageJsonPath = join(pkg.path, 'package.json');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n\n packageJson.version = pkg.nextVersion;\n\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Update versions for all packages in the plan\n */\nexport async function updatePackageVersions(plan: ReleasePlan): Promise<Array<{\n package: string;\n from: string;\n to: string;\n updated: boolean;\n}>> {\n const results: Array<{\n package: string;\n from: string;\n to: string;\n updated: boolean;\n }> = [];\n\n for (const pkg of plan.packages) {\n try {\n await updatePackageVersion(pkg);\n results.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: true,\n });\n } catch (error) {\n console.warn(`Failed to update version for ${pkg.name}: ${error instanceof Error ? error.message : String(error)}`);\n results.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: false,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Copy changelog to each package directory\n * This writes CHANGELOG.md per package with proper header\n */\nexport async function copyChangelogToPackages(options: {\n cwd: string;\n plan: ReleasePlan;\n changelog: string;\n}): Promise<void> {\n const { plan, changelog } = options;\n\n // Lockstep releases render ONE consolidated changelog for the whole release\n // (header `## [version] - date`, no per-package sections) — there is no\n // per-package excerpt to extract, so every package gets the same full text,\n // same as the single-package case.\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const isLockstep = plan.packages.length > 1 && uniqueVersions.size === 1;\n\n for (const pkg of plan.packages) {\n try {\n // For single-package or lockstep releases, use the entire changelog.\n // For independent multi-package releases, extract the package-specific\n // section (headers of the form `## @scope/pkg X.Y.Z`).\n let packageChangelog: string;\n\n if (plan.packages.length === 1 || isLockstep) {\n packageChangelog = changelog;\n } else {\n packageChangelog = createPackageChangelog(pkg, changelog);\n }\n\n if (!packageChangelog || packageChangelog.trim().length === 0) {\n console.warn(`No changelog content for ${pkg.name}, skipping`);\n continue;\n }\n\n // Write to package directory\n const changelogPath = join(pkg.path, 'CHANGELOG.md');\n\n // Read existing changelog if exists\n let existingChangelog = '';\n try {\n existingChangelog = await readFile(changelogPath, 'utf-8');\n } catch {\n // No existing changelog, start fresh\n }\n\n // Check if this version already exists in changelog to avoid duplicates.\n // Lockstep headers are `## [X.Y.Z] - date`; independent/single-package\n // headers are `## @scope/pkg X.Y.Z`.\n const versionPattern = isLockstep\n ? new RegExp(`^##\\\\s+\\\\[${pkg.nextVersion.replace(/\\./g, '\\\\.')}\\\\]`, 'm')\n : new RegExp(\n `^##\\\\s+${pkg.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+${pkg.nextVersion.replace(/\\./g, '\\\\.')}`,\n 'm'\n );\n\n const updatedChangelog = mergeChangelogBlock(existingChangelog, packageChangelog, versionPattern);\n\n await writeFile(changelogPath, updatedChangelog.trim() + '\\n', 'utf-8');\n } catch (error) {\n console.warn(`Failed to write changelog for ${pkg.name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n\n// Matches either header shape as a section boundary: `## @scope/pkg X.Y.Z`\n// (independent) or `## [X.Y.Z] - date` (lockstep).\nconst NEXT_SECTION_PATTERN = /^##\\s+((@[\\w-]+\\/)?[\\w-]+\\s+\\d|\\[\\d)/;\n\n/**\n * Merge a new version-block changelog entry into an existing changelog's\n * content: replace an existing block with the same version (idempotent\n * retry/promote) or prepend it as the newest entry — never blindly overwrite\n * the rest of the file's history.\n */\nfunction mergeChangelogBlock(existingChangelog: string, newBlock: string, versionPattern: RegExp): string {\n if (existingChangelog && versionPattern.test(existingChangelog)) {\n // Version already exists - replace the section instead of prepending.\n // Find where the current version section starts and the next begins.\n const lines = existingChangelog.split('\\n');\n let startIdx = -1;\n let endIdx = lines.length;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line && versionPattern.test(line)) {\n startIdx = i;\n } else if (startIdx !== -1 && line && NEXT_SECTION_PATTERN.test(line)) {\n endIdx = i;\n break;\n }\n }\n\n if (startIdx !== -1) {\n const before = lines.slice(0, startIdx).join('\\n');\n const after = lines.slice(endIdx).join('\\n');\n return (before ? before + '\\n' : '') + newBlock + (after ? '\\n' + after : '');\n }\n return newBlock;\n }\n\n // Prepend new entry\n return newBlock + (existingChangelog ? '\\n' + existingChangelog : '');\n}\n\n/** Default location of the consolidated repo-root changelog, relative to repoRoot. */\nexport const DEFAULT_ROOT_CHANGELOG_PATH = '.kb/release/CHANGELOG.md';\n\n/**\n * Resolve the repo-relative path of the consolidated root changelog.\n * Config-driven via `release.changelog.outputPath` so teams can point it at\n * the conventional `CHANGELOG.md` repo root instead of the default.\n */\nexport function resolveRootChangelogRelPath(outputPath?: string): string {\n return outputPath && outputPath.trim().length > 0 ? outputPath : DEFAULT_ROOT_CHANGELOG_PATH;\n}\n\n/**\n * Merge the generated changelog for this release into the repo-root\n * changelog file (default `.kb/release/CHANGELOG.md`, configurable via\n * `release.changelog.outputPath`), prepending/deduplicating the same way\n * `copyChangelogToPackages` does for per-package changelogs — this file is\n * cumulative history, not a per-run snapshot, so it must never be overwritten.\n */\nexport async function mergeRootChangelog(options: {\n repoRoot: string;\n plan: ReleasePlan;\n changelog: string;\n /** Repo-relative output path. Defaults to DEFAULT_ROOT_CHANGELOG_PATH. */\n outputPath?: string;\n}): Promise<void> {\n const { repoRoot, plan, changelog, outputPath } = options;\n if (!changelog || changelog.trim().length === 0 || plan.packages.length === 0) {\n return;\n }\n\n const primary = plan.packages[0]!;\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const isLockstep = plan.packages.length > 1 && uniqueVersions.size === 1;\n\n const versionPattern = isLockstep\n ? new RegExp(`^##\\\\s+\\\\[${primary.nextVersion.replace(/\\./g, '\\\\.')}\\\\]`, 'm')\n : new RegExp(\n `^##\\\\s+${primary.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+${primary.nextVersion.replace(/\\./g, '\\\\.')}`,\n 'm'\n );\n\n const changelogPath = join(repoRoot, resolveRootChangelogRelPath(outputPath));\n\n let existingChangelog = '';\n try {\n existingChangelog = await readFile(changelogPath, 'utf-8');\n } catch {\n // No existing root changelog, start fresh\n }\n\n const updatedChangelog = mergeChangelogBlock(existingChangelog, changelog.trim(), versionPattern);\n\n await mkdir(dirname(changelogPath), { recursive: true });\n await writeFile(changelogPath, updatedChangelog.trim() + '\\n', 'utf-8');\n}\n\n/**\n * Create package-specific changelog entry with proper header\n */\nfunction createPackageChangelog(pkg: PackageVersion, changelog: string): string {\n // Extract ONLY the section for this package from the full changelog\n // Format: ## @scope/package-name X.Y.Z\n const packageHeaderPattern = new RegExp(\n `^##\\\\s+${pkg.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+\\\\d+\\\\.\\\\d+\\\\.\\\\d+`,\n 'gm'\n );\n\n const allHeaders = Array.from(changelog.matchAll(/^##\\s+(@[\\w-]+\\/)?[\\w-]+\\s+\\d+\\.\\d+\\.\\d+/gm));\n\n // Find start index for this package\n let startIdx = -1;\n let endIdx = changelog.length;\n\n for (let i = 0; i < allHeaders.length; i++) {\n const match = allHeaders[i];\n if (!match || !match.index) {continue;}\n\n if (packageHeaderPattern.test(match[0])) {\n startIdx = match.index;\n // Find next package header\n if (i + 1 < allHeaders.length) {\n endIdx = allHeaders[i + 1]!.index!;\n }\n break;\n }\n }\n\n if (startIdx === -1) {\n // Package section not found in changelog, return empty\n return '';\n }\n\n // Extract the section for this package\n return changelog.substring(startIdx, endIdx).trim();\n}\n\n/**\n * Commit and tag release changes\n *\n * Each package is committed inside its own git repo (supports submodules).\n * After all packages are committed, tags are created in cwd (the monorepo root).\n */\nexport async function commitAndTagRelease(options: {\n cwd: string;\n plan: ReleasePlan;\n dryRun?: boolean;\n /** Pass --no-verify to git push and pushTags. Default: false — hooks run normally. */\n noVerify?: boolean;\n /** repoRoot for checkpoint updates. If omitted, checkpoint updates are skipped. */\n repoRoot?: string;\n /** Per-root state from checkpoint — skip roots already fully pushed. */\n checkpointGitRoots?: Record<string, { committed: boolean; tagged: string[]; pushed: boolean }>;\n /** Repo-relative path to the consolidated root changelog. Defaults to DEFAULT_ROOT_CHANGELOG_PATH. */\n changelogOutputPath?: string;\n /**\n * The flow this release came from (e.g. \"platform\", \"sdk\"). Drives the\n * tag grammar (`{flow}-v{version}`, see ./tag.ts). If omitted (ran\n * without `--flow`), falls back to `\"release\"` and — for a genuinely\n * divergent multi-version independent release — to the old one-tag-\n * per-package behavior, since a single flow-level tag can't represent\n * packages at different versions.\n */\n flowName?: string;\n /** Per-flow tag template override, from `FlowConfig.tagPattern`. */\n tagPattern?: string;\n}): Promise<{ committed: boolean; tagged: string[]; pushed: boolean }> {\n const { cwd, plan, dryRun, noVerify = false, repoRoot, checkpointGitRoots, changelogOutputPath, flowName = 'release', tagPattern } = options;\n const simpleGit = (await import('simple-git')).default;\n\n const result = {\n committed: false,\n tagged: [] as string[],\n pushed: false,\n };\n\n if (dryRun) {\n return result;\n }\n\n try {\n const commitMessage = createCommitMessage(plan);\n\n // Group packages by their git root — populated by planner via revparse.\n // Fallback to pkg.path for safety (e.g. packages planned outside normal flow).\n const pkgToRoot = new Map<string, string>();\n for (const pkg of plan.packages) {\n pkgToRoot.set(pkg.path, pkg.gitRoot || pkg.path);\n }\n\n const rootToPkgs = new Map<string, typeof plan.packages>();\n for (const pkg of plan.packages) {\n const root = pkgToRoot.get(pkg.path)!;\n const list = rootToPkgs.get(root) ?? [];\n list.push(pkg);\n rootToPkgs.set(root, list);\n }\n\n // Whether the whole plan shares exactly one version — true for lockstep\n // flows, and true for a single-package independent flow (e.g. sdk).\n // Drives one flow-level tag vs. the per-package fallback below.\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const singleVersionAcrossPlan = uniqueVersions.size === 1;\n const pushFlags: string[] = noVerify ? ['--no-verify'] : [];\n\n // Process each git root: commit → tag → push.\n // Skip roots already fully pushed (from checkpoint on retry).\n for (const [root, pkgs] of rootToPkgs) {\n const prior = checkpointGitRoots?.[root];\n if (prior?.pushed) {\n // Already completed in a previous run — collect results and continue.\n result.committed = result.committed || prior.committed;\n result.tagged.push(...prior.tagged.filter(t => !result.tagged.includes(t)));\n result.pushed = true;\n continue;\n }\n\n const rootGit = simpleGit(root);\n let rootCommitted = prior?.committed ?? false;\n let rootTagged = prior?.tagged ?? [];\n\n // 1. Commit (skip if already done)\n if (!rootCommitted) {\n const filesToStage: string[] = [];\n for (const pkg of pkgs) {\n const rel = (p: string) => p.startsWith(root + '/') ? p.slice(root.length + 1) : p;\n filesToStage.push(rel(join(pkg.path, 'package.json')));\n const changelogPath = join(pkg.path, 'CHANGELOG.md');\n if (existsSync(changelogPath)) { filesToStage.push(rel(changelogPath)); }\n }\n\n // The consolidated repo-root changelog (mergeRootChangelog writes it\n // directly to disk) lives outside any package path, so the loop\n // above never picks it up — stage it explicitly for whichever git\n // root actually IS repoRoot. Without this it's tracked in git but\n // never committed by a real release, silently reverting to whatever\n // was last committed by hand.\n if (repoRoot && root === repoRoot) {\n const rootChangelogRelPath = resolveRootChangelogRelPath(changelogOutputPath);\n const rootChangelogPath = join(repoRoot, rootChangelogRelPath);\n if (existsSync(rootChangelogPath)) {\n filesToStage.push(rootChangelogRelPath);\n }\n }\n\n await rootGit.add(filesToStage);\n try {\n await rootGit.commit(commitMessage);\n rootCommitted = true;\n result.committed = true;\n } catch (commitError) {\n const msg = commitError instanceof Error ? commitError.message : String(commitError);\n if (!msg.includes('nothing to commit') && !msg.includes('nothing added to commit')) {\n throw commitError;\n }\n }\n } else {\n result.committed = true;\n }\n\n // 2. Tag (skip if already done)\n if (rootTagged.length === 0) {\n if (singleVersionAcrossPlan) {\n // One tag per flow release: `{flow}-v{version}` (see ./tag.ts).\n const tagName = buildReleaseTag(flowName, plan.packages[0]!.nextVersion, tagPattern);\n await rootGit.addTag(tagName);\n rootTagged = [tagName];\n } else {\n // Packages in this release genuinely diverge in version (a\n // multi-package independent flow) — a single flow-level tag\n // can't represent that; fall back to one tag per package. Not a\n // shape any configured flow uses today (see ADR/plan boundary\n // note), kept for safety rather than crashing.\n for (const pkg of pkgs) {\n const tagName = `${pkg.name}@${pkg.nextVersion}`;\n await rootGit.addTag(tagName);\n rootTagged.push(tagName);\n }\n }\n result.tagged.push(...rootTagged);\n } else {\n result.tagged.push(...rootTagged.filter(t => !result.tagged.includes(t)));\n }\n\n // 3. Push — push the branch, then push ONLY the tag(s) just created in\n // this run. `git push --tags` (the old behavior here) pushes EVERY\n // local tag, including all pre-existing ones — on a repo with a long\n // release history that means dozens of already-remote tags get\n // re-sent and rejected as duplicates, making git report the whole\n // command as failed even though the branch commit and the actual new\n // tag(s) went through fine. Pushing exact refs avoids touching any\n // tag we didn't just create.\n if (rootCommitted) { await rootGit.push(pushFlags); }\n if (rootTagged.length > 0) {\n await rootGit.push(['origin', ...pushFlags, ...rootTagged]);\n }\n\n // Persist checkpoint after each successful root\n if (repoRoot) {\n updateCheckpointGitRoot(repoRoot, root, {\n committed: rootCommitted,\n tagged: rootTagged,\n pushed: true,\n });\n }\n }\n result.pushed = true;\n\n if (repoRoot) { markCheckpointComplete(repoRoot); }\n\n } catch (error) {\n console.error(`Git operations failed: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n\n return result;\n}\n\n/**\n * Create conventional commit message for release\n */\nfunction createCommitMessage(plan: ReleasePlan): string {\n const lines: string[] = [];\n\n if (plan.packages.length === 1 && plan.packages[0]) {\n const pkg = plan.packages[0];\n lines.push(`chore(release): publish ${pkg.name}@${pkg.nextVersion}`);\n } else {\n lines.push(`chore(release): publish ${plan.packages.length} packages`);\n }\n\n lines.push('');\n\n for (const pkg of plan.packages) {\n lines.push(`- ${pkg.name}@${pkg.nextVersion}`);\n }\n\n return lines.join('\\n');\n}\n\n","/**\n * Rollback - manages release snapshots and recovery\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { ReleasePlan, PackageVersion } from './types';\n\nexport interface RollbackSnapshot {\n ts: string;\n packages: PackageVersion[];\n}\n\n// MAX_HISTORY = 5; // Future use for snapshot retention\n\n/**\n * Save current state for potential rollback\n */\nexport async function saveSnapshot(options: {\n cwd: string;\n plan: ReleasePlan;\n}): Promise<void> {\n const { cwd, plan } = options;\n \n const snapshot: RollbackSnapshot = {\n ts: new Date().toISOString(),\n packages: plan.packages.map(pkg => ({\n ...pkg,\n nextVersion: pkg.currentVersion, // Store current before update\n })),\n };\n\n const snapshotDir = join(cwd, '.kb', 'release');\n await mkdir(snapshotDir, { recursive: true });\n \n const snapshotPath = join(snapshotDir, 'backup.json');\n await writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf-8');\n \n // Cleanup old snapshots\n await cleanupOldSnapshots(snapshotDir);\n}\n\n/**\n * Restore from snapshot\n */\nexport async function restoreSnapshot(cwd: string): Promise<void> {\n const snapshotPath = join(cwd, '.kb', 'release', 'backup.json');\n \n if (!existsSync(snapshotPath)) {\n throw new Error('No backup snapshot found');\n }\n\n const snapshotContent = await readFile(snapshotPath, 'utf-8');\n const snapshot: RollbackSnapshot = JSON.parse(snapshotContent);\n\n // Restore package.json versions\n for (const pkg of snapshot.packages) {\n const packageJsonPath = join(pkg.path, 'package.json');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n \n packageJson.version = pkg.currentVersion;\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n }\n}\n\nasync function cleanupOldSnapshots(_snapshotDir: string): Promise<void> {\n // For now, just keep the latest backup.json\n // In the future, could maintain timestamped backups\n // and trim to MAX_HISTORY\n}\n\n","/**\n * JSON reporter for release reports\n */\n\nimport type { ReleaseReport } from '../types';\n\nexport function renderJson(report: ReleaseReport): string {\n return JSON.stringify(report, null, 2);\n}\n\n","/**\n * Markdown reporter for release reports\n */\n\nimport type { ReleaseReport } from '../types';\n\nexport function renderMarkdown(report: ReleaseReport): string {\n const lines: string[] = [];\n \n lines.push('# 🧩 KB Labs Release Summary');\n lines.push('');\n lines.push(`**Timestamp**: ${report.ts}`);\n lines.push(`**Stage**: ${report.stage}`);\n lines.push('');\n\n if (report.result.ok) {\n lines.push('## ✅ Release: SUCCESS');\n } else {\n lines.push('## ❌ Release: FAILED');\n }\n \n lines.push('');\n\n // Checks section\n if (report.result.checks) {\n lines.push('## Quality Checks');\n lines.push('');\n\n for (const [id, result] of Object.entries(report.result.checks)) {\n if (!result) {continue;}\n const icon = result.ok ? '✅' : '❌';\n lines.push(`- ${icon} **${id}**: ${result.ok ? 'PASSED' : 'FAILED'}`);\n if (result.hint && !result.ok) {\n lines.push(` - ${result.hint}`);\n }\n }\n lines.push('');\n }\n\n // Per-package checks\n if (report.result.checksPerPackage) {\n lines.push('## Package Quality Checks');\n lines.push('');\n\n for (const [pkgName, pkgChecks] of Object.entries(report.result.checksPerPackage)) {\n lines.push(`### ${pkgName}`);\n lines.push('');\n for (const [id, result] of Object.entries(pkgChecks)) {\n if (!result) {continue;}\n const icon = result.ok ? '✅' : '❌';\n lines.push(`- ${icon} **${id}**: ${result.ok ? 'PASSED' : 'FAILED'}`);\n if (result.hint && !result.ok) {\n lines.push(` - ${result.hint}`);\n }\n }\n lines.push('');\n }\n }\n\n // Published packages\n if (report.result.published && report.result.published.length > 0) {\n lines.push('## 🚀 Published Packages');\n lines.push('');\n for (const pkg of report.result.published) {\n lines.push(`- ${pkg}`);\n }\n lines.push('');\n }\n\n // Errors\n if (report.result.errors && report.result.errors.length > 0) {\n lines.push('## ❌ Errors');\n lines.push('');\n for (const error of report.result.errors) {\n lines.push(`- ${error}`);\n }\n lines.push('');\n }\n\n // Timing\n lines.push(`**Duration**: ${formatTiming(report.result.timingMs)}`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction formatTiming(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\n","/**\n * Text reporter for release reports\n */\n\nimport type { ReleaseReport } from '../types';\n\nexport function renderText(report: ReleaseReport): string {\n const lines: string[] = [];\n \n lines.push('[release] ' + (report.result.ok ? 'OK' : 'FAILED'));\n lines.push('');\n\n // Checks\n if (report.result.checks) {\n for (const [id, result] of Object.entries(report.result.checks)) {\n if (!result) {continue;}\n lines.push(`[${id}] ${result.ok ? 'pass' : 'fail'}`);\n if (result.hint && !result.ok) {\n lines.push(` ${result.hint}`);\n }\n }\n lines.push('');\n }\n\n // Per-package checks\n if (report.result.checksPerPackage) {\n for (const [pkgName, pkgChecks] of Object.entries(report.result.checksPerPackage)) {\n lines.push(`[${pkgName}]`);\n for (const [id, result] of Object.entries(pkgChecks)) {\n if (!result) {continue;}\n lines.push(` [${id}] ${result.ok ? 'pass' : 'fail'}`);\n if (result.hint && !result.ok) {\n lines.push(` ${result.hint}`);\n }\n }\n }\n lines.push('');\n }\n\n // Published\n if (report.result.published && report.result.published.length > 0) {\n lines.push('[published] ' + report.result.published.length + ' package(s)');\n for (const pkg of report.result.published) {\n lines.push(` ${pkg}`);\n }\n lines.push('');\n }\n\n // Errors\n if (report.result.errors && report.result.errors.length > 0) {\n lines.push('[errors]');\n for (const error of report.result.errors) {\n lines.push(` ${error}`);\n }\n lines.push('');\n }\n\n lines.push(`[timing] ${formatTiming(report.result.timingMs)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatTiming(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\n","/**\n * @module @kb-labs/release-manager-core/shell-adapter\n * Shell adapter for release-core - wraps execa with SDK types\n */\n\nimport { execa } from 'execa';\nimport type { ShellAPI, ExecResult, ExecOptions } from '@kb-labs/sdk';\n\n/**\n * Create a ShellAPI adapter using execa\n * This is used in core libraries where ctx.runtime.shell is not available\n */\nexport function createExecaShellAdapter(): ShellAPI {\n return {\n async exec(command: string, args?: string[], options?: ExecOptions): Promise<ExecResult> {\n try {\n const result = await execa(command, args || [], {\n cwd: options?.cwd,\n timeout: options?.timeout,\n preferLocal: true,\n env: options?.env || process.env,\n });\n return {\n ok: result.exitCode === 0,\n code: result.exitCode ?? 0,\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n };\n } catch (error: unknown) {\n const e = error as { exitCode?: number; stdout?: string; stderr?: string; message?: string };\n return {\n ok: false,\n code: e.exitCode || 1,\n stdout: e.stdout || '',\n stderr: e.stderr || e.message || '',\n };\n }\n },\n };\n}\n\n","/**\n * Resolve the npm dist-tag and target registry for a release channel.\n *\n * Shared by CLI (run.ts), REST (run-handler.ts) and the pipeline itself so\n * \"canary always goes to real npm under a canary tag, stable uses whatever\n * config.registry says\" is defined once, config-driven, not hardcoded at\n * each call site.\n */\nimport type { ReleaseChannel, ReleaseConfig } from './types';\n\nconst DEFAULT_NPM_REGISTRY = 'https://registry.npmjs.org';\n\nexport function resolvePublishTag(config: ReleaseConfig, channel: ReleaseChannel): string {\n if (channel === 'canary') {\n return config.publish?.canaryTag ?? 'canary';\n }\n return config.publish?.stableTag ?? 'latest';\n}\n\nexport function resolvePublishRegistry(config: ReleaseConfig, channel: ReleaseChannel): string {\n if (channel === 'canary') {\n // Canary never reads config.registry (that's the stable/Verdaccio target) —\n // a stale Verdaccio registry override must not swallow a canary publish.\n return config.publish?.npmRegistry ?? DEFAULT_NPM_REGISTRY;\n }\n return config.registry ?? DEFAULT_NPM_REGISTRY;\n}\n","/**\n * Safe build — builds into temp dir, then atomically swaps dist/.\n * Prevents crashing running services whose dist/ is wiped by tsup's `clean: true`.\n */\n\nimport { rename, rm, cp } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport type { BuildResult, PackageVersion, PluginLogger } from './types';\n\n/**\n * Build all packages in a plan using safe build strategy.\n * Stops on first failure.\n */\nexport async function buildPackages(\n packages: PackageVersion[],\n options?: {\n logger?: PluginLogger;\n onProgress?: (pkg: string, result: BuildResult) => void;\n },\n): Promise<BuildResult[]> {\n const results: BuildResult[] = [];\n\n for (const pkg of packages) {\n options?.logger?.info?.(`Building ${pkg.name}...`);\n const result = await runSafeBuild(pkg.path, pkg.name);\n results.push({ ...result, name: pkg.name });\n\n options?.onProgress?.(pkg.name, { ...result, name: pkg.name });\n\n if (!result.success) {\n options?.logger?.error?.(`Build failed for ${pkg.name}: ${result.error}`);\n break;\n }\n\n options?.logger?.info?.(`Built ${pkg.name} in ${result.durationMs}ms`);\n }\n\n return results;\n}\n\n/**\n * Run build for a single package using safe temp-dir strategy when tsup is detected.\n * Falls back to regular `pnpm run build` for non-tsup packages.\n */\nexport async function runSafeBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const usesTsup = existsSync(join(packagePath, 'tsup.config.ts'))\n || existsSync(join(packagePath, 'tsup.config.js'));\n\n if (usesTsup) {\n return runTsupSafeBuild(packagePath, packageName);\n }\n\n return runDirectBuild(packagePath, packageName);\n}\n\n/**\n * Check if a shell command is a build command that should use safe build.\n */\nexport function isBuildCommand(command: string, args?: string[]): boolean {\n const full = [command, ...(args ?? [])].join(' ').trim();\n return /\\b(pnpm|npm|yarn)\\s+(run\\s+)?build\\b/.test(full);\n}\n\nasync function runTsupSafeBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const startTime = Date.now();\n const buildId = randomBytes(6).toString('hex');\n const tempDir = join(tmpdir(), `kb-release-build-${buildId}`);\n const distDir = join(packagePath, 'dist');\n const backupDir = join(packagePath, `dist.bak-${buildId}`);\n\n try {\n const buildResult = await spawnCommand(`npx tsup -d ${tempDir}`, packagePath);\n\n if (!buildResult.success) {\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n return { ...buildResult, name: packageName, durationMs: Date.now() - startTime };\n }\n\n if (existsSync(distDir)) {\n await rename(distDir, backupDir);\n }\n\n try {\n await rename(tempDir, distDir);\n } catch {\n await cp(tempDir, distDir, { recursive: true });\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n\n await rm(backupDir, { recursive: true, force: true }).catch(() => {});\n return { success: true, name: packageName, durationMs: Date.now() - startTime };\n } catch (err) {\n if (existsSync(backupDir) && !existsSync(distDir)) {\n await rename(backupDir, distDir).catch(() => {});\n }\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n return {\n success: false,\n name: packageName,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startTime,\n };\n }\n}\n\nasync function runDirectBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const result = await spawnCommand('pnpm run build', packagePath);\n return { ...result, name: packageName };\n}\n\nexport interface SpawnResult extends Omit<BuildResult, 'name'> {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Spawn a shell command and collect results.\n * Captures both stdout and stderr — build tools often write errors to stdout.\n */\nexport function spawnCommand(command: string, cwd: string, timeoutMs = 5 * 60 * 1000): Promise<SpawnResult> {\n const startTime = Date.now();\n\n return new Promise((resolve) => {\n const child = spawn(command, [], {\n cwd,\n stdio: 'pipe',\n shell: true,\n env: { ...process.env },\n });\n\n let stdout = '';\n let stderr = '';\n child.stdout?.on('data', (data) => { stdout += data.toString(); });\n child.stderr?.on('data', (data) => { stderr += data.toString(); });\n\n child.on('close', (code) => {\n const exitCode = code ?? 1;\n const durationMs = Date.now() - startTime;\n if (exitCode === 0) {\n resolve({ success: true, durationMs, stdout, stderr, exitCode });\n return;\n }\n\n // Build error message from available output (last N lines to keep it readable)\n const combined = (stderr || stdout).trim();\n const tail = combined\n .split('\\n')\n .slice(-30)\n .join('\\n');\n\n resolve({\n success: false,\n error: tail || `Build failed with exit code ${exitCode}`,\n durationMs,\n stdout,\n stderr,\n exitCode,\n });\n });\n\n child.on('error', (err) => {\n resolve({ success: false, error: err.message, durationMs: Date.now() - startTime, stdout: '', stderr: '', exitCode: 1 });\n });\n\n setTimeout(() => {\n child.kill();\n resolve({ success: false, error: `Timed out after ${timeoutMs / 1000}s`, durationMs: Date.now() - startTime, stdout: '', stderr: '', exitCode: 1 });\n }, timeoutMs);\n });\n}\n","/**\n * Unified check runner for release manager.\n * Reads config.checks[], supports parser field, script path resolution, perPackage routing.\n */\n\nimport { join } from 'node:path';\nimport type { CustomCheckConfig, CheckResult, CheckResultDetails, PluginLogger } from './types';\nimport { spawnCommand } from './build';\n\nexport interface CheckRunnerOptions {\n repoRoot: string;\n packagePaths: string[];\n scopePath?: string;\n logger?: Pick<PluginLogger, 'info' | 'warn'>;\n}\n\n/**\n * Run all configured checks against packages.\n * Handles: parser evaluation, script path resolution, perPackage/scopePath/repoRoot routing.\n */\nexport async function runReleaseChecks(\n checks: CustomCheckConfig[],\n options: CheckRunnerOptions,\n): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n for (const check of checks) {\n const result = await runSingleCheck(check, options);\n results.push(result);\n\n options.logger?.info?.(`Check ${check.id}: ${result.ok ? 'passed' : 'failed'} (${result.timingMs}ms)`);\n\n // Stop on first non-optional failure\n if (!result.ok && !check.optional) {\n break;\n }\n }\n\n return results;\n}\n\nasync function runSingleCheck(\n check: CustomCheckConfig,\n options: CheckRunnerOptions,\n): Promise<CheckResult> {\n const runIn = check.runIn ?? 'perPackage';\n let pathsToRun: string[];\n\n if (runIn === 'repoRoot') {\n pathsToRun = [options.repoRoot];\n } else if (runIn === 'scopePath') {\n pathsToRun = [options.scopePath ?? options.repoRoot];\n } else {\n pathsToRun = options.packagePaths.length > 0 ? options.packagePaths : [options.repoRoot];\n }\n\n // Run perPackage checks in parallel (concurrency=8); single-path checks run sequentially.\n const CONCURRENCY = 8;\n\n const resolvedArgs = (check.args ?? []).map(arg =>\n arg.match(/\\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg\n );\n const fullCommand = [check.command, ...resolvedArgs].join(' ');\n const timeoutMs = check.timeoutMs ?? 120_000;\n\n type PkgRunResult = { path: string; ok: boolean; details: CheckResultDetails; durationMs: number };\n\n async function runForPath(pkgPath: string): Promise<PkgRunResult> {\n const result = await spawnCommand(fullCommand, pkgPath, timeoutMs);\n const ok = evaluateParser(check, result.stdout, result.stderr, result.exitCode);\n return {\n path: pkgPath,\n ok,\n durationMs: result.durationMs,\n details: {\n packagePath: pkgPath,\n stdout: result.stdout || undefined,\n stderr: result.stderr || undefined,\n exitCode: result.exitCode,\n error: result.error ?? (!ok ? `exit code ${result.exitCode}` : undefined),\n },\n };\n }\n\n let pkgResults: PkgRunResult[];\n\n if (runIn === 'perPackage' && pathsToRun.length > 1) {\n // Parallel with concurrency limit\n pkgResults = [];\n for (let i = 0; i < pathsToRun.length; i += CONCURRENCY) {\n const batch = pathsToRun.slice(i, i + CONCURRENCY);\n pkgResults.push(...await Promise.all(batch.map(runForPath)));\n }\n } else {\n pkgResults = [await runForPath(pathsToRun[0]!)];\n }\n\n const firstFailure = pkgResults.find(r => !r.ok)?.details;\n const totalDurationMs = pkgResults.reduce((sum, r) => sum + r.durationMs, 0);\n const perPackage: NonNullable<CheckResult['packages']> | undefined = pathsToRun.length > 1\n ? pkgResults.map(r => ({ path: r.path, ok: r.ok, details: r.ok ? undefined : r.details }))\n : undefined;\n\n const allOk = !firstFailure;\n\n return {\n id: check.id,\n ok: allOk,\n details: firstFailure,\n hint: check.optional ? 'optional' : undefined,\n timingMs: totalDurationMs,\n packages: perPackage && perPackage.length > 0 ? perPackage : undefined,\n };\n}\n\nfunction evaluateParser(\n check: CustomCheckConfig,\n stdout: string,\n stderr: string,\n exitCode: number,\n): boolean {\n const parser = check.parser ?? 'exitcode';\n\n if (parser === 'exitcode') {\n return exitCode === 0;\n }\n\n if (parser === 'json') {\n try {\n const parsed = JSON.parse(stdout);\n return parsed.ok === true || parsed.success === true || parsed.status === 'ok';\n } catch {\n return false;\n }\n }\n\n if (typeof parser === 'function') {\n return parser(stdout, stderr, exitCode);\n }\n\n return exitCode === 0;\n}\n","/**\n * Package verifier — npm pack → extract → verify artifacts before publish.\n * Catches: directory imports, test file leaks, missing exports, syntax errors.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync, mkdirSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport { rmSync, writeFileSync } from 'node:fs';\nimport type { VerifyResult, PackageVersion, PluginLogger } from './types';\n\n/**\n * Verify all packages in a plan are publishable.\n */\nexport async function verifyPackages(\n packages: PackageVersion[],\n options?: {\n logger?: Pick<PluginLogger, 'info'>;\n onProgress?: (pkg: string, result: VerifyResult) => void;\n },\n): Promise<VerifyResult[]> {\n const results: VerifyResult[] = [];\n\n for (const pkg of packages) {\n const result = verifyPackage(pkg.path, pkg.name);\n results.push(result);\n options?.onProgress?.(pkg.name, result);\n }\n\n return results;\n}\n\n/**\n * Verify a single package is publishable.\n * npm pack → extract → check exports, directory imports, test leaks, syntax.\n */\nexport function verifyPackage(packagePath: string, packageName?: string): VerifyResult {\n const pkgJsonPath = join(packagePath, 'package.json');\n if (!existsSync(pkgJsonPath)) {\n return { name: packageName ?? packagePath, success: true, issues: [] }; // skip\n }\n\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const name = packageName ?? pkg.name ?? packagePath;\n\n // Skip private packages\n if (pkg.private) {\n return { name, success: true, issues: [] };\n }\n\n if (!existsSync(join(packagePath, 'dist'))) {\n return { name, success: true, issues: [] }; // no dist = not built yet\n }\n\n const issues: string[] = [];\n const tmpDir = join(tmpdir(), `kb-verify-${randomBytes(6).toString('hex')}`);\n\n try {\n mkdirSync(tmpDir, { recursive: true });\n\n // 1. npm pack (with link: → * replacement)\n const origPkg = readFileSync(pkgJsonPath, 'utf-8');\n const modPkg = JSON.parse(origPkg);\n for (const section of ['dependencies', 'devDependencies', 'peerDependencies']) {\n const deps = modPkg[section];\n if (!deps) {continue;}\n for (const [k, v] of Object.entries(deps)) {\n if (typeof v === 'string' && (v as string).startsWith('link:')) {\n deps[k] = '*';\n }\n }\n }\n writeFileSync(pkgJsonPath, JSON.stringify(modPkg, null, 2) + '\\n');\n\n let tgzFile: string | undefined;\n try {\n spawnSync('npm', ['pack', '--pack-destination', tmpDir], { cwd: packagePath, stdio: 'pipe', timeout: 30_000 });\n const files = readdirSync(tmpDir).filter(f => f.endsWith('.tgz'));\n tgzFile = files[0] ? join(tmpDir, files[0]) : undefined;\n } finally {\n // Always restore original package.json\n writeFileSync(pkgJsonPath, origPkg);\n }\n\n if (!tgzFile) {\n issues.push('npm pack produced no tarball');\n return { name, success: false, issues };\n }\n\n // 2. Extract\n spawnSync('tar', ['xzf', tgzFile], { cwd: tmpDir, stdio: 'pipe' });\n const extractedDir = join(tmpDir, 'package');\n\n issues.push(...verifyExtractedTarball(extractedDir));\n } catch (err) {\n issues.push(`Verification error: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n\n return { name, success: issues.length === 0, issues };\n}\n\n/**\n * Run the static artifact checks (test-file leaks, exports existence,\n * directory-import detection, syntax validation) against an already\n * extracted package tarball. Shared by verifyPackage() (local npm pack)\n * and verdaccio-verify.ts (npm pack pulled from a registry) so both\n * \"verify before publish\" and \"verify after publish\" use identical checks.\n */\nexport function verifyExtractedTarball(extractedDir: string): string[] {\n const issues: string[] = [];\n\n // Test file leaks\n const testFiles = findFiles(join(extractedDir, 'dist'), f =>\n f.includes('.spec.') || f.includes('.test.') || f.includes('__tests__')\n );\n if (testFiles.length > 0) {\n issues.push(`Test files in dist/: ${testFiles.slice(0, 3).join(', ')}`);\n }\n\n // Exports exist\n const extractedPkg = JSON.parse(readFileSync(join(extractedDir, 'package.json'), 'utf-8')) as PkgJson;\n for (const field of ['main', 'module', 'types'] as const) {\n const val = extractedPkg[field];\n if (val && !existsSync(join(extractedDir, val))) {\n issues.push(`${field}: ${val} does not exist in published package`);\n }\n }\n\n if (extractedPkg.exports) {\n checkExportsExist(extractedPkg.exports, extractedDir, 'exports', issues);\n }\n\n // Directory imports in ESM entry\n const esmEntry = resolveEsmEntry(extractedPkg);\n if (esmEntry) {\n const esmPath = join(extractedDir, esmEntry);\n if (existsSync(esmPath)) {\n checkDirectoryImports(esmPath, join(extractedDir, 'dist'), issues);\n\n // Syntax check\n const esmCheck = spawnSync('node', ['--check', esmPath], { stdio: 'pipe', timeout: 10_000 });\n if (esmCheck.status !== 0) {\n issues.push(`ESM syntax error in ${esmEntry}`);\n }\n }\n }\n\n // CJS syntax check\n const cjsEntry = resolveCjsEntry(extractedPkg);\n if (cjsEntry) {\n const cjsPath = join(extractedDir, cjsEntry);\n if (existsSync(cjsPath)) {\n const cjsCheck = spawnSync('node', ['--check', cjsPath], { stdio: 'pipe', timeout: 10_000 });\n if (cjsCheck.status !== 0) {\n issues.push(`CJS syntax error in ${cjsEntry}`);\n }\n }\n }\n\n return issues;\n}\n\ntype PkgJson = Record<string, unknown> & {\n exports?: Record<string, Record<string, string> | string>;\n module?: string;\n main?: string;\n types?: string;\n};\n\nfunction resolveEsmEntry(pkg: PkgJson): string | undefined {\n const dotExport = pkg.exports?.['.'];\n const importEntry = dotExport && typeof dotExport === 'object' ? (dotExport as Record<string, string>)['import'] : undefined;\n return importEntry ?? pkg.module ?? pkg.main;\n}\n\nfunction resolveCjsEntry(pkg: PkgJson): string | undefined {\n const dotExport = pkg.exports?.['.'];\n const req = dotExport && typeof dotExport === 'object' ? (dotExport as Record<string, string>)['require'] : undefined;\n if (req) {return req;}\n if (pkg.main?.endsWith('.cjs')) {return pkg.main;}\n return undefined;\n}\n\nfunction checkExportsExist(exports: unknown, baseDir: string, prefix: string, issues: string[]): void {\n if (typeof exports === 'string') {\n // Skip wildcard patterns like \"./dist/*\" — can't verify statically\n if (exports.includes('*')) { return; }\n if (!existsSync(join(baseDir, exports))) {\n issues.push(`${prefix}: ${exports} missing`);\n }\n } else if (exports && typeof exports === 'object') {\n for (const [k, v] of Object.entries(exports)) {\n // Skip wildcard export keys like \"./dist/*\"\n if (k.includes('*')) { continue; }\n checkExportsExist(v, baseDir, `${prefix}.${k}`, issues);\n }\n }\n}\n\nfunction checkDirectoryImports(filePath: string, distDir: string, issues: string[]): void {\n const content = readFileSync(filePath, 'utf-8');\n const importRegex = /(?:export|import)\\s.*?from\\s+['\"](\\.[^'\"]*)['\"]/g;\n let match: RegExpExecArray | null;\n\n while ((match = importRegex.exec(content)) !== null) {\n const target = match[1];\n if (!target || target.includes('.')) {continue;} // has extension, ok\n const targetPath = resolve(dirname(filePath), target);\n if (existsSync(targetPath) && statSync(targetPath).isDirectory()) {\n issues.push(`Directory import '${target}' in ${filePath.split('/').pop()}`);\n }\n }\n}\n\nfunction findFiles(dir: string, predicate: (f: string) => boolean): string[] {\n if (!existsSync(dir)) {return [];}\n const results: string[] = [];\n function walk(d: string) {\n try {\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n const full = join(d, entry.name);\n if (entry.isDirectory()) {walk(full);}\n else if (predicate(full)) {results.push(entry.name);}\n }\n } catch { /* skip */ }\n }\n walk(dir);\n return results;\n}\n","/**\n * Registry-side artifact verification — confirms a package actually landed\n * on a registry (Verdaccio) with the expected content, before it's promoted\n * to npm `latest`.\n *\n * Deliberately separate from verifier.ts: that module is pure local\n * validation (npm pack from the working tree, no registry I/O) so it stays\n * usable offline/in restricted CI. This module does registry round-trips —\n * it's the \"did the publish actually work, and is what landed still sane\"\n * check that only makes sense to run *after* a publish.\n */\n\nimport { existsSync, mkdirSync, readdirSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport { isVersionPublished } from './planner';\nimport { verifyExtractedTarball } from './verifier';\nimport type { PublishablePackage, VerifyResult, PluginLogger } from './types';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/**\n * Backoff schedule for the \"is it published yet\" poll only — tuned for\n * registry propagation lag (seconds), not for npm rate-limiting (which\n * `publish-programmatic.ts` already handles separately, on a much longer\n * schedule, around the publish call itself). Verdaccio (this module's\n * original caller) is synchronous, so `retries: 0` keeps that path's\n * behavior exactly as before; real npm has observable lag, so `deliver`\n * passes a non-zero `retries`.\n */\nconst DEFAULT_POLL_RETRY_DELAYS_MS = [2_000, 4_000, 8_000, 16_000, 30_000] as const;\n\nexport interface VerifyAgainstRegistryOptions {\n registry: string;\n /** Timeout (ms) for the registry HTTP check and the `npm pack` round-trip. Default: 30000. */\n timeout?: number;\n /**\n * Extra attempts for the \"is it published yet\" check before giving up —\n * each retry waits `retryDelaysMs[attempt]` (capped at the last entry).\n * Default: 0 (single attempt, matches pre-existing Verdaccio behavior).\n */\n retries?: number;\n retryDelaysMs?: readonly number[];\n logger?: Pick<PluginLogger, 'info' | 'warn'>;\n}\n\n/**\n * Verify that each package landed on `registry` at its expected version,\n * and that the tarball actually published there passes the same static\n * checks verifyPackage() runs pre-publish (catches publish-time corruption\n * distinct from pre-publish source issues).\n */\nexport async function verifyAgainstRegistry(\n packages: PublishablePackage[],\n options: VerifyAgainstRegistryOptions,\n): Promise<VerifyResult[]> {\n const { registry, timeout = DEFAULT_TIMEOUT_MS, retries = 0, retryDelaysMs = DEFAULT_POLL_RETRY_DELAYS_MS, logger } = options;\n const results: VerifyResult[] = [];\n\n for (const pkg of packages) {\n results.push(await verifyOneAgainstRegistry(pkg, registry, timeout, retries, retryDelaysMs, logger));\n }\n\n return results;\n}\n\nasync function waitUntilPublished(\n pkg: PublishablePackage,\n registry: string,\n retries: number,\n retryDelaysMs: readonly number[],\n logger?: Pick<PluginLogger, 'info' | 'warn'>,\n): Promise<boolean> {\n for (let attempt = 0; attempt <= retries; attempt++) {\n if (await isVersionPublished(pkg.name, pkg.version, registry)) {\n return true;\n }\n if (attempt < retries) {\n const delay = retryDelaysMs[Math.min(attempt, retryDelaysMs.length - 1)]!;\n logger?.warn?.(\n `${pkg.name}@${pkg.version} not yet visible on ${registry} (attempt ${attempt + 1}/${retries + 1}), ` +\n `retrying in ${(delay / 1000).toFixed(0)}s — likely registry propagation lag`,\n );\n await new Promise<void>(r => { setTimeout(r, delay); });\n }\n }\n return false;\n}\n\nasync function verifyOneAgainstRegistry(\n pkg: PublishablePackage,\n registry: string,\n timeout: number,\n retries: number,\n retryDelaysMs: readonly number[],\n logger?: Pick<PluginLogger, 'info' | 'warn'>,\n): Promise<VerifyResult> {\n const published = await waitUntilPublished(pkg, registry, retries, retryDelaysMs, logger);\n if (!published) {\n return { name: pkg.name, success: false, issues: [`${pkg.name}@${pkg.version} was not found on ${registry} after publish (waited through ${retries} retr${retries === 1 ? 'y' : 'ies'})`] };\n }\n logger?.info?.(`${pkg.name}@${pkg.version} confirmed on ${registry}`);\n\n const tmpDir = join(tmpdir(), `kb-verdaccio-verify-${randomBytes(6).toString('hex')}`);\n const issues: string[] = [];\n\n try {\n mkdirSync(tmpDir, { recursive: true });\n\n const spec = `${pkg.name}@${pkg.version}`;\n const packResult = spawnSync(\n 'npm',\n ['pack', spec, '--registry', registry, '--pack-destination', tmpDir],\n { stdio: 'pipe', timeout },\n );\n\n if (packResult.status !== 0) {\n const stderr = packResult.stderr?.toString().trim();\n issues.push(`Could not pull ${spec} back from ${registry} for verification${stderr ? `: ${stderr}` : ''}`);\n return { name: pkg.name, success: false, issues };\n }\n\n const tgzFile = readdirSync(tmpDir).find(f => f.endsWith('.tgz'));\n if (!tgzFile) {\n issues.push(`npm pack produced no tarball for ${spec} from ${registry}`);\n return { name: pkg.name, success: false, issues };\n }\n\n spawnSync('tar', ['xzf', tgzFile], { cwd: tmpDir, stdio: 'pipe' });\n const extractedDir = join(tmpDir, 'package');\n if (!existsSync(extractedDir)) {\n issues.push(`Failed to extract tarball for ${spec}`);\n return { name: pkg.name, success: false, issues };\n }\n\n issues.push(...verifyExtractedTarball(extractedDir));\n } catch (err) {\n issues.push(`Registry verification error: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n\n return { name: pkg.name, success: issues.length === 0, issues };\n}\n","/**\n * Release lock — prevents concurrent release runs.\n *\n * Creates `.kb/release/release.lock` with current PID.\n * On acquire: fails if another live process holds the lock.\n * On release: removes the lock file.\n */\n\nimport { readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\ninterface LockData {\n pid: number;\n startedAt: string;\n flow?: string;\n}\n\nfunction lockPath(repoRoot: string): string {\n return join(repoRoot, '.kb', 'release', 'release.lock');\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Acquire the release lock.\n * Returns a release function — call it in a finally block.\n * Throws if another release is already running.\n */\nexport function acquireLock(repoRoot: string, flow?: string): () => void {\n const path = lockPath(repoRoot);\n\n // Check if lock exists and belongs to a live process\n try {\n const existing = JSON.parse(readFileSync(path, 'utf-8')) as LockData;\n if (isProcessAlive(existing.pid)) {\n throw new Error(\n `Another release is already running (PID ${existing.pid}, started ${existing.startedAt}, flow: ${existing.flow ?? 'unknown'}). ` +\n `If this is stale, delete: ${path}`\n );\n }\n // Stale lock from a dead process — overwrite it\n } catch (err) {\n if (err instanceof Error && err.message.includes('Another release')) {throw err;}\n // File doesn't exist or is unreadable — proceed\n }\n\n mkdirSync(join(repoRoot, '.kb', 'release'), { recursive: true });\n writeFileSync(path, JSON.stringify({ pid: process.pid, startedAt: new Date().toISOString(), flow } satisfies LockData));\n\n return () => {\n try { unlinkSync(path); } catch { /* already removed */ }\n };\n}\n","/**\n * Unified release pipeline — single orchestrator for CLI and REST.\n *\n * Flow: plan → snapshot → checks → build → verify → version bump → changelog → publish → git → report\n *\n * IMPORTANT — publish BEFORE git:\n * We commit and tag AFTER a successful publish, not before.\n * This prevents the \"git tag exists but npm is empty\" state that breaks installs.\n * If publish fails (even partially), no git commit or tag is created.\n */\n\nimport { join } from 'node:path';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { useEnv } from '@kb-labs/sdk';\nimport { planRelease } from './planner';\nimport { saveSnapshot, restoreSnapshot } from './rollback';\nimport { updatePackageVersions } from './publisher';\nimport { copyChangelogToPackages, commitAndTagRelease, mergeRootChangelog } from './publisher';\nimport { buildPackages } from './build';\nimport { runReleaseChecks } from './checks';\nimport { verifyPackages } from './verifier';\nimport { verifyAgainstRegistry } from './verdaccio-verify';\nimport { acquireLock } from './lock';\nimport { resolvePublishTag, resolvePublishRegistry } from './channel';\nimport {\n loadCheckpoint,\n writeCheckpoint,\n deleteCheckpoint,\n isCheckpointResumable,\n} from './checkpoint';\nimport type {\n PipelineOptions,\n PipelineResult,\n ReleaseReport,\n ReleaseResult,\n ReleasePlan,\n ReleaseStage,\n VersionBump,\n} from './types';\n\n/**\n * Run the complete release pipeline.\n * Both CLI and REST call this with different injected publishers/changelog generators.\n */\nexport async function runReleasePipeline(options: PipelineOptions): Promise<PipelineResult> {\n const {\n cwd: _cwd, repoRoot, scopeCwd, scope, config, dryRun = false,\n skipChecks = false, skipBuild = false, skipVerify = false,\n skipPublish = false,\n noVerify = false,\n checks: checkConfigs, publisher, changelog: changelogGen,\n logger, onProgress,\n } = options;\n\n const flow = options.flow;\n\n const startTime = Date.now();\n const progress = (stage: ReleaseStage, msg: string) => {\n logger?.info?.(msg);\n onProgress?.(stage, msg);\n };\n\n // 0a. Acquire exclusive lock — prevents concurrent release runs.\n const releaseLock = acquireLock(repoRoot, flow);\n\n try {\n return await _runPipeline({\n repoRoot, scopeCwd, scope, flow, config, dryRun, skipChecks, skipBuild, skipVerify,\n skipPublish, noVerify, checkConfigs, publisher, changelogGen, logger, startTime, progress,\n options,\n });\n } finally {\n releaseLock();\n }\n}\n\nasync function _runPipeline(ctx: {\n repoRoot: string;\n scopeCwd: string;\n scope: string | undefined;\n flow: string | undefined;\n config: PipelineOptions['config'];\n dryRun: boolean;\n skipChecks: boolean;\n skipBuild: boolean;\n skipVerify: boolean;\n skipPublish: boolean;\n noVerify: boolean;\n checkConfigs: PipelineOptions['checks'];\n publisher: PipelineOptions['publisher'];\n changelogGen: PipelineOptions['changelog'];\n logger: PipelineOptions['logger'];\n startTime: number;\n progress: (stage: ReleaseStage, msg: string) => void;\n options: PipelineOptions;\n}): Promise<PipelineResult> {\n const {\n repoRoot, scopeCwd, scope, flow, config, dryRun,\n skipChecks, skipBuild, skipVerify, skipPublish, noVerify,\n checkConfigs, publisher, changelogGen, logger, startTime, progress,\n } = ctx;\n\n // 0b. Pre-flight: verify npm credentials before doing any real work.\n // Skipped entirely in prepare-only mode — no npm access is needed to\n // build, version, changelog, and git-tag a release.\n const channel = config.channel ?? 'stable';\n const publishTag = resolvePublishTag(config, channel);\n const publishRegistry = resolvePublishRegistry(config, channel);\n\n if (!dryRun && !skipPublish) {\n const registry = publishRegistry;\n const authError = await verifyNpmAuth(registry);\n if (authError) {\n const emptyPlan: ReleasePlan = { packages: [], strategy: 'semver', registry, rollbackEnabled: false, channel };\n return {\n success: false,\n plan: emptyPlan,\n report: buildReport('planning', emptyPlan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: [`npm auth check failed: ${authError}`],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n\n // 1. Plan — always discover from repoRoot with scope as a filter.\n // scopeCwd is used only for checks/git/changelog (physical path ops), not for discovery.\n progress('planning', 'Discovering packages and planning release...');\n const plan = await planRelease({\n cwd: repoRoot,\n config,\n scope,\n flow, // already includes defaultFlow fallback\n bumpOverride: config.bump as VersionBump | undefined,\n channel,\n });\n\n if (plan.packages.length === 0) {\n return {\n success: false,\n plan,\n report: buildReport('planning', plan, repoRoot, dryRun, startTime, {\n ok: false, errors: [`No packages found for scope: ${scope || 'all'}`], timingMs: 0,\n }),\n };\n }\n\n progress('planning', `Found ${plan.packages.length} package(s) to release`);\n\n // 1b. Check for resumable checkpoint — publish already done, only git remains.\n // N/A in prepare-only mode: skipPublish never writes a checkpoint.\n if (!dryRun && !skipPublish) {\n const existingCheckpoint = loadCheckpoint(repoRoot);\n if (existingCheckpoint) {\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const planVersion = uniqueVersions.size === 1 ? plan.packages[0]!.nextVersion : 'independent';\n if (isCheckpointResumable(existingCheckpoint, flow ?? 'default', planVersion)) {\n progress('publishing', 'Resuming from checkpoint — publish already done, running git step...');\n const resumeGit = await commitAndTagRelease({\n cwd: scopeCwd,\n plan,\n dryRun: false,\n noVerify,\n repoRoot,\n checkpointGitRoots: existingCheckpoint.gitRoots,\n changelogOutputPath: config.changelog?.outputPath,\n flowName: flow,\n tagPattern: flow ? config.flows?.[flow]?.tagPattern : undefined,\n });\n deleteCheckpoint(repoRoot);\n const resumeReport = buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: resumeGit.committed,\n published: existingCheckpoint.publishedPackages.map(p => `${p.name}@${p.version}`),\n git: resumeGit,\n timingMs: Date.now() - startTime,\n });\n const scopeDir = scope ? scope.replace(/[@/]/g, '-').replace(/^-/, '') : 'root';\n const historyDir = join(repoRoot, '.kb', 'release', 'history', scopeDir, new Date().toISOString().replace(/[:.]/g, '-'));\n await mkdir(historyDir, { recursive: true });\n await writeFile(join(historyDir, 'report.json'), JSON.stringify(resumeReport, null, 2), 'utf-8');\n return { success: resumeReport.result.ok, plan, report: resumeReport };\n }\n }\n }\n\n // 2. Snapshot (for rollback)\n await saveSnapshot({ cwd: repoRoot, plan });\n\n // 3. Checks\n if (!skipChecks && checkConfigs && checkConfigs.length > 0) {\n progress('checking', `Running ${checkConfigs.length} pre-release check(s)...`);\n\n const packagePaths = plan.packages.map(p => p.path);\n const checkResults = await runReleaseChecks(checkConfigs, {\n repoRoot,\n packagePaths,\n scopePath: scopeCwd,\n logger,\n });\n\n const failed = checkResults.filter(r => !r.ok && r.hint !== 'optional');\n if (failed.length > 0) {\n await restoreSnapshot(repoRoot);\n\n // Build rich per-check error messages for both human and agent consumption\n const errorLines = failed.flatMap(f => {\n const lines: string[] = [`check \"${f.id}\" failed`];\n if (f.details?.packagePath) { lines.push(` package: ${f.details.packagePath}`); }\n if (f.details?.error) { lines.push(` reason: ${f.details.error}`); }\n if (f.details?.stderr?.trim()) { lines.push(` stderr: ${f.details.stderr.trim().split('\\n').slice(0, 5).join('\\n ')}`); }\n if (f.details?.stdout?.trim() && !f.details?.stderr?.trim()) { lines.push(` output: ${f.details.stdout.trim().split('\\n').slice(0, 5).join('\\n ')}`); }\n if (f.packages?.filter(p => !p.ok).length) {\n const failedPkgs = f.packages.filter(p => !p.ok);\n lines.push(` failed in ${failedPkgs.length}/${f.packages.length} package(s):`);\n for (const pkg of failedPkgs.slice(0, 10)) {\n lines.push(` - ${pkg.path}${pkg.details?.error ? `: ${pkg.details.error}` : ''}`);\n }\n }\n return lines;\n });\n\n return {\n success: false,\n plan,\n report: buildReport('checking', plan, repoRoot, dryRun, startTime, {\n ok: false,\n checks: Object.fromEntries(checkResults.map(r => [r.id, r])),\n errors: errorLines,\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n progress('checking', 'Pre-release checks passed');\n }\n\n // 4. Build\n if (!skipBuild && !dryRun) {\n progress('versioning', `Building ${plan.packages.length} package(s)...`);\n const buildResults = await buildPackages(plan.packages, { logger });\n const buildFailed = buildResults.filter(r => !r.success);\n\n if (buildFailed.length > 0) {\n await restoreSnapshot(repoRoot);\n return {\n success: false,\n plan,\n report: buildReport('versioning', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: buildFailed.map(f => `Build failed: ${f.name} — ${f.error}`),\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n\n // 5. Verify (pack + install check)\n if (!skipVerify && !dryRun) {\n progress('verifying', 'Verifying package artifacts...');\n const verifyResults = await verifyPackages(plan.packages, { logger });\n const verifyFailed = verifyResults.filter(r => !r.success);\n\n if (verifyFailed.length > 0) {\n await restoreSnapshot(repoRoot);\n const allIssues = verifyFailed.flatMap(r => r.issues.map(i => `${r.name}: ${i}`));\n return {\n success: false,\n plan,\n report: buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: [`Package verification failed:\\n ${allIssues.join('\\n ')}`],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n progress('verifying', 'Package artifacts verified');\n }\n\n // 6. Version bump — canary never persists its computed version to\n // package.json/git; it publishes the in-memory nextVersion directly.\n if (channel === 'stable') {\n progress('versioning', 'Updating package versions...');\n if (!dryRun) {\n const versionUpdates = await updatePackageVersions(plan);\n const failedUpdates = versionUpdates.filter(u => !u.updated);\n if (failedUpdates.length > 0) {\n await restoreSnapshot(repoRoot);\n return {\n success: false,\n plan,\n report: buildReport('versioning', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: failedUpdates.map(u => `Version update failed: ${u.package}`),\n versionUpdates,\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n }\n\n // 7. Changelog — skipped for canary: there's nothing to changelog against a\n // registry-only prerelease, and writing CHANGELOG.md would leave dirty,\n // uncommitted files behind since canary never runs the git stage either.\n let changelogMd = '';\n if (changelogGen && channel === 'stable') {\n progress('versioning', 'Generating changelog...');\n try {\n changelogMd = await changelogGen.generate(plan, { repoRoot, gitCwd: scopeCwd, config });\n } catch (err) {\n logger?.warn?.(`Changelog generation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n if (changelogMd && !dryRun) {\n await copyChangelogToPackages({ cwd: repoRoot, plan, changelog: changelogMd });\n await mergeRootChangelog({ repoRoot, plan, changelog: changelogMd, outputPath: config.changelog?.outputPath });\n }\n\n // 8. Publish (before git — see module comment).\n // Prepare-only mode (skipPublish) never calls the publisher — it produces\n // a synthetic \"nothing published yet\" result and falls straight through to\n // git commit/tag. A separate CI job (`kb release promote`), triggered by\n // the tag this run pushes, does the actual npm publish. See\n // plugins/release/docs/adr/0001-*.\n progress('publishing', dryRun ? 'Simulating publish (dry-run)...' : skipPublish ? 'Skipping publish (prepare-only)...' : 'Publishing packages...');\n const packagesToPublish = plan.packages.map(pkg => ({\n name: pkg.name,\n version: pkg.nextVersion,\n path: pkg.path,\n }));\n\n const publishResult = skipPublish\n ? {\n published: [],\n alreadyPublished: [],\n failed: [],\n skipped: packagesToPublish.map(p => `${p.name}@${p.version} (prepared, not published)`),\n errors: [],\n }\n : await publisher.publish(packagesToPublish, {\n dryRun,\n access: config.publish?.access ?? 'public',\n tag: publishTag,\n registry: publishRegistry,\n });\n\n // If any package genuinely failed to publish, abort before touching git.\n // \"alreadyPublished\" entries are fine — they are counted as success.\n const publishFailed = publishResult.failed.length > 0;\n\n if (publishFailed) {\n return {\n success: false,\n plan,\n report: buildReport('publishing', plan, repoRoot, dryRun, startTime, {\n ok: false,\n published: publishResult.published,\n skipped: publishResult.skipped,\n errors: [\n `${publishResult.failed.length} package(s) failed to publish — git commit/tag skipped to prevent desync.`,\n ...(publishResult.errors ?? []),\n ],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n // 8b. Write checkpoint after successful publish — enables git-only retry on failure.\n // Skipped for canary: there's no git step to resume into, and canary versions\n // are deterministic per (base version, shortSha) so retries are naturally\n // idempotent via the publisher's already-published handling. Skipped for\n // skipPublish: nothing was published, there's nothing to check-point.\n if (!dryRun && !skipPublish && channel === 'stable') {\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const cpVersion = uniqueVersions.size === 1 ? plan.packages[0]!.nextVersion : 'independent';\n writeCheckpoint(repoRoot, {\n flow: flow ?? 'default',\n version: cpVersion,\n publishedPackages: plan.packages.map(p => ({\n name: p.name,\n version: p.nextVersion,\n path: p.path,\n gitRoot: p.gitRoot,\n })),\n gitRoots: {},\n });\n }\n\n // 8c. Verify the published artifact against the registry it was just\n // published to — a hard invariant for stable releases (not opt-in): confirms\n // each package actually landed and re-runs the same static checks against\n // what the registry served back, catching publish-time corruption distinct\n // from pre-publish source issues. Canary skips this — it never goes through\n // a Verdaccio pre-promote gate. skipPublish skips it too — nothing landed\n // on any registry this run; `kb release promote` verifies its own publish.\n if (!dryRun && !skipPublish && channel === 'stable') {\n progress('verifying', 'Verifying published artifacts against the registry...');\n const registryVerifyResults = await verifyAgainstRegistry(packagesToPublish, {\n registry: publishRegistry,\n timeout: config.publish?.verifyRegistryTimeoutMs,\n logger,\n });\n const registryVerifyFailed = registryVerifyResults.filter(r => !r.success);\n if (registryVerifyFailed.length > 0) {\n const allIssues = registryVerifyFailed.flatMap(r => r.issues.map(i => `${r.name}: ${i}`));\n return {\n success: false,\n plan,\n report: buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: false,\n published: publishResult.published,\n errors: [`Registry verification failed after publish — git commit/tag skipped:\\n ${allIssues.join('\\n ')}`],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n\n // 9. Git commit + tag — only after all packages are on npm.\n // Canary never runs this: its version is never persisted to package.json,\n // so there's nothing meaningful to commit or tag.\n let gitResult: { committed: boolean; tagged: string[]; pushed: boolean } | undefined;\n if (!dryRun && channel === 'stable') {\n progress('verifying', 'Committing and tagging release...');\n gitResult = await commitAndTagRelease({\n cwd: scopeCwd, plan, dryRun, noVerify, repoRoot,\n changelogOutputPath: config.changelog?.outputPath,\n flowName: flow,\n tagPattern: flow ? config.flows?.[flow]?.tagPattern : undefined,\n });\n deleteCheckpoint(repoRoot);\n }\n\n // 10. Report\n const report = buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: (!gitResult || gitResult.committed),\n published: publishResult.published,\n alreadyPublished: publishResult.alreadyPublished,\n skipped: publishResult.skipped,\n changelog: changelogMd || undefined,\n git: gitResult,\n timingMs: Date.now() - startTime,\n });\n\n // Save report\n const scopeDir = scope ? scope.replace(/[@/]/g, '-').replace(/^-/, '') : 'root';\n const historyDir = join(repoRoot, '.kb', 'release', 'history', scopeDir, new Date().toISOString().replace(/[:.]/g, '-'));\n await mkdir(historyDir, { recursive: true });\n await writeFile(join(historyDir, 'report.json'), JSON.stringify(report, null, 2), 'utf-8');\n\n return { success: report.result.ok, plan, report };\n}\n\n/**\n * Quick pre-flight check: verify npm credentials are valid.\n * Uses the registry HTTP API directly — works regardless of .npmrc config.\n * Returns an error string on failure, null on success.\n */\nasync function verifyNpmAuth(registry: string): Promise<string | null> {\n const token = useEnv('NPM_TOKEN') ?? useEnv('NODE_AUTH_TOKEN');\n if (!token) {\n return 'NPM_TOKEN or NODE_AUTH_TOKEN environment variable is not set';\n }\n try {\n const res = await fetch(`${registry}/-/whoami`, {\n headers: { Authorization: `Bearer ${token}` },\n signal: AbortSignal.timeout(8000),\n });\n if (!res.ok) {\n return `npm token invalid or expired (HTTP ${res.status} from ${registry})`;\n }\n return null;\n } catch (e) {\n return `npm registry unreachable: ${e instanceof Error ? e.message : String(e)}`;\n }\n}\n\nfunction buildReport(\n stage: ReleaseStage,\n plan: ReleasePlan,\n repoRoot: string,\n dryRun: boolean,\n startTime: number,\n result: Partial<ReleaseResult> & { ok: boolean; timingMs: number },\n): ReleaseReport {\n return {\n schemaVersion: '1.0',\n ts: new Date().toISOString(),\n context: { repo: repoRoot, cwd: repoRoot, branch: 'unknown', dryRun },\n stage,\n plan,\n result: { ...result, timingMs: result.timingMs ?? (Date.now() - startTime) },\n };\n}\n","/**\n * Scope utilities — resolve scope name to filesystem path.\n *\n * \"scope\" is a filter/selector concept (e.g. \"@kb-labs/release-manager\", \"installer/kb-labs-create\").\n * \"scopePath\" is the resolved absolute filesystem path used for checks (runIn: scopePath) and git ops.\n *\n * Discovery (planRelease) always uses repoRoot + scope filter — never scopePath directly.\n */\n\nimport { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\n/**\n * Resolve a scope name to an absolute filesystem path.\n *\n * - 'root' → repoRoot\n * - '@kb-labs/foo' → directory containing package.json with that name\n * - 'installer/kb-labs-create' → repoRoot/installer/kb-labs-create (direct path)\n *\n * Used only where a physical path is required:\n * - checks with runIn: 'scopePath'\n * - git commit/tag cwd\n * - changelog gitCwd\n *\n * NOT used for package discovery — planRelease always takes (repoRoot, scope).\n */\nexport async function resolveScopePath(repoRoot: string, scope: string): Promise<string> {\n if (!scope || scope === 'root') {\n return repoRoot;\n }\n\n // Scoped npm package name → scan package.json files\n if (scope.startsWith('@')) {\n const packageJsonPaths = await globby('**/package.json', {\n cwd: repoRoot,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.*/**'],\n });\n\n for (const pkgJsonPath of packageJsonPaths) {\n try {\n const pkg = JSON.parse(await readFile(pkgJsonPath, 'utf-8'));\n if (pkg.name === scope) {\n return join(pkgJsonPath, '..');\n }\n } catch { /* skip */ }\n }\n }\n\n // Direct relative path (e.g. 'installer/kb-labs-create', 'plugins/kb-labs-mind')\n return join(repoRoot, scope);\n}\n"]}
1
+ {"version":3,"sources":["../src/versioning-strategies.ts","../src/planner.ts","../src/checkpoint.ts","../src/tag.ts","../src/publisher.ts","../src/rollback.ts","../src/reporters/json.ts","../src/reporters/markdown.ts","../src/reporters/text.ts","../src/shell-adapter.ts","../src/channel.ts","../src/dep-order.ts","../src/build.ts","../src/checks.ts","../src/verifier.ts","../src/verdaccio-verify.ts","../src/lock.ts","../src/pipeline.ts","../src/scope.ts"],"names":["semver","resolve","isPathPattern","join","existsSync","readFile","simpleGit","mkdir","writeFile","formatTiming","readFileSync","tmpdir","randomBytes","mkdirSync","writeFileSync","exports","dirname","spawnSync","readdirSync","rmSync","unlinkSync","scopeDir","historyDir","globby"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Versioning strategies for monorepo package releases\n *\n * - lockstep: All packages get the same version (maximum bump)\n * - independent: Each package has its own version\n * - adaptive: Lockstep if breaking changes, otherwise independent\n */\n\nimport semver from 'semver';\nimport type { PackageVersion, VersionBump } from './types';\n\nexport type VersionStrategy = 'lockstep' | 'independent' | 'adaptive';\n\nexport interface StrategyOptions {\n strategy: VersionStrategy;\n umbrellaPath?: string; // path to umbrella root (for filtering)\n}\n\n/**\n * Apply versioning strategy to packages\n */\nexport function applyVersionStrategy(\n packages: PackageVersion[],\n options: StrategyOptions\n): PackageVersion[] {\n if (options.strategy === 'lockstep') {\n return applyLockstep(packages);\n }\n\n if (options.strategy === 'adaptive') {\n return applyAdaptive(packages);\n }\n\n // independent (default) - no changes needed\n return packages;\n}\n\n/**\n * Lockstep: All packages get the maximum version bump\n *\n * Example:\n * - Package A: 1.0.0 -> 1.1.0 (minor)\n * - Package B: 1.0.0 -> 2.0.0 (major)\n * Result: Both get 2.0.0 (maximum bump = major)\n */\nfunction applyLockstep(packages: PackageVersion[]): PackageVersion[] {\n if (packages.length === 0) {return packages;}\n\n // Find the maximum bump level\n const maxBump = getMaxBump(packages);\n\n // Find the highest current version\n const maxVersion = packages.reduce((max, pkg) => {\n return semver.gt(pkg.currentVersion, max) ? pkg.currentVersion : max;\n }, packages[0]!.currentVersion); // ! safe: length already checked\n\n // Compute next version from max version + max bump\n // Filter out 'auto' since semver.inc expects ReleaseType\n const releaseType = maxBump === 'auto' ? 'patch' : maxBump;\n const nextVersion = semver.inc(maxVersion, releaseType) || maxVersion;\n\n // Apply to all packages\n return packages.map(pkg => ({\n ...pkg,\n bump: maxBump,\n nextVersion,\n }));\n}\n\n/**\n * Adaptive: Lockstep if breaking changes, otherwise independent\n *\n * This is useful for umbrellas where you want to keep versions in sync\n * when there are breaking changes, but allow independent releases otherwise.\n */\nfunction applyAdaptive(packages: PackageVersion[]): PackageVersion[] {\n const hasBreaking = packages.some(pkg => pkg.bump === 'major');\n\n // If any package has breaking changes, use lockstep\n if (hasBreaking) {\n return applyLockstep(packages);\n }\n\n // Otherwise, use independent (no changes)\n return packages;\n}\n\n/**\n * Apply a canary prerelease suffix to already-computed nextVersion values.\n *\n * Runs AFTER applyVersionStrategy() (lockstep/independent/adaptive) has\n * resolved the base bump — canary is orthogonal to bump size, so it's a\n * pure post-processing step rather than a VersionBump variant. Given a\n * short git SHA, `1.2.3` (base next version) becomes `1.2.3-canary.<sha>`.\n *\n * Deterministic per (nextVersion, shortSha) pair — retrying the same commit\n * reproduces the same canary version, so publish-side idempotency handling\n * (already-published patterns) makes retries safe without extra state.\n */\nexport function applyCanarySuffix(packages: PackageVersion[], shortSha: string): PackageVersion[] {\n if (!shortSha) {\n throw new Error('applyCanarySuffix: shortSha is required to build a canary version');\n }\n return packages.map(pkg => ({\n ...pkg,\n nextVersion: `${pkg.nextVersion}-canary.${shortSha}`,\n }));\n}\n\n/**\n * Get the maximum bump level from a list of packages\n *\n * Priority: major > minor > patch\n */\nfunction getMaxBump(packages: PackageVersion[]): VersionBump {\n let maxBump: VersionBump = 'patch';\n\n for (const pkg of packages) {\n if (pkg.bump === 'major') {\n return 'major'; // Can't go higher than major\n }\n if (pkg.bump === 'minor') {\n maxBump = 'minor';\n }\n }\n\n return maxBump;\n}\n","/**\n * Release planner - detects changes and suggests version bumps\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, relative, resolve } from 'node:path';\nimport simpleGit from 'simple-git';\nimport semver from 'semver';\nimport globby from 'globby';\nimport { discoverSubRepoPaths } from '@kb-labs/sdk';\nimport type { PackageVersion, VersionBump, ReleaseConfig, ReleasePlan, ReleaseChannel } from './types';\nimport { applyVersionStrategy, applyCanarySuffix, type VersionStrategy } from './versioning-strategies';\n\n/**\n * Find the most recent git tag for a package.\n * For scoped packages: looks for \"<name>@<version>\" tags.\n * For lockstep repos: looks for \"v<version>\" tags.\n * Returns null if no tag found (initial release).\n */\nasync function findLastReleaseTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n): Promise<string | null> {\n try {\n // Try package-scoped tag first: @kb-labs/foo@1.2.3\n const tags = await git.tags(['--sort=-version:refname', `--list`, `${pkgName}@*`]);\n if (tags.all.length > 0) {\n return tags.all[0]!;\n }\n // Try lockstep tag: v1.2.3\n const vTags = await git.tags(['--sort=-version:refname', '--list', 'v*']);\n if (vTags.all.length > 0) {\n return vTags.all[0]!;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get commits since last release tag, scoped to a path.\n * Returns empty array if git log fails.\n */\nasync function getCommitsSinceTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n relPath: string,\n): Promise<string[]> {\n const lastTag = await findLastReleaseTag(git, pkgName);\n try {\n // git log [<tag>..HEAD] [--] <path>\n // Without a tag (initial release): git log -- <path>\n const args = ['log', '--format=%s', ...(lastTag ? [`${lastTag}..HEAD`] : []), '--', relPath];\n const raw = await git.raw(args);\n return raw.split('\\n').map((s: string) => s.trim()).filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Check if there are any file changes since last release tag.\n * Covers: uncommitted, committed-not-pushed, committed-and-pushed.\n */\nasync function hasChangesSinceTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n pkgRelPath: string,\n): Promise<boolean> {\n // 1. Uncommitted changes (working tree + index)\n const status = await git.status();\n const uncommitted = status.files.map(f => f.path);\n const hasUncommitted = uncommitted.some(p => p === pkgRelPath || p.startsWith(pkgRelPath + '/'));\n if (hasUncommitted) {return true;}\n\n // 2. Committed changes since last tag\n const commits = await getCommitsSinceTag(git, pkgName, pkgRelPath);\n return commits.length > 0;\n}\n\nexport interface PlannerOptions {\n cwd: string;\n config: ReleaseConfig;\n scope?: string;\n /** Named flow — selects a release config profile. Completely replaces global packages/versioning/checks. */\n flow?: string;\n bumpOverride?: VersionBump;\n /** Release track. Defaults to 'stable'. See ReleaseChannel. */\n channel?: ReleaseChannel;\n}\n\n/**\n * Merge base config with a named flow's config.\n * Flow completely REPLACES packages, versioningStrategy, and checks — no array merging.\n * All other config fields (registry, publish, rollback, git, changelog) remain from global.\n */\nexport function mergeConfigWithFlow(config: ReleaseConfig, flowName: string): ReleaseConfig {\n const flow = config.flows?.[flowName];\n if (!flow) {\n throw new Error(`Flow \"${flowName}\" is not defined in config.flows`);\n }\n return {\n ...config,\n ...(flow.packages !== undefined && { packages: flow.packages }),\n ...(flow.versioningStrategy && { versioningStrategy: flow.versioningStrategy }),\n ...(flow.checks !== undefined && { checks: flow.checks }),\n ...(flow.build !== undefined && { build: flow.build }),\n };\n}\n\n/**\n * Check whether a specific package version is already published on the npm registry.\n * Fail-open: returns false on any network/registry error.\n */\nexport async function isVersionPublished(name: string, version: string, registry: string): Promise<boolean> {\n try {\n const encoded = name.startsWith('@') ? `@${encodeURIComponent(name.slice(1))}` : name;\n const url = `${registry.replace(/\\/$/, '')}/${encoded}/${version}`;\n const res = await fetch(url, { method: 'HEAD', signal: AbortSignal.timeout(5000) });\n return res.status === 200;\n } catch {\n return false;\n }\n}\n\n/**\n * Discover release-candidate packages for a scope, at their CURRENT\n * package.json version — no git-diff-based bump computation. Shared by\n * planRelease() (which then computes bumps on top) and `kb release\n * promote` (which needs the already-released versions as-is, since\n * recomputing bumps from git history would be wrong for a promote).\n */\nexport async function discoverCurrentPackages(\n cwd: string,\n scope: string | undefined,\n config: ReleaseConfig,\n): Promise<PackageVersion[]> {\n const allPackages = await discoverPackages(cwd, config);\n\n if (!scope || scope === 'root') {\n return allPackages;\n }\n\n const isWorkspace = existsSync(join(cwd, '.gitmodules'));\n if (isWorkspace) {\n // In workspace mode, scope matches a sub-repo root.\n // Re-discover inside that sub-repo using standard discoverPackages (glob-based).\n const matchedRoots = filterByScope(allPackages, scope, config);\n const innerPackages: PackageVersion[] = [];\n for (const root of matchedRoots) {\n // Include root itself\n innerPackages.push(root);\n // Discover inner packages using standard glob logic (respects config, skips private)\n const inner = await discoverPackages(root.path, config);\n for (const pkg of inner) {\n if (!innerPackages.some(p => p.name === pkg.name)) {\n innerPackages.push(pkg);\n }\n }\n }\n return innerPackages;\n }\n\n return filterByScope(allPackages, scope, config);\n}\n\n/**\n * Plan release by detecting changes and computing version bumps\n */\nexport async function planRelease(options: PlannerOptions): Promise<ReleasePlan> {\n const { cwd, scope, bumpOverride, channel = 'stable' } = options;\n\n // Flow resolution — completely replaces packages/versioningStrategy/checks in config.\n // MUST happen before discoverPackages so globally-excluded packages can appear in a flow.\n const config = options.flow\n ? mergeConfigWithFlow(options.config, options.flow)\n : options.config;\n\n // Step 1-2: discover candidates and apply scope filtering.\n const packages = await discoverCurrentPackages(cwd, scope, config);\n\n // Workspace root with submodules: each sub-repo has its own git,\n // so we skip workspace-level detectModifiedPackages and use per-repo git.\n const isWorkspaceRoot = existsSync(join(cwd, '.gitmodules')) && !scope;\n\n let modifiedPackages: PackageVersion[];\n if (isWorkspaceRoot) {\n // All sub-repos are candidates — change detection happens per-repo\n modifiedPackages = packages;\n } else if (config.versioningStrategy === 'lockstep') {\n // Lockstep: all packages release together regardless of individual changes\n modifiedPackages = packages;\n } else {\n const git = simpleGit(cwd, { timeout: { block: 60000 } });\n modifiedPackages = await detectModifiedPackages(git, packages, cwd);\n }\n\n // Compute version bumps\n const registry = config.registry ?? 'https://registry.npmjs.org';\n let planPackages: PackageVersion[] = [];\n for (const pkg of modifiedPackages) {\n const bump = bumpOverride || config.bump || 'auto';\n\n // For workspace root, use per-sub-repo git instance\n const gitCwd = isWorkspaceRoot ? pkg.path : cwd;\n const git = simpleGit(gitCwd, { timeout: { block: 60000 } });\n\n let gitRoot = pkg.gitRoot;\n if (!gitRoot) {\n gitRoot = await git.revparse(['--show-toplevel']).catch(() => pkg.path);\n }\n\n // Idempotent check: if package.json was bumped in a previous run but git wasn't committed,\n // currentVersion > HEAD version. If that version is already on npm, reuse it (don't double-bump).\n const pkgRelPath = relative(gitRoot, join(pkg.path, 'package.json'));\n const headPkgRaw = await git.raw(['show', `HEAD:${pkgRelPath}`]).catch(() => null);\n const headVersion: string | null = headPkgRaw ? (() => { try { return (JSON.parse(headPkgRaw) as { version?: string }).version ?? null; } catch { return null; } })() : null;\n\n if (headVersion && headVersion !== pkg.currentVersion) {\n // package.json was bumped beyond HEAD — check if that version is already on npm\n const alreadyPublished = await isVersionPublished(pkg.name, pkg.currentVersion, registry);\n if (alreadyPublished) {\n planPackages.push({\n ...pkg,\n gitRoot,\n nextVersion: pkg.currentVersion,\n bump: detectBumpType(headVersion, pkg.currentVersion),\n isPublished: true,\n });\n continue;\n }\n }\n\n const nextVersion = await computeNextVersion(\n pkg.path,\n pkg.currentVersion,\n bump,\n git,\n gitCwd,\n pkg.name,\n );\n\n planPackages.push({\n ...pkg,\n gitRoot,\n nextVersion,\n bump: bump === 'auto' ? detectBumpType(pkg.currentVersion, nextVersion) : bump,\n });\n }\n\n // Apply versioning strategy (lockstep/independent/adaptive)\n // Scope-level override takes highest priority, then top-level, then legacy changelog.bumpStrategy\n const scopeVersioningStrategy = scope ? config.scopes?.[scope]?.versioningStrategy : undefined;\n const bumpStrategy = scopeVersioningStrategy || config.versioningStrategy || config.changelog?.bumpStrategy || 'independent';\n const versionStrategy = mapBumpStrategyToVersionStrategy(bumpStrategy);\n\n planPackages = applyVersionStrategy(planPackages, {\n strategy: versionStrategy,\n umbrellaPath: scope,\n });\n\n // Canary: suffix the already-computed base version with -canary.<shortsha>.\n // Runs last so canary and stable share the exact same bump-computation path.\n if (channel === 'canary') {\n const git = simpleGit(cwd, { timeout: { block: 60000 } });\n const shortSha = (await git.revparse(['--short', 'HEAD'])).trim();\n planPackages = applyCanarySuffix(planPackages, shortSha);\n }\n\n return {\n packages: planPackages,\n strategy: config.strategy || 'semver',\n registry: config.registry || 'https://registry.npmjs.org',\n rollbackEnabled: config.rollback?.enabled ?? true,\n channel,\n };\n}\n\n/**\n * Map changelog.bumpStrategy to VersionStrategy\n */\nfunction mapBumpStrategyToVersionStrategy(\n bumpStrategy: 'independent' | 'ripple' | 'lockstep' | 'adaptive'\n): VersionStrategy {\n if (bumpStrategy === 'lockstep') {return 'lockstep';}\n if (bumpStrategy === 'ripple' || bumpStrategy === 'adaptive') {return 'adaptive';}\n return 'independent';\n}\n\n/**\n * Discover all release candidates according to config.packages (paths/include/exclude).\n * Does NOT apply scope filtering — that's done separately in filterByScope().\n */\nasync function discoverPackages(cwd: string, config?: ReleaseConfig): Promise<PackageVersion[]> {\n // Workspace root with .gitmodules → sub-repos are the release units\n const isWorkspaceRoot = existsSync(join(cwd, '.gitmodules'));\n if (isWorkspaceRoot) {\n return discoverSubRepoPackages(cwd, config);\n }\n\n const packages: PackageVersion[] = [];\n\n // Scan dirs from config.packages.paths, or full tree\n const configPaths = config?.packages?.paths;\n const pattern = configPaths?.length\n ? configPaths.map(p => `${p}/package.json`)\n : '**/package.json';\n\n const packageJsonPaths = await globby(pattern, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.*/**',\n ],\n });\n\n for (let i = 0; i < packageJsonPaths.length; i++) {\n if (i % 10 === 0) {\n await new Promise((resolve) => { setImmediate(resolve); });\n }\n\n const packageJsonPath = packageJsonPaths[i]!;\n const packagePath = join(packageJsonPath, '..');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n const isRootPackageJson = packageJsonPath === join(cwd, 'package.json');\n\n if (packageJson.private) {continue;}\n if (isRootPackageJson && existsSync(join(packagePath, 'pnpm-workspace.yaml'))) {continue;}\n if (isRootPackageJson && !packageJson.name) {continue;}\n\n // Apply global include/exclude from config.packages\n const globalFilter = config?.packages;\n if (globalFilter?.include?.length || globalFilter?.exclude?.length) {\n const rel = relative(cwd, packagePath);\n if (globalFilter.include?.length && !matchesPackagePattern(packageJson.name, rel, globalFilter.include)) {continue;}\n if (globalFilter.exclude?.length && matchesPackagePattern(packageJson.name, rel, globalFilter.exclude)) {continue;}\n }\n\n packages.push({\n name: packageJson.name,\n path: packagePath,\n gitRoot: '',\n currentVersion: packageJson.version,\n nextVersion: packageJson.version,\n bump: 'auto',\n isPublished: false,\n });\n }\n\n // Deduplicate by package name — keep the entry with the shortest path\n // (avoids duplicates when nested package.json files share the same name)\n const seen = new Map<string, PackageVersion>();\n for (const pkg of packages) {\n const existing = seen.get(pkg.name);\n if (!existing || pkg.path.length < existing.path.length) {\n seen.set(pkg.name, pkg);\n }\n }\n\n return Array.from(seen.values());\n}\n\n/**\n * Filter discovered packages by scope with clear error messages.\n * Scope can be: exact name (@kb-labs/core), wildcard (@kb-labs/*), or path glob (packages/*).\n * Also applies per-scope include/exclude from config.scopes[scope].\n */\nfunction filterByScope(\n packages: PackageVersion[],\n scope: string,\n config?: ReleaseConfig,\n): PackageVersion[] {\n // Per-scope package overrides\n const scopeFilter = config?.scopes?.[scope]?.packages;\n const globalFilter = config?.packages;\n const mergedInclude = [...(globalFilter?.include ?? []), ...(scopeFilter?.include ?? [])];\n const mergedExclude = [...(globalFilter?.exclude ?? []), ...(scopeFilter?.exclude ?? [])];\n\n // Build scope matcher\n const isExactName = !scope.includes('*') && (scope.startsWith('@') || !scope.includes('/'));\n const scopeRegex = new RegExp(\n '^' + scope.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '[^/]*') + '$'\n );\n\n const result: PackageVersion[] = [];\n\n for (const pkg of packages) {\n // Match by name or relative path depending on scope format\n const isPathPattern = scope.includes('/') && !scope.startsWith('@');\n const matchTarget = isPathPattern ? pkg.path : pkg.name;\n const matches = isExactName ? pkg.name === scope : scopeRegex.test(matchTarget);\n if (!matches) {continue;}\n\n // Apply per-scope include/exclude on top\n if (mergedInclude.length && !matchesPackagePattern(pkg.name, pkg.path, mergedInclude)) {continue;}\n if (mergedExclude.length && matchesPackagePattern(pkg.name, pkg.path, mergedExclude)) {continue;}\n\n result.push(pkg);\n }\n\n if (result.length === 0) {\n // Check if the scope would have matched something if not for exclude\n const wouldMatchExcluded = packages.some(p => {\n const matchTarget = isPathPattern(scope) ? p.path : p.name;\n const scopeMatches = isExactName ? p.name === scope : scopeRegex.test(matchTarget);\n if (!scopeMatches) {return false;}\n return mergedExclude.length > 0 && matchesPackagePattern(p.name, p.path, mergedExclude);\n });\n\n if (wouldMatchExcluded) {\n throw new Error(`Scope \"${scope}\" matches packages that are excluded by configuration`);\n }\n\n const globalInclude = globalFilter?.include;\n if (globalInclude?.length) {\n throw new Error(`Scope \"${scope}\" did not match any packages. Note: packages.include restricts discovery to: ${globalInclude.join(', ')}`);\n }\n\n throw new Error(`Scope \"${scope}\" did not match any discovered packages`);\n }\n\n return result;\n}\n\nfunction isPathPattern(scope: string): boolean {\n return scope.includes('/') && !scope.startsWith('@');\n}\n\n/**\n * Discover sub-repos as release units via .gitmodules.\n * Each sub-repo root package.json is a release unit (even if private).\n */\nasync function discoverSubRepoPackages(workspaceRoot: string, config?: ReleaseConfig): Promise<PackageVersion[]> {\n const subRepoPaths = discoverSubRepoPaths(workspaceRoot);\n const packages: PackageVersion[] = [];\n const globalFilter = config?.packages;\n\n for (const subRepoPath of subRepoPaths) {\n try {\n const pkgJson = JSON.parse(\n await readFile(join(subRepoPath, 'package.json'), 'utf-8')\n );\n if (!pkgJson.name) {continue;}\n\n const rel = relative(workspaceRoot, subRepoPath);\n\n // Apply global include/exclude\n if (globalFilter?.include?.length && !matchesPackagePattern(pkgJson.name, rel, globalFilter.include)) {continue;}\n if (globalFilter?.exclude?.length && matchesPackagePattern(pkgJson.name, rel, globalFilter.exclude)) {continue;}\n\n packages.push({\n name: pkgJson.name,\n path: subRepoPath,\n gitRoot: subRepoPath,\n currentVersion: pkgJson.version || '0.0.0',\n nextVersion: pkgJson.version || '0.0.0',\n bump: 'auto',\n isPublished: false,\n });\n } catch {\n // Sub-repo without valid package.json — skip\n }\n }\n\n return packages;\n}\n\n/**\n * Check if file should be ignored (node_modules, dist, etc.)\n */\nfunction shouldIgnoreFile(file: string): boolean {\n const ignoredPaths = [\n 'node_modules/',\n '.git/',\n 'dist/',\n 'build/',\n '.next/',\n '.nuxt/',\n 'coverage/',\n '.cache/',\n 'tmp/',\n ];\n\n return ignoredPaths.some(path => file.includes(path));\n}\n\nasync function detectModifiedPackages(\n git: ReturnType<typeof simpleGit>,\n packages: PackageVersion[],\n cwd: string,\n): Promise<PackageVersion[]> {\n const modified: PackageVersion[] = [];\n\n for (let i = 0; i < packages.length; i++) {\n if (i % 10 === 0) {\n await new Promise((res) => { setImmediate(res); });\n }\n\n const pkg = packages[i]!;\n const pkgRel = relative(resolve(cwd), resolve(pkg.path));\n const changed = await hasChangesSinceTag(git, pkg.name, pkgRel);\n\n if (changed) {\n modified.push(pkg);\n }\n }\n\n return modified;\n}\n\nasync function computeNextVersion(\n packagePath: string,\n currentVersion: string,\n bump: VersionBump,\n git: ReturnType<typeof simpleGit>,\n gitCwd: string,\n pkgName: string,\n): Promise<string> {\n if (bump === 'auto') {\n const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd, pkgName);\n return semver.inc(currentVersion, detectedBump) || currentVersion;\n }\n return semver.inc(currentVersion, bump) || currentVersion;\n}\n\nasync function detectVersionFromCommits(\n git: ReturnType<typeof simpleGit>,\n packagePath: string,\n gitCwd: string,\n pkgName: string,\n): Promise<'major' | 'minor' | 'patch'> {\n try {\n const relPath = relative(resolve(gitCwd), resolve(packagePath));\n const messages = await getCommitsSinceTag(git, pkgName, relPath);\n\n let hasMinor = false;\n let hasBreaking = false;\n\n for (const message of messages) {\n const msg = message.toLowerCase();\n if (msg.includes('!:') || msg.includes('breaking change')) {\n hasBreaking = true;\n } else if (msg.startsWith('feat') || msg.startsWith('feature')) {\n hasMinor = true;\n }\n }\n\n if (hasBreaking) {return 'major';}\n if (hasMinor) {return 'minor';}\n return 'patch';\n } catch {\n return 'patch';\n }\n}\n\nfunction detectBumpType(currentVersion: string, nextVersion: string): VersionBump {\n if (semver.major(currentVersion) < semver.major(nextVersion)) {\n return 'major';\n }\n if (semver.minor(currentVersion) < semver.minor(nextVersion)) {\n return 'minor';\n }\n return 'patch';\n}\n\n/**\n * Match a package against a list of patterns.\n * - Patterns starting with '@' or without '/' → matched against package name.\n * - Patterns containing '/' (non-scoped) → matched against relative path.\n * - Supports '*' wildcard (single path segment, not separator).\n */\nexport function matchesPackagePattern(pkgName: string, relativePath: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n const isPathPattern = pattern.includes('/') && !pattern.startsWith('@');\n const target = isPathPattern ? relativePath : pkgName;\n const regex = new RegExp(\n '^' + pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '[^/]*') + '$'\n );\n if (regex.test(target)) {return true;}\n }\n return false;\n}\n\n","/**\n * Release checkpoint — persists publish state across pipeline runs.\n *\n * Written after successful npm publish, updated per git root after each\n * commit/tag/push. Allows recovery from partial failures without\n * re-publishing already-published packages or re-bumping versions.\n *\n * File: <repoRoot>/.kb/release/checkpoint.json\n * Deleted automatically after full pipeline success.\n */\n\nimport { readFileSync, writeFileSync, unlinkSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface GitRootState {\n committed: boolean;\n tagged: string[];\n pushed: boolean;\n}\n\nexport interface ReleaseCheckpoint {\n /** Identifies this checkpoint — must match current plan to be usable. */\n flow: string;\n /** Lockstep version (all packages same) or 'independent'. */\n version: string;\n publishedPackages: Array<{\n name: string;\n version: string;\n path: string;\n gitRoot: string;\n }>;\n /** Per git-root git operation state. Key = absolute path. */\n gitRoots: Record<string, GitRootState>;\n createdAt: string;\n completedAt?: string;\n}\n\nfunction checkpointPath(repoRoot: string): string {\n return join(repoRoot, '.kb', 'release', 'checkpoint.json');\n}\n\nexport function loadCheckpoint(repoRoot: string): ReleaseCheckpoint | null {\n const path = checkpointPath(repoRoot);\n if (!existsSync(path)) {return null;}\n try {\n return JSON.parse(readFileSync(path, 'utf-8')) as ReleaseCheckpoint;\n } catch {\n return null;\n }\n}\n\nexport function writeCheckpoint(repoRoot: string, checkpoint: Omit<ReleaseCheckpoint, 'createdAt'>): void {\n mkdirSync(join(repoRoot, '.kb', 'release'), { recursive: true });\n const data: ReleaseCheckpoint = { ...checkpoint, createdAt: new Date().toISOString() };\n writeFileSync(checkpointPath(repoRoot), JSON.stringify(data, null, 2));\n}\n\nexport function updateCheckpointGitRoot(repoRoot: string, gitRoot: string, state: GitRootState): void {\n const checkpoint = loadCheckpoint(repoRoot);\n if (!checkpoint) {return;}\n checkpoint.gitRoots[gitRoot] = state;\n writeFileSync(checkpointPath(repoRoot), JSON.stringify(checkpoint, null, 2));\n}\n\nexport function markCheckpointComplete(repoRoot: string): void {\n const checkpoint = loadCheckpoint(repoRoot);\n if (!checkpoint) {return;}\n checkpoint.completedAt = new Date().toISOString();\n writeFileSync(checkpointPath(repoRoot), JSON.stringify(checkpoint, null, 2));\n}\n\nexport function deleteCheckpoint(repoRoot: string): void {\n try { unlinkSync(checkpointPath(repoRoot)); } catch { /* already gone */ }\n}\n\n/**\n * Check if an existing checkpoint is usable for the current release.\n * A checkpoint is usable if it matches flow + version and publish is done but git is not.\n */\nexport function isCheckpointResumable(\n checkpoint: ReleaseCheckpoint,\n flow: string,\n version: string,\n): boolean {\n if (checkpoint.completedAt) {return false;}\n if (checkpoint.flow !== flow) {return false;}\n if (checkpoint.version !== version && version !== 'independent') {return false;}\n // Usable if publish happened but at least one git root is not fully pushed\n return checkpoint.publishedPackages.length > 0 &&\n Object.values(checkpoint.gitRoots).some(s => !s.pushed);\n}\n","/**\n * Git tag grammar for release flows — one place that both generates a\n * flow's release tag and parses a tag back into a flow. Keeping generation\n * and resolution on the same template prevents them from drifting apart\n * (previously tag-building was inlined ad hoc in `commitAndTagRelease` and\n * nothing parsed a tag back into a flow at all — CI guessed via bash).\n *\n * Only stable-channel releases ever produce a git tag (canary is ephemeral,\n * npm-only — see pipeline.ts), so a resolved tag always implies `channel:\n * 'stable'`; it is never inferred from the tag itself.\n */\n\nimport type { ReleaseChannel, ReleaseConfig } from './types';\n\nexport const DEFAULT_TAG_PATTERN = '{flow}-v{version}';\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Matches a bare semver, optionally with a prerelease/build suffix. */\nconst SEMVER_SRC = '\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:-[0-9A-Za-z.-]+)?(?:\\\\+[0-9A-Za-z.-]+)?';\n\n/**\n * Build the release tag for a flow. `tagPattern` defaults to\n * `{flow}-v{version}` (e.g. `platform-v2.105.0`) when omitted.\n */\nexport function buildReleaseTag(flowName: string, version: string, tagPattern?: string): string {\n const pattern = tagPattern ?? DEFAULT_TAG_PATTERN;\n return pattern.replace('{flow}', flowName).replace('{version}', version);\n}\n\n/**\n * Anchored regex matching exactly the tags `buildReleaseTag(flowName, ...,\n * tagPattern)` can produce — literal segments of the pattern are escaped,\n * `{flow}` is substituted with the (escaped) flow name, `{version}` with a\n * semver-capturing group.\n */\nfunction buildTagRegex(flowName: string, tagPattern: string): RegExp {\n const escapedPattern = escapeRegex(tagPattern);\n const src = escapedPattern\n .replace(escapeRegex('{flow}'), escapeRegex(flowName))\n .replace(escapeRegex('{version}'), `(${SEMVER_SRC})`);\n return new RegExp(`^${src}$`);\n}\n\n/**\n * Resolve a git tag back into the flow (and channel) that produced it, by\n * matching it against every configured flow's tag pattern. Returns `null`\n * if no configured flow's pattern matches — callers (e.g. `deliver`) must\n * treat that as a hard failure, never a guess.\n */\nexport function resolveFlowFromTag(\n config: ReleaseConfig,\n tag: string,\n): { flowName: string; channel: ReleaseChannel } | null {\n const flows = config.flows ?? {};\n for (const [flowName, flowConfig] of Object.entries(flows)) {\n const regex = buildTagRegex(flowName, flowConfig.tagPattern ?? DEFAULT_TAG_PATTERN);\n if (regex.test(tag)) {\n return { flowName, channel: 'stable' };\n }\n }\n return null;\n}\n","/**\n * Publisher - handles package publishing and changelog updates\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { PackageVersion, ReleasePlan } from './types';\nimport { updateCheckpointGitRoot, markCheckpointComplete } from './checkpoint';\nimport { buildReleaseTag } from './tag';\n\n/**\n * Update package.json version to nextVersion\n * Should be called BEFORE generating changelog so versions match\n */\nexport async function updatePackageVersion(pkg: PackageVersion): Promise<void> {\n const packageJsonPath = join(pkg.path, 'package.json');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n\n packageJson.version = pkg.nextVersion;\n\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Update versions for all packages in the plan\n */\nexport async function updatePackageVersions(plan: ReleasePlan): Promise<Array<{\n package: string;\n from: string;\n to: string;\n updated: boolean;\n}>> {\n const results: Array<{\n package: string;\n from: string;\n to: string;\n updated: boolean;\n }> = [];\n\n for (const pkg of plan.packages) {\n try {\n await updatePackageVersion(pkg);\n results.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: true,\n });\n } catch (error) {\n console.warn(`Failed to update version for ${pkg.name}: ${error instanceof Error ? error.message : String(error)}`);\n results.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: false,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Copy changelog to each package directory\n * This writes CHANGELOG.md per package with proper header\n */\nexport async function copyChangelogToPackages(options: {\n cwd: string;\n plan: ReleasePlan;\n changelog: string;\n}): Promise<void> {\n const { plan, changelog } = options;\n\n // Lockstep releases render ONE consolidated changelog for the whole release\n // (header `## [version] - date`, no per-package sections) — there is no\n // per-package excerpt to extract, so every package gets the same full text,\n // same as the single-package case.\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const isLockstep = plan.packages.length > 1 && uniqueVersions.size === 1;\n\n for (const pkg of plan.packages) {\n try {\n // For single-package or lockstep releases, use the entire changelog.\n // For independent multi-package releases, extract the package-specific\n // section (headers of the form `## @scope/pkg X.Y.Z`).\n let packageChangelog: string;\n\n if (plan.packages.length === 1 || isLockstep) {\n packageChangelog = changelog;\n } else {\n packageChangelog = createPackageChangelog(pkg, changelog);\n }\n\n if (!packageChangelog || packageChangelog.trim().length === 0) {\n console.warn(`No changelog content for ${pkg.name}, skipping`);\n continue;\n }\n\n // Write to package directory\n const changelogPath = join(pkg.path, 'CHANGELOG.md');\n\n // Read existing changelog if exists\n let existingChangelog = '';\n try {\n existingChangelog = await readFile(changelogPath, 'utf-8');\n } catch {\n // No existing changelog, start fresh\n }\n\n // Check if this version already exists in changelog to avoid duplicates.\n // Lockstep headers are `## [X.Y.Z] - date`; independent/single-package\n // headers are `## @scope/pkg X.Y.Z`.\n const versionPattern = isLockstep\n ? new RegExp(`^##\\\\s+\\\\[${pkg.nextVersion.replace(/\\./g, '\\\\.')}\\\\]`, 'm')\n : new RegExp(\n `^##\\\\s+${pkg.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+${pkg.nextVersion.replace(/\\./g, '\\\\.')}`,\n 'm'\n );\n\n const updatedChangelog = mergeChangelogBlock(existingChangelog, packageChangelog, versionPattern);\n\n await writeFile(changelogPath, updatedChangelog.trim() + '\\n', 'utf-8');\n } catch (error) {\n console.warn(`Failed to write changelog for ${pkg.name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n\n// Matches either header shape as a section boundary: `## @scope/pkg X.Y.Z`\n// (independent) or `## [X.Y.Z] - date` (lockstep).\nconst NEXT_SECTION_PATTERN = /^##\\s+((@[\\w-]+\\/)?[\\w-]+\\s+\\d|\\[\\d)/;\n\n/**\n * Merge a new version-block changelog entry into an existing changelog's\n * content: replace an existing block with the same version (idempotent\n * retry/promote) or prepend it as the newest entry — never blindly overwrite\n * the rest of the file's history.\n */\nfunction mergeChangelogBlock(existingChangelog: string, newBlock: string, versionPattern: RegExp): string {\n if (existingChangelog && versionPattern.test(existingChangelog)) {\n // Version already exists - replace the section instead of prepending.\n // Find where the current version section starts and the next begins.\n const lines = existingChangelog.split('\\n');\n let startIdx = -1;\n let endIdx = lines.length;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line && versionPattern.test(line)) {\n startIdx = i;\n } else if (startIdx !== -1 && line && NEXT_SECTION_PATTERN.test(line)) {\n endIdx = i;\n break;\n }\n }\n\n if (startIdx !== -1) {\n const before = lines.slice(0, startIdx).join('\\n');\n const after = lines.slice(endIdx).join('\\n');\n return (before ? before + '\\n' : '') + newBlock + (after ? '\\n' + after : '');\n }\n return newBlock;\n }\n\n // Prepend new entry\n return newBlock + (existingChangelog ? '\\n' + existingChangelog : '');\n}\n\n/** Default location of the consolidated repo-root changelog, relative to repoRoot. */\nexport const DEFAULT_ROOT_CHANGELOG_PATH = '.kb/release/CHANGELOG.md';\n\n/**\n * Resolve the repo-relative path of the consolidated root changelog.\n * Config-driven via `release.changelog.outputPath` so teams can point it at\n * the conventional `CHANGELOG.md` repo root instead of the default.\n */\nexport function resolveRootChangelogRelPath(outputPath?: string): string {\n return outputPath && outputPath.trim().length > 0 ? outputPath : DEFAULT_ROOT_CHANGELOG_PATH;\n}\n\n/**\n * Merge the generated changelog for this release into the repo-root\n * changelog file (default `.kb/release/CHANGELOG.md`, configurable via\n * `release.changelog.outputPath`), prepending/deduplicating the same way\n * `copyChangelogToPackages` does for per-package changelogs — this file is\n * cumulative history, not a per-run snapshot, so it must never be overwritten.\n */\nexport async function mergeRootChangelog(options: {\n repoRoot: string;\n plan: ReleasePlan;\n changelog: string;\n /** Repo-relative output path. Defaults to DEFAULT_ROOT_CHANGELOG_PATH. */\n outputPath?: string;\n}): Promise<void> {\n const { repoRoot, plan, changelog, outputPath } = options;\n if (!changelog || changelog.trim().length === 0 || plan.packages.length === 0) {\n return;\n }\n\n const primary = plan.packages[0]!;\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const isLockstep = plan.packages.length > 1 && uniqueVersions.size === 1;\n\n const versionPattern = isLockstep\n ? new RegExp(`^##\\\\s+\\\\[${primary.nextVersion.replace(/\\./g, '\\\\.')}\\\\]`, 'm')\n : new RegExp(\n `^##\\\\s+${primary.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+${primary.nextVersion.replace(/\\./g, '\\\\.')}`,\n 'm'\n );\n\n const changelogPath = join(repoRoot, resolveRootChangelogRelPath(outputPath));\n\n let existingChangelog = '';\n try {\n existingChangelog = await readFile(changelogPath, 'utf-8');\n } catch {\n // No existing root changelog, start fresh\n }\n\n const updatedChangelog = mergeChangelogBlock(existingChangelog, changelog.trim(), versionPattern);\n\n await mkdir(dirname(changelogPath), { recursive: true });\n await writeFile(changelogPath, updatedChangelog.trim() + '\\n', 'utf-8');\n}\n\n/**\n * Create package-specific changelog entry with proper header\n */\nfunction createPackageChangelog(pkg: PackageVersion, changelog: string): string {\n // Extract ONLY the section for this package from the full changelog\n // Format: ## @scope/package-name X.Y.Z\n const packageHeaderPattern = new RegExp(\n `^##\\\\s+${pkg.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+\\\\d+\\\\.\\\\d+\\\\.\\\\d+`,\n 'gm'\n );\n\n const allHeaders = Array.from(changelog.matchAll(/^##\\s+(@[\\w-]+\\/)?[\\w-]+\\s+\\d+\\.\\d+\\.\\d+/gm));\n\n // Find start index for this package\n let startIdx = -1;\n let endIdx = changelog.length;\n\n for (let i = 0; i < allHeaders.length; i++) {\n const match = allHeaders[i];\n if (!match || !match.index) {continue;}\n\n if (packageHeaderPattern.test(match[0])) {\n startIdx = match.index;\n // Find next package header\n if (i + 1 < allHeaders.length) {\n endIdx = allHeaders[i + 1]!.index!;\n }\n break;\n }\n }\n\n if (startIdx === -1) {\n // Package section not found in changelog, return empty\n return '';\n }\n\n // Extract the section for this package\n return changelog.substring(startIdx, endIdx).trim();\n}\n\n/**\n * Commit and tag release changes\n *\n * Each package is committed inside its own git repo (supports submodules).\n * After all packages are committed, tags are created in cwd (the monorepo root).\n */\nexport async function commitAndTagRelease(options: {\n cwd: string;\n plan: ReleasePlan;\n dryRun?: boolean;\n /** Pass --no-verify to git push and pushTags. Default: false — hooks run normally. */\n noVerify?: boolean;\n /** repoRoot for checkpoint updates. If omitted, checkpoint updates are skipped. */\n repoRoot?: string;\n /** Per-root state from checkpoint — skip roots already fully pushed. */\n checkpointGitRoots?: Record<string, { committed: boolean; tagged: string[]; pushed: boolean }>;\n /** Repo-relative path to the consolidated root changelog. Defaults to DEFAULT_ROOT_CHANGELOG_PATH. */\n changelogOutputPath?: string;\n /**\n * The flow this release came from (e.g. \"platform\", \"sdk\"). Drives the\n * tag grammar (`{flow}-v{version}`, see ./tag.ts). If omitted (ran\n * without `--flow`), falls back to `\"release\"` and — for a genuinely\n * divergent multi-version independent release — to the old one-tag-\n * per-package behavior, since a single flow-level tag can't represent\n * packages at different versions.\n */\n flowName?: string;\n /** Per-flow tag template override, from `FlowConfig.tagPattern`. */\n tagPattern?: string;\n}): Promise<{ committed: boolean; tagged: string[]; pushed: boolean }> {\n const { cwd, plan, dryRun, noVerify = false, repoRoot, checkpointGitRoots, changelogOutputPath, flowName = 'release', tagPattern } = options;\n const simpleGit = (await import('simple-git')).default;\n\n const result = {\n committed: false,\n tagged: [] as string[],\n pushed: false,\n };\n\n if (dryRun) {\n return result;\n }\n\n try {\n const commitMessage = createCommitMessage(plan);\n\n // Group packages by their git root — populated by planner via revparse.\n // Fallback to pkg.path for safety (e.g. packages planned outside normal flow).\n const pkgToRoot = new Map<string, string>();\n for (const pkg of plan.packages) {\n pkgToRoot.set(pkg.path, pkg.gitRoot || pkg.path);\n }\n\n const rootToPkgs = new Map<string, typeof plan.packages>();\n for (const pkg of plan.packages) {\n const root = pkgToRoot.get(pkg.path)!;\n const list = rootToPkgs.get(root) ?? [];\n list.push(pkg);\n rootToPkgs.set(root, list);\n }\n\n // Whether the whole plan shares exactly one version — true for lockstep\n // flows, and true for a single-package independent flow (e.g. sdk).\n // Drives one flow-level tag vs. the per-package fallback below.\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const singleVersionAcrossPlan = uniqueVersions.size === 1;\n const pushFlags: string[] = noVerify ? ['--no-verify'] : [];\n\n // Process each git root: commit → tag → push.\n // Skip roots already fully pushed (from checkpoint on retry).\n for (const [root, pkgs] of rootToPkgs) {\n const prior = checkpointGitRoots?.[root];\n if (prior?.pushed) {\n // Already completed in a previous run — collect results and continue.\n result.committed = result.committed || prior.committed;\n result.tagged.push(...prior.tagged.filter(t => !result.tagged.includes(t)));\n result.pushed = true;\n continue;\n }\n\n const rootGit = simpleGit(root);\n let rootCommitted = prior?.committed ?? false;\n let rootTagged = prior?.tagged ?? [];\n\n // 1. Commit (skip if already done)\n if (!rootCommitted) {\n const filesToStage: string[] = [];\n for (const pkg of pkgs) {\n const rel = (p: string) => p.startsWith(root + '/') ? p.slice(root.length + 1) : p;\n filesToStage.push(rel(join(pkg.path, 'package.json')));\n const changelogPath = join(pkg.path, 'CHANGELOG.md');\n if (existsSync(changelogPath)) { filesToStage.push(rel(changelogPath)); }\n }\n\n // The consolidated repo-root changelog (mergeRootChangelog writes it\n // directly to disk) lives outside any package path, so the loop\n // above never picks it up — stage it explicitly for whichever git\n // root actually IS repoRoot. Without this it's tracked in git but\n // never committed by a real release, silently reverting to whatever\n // was last committed by hand.\n if (repoRoot && root === repoRoot) {\n const rootChangelogRelPath = resolveRootChangelogRelPath(changelogOutputPath);\n const rootChangelogPath = join(repoRoot, rootChangelogRelPath);\n if (existsSync(rootChangelogPath)) {\n filesToStage.push(rootChangelogRelPath);\n }\n }\n\n await rootGit.add(filesToStage);\n try {\n await rootGit.commit(commitMessage);\n rootCommitted = true;\n result.committed = true;\n } catch (commitError) {\n const msg = commitError instanceof Error ? commitError.message : String(commitError);\n if (!msg.includes('nothing to commit') && !msg.includes('nothing added to commit')) {\n throw commitError;\n }\n }\n } else {\n result.committed = true;\n }\n\n // 2. Tag (skip if already done)\n if (rootTagged.length === 0) {\n if (singleVersionAcrossPlan) {\n // One tag per flow release: `{flow}-v{version}` (see ./tag.ts).\n const tagName = buildReleaseTag(flowName, plan.packages[0]!.nextVersion, tagPattern);\n await rootGit.addTag(tagName);\n rootTagged = [tagName];\n } else {\n // Packages in this release genuinely diverge in version (a\n // multi-package independent flow) — a single flow-level tag\n // can't represent that; fall back to one tag per package. Not a\n // shape any configured flow uses today (see ADR/plan boundary\n // note), kept for safety rather than crashing.\n for (const pkg of pkgs) {\n const tagName = `${pkg.name}@${pkg.nextVersion}`;\n await rootGit.addTag(tagName);\n rootTagged.push(tagName);\n }\n }\n result.tagged.push(...rootTagged);\n } else {\n result.tagged.push(...rootTagged.filter(t => !result.tagged.includes(t)));\n }\n\n // 3. Push — push the branch, then push ONLY the tag(s) just created in\n // this run. `git push --tags` (the old behavior here) pushes EVERY\n // local tag, including all pre-existing ones — on a repo with a long\n // release history that means dozens of already-remote tags get\n // re-sent and rejected as duplicates, making git report the whole\n // command as failed even though the branch commit and the actual new\n // tag(s) went through fine. Pushing exact refs avoids touching any\n // tag we didn't just create.\n if (rootCommitted) { await rootGit.push(pushFlags); }\n if (rootTagged.length > 0) {\n await rootGit.push(['origin', ...pushFlags, ...rootTagged]);\n }\n\n // Persist checkpoint after each successful root\n if (repoRoot) {\n updateCheckpointGitRoot(repoRoot, root, {\n committed: rootCommitted,\n tagged: rootTagged,\n pushed: true,\n });\n }\n }\n result.pushed = true;\n\n if (repoRoot) { markCheckpointComplete(repoRoot); }\n\n } catch (error) {\n console.error(`Git operations failed: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n\n return result;\n}\n\n/**\n * Create conventional commit message for release\n */\nfunction createCommitMessage(plan: ReleasePlan): string {\n const lines: string[] = [];\n\n if (plan.packages.length === 1 && plan.packages[0]) {\n const pkg = plan.packages[0];\n lines.push(`chore(release): publish ${pkg.name}@${pkg.nextVersion}`);\n } else {\n lines.push(`chore(release): publish ${plan.packages.length} packages`);\n }\n\n lines.push('');\n\n for (const pkg of plan.packages) {\n lines.push(`- ${pkg.name}@${pkg.nextVersion}`);\n }\n\n return lines.join('\\n');\n}\n\n","/**\n * Rollback - manages release snapshots and recovery\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { ReleasePlan, PackageVersion } from './types';\n\nexport interface RollbackSnapshot {\n ts: string;\n packages: PackageVersion[];\n}\n\n// MAX_HISTORY = 5; // Future use for snapshot retention\n\n/**\n * Save current state for potential rollback\n */\nexport async function saveSnapshot(options: {\n cwd: string;\n plan: ReleasePlan;\n}): Promise<void> {\n const { cwd, plan } = options;\n \n const snapshot: RollbackSnapshot = {\n ts: new Date().toISOString(),\n packages: plan.packages.map(pkg => ({\n ...pkg,\n nextVersion: pkg.currentVersion, // Store current before update\n })),\n };\n\n const snapshotDir = join(cwd, '.kb', 'release');\n await mkdir(snapshotDir, { recursive: true });\n \n const snapshotPath = join(snapshotDir, 'backup.json');\n await writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf-8');\n \n // Cleanup old snapshots\n await cleanupOldSnapshots(snapshotDir);\n}\n\n/**\n * Restore from snapshot\n */\nexport async function restoreSnapshot(cwd: string): Promise<void> {\n const snapshotPath = join(cwd, '.kb', 'release', 'backup.json');\n \n if (!existsSync(snapshotPath)) {\n throw new Error('No backup snapshot found');\n }\n\n const snapshotContent = await readFile(snapshotPath, 'utf-8');\n const snapshot: RollbackSnapshot = JSON.parse(snapshotContent);\n\n // Restore package.json versions\n for (const pkg of snapshot.packages) {\n const packageJsonPath = join(pkg.path, 'package.json');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n \n packageJson.version = pkg.currentVersion;\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n }\n}\n\nasync function cleanupOldSnapshots(_snapshotDir: string): Promise<void> {\n // For now, just keep the latest backup.json\n // In the future, could maintain timestamped backups\n // and trim to MAX_HISTORY\n}\n\n","/**\n * JSON reporter for release reports\n */\n\nimport type { ReleaseReport } from '../types';\n\nexport function renderJson(report: ReleaseReport): string {\n return JSON.stringify(report, null, 2);\n}\n\n","/**\n * Markdown reporter for release reports\n */\n\nimport type { ReleaseReport } from '../types';\n\nexport function renderMarkdown(report: ReleaseReport): string {\n const lines: string[] = [];\n \n lines.push('# 🧩 KB Labs Release Summary');\n lines.push('');\n lines.push(`**Timestamp**: ${report.ts}`);\n lines.push(`**Stage**: ${report.stage}`);\n lines.push('');\n\n if (report.result.ok) {\n lines.push('## ✅ Release: SUCCESS');\n } else {\n lines.push('## ❌ Release: FAILED');\n }\n \n lines.push('');\n\n // Checks section\n if (report.result.checks) {\n lines.push('## Quality Checks');\n lines.push('');\n\n for (const [id, result] of Object.entries(report.result.checks)) {\n if (!result) {continue;}\n const icon = result.ok ? '✅' : '❌';\n lines.push(`- ${icon} **${id}**: ${result.ok ? 'PASSED' : 'FAILED'}`);\n if (result.hint && !result.ok) {\n lines.push(` - ${result.hint}`);\n }\n }\n lines.push('');\n }\n\n // Per-package checks\n if (report.result.checksPerPackage) {\n lines.push('## Package Quality Checks');\n lines.push('');\n\n for (const [pkgName, pkgChecks] of Object.entries(report.result.checksPerPackage)) {\n lines.push(`### ${pkgName}`);\n lines.push('');\n for (const [id, result] of Object.entries(pkgChecks)) {\n if (!result) {continue;}\n const icon = result.ok ? '✅' : '❌';\n lines.push(`- ${icon} **${id}**: ${result.ok ? 'PASSED' : 'FAILED'}`);\n if (result.hint && !result.ok) {\n lines.push(` - ${result.hint}`);\n }\n }\n lines.push('');\n }\n }\n\n // Published packages\n if (report.result.published && report.result.published.length > 0) {\n lines.push('## 🚀 Published Packages');\n lines.push('');\n for (const pkg of report.result.published) {\n lines.push(`- ${pkg}`);\n }\n lines.push('');\n }\n\n // Errors\n if (report.result.errors && report.result.errors.length > 0) {\n lines.push('## ❌ Errors');\n lines.push('');\n for (const error of report.result.errors) {\n lines.push(`- ${error}`);\n }\n lines.push('');\n }\n\n // Timing\n lines.push(`**Duration**: ${formatTiming(report.result.timingMs)}`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction formatTiming(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\n","/**\n * Text reporter for release reports\n */\n\nimport type { ReleaseReport } from '../types';\n\nexport function renderText(report: ReleaseReport): string {\n const lines: string[] = [];\n \n lines.push('[release] ' + (report.result.ok ? 'OK' : 'FAILED'));\n lines.push('');\n\n // Checks\n if (report.result.checks) {\n for (const [id, result] of Object.entries(report.result.checks)) {\n if (!result) {continue;}\n lines.push(`[${id}] ${result.ok ? 'pass' : 'fail'}`);\n if (result.hint && !result.ok) {\n lines.push(` ${result.hint}`);\n }\n }\n lines.push('');\n }\n\n // Per-package checks\n if (report.result.checksPerPackage) {\n for (const [pkgName, pkgChecks] of Object.entries(report.result.checksPerPackage)) {\n lines.push(`[${pkgName}]`);\n for (const [id, result] of Object.entries(pkgChecks)) {\n if (!result) {continue;}\n lines.push(` [${id}] ${result.ok ? 'pass' : 'fail'}`);\n if (result.hint && !result.ok) {\n lines.push(` ${result.hint}`);\n }\n }\n }\n lines.push('');\n }\n\n // Published\n if (report.result.published && report.result.published.length > 0) {\n lines.push('[published] ' + report.result.published.length + ' package(s)');\n for (const pkg of report.result.published) {\n lines.push(` ${pkg}`);\n }\n lines.push('');\n }\n\n // Errors\n if (report.result.errors && report.result.errors.length > 0) {\n lines.push('[errors]');\n for (const error of report.result.errors) {\n lines.push(` ${error}`);\n }\n lines.push('');\n }\n\n lines.push(`[timing] ${formatTiming(report.result.timingMs)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatTiming(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\n","/**\n * @module @kb-labs/release-manager-core/shell-adapter\n * Shell adapter for release-core - wraps execa with SDK types\n */\n\nimport { execa } from 'execa';\nimport type { ShellAPI, ExecResult, ExecOptions } from '@kb-labs/sdk';\n\n/**\n * Create a ShellAPI adapter using execa\n * This is used in core libraries where ctx.runtime.shell is not available\n */\nexport function createExecaShellAdapter(): ShellAPI {\n return {\n async exec(command: string, args?: string[], options?: ExecOptions): Promise<ExecResult> {\n try {\n const result = await execa(command, args || [], {\n cwd: options?.cwd,\n timeout: options?.timeout,\n preferLocal: true,\n env: options?.env || process.env,\n });\n return {\n ok: result.exitCode === 0,\n code: result.exitCode ?? 0,\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n };\n } catch (error: unknown) {\n const e = error as { exitCode?: number; stdout?: string; stderr?: string; message?: string };\n return {\n ok: false,\n code: e.exitCode || 1,\n stdout: e.stdout || '',\n stderr: e.stderr || e.message || '',\n };\n }\n },\n };\n}\n\n","/**\n * Resolve the npm dist-tag and target registry for a release channel.\n *\n * Shared by CLI (run.ts), REST (run-handler.ts) and the pipeline itself so\n * \"canary always goes to real npm under a canary tag, stable uses whatever\n * config.registry says\" is defined once, config-driven, not hardcoded at\n * each call site.\n */\nimport type { ReleaseChannel, ReleaseConfig } from './types';\n\nconst DEFAULT_NPM_REGISTRY = 'https://registry.npmjs.org';\n\nexport function resolvePublishTag(config: ReleaseConfig, channel: ReleaseChannel): string {\n if (channel === 'canary') {\n return config.publish?.canaryTag ?? 'canary';\n }\n return config.publish?.stableTag ?? 'latest';\n}\n\nexport function resolvePublishRegistry(config: ReleaseConfig, channel: ReleaseChannel): string {\n if (channel === 'canary') {\n // Canary never reads config.registry (that's the stable/Verdaccio target) —\n // a stale Verdaccio registry override must not swallow a canary publish.\n return config.publish?.npmRegistry ?? DEFAULT_NPM_REGISTRY;\n }\n return config.registry ?? DEFAULT_NPM_REGISTRY;\n}\n","/**\n * Topological ordering of packages by intra-monorepo dependency edges\n * (dependencies + peerDependencies). Used to make sure a package's own\n * workspace dependencies are built before it — a package built out of\n * order can fail to resolve a dependency's subpath exports (e.g.\n * `@kb-labs/sdk/adapters`) if that dependency's dist/ doesn't exist yet\n * (fresh worktree, no pre-existing build cache).\n *\n * Packages are grouped into \"waves\": wave 0 has no intra-release deps,\n * wave 1 depends only on wave 0, etc. Cycles (should not exist in a\n * well-formed monorepo) fall into a \"remainder\" group appended at the end.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface OrderablePackage {\n name: string;\n path: string;\n}\n\nfunction buildIntraDeps<T extends OrderablePackage>(packages: T[], nameSet: Set<string>): Map<string, Set<string>> {\n const deps = new Map<string, Set<string>>();\n for (const pkg of packages) {\n const intra = new Set<string>();\n try {\n const pkgJson = JSON.parse(readFileSync(join(pkg.path, 'package.json'), 'utf-8')) as {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n };\n for (const section of ['dependencies', 'peerDependencies'] as const) {\n for (const depName of Object.keys(pkgJson[section] ?? {})) {\n if (nameSet.has(depName)) { intra.add(depName); }\n }\n }\n } catch {\n // If we can't read package.json, treat as no deps\n }\n deps.set(pkg.name, intra);\n }\n return deps;\n}\n\nfunction buildDependantsMap(names: string[], deps: Map<string, Set<string>>): Map<string, Set<string>> {\n const dependants = new Map<string, Set<string>>();\n for (const name of names) {\n for (const dep of deps.get(name) ?? []) {\n if (!dependants.has(dep)) { dependants.set(dep, new Set()); }\n dependants.get(dep)!.add(name);\n }\n }\n return dependants;\n}\n\n/**\n * Sort packages so every intra-release dependency appears before its\n * dependants. Flat order (not waves) — safe for a sequential build loop.\n */\nexport function topoSortForBuild<T extends OrderablePackage>(packages: T[]): T[] {\n const byName = new Map(packages.map(p => [p.name, p]));\n const nameSet = new Set(packages.map(p => p.name));\n const deps = buildIntraDeps(packages, nameSet);\n const dependants = buildDependantsMap([...nameSet], deps);\n\n const remaining = new Map<string, number>(\n packages.map(p => [p.name, (deps.get(p.name) ?? new Set()).size]),\n );\n const ordered: T[] = [];\n\n while (remaining.size > 0) {\n const ready = [...remaining.entries()]\n .filter(([, count]) => count === 0)\n .map(([name]) => name);\n\n if (ready.length === 0) {\n // Cycle (or unresolved dep outside the plan) — append the rest as-is.\n for (const name of remaining.keys()) { ordered.push(byName.get(name)!); }\n break;\n }\n\n for (const name of ready) {\n ordered.push(byName.get(name)!);\n remaining.delete(name);\n for (const dependant of dependants.get(name) ?? []) {\n if (remaining.has(dependant)) {\n remaining.set(dependant, (remaining.get(dependant) ?? 1) - 1);\n }\n }\n }\n }\n\n return ordered;\n}\n","/**\n * Safe build — builds into temp dir, then atomically swaps dist/.\n * Prevents crashing running services whose dist/ is wiped by tsup's `clean: true`.\n */\n\nimport { rename, rm, cp } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport type { BuildResult, PackageVersion, PluginLogger } from './types';\nimport { topoSortForBuild } from './dep-order';\n\n/**\n * Build all packages in a plan using safe build strategy.\n * Stops on first failure.\n *\n * Packages are topologically sorted first so an intra-release dependency\n * (e.g. @kb-labs/sdk) always builds before its dependants — otherwise a\n * dependant can fail to resolve the dependency's subpath exports in a\n * fresh worktree where nothing has a pre-existing dist/ yet.\n */\nexport async function buildPackages(\n packages: PackageVersion[],\n options?: {\n logger?: PluginLogger;\n onProgress?: (pkg: string, result: BuildResult) => void;\n },\n): Promise<BuildResult[]> {\n const results: BuildResult[] = [];\n const ordered = topoSortForBuild(packages);\n\n for (const pkg of ordered) {\n options?.logger?.info?.(`Building ${pkg.name}...`);\n const result = await runSafeBuild(pkg.path, pkg.name);\n results.push({ ...result, name: pkg.name });\n\n options?.onProgress?.(pkg.name, { ...result, name: pkg.name });\n\n if (!result.success) {\n options?.logger?.error?.(`Build failed for ${pkg.name}: ${result.error}`);\n break;\n }\n\n options?.logger?.info?.(`Built ${pkg.name} in ${result.durationMs}ms`);\n }\n\n return results;\n}\n\n/**\n * Run build for a single package using safe temp-dir strategy when tsup is detected.\n * Falls back to regular `pnpm run build` for non-tsup packages.\n */\nexport async function runSafeBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const usesTsup = existsSync(join(packagePath, 'tsup.config.ts'))\n || existsSync(join(packagePath, 'tsup.config.js'));\n\n if (usesTsup) {\n return runTsupSafeBuild(packagePath, packageName);\n }\n\n return runDirectBuild(packagePath, packageName);\n}\n\n/**\n * Check if a shell command is a build command that should use safe build.\n */\nexport function isBuildCommand(command: string, args?: string[]): boolean {\n const full = [command, ...(args ?? [])].join(' ').trim();\n return /\\b(pnpm|npm|yarn)\\s+(run\\s+)?build\\b/.test(full);\n}\n\nasync function runTsupSafeBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const startTime = Date.now();\n const buildId = randomBytes(6).toString('hex');\n const tempDir = join(tmpdir(), `kb-release-build-${buildId}`);\n const distDir = join(packagePath, 'dist');\n const backupDir = join(packagePath, `dist.bak-${buildId}`);\n\n try {\n const buildResult = await spawnCommand(`npx tsup -d ${tempDir}`, packagePath);\n\n if (!buildResult.success) {\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n return { ...buildResult, name: packageName, durationMs: Date.now() - startTime };\n }\n\n if (existsSync(distDir)) {\n await rename(distDir, backupDir);\n }\n\n try {\n await rename(tempDir, distDir);\n } catch {\n await cp(tempDir, distDir, { recursive: true });\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n\n await rm(backupDir, { recursive: true, force: true }).catch(() => {});\n return { success: true, name: packageName, durationMs: Date.now() - startTime };\n } catch (err) {\n if (existsSync(backupDir) && !existsSync(distDir)) {\n await rename(backupDir, distDir).catch(() => {});\n }\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n return {\n success: false,\n name: packageName,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startTime,\n };\n }\n}\n\nasync function runDirectBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const result = await spawnCommand('pnpm run build', packagePath);\n return { ...result, name: packageName };\n}\n\nexport interface SpawnResult extends Omit<BuildResult, 'name'> {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Spawn a shell command and collect results.\n * Captures both stdout and stderr — build tools often write errors to stdout.\n */\nexport function spawnCommand(command: string, cwd: string, timeoutMs = 5 * 60 * 1000): Promise<SpawnResult> {\n const startTime = Date.now();\n\n return new Promise((resolve) => {\n const child = spawn(command, [], {\n cwd,\n stdio: 'pipe',\n shell: true,\n env: { ...process.env },\n });\n\n let stdout = '';\n let stderr = '';\n child.stdout?.on('data', (data) => { stdout += data.toString(); });\n child.stderr?.on('data', (data) => { stderr += data.toString(); });\n\n child.on('close', (code) => {\n const exitCode = code ?? 1;\n const durationMs = Date.now() - startTime;\n if (exitCode === 0) {\n resolve({ success: true, durationMs, stdout, stderr, exitCode });\n return;\n }\n\n // Build error message from available output (last N lines to keep it readable)\n const combined = (stderr || stdout).trim();\n const tail = combined\n .split('\\n')\n .slice(-30)\n .join('\\n');\n\n resolve({\n success: false,\n error: tail || `Build failed with exit code ${exitCode}`,\n durationMs,\n stdout,\n stderr,\n exitCode,\n });\n });\n\n child.on('error', (err) => {\n resolve({ success: false, error: err.message, durationMs: Date.now() - startTime, stdout: '', stderr: '', exitCode: 1 });\n });\n\n setTimeout(() => {\n child.kill();\n resolve({ success: false, error: `Timed out after ${timeoutMs / 1000}s`, durationMs: Date.now() - startTime, stdout: '', stderr: '', exitCode: 1 });\n }, timeoutMs);\n });\n}\n","/**\n * Unified check runner for release manager.\n * Reads config.checks[], supports parser field, script path resolution, perPackage routing.\n */\n\nimport { join } from 'node:path';\nimport type { CustomCheckConfig, CheckResult, CheckResultDetails, PluginLogger } from './types';\nimport { spawnCommand } from './build';\n\nexport interface CheckRunnerOptions {\n repoRoot: string;\n packagePaths: string[];\n scopePath?: string;\n logger?: Pick<PluginLogger, 'info' | 'warn'>;\n}\n\n/**\n * Run all configured checks against packages.\n * Handles: parser evaluation, script path resolution, perPackage/scopePath/repoRoot routing.\n */\nexport async function runReleaseChecks(\n checks: CustomCheckConfig[],\n options: CheckRunnerOptions,\n): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n for (const check of checks) {\n const result = await runSingleCheck(check, options);\n results.push(result);\n\n options.logger?.info?.(`Check ${check.id}: ${result.ok ? 'passed' : 'failed'} (${result.timingMs}ms)`);\n\n // Stop on first non-optional failure\n if (!result.ok && !check.optional) {\n break;\n }\n }\n\n return results;\n}\n\nasync function runSingleCheck(\n check: CustomCheckConfig,\n options: CheckRunnerOptions,\n): Promise<CheckResult> {\n const runIn = check.runIn ?? 'perPackage';\n let pathsToRun: string[];\n\n if (runIn === 'repoRoot') {\n pathsToRun = [options.repoRoot];\n } else if (runIn === 'scopePath') {\n pathsToRun = [options.scopePath ?? options.repoRoot];\n } else {\n pathsToRun = options.packagePaths.length > 0 ? options.packagePaths : [options.repoRoot];\n }\n\n // Run perPackage checks in parallel (concurrency=8); single-path checks run sequentially.\n const CONCURRENCY = 8;\n\n const resolvedArgs = (check.args ?? []).map(arg =>\n arg.match(/\\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg\n );\n const fullCommand = [check.command, ...resolvedArgs].join(' ');\n const timeoutMs = check.timeoutMs ?? 120_000;\n\n type PkgRunResult = { path: string; ok: boolean; details: CheckResultDetails; durationMs: number };\n\n async function runForPath(pkgPath: string): Promise<PkgRunResult> {\n const result = await spawnCommand(fullCommand, pkgPath, timeoutMs);\n const ok = evaluateParser(check, result.stdout, result.stderr, result.exitCode);\n return {\n path: pkgPath,\n ok,\n durationMs: result.durationMs,\n details: {\n packagePath: pkgPath,\n stdout: result.stdout || undefined,\n stderr: result.stderr || undefined,\n exitCode: result.exitCode,\n error: result.error ?? (!ok ? `exit code ${result.exitCode}` : undefined),\n },\n };\n }\n\n let pkgResults: PkgRunResult[];\n\n if (runIn === 'perPackage' && pathsToRun.length > 1) {\n // Parallel with concurrency limit\n pkgResults = [];\n for (let i = 0; i < pathsToRun.length; i += CONCURRENCY) {\n const batch = pathsToRun.slice(i, i + CONCURRENCY);\n pkgResults.push(...await Promise.all(batch.map(runForPath)));\n }\n } else {\n pkgResults = [await runForPath(pathsToRun[0]!)];\n }\n\n const firstFailure = pkgResults.find(r => !r.ok)?.details;\n const totalDurationMs = pkgResults.reduce((sum, r) => sum + r.durationMs, 0);\n const perPackage: NonNullable<CheckResult['packages']> | undefined = pathsToRun.length > 1\n ? pkgResults.map(r => ({ path: r.path, ok: r.ok, details: r.ok ? undefined : r.details }))\n : undefined;\n\n const allOk = !firstFailure;\n\n return {\n id: check.id,\n ok: allOk,\n details: firstFailure,\n hint: check.optional ? 'optional' : undefined,\n timingMs: totalDurationMs,\n packages: perPackage && perPackage.length > 0 ? perPackage : undefined,\n };\n}\n\nfunction evaluateParser(\n check: CustomCheckConfig,\n stdout: string,\n stderr: string,\n exitCode: number,\n): boolean {\n const parser = check.parser ?? 'exitcode';\n\n if (parser === 'exitcode') {\n return exitCode === 0;\n }\n\n if (parser === 'json') {\n try {\n const parsed = JSON.parse(stdout);\n return parsed.ok === true || parsed.success === true || parsed.status === 'ok';\n } catch {\n return false;\n }\n }\n\n if (typeof parser === 'function') {\n return parser(stdout, stderr, exitCode);\n }\n\n return exitCode === 0;\n}\n","/**\n * Package verifier — npm pack → extract → verify artifacts before publish.\n * Catches: directory imports, test file leaks, missing exports, syntax errors.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync, mkdirSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport { rmSync, writeFileSync } from 'node:fs';\nimport type { VerifyResult, PackageVersion, PluginLogger } from './types';\n\n/**\n * Verify all packages in a plan are publishable.\n */\nexport async function verifyPackages(\n packages: PackageVersion[],\n options?: {\n logger?: Pick<PluginLogger, 'info'>;\n onProgress?: (pkg: string, result: VerifyResult) => void;\n },\n): Promise<VerifyResult[]> {\n const results: VerifyResult[] = [];\n\n for (const pkg of packages) {\n const result = verifyPackage(pkg.path, pkg.name);\n results.push(result);\n options?.onProgress?.(pkg.name, result);\n }\n\n return results;\n}\n\n/**\n * Verify a single package is publishable.\n * npm pack → extract → check exports, directory imports, test leaks, syntax.\n */\nexport function verifyPackage(packagePath: string, packageName?: string): VerifyResult {\n const pkgJsonPath = join(packagePath, 'package.json');\n if (!existsSync(pkgJsonPath)) {\n return { name: packageName ?? packagePath, success: true, issues: [] }; // skip\n }\n\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const name = packageName ?? pkg.name ?? packagePath;\n\n // Skip private packages\n if (pkg.private) {\n return { name, success: true, issues: [] };\n }\n\n if (!existsSync(join(packagePath, 'dist'))) {\n return { name, success: true, issues: [] }; // no dist = not built yet\n }\n\n const issues: string[] = [];\n const tmpDir = join(tmpdir(), `kb-verify-${randomBytes(6).toString('hex')}`);\n\n try {\n mkdirSync(tmpDir, { recursive: true });\n\n // 1. npm pack (with link: → * replacement)\n const origPkg = readFileSync(pkgJsonPath, 'utf-8');\n const modPkg = JSON.parse(origPkg);\n for (const section of ['dependencies', 'devDependencies', 'peerDependencies']) {\n const deps = modPkg[section];\n if (!deps) {continue;}\n for (const [k, v] of Object.entries(deps)) {\n if (typeof v === 'string' && (v as string).startsWith('link:')) {\n deps[k] = '*';\n }\n }\n }\n writeFileSync(pkgJsonPath, JSON.stringify(modPkg, null, 2) + '\\n');\n\n let tgzFile: string | undefined;\n try {\n spawnSync('npm', ['pack', '--pack-destination', tmpDir], { cwd: packagePath, stdio: 'pipe', timeout: 30_000 });\n const files = readdirSync(tmpDir).filter(f => f.endsWith('.tgz'));\n tgzFile = files[0] ? join(tmpDir, files[0]) : undefined;\n } finally {\n // Always restore original package.json\n writeFileSync(pkgJsonPath, origPkg);\n }\n\n if (!tgzFile) {\n issues.push('npm pack produced no tarball');\n return { name, success: false, issues };\n }\n\n // 2. Extract\n spawnSync('tar', ['xzf', tgzFile], { cwd: tmpDir, stdio: 'pipe' });\n const extractedDir = join(tmpDir, 'package');\n\n issues.push(...verifyExtractedTarball(extractedDir));\n } catch (err) {\n issues.push(`Verification error: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n\n return { name, success: issues.length === 0, issues };\n}\n\n/**\n * Run the static artifact checks (test-file leaks, exports existence,\n * directory-import detection, syntax validation) against an already\n * extracted package tarball. Shared by verifyPackage() (local npm pack)\n * and verdaccio-verify.ts (npm pack pulled from a registry) so both\n * \"verify before publish\" and \"verify after publish\" use identical checks.\n */\nexport function verifyExtractedTarball(extractedDir: string): string[] {\n const issues: string[] = [];\n\n // Test file leaks\n const testFiles = findFiles(join(extractedDir, 'dist'), f =>\n f.includes('.spec.') || f.includes('.test.') || f.includes('__tests__')\n );\n if (testFiles.length > 0) {\n issues.push(`Test files in dist/: ${testFiles.slice(0, 3).join(', ')}`);\n }\n\n // Exports exist\n const extractedPkg = JSON.parse(readFileSync(join(extractedDir, 'package.json'), 'utf-8')) as PkgJson;\n for (const field of ['main', 'module', 'types'] as const) {\n const val = extractedPkg[field];\n if (val && !existsSync(join(extractedDir, val))) {\n issues.push(`${field}: ${val} does not exist in published package`);\n }\n }\n\n if (extractedPkg.exports) {\n checkExportsExist(extractedPkg.exports, extractedDir, 'exports', issues);\n }\n\n // Directory imports in ESM entry\n const esmEntry = resolveEsmEntry(extractedPkg);\n if (esmEntry) {\n const esmPath = join(extractedDir, esmEntry);\n if (existsSync(esmPath)) {\n checkDirectoryImports(esmPath, join(extractedDir, 'dist'), issues);\n\n // Syntax check\n const esmCheck = spawnSync('node', ['--check', esmPath], { stdio: 'pipe', timeout: 10_000 });\n if (esmCheck.status !== 0) {\n issues.push(`ESM syntax error in ${esmEntry}`);\n }\n }\n }\n\n // CJS syntax check\n const cjsEntry = resolveCjsEntry(extractedPkg);\n if (cjsEntry) {\n const cjsPath = join(extractedDir, cjsEntry);\n if (existsSync(cjsPath)) {\n const cjsCheck = spawnSync('node', ['--check', cjsPath], { stdio: 'pipe', timeout: 10_000 });\n if (cjsCheck.status !== 0) {\n issues.push(`CJS syntax error in ${cjsEntry}`);\n }\n }\n }\n\n return issues;\n}\n\ntype PkgJson = Record<string, unknown> & {\n exports?: Record<string, Record<string, string> | string>;\n module?: string;\n main?: string;\n types?: string;\n};\n\nfunction resolveEsmEntry(pkg: PkgJson): string | undefined {\n const dotExport = pkg.exports?.['.'];\n const importEntry = dotExport && typeof dotExport === 'object' ? (dotExport as Record<string, string>)['import'] : undefined;\n return importEntry ?? pkg.module ?? pkg.main;\n}\n\nfunction resolveCjsEntry(pkg: PkgJson): string | undefined {\n const dotExport = pkg.exports?.['.'];\n const req = dotExport && typeof dotExport === 'object' ? (dotExport as Record<string, string>)['require'] : undefined;\n if (req) {return req;}\n if (pkg.main?.endsWith('.cjs')) {return pkg.main;}\n return undefined;\n}\n\nfunction checkExportsExist(exports: unknown, baseDir: string, prefix: string, issues: string[]): void {\n if (typeof exports === 'string') {\n // Skip wildcard patterns like \"./dist/*\" — can't verify statically\n if (exports.includes('*')) { return; }\n if (!existsSync(join(baseDir, exports))) {\n issues.push(`${prefix}: ${exports} missing`);\n }\n } else if (exports && typeof exports === 'object') {\n for (const [k, v] of Object.entries(exports)) {\n // Skip wildcard export keys like \"./dist/*\"\n if (k.includes('*')) { continue; }\n checkExportsExist(v, baseDir, `${prefix}.${k}`, issues);\n }\n }\n}\n\nfunction checkDirectoryImports(filePath: string, distDir: string, issues: string[]): void {\n const content = readFileSync(filePath, 'utf-8');\n const importRegex = /(?:export|import)\\s.*?from\\s+['\"](\\.[^'\"]*)['\"]/g;\n let match: RegExpExecArray | null;\n\n while ((match = importRegex.exec(content)) !== null) {\n const target = match[1];\n if (!target || target.includes('.')) {continue;} // has extension, ok\n const targetPath = resolve(dirname(filePath), target);\n if (existsSync(targetPath) && statSync(targetPath).isDirectory()) {\n issues.push(`Directory import '${target}' in ${filePath.split('/').pop()}`);\n }\n }\n}\n\nfunction findFiles(dir: string, predicate: (f: string) => boolean): string[] {\n if (!existsSync(dir)) {return [];}\n const results: string[] = [];\n function walk(d: string) {\n try {\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n const full = join(d, entry.name);\n if (entry.isDirectory()) {walk(full);}\n else if (predicate(full)) {results.push(entry.name);}\n }\n } catch { /* skip */ }\n }\n walk(dir);\n return results;\n}\n","/**\n * Registry-side artifact verification — confirms a package actually landed\n * on a registry (Verdaccio) with the expected content, before it's promoted\n * to npm `latest`.\n *\n * Deliberately separate from verifier.ts: that module is pure local\n * validation (npm pack from the working tree, no registry I/O) so it stays\n * usable offline/in restricted CI. This module does registry round-trips —\n * it's the \"did the publish actually work, and is what landed still sane\"\n * check that only makes sense to run *after* a publish.\n */\n\nimport { existsSync, mkdirSync, readdirSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport { isVersionPublished } from './planner';\nimport { verifyExtractedTarball } from './verifier';\nimport type { PublishablePackage, VerifyResult, PluginLogger } from './types';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/**\n * Backoff schedule for the \"is it published yet\" poll only — tuned for\n * registry propagation lag (seconds), not for npm rate-limiting (which\n * `publish-programmatic.ts` already handles separately, on a much longer\n * schedule, around the publish call itself). Verdaccio (this module's\n * original caller) is synchronous, so `retries: 0` keeps that path's\n * behavior exactly as before; real npm has observable lag, so `deliver`\n * passes a non-zero `retries`.\n */\nconst DEFAULT_POLL_RETRY_DELAYS_MS = [2_000, 4_000, 8_000, 16_000, 30_000] as const;\n\nexport interface VerifyAgainstRegistryOptions {\n registry: string;\n /** Timeout (ms) for the registry HTTP check and the `npm pack` round-trip. Default: 30000. */\n timeout?: number;\n /**\n * Extra attempts for the \"is it published yet\" check before giving up —\n * each retry waits `retryDelaysMs[attempt]` (capped at the last entry).\n * Default: 0 (single attempt, matches pre-existing Verdaccio behavior).\n */\n retries?: number;\n retryDelaysMs?: readonly number[];\n logger?: Pick<PluginLogger, 'info' | 'warn'>;\n}\n\n/**\n * Verify that each package landed on `registry` at its expected version,\n * and that the tarball actually published there passes the same static\n * checks verifyPackage() runs pre-publish (catches publish-time corruption\n * distinct from pre-publish source issues).\n */\nexport async function verifyAgainstRegistry(\n packages: PublishablePackage[],\n options: VerifyAgainstRegistryOptions,\n): Promise<VerifyResult[]> {\n const { registry, timeout = DEFAULT_TIMEOUT_MS, retries = 0, retryDelaysMs = DEFAULT_POLL_RETRY_DELAYS_MS, logger } = options;\n const results: VerifyResult[] = [];\n\n for (const pkg of packages) {\n results.push(await verifyOneAgainstRegistry(pkg, registry, timeout, retries, retryDelaysMs, logger));\n }\n\n return results;\n}\n\nasync function waitUntilPublished(\n pkg: PublishablePackage,\n registry: string,\n retries: number,\n retryDelaysMs: readonly number[],\n logger?: Pick<PluginLogger, 'info' | 'warn'>,\n): Promise<boolean> {\n for (let attempt = 0; attempt <= retries; attempt++) {\n if (await isVersionPublished(pkg.name, pkg.version, registry)) {\n return true;\n }\n if (attempt < retries) {\n const delay = retryDelaysMs[Math.min(attempt, retryDelaysMs.length - 1)]!;\n logger?.warn?.(\n `${pkg.name}@${pkg.version} not yet visible on ${registry} (attempt ${attempt + 1}/${retries + 1}), ` +\n `retrying in ${(delay / 1000).toFixed(0)}s — likely registry propagation lag`,\n );\n await new Promise<void>(r => { setTimeout(r, delay); });\n }\n }\n return false;\n}\n\nasync function verifyOneAgainstRegistry(\n pkg: PublishablePackage,\n registry: string,\n timeout: number,\n retries: number,\n retryDelaysMs: readonly number[],\n logger?: Pick<PluginLogger, 'info' | 'warn'>,\n): Promise<VerifyResult> {\n const published = await waitUntilPublished(pkg, registry, retries, retryDelaysMs, logger);\n if (!published) {\n return { name: pkg.name, success: false, issues: [`${pkg.name}@${pkg.version} was not found on ${registry} after publish (waited through ${retries} retr${retries === 1 ? 'y' : 'ies'})`] };\n }\n logger?.info?.(`${pkg.name}@${pkg.version} confirmed on ${registry}`);\n\n const tmpDir = join(tmpdir(), `kb-verdaccio-verify-${randomBytes(6).toString('hex')}`);\n const issues: string[] = [];\n\n try {\n mkdirSync(tmpDir, { recursive: true });\n\n const spec = `${pkg.name}@${pkg.version}`;\n const packResult = spawnSync(\n 'npm',\n ['pack', spec, '--registry', registry, '--pack-destination', tmpDir],\n { stdio: 'pipe', timeout },\n );\n\n if (packResult.status !== 0) {\n const stderr = packResult.stderr?.toString().trim();\n issues.push(`Could not pull ${spec} back from ${registry} for verification${stderr ? `: ${stderr}` : ''}`);\n return { name: pkg.name, success: false, issues };\n }\n\n const tgzFile = readdirSync(tmpDir).find(f => f.endsWith('.tgz'));\n if (!tgzFile) {\n issues.push(`npm pack produced no tarball for ${spec} from ${registry}`);\n return { name: pkg.name, success: false, issues };\n }\n\n spawnSync('tar', ['xzf', tgzFile], { cwd: tmpDir, stdio: 'pipe' });\n const extractedDir = join(tmpDir, 'package');\n if (!existsSync(extractedDir)) {\n issues.push(`Failed to extract tarball for ${spec}`);\n return { name: pkg.name, success: false, issues };\n }\n\n issues.push(...verifyExtractedTarball(extractedDir));\n } catch (err) {\n issues.push(`Registry verification error: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n\n return { name: pkg.name, success: issues.length === 0, issues };\n}\n","/**\n * Release lock — prevents concurrent release runs.\n *\n * Creates `.kb/release/release.lock` with current PID.\n * On acquire: fails if another live process holds the lock.\n * On release: removes the lock file.\n */\n\nimport { readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\ninterface LockData {\n pid: number;\n startedAt: string;\n flow?: string;\n}\n\nfunction lockPath(repoRoot: string): string {\n return join(repoRoot, '.kb', 'release', 'release.lock');\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Acquire the release lock.\n * Returns a release function — call it in a finally block.\n * Throws if another release is already running.\n */\nexport function acquireLock(repoRoot: string, flow?: string): () => void {\n const path = lockPath(repoRoot);\n\n // Check if lock exists and belongs to a live process\n try {\n const existing = JSON.parse(readFileSync(path, 'utf-8')) as LockData;\n if (isProcessAlive(existing.pid)) {\n throw new Error(\n `Another release is already running (PID ${existing.pid}, started ${existing.startedAt}, flow: ${existing.flow ?? 'unknown'}). ` +\n `If this is stale, delete: ${path}`\n );\n }\n // Stale lock from a dead process — overwrite it\n } catch (err) {\n if (err instanceof Error && err.message.includes('Another release')) {throw err;}\n // File doesn't exist or is unreadable — proceed\n }\n\n mkdirSync(join(repoRoot, '.kb', 'release'), { recursive: true });\n writeFileSync(path, JSON.stringify({ pid: process.pid, startedAt: new Date().toISOString(), flow } satisfies LockData));\n\n return () => {\n try { unlinkSync(path); } catch { /* already removed */ }\n };\n}\n","/**\n * Unified release pipeline — single orchestrator for CLI and REST.\n *\n * Flow: plan → snapshot → checks → build → verify → version bump → changelog → publish → git → report\n *\n * IMPORTANT — publish BEFORE git:\n * We commit and tag AFTER a successful publish, not before.\n * This prevents the \"git tag exists but npm is empty\" state that breaks installs.\n * If publish fails (even partially), no git commit or tag is created.\n */\n\nimport { join } from 'node:path';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { useEnv } from '@kb-labs/sdk';\nimport { planRelease } from './planner';\nimport { saveSnapshot, restoreSnapshot } from './rollback';\nimport { updatePackageVersions } from './publisher';\nimport { copyChangelogToPackages, commitAndTagRelease, mergeRootChangelog } from './publisher';\nimport { buildPackages } from './build';\nimport { runReleaseChecks } from './checks';\nimport { verifyPackages } from './verifier';\nimport { verifyAgainstRegistry } from './verdaccio-verify';\nimport { acquireLock } from './lock';\nimport { resolvePublishTag, resolvePublishRegistry } from './channel';\nimport {\n loadCheckpoint,\n writeCheckpoint,\n deleteCheckpoint,\n isCheckpointResumable,\n} from './checkpoint';\nimport type {\n PipelineOptions,\n PipelineResult,\n ReleaseReport,\n ReleaseResult,\n ReleasePlan,\n ReleaseStage,\n VersionBump,\n} from './types';\n\n/**\n * Run the complete release pipeline.\n * Both CLI and REST call this with different injected publishers/changelog generators.\n */\nexport async function runReleasePipeline(options: PipelineOptions): Promise<PipelineResult> {\n const {\n cwd: _cwd, repoRoot, scopeCwd, scope, config, dryRun = false,\n skipChecks = false, skipBuild = false, skipVerify = false,\n skipPublish = false,\n noVerify = false,\n checks: checkConfigs, publisher, changelog: changelogGen,\n logger, onProgress,\n } = options;\n\n const flow = options.flow;\n\n const startTime = Date.now();\n const progress = (stage: ReleaseStage, msg: string) => {\n logger?.info?.(msg);\n onProgress?.(stage, msg);\n };\n\n // 0a. Acquire exclusive lock — prevents concurrent release runs.\n const releaseLock = acquireLock(repoRoot, flow);\n\n try {\n return await _runPipeline({\n repoRoot, scopeCwd, scope, flow, config, dryRun, skipChecks, skipBuild, skipVerify,\n skipPublish, noVerify, checkConfigs, publisher, changelogGen, logger, startTime, progress,\n options,\n });\n } finally {\n releaseLock();\n }\n}\n\nasync function _runPipeline(ctx: {\n repoRoot: string;\n scopeCwd: string;\n scope: string | undefined;\n flow: string | undefined;\n config: PipelineOptions['config'];\n dryRun: boolean;\n skipChecks: boolean;\n skipBuild: boolean;\n skipVerify: boolean;\n skipPublish: boolean;\n noVerify: boolean;\n checkConfigs: PipelineOptions['checks'];\n publisher: PipelineOptions['publisher'];\n changelogGen: PipelineOptions['changelog'];\n logger: PipelineOptions['logger'];\n startTime: number;\n progress: (stage: ReleaseStage, msg: string) => void;\n options: PipelineOptions;\n}): Promise<PipelineResult> {\n const {\n repoRoot, scopeCwd, scope, flow, config, dryRun,\n skipChecks, skipBuild, skipVerify, skipPublish, noVerify,\n checkConfigs, publisher, changelogGen, logger, startTime, progress,\n } = ctx;\n\n // 0b. Pre-flight: verify npm credentials before doing any real work.\n // Skipped entirely in prepare-only mode — no npm access is needed to\n // build, version, changelog, and git-tag a release.\n const channel = config.channel ?? 'stable';\n const publishTag = resolvePublishTag(config, channel);\n const publishRegistry = resolvePublishRegistry(config, channel);\n\n if (!dryRun && !skipPublish) {\n const registry = publishRegistry;\n const authError = await verifyNpmAuth(registry);\n if (authError) {\n const emptyPlan: ReleasePlan = { packages: [], strategy: 'semver', registry, rollbackEnabled: false, channel };\n return {\n success: false,\n plan: emptyPlan,\n report: buildReport('planning', emptyPlan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: [`npm auth check failed: ${authError}`],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n\n // 1. Plan — always discover from repoRoot with scope as a filter.\n // scopeCwd is used only for checks/git/changelog (physical path ops), not for discovery.\n progress('planning', 'Discovering packages and planning release...');\n const plan = await planRelease({\n cwd: repoRoot,\n config,\n scope,\n flow, // already includes defaultFlow fallback\n bumpOverride: config.bump as VersionBump | undefined,\n channel,\n });\n\n if (plan.packages.length === 0) {\n return {\n success: false,\n plan,\n report: buildReport('planning', plan, repoRoot, dryRun, startTime, {\n ok: false, errors: [`No packages found for scope: ${scope || 'all'}`], timingMs: 0,\n }),\n };\n }\n\n progress('planning', `Found ${plan.packages.length} package(s) to release`);\n\n // 1b. Check for resumable checkpoint — publish already done, only git remains.\n // N/A in prepare-only mode: skipPublish never writes a checkpoint.\n if (!dryRun && !skipPublish) {\n const existingCheckpoint = loadCheckpoint(repoRoot);\n if (existingCheckpoint) {\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const planVersion = uniqueVersions.size === 1 ? plan.packages[0]!.nextVersion : 'independent';\n if (isCheckpointResumable(existingCheckpoint, flow ?? 'default', planVersion)) {\n progress('publishing', 'Resuming from checkpoint — publish already done, running git step...');\n const resumeGit = await commitAndTagRelease({\n cwd: scopeCwd,\n plan,\n dryRun: false,\n noVerify,\n repoRoot,\n checkpointGitRoots: existingCheckpoint.gitRoots,\n changelogOutputPath: config.changelog?.outputPath,\n flowName: flow,\n tagPattern: flow ? config.flows?.[flow]?.tagPattern : undefined,\n });\n deleteCheckpoint(repoRoot);\n const resumeReport = buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: resumeGit.committed,\n published: existingCheckpoint.publishedPackages.map(p => `${p.name}@${p.version}`),\n git: resumeGit,\n timingMs: Date.now() - startTime,\n });\n const scopeDir = scope ? scope.replace(/[@/]/g, '-').replace(/^-/, '') : 'root';\n const historyDir = join(repoRoot, '.kb', 'release', 'history', scopeDir, new Date().toISOString().replace(/[:.]/g, '-'));\n await mkdir(historyDir, { recursive: true });\n await writeFile(join(historyDir, 'report.json'), JSON.stringify(resumeReport, null, 2), 'utf-8');\n return { success: resumeReport.result.ok, plan, report: resumeReport };\n }\n }\n }\n\n // 2. Snapshot (for rollback)\n await saveSnapshot({ cwd: repoRoot, plan });\n\n // 3. Checks\n if (!skipChecks && checkConfigs && checkConfigs.length > 0) {\n progress('checking', `Running ${checkConfigs.length} pre-release check(s)...`);\n\n const packagePaths = plan.packages.map(p => p.path);\n const checkResults = await runReleaseChecks(checkConfigs, {\n repoRoot,\n packagePaths,\n scopePath: scopeCwd,\n logger,\n });\n\n const failed = checkResults.filter(r => !r.ok && r.hint !== 'optional');\n if (failed.length > 0) {\n await restoreSnapshot(repoRoot);\n\n // Build rich per-check error messages for both human and agent consumption\n const errorLines = failed.flatMap(f => {\n const lines: string[] = [`check \"${f.id}\" failed`];\n if (f.details?.packagePath) { lines.push(` package: ${f.details.packagePath}`); }\n if (f.details?.error) { lines.push(` reason: ${f.details.error}`); }\n if (f.details?.stderr?.trim()) { lines.push(` stderr: ${f.details.stderr.trim().split('\\n').slice(0, 5).join('\\n ')}`); }\n if (f.details?.stdout?.trim() && !f.details?.stderr?.trim()) { lines.push(` output: ${f.details.stdout.trim().split('\\n').slice(0, 5).join('\\n ')}`); }\n if (f.packages?.filter(p => !p.ok).length) {\n const failedPkgs = f.packages.filter(p => !p.ok);\n lines.push(` failed in ${failedPkgs.length}/${f.packages.length} package(s):`);\n for (const pkg of failedPkgs.slice(0, 10)) {\n lines.push(` - ${pkg.path}${pkg.details?.error ? `: ${pkg.details.error}` : ''}`);\n }\n }\n return lines;\n });\n\n return {\n success: false,\n plan,\n report: buildReport('checking', plan, repoRoot, dryRun, startTime, {\n ok: false,\n checks: Object.fromEntries(checkResults.map(r => [r.id, r])),\n errors: errorLines,\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n progress('checking', 'Pre-release checks passed');\n }\n\n // 4. Build\n if (!skipBuild && !dryRun) {\n progress('versioning', `Building ${plan.packages.length} package(s)...`);\n const buildResults = await buildPackages(plan.packages, { logger });\n const buildFailed = buildResults.filter(r => !r.success);\n\n if (buildFailed.length > 0) {\n await restoreSnapshot(repoRoot);\n return {\n success: false,\n plan,\n report: buildReport('versioning', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: buildFailed.map(f => `Build failed: ${f.name} — ${f.error}`),\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n\n // 5. Verify (pack + install check)\n if (!skipVerify && !dryRun) {\n progress('verifying', 'Verifying package artifacts...');\n const verifyResults = await verifyPackages(plan.packages, { logger });\n const verifyFailed = verifyResults.filter(r => !r.success);\n\n if (verifyFailed.length > 0) {\n await restoreSnapshot(repoRoot);\n const allIssues = verifyFailed.flatMap(r => r.issues.map(i => `${r.name}: ${i}`));\n return {\n success: false,\n plan,\n report: buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: [`Package verification failed:\\n ${allIssues.join('\\n ')}`],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n progress('verifying', 'Package artifacts verified');\n }\n\n // 6. Version bump — canary never persists its computed version to\n // package.json/git; it publishes the in-memory nextVersion directly.\n if (channel === 'stable') {\n progress('versioning', 'Updating package versions...');\n if (!dryRun) {\n const versionUpdates = await updatePackageVersions(plan);\n const failedUpdates = versionUpdates.filter(u => !u.updated);\n if (failedUpdates.length > 0) {\n await restoreSnapshot(repoRoot);\n return {\n success: false,\n plan,\n report: buildReport('versioning', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: failedUpdates.map(u => `Version update failed: ${u.package}`),\n versionUpdates,\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n }\n\n // 7. Changelog — skipped for canary: there's nothing to changelog against a\n // registry-only prerelease, and writing CHANGELOG.md would leave dirty,\n // uncommitted files behind since canary never runs the git stage either.\n let changelogMd = '';\n if (changelogGen && channel === 'stable') {\n progress('versioning', 'Generating changelog...');\n try {\n changelogMd = await changelogGen.generate(plan, { repoRoot, gitCwd: scopeCwd, config });\n } catch (err) {\n logger?.warn?.(`Changelog generation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n if (changelogMd && !dryRun) {\n await copyChangelogToPackages({ cwd: repoRoot, plan, changelog: changelogMd });\n await mergeRootChangelog({ repoRoot, plan, changelog: changelogMd, outputPath: config.changelog?.outputPath });\n }\n\n // 8. Publish (before git — see module comment).\n // Prepare-only mode (skipPublish) never calls the publisher — it produces\n // a synthetic \"nothing published yet\" result and falls straight through to\n // git commit/tag. A separate CI job (`kb release promote`), triggered by\n // the tag this run pushes, does the actual npm publish. See\n // plugins/release/docs/adr/0001-*.\n progress('publishing', dryRun ? 'Simulating publish (dry-run)...' : skipPublish ? 'Skipping publish (prepare-only)...' : 'Publishing packages...');\n const packagesToPublish = plan.packages.map(pkg => ({\n name: pkg.name,\n version: pkg.nextVersion,\n path: pkg.path,\n }));\n\n const publishResult = skipPublish\n ? {\n published: [],\n alreadyPublished: [],\n failed: [],\n skipped: packagesToPublish.map(p => `${p.name}@${p.version} (prepared, not published)`),\n errors: [],\n }\n : await publisher.publish(packagesToPublish, {\n dryRun,\n access: config.publish?.access ?? 'public',\n tag: publishTag,\n registry: publishRegistry,\n });\n\n // If any package genuinely failed to publish, abort before touching git.\n // \"alreadyPublished\" entries are fine — they are counted as success.\n const publishFailed = publishResult.failed.length > 0;\n\n if (publishFailed) {\n return {\n success: false,\n plan,\n report: buildReport('publishing', plan, repoRoot, dryRun, startTime, {\n ok: false,\n published: publishResult.published,\n skipped: publishResult.skipped,\n errors: [\n `${publishResult.failed.length} package(s) failed to publish — git commit/tag skipped to prevent desync.`,\n ...(publishResult.errors ?? []),\n ],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n // 8b. Write checkpoint after successful publish — enables git-only retry on failure.\n // Skipped for canary: there's no git step to resume into, and canary versions\n // are deterministic per (base version, shortSha) so retries are naturally\n // idempotent via the publisher's already-published handling. Skipped for\n // skipPublish: nothing was published, there's nothing to check-point.\n if (!dryRun && !skipPublish && channel === 'stable') {\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const cpVersion = uniqueVersions.size === 1 ? plan.packages[0]!.nextVersion : 'independent';\n writeCheckpoint(repoRoot, {\n flow: flow ?? 'default',\n version: cpVersion,\n publishedPackages: plan.packages.map(p => ({\n name: p.name,\n version: p.nextVersion,\n path: p.path,\n gitRoot: p.gitRoot,\n })),\n gitRoots: {},\n });\n }\n\n // 8c. Verify the published artifact against the registry it was just\n // published to — a hard invariant for stable releases (not opt-in): confirms\n // each package actually landed and re-runs the same static checks against\n // what the registry served back, catching publish-time corruption distinct\n // from pre-publish source issues. Canary skips this — it never goes through\n // a Verdaccio pre-promote gate. skipPublish skips it too — nothing landed\n // on any registry this run; `kb release promote` verifies its own publish.\n if (!dryRun && !skipPublish && channel === 'stable') {\n progress('verifying', 'Verifying published artifacts against the registry...');\n const registryVerifyResults = await verifyAgainstRegistry(packagesToPublish, {\n registry: publishRegistry,\n timeout: config.publish?.verifyRegistryTimeoutMs,\n logger,\n });\n const registryVerifyFailed = registryVerifyResults.filter(r => !r.success);\n if (registryVerifyFailed.length > 0) {\n const allIssues = registryVerifyFailed.flatMap(r => r.issues.map(i => `${r.name}: ${i}`));\n return {\n success: false,\n plan,\n report: buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: false,\n published: publishResult.published,\n errors: [`Registry verification failed after publish — git commit/tag skipped:\\n ${allIssues.join('\\n ')}`],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n\n // 9. Git commit + tag — only after all packages are on npm.\n // Canary never runs this: its version is never persisted to package.json,\n // so there's nothing meaningful to commit or tag.\n let gitResult: { committed: boolean; tagged: string[]; pushed: boolean } | undefined;\n if (!dryRun && channel === 'stable') {\n progress('verifying', 'Committing and tagging release...');\n gitResult = await commitAndTagRelease({\n cwd: scopeCwd, plan, dryRun, noVerify, repoRoot,\n changelogOutputPath: config.changelog?.outputPath,\n flowName: flow,\n tagPattern: flow ? config.flows?.[flow]?.tagPattern : undefined,\n });\n deleteCheckpoint(repoRoot);\n }\n\n // 10. Report\n const report = buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: (!gitResult || gitResult.committed),\n published: publishResult.published,\n alreadyPublished: publishResult.alreadyPublished,\n skipped: publishResult.skipped,\n changelog: changelogMd || undefined,\n git: gitResult,\n timingMs: Date.now() - startTime,\n });\n\n // Save report\n const scopeDir = scope ? scope.replace(/[@/]/g, '-').replace(/^-/, '') : 'root';\n const historyDir = join(repoRoot, '.kb', 'release', 'history', scopeDir, new Date().toISOString().replace(/[:.]/g, '-'));\n await mkdir(historyDir, { recursive: true });\n await writeFile(join(historyDir, 'report.json'), JSON.stringify(report, null, 2), 'utf-8');\n\n return { success: report.result.ok, plan, report };\n}\n\n/**\n * Quick pre-flight check: verify npm credentials are valid.\n * Uses the registry HTTP API directly — works regardless of .npmrc config.\n * Returns an error string on failure, null on success.\n */\nasync function verifyNpmAuth(registry: string): Promise<string | null> {\n const token = useEnv('NPM_TOKEN') ?? useEnv('NODE_AUTH_TOKEN');\n if (!token) {\n return 'NPM_TOKEN or NODE_AUTH_TOKEN environment variable is not set';\n }\n try {\n const res = await fetch(`${registry}/-/whoami`, {\n headers: { Authorization: `Bearer ${token}` },\n signal: AbortSignal.timeout(8000),\n });\n if (!res.ok) {\n return `npm token invalid or expired (HTTP ${res.status} from ${registry})`;\n }\n return null;\n } catch (e) {\n return `npm registry unreachable: ${e instanceof Error ? e.message : String(e)}`;\n }\n}\n\nfunction buildReport(\n stage: ReleaseStage,\n plan: ReleasePlan,\n repoRoot: string,\n dryRun: boolean,\n startTime: number,\n result: Partial<ReleaseResult> & { ok: boolean; timingMs: number },\n): ReleaseReport {\n return {\n schemaVersion: '1.0',\n ts: new Date().toISOString(),\n context: { repo: repoRoot, cwd: repoRoot, branch: 'unknown', dryRun },\n stage,\n plan,\n result: { ...result, timingMs: result.timingMs ?? (Date.now() - startTime) },\n };\n}\n","/**\n * Scope utilities — resolve scope name to filesystem path.\n *\n * \"scope\" is a filter/selector concept (e.g. \"@kb-labs/release-manager\", \"installer/kb-labs-create\").\n * \"scopePath\" is the resolved absolute filesystem path used for checks (runIn: scopePath) and git ops.\n *\n * Discovery (planRelease) always uses repoRoot + scope filter — never scopePath directly.\n */\n\nimport { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\n/**\n * Resolve a scope name to an absolute filesystem path.\n *\n * - 'root' → repoRoot\n * - '@kb-labs/foo' → directory containing package.json with that name\n * - 'installer/kb-labs-create' → repoRoot/installer/kb-labs-create (direct path)\n *\n * Used only where a physical path is required:\n * - checks with runIn: 'scopePath'\n * - git commit/tag cwd\n * - changelog gitCwd\n *\n * NOT used for package discovery — planRelease always takes (repoRoot, scope).\n */\nexport async function resolveScopePath(repoRoot: string, scope: string): Promise<string> {\n if (!scope || scope === 'root') {\n return repoRoot;\n }\n\n // Scoped npm package name → scan package.json files\n if (scope.startsWith('@')) {\n const packageJsonPaths = await globby('**/package.json', {\n cwd: repoRoot,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.*/**'],\n });\n\n for (const pkgJsonPath of packageJsonPaths) {\n try {\n const pkg = JSON.parse(await readFile(pkgJsonPath, 'utf-8'));\n if (pkg.name === scope) {\n return join(pkgJsonPath, '..');\n }\n } catch { /* skip */ }\n }\n }\n\n // Direct relative path (e.g. 'installer/kb-labs-create', 'plugins/kb-labs-mind')\n return join(repoRoot, scope);\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/release-manager-core",
3
3
  "description": "KB Labs Release Manager - core orchestration, planning, versioning, and publishing",
4
- "version": "2.109.0",
4
+ "version": "2.110.0",
5
5
  "type": "module",
6
6
  "author": {
7
7
  "name": "Kirill Baranov",