@kb-labs/release-manager-core 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +4 -0
- package/dist/index.js +29 -22
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -231,6 +231,8 @@ interface PipelineOptions {
|
|
|
231
231
|
publisher: PackagePublisher;
|
|
232
232
|
/** Injected changelog generator (with or without LLM) */
|
|
233
233
|
changelog?: ChangelogGenerator;
|
|
234
|
+
/** Pass --no-verify to git push and pushTags. Default: false (hooks run normally). */
|
|
235
|
+
noVerify?: boolean;
|
|
234
236
|
logger?: {
|
|
235
237
|
info?: (...args: any[]) => void;
|
|
236
238
|
warn?: (...args: any[]) => void;
|
|
@@ -345,6 +347,8 @@ declare function commitAndTagRelease(options: {
|
|
|
345
347
|
cwd: string;
|
|
346
348
|
plan: ReleasePlan;
|
|
347
349
|
dryRun?: boolean;
|
|
350
|
+
/** Pass --no-verify to git push and pushTags. Default: false — hooks run normally. */
|
|
351
|
+
noVerify?: boolean;
|
|
348
352
|
}): Promise<{
|
|
349
353
|
committed: boolean;
|
|
350
354
|
tagged: string[];
|
package/dist/index.js
CHANGED
|
@@ -88,17 +88,19 @@ async function planRelease(options) {
|
|
|
88
88
|
modifiedPackages = packages;
|
|
89
89
|
} else {
|
|
90
90
|
const git = simpleGit(cwd, { timeout: { block: 6e4 } });
|
|
91
|
-
modifiedPackages = await detectModifiedPackages(git, packages);
|
|
91
|
+
modifiedPackages = await detectModifiedPackages(git, packages, cwd);
|
|
92
92
|
}
|
|
93
93
|
let planPackages = [];
|
|
94
94
|
for (const pkg of modifiedPackages) {
|
|
95
95
|
const bump = bumpOverride || config.bump || "auto";
|
|
96
|
-
const
|
|
96
|
+
const gitCwd = isWorkspaceRoot ? pkg.path : cwd;
|
|
97
|
+
const git = simpleGit(gitCwd, { timeout: { block: 6e4 } });
|
|
97
98
|
const nextVersion = await computeNextVersion(
|
|
98
99
|
pkg.path,
|
|
99
100
|
pkg.currentVersion,
|
|
100
101
|
bump,
|
|
101
|
-
git
|
|
102
|
+
git,
|
|
103
|
+
gitCwd
|
|
102
104
|
);
|
|
103
105
|
planPackages.push({
|
|
104
106
|
...pkg,
|
|
@@ -148,8 +150,8 @@ async function discoverPackages(cwd, config) {
|
|
|
148
150
|
});
|
|
149
151
|
for (let i = 0; i < packageJsonPaths.length; i++) {
|
|
150
152
|
if (i % 10 === 0) {
|
|
151
|
-
await new Promise((
|
|
152
|
-
setImmediate(
|
|
153
|
+
await new Promise((resolve3) => {
|
|
154
|
+
setImmediate(resolve3);
|
|
153
155
|
});
|
|
154
156
|
}
|
|
155
157
|
const packageJsonPath = packageJsonPaths[i];
|
|
@@ -280,7 +282,7 @@ function shouldIgnoreFile(file) {
|
|
|
280
282
|
];
|
|
281
283
|
return ignoredPaths.some((path) => file.includes(path));
|
|
282
284
|
}
|
|
283
|
-
async function detectModifiedPackages(git, packages) {
|
|
285
|
+
async function detectModifiedPackages(git, packages, cwd) {
|
|
284
286
|
const status = await git.status();
|
|
285
287
|
const diffSummary = await git.diffSummary(["HEAD"]);
|
|
286
288
|
const modifiedPaths = [
|
|
@@ -290,13 +292,14 @@ async function detectModifiedPackages(git, packages) {
|
|
|
290
292
|
const modified = [];
|
|
291
293
|
for (let i = 0; i < packages.length; i++) {
|
|
292
294
|
if (i % 10 === 0) {
|
|
293
|
-
await new Promise((
|
|
294
|
-
setImmediate(
|
|
295
|
+
await new Promise((resolve3) => {
|
|
296
|
+
setImmediate(resolve3);
|
|
295
297
|
});
|
|
296
298
|
}
|
|
297
299
|
const pkg = packages[i];
|
|
300
|
+
const pkgRel = relative(resolve(cwd), resolve(pkg.path));
|
|
298
301
|
const packageModified = modifiedPaths.some(
|
|
299
|
-
(
|
|
302
|
+
(p) => p === pkgRel || p.startsWith(pkgRel + "/")
|
|
300
303
|
);
|
|
301
304
|
if (packageModified) {
|
|
302
305
|
modified.push(pkg);
|
|
@@ -304,18 +307,19 @@ async function detectModifiedPackages(git, packages) {
|
|
|
304
307
|
}
|
|
305
308
|
return modified.length > 0 ? modified : packages;
|
|
306
309
|
}
|
|
307
|
-
async function computeNextVersion(packagePath, currentVersion, bump, git) {
|
|
310
|
+
async function computeNextVersion(packagePath, currentVersion, bump, git, gitCwd) {
|
|
308
311
|
if (bump === "auto") {
|
|
309
|
-
const detectedBump = await detectVersionFromCommits(git, packagePath);
|
|
312
|
+
const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd);
|
|
310
313
|
return semver2.inc(currentVersion, detectedBump) || currentVersion;
|
|
311
314
|
}
|
|
312
315
|
return semver2.inc(currentVersion, bump) || currentVersion;
|
|
313
316
|
}
|
|
314
|
-
async function detectVersionFromCommits(git, packagePath) {
|
|
317
|
+
async function detectVersionFromCommits(git, packagePath, gitCwd) {
|
|
315
318
|
try {
|
|
319
|
+
const relPath = relative(resolve(gitCwd), resolve(packagePath));
|
|
316
320
|
const log = await git.log({
|
|
317
321
|
maxCount: 50,
|
|
318
|
-
file:
|
|
322
|
+
file: relPath
|
|
319
323
|
});
|
|
320
324
|
let hasMinor = false;
|
|
321
325
|
let hasBreaking = false;
|
|
@@ -601,7 +605,7 @@ function createPackageChangelog(pkg, changelog) {
|
|
|
601
605
|
return changelog.substring(startIdx, endIdx).trim();
|
|
602
606
|
}
|
|
603
607
|
async function commitAndTagRelease(options) {
|
|
604
|
-
const { cwd, plan, dryRun } = options;
|
|
608
|
+
const { cwd, plan, dryRun, noVerify = false } = options;
|
|
605
609
|
const simpleGit2 = (await import('simple-git')).default;
|
|
606
610
|
const result = {
|
|
607
611
|
committed: false,
|
|
@@ -647,12 +651,14 @@ async function commitAndTagRelease(options) {
|
|
|
647
651
|
result.tagged.push(tagName);
|
|
648
652
|
}
|
|
649
653
|
}
|
|
654
|
+
const pushFlags = noVerify ? ["--no-verify"] : [];
|
|
655
|
+
const pushTagsOptions = noVerify ? ["--no-verify"] : void 0;
|
|
650
656
|
for (const pkg of plan.packages) {
|
|
651
657
|
const pkgGit = simpleGit2(pkg.path);
|
|
652
658
|
if (result.committed) {
|
|
653
|
-
await pkgGit.push(
|
|
659
|
+
await pkgGit.push(pushFlags);
|
|
654
660
|
}
|
|
655
|
-
await pkgGit.pushTags(
|
|
661
|
+
await pkgGit.pushTags(pushTagsOptions);
|
|
656
662
|
}
|
|
657
663
|
result.pushed = true;
|
|
658
664
|
} catch (error) {
|
|
@@ -974,7 +980,7 @@ async function runDirectBuild(packagePath, packageName) {
|
|
|
974
980
|
}
|
|
975
981
|
function spawnCommand(command, cwd, timeoutMs = 5 * 60 * 1e3) {
|
|
976
982
|
const startTime = Date.now();
|
|
977
|
-
return new Promise((
|
|
983
|
+
return new Promise((resolve3) => {
|
|
978
984
|
const child = spawn(command, [], {
|
|
979
985
|
cwd,
|
|
980
986
|
stdio: "pipe",
|
|
@@ -993,12 +999,12 @@ function spawnCommand(command, cwd, timeoutMs = 5 * 60 * 1e3) {
|
|
|
993
999
|
const exitCode = code ?? 1;
|
|
994
1000
|
const durationMs = Date.now() - startTime;
|
|
995
1001
|
if (exitCode === 0) {
|
|
996
|
-
|
|
1002
|
+
resolve3({ success: true, durationMs, stdout, stderr, exitCode });
|
|
997
1003
|
return;
|
|
998
1004
|
}
|
|
999
1005
|
const combined = (stderr || stdout).trim();
|
|
1000
1006
|
const tail = combined.split("\n").slice(-30).join("\n");
|
|
1001
|
-
|
|
1007
|
+
resolve3({
|
|
1002
1008
|
success: false,
|
|
1003
1009
|
error: tail || `Build failed with exit code ${exitCode}`,
|
|
1004
1010
|
durationMs,
|
|
@@ -1008,11 +1014,11 @@ function spawnCommand(command, cwd, timeoutMs = 5 * 60 * 1e3) {
|
|
|
1008
1014
|
});
|
|
1009
1015
|
});
|
|
1010
1016
|
child.on("error", (err) => {
|
|
1011
|
-
|
|
1017
|
+
resolve3({ success: false, error: err.message, durationMs: Date.now() - startTime, stdout: "", stderr: "", exitCode: 1 });
|
|
1012
1018
|
});
|
|
1013
1019
|
setTimeout(() => {
|
|
1014
1020
|
child.kill();
|
|
1015
|
-
|
|
1021
|
+
resolve3({ success: false, error: `Timed out after ${timeoutMs / 1e3}s`, durationMs: Date.now() - startTime, stdout: "", stderr: "", exitCode: 1 });
|
|
1016
1022
|
}, timeoutMs);
|
|
1017
1023
|
});
|
|
1018
1024
|
}
|
|
@@ -1262,6 +1268,7 @@ async function runReleasePipeline(options) {
|
|
|
1262
1268
|
skipChecks = false,
|
|
1263
1269
|
skipBuild = false,
|
|
1264
1270
|
skipVerify = false,
|
|
1271
|
+
noVerify = false,
|
|
1265
1272
|
checks: checkConfigs,
|
|
1266
1273
|
publisher,
|
|
1267
1274
|
changelog: changelogGen,
|
|
@@ -1401,7 +1408,7 @@ async function runReleasePipeline(options) {
|
|
|
1401
1408
|
let gitResult;
|
|
1402
1409
|
if (!dryRun && publishResult.errors.length === 0) {
|
|
1403
1410
|
progress("verifying", "Committing and tagging release...");
|
|
1404
|
-
gitResult = await commitAndTagRelease({ cwd: scopeCwd, plan, dryRun });
|
|
1411
|
+
gitResult = await commitAndTagRelease({ cwd: scopeCwd, plan, dryRun, noVerify });
|
|
1405
1412
|
}
|
|
1406
1413
|
const report = buildReport("verifying", plan, repoRoot, dryRun, startTime, {
|
|
1407
1414
|
ok: publishResult.errors.length === 0,
|
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 } 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\nexport interface PlannerOptions {\n cwd: string;\n config: ReleaseConfig;\n scope?: string;\n bumpOverride?: VersionBump;\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, config, scope, bumpOverride } = options;\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 {\n const git = simpleGit(cwd, { timeout: { block: 60000 } });\n modifiedPackages = await detectModifiedPackages(git, packages);\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 git = isWorkspaceRoot\n ? simpleGit(pkg.path, { timeout: { block: 60000 } })\n : simpleGit(cwd, { timeout: { block: 60000 } });\n\n const nextVersion = await computeNextVersion(\n pkg.path,\n pkg.currentVersion,\n bump,\n git\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 // Top-level versioningStrategy takes priority over legacy changelog.bumpStrategy\n const bumpStrategy = 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 return packages;\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): Promise<PackageVersion[]> {\n\n // Get list of modified files\n const status = await git.status();\n const diffSummary = await git.diffSummary(['HEAD']);\n\n // Filter out node_modules and other build artifacts\n const modifiedPaths = [\n ...status.files.map(f => f.path),\n ...diffSummary.files.map(f => f.file),\n ].filter(path => !shouldIgnoreFile(path));\n\n\n // Find packages that have changes\n const modified: PackageVersion[] = [];\n for (let i = 0; i < packages.length; i++) {\n // Освобождаем event loop каждые 10 пакетов\n if (i % 10 === 0) {\n await new Promise((resolve) => {\n setImmediate(resolve);\n });\n }\n\n const pkg = packages[i]!;\n\n // Check if any file in this package is modified\n const packageModified = modifiedPaths.some(path =>\n path.startsWith(pkg.path) || path.includes(pkg.name)\n );\n\n if (packageModified) {\n modified.push(pkg);\n }\n }\n\n\n // If no modified packages detected, include all packages (for initial release)\n return modified.length > 0 ? modified : packages;\n}\n\nasync function computeNextVersion(\n packagePath: string,\n currentVersion: string,\n bump: VersionBump,\n git: ReturnType<typeof simpleGit>\n): Promise<string> {\n\n // If auto, detect from conventional commits\n if (bump === 'auto') {\n const detectedBump = await detectVersionFromCommits(git, packagePath);\n return semver.inc(currentVersion, detectedBump) || currentVersion;\n }\n\n // Manual bump\n return semver.inc(currentVersion, bump) || currentVersion;\n}\n\nasync function detectVersionFromCommits(\n git: ReturnType<typeof simpleGit>,\n packagePath: string\n): Promise<'major' | 'minor' | 'patch'> {\n\n try {\n // Get recent commits for this package\n\n const log = await git.log({\n maxCount: 50,\n file: packagePath,\n });\n\n\n let hasMinor = false;\n let hasBreaking = false;\n\n for (const commit of log.all) {\n const message = commit.message.toLowerCase();\n\n // Detect conventional commits\n if (message.includes('!:')) {\n hasBreaking = true;\n } else if (message.startsWith('feat') || message.startsWith('feature')) {\n hasMinor = true;\n }\n // else if fix/bugfix -> patch level (default)\n }\n\n // If breaking change detected\n if (hasBreaking) {\n return 'major';\n }\n\n // If feature added\n if (hasMinor) {\n return 'minor';\n }\n\n // Default to patch\n return 'patch';\n } catch (error) {\n // On error, default to patch\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}): Promise<{ committed: boolean; tagged: string[]; pushed: boolean }> {\n const { cwd, plan, dryRun } = 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 for (const pkg of plan.packages) {\n const pkgGit = simpleGit(pkg.path);\n if (result.committed) {\n await pkgGit.push(['--no-verify']);\n }\n await pkgGit.pushTags('--no-verify');\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 } 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 // Determine which directories to run this check in\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 let checkOk = true;\n let checkError: string | undefined;\n let totalDurationMs = 0;\n\n for (const pkgPath of pathsToRun) {\n // Resolve script paths in args relative to repo root\n const resolvedArgs = (check.args ?? []).map(arg =>\n arg.match(/\\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg\n );\n\n const fullCommand = [check.command, ...resolvedArgs].join(' ');\n const timeoutMs = check.timeoutMs ?? 120_000;\n const result = await spawnCommand(fullCommand, pkgPath, timeoutMs);\n totalDurationMs += result.durationMs;\n\n const ok = evaluateParser(check, result.stdout, result.stderr, result.exitCode);\n\n if (!ok) {\n checkOk = false;\n checkError = result.error ?? (result.stderr || result.stdout || `exit code ${result.exitCode}`);\n break;\n }\n }\n\n return {\n id: check.id,\n ok: checkOk,\n details: checkError ? { error: checkError } : undefined,\n hint: check.optional ? 'optional' : undefined,\n timingMs: totalDurationMs,\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 checks: checkConfigs, publisher, changelog: changelogGen,\n logger, onProgress,\n } = options;\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 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 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: [`Pre-release checks failed: ${failed.map(f => f.id).join(', ')}`],\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. 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 // 9. Git commit + tag\n let gitResult: { committed: boolean; tagged: string[]; pushed: boolean } | undefined;\n if (!dryRun && publishResult.errors.length === 0) {\n progress('verifying', 'Committing and tagging release...');\n gitResult = await commitAndTagRelease({ cwd: scopeCwd, plan, dryRun });\n }\n\n // 10. Report\n const report = buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: publishResult.errors.length === 0,\n published: publishResult.published,\n skipped: publishResult.skipped,\n changelog: changelogMd || undefined,\n git: gitResult ?? undefined,\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\nexport interface PlannerOptions {\n cwd: string;\n config: ReleaseConfig;\n scope?: string;\n bumpOverride?: VersionBump;\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, config, scope, bumpOverride } = options;\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 {\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 );\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 // Top-level versioningStrategy takes priority over legacy changelog.bumpStrategy\n const bumpStrategy = 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 return packages;\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\n // Get list of modified files (relative paths from git root)\n const status = await git.status();\n const diffSummary = await git.diffSummary(['HEAD']);\n\n const modifiedPaths = [\n ...status.files.map(f => f.path),\n ...diffSummary.files.map(f => f.file),\n ].filter(path => !shouldIgnoreFile(path));\n\n // Find packages that have changes — match by relative path only (no name substring)\n const modified: PackageVersion[] = [];\n for (let i = 0; i < packages.length; i++) {\n if (i % 10 === 0) {\n await new Promise((resolve) => { setImmediate(resolve); });\n }\n\n const pkg = packages[i]!;\n // Resolve to relative path from git cwd so we can compare with git output\n const pkgRel = relative(resolve(cwd), resolve(pkg.path));\n\n const packageModified = modifiedPaths.some(p =>\n p === pkgRel || p.startsWith(pkgRel + '/')\n );\n\n if (packageModified) {\n modified.push(pkg);\n }\n }\n\n\n // If no modified packages detected, include all packages (for initial release)\n return modified.length > 0 ? modified : packages;\n}\n\nasync function computeNextVersion(\n packagePath: string,\n currentVersion: string,\n bump: VersionBump,\n git: ReturnType<typeof simpleGit>,\n gitCwd: string,\n): Promise<string> {\n\n // If auto, detect from conventional commits\n if (bump === 'auto') {\n const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd);\n return semver.inc(currentVersion, detectedBump) || currentVersion;\n }\n\n // Manual bump\n return semver.inc(currentVersion, bump) || currentVersion;\n}\n\nasync function detectVersionFromCommits(\n git: ReturnType<typeof simpleGit>,\n packagePath: string,\n gitCwd: string,\n): Promise<'major' | 'minor' | 'patch'> {\n\n try {\n // git log --file expects a path relative to the git working directory\n const relPath = relative(resolve(gitCwd), resolve(packagePath));\n\n const log = await git.log({\n maxCount: 50,\n file: relPath,\n });\n\n\n let hasMinor = false;\n let hasBreaking = false;\n\n for (const commit of log.all) {\n const message = commit.message.toLowerCase();\n\n // Detect conventional commits\n if (message.includes('!:')) {\n hasBreaking = true;\n } else if (message.startsWith('feat') || message.startsWith('feature')) {\n hasMinor = true;\n }\n // else if fix/bugfix -> patch level (default)\n }\n\n // If breaking change detected\n if (hasBreaking) {\n return 'major';\n }\n\n // If feature added\n if (hasMinor) {\n return 'minor';\n }\n\n // Default to patch\n return 'patch';\n } catch (error) {\n // On error, default to patch\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 } 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 // Determine which directories to run this check in\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 let checkOk = true;\n let checkError: string | undefined;\n let totalDurationMs = 0;\n\n for (const pkgPath of pathsToRun) {\n // Resolve script paths in args relative to repo root\n const resolvedArgs = (check.args ?? []).map(arg =>\n arg.match(/\\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg\n );\n\n const fullCommand = [check.command, ...resolvedArgs].join(' ');\n const timeoutMs = check.timeoutMs ?? 120_000;\n const result = await spawnCommand(fullCommand, pkgPath, timeoutMs);\n totalDurationMs += result.durationMs;\n\n const ok = evaluateParser(check, result.stdout, result.stderr, result.exitCode);\n\n if (!ok) {\n checkOk = false;\n checkError = result.error ?? (result.stderr || result.stdout || `exit code ${result.exitCode}`);\n break;\n }\n }\n\n return {\n id: check.id,\n ok: checkOk,\n details: checkError ? { error: checkError } : undefined,\n hint: check.optional ? 'optional' : undefined,\n timingMs: totalDurationMs,\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 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 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 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: [`Pre-release checks failed: ${failed.map(f => f.id).join(', ')}`],\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. 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 // 9. Git commit + tag\n let gitResult: { committed: boolean; tagged: string[]; pushed: boolean } | undefined;\n if (!dryRun && publishResult.errors.length === 0) {\n progress('verifying', 'Committing and tagging release...');\n gitResult = await commitAndTagRelease({ cwd: scopeCwd, plan, dryRun, noVerify });\n }\n\n // 10. Report\n const report = buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: publishResult.errors.length === 0,\n published: publishResult.published,\n skipped: publishResult.skipped,\n changelog: changelogMd || undefined,\n git: gitResult ?? undefined,\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": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "KB Labs Release Manager - core orchestration, planning, versioning, and publishing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -38,14 +38,14 @@
|
|
|
38
38
|
"test:watch": "vitest -c ../../vitest.config.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@kb-labs/sdk": "
|
|
41
|
+
"@kb-labs/sdk": "workspace:*",
|
|
42
42
|
"execa": "^8.0.0",
|
|
43
43
|
"globby": "^11.0.0",
|
|
44
44
|
"semver": "^7.6.3",
|
|
45
45
|
"simple-git": "^3.25.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@kb-labs/devkit": "
|
|
48
|
+
"@kb-labs/devkit": "workspace:*",
|
|
49
49
|
"@types/fs-extra": "^11.0.0",
|
|
50
50
|
"@types/node": "^24.3.3",
|
|
51
51
|
"@types/semver": "^7.5.8",
|