@kb-labs/release-manager-core 2.12.0 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +36 -15
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -651,16 +651,36 @@ async function commitAndTagRelease(options) {
|
|
|
651
651
|
}
|
|
652
652
|
try {
|
|
653
653
|
const commitMessage = createCommitMessage(plan);
|
|
654
|
+
const pkgToRoot = /* @__PURE__ */ new Map();
|
|
654
655
|
for (const pkg of plan.packages) {
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
656
|
+
try {
|
|
657
|
+
const root = (await simpleGit2(pkg.path).revparse(["--show-toplevel"])).trim();
|
|
658
|
+
pkgToRoot.set(pkg.path, root);
|
|
659
|
+
} catch {
|
|
660
|
+
pkgToRoot.set(pkg.path, pkg.path);
|
|
660
661
|
}
|
|
661
|
-
|
|
662
|
+
}
|
|
663
|
+
const rootToPkgs = /* @__PURE__ */ new Map();
|
|
664
|
+
for (const pkg of plan.packages) {
|
|
665
|
+
const root = pkgToRoot.get(pkg.path);
|
|
666
|
+
const list = rootToPkgs.get(root) ?? [];
|
|
667
|
+
list.push(pkg);
|
|
668
|
+
rootToPkgs.set(root, list);
|
|
669
|
+
}
|
|
670
|
+
for (const [root, pkgs] of rootToPkgs) {
|
|
671
|
+
const rootGit = simpleGit2(root);
|
|
672
|
+
const filesToStage = [];
|
|
673
|
+
for (const pkg of pkgs) {
|
|
674
|
+
const rel = (p) => p.startsWith(root + "/") ? p.slice(root.length + 1) : p;
|
|
675
|
+
filesToStage.push(rel(join(pkg.path, "package.json")));
|
|
676
|
+
const changelogPath = join(pkg.path, "CHANGELOG.md");
|
|
677
|
+
if (existsSync(changelogPath)) {
|
|
678
|
+
filesToStage.push(rel(changelogPath));
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
await rootGit.add(filesToStage);
|
|
662
682
|
try {
|
|
663
|
-
await
|
|
683
|
+
await rootGit.commit(commitMessage);
|
|
664
684
|
result.committed = true;
|
|
665
685
|
} catch (commitError) {
|
|
666
686
|
const msg = commitError instanceof Error ? commitError.message : String(commitError);
|
|
@@ -669,30 +689,31 @@ async function commitAndTagRelease(options) {
|
|
|
669
689
|
}
|
|
670
690
|
}
|
|
671
691
|
}
|
|
672
|
-
const git = simpleGit2(cwd);
|
|
673
692
|
const uniqueVersions = new Set(plan.packages.map((p) => p.nextVersion));
|
|
674
693
|
const isLockstep = plan.packages.length > 1 && uniqueVersions.size === 1;
|
|
675
694
|
if (isLockstep) {
|
|
676
695
|
const version = plan.packages[0].nextVersion;
|
|
677
696
|
const tagName = `v${version}`;
|
|
678
|
-
|
|
697
|
+
for (const root of rootToPkgs.keys()) {
|
|
698
|
+
await simpleGit2(root).addTag(tagName);
|
|
699
|
+
}
|
|
679
700
|
result.tagged.push(tagName);
|
|
680
701
|
} else {
|
|
681
702
|
for (const pkg of plan.packages) {
|
|
682
|
-
const
|
|
703
|
+
const root = pkgToRoot.get(pkg.path);
|
|
683
704
|
const tagName = `${pkg.name}@${pkg.nextVersion}`;
|
|
684
|
-
await
|
|
705
|
+
await simpleGit2(root).addTag(tagName);
|
|
685
706
|
result.tagged.push(tagName);
|
|
686
707
|
}
|
|
687
708
|
}
|
|
688
709
|
const pushFlags = noVerify ? ["--no-verify"] : [];
|
|
689
710
|
const pushTagsOptions = noVerify ? ["--no-verify"] : void 0;
|
|
690
|
-
for (const
|
|
691
|
-
const
|
|
711
|
+
for (const root of rootToPkgs.keys()) {
|
|
712
|
+
const rootGit = simpleGit2(root);
|
|
692
713
|
if (result.committed) {
|
|
693
|
-
await
|
|
714
|
+
await rootGit.push(pushFlags);
|
|
694
715
|
}
|
|
695
|
-
await
|
|
716
|
+
await rootGit.pushTags(pushTagsOptions);
|
|
696
717
|
}
|
|
697
718
|
result.pushed = true;
|
|
698
719
|
} catch (error) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/versioning-strategies.ts","../src/planner.ts","../src/shell-adapter.ts","../src/publisher.ts","../src/rollback.ts","../src/runner.ts","../src/reporters/json.ts","../src/reporters/markdown.ts","../src/reporters/text.ts","../src/build.ts","../src/checks.ts","../src/verifier.ts","../src/pipeline.ts","../src/scope.ts"],"names":["semver","resolve","isPathPattern","join","readFile","simpleGit","existsSync","mkdir","writeFile","formatTiming","tmpdir","randomBytes","exports","globby"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Versioning strategies for monorepo package releases\n *\n * - lockstep: All packages get the same version (maximum bump)\n * - independent: Each package has its own version\n * - adaptive: Lockstep if breaking changes, otherwise independent\n */\n\nimport semver from 'semver';\nimport type { PackageVersion, VersionBump } from './types';\n\nexport type VersionStrategy = 'lockstep' | 'independent' | 'adaptive';\n\nexport interface StrategyOptions {\n strategy: VersionStrategy;\n umbrellaPath?: string; // path to umbrella root (for filtering)\n}\n\n/**\n * Apply versioning strategy to packages\n */\nexport function applyVersionStrategy(\n packages: PackageVersion[],\n options: StrategyOptions\n): PackageVersion[] {\n if (options.strategy === 'lockstep') {\n return applyLockstep(packages);\n }\n\n if (options.strategy === 'adaptive') {\n return applyAdaptive(packages);\n }\n\n // independent (default) - no changes needed\n return packages;\n}\n\n/**\n * Lockstep: All packages get the maximum version bump\n *\n * Example:\n * - Package A: 1.0.0 -> 1.1.0 (minor)\n * - Package B: 1.0.0 -> 2.0.0 (major)\n * Result: Both get 2.0.0 (maximum bump = major)\n */\nfunction applyLockstep(packages: PackageVersion[]): PackageVersion[] {\n if (packages.length === 0) {return packages;}\n\n // Find the maximum bump level\n const maxBump = getMaxBump(packages);\n\n // Find the highest current version\n const maxVersion = packages.reduce((max, pkg) => {\n return semver.gt(pkg.currentVersion, max) ? pkg.currentVersion : max;\n }, packages[0]!.currentVersion); // ! safe: length already checked\n\n // Compute next version from max version + max bump\n // Filter out 'auto' since semver.inc expects ReleaseType\n const releaseType = maxBump === 'auto' ? 'patch' : maxBump;\n const nextVersion = semver.inc(maxVersion, releaseType) || maxVersion;\n\n // Apply to all packages\n return packages.map(pkg => ({\n ...pkg,\n bump: maxBump,\n nextVersion,\n }));\n}\n\n/**\n * Adaptive: Lockstep if breaking changes, otherwise independent\n *\n * This is useful for umbrellas where you want to keep versions in sync\n * when there are breaking changes, but allow independent releases otherwise.\n */\nfunction applyAdaptive(packages: PackageVersion[]): PackageVersion[] {\n const hasBreaking = packages.some(pkg => pkg.bump === 'major');\n\n // If any package has breaking changes, use lockstep\n if (hasBreaking) {\n return applyLockstep(packages);\n }\n\n // Otherwise, use independent (no changes)\n return packages;\n}\n\n/**\n * Get the maximum bump level from a list of packages\n *\n * Priority: major > minor > patch\n */\nfunction getMaxBump(packages: PackageVersion[]): VersionBump {\n let maxBump: VersionBump = 'patch';\n\n for (const pkg of packages) {\n if (pkg.bump === 'major') {\n return 'major'; // Can't go higher than major\n }\n if (pkg.bump === 'minor') {\n maxBump = 'minor';\n }\n }\n\n return maxBump;\n}\n","/**\n * Release planner - detects changes and suggests version bumps\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, relative, resolve } from 'node:path';\nimport simpleGit from 'simple-git';\nimport semver from 'semver';\nimport globby from 'globby';\nimport { discoverSubRepoPaths } from '@kb-labs/sdk';\nimport type { PackageVersion, VersionBump, ReleaseConfig, ReleasePlan } from './types';\nimport { applyVersionStrategy, type VersionStrategy } from './versioning-strategies';\n\n/**\n * Find the most recent git tag for a package.\n * For scoped packages: looks for \"<name>@<version>\" tags.\n * For lockstep repos: looks for \"v<version>\" tags.\n * Returns null if no tag found (initial release).\n */\nasync function findLastReleaseTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n): Promise<string | null> {\n try {\n // Try package-scoped tag first: @kb-labs/foo@1.2.3\n const tags = await git.tags(['--sort=-version:refname', `--list`, `${pkgName}@*`]);\n if (tags.all.length > 0) {\n return tags.all[0]!;\n }\n // Try lockstep tag: v1.2.3\n const vTags = await git.tags(['--sort=-version:refname', '--list', 'v*']);\n if (vTags.all.length > 0) {\n return vTags.all[0]!;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get commits since last release tag, scoped to a path.\n * Returns empty array if git log fails.\n */\nasync function getCommitsSinceTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n relPath: string,\n): Promise<string[]> {\n const lastTag = await findLastReleaseTag(git, pkgName);\n try {\n // git log [<tag>..HEAD] [--] <path>\n // Without a tag (initial release): git log -- <path>\n const args = ['log', '--format=%s', ...(lastTag ? [`${lastTag}..HEAD`] : []), '--', relPath];\n const raw = await (git as any).raw(args) as string;\n return raw.split('\\n').map((s: string) => s.trim()).filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Check if there are any file changes since last release tag.\n * Covers: uncommitted, committed-not-pushed, committed-and-pushed.\n */\nasync function hasChangesSinceTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n pkgRelPath: string,\n): Promise<boolean> {\n // 1. Uncommitted changes (working tree + index)\n const status = await git.status();\n const uncommitted = status.files.map(f => f.path);\n const hasUncommitted = uncommitted.some(p => p === pkgRelPath || p.startsWith(pkgRelPath + '/'));\n if (hasUncommitted) {return true;}\n\n // 2. Committed changes since last tag\n const commits = await getCommitsSinceTag(git, pkgName, pkgRelPath);\n return commits.length > 0;\n}\n\nexport interface PlannerOptions {\n cwd: string;\n config: ReleaseConfig;\n scope?: string;\n /** Named flow — selects a release config profile. Completely replaces global packages/versioning/checks. */\n flow?: string;\n bumpOverride?: VersionBump;\n}\n\n/**\n * Merge base config with a named flow's config.\n * Flow completely REPLACES packages, versioningStrategy, and checks — no array merging.\n * All other config fields (registry, publish, rollback, git, changelog) remain from global.\n */\nexport function mergeConfigWithFlow(config: ReleaseConfig, flowName: string): ReleaseConfig {\n const flow = config.flows?.[flowName];\n if (!flow) {\n throw new Error(`Flow \"${flowName}\" is not defined in config.flows`);\n }\n return {\n ...config,\n ...(flow.packages !== undefined && { packages: flow.packages }),\n ...(flow.versioningStrategy && { versioningStrategy: flow.versioningStrategy }),\n ...(flow.checks !== undefined && { checks: flow.checks }),\n };\n}\n\n/**\n * Plan release by detecting changes and computing version bumps\n */\nexport async function planRelease(options: PlannerOptions): Promise<ReleasePlan> {\n const { cwd, scope, bumpOverride } = options;\n\n // Flow resolution — completely replaces packages/versioningStrategy/checks in config.\n // MUST happen before discoverPackages so globally-excluded packages can appear in a flow.\n const config = options.flow\n ? mergeConfigWithFlow(options.config, options.flow)\n : options.config;\n\n // Step 1: discover all candidates according to config (paths/include/exclude)\n const allPackages = await discoverPackages(cwd, config);\n\n // Step 2: if scope given, filter candidates and produce clear errors\n let packages: PackageVersion[];\n if (scope && scope !== 'root') {\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 packages = innerPackages;\n } else {\n packages = filterByScope(allPackages, scope, config);\n }\n } else {\n packages = allPackages;\n }\n\n // Workspace root with submodules: each sub-repo has its own git,\n // so we skip workspace-level detectModifiedPackages and use per-repo git.\n const isWorkspaceRoot = existsSync(join(cwd, '.gitmodules')) && !scope;\n\n let modifiedPackages: PackageVersion[];\n if (isWorkspaceRoot) {\n // All sub-repos are candidates — change detection happens per-repo\n modifiedPackages = packages;\n } else if (config.versioningStrategy === 'lockstep') {\n // Lockstep: all packages release together regardless of individual changes\n modifiedPackages = packages;\n } else {\n const git = simpleGit(cwd, { timeout: { block: 60000 } });\n modifiedPackages = await detectModifiedPackages(git, packages, cwd);\n }\n\n // Compute version bumps\n 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 const nextVersion = await computeNextVersion(\n pkg.path,\n pkg.currentVersion,\n bump,\n git,\n gitCwd,\n pkg.name,\n );\n\n planPackages.push({\n ...pkg,\n 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 return {\n packages: planPackages,\n strategy: config.strategy || 'semver',\n registry: config.registry || 'https://registry.npmjs.org',\n rollbackEnabled: config.rollback?.enabled ?? true,\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 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 currentVersion: pkgJson.version || '0.0.0',\n nextVersion: pkgJson.version || '0.0.0',\n bump: 'auto',\n isPublished: false,\n });\n } catch {\n // Sub-repo without valid package.json — skip\n }\n }\n\n return packages;\n}\n\n/**\n * Check if file should be ignored (node_modules, dist, etc.)\n */\nfunction shouldIgnoreFile(file: string): boolean {\n const ignoredPaths = [\n 'node_modules/',\n '.git/',\n 'dist/',\n 'build/',\n '.next/',\n '.nuxt/',\n 'coverage/',\n '.cache/',\n 'tmp/',\n ];\n\n return ignoredPaths.some(path => file.includes(path));\n}\n\nasync function detectModifiedPackages(\n git: ReturnType<typeof simpleGit>,\n packages: PackageVersion[],\n cwd: string,\n): Promise<PackageVersion[]> {\n const modified: PackageVersion[] = [];\n\n for (let i = 0; i < packages.length; i++) {\n if (i % 10 === 0) {\n await new Promise((res) => { setImmediate(res); });\n }\n\n const pkg = packages[i]!;\n const pkgRel = relative(resolve(cwd), resolve(pkg.path));\n const changed = await hasChangesSinceTag(git, pkg.name, pkgRel);\n\n if (changed) {\n modified.push(pkg);\n }\n }\n\n return modified;\n}\n\nasync function computeNextVersion(\n packagePath: string,\n currentVersion: string,\n bump: VersionBump,\n git: ReturnType<typeof simpleGit>,\n gitCwd: string,\n pkgName: string,\n): Promise<string> {\n if (bump === 'auto') {\n const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd, pkgName);\n return semver.inc(currentVersion, detectedBump) || currentVersion;\n }\n return semver.inc(currentVersion, bump) || currentVersion;\n}\n\nasync function detectVersionFromCommits(\n git: ReturnType<typeof simpleGit>,\n packagePath: string,\n gitCwd: string,\n pkgName: string,\n): Promise<'major' | 'minor' | 'patch'> {\n try {\n const relPath = relative(resolve(gitCwd), resolve(packagePath));\n const messages = await getCommitsSinceTag(git, pkgName, relPath);\n\n let hasMinor = false;\n let hasBreaking = false;\n\n for (const message of messages) {\n const msg = message.toLowerCase();\n if (msg.includes('!:') || msg.includes('breaking change')) {\n hasBreaking = true;\n } else if (msg.startsWith('feat') || msg.startsWith('feature')) {\n hasMinor = true;\n }\n }\n\n if (hasBreaking) {return 'major';}\n if (hasMinor) {return 'minor';}\n return 'patch';\n } catch {\n return 'patch';\n }\n}\n\nfunction detectBumpType(currentVersion: string, nextVersion: string): VersionBump {\n if (semver.major(currentVersion) < semver.major(nextVersion)) {\n return 'major';\n }\n if (semver.minor(currentVersion) < semver.minor(nextVersion)) {\n return 'minor';\n }\n return 'patch';\n}\n\n/**\n * Match a package against a list of patterns.\n * - Patterns starting with '@' or without '/' → matched against package name.\n * - Patterns containing '/' (non-scoped) → matched against relative path.\n * - Supports '*' wildcard (single path segment, not separator).\n */\nexport function matchesPackagePattern(pkgName: string, relativePath: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n const isPathPattern = pattern.includes('/') && !pattern.startsWith('@');\n const target = isPathPattern ? relativePath : pkgName;\n const regex = new RegExp(\n '^' + pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '[^/]*') + '$'\n );\n if (regex.test(target)) {return true;}\n }\n return false;\n}\n\n","/**\n * @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,\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n };\n } catch (error: any) {\n return {\n ok: false,\n code: error.exitCode || 1,\n stdout: error.stdout || '',\n stderr: error.stderr || error.message || '',\n };\n }\n },\n };\n}\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 } from 'node:path';\nimport type { PackageVersion, ReleasePlan } from './types';\nimport type { ShellAPI } from '@kb-labs/sdk';\nimport { createExecaShellAdapter } from './shell-adapter';\n\nexport interface PublisherOptions {\n cwd: string;\n plan: ReleasePlan;\n dryRun?: boolean;\n shell?: ShellAPI;\n config?: import('./types').ReleaseConfig;\n}\n\nexport interface PublishingResult {\n published: string[];\n skipped: string[];\n errors: string[];\n versionUpdates: Array<{\n package: string;\n from: string;\n to: string;\n updated: boolean;\n }>;\n}\n\n/**\n * Publish packages according to plan\n */\nexport async function publishPackages(options: PublisherOptions): Promise<PublishingResult> {\n const { plan, dryRun, shell } = options;\n const shellApi = shell || createExecaShellAdapter();\n const result: PublishingResult = {\n published: [],\n skipped: [],\n errors: [],\n versionUpdates: [],\n };\n\n if (dryRun) {\n // In dry-run, just report what would be published\n for (const pkg of plan.packages) {\n result.skipped.push(`${pkg.name}@${pkg.nextVersion} (dry-run)`);\n // Record planned version update (not applied)\n result.versionUpdates.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: false,\n });\n }\n return result;\n }\n\n // Publish each package\n for (const pkg of plan.packages) {\n try {\n const registry = plan.registry || 'https://registry.npmjs.org';\n\n // 1. Update version in package.json BEFORE publishing\n try {\n await updatePackageVersion(pkg);\n result.versionUpdates.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: true,\n });\n } catch (versionError) {\n const msg = `Failed to update version for ${pkg.name}: ${versionError instanceof Error ? versionError.message : String(versionError)}`;\n result.errors.push(msg);\n result.versionUpdates.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: false,\n });\n continue; // Skip publish if version update failed\n }\n\n // 2. Publish to npm\n const pm = options.config?.publish?.packageManager ?? 'pnpm';\n const access = options.config?.publish?.access ?? 'public';\n const publishResult = await shellApi.exec(\n pm,\n ['publish', '--access', access, '--registry', registry],\n {\n cwd: pkg.path,\n timeout: 60000,\n }\n );\n\n if (publishResult.ok) {\n result.published.push(`${pkg.name}@${pkg.nextVersion}`);\n } else {\n const errorDetails = publishResult.stderr || publishResult.stdout || 'Unknown error';\n result.errors.push(`Failed to publish ${pkg.name}: ${errorDetails}`);\n }\n } catch (error) {\n const msg = `Failed to publish ${pkg.name}: ${error instanceof Error ? error.message : String(error)}`;\n result.errors.push(msg);\n }\n }\n\n return result;\n}\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 * Generate changelog entry for release\n * Note: This is a simplified wrapper. Full changelog generation is handled by @kb-labs/release-manager-changelog\n */\nexport async function generateChangelog(options: {\n cwd: string;\n plan: ReleasePlan;\n}): Promise<string> {\n const { cwd, plan } = options;\n \n const changelogPath = join(cwd, 'CHANGELOG.md');\n let existingChangelog = '';\n \n try {\n existingChangelog = await readFile(changelogPath, 'utf-8');\n } catch {\n // Changelog doesn't exist yet\n }\n\n const date = new Date().toISOString().split('T')[0];\n const header = `## [${date}] Release\\n\\n`;\n \n const entries: string[] = [];\n for (const pkg of plan.packages) {\n entries.push(`- **${pkg.name}**: ${pkg.currentVersion} → ${pkg.nextVersion}`);\n }\n \n const newEntry = header + entries.join('\\n') + '\\n\\n';\n \n // Prepend to existing changelog\n const updatedChangelog = newEntry + existingChangelog;\n \n // Write back\n try {\n await mkdir(join(cwd, '.kb', 'release'), { recursive: true });\n await writeFile(changelogPath, updatedChangelog, 'utf-8');\n } catch (error) {\n console.warn(`Failed to write changelog: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return newEntry;\n}\n\n/**\n * Generate enhanced changelog using @kb-labs/release-manager-changelog\n * This is the recommended approach for full-featured changelog generation\n *\n * Note: Full integration available via @kb-labs/release-manager-changelog package and CLI command\n */\nexport async function generateEnhancedChangelog(options: {\n cwd: string;\n plan: ReleasePlan;\n from?: string;\n to?: string;\n config?: any;\n}): Promise<{ changelog: string; manifest: any }> {\n // Full changelog generation is available via @kb-labs/release-manager-changelog\n // For now, fallback to simple changelog\n const simpleChangelog = await generateChangelog({\n cwd: options.cwd,\n plan: options.plan,\n });\n\n return {\n changelog: simpleChangelog,\n manifest: null,\n };\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 for (const pkg of plan.packages) {\n try {\n // For single-package releases, use the entire changelog\n // For multi-package releases, extract package-specific section\n let packageChangelog: string;\n\n if (plan.packages.length === 1) {\n // Single package release: use entire changelog as-is\n packageChangelog = changelog;\n } else {\n // Multi-package release: extract section for this package\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 const versionPattern = new RegExp(\n `^##\\\\s+${pkg.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+${pkg.nextVersion.replace(/\\./g, '\\\\.')}`,\n 'm'\n );\n\n let updatedChangelog: string;\n if (existingChangelog && versionPattern.test(existingChangelog)) {\n // Version already exists - replace the section instead of prepending\n // Find where current version section starts and next section 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 && /^##\\s+@?[\\w-]+/.test(line)) {\n // Found next section header\n endIdx = i;\n break;\n }\n }\n\n if (startIdx !== -1) {\n // Replace the existing section\n const before = lines.slice(0, startIdx).join('\\n');\n const after = lines.slice(endIdx).join('\\n');\n updatedChangelog = (before ? before + '\\n' : '') + packageChangelog + (after ? '\\n' + after : '');\n } else {\n // Fallback: just use new changelog\n updatedChangelog = packageChangelog;\n }\n } else {\n // Prepend new entry\n updatedChangelog = packageChangelog + (existingChangelog ? '\\n' + existingChangelog : '');\n }\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/**\n * Create package-specific changelog entry with proper header\n */\nfunction createPackageChangelog(pkg: PackageVersion, changelog: string): string {\n // Extract ONLY the section for this package from the full changelog\n // Format: ## @scope/package-name X.Y.Z\n const packageHeaderPattern = new RegExp(\n `^##\\\\s+${pkg.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+\\\\d+\\\\.\\\\d+\\\\.\\\\d+`,\n 'gm'\n );\n\n const allHeaders = Array.from(changelog.matchAll(/^##\\s+(@[\\w-]+\\/)?[\\w-]+\\s+\\d+\\.\\d+\\.\\d+/gm));\n\n // Find start index for this package\n let startIdx = -1;\n let endIdx = changelog.length;\n\n for (let i = 0; i < allHeaders.length; i++) {\n const match = allHeaders[i];\n if (!match || !match.index) {continue;}\n\n if (packageHeaderPattern.test(match[0])) {\n startIdx = match.index;\n // Find next package header\n if (i + 1 < allHeaders.length) {\n endIdx = allHeaders[i + 1]!.index!;\n }\n break;\n }\n }\n\n if (startIdx === -1) {\n // Package section not found in changelog, return empty\n return '';\n }\n\n // Extract the section for this package\n return changelog.substring(startIdx, endIdx).trim();\n}\n\n/**\n * Commit and tag release changes\n *\n * Each package is committed inside its own git repo (supports submodules).\n * After all packages are committed, tags are created in cwd (the monorepo root).\n */\nexport async function commitAndTagRelease(options: {\n cwd: string;\n plan: ReleasePlan;\n dryRun?: boolean;\n /** Pass --no-verify to git push and pushTags. Default: false — hooks run normally. */\n noVerify?: boolean;\n}): Promise<{ committed: boolean; tagged: string[]; pushed: boolean }> {\n const { cwd, plan, dryRun, noVerify = false } = 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 // 1. Commit each package in its own git repo\n for (const pkg of plan.packages) {\n const pkgGit = simpleGit(pkg.path);\n\n // Stage package.json and CHANGELOG.md (only if it exists)\n const filesToStage = ['package.json'];\n const changelogPath = join(pkg.path, 'CHANGELOG.md');\n if (existsSync(changelogPath)) {filesToStage.push('CHANGELOG.md');}\n await pkgGit.add(filesToStage);\n\n try {\n await pkgGit.commit(commitMessage);\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 }\n\n // 2. Create tags in cwd (monorepo root)\n const git = simpleGit(cwd);\n\n // Lockstep (all packages same version) → single repo-level tag: v{version}\n // Independent → per-package tag: {name}@{version}\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const isLockstep = plan.packages.length > 1 && uniqueVersions.size === 1;\n\n if (isLockstep) {\n const version = plan.packages[0]!.nextVersion;\n const tagName = `v${version}`;\n await git.addTag(tagName);\n result.tagged.push(tagName);\n } else {\n for (const pkg of plan.packages) {\n const pkgGit = simpleGit(pkg.path);\n const tagName = `${pkg.name}@${pkg.nextVersion}`;\n await pkgGit.addTag(tagName);\n result.tagged.push(tagName);\n }\n }\n\n // 3. Push each package repo\n const pushFlags: string[] = noVerify ? ['--no-verify'] : [];\n const pushTagsOptions = noVerify ? ['--no-verify'] : undefined;\n for (const pkg of plan.packages) {\n const pkgGit = simpleGit(pkg.path);\n if (result.committed) {\n await pkgGit.push(pushFlags);\n }\n await pkgGit.pushTags(pushTagsOptions);\n }\n result.pushed = true;\n\n } catch (error) {\n console.error(`Git operations failed: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n\n return result;\n}\n\n/**\n * Create conventional commit message for release\n */\nfunction createCommitMessage(plan: ReleasePlan): string {\n const lines: string[] = [];\n\n if (plan.packages.length === 1 && plan.packages[0]) {\n const pkg = plan.packages[0];\n lines.push(`chore(release): publish ${pkg.name}@${pkg.nextVersion}`);\n } else {\n lines.push(`chore(release): publish ${plan.packages.length} packages`);\n }\n\n lines.push('');\n\n for (const pkg of plan.packages) {\n lines.push(`- ${pkg.name}@${pkg.nextVersion}`);\n }\n\n return lines.join('\\n');\n}\n\n","/**\n * Rollback - manages release snapshots and recovery\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { ReleasePlan, PackageVersion } from './types';\n\nexport interface RollbackSnapshot {\n ts: string;\n packages: PackageVersion[];\n}\n\n// MAX_HISTORY = 5; // Future use for snapshot retention\n\n/**\n * Save current state for potential rollback\n */\nexport async function saveSnapshot(options: {\n cwd: string;\n plan: ReleasePlan;\n}): Promise<void> {\n const { cwd, plan } = options;\n \n const snapshot: RollbackSnapshot = {\n ts: new Date().toISOString(),\n packages: plan.packages.map(pkg => ({\n ...pkg,\n nextVersion: pkg.currentVersion, // Store current before update\n })),\n };\n\n const snapshotDir = join(cwd, '.kb', 'release');\n await mkdir(snapshotDir, { recursive: true });\n \n const snapshotPath = join(snapshotDir, 'backup.json');\n await writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf-8');\n \n // Cleanup old snapshots\n await cleanupOldSnapshots(snapshotDir);\n}\n\n/**\n * Restore from snapshot\n */\nexport async function restoreSnapshot(cwd: string): Promise<void> {\n const snapshotPath = join(cwd, '.kb', 'release', 'backup.json');\n \n if (!existsSync(snapshotPath)) {\n throw new Error('No backup snapshot found');\n }\n\n const snapshotContent = await readFile(snapshotPath, 'utf-8');\n const snapshot: RollbackSnapshot = JSON.parse(snapshotContent);\n\n // Restore package.json versions\n for (const pkg of snapshot.packages) {\n const packageJsonPath = join(pkg.path, 'package.json');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n \n packageJson.version = pkg.currentVersion;\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n }\n}\n\nasync function cleanupOldSnapshots(_snapshotDir: string): Promise<void> {\n // For now, just keep the latest backup.json\n // In the future, could maintain timestamped backups\n // and trim to MAX_HISTORY\n}\n\n","/**\n * Main release runner - orchestrates full release lifecycle\n */\n\nimport type {\n ReleaseConfig,\n ReleaseContext,\n ReleaseResult,\n ReleaseStage,\n CheckId,\n CheckResult,\n} from './types';\n\nexport interface RunnerOptions {\n config: ReleaseConfig;\n context: ReleaseContext;\n runChecks?: (stage: ReleaseStage) => Promise<Partial<Record<CheckId, CheckResult>>>;\n executePlan?: () => Promise<void>;\n onStageChange?: (stage: ReleaseStage) => void;\n}\n\n/**\n * Run full release process\n */\nexport async function runRelease(options: RunnerOptions): Promise<ReleaseResult> {\n const {\n config,\n runChecks,\n executePlan,\n onStageChange,\n } = options;\n\n const startTime = Date.now();\n const errors: string[] = [];\n let checks: Partial<Record<CheckId, CheckResult>> | undefined;\n\n try {\n // Stage 1: Planning\n onStageChange?.('planning');\n \n // Stage 2: Pre-release checks\n if (config.verify && config.verify.length > 0 && runChecks) {\n onStageChange?.('checking');\n checks = await runChecks('checking');\n \n // Check if any checks failed\n const failedChecks = Object.entries(checks)\n .filter(([_, result]) => result && !result.ok)\n .map(([id]) => id);\n \n if (failedChecks.length > 0) {\n errors.push(`Pre-release checks failed: ${failedChecks.join(', ')}`);\n \n if (config.strict) {\n return {\n ok: false,\n timingMs: Date.now() - startTime,\n errors,\n checks,\n };\n }\n }\n }\n\n // Stage 3: Versioning and publishing\n onStageChange?.('publishing');\n \n if (executePlan) {\n await executePlan();\n }\n\n // Stage 4: Verification\n onStageChange?.('verifying');\n \n return {\n ok: errors.length === 0,\n timingMs: Date.now() - startTime,\n errors: errors.length > 0 ? errors : undefined,\n checks,\n };\n } catch (error) {\n // Rollback on error\n onStageChange?.('rollback');\n \n errors.push(error instanceof Error ? error.message : String(error));\n \n return {\n ok: false,\n timingMs: Date.now() - startTime,\n errors,\n checks,\n };\n }\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 * Safe build — builds into temp dir, then atomically swaps dist/.\n * Prevents crashing running services whose dist/ is wiped by tsup's `clean: true`.\n */\n\nimport { rename, rm, cp } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport type { BuildResult, PackageVersion } from './types';\n\n/**\n * Build all packages in a plan using safe build strategy.\n * Stops on first failure.\n */\nexport async function buildPackages(\n packages: PackageVersion[],\n options?: {\n logger?: { info?: (...args: any[]) => void; warn?: (...args: any[]) => void; error?: (...args: any[]) => void };\n onProgress?: (pkg: string, result: BuildResult) => void;\n },\n): Promise<BuildResult[]> {\n const results: BuildResult[] = [];\n\n for (const pkg of packages) {\n options?.logger?.info?.(`Building ${pkg.name}...`);\n const result = await runSafeBuild(pkg.path, pkg.name);\n results.push({ ...result, name: pkg.name });\n\n options?.onProgress?.(pkg.name, { ...result, name: pkg.name });\n\n if (!result.success) {\n options?.logger?.error?.(`Build failed for ${pkg.name}: ${result.error}`);\n break;\n }\n\n options?.logger?.info?.(`Built ${pkg.name} in ${result.durationMs}ms`);\n }\n\n return results;\n}\n\n/**\n * Run build for a single package using safe temp-dir strategy when tsup is detected.\n * Falls back to regular `pnpm run build` for non-tsup packages.\n */\nexport async function runSafeBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const usesTsup = existsSync(join(packagePath, 'tsup.config.ts'))\n || existsSync(join(packagePath, 'tsup.config.js'));\n\n if (usesTsup) {\n return runTsupSafeBuild(packagePath, packageName);\n }\n\n return runDirectBuild(packagePath, packageName);\n}\n\n/**\n * Check if a shell command is a build command that should use safe build.\n */\nexport function isBuildCommand(command: string, args?: string[]): boolean {\n const full = [command, ...(args ?? [])].join(' ').trim();\n return /\\b(pnpm|npm|yarn)\\s+(run\\s+)?build\\b/.test(full);\n}\n\nasync function runTsupSafeBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const startTime = Date.now();\n const buildId = randomBytes(6).toString('hex');\n const tempDir = join(tmpdir(), `kb-release-build-${buildId}`);\n const distDir = join(packagePath, 'dist');\n const backupDir = join(packagePath, `dist.bak-${buildId}`);\n\n try {\n const buildResult = await spawnCommand(`npx tsup -d ${tempDir}`, packagePath);\n\n if (!buildResult.success) {\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n return { ...buildResult, name: packageName, durationMs: Date.now() - startTime };\n }\n\n if (existsSync(distDir)) {\n await rename(distDir, backupDir);\n }\n\n try {\n await rename(tempDir, distDir);\n } catch {\n await cp(tempDir, distDir, { recursive: true });\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n\n await rm(backupDir, { recursive: true, force: true }).catch(() => {});\n return { success: true, name: packageName, durationMs: Date.now() - startTime };\n } catch (err) {\n if (existsSync(backupDir) && !existsSync(distDir)) {\n await rename(backupDir, distDir).catch(() => {});\n }\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n return {\n success: false,\n name: packageName,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startTime,\n };\n }\n}\n\nasync function runDirectBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const result = await spawnCommand('pnpm run build', packagePath);\n return { ...result, name: packageName };\n}\n\nexport interface SpawnResult extends Omit<BuildResult, 'name'> {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Spawn a shell command and collect results.\n * Captures both stdout and stderr — build tools often write errors to stdout.\n */\nexport function spawnCommand(command: string, cwd: string, timeoutMs = 5 * 60 * 1000): Promise<SpawnResult> {\n const startTime = Date.now();\n\n return new Promise((resolve) => {\n const child = spawn(command, [], {\n cwd,\n stdio: 'pipe',\n shell: true,\n env: { ...process.env },\n });\n\n let stdout = '';\n let stderr = '';\n child.stdout?.on('data', (data) => { stdout += data.toString(); });\n child.stderr?.on('data', (data) => { stderr += data.toString(); });\n\n child.on('close', (code) => {\n const exitCode = code ?? 1;\n const durationMs = Date.now() - startTime;\n if (exitCode === 0) {\n resolve({ success: true, durationMs, stdout, stderr, exitCode });\n return;\n }\n\n // Build error message from available output (last N lines to keep it readable)\n const combined = (stderr || stdout).trim();\n const tail = combined\n .split('\\n')\n .slice(-30)\n .join('\\n');\n\n resolve({\n success: false,\n error: tail || `Build failed with exit code ${exitCode}`,\n durationMs,\n stdout,\n stderr,\n exitCode,\n });\n });\n\n child.on('error', (err) => {\n resolve({ success: false, error: err.message, durationMs: Date.now() - startTime, stdout: '', stderr: '', exitCode: 1 });\n });\n\n setTimeout(() => {\n child.kill();\n resolve({ success: false, error: `Timed out after ${timeoutMs / 1000}s`, durationMs: Date.now() - startTime, stdout: '', stderr: '', exitCode: 1 });\n }, timeoutMs);\n });\n}\n","/**\n * Unified check runner for release manager.\n * Reads config.checks[], supports parser field, script path resolution, perPackage routing.\n */\n\nimport { join } from 'node:path';\nimport type { CustomCheckConfig, CheckResult, CheckResultDetails } from './types';\nimport { spawnCommand } from './build';\n\nexport interface CheckRunnerOptions {\n repoRoot: string;\n packagePaths: string[];\n scopePath?: string;\n logger?: { info?: (...args: any[]) => void; warn?: (...args: any[]) => void };\n}\n\n/**\n * Run all configured checks against packages.\n * Handles: parser evaluation, script path resolution, perPackage/scopePath/repoRoot routing.\n */\nexport async function runReleaseChecks(\n checks: CustomCheckConfig[],\n options: CheckRunnerOptions,\n): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n for (const check of checks) {\n const result = await runSingleCheck(check, options);\n results.push(result);\n\n options.logger?.info?.(`Check ${check.id}: ${result.ok ? 'passed' : 'failed'} (${result.timingMs}ms)`);\n\n // Stop on first non-optional failure\n if (!result.ok && !check.optional) {\n break;\n }\n }\n\n return results;\n}\n\nasync function runSingleCheck(\n check: CustomCheckConfig,\n options: CheckRunnerOptions,\n): Promise<CheckResult> {\n const runIn = check.runIn ?? 'perPackage';\n let pathsToRun: string[];\n\n if (runIn === 'repoRoot') {\n pathsToRun = [options.repoRoot];\n } else if (runIn === 'scopePath') {\n pathsToRun = [options.scopePath ?? options.repoRoot];\n } else {\n pathsToRun = options.packagePaths.length > 0 ? options.packagePaths : [options.repoRoot];\n }\n\n // Run perPackage checks in parallel (concurrency=8); single-path checks run sequentially.\n const CONCURRENCY = 8;\n\n const resolvedArgs = (check.args ?? []).map(arg =>\n arg.match(/\\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg\n );\n const fullCommand = [check.command, ...resolvedArgs].join(' ');\n const timeoutMs = check.timeoutMs ?? 120_000;\n\n type PkgRunResult = { path: string; ok: boolean; details: CheckResultDetails; durationMs: number };\n\n async function runForPath(pkgPath: string): Promise<PkgRunResult> {\n const result = await spawnCommand(fullCommand, pkgPath, timeoutMs);\n const ok = evaluateParser(check, result.stdout, result.stderr, result.exitCode);\n return {\n path: pkgPath,\n ok,\n durationMs: result.durationMs,\n details: {\n packagePath: pkgPath,\n stdout: result.stdout || undefined,\n stderr: result.stderr || undefined,\n exitCode: result.exitCode,\n error: result.error ?? (!ok ? `exit code ${result.exitCode}` : undefined),\n },\n };\n }\n\n let pkgResults: PkgRunResult[];\n\n if (runIn === 'perPackage' && pathsToRun.length > 1) {\n // Parallel with concurrency limit\n pkgResults = [];\n for (let i = 0; i < pathsToRun.length; i += CONCURRENCY) {\n const batch = pathsToRun.slice(i, i + CONCURRENCY);\n pkgResults.push(...await Promise.all(batch.map(runForPath)));\n }\n } else {\n pkgResults = [await runForPath(pathsToRun[0]!)];\n }\n\n const firstFailure = pkgResults.find(r => !r.ok)?.details;\n const totalDurationMs = pkgResults.reduce((sum, r) => sum + r.durationMs, 0);\n const perPackage: NonNullable<CheckResult['packages']> | undefined = pathsToRun.length > 1\n ? pkgResults.map(r => ({ path: r.path, ok: r.ok, details: r.ok ? undefined : r.details }))\n : undefined;\n\n const allOk = !firstFailure;\n\n return {\n id: check.id,\n ok: allOk,\n details: firstFailure,\n hint: check.optional ? 'optional' : undefined,\n timingMs: totalDurationMs,\n packages: perPackage && perPackage.length > 0 ? perPackage : undefined,\n };\n}\n\nfunction evaluateParser(\n check: CustomCheckConfig,\n stdout: string,\n stderr: string,\n exitCode: number,\n): boolean {\n const parser = check.parser ?? 'exitcode';\n\n if (parser === 'exitcode') {\n return exitCode === 0;\n }\n\n if (parser === 'json') {\n try {\n const parsed = JSON.parse(stdout);\n return parsed.ok === true || parsed.success === true || parsed.status === 'ok';\n } catch {\n return false;\n }\n }\n\n if (typeof parser === 'function') {\n return parser(stdout, stderr, exitCode);\n }\n\n return exitCode === 0;\n}\n","/**\n * Package verifier — npm pack → extract → verify artifacts before publish.\n * Catches: directory imports, test file leaks, missing exports, syntax errors.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync, mkdirSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport { rmSync, writeFileSync } from 'node:fs';\nimport type { VerifyResult, PackageVersion } 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?: { info?: (...args: any[]) => void };\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 execSync(`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 execSync(`tar xzf ${tgzFile}`, { cwd: tmpDir, stdio: 'pipe' });\n const extractedDir = join(tmpDir, 'package');\n\n // 3. 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 // 4. Exports exist\n const extractedPkg = JSON.parse(readFileSync(join(extractedDir, 'package.json'), 'utf-8'));\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 // 5. 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 try {\n execSync(`node --check ${esmPath}`, { stdio: 'pipe', timeout: 10_000 });\n } catch {\n issues.push(`ESM syntax error in ${esmEntry}`);\n }\n }\n }\n\n // 6. CJS syntax check\n const cjsEntry = resolveCjsEntry(extractedPkg);\n if (cjsEntry) {\n const cjsPath = join(extractedDir, cjsEntry);\n if (existsSync(cjsPath)) {\n try {\n execSync(`node --check ${cjsPath}`, { stdio: 'pipe', timeout: 10_000 });\n } catch {\n issues.push(`CJS syntax error in ${cjsEntry}`);\n }\n }\n }\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\nfunction resolveEsmEntry(pkg: any): string | undefined {\n return pkg.exports?.['.']?.import ?? pkg.module ?? pkg.main;\n}\n\nfunction resolveCjsEntry(pkg: any): string | undefined {\n const req = pkg.exports?.['.']?.require;\n if (req) {return req;}\n if (pkg.main?.endsWith('.cjs')) {return pkg.main;}\n return undefined;\n}\n\nfunction checkExportsExist(exports: any, 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 * 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\nimport { join } from 'node:path';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { planRelease } from './planner';\nimport { saveSnapshot, restoreSnapshot } from './rollback';\nimport { updatePackageVersions } from './publisher';\nimport { copyChangelogToPackages, commitAndTagRelease } from './publisher';\nimport { buildPackages } from './build';\nimport { runReleaseChecks } from './checks';\nimport { verifyPackages } from './verifier';\nimport type {\n PipelineOptions,\n PipelineResult,\n ReleaseReport,\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, repoRoot, scopeCwd, scope, config, dryRun = false,\n skipChecks = false, skipBuild = false, skipVerify = 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 // 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 });\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 // 2. Snapshot (for rollback)\n await saveSnapshot({ cwd: repoRoot, plan });\n\n // 3. Checks\n if (!skipChecks && checkConfigs && checkConfigs.length > 0) {\n progress('checking', `Running ${checkConfigs.length} pre-release check(s)...`);\n\n const packagePaths = plan.packages.map(p => p.path);\n const checkResults = await runReleaseChecks(checkConfigs, {\n repoRoot,\n packagePaths,\n scopePath: scopeCwd,\n logger,\n });\n\n const failed = checkResults.filter(r => !r.ok && r.hint !== 'optional');\n if (failed.length > 0) {\n await restoreSnapshot(repoRoot);\n\n // Build rich per-check error messages for both human and agent consumption\n const errorLines = failed.flatMap(f => {\n const lines: string[] = [`check \"${f.id}\" failed`];\n if (f.details?.packagePath) lines.push(` package: ${f.details.packagePath}`);\n if (f.details?.error) lines.push(` reason: ${f.details.error}`);\n if (f.details?.stderr?.trim()) lines.push(` stderr: ${f.details.stderr.trim().split('\\n').slice(0, 5).join('\\n ')}`);\n if (f.details?.stdout?.trim() && !f.details?.stderr?.trim()) lines.push(` output: ${f.details.stdout.trim().split('\\n').slice(0, 5).join('\\n ')}`);\n if (f.packages?.filter(p => !p.ok).length) {\n const failedPkgs = f.packages.filter(p => !p.ok);\n lines.push(` failed in ${failedPkgs.length}/${f.packages.length} package(s):`);\n for (const pkg of failedPkgs.slice(0, 10)) {\n lines.push(` - ${pkg.path}${pkg.details?.error ? `: ${pkg.details.error}` : ''}`);\n }\n }\n return lines;\n });\n\n return {\n success: false,\n plan,\n report: buildReport('checking', plan, repoRoot, dryRun, startTime, {\n ok: false,\n checks: Object.fromEntries(checkResults.map(r => [r.id, r])),\n errors: errorLines,\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n progress('checking', 'Pre-release checks passed');\n }\n\n // 4. Build\n if (!skipBuild && !dryRun) {\n progress('versioning', `Building ${plan.packages.length} package(s)...`);\n const buildResults = await buildPackages(plan.packages, { logger });\n const buildFailed = buildResults.filter(r => !r.success);\n\n if (buildFailed.length > 0) {\n await restoreSnapshot(repoRoot);\n return {\n success: false,\n plan,\n report: buildReport('versioning', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: buildFailed.map(f => `Build failed: ${f.name} — ${f.error}`),\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n\n // 5. Verify (pack + install check)\n if (!skipVerify && !dryRun) {\n progress('verifying', 'Verifying package artifacts...');\n const verifyResults = await verifyPackages(plan.packages, { logger });\n const verifyFailed = verifyResults.filter(r => !r.success);\n\n if (verifyFailed.length > 0) {\n await restoreSnapshot(repoRoot);\n const allIssues = verifyFailed.flatMap(r => r.issues.map(i => `${r.name}: ${i}`));\n return {\n success: false,\n plan,\n report: buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: [`Package verification failed:\\n ${allIssues.join('\\n ')}`],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n progress('verifying', 'Package artifacts verified');\n }\n\n // 6. Version bump\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 // 7. Changelog\n let changelogMd = '';\n if (changelogGen) {\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 const changelogPath = join(repoRoot, '.kb', 'release', 'CHANGELOG.md');\n await mkdir(join(repoRoot, '.kb', 'release'), { recursive: true });\n await writeFile(changelogPath, changelogMd, 'utf-8');\n }\n\n // 8. Git commit + tag (before publish so tree is clean for pnpm publish git-checks)\n let gitResult: { committed: boolean; tagged: string[]; pushed: boolean } | undefined;\n if (!dryRun) {\n progress('verifying', 'Committing and tagging release...');\n gitResult = await commitAndTagRelease({ cwd: scopeCwd, plan, dryRun, noVerify });\n }\n\n // 9. Publish\n progress('publishing', dryRun ? 'Simulating publish (dry-run)...' : '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 = await publisher.publish(packagesToPublish, {\n dryRun,\n access: 'public',\n });\n\n // 10. Report\n const report = buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: publishResult.errors.length === 0 && (!gitResult || gitResult.committed),\n published: publishResult.published,\n skipped: publishResult.skipped,\n changelog: changelogMd || undefined,\n git: gitResult,\n errors: publishResult.errors.length > 0 ? publishResult.errors : undefined,\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\nfunction buildReport(\n stage: ReleaseStage,\n plan: any,\n repoRoot: string,\n dryRun: boolean,\n startTime: number,\n result: any,\n): ReleaseReport {\n return {\n schemaVersion: '1.0',\n ts: new Date().toISOString(),\n context: { repo: repoRoot, cwd: repoRoot, branch: 'unknown', dryRun },\n stage,\n plan,\n result: { ...result, timingMs: result.timingMs ?? (Date.now() - startTime) },\n };\n}\n","/**\n * Scope utilities — resolve scope name to filesystem path.\n *\n * \"scope\" is a filter/selector concept (e.g. \"@kb-labs/release-manager\", \"installer/kb-labs-create\").\n * \"scopePath\" is the resolved absolute filesystem path used for checks (runIn: scopePath) and git ops.\n *\n * Discovery (planRelease) always uses repoRoot + scope filter — never scopePath directly.\n */\n\nimport { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\n/**\n * Resolve a scope name to an absolute filesystem path.\n *\n * - 'root' → repoRoot\n * - '@kb-labs/foo' → directory containing package.json with that name\n * - 'installer/kb-labs-create' → repoRoot/installer/kb-labs-create (direct path)\n *\n * Used only where a physical path is required:\n * - checks with runIn: 'scopePath'\n * - git commit/tag cwd\n * - changelog gitCwd\n *\n * NOT used for package discovery — planRelease always takes (repoRoot, scope).\n */\nexport async function resolveScopePath(repoRoot: string, scope: string): Promise<string> {\n if (!scope || scope === 'root') {\n return repoRoot;\n }\n\n // Scoped npm package name → scan package.json files\n if (scope.startsWith('@')) {\n const packageJsonPaths = await globby('**/package.json', {\n cwd: repoRoot,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.*/**'],\n });\n\n for (const pkgJsonPath of packageJsonPaths) {\n try {\n const pkg = JSON.parse(await readFile(pkgJsonPath, 'utf-8'));\n if (pkg.name === scope) {\n return join(pkgJsonPath, '..');\n }\n } catch { /* skip */ }\n }\n }\n\n // Direct relative path (e.g. 'installer/kb-labs-create', 'plugins/kb-labs-mind')\n return join(repoRoot, scope);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/versioning-strategies.ts","../src/planner.ts","../src/shell-adapter.ts","../src/publisher.ts","../src/rollback.ts","../src/runner.ts","../src/reporters/json.ts","../src/reporters/markdown.ts","../src/reporters/text.ts","../src/build.ts","../src/checks.ts","../src/verifier.ts","../src/pipeline.ts","../src/scope.ts"],"names":["semver","resolve","isPathPattern","join","readFile","simpleGit","existsSync","mkdir","writeFile","formatTiming","tmpdir","randomBytes","exports","globby"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Versioning strategies for monorepo package releases\n *\n * - lockstep: All packages get the same version (maximum bump)\n * - independent: Each package has its own version\n * - adaptive: Lockstep if breaking changes, otherwise independent\n */\n\nimport semver from 'semver';\nimport type { PackageVersion, VersionBump } from './types';\n\nexport type VersionStrategy = 'lockstep' | 'independent' | 'adaptive';\n\nexport interface StrategyOptions {\n strategy: VersionStrategy;\n umbrellaPath?: string; // path to umbrella root (for filtering)\n}\n\n/**\n * Apply versioning strategy to packages\n */\nexport function applyVersionStrategy(\n packages: PackageVersion[],\n options: StrategyOptions\n): PackageVersion[] {\n if (options.strategy === 'lockstep') {\n return applyLockstep(packages);\n }\n\n if (options.strategy === 'adaptive') {\n return applyAdaptive(packages);\n }\n\n // independent (default) - no changes needed\n return packages;\n}\n\n/**\n * Lockstep: All packages get the maximum version bump\n *\n * Example:\n * - Package A: 1.0.0 -> 1.1.0 (minor)\n * - Package B: 1.0.0 -> 2.0.0 (major)\n * Result: Both get 2.0.0 (maximum bump = major)\n */\nfunction applyLockstep(packages: PackageVersion[]): PackageVersion[] {\n if (packages.length === 0) {return packages;}\n\n // Find the maximum bump level\n const maxBump = getMaxBump(packages);\n\n // Find the highest current version\n const maxVersion = packages.reduce((max, pkg) => {\n return semver.gt(pkg.currentVersion, max) ? pkg.currentVersion : max;\n }, packages[0]!.currentVersion); // ! safe: length already checked\n\n // Compute next version from max version + max bump\n // Filter out 'auto' since semver.inc expects ReleaseType\n const releaseType = maxBump === 'auto' ? 'patch' : maxBump;\n const nextVersion = semver.inc(maxVersion, releaseType) || maxVersion;\n\n // Apply to all packages\n return packages.map(pkg => ({\n ...pkg,\n bump: maxBump,\n nextVersion,\n }));\n}\n\n/**\n * Adaptive: Lockstep if breaking changes, otherwise independent\n *\n * This is useful for umbrellas where you want to keep versions in sync\n * when there are breaking changes, but allow independent releases otherwise.\n */\nfunction applyAdaptive(packages: PackageVersion[]): PackageVersion[] {\n const hasBreaking = packages.some(pkg => pkg.bump === 'major');\n\n // If any package has breaking changes, use lockstep\n if (hasBreaking) {\n return applyLockstep(packages);\n }\n\n // Otherwise, use independent (no changes)\n return packages;\n}\n\n/**\n * Get the maximum bump level from a list of packages\n *\n * Priority: major > minor > patch\n */\nfunction getMaxBump(packages: PackageVersion[]): VersionBump {\n let maxBump: VersionBump = 'patch';\n\n for (const pkg of packages) {\n if (pkg.bump === 'major') {\n return 'major'; // Can't go higher than major\n }\n if (pkg.bump === 'minor') {\n maxBump = 'minor';\n }\n }\n\n return maxBump;\n}\n","/**\n * Release planner - detects changes and suggests version bumps\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, relative, resolve } from 'node:path';\nimport simpleGit from 'simple-git';\nimport semver from 'semver';\nimport globby from 'globby';\nimport { discoverSubRepoPaths } from '@kb-labs/sdk';\nimport type { PackageVersion, VersionBump, ReleaseConfig, ReleasePlan } from './types';\nimport { applyVersionStrategy, type VersionStrategy } from './versioning-strategies';\n\n/**\n * Find the most recent git tag for a package.\n * For scoped packages: looks for \"<name>@<version>\" tags.\n * For lockstep repos: looks for \"v<version>\" tags.\n * Returns null if no tag found (initial release).\n */\nasync function findLastReleaseTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n): Promise<string | null> {\n try {\n // Try package-scoped tag first: @kb-labs/foo@1.2.3\n const tags = await git.tags(['--sort=-version:refname', `--list`, `${pkgName}@*`]);\n if (tags.all.length > 0) {\n return tags.all[0]!;\n }\n // Try lockstep tag: v1.2.3\n const vTags = await git.tags(['--sort=-version:refname', '--list', 'v*']);\n if (vTags.all.length > 0) {\n return vTags.all[0]!;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get commits since last release tag, scoped to a path.\n * Returns empty array if git log fails.\n */\nasync function getCommitsSinceTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n relPath: string,\n): Promise<string[]> {\n const lastTag = await findLastReleaseTag(git, pkgName);\n try {\n // git log [<tag>..HEAD] [--] <path>\n // Without a tag (initial release): git log -- <path>\n const args = ['log', '--format=%s', ...(lastTag ? [`${lastTag}..HEAD`] : []), '--', relPath];\n const raw = await (git as any).raw(args) as string;\n return raw.split('\\n').map((s: string) => s.trim()).filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Check if there are any file changes since last release tag.\n * Covers: uncommitted, committed-not-pushed, committed-and-pushed.\n */\nasync function hasChangesSinceTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n pkgRelPath: string,\n): Promise<boolean> {\n // 1. Uncommitted changes (working tree + index)\n const status = await git.status();\n const uncommitted = status.files.map(f => f.path);\n const hasUncommitted = uncommitted.some(p => p === pkgRelPath || p.startsWith(pkgRelPath + '/'));\n if (hasUncommitted) {return true;}\n\n // 2. Committed changes since last tag\n const commits = await getCommitsSinceTag(git, pkgName, pkgRelPath);\n return commits.length > 0;\n}\n\nexport interface PlannerOptions {\n cwd: string;\n config: ReleaseConfig;\n scope?: string;\n /** Named flow — selects a release config profile. Completely replaces global packages/versioning/checks. */\n flow?: string;\n bumpOverride?: VersionBump;\n}\n\n/**\n * Merge base config with a named flow's config.\n * Flow completely REPLACES packages, versioningStrategy, and checks — no array merging.\n * All other config fields (registry, publish, rollback, git, changelog) remain from global.\n */\nexport function mergeConfigWithFlow(config: ReleaseConfig, flowName: string): ReleaseConfig {\n const flow = config.flows?.[flowName];\n if (!flow) {\n throw new Error(`Flow \"${flowName}\" is not defined in config.flows`);\n }\n return {\n ...config,\n ...(flow.packages !== undefined && { packages: flow.packages }),\n ...(flow.versioningStrategy && { versioningStrategy: flow.versioningStrategy }),\n ...(flow.checks !== undefined && { checks: flow.checks }),\n };\n}\n\n/**\n * Plan release by detecting changes and computing version bumps\n */\nexport async function planRelease(options: PlannerOptions): Promise<ReleasePlan> {\n const { cwd, scope, bumpOverride } = options;\n\n // Flow resolution — completely replaces packages/versioningStrategy/checks in config.\n // MUST happen before discoverPackages so globally-excluded packages can appear in a flow.\n const config = options.flow\n ? mergeConfigWithFlow(options.config, options.flow)\n : options.config;\n\n // Step 1: discover all candidates according to config (paths/include/exclude)\n const allPackages = await discoverPackages(cwd, config);\n\n // Step 2: if scope given, filter candidates and produce clear errors\n let packages: PackageVersion[];\n if (scope && scope !== 'root') {\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 packages = innerPackages;\n } else {\n packages = filterByScope(allPackages, scope, config);\n }\n } else {\n packages = allPackages;\n }\n\n // Workspace root with submodules: each sub-repo has its own git,\n // so we skip workspace-level detectModifiedPackages and use per-repo git.\n const isWorkspaceRoot = existsSync(join(cwd, '.gitmodules')) && !scope;\n\n let modifiedPackages: PackageVersion[];\n if (isWorkspaceRoot) {\n // All sub-repos are candidates — change detection happens per-repo\n modifiedPackages = packages;\n } else if (config.versioningStrategy === 'lockstep') {\n // Lockstep: all packages release together regardless of individual changes\n modifiedPackages = packages;\n } else {\n const git = simpleGit(cwd, { timeout: { block: 60000 } });\n modifiedPackages = await detectModifiedPackages(git, packages, cwd);\n }\n\n // Compute version bumps\n 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 const nextVersion = await computeNextVersion(\n pkg.path,\n pkg.currentVersion,\n bump,\n git,\n gitCwd,\n pkg.name,\n );\n\n planPackages.push({\n ...pkg,\n 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 return {\n packages: planPackages,\n strategy: config.strategy || 'semver',\n registry: config.registry || 'https://registry.npmjs.org',\n rollbackEnabled: config.rollback?.enabled ?? true,\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 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 currentVersion: pkgJson.version || '0.0.0',\n nextVersion: pkgJson.version || '0.0.0',\n bump: 'auto',\n isPublished: false,\n });\n } catch {\n // Sub-repo without valid package.json — skip\n }\n }\n\n return packages;\n}\n\n/**\n * Check if file should be ignored (node_modules, dist, etc.)\n */\nfunction shouldIgnoreFile(file: string): boolean {\n const ignoredPaths = [\n 'node_modules/',\n '.git/',\n 'dist/',\n 'build/',\n '.next/',\n '.nuxt/',\n 'coverage/',\n '.cache/',\n 'tmp/',\n ];\n\n return ignoredPaths.some(path => file.includes(path));\n}\n\nasync function detectModifiedPackages(\n git: ReturnType<typeof simpleGit>,\n packages: PackageVersion[],\n cwd: string,\n): Promise<PackageVersion[]> {\n const modified: PackageVersion[] = [];\n\n for (let i = 0; i < packages.length; i++) {\n if (i % 10 === 0) {\n await new Promise((res) => { setImmediate(res); });\n }\n\n const pkg = packages[i]!;\n const pkgRel = relative(resolve(cwd), resolve(pkg.path));\n const changed = await hasChangesSinceTag(git, pkg.name, pkgRel);\n\n if (changed) {\n modified.push(pkg);\n }\n }\n\n return modified;\n}\n\nasync function computeNextVersion(\n packagePath: string,\n currentVersion: string,\n bump: VersionBump,\n git: ReturnType<typeof simpleGit>,\n gitCwd: string,\n pkgName: string,\n): Promise<string> {\n if (bump === 'auto') {\n const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd, pkgName);\n return semver.inc(currentVersion, detectedBump) || currentVersion;\n }\n return semver.inc(currentVersion, bump) || currentVersion;\n}\n\nasync function detectVersionFromCommits(\n git: ReturnType<typeof simpleGit>,\n packagePath: string,\n gitCwd: string,\n pkgName: string,\n): Promise<'major' | 'minor' | 'patch'> {\n try {\n const relPath = relative(resolve(gitCwd), resolve(packagePath));\n const messages = await getCommitsSinceTag(git, pkgName, relPath);\n\n let hasMinor = false;\n let hasBreaking = false;\n\n for (const message of messages) {\n const msg = message.toLowerCase();\n if (msg.includes('!:') || msg.includes('breaking change')) {\n hasBreaking = true;\n } else if (msg.startsWith('feat') || msg.startsWith('feature')) {\n hasMinor = true;\n }\n }\n\n if (hasBreaking) {return 'major';}\n if (hasMinor) {return 'minor';}\n return 'patch';\n } catch {\n return 'patch';\n }\n}\n\nfunction detectBumpType(currentVersion: string, nextVersion: string): VersionBump {\n if (semver.major(currentVersion) < semver.major(nextVersion)) {\n return 'major';\n }\n if (semver.minor(currentVersion) < semver.minor(nextVersion)) {\n return 'minor';\n }\n return 'patch';\n}\n\n/**\n * Match a package against a list of patterns.\n * - Patterns starting with '@' or without '/' → matched against package name.\n * - Patterns containing '/' (non-scoped) → matched against relative path.\n * - Supports '*' wildcard (single path segment, not separator).\n */\nexport function matchesPackagePattern(pkgName: string, relativePath: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n const isPathPattern = pattern.includes('/') && !pattern.startsWith('@');\n const target = isPathPattern ? relativePath : pkgName;\n const regex = new RegExp(\n '^' + pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '[^/]*') + '$'\n );\n if (regex.test(target)) {return true;}\n }\n return false;\n}\n\n","/**\n * @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,\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n };\n } catch (error: any) {\n return {\n ok: false,\n code: error.exitCode || 1,\n stdout: error.stdout || '',\n stderr: error.stderr || error.message || '',\n };\n }\n },\n };\n}\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 } from 'node:path';\nimport type { PackageVersion, ReleasePlan } from './types';\nimport type { ShellAPI } from '@kb-labs/sdk';\nimport { createExecaShellAdapter } from './shell-adapter';\n\nexport interface PublisherOptions {\n cwd: string;\n plan: ReleasePlan;\n dryRun?: boolean;\n shell?: ShellAPI;\n config?: import('./types').ReleaseConfig;\n}\n\nexport interface PublishingResult {\n published: string[];\n skipped: string[];\n errors: string[];\n versionUpdates: Array<{\n package: string;\n from: string;\n to: string;\n updated: boolean;\n }>;\n}\n\n/**\n * Publish packages according to plan\n */\nexport async function publishPackages(options: PublisherOptions): Promise<PublishingResult> {\n const { plan, dryRun, shell } = options;\n const shellApi = shell || createExecaShellAdapter();\n const result: PublishingResult = {\n published: [],\n skipped: [],\n errors: [],\n versionUpdates: [],\n };\n\n if (dryRun) {\n // In dry-run, just report what would be published\n for (const pkg of plan.packages) {\n result.skipped.push(`${pkg.name}@${pkg.nextVersion} (dry-run)`);\n // Record planned version update (not applied)\n result.versionUpdates.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: false,\n });\n }\n return result;\n }\n\n // Publish each package\n for (const pkg of plan.packages) {\n try {\n const registry = plan.registry || 'https://registry.npmjs.org';\n\n // 1. Update version in package.json BEFORE publishing\n try {\n await updatePackageVersion(pkg);\n result.versionUpdates.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: true,\n });\n } catch (versionError) {\n const msg = `Failed to update version for ${pkg.name}: ${versionError instanceof Error ? versionError.message : String(versionError)}`;\n result.errors.push(msg);\n result.versionUpdates.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: false,\n });\n continue; // Skip publish if version update failed\n }\n\n // 2. Publish to npm\n const pm = options.config?.publish?.packageManager ?? 'pnpm';\n const access = options.config?.publish?.access ?? 'public';\n const publishResult = await shellApi.exec(\n pm,\n ['publish', '--access', access, '--registry', registry],\n {\n cwd: pkg.path,\n timeout: 60000,\n }\n );\n\n if (publishResult.ok) {\n result.published.push(`${pkg.name}@${pkg.nextVersion}`);\n } else {\n const errorDetails = publishResult.stderr || publishResult.stdout || 'Unknown error';\n result.errors.push(`Failed to publish ${pkg.name}: ${errorDetails}`);\n }\n } catch (error) {\n const msg = `Failed to publish ${pkg.name}: ${error instanceof Error ? error.message : String(error)}`;\n result.errors.push(msg);\n }\n }\n\n return result;\n}\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 * Generate changelog entry for release\n * Note: This is a simplified wrapper. Full changelog generation is handled by @kb-labs/release-manager-changelog\n */\nexport async function generateChangelog(options: {\n cwd: string;\n plan: ReleasePlan;\n}): Promise<string> {\n const { cwd, plan } = options;\n \n const changelogPath = join(cwd, 'CHANGELOG.md');\n let existingChangelog = '';\n \n try {\n existingChangelog = await readFile(changelogPath, 'utf-8');\n } catch {\n // Changelog doesn't exist yet\n }\n\n const date = new Date().toISOString().split('T')[0];\n const header = `## [${date}] Release\\n\\n`;\n \n const entries: string[] = [];\n for (const pkg of plan.packages) {\n entries.push(`- **${pkg.name}**: ${pkg.currentVersion} → ${pkg.nextVersion}`);\n }\n \n const newEntry = header + entries.join('\\n') + '\\n\\n';\n \n // Prepend to existing changelog\n const updatedChangelog = newEntry + existingChangelog;\n \n // Write back\n try {\n await mkdir(join(cwd, '.kb', 'release'), { recursive: true });\n await writeFile(changelogPath, updatedChangelog, 'utf-8');\n } catch (error) {\n console.warn(`Failed to write changelog: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return newEntry;\n}\n\n/**\n * Generate enhanced changelog using @kb-labs/release-manager-changelog\n * This is the recommended approach for full-featured changelog generation\n *\n * Note: Full integration available via @kb-labs/release-manager-changelog package and CLI command\n */\nexport async function generateEnhancedChangelog(options: {\n cwd: string;\n plan: ReleasePlan;\n from?: string;\n to?: string;\n config?: any;\n}): Promise<{ changelog: string; manifest: any }> {\n // Full changelog generation is available via @kb-labs/release-manager-changelog\n // For now, fallback to simple changelog\n const simpleChangelog = await generateChangelog({\n cwd: options.cwd,\n plan: options.plan,\n });\n\n return {\n changelog: simpleChangelog,\n manifest: null,\n };\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 for (const pkg of plan.packages) {\n try {\n // For single-package releases, use the entire changelog\n // For multi-package releases, extract package-specific section\n let packageChangelog: string;\n\n if (plan.packages.length === 1) {\n // Single package release: use entire changelog as-is\n packageChangelog = changelog;\n } else {\n // Multi-package release: extract section for this package\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 const versionPattern = new RegExp(\n `^##\\\\s+${pkg.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+${pkg.nextVersion.replace(/\\./g, '\\\\.')}`,\n 'm'\n );\n\n let updatedChangelog: string;\n if (existingChangelog && versionPattern.test(existingChangelog)) {\n // Version already exists - replace the section instead of prepending\n // Find where current version section starts and next section 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 && /^##\\s+@?[\\w-]+/.test(line)) {\n // Found next section header\n endIdx = i;\n break;\n }\n }\n\n if (startIdx !== -1) {\n // Replace the existing section\n const before = lines.slice(0, startIdx).join('\\n');\n const after = lines.slice(endIdx).join('\\n');\n updatedChangelog = (before ? before + '\\n' : '') + packageChangelog + (after ? '\\n' + after : '');\n } else {\n // Fallback: just use new changelog\n updatedChangelog = packageChangelog;\n }\n } else {\n // Prepend new entry\n updatedChangelog = packageChangelog + (existingChangelog ? '\\n' + existingChangelog : '');\n }\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/**\n * Create package-specific changelog entry with proper header\n */\nfunction createPackageChangelog(pkg: PackageVersion, changelog: string): string {\n // Extract ONLY the section for this package from the full changelog\n // Format: ## @scope/package-name X.Y.Z\n const packageHeaderPattern = new RegExp(\n `^##\\\\s+${pkg.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+\\\\d+\\\\.\\\\d+\\\\.\\\\d+`,\n 'gm'\n );\n\n const allHeaders = Array.from(changelog.matchAll(/^##\\s+(@[\\w-]+\\/)?[\\w-]+\\s+\\d+\\.\\d+\\.\\d+/gm));\n\n // Find start index for this package\n let startIdx = -1;\n let endIdx = changelog.length;\n\n for (let i = 0; i < allHeaders.length; i++) {\n const match = allHeaders[i];\n if (!match || !match.index) {continue;}\n\n if (packageHeaderPattern.test(match[0])) {\n startIdx = match.index;\n // Find next package header\n if (i + 1 < allHeaders.length) {\n endIdx = allHeaders[i + 1]!.index!;\n }\n break;\n }\n }\n\n if (startIdx === -1) {\n // Package section not found in changelog, return empty\n return '';\n }\n\n // Extract the section for this package\n return changelog.substring(startIdx, endIdx).trim();\n}\n\n/**\n * Commit and tag release changes\n *\n * Each package is committed inside its own git repo (supports submodules).\n * After all packages are committed, tags are created in cwd (the monorepo root).\n */\nexport async function commitAndTagRelease(options: {\n cwd: string;\n plan: ReleasePlan;\n dryRun?: boolean;\n /** Pass --no-verify to git push and pushTags. Default: false — hooks run normally. */\n noVerify?: boolean;\n}): Promise<{ committed: boolean; tagged: string[]; pushed: boolean }> {\n const { cwd, plan, dryRun, noVerify = false } = 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 toplevel — monorepo packages share one root,\n // submodules have different roots. One commit/push per unique git root.\n const pkgToRoot = new Map<string, string>();\n for (const pkg of plan.packages) {\n try {\n const root = (await simpleGit(pkg.path).revparse(['--show-toplevel'])).trim();\n pkgToRoot.set(pkg.path, root);\n } catch {\n pkgToRoot.set(pkg.path, pkg.path);\n }\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 // 1. Commit once per git root — stage all files for packages living in that root\n for (const [root, pkgs] of rootToPkgs) {\n const rootGit = simpleGit(root);\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 await rootGit.add(filesToStage);\n\n try {\n await rootGit.commit(commitMessage);\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 }\n\n // 2. Create tags — lockstep = one tag per git root, independent = per-package tag\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const isLockstep = plan.packages.length > 1 && uniqueVersions.size === 1;\n\n if (isLockstep) {\n const version = plan.packages[0]!.nextVersion;\n const tagName = `v${version}`;\n for (const root of rootToPkgs.keys()) {\n await simpleGit(root).addTag(tagName);\n }\n result.tagged.push(tagName);\n } else {\n for (const pkg of plan.packages) {\n const root = pkgToRoot.get(pkg.path)!;\n const tagName = `${pkg.name}@${pkg.nextVersion}`;\n await simpleGit(root).addTag(tagName);\n result.tagged.push(tagName);\n }\n }\n\n // 3. Push once per git root\n const pushFlags: string[] = noVerify ? ['--no-verify'] : [];\n const pushTagsOptions = noVerify ? ['--no-verify'] : undefined;\n for (const root of rootToPkgs.keys()) {\n const rootGit = simpleGit(root);\n if (result.committed) {\n await rootGit.push(pushFlags);\n }\n await rootGit.pushTags(pushTagsOptions);\n }\n result.pushed = true;\n\n } catch (error) {\n console.error(`Git operations failed: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n\n return result;\n}\n\n/**\n * Create conventional commit message for release\n */\nfunction createCommitMessage(plan: ReleasePlan): string {\n const lines: string[] = [];\n\n if (plan.packages.length === 1 && plan.packages[0]) {\n const pkg = plan.packages[0];\n lines.push(`chore(release): publish ${pkg.name}@${pkg.nextVersion}`);\n } else {\n lines.push(`chore(release): publish ${plan.packages.length} packages`);\n }\n\n lines.push('');\n\n for (const pkg of plan.packages) {\n lines.push(`- ${pkg.name}@${pkg.nextVersion}`);\n }\n\n return lines.join('\\n');\n}\n\n","/**\n * Rollback - manages release snapshots and recovery\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { ReleasePlan, PackageVersion } from './types';\n\nexport interface RollbackSnapshot {\n ts: string;\n packages: PackageVersion[];\n}\n\n// MAX_HISTORY = 5; // Future use for snapshot retention\n\n/**\n * Save current state for potential rollback\n */\nexport async function saveSnapshot(options: {\n cwd: string;\n plan: ReleasePlan;\n}): Promise<void> {\n const { cwd, plan } = options;\n \n const snapshot: RollbackSnapshot = {\n ts: new Date().toISOString(),\n packages: plan.packages.map(pkg => ({\n ...pkg,\n nextVersion: pkg.currentVersion, // Store current before update\n })),\n };\n\n const snapshotDir = join(cwd, '.kb', 'release');\n await mkdir(snapshotDir, { recursive: true });\n \n const snapshotPath = join(snapshotDir, 'backup.json');\n await writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf-8');\n \n // Cleanup old snapshots\n await cleanupOldSnapshots(snapshotDir);\n}\n\n/**\n * Restore from snapshot\n */\nexport async function restoreSnapshot(cwd: string): Promise<void> {\n const snapshotPath = join(cwd, '.kb', 'release', 'backup.json');\n \n if (!existsSync(snapshotPath)) {\n throw new Error('No backup snapshot found');\n }\n\n const snapshotContent = await readFile(snapshotPath, 'utf-8');\n const snapshot: RollbackSnapshot = JSON.parse(snapshotContent);\n\n // Restore package.json versions\n for (const pkg of snapshot.packages) {\n const packageJsonPath = join(pkg.path, 'package.json');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n \n packageJson.version = pkg.currentVersion;\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n }\n}\n\nasync function cleanupOldSnapshots(_snapshotDir: string): Promise<void> {\n // For now, just keep the latest backup.json\n // In the future, could maintain timestamped backups\n // and trim to MAX_HISTORY\n}\n\n","/**\n * Main release runner - orchestrates full release lifecycle\n */\n\nimport type {\n ReleaseConfig,\n ReleaseContext,\n ReleaseResult,\n ReleaseStage,\n CheckId,\n CheckResult,\n} from './types';\n\nexport interface RunnerOptions {\n config: ReleaseConfig;\n context: ReleaseContext;\n runChecks?: (stage: ReleaseStage) => Promise<Partial<Record<CheckId, CheckResult>>>;\n executePlan?: () => Promise<void>;\n onStageChange?: (stage: ReleaseStage) => void;\n}\n\n/**\n * Run full release process\n */\nexport async function runRelease(options: RunnerOptions): Promise<ReleaseResult> {\n const {\n config,\n runChecks,\n executePlan,\n onStageChange,\n } = options;\n\n const startTime = Date.now();\n const errors: string[] = [];\n let checks: Partial<Record<CheckId, CheckResult>> | undefined;\n\n try {\n // Stage 1: Planning\n onStageChange?.('planning');\n \n // Stage 2: Pre-release checks\n if (config.verify && config.verify.length > 0 && runChecks) {\n onStageChange?.('checking');\n checks = await runChecks('checking');\n \n // Check if any checks failed\n const failedChecks = Object.entries(checks)\n .filter(([_, result]) => result && !result.ok)\n .map(([id]) => id);\n \n if (failedChecks.length > 0) {\n errors.push(`Pre-release checks failed: ${failedChecks.join(', ')}`);\n \n if (config.strict) {\n return {\n ok: false,\n timingMs: Date.now() - startTime,\n errors,\n checks,\n };\n }\n }\n }\n\n // Stage 3: Versioning and publishing\n onStageChange?.('publishing');\n \n if (executePlan) {\n await executePlan();\n }\n\n // Stage 4: Verification\n onStageChange?.('verifying');\n \n return {\n ok: errors.length === 0,\n timingMs: Date.now() - startTime,\n errors: errors.length > 0 ? errors : undefined,\n checks,\n };\n } catch (error) {\n // Rollback on error\n onStageChange?.('rollback');\n \n errors.push(error instanceof Error ? error.message : String(error));\n \n return {\n ok: false,\n timingMs: Date.now() - startTime,\n errors,\n checks,\n };\n }\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 * Safe build — builds into temp dir, then atomically swaps dist/.\n * Prevents crashing running services whose dist/ is wiped by tsup's `clean: true`.\n */\n\nimport { rename, rm, cp } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport type { BuildResult, PackageVersion } from './types';\n\n/**\n * Build all packages in a plan using safe build strategy.\n * Stops on first failure.\n */\nexport async function buildPackages(\n packages: PackageVersion[],\n options?: {\n logger?: { info?: (...args: any[]) => void; warn?: (...args: any[]) => void; error?: (...args: any[]) => void };\n onProgress?: (pkg: string, result: BuildResult) => void;\n },\n): Promise<BuildResult[]> {\n const results: BuildResult[] = [];\n\n for (const pkg of packages) {\n options?.logger?.info?.(`Building ${pkg.name}...`);\n const result = await runSafeBuild(pkg.path, pkg.name);\n results.push({ ...result, name: pkg.name });\n\n options?.onProgress?.(pkg.name, { ...result, name: pkg.name });\n\n if (!result.success) {\n options?.logger?.error?.(`Build failed for ${pkg.name}: ${result.error}`);\n break;\n }\n\n options?.logger?.info?.(`Built ${pkg.name} in ${result.durationMs}ms`);\n }\n\n return results;\n}\n\n/**\n * Run build for a single package using safe temp-dir strategy when tsup is detected.\n * Falls back to regular `pnpm run build` for non-tsup packages.\n */\nexport async function runSafeBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const usesTsup = existsSync(join(packagePath, 'tsup.config.ts'))\n || existsSync(join(packagePath, 'tsup.config.js'));\n\n if (usesTsup) {\n return runTsupSafeBuild(packagePath, packageName);\n }\n\n return runDirectBuild(packagePath, packageName);\n}\n\n/**\n * Check if a shell command is a build command that should use safe build.\n */\nexport function isBuildCommand(command: string, args?: string[]): boolean {\n const full = [command, ...(args ?? [])].join(' ').trim();\n return /\\b(pnpm|npm|yarn)\\s+(run\\s+)?build\\b/.test(full);\n}\n\nasync function runTsupSafeBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const startTime = Date.now();\n const buildId = randomBytes(6).toString('hex');\n const tempDir = join(tmpdir(), `kb-release-build-${buildId}`);\n const distDir = join(packagePath, 'dist');\n const backupDir = join(packagePath, `dist.bak-${buildId}`);\n\n try {\n const buildResult = await spawnCommand(`npx tsup -d ${tempDir}`, packagePath);\n\n if (!buildResult.success) {\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n return { ...buildResult, name: packageName, durationMs: Date.now() - startTime };\n }\n\n if (existsSync(distDir)) {\n await rename(distDir, backupDir);\n }\n\n try {\n await rename(tempDir, distDir);\n } catch {\n await cp(tempDir, distDir, { recursive: true });\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n\n await rm(backupDir, { recursive: true, force: true }).catch(() => {});\n return { success: true, name: packageName, durationMs: Date.now() - startTime };\n } catch (err) {\n if (existsSync(backupDir) && !existsSync(distDir)) {\n await rename(backupDir, distDir).catch(() => {});\n }\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n return {\n success: false,\n name: packageName,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startTime,\n };\n }\n}\n\nasync function runDirectBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const result = await spawnCommand('pnpm run build', packagePath);\n return { ...result, name: packageName };\n}\n\nexport interface SpawnResult extends Omit<BuildResult, 'name'> {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Spawn a shell command and collect results.\n * Captures both stdout and stderr — build tools often write errors to stdout.\n */\nexport function spawnCommand(command: string, cwd: string, timeoutMs = 5 * 60 * 1000): Promise<SpawnResult> {\n const startTime = Date.now();\n\n return new Promise((resolve) => {\n const child = spawn(command, [], {\n cwd,\n stdio: 'pipe',\n shell: true,\n env: { ...process.env },\n });\n\n let stdout = '';\n let stderr = '';\n child.stdout?.on('data', (data) => { stdout += data.toString(); });\n child.stderr?.on('data', (data) => { stderr += data.toString(); });\n\n child.on('close', (code) => {\n const exitCode = code ?? 1;\n const durationMs = Date.now() - startTime;\n if (exitCode === 0) {\n resolve({ success: true, durationMs, stdout, stderr, exitCode });\n return;\n }\n\n // Build error message from available output (last N lines to keep it readable)\n const combined = (stderr || stdout).trim();\n const tail = combined\n .split('\\n')\n .slice(-30)\n .join('\\n');\n\n resolve({\n success: false,\n error: tail || `Build failed with exit code ${exitCode}`,\n durationMs,\n stdout,\n stderr,\n exitCode,\n });\n });\n\n child.on('error', (err) => {\n resolve({ success: false, error: err.message, durationMs: Date.now() - startTime, stdout: '', stderr: '', exitCode: 1 });\n });\n\n setTimeout(() => {\n child.kill();\n resolve({ success: false, error: `Timed out after ${timeoutMs / 1000}s`, durationMs: Date.now() - startTime, stdout: '', stderr: '', exitCode: 1 });\n }, timeoutMs);\n });\n}\n","/**\n * Unified check runner for release manager.\n * Reads config.checks[], supports parser field, script path resolution, perPackage routing.\n */\n\nimport { join } from 'node:path';\nimport type { CustomCheckConfig, CheckResult, CheckResultDetails } from './types';\nimport { spawnCommand } from './build';\n\nexport interface CheckRunnerOptions {\n repoRoot: string;\n packagePaths: string[];\n scopePath?: string;\n logger?: { info?: (...args: any[]) => void; warn?: (...args: any[]) => void };\n}\n\n/**\n * Run all configured checks against packages.\n * Handles: parser evaluation, script path resolution, perPackage/scopePath/repoRoot routing.\n */\nexport async function runReleaseChecks(\n checks: CustomCheckConfig[],\n options: CheckRunnerOptions,\n): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n for (const check of checks) {\n const result = await runSingleCheck(check, options);\n results.push(result);\n\n options.logger?.info?.(`Check ${check.id}: ${result.ok ? 'passed' : 'failed'} (${result.timingMs}ms)`);\n\n // Stop on first non-optional failure\n if (!result.ok && !check.optional) {\n break;\n }\n }\n\n return results;\n}\n\nasync function runSingleCheck(\n check: CustomCheckConfig,\n options: CheckRunnerOptions,\n): Promise<CheckResult> {\n const runIn = check.runIn ?? 'perPackage';\n let pathsToRun: string[];\n\n if (runIn === 'repoRoot') {\n pathsToRun = [options.repoRoot];\n } else if (runIn === 'scopePath') {\n pathsToRun = [options.scopePath ?? options.repoRoot];\n } else {\n pathsToRun = options.packagePaths.length > 0 ? options.packagePaths : [options.repoRoot];\n }\n\n // Run perPackage checks in parallel (concurrency=8); single-path checks run sequentially.\n const CONCURRENCY = 8;\n\n const resolvedArgs = (check.args ?? []).map(arg =>\n arg.match(/\\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg\n );\n const fullCommand = [check.command, ...resolvedArgs].join(' ');\n const timeoutMs = check.timeoutMs ?? 120_000;\n\n type PkgRunResult = { path: string; ok: boolean; details: CheckResultDetails; durationMs: number };\n\n async function runForPath(pkgPath: string): Promise<PkgRunResult> {\n const result = await spawnCommand(fullCommand, pkgPath, timeoutMs);\n const ok = evaluateParser(check, result.stdout, result.stderr, result.exitCode);\n return {\n path: pkgPath,\n ok,\n durationMs: result.durationMs,\n details: {\n packagePath: pkgPath,\n stdout: result.stdout || undefined,\n stderr: result.stderr || undefined,\n exitCode: result.exitCode,\n error: result.error ?? (!ok ? `exit code ${result.exitCode}` : undefined),\n },\n };\n }\n\n let pkgResults: PkgRunResult[];\n\n if (runIn === 'perPackage' && pathsToRun.length > 1) {\n // Parallel with concurrency limit\n pkgResults = [];\n for (let i = 0; i < pathsToRun.length; i += CONCURRENCY) {\n const batch = pathsToRun.slice(i, i + CONCURRENCY);\n pkgResults.push(...await Promise.all(batch.map(runForPath)));\n }\n } else {\n pkgResults = [await runForPath(pathsToRun[0]!)];\n }\n\n const firstFailure = pkgResults.find(r => !r.ok)?.details;\n const totalDurationMs = pkgResults.reduce((sum, r) => sum + r.durationMs, 0);\n const perPackage: NonNullable<CheckResult['packages']> | undefined = pathsToRun.length > 1\n ? pkgResults.map(r => ({ path: r.path, ok: r.ok, details: r.ok ? undefined : r.details }))\n : undefined;\n\n const allOk = !firstFailure;\n\n return {\n id: check.id,\n ok: allOk,\n details: firstFailure,\n hint: check.optional ? 'optional' : undefined,\n timingMs: totalDurationMs,\n packages: perPackage && perPackage.length > 0 ? perPackage : undefined,\n };\n}\n\nfunction evaluateParser(\n check: CustomCheckConfig,\n stdout: string,\n stderr: string,\n exitCode: number,\n): boolean {\n const parser = check.parser ?? 'exitcode';\n\n if (parser === 'exitcode') {\n return exitCode === 0;\n }\n\n if (parser === 'json') {\n try {\n const parsed = JSON.parse(stdout);\n return parsed.ok === true || parsed.success === true || parsed.status === 'ok';\n } catch {\n return false;\n }\n }\n\n if (typeof parser === 'function') {\n return parser(stdout, stderr, exitCode);\n }\n\n return exitCode === 0;\n}\n","/**\n * Package verifier — npm pack → extract → verify artifacts before publish.\n * Catches: directory imports, test file leaks, missing exports, syntax errors.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync, mkdirSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport { rmSync, writeFileSync } from 'node:fs';\nimport type { VerifyResult, PackageVersion } 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?: { info?: (...args: any[]) => void };\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 execSync(`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 execSync(`tar xzf ${tgzFile}`, { cwd: tmpDir, stdio: 'pipe' });\n const extractedDir = join(tmpDir, 'package');\n\n // 3. 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 // 4. Exports exist\n const extractedPkg = JSON.parse(readFileSync(join(extractedDir, 'package.json'), 'utf-8'));\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 // 5. 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 try {\n execSync(`node --check ${esmPath}`, { stdio: 'pipe', timeout: 10_000 });\n } catch {\n issues.push(`ESM syntax error in ${esmEntry}`);\n }\n }\n }\n\n // 6. CJS syntax check\n const cjsEntry = resolveCjsEntry(extractedPkg);\n if (cjsEntry) {\n const cjsPath = join(extractedDir, cjsEntry);\n if (existsSync(cjsPath)) {\n try {\n execSync(`node --check ${cjsPath}`, { stdio: 'pipe', timeout: 10_000 });\n } catch {\n issues.push(`CJS syntax error in ${cjsEntry}`);\n }\n }\n }\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\nfunction resolveEsmEntry(pkg: any): string | undefined {\n return pkg.exports?.['.']?.import ?? pkg.module ?? pkg.main;\n}\n\nfunction resolveCjsEntry(pkg: any): string | undefined {\n const req = pkg.exports?.['.']?.require;\n if (req) {return req;}\n if (pkg.main?.endsWith('.cjs')) {return pkg.main;}\n return undefined;\n}\n\nfunction checkExportsExist(exports: any, 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 * 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\nimport { join } from 'node:path';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { planRelease } from './planner';\nimport { saveSnapshot, restoreSnapshot } from './rollback';\nimport { updatePackageVersions } from './publisher';\nimport { copyChangelogToPackages, commitAndTagRelease } from './publisher';\nimport { buildPackages } from './build';\nimport { runReleaseChecks } from './checks';\nimport { verifyPackages } from './verifier';\nimport type {\n PipelineOptions,\n PipelineResult,\n ReleaseReport,\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, repoRoot, scopeCwd, scope, config, dryRun = false,\n skipChecks = false, skipBuild = false, skipVerify = 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 // 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 });\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 // 2. Snapshot (for rollback)\n await saveSnapshot({ cwd: repoRoot, plan });\n\n // 3. Checks\n if (!skipChecks && checkConfigs && checkConfigs.length > 0) {\n progress('checking', `Running ${checkConfigs.length} pre-release check(s)...`);\n\n const packagePaths = plan.packages.map(p => p.path);\n const checkResults = await runReleaseChecks(checkConfigs, {\n repoRoot,\n packagePaths,\n scopePath: scopeCwd,\n logger,\n });\n\n const failed = checkResults.filter(r => !r.ok && r.hint !== 'optional');\n if (failed.length > 0) {\n await restoreSnapshot(repoRoot);\n\n // Build rich per-check error messages for both human and agent consumption\n const errorLines = failed.flatMap(f => {\n const lines: string[] = [`check \"${f.id}\" failed`];\n if (f.details?.packagePath) lines.push(` package: ${f.details.packagePath}`);\n if (f.details?.error) lines.push(` reason: ${f.details.error}`);\n if (f.details?.stderr?.trim()) lines.push(` stderr: ${f.details.stderr.trim().split('\\n').slice(0, 5).join('\\n ')}`);\n if (f.details?.stdout?.trim() && !f.details?.stderr?.trim()) lines.push(` output: ${f.details.stdout.trim().split('\\n').slice(0, 5).join('\\n ')}`);\n if (f.packages?.filter(p => !p.ok).length) {\n const failedPkgs = f.packages.filter(p => !p.ok);\n lines.push(` failed in ${failedPkgs.length}/${f.packages.length} package(s):`);\n for (const pkg of failedPkgs.slice(0, 10)) {\n lines.push(` - ${pkg.path}${pkg.details?.error ? `: ${pkg.details.error}` : ''}`);\n }\n }\n return lines;\n });\n\n return {\n success: false,\n plan,\n report: buildReport('checking', plan, repoRoot, dryRun, startTime, {\n ok: false,\n checks: Object.fromEntries(checkResults.map(r => [r.id, r])),\n errors: errorLines,\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n progress('checking', 'Pre-release checks passed');\n }\n\n // 4. Build\n if (!skipBuild && !dryRun) {\n progress('versioning', `Building ${plan.packages.length} package(s)...`);\n const buildResults = await buildPackages(plan.packages, { logger });\n const buildFailed = buildResults.filter(r => !r.success);\n\n if (buildFailed.length > 0) {\n await restoreSnapshot(repoRoot);\n return {\n success: false,\n plan,\n report: buildReport('versioning', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: buildFailed.map(f => `Build failed: ${f.name} — ${f.error}`),\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n\n // 5. Verify (pack + install check)\n if (!skipVerify && !dryRun) {\n progress('verifying', 'Verifying package artifacts...');\n const verifyResults = await verifyPackages(plan.packages, { logger });\n const verifyFailed = verifyResults.filter(r => !r.success);\n\n if (verifyFailed.length > 0) {\n await restoreSnapshot(repoRoot);\n const allIssues = verifyFailed.flatMap(r => r.issues.map(i => `${r.name}: ${i}`));\n return {\n success: false,\n plan,\n report: buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: [`Package verification failed:\\n ${allIssues.join('\\n ')}`],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n progress('verifying', 'Package artifacts verified');\n }\n\n // 6. Version bump\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 // 7. Changelog\n let changelogMd = '';\n if (changelogGen) {\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 const changelogPath = join(repoRoot, '.kb', 'release', 'CHANGELOG.md');\n await mkdir(join(repoRoot, '.kb', 'release'), { recursive: true });\n await writeFile(changelogPath, changelogMd, 'utf-8');\n }\n\n // 8. Git commit + tag (before publish so tree is clean for pnpm publish git-checks)\n let gitResult: { committed: boolean; tagged: string[]; pushed: boolean } | undefined;\n if (!dryRun) {\n progress('verifying', 'Committing and tagging release...');\n gitResult = await commitAndTagRelease({ cwd: scopeCwd, plan, dryRun, noVerify });\n }\n\n // 9. Publish\n progress('publishing', dryRun ? 'Simulating publish (dry-run)...' : '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 = await publisher.publish(packagesToPublish, {\n dryRun,\n access: 'public',\n });\n\n // 10. Report\n const report = buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: publishResult.errors.length === 0 && (!gitResult || gitResult.committed),\n published: publishResult.published,\n skipped: publishResult.skipped,\n changelog: changelogMd || undefined,\n git: gitResult,\n errors: publishResult.errors.length > 0 ? publishResult.errors : undefined,\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\nfunction buildReport(\n stage: ReleaseStage,\n plan: any,\n repoRoot: string,\n dryRun: boolean,\n startTime: number,\n result: any,\n): ReleaseReport {\n return {\n schemaVersion: '1.0',\n ts: new Date().toISOString(),\n context: { repo: repoRoot, cwd: repoRoot, branch: 'unknown', dryRun },\n stage,\n plan,\n result: { ...result, timingMs: result.timingMs ?? (Date.now() - startTime) },\n };\n}\n","/**\n * Scope utilities — resolve scope name to filesystem path.\n *\n * \"scope\" is a filter/selector concept (e.g. \"@kb-labs/release-manager\", \"installer/kb-labs-create\").\n * \"scopePath\" is the resolved absolute filesystem path used for checks (runIn: scopePath) and git ops.\n *\n * Discovery (planRelease) always uses repoRoot + scope filter — never scopePath directly.\n */\n\nimport { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\n/**\n * Resolve a scope name to an absolute filesystem path.\n *\n * - 'root' → repoRoot\n * - '@kb-labs/foo' → directory containing package.json with that name\n * - 'installer/kb-labs-create' → repoRoot/installer/kb-labs-create (direct path)\n *\n * Used only where a physical path is required:\n * - checks with runIn: 'scopePath'\n * - git commit/tag cwd\n * - changelog gitCwd\n *\n * NOT used for package discovery — planRelease always takes (repoRoot, scope).\n */\nexport async function resolveScopePath(repoRoot: string, scope: string): Promise<string> {\n if (!scope || scope === 'root') {\n return repoRoot;\n }\n\n // Scoped npm package name → scan package.json files\n if (scope.startsWith('@')) {\n const packageJsonPaths = await globby('**/package.json', {\n cwd: repoRoot,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.*/**'],\n });\n\n for (const pkgJsonPath of packageJsonPaths) {\n try {\n const pkg = JSON.parse(await readFile(pkgJsonPath, 'utf-8'));\n if (pkg.name === scope) {\n return join(pkgJsonPath, '..');\n }\n } catch { /* skip */ }\n }\n }\n\n // Direct relative path (e.g. 'installer/kb-labs-create', 'plugins/kb-labs-mind')\n return join(repoRoot, scope);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/release-manager-core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.13.0",
|
|
4
4
|
"description": "KB Labs Release Manager - core orchestration, planning, versioning, and publishing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"tsup": "^8.5.0",
|
|
44
44
|
"typescript": "^5.6.3",
|
|
45
45
|
"vitest": "^3.2.4",
|
|
46
|
-
"@kb-labs/devkit": "2.
|
|
46
|
+
"@kb-labs/devkit": "2.13.0"
|
|
47
47
|
},
|
|
48
48
|
"engines": {
|
|
49
49
|
"node": ">=20.0.0",
|