@kb-labs/release-manager-core 2.117.0 → 2.118.1
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.js +18 -4
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1181,12 +1181,12 @@ async function runTsupSafeBuild(packagePath, packageName, shell) {
|
|
|
1181
1181
|
}
|
|
1182
1182
|
}
|
|
1183
1183
|
async function runDirectBuild(packagePath, packageName, shell) {
|
|
1184
|
-
const result = await executeCommand(shell, "pnpm", ["run", "build"], packagePath, 5 * 60 * 1e3);
|
|
1184
|
+
const result = await executeCommand(shell, "pnpm", ["run", "build"], packagePath, 5 * 60 * 1e3, { NODE_ENV: "production" });
|
|
1185
1185
|
return { ...result, name: packageName };
|
|
1186
1186
|
}
|
|
1187
|
-
async function executeCommand(shell, command, args, cwd, timeoutMs) {
|
|
1187
|
+
async function executeCommand(shell, command, args, cwd, timeoutMs, env) {
|
|
1188
1188
|
const startTime = Date.now();
|
|
1189
|
-
const result = await shell.exec(command, args, { cwd, timeout: timeoutMs });
|
|
1189
|
+
const result = await shell.exec(command, args, { cwd, timeout: timeoutMs, ...env ? { env } : {} });
|
|
1190
1190
|
const exitCode = result.code;
|
|
1191
1191
|
const combined = (result.stderr || result.stdout).trim();
|
|
1192
1192
|
return {
|
|
@@ -1515,11 +1515,25 @@ async function verifyOneAgainstRegistry(pkg, registry, timeout, retries, retryDe
|
|
|
1515
1515
|
try {
|
|
1516
1516
|
mkdirSync(tmpDir, { recursive: true });
|
|
1517
1517
|
const spec = `${pkg.name}@${pkg.version}`;
|
|
1518
|
-
|
|
1518
|
+
let packResult = spawnSync(
|
|
1519
1519
|
"npm",
|
|
1520
1520
|
["pack", spec, "--registry", registry, "--pack-destination", tmpDir],
|
|
1521
1521
|
{ stdio: "pipe", timeout }
|
|
1522
1522
|
);
|
|
1523
|
+
for (let attempt = 0; packResult.status !== 0 && attempt < retries; attempt++) {
|
|
1524
|
+
const delay = retryDelaysMs[Math.min(attempt, retryDelaysMs.length - 1)];
|
|
1525
|
+
logger?.warn?.(
|
|
1526
|
+
`${spec} is visible on ${registry} but \`npm pack\` still can't fetch it (attempt ${attempt + 1}/${retries + 1}), retrying in ${(delay / 1e3).toFixed(0)}s \u2014 likely tarball CDN propagation lag`
|
|
1527
|
+
);
|
|
1528
|
+
await new Promise((r) => {
|
|
1529
|
+
setTimeout(r, delay);
|
|
1530
|
+
});
|
|
1531
|
+
packResult = spawnSync(
|
|
1532
|
+
"npm",
|
|
1533
|
+
["pack", spec, "--registry", registry, "--pack-destination", tmpDir],
|
|
1534
|
+
{ stdio: "pipe", timeout }
|
|
1535
|
+
);
|
|
1536
|
+
}
|
|
1523
1537
|
if (packResult.status !== 0) {
|
|
1524
1538
|
const stderr = packResult.stderr?.toString().trim();
|
|
1525
1539
|
issues.push(`Could not pull ${spec} back from ${registry} for verification${stderr ? `: ${stderr}` : ""}`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/versioning-strategies.ts","../src/tag.ts","../src/planner.ts","../src/checkpoint.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/clean-install-verify.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 // Idempotent retry: the planner's per-package guard (planner.ts) already\n // resolved nextVersion back to currentVersion — without a fresh bump — for\n // any package whose bump is already applied on disk. That decision must\n // survive lockstep resolution unchanged: re-deriving nextVersion from\n // currentVersion here would bump a SECOND time on top of an already-applied\n // bump, producing a git tag/commit one version ahead of what's actually in\n // package.json.\n //\n // Both signals matter, and `isPublished` alone is NOT sufficient:\n // - isPublished — bump applied AND live on npm (publish succeeded, only\n // git commit/tag remains).\n // - versionPinned — bump applied on disk, not yet published. This is the\n // ordinary `release:version` → `release:git` handoff,\n // where nothing is on npm yet. Gating on isPublished\n // alone let this case fall through to a second bump.\n const pinned = packages.filter(p => p.isPublished || p.versionPinned);\n if (pinned.length > 0) {\n // In lockstep every package shares one version, so the already-resolved\n // ones must agree. If they don't, the plan is incoherent — fail here with\n // the actual versions rather than silently collapsing to the max and\n // tripping assertTagVersionsMatchDisk() later, after the commit is made.\n const resolved = [...new Set(pinned.map(p => p.nextVersion))];\n if (resolved.length > 1) {\n const detail = pinned.map(p => `${p.name}@${p.nextVersion}`).join(', ');\n throw new Error(\n `Lockstep release has conflicting already-resolved versions: ${resolved.join(', ')} (${detail}). ` +\n 'Reconcile package.json versions before releasing.',\n );\n }\n const sharedVersion = resolved[0]!;\n return packages.map(pkg => ({ ...pkg, nextVersion: sharedVersion }));\n }\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 * 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 * 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';\nimport { buildReleaseTag } from './tag';\n\n/**\n * Find the most recent git tag for a package.\n * When a flow is active, the pipeline's own tags follow `{flow}-v{version}`\n * (see tag.ts) — that pattern is tried FIRST via `flowTagGlob` (e.g.\n * `platform-v*`), since neither of the two fallbacks below ever matches it:\n * `pkgName@*` only matches legacy per-package scoped tags, and `v*` only\n * matches a bare lockstep tag with no flow prefix. Without this, bump\n * detection silently falls back to `v*` (or no tag at all) and scans commits\n * since a much older, unrelated release.\n */\nasync function findLastReleaseTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n flowTagGlob?: string,\n): Promise<string | null> {\n try {\n if (flowTagGlob) {\n const flowTags = await git.tags(['--sort=-version:refname', '--list', flowTagGlob]);\n if (flowTags.all.length > 0) {\n return flowTags.all[0]!;\n }\n }\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 flowTagGlob?: string,\n): Promise<string[]> {\n const lastTag = await findLastReleaseTag(git, pkgName, flowTagGlob);\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\nexport interface PlannerOptions {\n cwd: string;\n config: ReleaseConfig;\n scope?: string;\n /** Named flow — selects a release config profile. Packages/versioning replace global values; checks are additive. */\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 replaces packages/versioningStrategy and adds to checks. Matching check\n * ids override the global definition so a flow can make one gate stricter\n * without accidentally removing the global release contract.\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 && {\n checks: [...new Map([...(config.checks ?? []), ...flow.checks].map(check => [check.id, check])).values()],\n }),\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 // This flow's own tag glob (e.g. `platform-v*`), so bump detection looks\n // for commits since the tag THIS pipeline actually creates (see tag.ts)\n // instead of falling back to an unrelated/stale tag pattern.\n const flowTagGlob = options.flow\n ? buildReleaseTag(options.flow, '*', config.flows?.[options.flow]?.tagPattern)\n : undefined;\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, flowTagGlob);\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 beyond HEAD — by a previous\n // partial run, or by an earlier step in this same pipeline (e.g.\n // `release:version` ran before `release:git` re-plans) — trust that\n // version instead of computing another bump on top of it. Without this,\n // a fresh plan computed after an out-of-band bump silently drifts one\n // version past what's actually on disk: the tag/commit-message end up\n // one version ahead of what gets committed. assertTagVersionsMatchDisk()\n // in publisher.ts is the last-resort guard for this, but it only fires\n // right before tagging — after the (wrongly labeled) commit already\n // happened. isVersionPublished() is still checked, but only to populate\n // the informational `isPublished` field — not to gate the reuse.\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 const alreadyPublished = await isVersionPublished(pkg.name, pkg.currentVersion, registry);\n planPackages.push({\n ...pkg,\n gitRoot,\n nextVersion: pkg.currentVersion,\n bump: detectBumpType(headVersion, pkg.currentVersion),\n isPublished: alreadyPublished,\n // Mark the version as final so lockstep/adaptive resolution below\n // doesn't re-derive (and thus re-bump) it. `isPublished` alone is not\n // enough to signal this: the bump can legitimately be on disk but not\n // yet published — exactly the `release:version` → `release:git` case.\n versionPinned: true,\n });\n continue;\n }\n\n const nextVersion = await computeNextVersion(\n pkg.path,\n pkg.currentVersion,\n bump,\n git,\n gitCwd,\n pkg.name,\n flowTagGlob,\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 flow: options.flow,\n scope,\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 flowTagGlob?: string,\n): Promise<PackageVersion[]> {\n // `git status` is repository-wide. Running it once per package made planning\n // scale linearly in process launches before we even inspected release tags.\n const status = await git.status();\n const changedPaths = status.files.map(file => file.path);\n\n return (await Promise.all(packages.map(async (pkg) => {\n const pkgRel = relative(resolve(cwd), resolve(pkg.path));\n const hasUncommitted = changedPaths.some(path => path === pkgRel || path.startsWith(pkgRel + '/'));\n if (hasUncommitted) {\n return pkg;\n }\n\n const commits = await getCommitsSinceTag(git, pkg.name, pkgRel, flowTagGlob);\n return commits.length > 0 ? pkg : null;\n }))).filter((pkg): pkg is PackageVersion => pkg !== null);\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 flowTagGlob?: string,\n): Promise<string> {\n if (bump === 'auto') {\n const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd, pkgName, flowTagGlob);\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 flowTagGlob?: string,\n): Promise<'major' | 'minor' | 'patch'> {\n try {\n const relPath = relative(resolve(gitCwd), resolve(packagePath));\n const messages = await getCommitsSinceTag(git, pkgName, relPath, flowTagGlob);\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 * 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 * 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/**\n * Release commit ranges can overlap when several lockstep releases are\n * prepared in quick succession. Keep the root changelog readable by not\n * repeating an identical change that is already recorded in its history.\n * Package changelogs intentionally keep their flow-local history untouched.\n */\nfunction removeHistoricalDuplicateBullets(existingChangelog: string, newBlock: string): string {\n const historicalBullets = new Set(\n existingChangelog\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.startsWith('- ')),\n );\n\n return newBlock\n .split('\\n')\n .filter(line => !line.trim().startsWith('- ') || !historicalBullets.has(line.trim()))\n .join('\\n');\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 // A retry must replace the current version with the complete generated\n // block; only a genuinely new version is filtered against older history.\n const deduplicatedBlock = versionPattern.test(existingChangelog)\n ? changelog.trim()\n : removeHistoricalDuplicateBullets(existingChangelog, changelog.trim());\n const updatedChangelog = mergeChangelogBlock(existingChangelog, deduplicatedBlock, 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 * Guard against creating a git tag whose embedded version doesn't match\n * what was actually just committed to package.json — see the call site in\n * commitAndTagRelease() for why this can drift despite the commit step\n * having \"just\" written these exact versions.\n */\nasync function assertTagVersionsMatchDisk(pkgs: PackageVersion[]): Promise<void> {\n const mismatches: string[] = [];\n for (const pkg of pkgs) {\n const packageJsonPath = join(pkg.path, 'package.json');\n const onDiskVersion = (JSON.parse(await readFile(packageJsonPath, 'utf-8')) as { version?: string }).version;\n if (onDiskVersion !== pkg.nextVersion) {\n mismatches.push(`${pkg.name}: tag would say ${pkg.nextVersion}, package.json says ${onDiskVersion ?? '<missing>'}`);\n }\n }\n if (mismatches.length > 0) {\n throw new Error(\n `Refusing to create a git tag that doesn't match the committed package.json version(s):\\n ${mismatches.join('\\n ')}`,\n );\n }\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 // The tag name is built from plan.packages[*].nextVersion, but the\n // git commit just above staged whatever updatePackageVersions()\n // (called earlier in the pipeline) wrote to disk. Those two are\n // normally the same value — but an idempotent-retry guard elsewhere\n // in the pipeline can legitimately resolve nextVersion back to an\n // already-published currentVersion for a package on a retry,\n // without this run knowing to also re-tag. Left unchecked, that\n // produces a real git tag whose version doesn't match what's\n // actually committed under it (observed live: `sdk-v2.116.0`\n // pointing at a commit where package.json said `2.115.0`). Fail\n // loudly here rather than push a tag nobody can trust.\n await assertTagVersionsMatchDisk(pkgs);\n\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 * 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 { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport type { BuildResult, PackageVersion, PluginLogger, ReleaseShell } 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 shell: ReleaseShell;\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, options.shell);\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, shell: ReleaseShell): 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, shell);\n }\n\n return runDirectBuild(packagePath, packageName, shell);\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, shell: ReleaseShell): 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 executeCommand(shell, 'npx', ['tsup', '-d', tempDir], packagePath, 5 * 60 * 1000);\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, shell: ReleaseShell): Promise<BuildResult> {\n const result = await executeCommand(shell, 'pnpm', ['run', 'build'], packagePath, 5 * 60 * 1000);\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 */\nasync function executeCommand(shell: ReleaseShell, command: string, args: string[], cwd: string, timeoutMs: number): Promise<SpawnResult> {\n const startTime = Date.now();\n const result = await shell.exec(command, args, { cwd, timeout: timeoutMs });\n const exitCode = result.code;\n const combined = (result.stderr || result.stdout).trim();\n return {\n success: result.ok,\n error: result.ok ? undefined : combined.split('\\n').slice(-30).join('\\n') || `Build failed with exit code ${exitCode}`,\n durationMs: Date.now() - startTime,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode,\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, ReleaseShell } from './types';\n\nexport interface CheckRunnerOptions {\n repoRoot: string;\n packagePaths: string[];\n scopePath?: string;\n logger?: Pick<PluginLogger, 'info' | 'warn'>;\n shell: ReleaseShell;\n}\n\n/**\n * Max parallel shell.exec calls for perPackage checks.\n * Must match the plugin manifest's `shell.maxConcurrent` permission\n * (plugins/release/manager-cli/src/manifest.ts) — the platform's process\n * broker admits at most that many concurrent shells for this plugin, so\n * batching above it just queues and can blow the per-check timeout.\n *\n * Kept low (not e.g. 8) because pack-install is not a cheap script: it packs\n * the tarball and runs a real `npm install` of it into a throwaway consumer\n * per package. At higher concurrency those installs contend for CPU/disk/npm\n * registry and start blowing their own per-check timeout under load.\n */\nexport const CHECKS_CONCURRENCY = 2;\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, bounded by the plugin's granted shell concurrency;\n // single-path checks run sequentially.\n const resolvedArgs = (check.args ?? []).map(arg =>\n arg.match(/\\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg\n );\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 startedAt = Date.now();\n const result = await options.shell.exec(check.command, resolvedArgs, { cwd: pkgPath, timeout: timeoutMs });\n const ok = evaluateParser(check, result.stdout, result.stderr, result.code);\n return {\n path: pkgPath,\n ok,\n durationMs: Date.now() - startedAt,\n details: {\n packagePath: pkgPath,\n stdout: result.stdout || undefined,\n stderr: result.stderr || undefined,\n exitCode: result.code,\n error: !ok ? `exit code ${result.code}` : 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 += CHECKS_CONCURRENCY) {\n const batch = pathsToRun.slice(i, i + CHECKS_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 optional: check.optional,\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 issues.push(...findForbiddenDependencyProtocols(extractedPkg));\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\n/**\n * These protocols are workspace-only and cannot be consumed from a public\n * registry. Checking the extracted package (rather than the source manifest)\n * makes this a release-artifact contract and catches the exact bytes a user\n * would install.\n */\nexport function findForbiddenDependencyProtocols(pkg: PkgJson): string[] {\n const issues: string[] = [];\n for (const section of ['dependencies', 'optionalDependencies', 'peerDependencies', 'devDependencies'] as const) {\n const deps = pkg[section];\n if (!deps || typeof deps !== 'object') { continue; }\n for (const [name, value] of Object.entries(deps as Record<string, unknown>)) {\n if (typeof value !== 'string') { continue; }\n const protocol = ['workspace:', 'link:', 'file:'].find(prefix => value.startsWith(prefix));\n if (protocol) {\n issues.push(`${section}.${name} uses forbidden ${protocol} dependency protocol (${value})`);\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 dependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n devDependencies?: Record<string, 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, options,\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 shell: options.shell,\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, shell: options.shell });\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 * Verify a packed tarball actually installs — and imports — in a clean,\n * outside-the-workspace consumer. This is the strongest guarantee available:\n * it catches everything the static findForbiddenDependencyProtocols() check\n * can (a literal workspace:/link:/file: protocol) PLUS classes that check\n * can't, most importantly an already-published PEER dependency that is\n * itself broken (npm auto-installs peers, so a bad manifest several levels\n * deep in someone else's graph fails this package's install too).\n *\n * The package manager is configurable. pnpm is the platform default and is\n * used for the monorepo release flow; npm remains available for projects that\n * explicitly publish with npm.\n */\n\nimport { mkdtempSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { spawnSync } from 'node:child_process';\n\nexport interface CleanInstallResult {\n ok: boolean;\n /** Human-readable reason, always populated when ok is false. */\n error?: string;\n}\n\n/**\n * Install `tarballPath` into a throwaway consumer project (outside the\n * monorepo workspace, so pnpm's workspace resolution can't mask a problem)\n * and confirm `packageName` can actually be imported afterward.\n */\nexport async function verifyCleanInstall(\n tarballPath: string,\n packageName: string,\n additionalTarballs: string[] = [],\n packageManager: 'pnpm' | 'npm' = 'npm',\n): Promise<CleanInstallResult> {\n const consumerDir = mkdtempSync(join(tmpdir(), 'kb-clean-install-'));\n try {\n if (packageManager === 'pnpm') {\n const stagedTarballs = [tarballPath, ...additionalTarballs];\n const targetName = readPackedPackageName(tarballPath);\n if (!targetName) {\n return { ok: false, error: `install failed: cannot read package name from ${tarballPath}` };\n }\n const dependencies: Record<string, string> = { [targetName]: `file:${tarballPath}` };\n const overrides: Record<string, string> = {};\n for (const stagedTarball of stagedTarballs) {\n const name = readPackedPackageName(stagedTarball);\n if (!name) {\n return { ok: false, error: `install failed: cannot read package name from ${stagedTarball}` };\n }\n overrides[name] = `file:${stagedTarball}`;\n }\n writeFileSync(\n join(consumerDir, 'package.json'),\n JSON.stringify({ name: 'kb-release-consumer', private: true, dependencies, pnpm: { overrides } }, null, 2) + '\\n',\n );\n const install = spawnSync(\n 'pnpm',\n ['install', '--ignore-scripts', '--no-lockfile', '--config.auto-install-peers=true'],\n { cwd: consumerDir, stdio: 'pipe', timeout: 120_000 },\n );\n if (install.status !== 0) {\n return { ok: false, error: `install failed: ${describeProcessFailure(install)}` };\n }\n } else {\n writeFileSync(join(consumerDir, 'package.json'), JSON.stringify({ name: 'kb-release-consumer', private: true }) + '\\n');\n // Lazy import: Arborist is only needed for the explicit npm path.\n const { Arborist } = await import('@npmcli/arborist');\n const arb = new Arborist({ path: consumerDir, ignoreScripts: true });\n try {\n await arb.reify({ add: [tarballPath, ...additionalTarballs], save: false });\n } catch (err) {\n return { ok: false, error: `install failed: ${describeArboristError(err)}` };\n }\n }\n\n const importCheck = spawnSync(\n 'node',\n ['--input-type=module', '-e', 'await import(process.argv[1])', packageName],\n { cwd: consumerDir, stdio: 'pipe', timeout: 15_000 },\n );\n if (importCheck.status !== 0) {\n const stderr = importCheck.stderr?.toString().trim();\n return { ok: false, error: `clean consumer cannot import ${packageName}${stderr ? `: ${stderr}` : ''}` };\n }\n\n return { ok: true };\n } finally {\n rmSync(consumerDir, { recursive: true, force: true });\n }\n}\n\nfunction readPackedPackageName(tarballPath: string): string | undefined {\n const result = spawnSync('tar', ['xOf', tarballPath, 'package/package.json'], { stdio: 'pipe' });\n if (result.status !== 0) { return undefined; }\n try {\n const manifest = JSON.parse(result.stdout.toString()) as { name?: unknown };\n return typeof manifest.name === 'string' ? manifest.name : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Arborist errors are plain Error instances with a useful .message and,\n * for npm-package-arg failures, a .code (e.g. EUNSUPPORTEDPROTOCOL). Surface\n * both — the code alone (\"EUNSUPPORTEDPROTOCOL\") is what npm's own debug log\n * would have shown if it hadn't swallowed the message entirely.\n */\nfunction describeArboristError(err: unknown): string {\n if (err instanceof Error) {\n const code = (err as NodeJS.ErrnoException).code;\n return code ? `[${code}] ${err.message}` : err.message;\n }\n return String(err);\n}\n\nfunction describeProcessFailure(result: { stderr?: Buffer | string; stdout?: Buffer | string; status: number | null }): string {\n const stderr = result.stderr?.toString().trim();\n const stdout = result.stdout?.toString().trim();\n return stderr || stdout || `package manager exited with code ${result.status ?? 'unknown'}`;\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/tag.ts","../src/planner.ts","../src/checkpoint.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/clean-install-verify.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 // Idempotent retry: the planner's per-package guard (planner.ts) already\n // resolved nextVersion back to currentVersion — without a fresh bump — for\n // any package whose bump is already applied on disk. That decision must\n // survive lockstep resolution unchanged: re-deriving nextVersion from\n // currentVersion here would bump a SECOND time on top of an already-applied\n // bump, producing a git tag/commit one version ahead of what's actually in\n // package.json.\n //\n // Both signals matter, and `isPublished` alone is NOT sufficient:\n // - isPublished — bump applied AND live on npm (publish succeeded, only\n // git commit/tag remains).\n // - versionPinned — bump applied on disk, not yet published. This is the\n // ordinary `release:version` → `release:git` handoff,\n // where nothing is on npm yet. Gating on isPublished\n // alone let this case fall through to a second bump.\n const pinned = packages.filter(p => p.isPublished || p.versionPinned);\n if (pinned.length > 0) {\n // In lockstep every package shares one version, so the already-resolved\n // ones must agree. If they don't, the plan is incoherent — fail here with\n // the actual versions rather than silently collapsing to the max and\n // tripping assertTagVersionsMatchDisk() later, after the commit is made.\n const resolved = [...new Set(pinned.map(p => p.nextVersion))];\n if (resolved.length > 1) {\n const detail = pinned.map(p => `${p.name}@${p.nextVersion}`).join(', ');\n throw new Error(\n `Lockstep release has conflicting already-resolved versions: ${resolved.join(', ')} (${detail}). ` +\n 'Reconcile package.json versions before releasing.',\n );\n }\n const sharedVersion = resolved[0]!;\n return packages.map(pkg => ({ ...pkg, nextVersion: sharedVersion }));\n }\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 * 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 * 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';\nimport { buildReleaseTag } from './tag';\n\n/**\n * Find the most recent git tag for a package.\n * When a flow is active, the pipeline's own tags follow `{flow}-v{version}`\n * (see tag.ts) — that pattern is tried FIRST via `flowTagGlob` (e.g.\n * `platform-v*`), since neither of the two fallbacks below ever matches it:\n * `pkgName@*` only matches legacy per-package scoped tags, and `v*` only\n * matches a bare lockstep tag with no flow prefix. Without this, bump\n * detection silently falls back to `v*` (or no tag at all) and scans commits\n * since a much older, unrelated release.\n */\nasync function findLastReleaseTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n flowTagGlob?: string,\n): Promise<string | null> {\n try {\n if (flowTagGlob) {\n const flowTags = await git.tags(['--sort=-version:refname', '--list', flowTagGlob]);\n if (flowTags.all.length > 0) {\n return flowTags.all[0]!;\n }\n }\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 flowTagGlob?: string,\n): Promise<string[]> {\n const lastTag = await findLastReleaseTag(git, pkgName, flowTagGlob);\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\nexport interface PlannerOptions {\n cwd: string;\n config: ReleaseConfig;\n scope?: string;\n /** Named flow — selects a release config profile. Packages/versioning replace global values; checks are additive. */\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 replaces packages/versioningStrategy and adds to checks. Matching check\n * ids override the global definition so a flow can make one gate stricter\n * without accidentally removing the global release contract.\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 && {\n checks: [...new Map([...(config.checks ?? []), ...flow.checks].map(check => [check.id, check])).values()],\n }),\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 // This flow's own tag glob (e.g. `platform-v*`), so bump detection looks\n // for commits since the tag THIS pipeline actually creates (see tag.ts)\n // instead of falling back to an unrelated/stale tag pattern.\n const flowTagGlob = options.flow\n ? buildReleaseTag(options.flow, '*', config.flows?.[options.flow]?.tagPattern)\n : undefined;\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, flowTagGlob);\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 beyond HEAD — by a previous\n // partial run, or by an earlier step in this same pipeline (e.g.\n // `release:version` ran before `release:git` re-plans) — trust that\n // version instead of computing another bump on top of it. Without this,\n // a fresh plan computed after an out-of-band bump silently drifts one\n // version past what's actually on disk: the tag/commit-message end up\n // one version ahead of what gets committed. assertTagVersionsMatchDisk()\n // in publisher.ts is the last-resort guard for this, but it only fires\n // right before tagging — after the (wrongly labeled) commit already\n // happened. isVersionPublished() is still checked, but only to populate\n // the informational `isPublished` field — not to gate the reuse.\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 const alreadyPublished = await isVersionPublished(pkg.name, pkg.currentVersion, registry);\n planPackages.push({\n ...pkg,\n gitRoot,\n nextVersion: pkg.currentVersion,\n bump: detectBumpType(headVersion, pkg.currentVersion),\n isPublished: alreadyPublished,\n // Mark the version as final so lockstep/adaptive resolution below\n // doesn't re-derive (and thus re-bump) it. `isPublished` alone is not\n // enough to signal this: the bump can legitimately be on disk but not\n // yet published — exactly the `release:version` → `release:git` case.\n versionPinned: true,\n });\n continue;\n }\n\n const nextVersion = await computeNextVersion(\n pkg.path,\n pkg.currentVersion,\n bump,\n git,\n gitCwd,\n pkg.name,\n flowTagGlob,\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 flow: options.flow,\n scope,\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 flowTagGlob?: string,\n): Promise<PackageVersion[]> {\n // `git status` is repository-wide. Running it once per package made planning\n // scale linearly in process launches before we even inspected release tags.\n const status = await git.status();\n const changedPaths = status.files.map(file => file.path);\n\n return (await Promise.all(packages.map(async (pkg) => {\n const pkgRel = relative(resolve(cwd), resolve(pkg.path));\n const hasUncommitted = changedPaths.some(path => path === pkgRel || path.startsWith(pkgRel + '/'));\n if (hasUncommitted) {\n return pkg;\n }\n\n const commits = await getCommitsSinceTag(git, pkg.name, pkgRel, flowTagGlob);\n return commits.length > 0 ? pkg : null;\n }))).filter((pkg): pkg is PackageVersion => pkg !== null);\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 flowTagGlob?: string,\n): Promise<string> {\n if (bump === 'auto') {\n const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd, pkgName, flowTagGlob);\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 flowTagGlob?: string,\n): Promise<'major' | 'minor' | 'patch'> {\n try {\n const relPath = relative(resolve(gitCwd), resolve(packagePath));\n const messages = await getCommitsSinceTag(git, pkgName, relPath, flowTagGlob);\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 * 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 * 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/**\n * Release commit ranges can overlap when several lockstep releases are\n * prepared in quick succession. Keep the root changelog readable by not\n * repeating an identical change that is already recorded in its history.\n * Package changelogs intentionally keep their flow-local history untouched.\n */\nfunction removeHistoricalDuplicateBullets(existingChangelog: string, newBlock: string): string {\n const historicalBullets = new Set(\n existingChangelog\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.startsWith('- ')),\n );\n\n return newBlock\n .split('\\n')\n .filter(line => !line.trim().startsWith('- ') || !historicalBullets.has(line.trim()))\n .join('\\n');\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 // A retry must replace the current version with the complete generated\n // block; only a genuinely new version is filtered against older history.\n const deduplicatedBlock = versionPattern.test(existingChangelog)\n ? changelog.trim()\n : removeHistoricalDuplicateBullets(existingChangelog, changelog.trim());\n const updatedChangelog = mergeChangelogBlock(existingChangelog, deduplicatedBlock, 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 * Guard against creating a git tag whose embedded version doesn't match\n * what was actually just committed to package.json — see the call site in\n * commitAndTagRelease() for why this can drift despite the commit step\n * having \"just\" written these exact versions.\n */\nasync function assertTagVersionsMatchDisk(pkgs: PackageVersion[]): Promise<void> {\n const mismatches: string[] = [];\n for (const pkg of pkgs) {\n const packageJsonPath = join(pkg.path, 'package.json');\n const onDiskVersion = (JSON.parse(await readFile(packageJsonPath, 'utf-8')) as { version?: string }).version;\n if (onDiskVersion !== pkg.nextVersion) {\n mismatches.push(`${pkg.name}: tag would say ${pkg.nextVersion}, package.json says ${onDiskVersion ?? '<missing>'}`);\n }\n }\n if (mismatches.length > 0) {\n throw new Error(\n `Refusing to create a git tag that doesn't match the committed package.json version(s):\\n ${mismatches.join('\\n ')}`,\n );\n }\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 // The tag name is built from plan.packages[*].nextVersion, but the\n // git commit just above staged whatever updatePackageVersions()\n // (called earlier in the pipeline) wrote to disk. Those two are\n // normally the same value — but an idempotent-retry guard elsewhere\n // in the pipeline can legitimately resolve nextVersion back to an\n // already-published currentVersion for a package on a retry,\n // without this run knowing to also re-tag. Left unchecked, that\n // produces a real git tag whose version doesn't match what's\n // actually committed under it (observed live: `sdk-v2.116.0`\n // pointing at a commit where package.json said `2.115.0`). Fail\n // loudly here rather than push a tag nobody can trust.\n await assertTagVersionsMatchDisk(pkgs);\n\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 * 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 { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport type { BuildResult, PackageVersion, PluginLogger, ReleaseShell } 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 shell: ReleaseShell;\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, options.shell);\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, shell: ReleaseShell): 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, shell);\n }\n\n return runDirectBuild(packagePath, packageName, shell);\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, shell: ReleaseShell): 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 executeCommand(shell, 'npx', ['tsup', '-d', tempDir], packagePath, 5 * 60 * 1000);\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, shell: ReleaseShell): Promise<BuildResult> {\n // NODE_ENV=production disables Module Federation dts type generation in\n // Studio rspack configs (createStudioRemoteConfig, studio/plugin-tools) —\n // a dev-only convenience of no value here, and a reproducible source of\n // indefinite native-threadpool hangs under concurrent rspack builds. See\n // the same fix in manager-cli/src/cli/commands/build.ts for the\n // `build.script`-configured path.\n const result = await executeCommand(shell, 'pnpm', ['run', 'build'], packagePath, 5 * 60 * 1000, { NODE_ENV: 'production' });\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 */\nasync function executeCommand(shell: ReleaseShell, command: string, args: string[], cwd: string, timeoutMs: number, env?: Record<string, string>): Promise<SpawnResult> {\n const startTime = Date.now();\n const result = await shell.exec(command, args, { cwd, timeout: timeoutMs, ...(env ? { env } : {}) });\n const exitCode = result.code;\n const combined = (result.stderr || result.stdout).trim();\n return {\n success: result.ok,\n error: result.ok ? undefined : combined.split('\\n').slice(-30).join('\\n') || `Build failed with exit code ${exitCode}`,\n durationMs: Date.now() - startTime,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode,\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, ReleaseShell } from './types';\n\nexport interface CheckRunnerOptions {\n repoRoot: string;\n packagePaths: string[];\n scopePath?: string;\n logger?: Pick<PluginLogger, 'info' | 'warn'>;\n shell: ReleaseShell;\n}\n\n/**\n * Max parallel shell.exec calls for perPackage checks.\n * Must match the plugin manifest's `shell.maxConcurrent` permission\n * (plugins/release/manager-cli/src/manifest.ts) — the platform's process\n * broker admits at most that many concurrent shells for this plugin, so\n * batching above it just queues and can blow the per-check timeout.\n *\n * Kept low (not e.g. 8) because pack-install is not a cheap script: it packs\n * the tarball and runs a real `npm install` of it into a throwaway consumer\n * per package. At higher concurrency those installs contend for CPU/disk/npm\n * registry and start blowing their own per-check timeout under load.\n */\nexport const CHECKS_CONCURRENCY = 2;\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, bounded by the plugin's granted shell concurrency;\n // single-path checks run sequentially.\n const resolvedArgs = (check.args ?? []).map(arg =>\n arg.match(/\\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg\n );\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 startedAt = Date.now();\n const result = await options.shell.exec(check.command, resolvedArgs, { cwd: pkgPath, timeout: timeoutMs });\n const ok = evaluateParser(check, result.stdout, result.stderr, result.code);\n return {\n path: pkgPath,\n ok,\n durationMs: Date.now() - startedAt,\n details: {\n packagePath: pkgPath,\n stdout: result.stdout || undefined,\n stderr: result.stderr || undefined,\n exitCode: result.code,\n error: !ok ? `exit code ${result.code}` : 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 += CHECKS_CONCURRENCY) {\n const batch = pathsToRun.slice(i, i + CHECKS_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 optional: check.optional,\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 issues.push(...findForbiddenDependencyProtocols(extractedPkg));\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\n/**\n * These protocols are workspace-only and cannot be consumed from a public\n * registry. Checking the extracted package (rather than the source manifest)\n * makes this a release-artifact contract and catches the exact bytes a user\n * would install.\n */\nexport function findForbiddenDependencyProtocols(pkg: PkgJson): string[] {\n const issues: string[] = [];\n for (const section of ['dependencies', 'optionalDependencies', 'peerDependencies', 'devDependencies'] as const) {\n const deps = pkg[section];\n if (!deps || typeof deps !== 'object') { continue; }\n for (const [name, value] of Object.entries(deps as Record<string, unknown>)) {\n if (typeof value !== 'string') { continue; }\n const protocol = ['workspace:', 'link:', 'file:'].find(prefix => value.startsWith(prefix));\n if (protocol) {\n issues.push(`${section}.${name} uses forbidden ${protocol} dependency protocol (${value})`);\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 dependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n devDependencies?: Record<string, 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 // Metadata visibility (waitUntilPublished, via `npm view`) and tarball\n // fetchability (`npm pack`, below) are backed by different layers of\n // npm's infrastructure — the manifest API and the tarball CDN — with\n // independent propagation lag. A package can be `npm view`-visible\n // (waitUntilPublished already succeeded above) while `npm pack` still\n // 404s for a few more seconds. Reuse the same retry budget here instead\n // of treating the first ETARGET as final.\n const spec = `${pkg.name}@${pkg.version}`;\n let packResult = spawnSync(\n 'npm',\n ['pack', spec, '--registry', registry, '--pack-destination', tmpDir],\n { stdio: 'pipe', timeout },\n );\n\n for (let attempt = 0; packResult.status !== 0 && attempt < retries; attempt++) {\n const delay = retryDelaysMs[Math.min(attempt, retryDelaysMs.length - 1)]!;\n logger?.warn?.(\n `${spec} is visible on ${registry} but \\`npm pack\\` still can't fetch it (attempt ${attempt + 1}/${retries + 1}), ` +\n `retrying in ${(delay / 1000).toFixed(0)}s — likely tarball CDN propagation lag`,\n );\n await new Promise<void>(r => { setTimeout(r, delay); });\n packResult = spawnSync(\n 'npm',\n ['pack', spec, '--registry', registry, '--pack-destination', tmpDir],\n { stdio: 'pipe', timeout },\n );\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, options,\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 shell: options.shell,\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, shell: options.shell });\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 * Verify a packed tarball actually installs — and imports — in a clean,\n * outside-the-workspace consumer. This is the strongest guarantee available:\n * it catches everything the static findForbiddenDependencyProtocols() check\n * can (a literal workspace:/link:/file: protocol) PLUS classes that check\n * can't, most importantly an already-published PEER dependency that is\n * itself broken (npm auto-installs peers, so a bad manifest several levels\n * deep in someone else's graph fails this package's install too).\n *\n * The package manager is configurable. pnpm is the platform default and is\n * used for the monorepo release flow; npm remains available for projects that\n * explicitly publish with npm.\n */\n\nimport { mkdtempSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { spawnSync } from 'node:child_process';\n\nexport interface CleanInstallResult {\n ok: boolean;\n /** Human-readable reason, always populated when ok is false. */\n error?: string;\n}\n\n/**\n * Install `tarballPath` into a throwaway consumer project (outside the\n * monorepo workspace, so pnpm's workspace resolution can't mask a problem)\n * and confirm `packageName` can actually be imported afterward.\n */\nexport async function verifyCleanInstall(\n tarballPath: string,\n packageName: string,\n additionalTarballs: string[] = [],\n packageManager: 'pnpm' | 'npm' = 'npm',\n): Promise<CleanInstallResult> {\n const consumerDir = mkdtempSync(join(tmpdir(), 'kb-clean-install-'));\n try {\n if (packageManager === 'pnpm') {\n const stagedTarballs = [tarballPath, ...additionalTarballs];\n const targetName = readPackedPackageName(tarballPath);\n if (!targetName) {\n return { ok: false, error: `install failed: cannot read package name from ${tarballPath}` };\n }\n const dependencies: Record<string, string> = { [targetName]: `file:${tarballPath}` };\n const overrides: Record<string, string> = {};\n for (const stagedTarball of stagedTarballs) {\n const name = readPackedPackageName(stagedTarball);\n if (!name) {\n return { ok: false, error: `install failed: cannot read package name from ${stagedTarball}` };\n }\n overrides[name] = `file:${stagedTarball}`;\n }\n writeFileSync(\n join(consumerDir, 'package.json'),\n JSON.stringify({ name: 'kb-release-consumer', private: true, dependencies, pnpm: { overrides } }, null, 2) + '\\n',\n );\n const install = spawnSync(\n 'pnpm',\n ['install', '--ignore-scripts', '--no-lockfile', '--config.auto-install-peers=true'],\n { cwd: consumerDir, stdio: 'pipe', timeout: 120_000 },\n );\n if (install.status !== 0) {\n return { ok: false, error: `install failed: ${describeProcessFailure(install)}` };\n }\n } else {\n writeFileSync(join(consumerDir, 'package.json'), JSON.stringify({ name: 'kb-release-consumer', private: true }) + '\\n');\n // Lazy import: Arborist is only needed for the explicit npm path.\n const { Arborist } = await import('@npmcli/arborist');\n const arb = new Arborist({ path: consumerDir, ignoreScripts: true });\n try {\n await arb.reify({ add: [tarballPath, ...additionalTarballs], save: false });\n } catch (err) {\n return { ok: false, error: `install failed: ${describeArboristError(err)}` };\n }\n }\n\n const importCheck = spawnSync(\n 'node',\n ['--input-type=module', '-e', 'await import(process.argv[1])', packageName],\n { cwd: consumerDir, stdio: 'pipe', timeout: 15_000 },\n );\n if (importCheck.status !== 0) {\n const stderr = importCheck.stderr?.toString().trim();\n return { ok: false, error: `clean consumer cannot import ${packageName}${stderr ? `: ${stderr}` : ''}` };\n }\n\n return { ok: true };\n } finally {\n rmSync(consumerDir, { recursive: true, force: true });\n }\n}\n\nfunction readPackedPackageName(tarballPath: string): string | undefined {\n const result = spawnSync('tar', ['xOf', tarballPath, 'package/package.json'], { stdio: 'pipe' });\n if (result.status !== 0) { return undefined; }\n try {\n const manifest = JSON.parse(result.stdout.toString()) as { name?: unknown };\n return typeof manifest.name === 'string' ? manifest.name : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Arborist errors are plain Error instances with a useful .message and,\n * for npm-package-arg failures, a .code (e.g. EUNSUPPORTEDPROTOCOL). Surface\n * both — the code alone (\"EUNSUPPORTEDPROTOCOL\") is what npm's own debug log\n * would have shown if it hadn't swallowed the message entirely.\n */\nfunction describeArboristError(err: unknown): string {\n if (err instanceof Error) {\n const code = (err as NodeJS.ErrnoException).code;\n return code ? `[${code}] ${err.message}` : err.message;\n }\n return String(err);\n}\n\nfunction describeProcessFailure(result: { stderr?: Buffer | string; stdout?: Buffer | string; status: number | null }): string {\n const stderr = result.stderr?.toString().trim();\n const stdout = result.stdout?.toString().trim();\n return stderr || stdout || `package manager exited with code ${result.status ?? 'unknown'}`;\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.
|
|
4
|
+
"version": "2.118.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Kirill Baranov",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"globby": "^11.0.0",
|
|
28
28
|
"semver": "^7.6.3",
|
|
29
29
|
"simple-git": "^3.36.0",
|
|
30
|
-
"@kb-labs/sdk": "2.115.
|
|
30
|
+
"@kb-labs/sdk": "2.115.3"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/fs-extra": "^11.0.0",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"tsup": "^8.5.0",
|
|
40
40
|
"typescript": "^5.6.3",
|
|
41
41
|
"vitest": "^3.2.6",
|
|
42
|
-
"@kb-labs/devkit": "2.
|
|
42
|
+
"@kb-labs/devkit": "2.118.1"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|
|
45
45
|
"node": ">=22.0.0",
|