@kb-labs/release-manager-core 0.7.0 → 2.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 CHANGED
@@ -27,12 +27,31 @@ interface ReleasePlan {
27
27
  registry: string;
28
28
  rollbackEnabled: boolean;
29
29
  }
30
+ interface CheckResultDetails {
31
+ /** Which package path this failure came from (for perPackage checks). */
32
+ packagePath?: string;
33
+ /** Full stdout from the check command. */
34
+ stdout?: string;
35
+ /** Full stderr from the check command. */
36
+ stderr?: string;
37
+ /** Exit code of the check command. */
38
+ exitCode?: number;
39
+ /** Short human-readable error summary. */
40
+ error?: string;
41
+ }
30
42
  interface CheckResult {
31
43
  id: CheckId;
32
44
  ok: boolean;
33
- details?: unknown;
45
+ /** Structured failure details — present when ok=false. */
46
+ details?: CheckResultDetails;
34
47
  hint?: string;
35
48
  timingMs?: number;
49
+ /** Per-package breakdown for perPackage checks. */
50
+ packages?: Array<{
51
+ path: string;
52
+ ok: boolean;
53
+ details?: CheckResultDetails;
54
+ }>;
36
55
  }
37
56
  type CheckId = string;
38
57
  /**
@@ -86,6 +105,14 @@ interface ReleaseReport {
86
105
  plan?: ReleasePlan;
87
106
  result: ReleaseResult;
88
107
  }
108
+ interface FlowConfig {
109
+ /** Completely replaces global packages config — no array merging with global exclude. */
110
+ packages?: PackagesFilter;
111
+ /** Replaces global versioningStrategy. */
112
+ versioningStrategy?: 'lockstep' | 'independent' | 'adaptive';
113
+ /** If set, replaces global checks for this flow. */
114
+ checks?: CustomCheckConfig[];
115
+ }
89
116
  interface PackagesFilter {
90
117
  /** Glob dirs to scan, e.g. ['packages/*', 'apps/*'].
91
118
  * Defaults to full tree scan when omitted. */
@@ -111,6 +138,11 @@ interface ReleaseConfig {
111
138
  /** Package manager to use for publishing. Default: 'pnpm'. */
112
139
  packageManager?: 'pnpm' | 'npm' | 'yarn';
113
140
  };
141
+ /** Workspace configuration — package manager used for publishing. */
142
+ workspace?: {
143
+ type?: 'pnpm' | 'npm' | 'yarn';
144
+ root?: string;
145
+ };
114
146
  /** Filter which packages are discovered and released. */
115
147
  packages?: PackagesFilter;
116
148
  /** Per-scope overrides — packages filter merged with global, checks replace global entirely. */
@@ -118,7 +150,11 @@ interface ReleaseConfig {
118
150
  packages?: PackagesFilter;
119
151
  /** If set, replaces global `checks` for this scope. */
120
152
  checks?: CustomCheckConfig[];
153
+ /** If set, overrides global versioningStrategy for this scope. */
154
+ versioningStrategy?: 'lockstep' | 'independent' | 'adaptive';
121
155
  }>;
156
+ /** Named release configuration profiles — completely replace (not merge) global packages/versioning/checks. */
157
+ flows?: Record<string, FlowConfig>;
122
158
  rollback?: {
123
159
  enabled?: boolean;
124
160
  maxHistory?: number;
@@ -134,6 +170,13 @@ interface ReleaseConfig {
134
170
  excludeTypes?: string[];
135
171
  ignoreAuthors?: string[];
136
172
  scopeMap?: Record<string, string>;
173
+ /** Group commits by scope into named sections for the changelog template */
174
+ groups?: Array<{
175
+ title: string;
176
+ emoji?: string;
177
+ /** Scope values that belong to this group. Supports prefix matching (e.g. "adapters" matches "adapters-redis") */
178
+ scopes: string[];
179
+ }>;
137
180
  collapseMerges?: boolean;
138
181
  collapseReverts?: boolean;
139
182
  preferMergeSummary?: boolean;
@@ -220,6 +263,8 @@ interface PipelineOptions {
220
263
  scopeCwd: string;
221
264
  /** Original scope name for display/reporting only */
222
265
  scope?: string;
266
+ /** Named flow — selects a release config profile. Completely replaces global packages/versioning/checks. */
267
+ flow?: string;
223
268
  config: ReleaseConfig;
224
269
  dryRun?: boolean;
225
270
  skipChecks?: boolean;
@@ -254,8 +299,16 @@ interface PlannerOptions {
254
299
  cwd: string;
255
300
  config: ReleaseConfig;
256
301
  scope?: string;
302
+ /** Named flow — selects a release config profile. Completely replaces global packages/versioning/checks. */
303
+ flow?: string;
257
304
  bumpOverride?: VersionBump;
258
305
  }
306
+ /**
307
+ * Merge base config with a named flow's config.
308
+ * Flow completely REPLACES packages, versioningStrategy, and checks — no array merging.
309
+ * All other config fields (registry, publish, rollback, git, changelog) remain from global.
310
+ */
311
+ declare function mergeConfigWithFlow(config: ReleaseConfig, flowName: string): ReleaseConfig;
259
312
  /**
260
313
  * Plan release by detecting changes and computing version bumps
261
314
  */
@@ -551,4 +604,4 @@ declare function verifyPackage(packagePath: string, packageName?: string): Verif
551
604
  */
552
605
  declare function resolveScopePath(repoRoot: string, scope: string): Promise<string>;
553
606
 
554
- export { type AuditSummary, type BuildResult, type ChangelogGenerator, type CheckId, type CheckResult, type CustomCheckConfig, type PackagePublisher, type PackageVersion, type PackagesFilter, type PipelineOptions, type PipelineResult, type PlannerOptions, type PublishResult, type PublishablePackage, type PublisherOptions, type PublishingResult, type ReleaseConfig, type ReleaseContext, type ReleasePlan, type ReleaseReport, type ReleaseResult, type ReleaseStage, type RollbackSnapshot, type RunnerOptions, type StrategyOptions, type VerifyResult, type VersionBump, type VersionStrategy, applyVersionStrategy, buildPackages, commitAndTagRelease, copyChangelogToPackages, createExecaShellAdapter, generateChangelog, generateEnhancedChangelog, isBuildCommand, matchesPackagePattern, planRelease, publishPackages, renderJson, renderMarkdown, renderText, resolveScopePath, restoreSnapshot, runRelease, runReleaseChecks, runReleasePipeline, runSafeBuild, saveSnapshot, spawnCommand, updatePackageVersion, updatePackageVersions, verifyPackage, verifyPackages };
607
+ export { type AuditSummary, type BuildResult, type ChangelogGenerator, type CheckId, type CheckResult, type CheckResultDetails, type CustomCheckConfig, type FlowConfig, type PackagePublisher, type PackageVersion, type PackagesFilter, type PipelineOptions, type PipelineResult, type PlannerOptions, type PublishResult, type PublishablePackage, type PublisherOptions, type PublishingResult, type ReleaseConfig, type ReleaseContext, type ReleasePlan, type ReleaseReport, type ReleaseResult, type ReleaseStage, type RollbackSnapshot, type RunnerOptions, type StrategyOptions, type VerifyResult, type VersionBump, type VersionStrategy, applyVersionStrategy, buildPackages, commitAndTagRelease, copyChangelogToPackages, createExecaShellAdapter, generateChangelog, generateEnhancedChangelog, isBuildCommand, matchesPackagePattern, mergeConfigWithFlow, planRelease, publishPackages, renderJson, renderMarkdown, renderText, resolveScopePath, restoreSnapshot, runRelease, runReleaseChecks, runReleasePipeline, runSafeBuild, saveSnapshot, spawnCommand, updatePackageVersion, updatePackageVersions, verifyPackage, verifyPackages };
package/dist/index.js CHANGED
@@ -57,8 +57,56 @@ function getMaxBump(packages) {
57
57
  }
58
58
 
59
59
  // src/planner.ts
60
+ async function findLastReleaseTag(git, pkgName) {
61
+ try {
62
+ const tags = await git.tags(["--sort=-version:refname", `--list`, `${pkgName}@*`]);
63
+ if (tags.all.length > 0) {
64
+ return tags.all[0];
65
+ }
66
+ const vTags = await git.tags(["--sort=-version:refname", "--list", "v*"]);
67
+ if (vTags.all.length > 0) {
68
+ return vTags.all[0];
69
+ }
70
+ return null;
71
+ } catch {
72
+ return null;
73
+ }
74
+ }
75
+ async function getCommitsSinceTag(git, pkgName, relPath) {
76
+ const lastTag = await findLastReleaseTag(git, pkgName);
77
+ try {
78
+ const args = ["log", "--format=%s", ...lastTag ? [`${lastTag}..HEAD`] : [], "--", relPath];
79
+ const raw = await git.raw(args);
80
+ return raw.split("\n").map((s) => s.trim()).filter(Boolean);
81
+ } catch {
82
+ return [];
83
+ }
84
+ }
85
+ async function hasChangesSinceTag(git, pkgName, pkgRelPath) {
86
+ const status = await git.status();
87
+ const uncommitted = status.files.map((f) => f.path);
88
+ const hasUncommitted = uncommitted.some((p) => p === pkgRelPath || p.startsWith(pkgRelPath + "/"));
89
+ if (hasUncommitted) {
90
+ return true;
91
+ }
92
+ const commits = await getCommitsSinceTag(git, pkgName, pkgRelPath);
93
+ return commits.length > 0;
94
+ }
95
+ function mergeConfigWithFlow(config, flowName) {
96
+ const flow = config.flows?.[flowName];
97
+ if (!flow) {
98
+ throw new Error(`Flow "${flowName}" is not defined in config.flows`);
99
+ }
100
+ return {
101
+ ...config,
102
+ ...flow.packages !== void 0 && { packages: flow.packages },
103
+ ...flow.versioningStrategy && { versioningStrategy: flow.versioningStrategy },
104
+ ...flow.checks !== void 0 && { checks: flow.checks }
105
+ };
106
+ }
60
107
  async function planRelease(options) {
61
- const { cwd, config, scope, bumpOverride } = options;
108
+ const { cwd, scope, bumpOverride } = options;
109
+ const config = options.flow ? mergeConfigWithFlow(options.config, options.flow) : options.config;
62
110
  const allPackages = await discoverPackages(cwd, config);
63
111
  let packages;
64
112
  if (scope && scope !== "root") {
@@ -100,7 +148,8 @@ async function planRelease(options) {
100
148
  pkg.currentVersion,
101
149
  bump,
102
150
  git,
103
- gitCwd
151
+ gitCwd,
152
+ pkg.name
104
153
  );
105
154
  planPackages.push({
106
155
  ...pkg,
@@ -108,7 +157,8 @@ async function planRelease(options) {
108
157
  bump: bump === "auto" ? detectBumpType(pkg.currentVersion, nextVersion) : bump
109
158
  });
110
159
  }
111
- const bumpStrategy = config.versioningStrategy || config.changelog?.bumpStrategy || "independent";
160
+ const scopeVersioningStrategy = scope ? config.scopes?.[scope]?.versioningStrategy : void 0;
161
+ const bumpStrategy = scopeVersioningStrategy || config.versioningStrategy || config.changelog?.bumpStrategy || "independent";
112
162
  const versionStrategy = mapBumpStrategyToVersionStrategy(bumpStrategy);
113
163
  planPackages = applyVersionStrategy(planPackages, {
114
164
  strategy: versionStrategy});
@@ -186,7 +236,14 @@ async function discoverPackages(cwd, config) {
186
236
  isPublished: false
187
237
  });
188
238
  }
189
- return packages;
239
+ const seen = /* @__PURE__ */ new Map();
240
+ for (const pkg of packages) {
241
+ const existing = seen.get(pkg.name);
242
+ if (!existing || pkg.path.length < existing.path.length) {
243
+ seen.set(pkg.name, pkg);
244
+ }
245
+ }
246
+ return Array.from(seen.values());
190
247
  }
191
248
  function filterByScope(packages, scope, config) {
192
249
  const scopeFilter = config?.scopes?.[scope]?.packages;
@@ -268,66 +325,41 @@ async function discoverSubRepoPackages(workspaceRoot, config) {
268
325
  }
269
326
  return packages;
270
327
  }
271
- function shouldIgnoreFile(file) {
272
- const ignoredPaths = [
273
- "node_modules/",
274
- ".git/",
275
- "dist/",
276
- "build/",
277
- ".next/",
278
- ".nuxt/",
279
- "coverage/",
280
- ".cache/",
281
- "tmp/"
282
- ];
283
- return ignoredPaths.some((path) => file.includes(path));
284
- }
285
328
  async function detectModifiedPackages(git, packages, cwd) {
286
- const status = await git.status();
287
- const diffSummary = await git.diffSummary(["HEAD"]);
288
- const modifiedPaths = [
289
- ...status.files.map((f) => f.path),
290
- ...diffSummary.files.map((f) => f.file)
291
- ].filter((path) => !shouldIgnoreFile(path));
292
329
  const modified = [];
293
330
  for (let i = 0; i < packages.length; i++) {
294
331
  if (i % 10 === 0) {
295
- await new Promise((resolve3) => {
296
- setImmediate(resolve3);
332
+ await new Promise((res) => {
333
+ setImmediate(res);
297
334
  });
298
335
  }
299
336
  const pkg = packages[i];
300
337
  const pkgRel = relative(resolve(cwd), resolve(pkg.path));
301
- const packageModified = modifiedPaths.some(
302
- (p) => p === pkgRel || p.startsWith(pkgRel + "/")
303
- );
304
- if (packageModified) {
338
+ const changed = await hasChangesSinceTag(git, pkg.name, pkgRel);
339
+ if (changed) {
305
340
  modified.push(pkg);
306
341
  }
307
342
  }
308
- return modified.length > 0 ? modified : packages;
343
+ return modified;
309
344
  }
310
- async function computeNextVersion(packagePath, currentVersion, bump, git, gitCwd) {
345
+ async function computeNextVersion(packagePath, currentVersion, bump, git, gitCwd, pkgName) {
311
346
  if (bump === "auto") {
312
- const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd);
347
+ const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd, pkgName);
313
348
  return semver2.inc(currentVersion, detectedBump) || currentVersion;
314
349
  }
315
350
  return semver2.inc(currentVersion, bump) || currentVersion;
316
351
  }
317
- async function detectVersionFromCommits(git, packagePath, gitCwd) {
352
+ async function detectVersionFromCommits(git, packagePath, gitCwd, pkgName) {
318
353
  try {
319
354
  const relPath = relative(resolve(gitCwd), resolve(packagePath));
320
- const log = await git.log({
321
- maxCount: 50,
322
- file: relPath
323
- });
355
+ const messages = await getCommitsSinceTag(git, pkgName, relPath);
324
356
  let hasMinor = false;
325
357
  let hasBreaking = false;
326
- for (const commit of log.all) {
327
- const message = commit.message.toLowerCase();
328
- if (message.includes("!:")) {
358
+ for (const message of messages) {
359
+ const msg = message.toLowerCase();
360
+ if (msg.includes("!:") || msg.includes("breaking change")) {
329
361
  hasBreaking = true;
330
- } else if (message.startsWith("feat") || message.startsWith("feature")) {
362
+ } else if (msg.startsWith("feat") || msg.startsWith("feature")) {
331
363
  hasMinor = true;
332
364
  }
333
365
  }
@@ -338,7 +370,7 @@ async function detectVersionFromCommits(git, packagePath, gitCwd) {
338
370
  return "minor";
339
371
  }
340
372
  return "patch";
341
- } catch (error) {
373
+ } catch {
342
374
  return "patch";
343
375
  }
344
376
  }
@@ -1044,30 +1076,49 @@ async function runSingleCheck(check, options) {
1044
1076
  } else {
1045
1077
  pathsToRun = options.packagePaths.length > 0 ? options.packagePaths : [options.repoRoot];
1046
1078
  }
1047
- let checkOk = true;
1048
- let checkError;
1049
- let totalDurationMs = 0;
1050
- for (const pkgPath of pathsToRun) {
1051
- const resolvedArgs = (check.args ?? []).map(
1052
- (arg) => arg.match(/\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg
1053
- );
1054
- const fullCommand = [check.command, ...resolvedArgs].join(" ");
1055
- const timeoutMs = check.timeoutMs ?? 12e4;
1079
+ const CONCURRENCY = 8;
1080
+ const resolvedArgs = (check.args ?? []).map(
1081
+ (arg) => arg.match(/\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg
1082
+ );
1083
+ const fullCommand = [check.command, ...resolvedArgs].join(" ");
1084
+ const timeoutMs = check.timeoutMs ?? 12e4;
1085
+ async function runForPath(pkgPath) {
1056
1086
  const result = await spawnCommand(fullCommand, pkgPath, timeoutMs);
1057
- totalDurationMs += result.durationMs;
1058
1087
  const ok = evaluateParser(check, result.stdout, result.stderr, result.exitCode);
1059
- if (!ok) {
1060
- checkOk = false;
1061
- checkError = result.error ?? (result.stderr || result.stdout || `exit code ${result.exitCode}`);
1062
- break;
1088
+ return {
1089
+ path: pkgPath,
1090
+ ok,
1091
+ durationMs: result.durationMs,
1092
+ details: {
1093
+ packagePath: pkgPath,
1094
+ stdout: result.stdout || void 0,
1095
+ stderr: result.stderr || void 0,
1096
+ exitCode: result.exitCode,
1097
+ error: result.error ?? (!ok ? `exit code ${result.exitCode}` : void 0)
1098
+ }
1099
+ };
1100
+ }
1101
+ let pkgResults;
1102
+ if (runIn === "perPackage" && pathsToRun.length > 1) {
1103
+ pkgResults = [];
1104
+ for (let i = 0; i < pathsToRun.length; i += CONCURRENCY) {
1105
+ const batch = pathsToRun.slice(i, i + CONCURRENCY);
1106
+ pkgResults.push(...await Promise.all(batch.map(runForPath)));
1063
1107
  }
1108
+ } else {
1109
+ pkgResults = [await runForPath(pathsToRun[0])];
1064
1110
  }
1111
+ const firstFailure = pkgResults.find((r) => !r.ok)?.details;
1112
+ const totalDurationMs = pkgResults.reduce((sum, r) => sum + r.durationMs, 0);
1113
+ const perPackage = pathsToRun.length > 1 ? pkgResults.map((r) => ({ path: r.path, ok: r.ok, details: r.ok ? void 0 : r.details })) : void 0;
1114
+ const allOk = !firstFailure;
1065
1115
  return {
1066
1116
  id: check.id,
1067
- ok: checkOk,
1068
- details: checkError ? { error: checkError } : void 0,
1117
+ ok: allOk,
1118
+ details: firstFailure,
1069
1119
  hint: check.optional ? "optional" : void 0,
1070
- timingMs: totalDurationMs
1120
+ timingMs: totalDurationMs,
1121
+ packages: perPackage && perPackage.length > 0 ? perPackage : void 0
1071
1122
  };
1072
1123
  }
1073
1124
  function evaluateParser(check, stdout, stderr, exitCode) {
@@ -1275,6 +1326,7 @@ async function runReleasePipeline(options) {
1275
1326
  logger,
1276
1327
  onProgress
1277
1328
  } = options;
1329
+ const flow = options.flow;
1278
1330
  const startTime = Date.now();
1279
1331
  const progress = (stage, msg) => {
1280
1332
  logger?.info?.(msg);
@@ -1285,6 +1337,8 @@ async function runReleasePipeline(options) {
1285
1337
  cwd: repoRoot,
1286
1338
  config,
1287
1339
  scope,
1340
+ flow,
1341
+ // already includes defaultFlow fallback
1288
1342
  bumpOverride: config.bump
1289
1343
  });
1290
1344
  if (plan.packages.length === 0) {
@@ -1312,13 +1366,28 @@ async function runReleasePipeline(options) {
1312
1366
  const failed = checkResults.filter((r) => !r.ok && r.hint !== "optional");
1313
1367
  if (failed.length > 0) {
1314
1368
  await restoreSnapshot(repoRoot);
1369
+ const errorLines = failed.flatMap((f) => {
1370
+ const lines = [`check "${f.id}" failed`];
1371
+ if (f.details?.packagePath) lines.push(` package: ${f.details.packagePath}`);
1372
+ if (f.details?.error) lines.push(` reason: ${f.details.error}`);
1373
+ if (f.details?.stderr?.trim()) lines.push(` stderr: ${f.details.stderr.trim().split("\n").slice(0, 5).join("\n ")}`);
1374
+ if (f.details?.stdout?.trim() && !f.details?.stderr?.trim()) lines.push(` output: ${f.details.stdout.trim().split("\n").slice(0, 5).join("\n ")}`);
1375
+ if (f.packages?.filter((p) => !p.ok).length) {
1376
+ const failedPkgs = f.packages.filter((p) => !p.ok);
1377
+ lines.push(` failed in ${failedPkgs.length}/${f.packages.length} package(s):`);
1378
+ for (const pkg of failedPkgs.slice(0, 10)) {
1379
+ lines.push(` - ${pkg.path}${pkg.details?.error ? `: ${pkg.details.error}` : ""}`);
1380
+ }
1381
+ }
1382
+ return lines;
1383
+ });
1315
1384
  return {
1316
1385
  success: false,
1317
1386
  plan,
1318
1387
  report: buildReport("checking", plan, repoRoot, dryRun, startTime, {
1319
1388
  ok: false,
1320
1389
  checks: Object.fromEntries(checkResults.map((r) => [r.id, r])),
1321
- errors: [`Pre-release checks failed: ${failed.map((f) => f.id).join(", ")}`],
1390
+ errors: errorLines,
1322
1391
  timingMs: Date.now() - startTime
1323
1392
  })
1324
1393
  };
@@ -1395,6 +1464,11 @@ async function runReleasePipeline(options) {
1395
1464
  await mkdir(join(repoRoot, ".kb", "release"), { recursive: true });
1396
1465
  await writeFile(changelogPath, changelogMd, "utf-8");
1397
1466
  }
1467
+ let gitResult;
1468
+ if (!dryRun) {
1469
+ progress("verifying", "Committing and tagging release...");
1470
+ gitResult = await commitAndTagRelease({ cwd: scopeCwd, plan, dryRun, noVerify });
1471
+ }
1398
1472
  progress("publishing", dryRun ? "Simulating publish (dry-run)..." : "Publishing packages...");
1399
1473
  const packagesToPublish = plan.packages.map((pkg) => ({
1400
1474
  name: pkg.name,
@@ -1405,17 +1479,12 @@ async function runReleasePipeline(options) {
1405
1479
  dryRun,
1406
1480
  access: "public"
1407
1481
  });
1408
- let gitResult;
1409
- if (!dryRun && publishResult.errors.length === 0) {
1410
- progress("verifying", "Committing and tagging release...");
1411
- gitResult = await commitAndTagRelease({ cwd: scopeCwd, plan, dryRun, noVerify });
1412
- }
1413
1482
  const report = buildReport("verifying", plan, repoRoot, dryRun, startTime, {
1414
- ok: publishResult.errors.length === 0,
1483
+ ok: publishResult.errors.length === 0 && (!gitResult || gitResult.committed),
1415
1484
  published: publishResult.published,
1416
1485
  skipped: publishResult.skipped,
1417
1486
  changelog: changelogMd || void 0,
1418
- git: gitResult ?? void 0,
1487
+ git: gitResult,
1419
1488
  errors: publishResult.errors.length > 0 ? publishResult.errors : void 0,
1420
1489
  timingMs: Date.now() - startTime
1421
1490
  });
@@ -1459,6 +1528,6 @@ async function resolveScopePath(repoRoot, scope) {
1459
1528
  return join(repoRoot, scope);
1460
1529
  }
1461
1530
 
1462
- export { applyVersionStrategy, buildPackages, commitAndTagRelease, copyChangelogToPackages, createExecaShellAdapter, generateChangelog, generateEnhancedChangelog, isBuildCommand, matchesPackagePattern, planRelease, publishPackages, renderJson, renderMarkdown, renderText, resolveScopePath, restoreSnapshot, runRelease, runReleaseChecks, runReleasePipeline, runSafeBuild, saveSnapshot, spawnCommand, updatePackageVersion, updatePackageVersions, verifyPackage, verifyPackages };
1531
+ export { applyVersionStrategy, buildPackages, commitAndTagRelease, copyChangelogToPackages, createExecaShellAdapter, generateChangelog, generateEnhancedChangelog, isBuildCommand, matchesPackagePattern, mergeConfigWithFlow, planRelease, publishPackages, renderJson, renderMarkdown, renderText, resolveScopePath, restoreSnapshot, runRelease, runReleaseChecks, runReleasePipeline, runSafeBuild, saveSnapshot, spawnCommand, updatePackageVersion, updatePackageVersions, verifyPackage, verifyPackages };
1463
1532
  //# sourceMappingURL=index.js.map
1464
1533
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/versioning-strategies.ts","../src/planner.ts","../src/shell-adapter.ts","../src/publisher.ts","../src/rollback.ts","../src/runner.ts","../src/reporters/json.ts","../src/reporters/markdown.ts","../src/reporters/text.ts","../src/build.ts","../src/checks.ts","../src/verifier.ts","../src/pipeline.ts","../src/scope.ts"],"names":["semver","resolve","isPathPattern","join","readFile","simpleGit","existsSync","mkdir","writeFile","formatTiming","tmpdir","randomBytes","exports","globby"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Versioning strategies for monorepo package releases\n *\n * - lockstep: All packages get the same version (maximum bump)\n * - independent: Each package has its own version\n * - adaptive: Lockstep if breaking changes, otherwise independent\n */\n\nimport semver from 'semver';\nimport type { PackageVersion, VersionBump } from './types';\n\nexport type VersionStrategy = 'lockstep' | 'independent' | 'adaptive';\n\nexport interface StrategyOptions {\n strategy: VersionStrategy;\n umbrellaPath?: string; // path to umbrella root (for filtering)\n}\n\n/**\n * Apply versioning strategy to packages\n */\nexport function applyVersionStrategy(\n packages: PackageVersion[],\n options: StrategyOptions\n): PackageVersion[] {\n if (options.strategy === 'lockstep') {\n return applyLockstep(packages);\n }\n\n if (options.strategy === 'adaptive') {\n return applyAdaptive(packages);\n }\n\n // independent (default) - no changes needed\n return packages;\n}\n\n/**\n * Lockstep: All packages get the maximum version bump\n *\n * Example:\n * - Package A: 1.0.0 -> 1.1.0 (minor)\n * - Package B: 1.0.0 -> 2.0.0 (major)\n * Result: Both get 2.0.0 (maximum bump = major)\n */\nfunction applyLockstep(packages: PackageVersion[]): PackageVersion[] {\n if (packages.length === 0) {return packages;}\n\n // Find the maximum bump level\n const maxBump = getMaxBump(packages);\n\n // Find the highest current version\n const maxVersion = packages.reduce((max, pkg) => {\n return semver.gt(pkg.currentVersion, max) ? pkg.currentVersion : max;\n }, packages[0]!.currentVersion); // ! safe: length already checked\n\n // Compute next version from max version + max bump\n // Filter out 'auto' since semver.inc expects ReleaseType\n const releaseType = maxBump === 'auto' ? 'patch' : maxBump;\n const nextVersion = semver.inc(maxVersion, releaseType) || maxVersion;\n\n // Apply to all packages\n return packages.map(pkg => ({\n ...pkg,\n bump: maxBump,\n nextVersion,\n }));\n}\n\n/**\n * Adaptive: Lockstep if breaking changes, otherwise independent\n *\n * This is useful for umbrellas where you want to keep versions in sync\n * when there are breaking changes, but allow independent releases otherwise.\n */\nfunction applyAdaptive(packages: PackageVersion[]): PackageVersion[] {\n const hasBreaking = packages.some(pkg => pkg.bump === 'major');\n\n // If any package has breaking changes, use lockstep\n if (hasBreaking) {\n return applyLockstep(packages);\n }\n\n // Otherwise, use independent (no changes)\n return packages;\n}\n\n/**\n * Get the maximum bump level from a list of packages\n *\n * Priority: major > minor > patch\n */\nfunction getMaxBump(packages: PackageVersion[]): VersionBump {\n let maxBump: VersionBump = 'patch';\n\n for (const pkg of packages) {\n if (pkg.bump === 'major') {\n return 'major'; // Can't go higher than major\n }\n if (pkg.bump === 'minor') {\n maxBump = 'minor';\n }\n }\n\n return maxBump;\n}\n","/**\n * Release planner - detects changes and suggests version bumps\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, relative, resolve } from 'node:path';\nimport simpleGit from 'simple-git';\nimport semver from 'semver';\nimport globby from 'globby';\nimport { discoverSubRepoPaths } from '@kb-labs/sdk';\nimport type { PackageVersion, VersionBump, ReleaseConfig, ReleasePlan } from './types';\nimport { applyVersionStrategy, type VersionStrategy } from './versioning-strategies';\n\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"]}
1
+ {"version":3,"sources":["../src/versioning-strategies.ts","../src/planner.ts","../src/shell-adapter.ts","../src/publisher.ts","../src/rollback.ts","../src/runner.ts","../src/reporters/json.ts","../src/reporters/markdown.ts","../src/reporters/text.ts","../src/build.ts","../src/checks.ts","../src/verifier.ts","../src/pipeline.ts","../src/scope.ts"],"names":["semver","resolve","isPathPattern","join","readFile","simpleGit","existsSync","mkdir","writeFile","formatTiming","tmpdir","randomBytes","exports","globby"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Versioning strategies for monorepo package releases\n *\n * - lockstep: All packages get the same version (maximum bump)\n * - independent: Each package has its own version\n * - adaptive: Lockstep if breaking changes, otherwise independent\n */\n\nimport semver from 'semver';\nimport type { PackageVersion, VersionBump } from './types';\n\nexport type VersionStrategy = 'lockstep' | 'independent' | 'adaptive';\n\nexport interface StrategyOptions {\n strategy: VersionStrategy;\n umbrellaPath?: string; // path to umbrella root (for filtering)\n}\n\n/**\n * Apply versioning strategy to packages\n */\nexport function applyVersionStrategy(\n packages: PackageVersion[],\n options: StrategyOptions\n): PackageVersion[] {\n if (options.strategy === 'lockstep') {\n return applyLockstep(packages);\n }\n\n if (options.strategy === 'adaptive') {\n return applyAdaptive(packages);\n }\n\n // independent (default) - no changes needed\n return packages;\n}\n\n/**\n * Lockstep: All packages get the maximum version bump\n *\n * Example:\n * - Package A: 1.0.0 -> 1.1.0 (minor)\n * - Package B: 1.0.0 -> 2.0.0 (major)\n * Result: Both get 2.0.0 (maximum bump = major)\n */\nfunction applyLockstep(packages: PackageVersion[]): PackageVersion[] {\n if (packages.length === 0) {return packages;}\n\n // Find the maximum bump level\n const maxBump = getMaxBump(packages);\n\n // Find the highest current version\n const maxVersion = packages.reduce((max, pkg) => {\n return semver.gt(pkg.currentVersion, max) ? pkg.currentVersion : max;\n }, packages[0]!.currentVersion); // ! safe: length already checked\n\n // Compute next version from max version + max bump\n // Filter out 'auto' since semver.inc expects ReleaseType\n const releaseType = maxBump === 'auto' ? 'patch' : maxBump;\n const nextVersion = semver.inc(maxVersion, releaseType) || maxVersion;\n\n // Apply to all packages\n return packages.map(pkg => ({\n ...pkg,\n bump: maxBump,\n nextVersion,\n }));\n}\n\n/**\n * Adaptive: Lockstep if breaking changes, otherwise independent\n *\n * This is useful for umbrellas where you want to keep versions in sync\n * when there are breaking changes, but allow independent releases otherwise.\n */\nfunction applyAdaptive(packages: PackageVersion[]): PackageVersion[] {\n const hasBreaking = packages.some(pkg => pkg.bump === 'major');\n\n // If any package has breaking changes, use lockstep\n if (hasBreaking) {\n return applyLockstep(packages);\n }\n\n // Otherwise, use independent (no changes)\n return packages;\n}\n\n/**\n * Get the maximum bump level from a list of packages\n *\n * Priority: major > minor > patch\n */\nfunction getMaxBump(packages: PackageVersion[]): VersionBump {\n let maxBump: VersionBump = 'patch';\n\n for (const pkg of packages) {\n if (pkg.bump === 'major') {\n return 'major'; // Can't go higher than major\n }\n if (pkg.bump === 'minor') {\n maxBump = 'minor';\n }\n }\n\n return maxBump;\n}\n","/**\n * Release planner - detects changes and suggests version bumps\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, relative, resolve } from 'node:path';\nimport simpleGit from 'simple-git';\nimport semver from 'semver';\nimport globby from 'globby';\nimport { discoverSubRepoPaths } from '@kb-labs/sdk';\nimport type { PackageVersion, VersionBump, ReleaseConfig, ReleasePlan } from './types';\nimport { applyVersionStrategy, type VersionStrategy } from './versioning-strategies';\n\n/**\n * Find the most recent git tag for a package.\n * For scoped packages: looks for \"<name>@<version>\" tags.\n * For lockstep repos: looks for \"v<version>\" tags.\n * Returns null if no tag found (initial release).\n */\nasync function findLastReleaseTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n): Promise<string | null> {\n try {\n // Try package-scoped tag first: @kb-labs/foo@1.2.3\n const tags = await git.tags(['--sort=-version:refname', `--list`, `${pkgName}@*`]);\n if (tags.all.length > 0) {\n return tags.all[0]!;\n }\n // Try lockstep tag: v1.2.3\n const vTags = await git.tags(['--sort=-version:refname', '--list', 'v*']);\n if (vTags.all.length > 0) {\n return vTags.all[0]!;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get commits since last release tag, scoped to a path.\n * Returns empty array if git log fails.\n */\nasync function getCommitsSinceTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n relPath: string,\n): Promise<string[]> {\n const lastTag = await findLastReleaseTag(git, pkgName);\n try {\n // git log [<tag>..HEAD] [--] <path>\n // Without a tag (initial release): git log -- <path>\n const args = ['log', '--format=%s', ...(lastTag ? [`${lastTag}..HEAD`] : []), '--', relPath];\n const raw = await (git as any).raw(args) as string;\n return raw.split('\\n').map((s: string) => s.trim()).filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Check if there are any file changes since last release tag.\n * Covers: uncommitted, committed-not-pushed, committed-and-pushed.\n */\nasync function hasChangesSinceTag(\n git: ReturnType<typeof simpleGit>,\n pkgName: string,\n pkgRelPath: string,\n): Promise<boolean> {\n // 1. Uncommitted changes (working tree + index)\n const status = await git.status();\n const uncommitted = status.files.map(f => f.path);\n const hasUncommitted = uncommitted.some(p => p === pkgRelPath || p.startsWith(pkgRelPath + '/'));\n if (hasUncommitted) {return true;}\n\n // 2. Committed changes since last tag\n const commits = await getCommitsSinceTag(git, pkgName, pkgRelPath);\n return commits.length > 0;\n}\n\nexport interface PlannerOptions {\n cwd: string;\n config: ReleaseConfig;\n scope?: string;\n /** Named flow — selects a release config profile. Completely replaces global packages/versioning/checks. */\n flow?: string;\n bumpOverride?: VersionBump;\n}\n\n/**\n * Merge base config with a named flow's config.\n * Flow completely REPLACES packages, versioningStrategy, and checks — no array merging.\n * All other config fields (registry, publish, rollback, git, changelog) remain from global.\n */\nexport function mergeConfigWithFlow(config: ReleaseConfig, flowName: string): ReleaseConfig {\n const flow = config.flows?.[flowName];\n if (!flow) {\n throw new Error(`Flow \"${flowName}\" is not defined in config.flows`);\n }\n return {\n ...config,\n ...(flow.packages !== undefined && { packages: flow.packages }),\n ...(flow.versioningStrategy && { versioningStrategy: flow.versioningStrategy }),\n ...(flow.checks !== undefined && { checks: flow.checks }),\n };\n}\n\n/**\n * Plan release by detecting changes and computing version bumps\n */\nexport async function planRelease(options: PlannerOptions): Promise<ReleasePlan> {\n const { cwd, scope, bumpOverride } = options;\n\n // Flow resolution — completely replaces packages/versioningStrategy/checks in config.\n // MUST happen before discoverPackages so globally-excluded packages can appear in a flow.\n const config = options.flow\n ? mergeConfigWithFlow(options.config, options.flow)\n : options.config;\n\n // Step 1: discover all candidates according to config (paths/include/exclude)\n const allPackages = await discoverPackages(cwd, config);\n\n // Step 2: if scope given, filter candidates and produce clear errors\n let packages: PackageVersion[];\n if (scope && scope !== 'root') {\n const isWorkspace = existsSync(join(cwd, '.gitmodules'));\n if (isWorkspace) {\n // In workspace mode, scope matches a sub-repo root.\n // Re-discover inside that sub-repo using standard discoverPackages (glob-based).\n const matchedRoots = filterByScope(allPackages, scope, config);\n const innerPackages: PackageVersion[] = [];\n for (const root of matchedRoots) {\n // Include root itself\n innerPackages.push(root);\n // Discover inner packages using standard glob logic (respects config, skips private)\n const inner = await discoverPackages(root.path, config);\n for (const pkg of inner) {\n if (!innerPackages.some(p => p.name === pkg.name)) {\n innerPackages.push(pkg);\n }\n }\n }\n packages = innerPackages;\n } else {\n packages = filterByScope(allPackages, scope, config);\n }\n } else {\n packages = allPackages;\n }\n\n // Workspace root with submodules: each sub-repo has its own git,\n // so we skip workspace-level detectModifiedPackages and use per-repo git.\n const isWorkspaceRoot = existsSync(join(cwd, '.gitmodules')) && !scope;\n\n let modifiedPackages: PackageVersion[];\n if (isWorkspaceRoot) {\n // All sub-repos are candidates — change detection happens per-repo\n modifiedPackages = packages;\n } else {\n const git = simpleGit(cwd, { timeout: { block: 60000 } });\n modifiedPackages = await detectModifiedPackages(git, packages, cwd);\n }\n\n // Compute version bumps\n let planPackages: PackageVersion[] = [];\n for (const pkg of modifiedPackages) {\n const bump = bumpOverride || config.bump || 'auto';\n\n // For workspace root, use per-sub-repo git instance\n const gitCwd = isWorkspaceRoot ? pkg.path : cwd;\n const git = simpleGit(gitCwd, { timeout: { block: 60000 } });\n\n const nextVersion = await computeNextVersion(\n pkg.path,\n pkg.currentVersion,\n bump,\n git,\n gitCwd,\n pkg.name,\n );\n\n planPackages.push({\n ...pkg,\n nextVersion,\n bump: bump === 'auto' ? detectBumpType(pkg.currentVersion, nextVersion) : bump,\n });\n }\n\n // Apply versioning strategy (lockstep/independent/adaptive)\n // Scope-level override takes highest priority, then top-level, then legacy changelog.bumpStrategy\n const scopeVersioningStrategy = scope ? config.scopes?.[scope]?.versioningStrategy : undefined;\n const bumpStrategy = scopeVersioningStrategy || config.versioningStrategy || config.changelog?.bumpStrategy || 'independent';\n const versionStrategy = mapBumpStrategyToVersionStrategy(bumpStrategy);\n\n planPackages = applyVersionStrategy(planPackages, {\n strategy: versionStrategy,\n umbrellaPath: scope,\n });\n\n return {\n packages: planPackages,\n strategy: config.strategy || 'semver',\n registry: config.registry || 'https://registry.npmjs.org',\n rollbackEnabled: config.rollback?.enabled ?? true,\n };\n}\n\n/**\n * Map changelog.bumpStrategy to VersionStrategy\n */\nfunction mapBumpStrategyToVersionStrategy(\n bumpStrategy: 'independent' | 'ripple' | 'lockstep' | 'adaptive'\n): VersionStrategy {\n if (bumpStrategy === 'lockstep') {return 'lockstep';}\n if (bumpStrategy === 'ripple' || bumpStrategy === 'adaptive') {return 'adaptive';}\n return 'independent';\n}\n\n/**\n * Discover all release candidates according to config.packages (paths/include/exclude).\n * Does NOT apply scope filtering — that's done separately in filterByScope().\n */\nasync function discoverPackages(cwd: string, config?: ReleaseConfig): Promise<PackageVersion[]> {\n // Workspace root with .gitmodules → sub-repos are the release units\n const isWorkspaceRoot = existsSync(join(cwd, '.gitmodules'));\n if (isWorkspaceRoot) {\n return discoverSubRepoPackages(cwd, config);\n }\n\n const packages: PackageVersion[] = [];\n\n // Scan dirs from config.packages.paths, or full tree\n const configPaths = config?.packages?.paths;\n const pattern = configPaths?.length\n ? configPaths.map(p => `${p}/package.json`)\n : '**/package.json';\n\n const packageJsonPaths = await globby(pattern, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.*/**',\n ],\n });\n\n for (let i = 0; i < packageJsonPaths.length; i++) {\n if (i % 10 === 0) {\n await new Promise((resolve) => { setImmediate(resolve); });\n }\n\n const packageJsonPath = packageJsonPaths[i]!;\n const packagePath = join(packageJsonPath, '..');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n const isRootPackageJson = packageJsonPath === join(cwd, 'package.json');\n\n if (packageJson.private) {continue;}\n if (isRootPackageJson && existsSync(join(packagePath, 'pnpm-workspace.yaml'))) {continue;}\n if (isRootPackageJson && !packageJson.name) {continue;}\n\n // Apply global include/exclude from config.packages\n const globalFilter = config?.packages;\n if (globalFilter?.include?.length || globalFilter?.exclude?.length) {\n const rel = relative(cwd, packagePath);\n if (globalFilter.include?.length && !matchesPackagePattern(packageJson.name, rel, globalFilter.include)) {continue;}\n if (globalFilter.exclude?.length && matchesPackagePattern(packageJson.name, rel, globalFilter.exclude)) {continue;}\n }\n\n packages.push({\n name: packageJson.name,\n path: packagePath,\n currentVersion: packageJson.version,\n nextVersion: packageJson.version,\n bump: 'auto',\n isPublished: false,\n });\n }\n\n // Deduplicate by package name — keep the entry with the shortest path\n // (avoids duplicates when nested package.json files share the same name)\n const seen = new Map<string, PackageVersion>();\n for (const pkg of packages) {\n const existing = seen.get(pkg.name);\n if (!existing || pkg.path.length < existing.path.length) {\n seen.set(pkg.name, pkg);\n }\n }\n\n return Array.from(seen.values());\n}\n\n/**\n * Filter discovered packages by scope with clear error messages.\n * Scope can be: exact name (@kb-labs/core), wildcard (@kb-labs/*), or path glob (packages/*).\n * Also applies per-scope include/exclude from config.scopes[scope].\n */\nfunction filterByScope(\n packages: PackageVersion[],\n scope: string,\n config?: ReleaseConfig,\n): PackageVersion[] {\n // Per-scope package overrides\n const scopeFilter = config?.scopes?.[scope]?.packages;\n const globalFilter = config?.packages;\n const mergedInclude = [...(globalFilter?.include ?? []), ...(scopeFilter?.include ?? [])];\n const mergedExclude = [...(globalFilter?.exclude ?? []), ...(scopeFilter?.exclude ?? [])];\n\n // Build scope matcher\n const isExactName = !scope.includes('*') && (scope.startsWith('@') || !scope.includes('/'));\n const scopeRegex = new RegExp(\n '^' + scope.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '[^/]*') + '$'\n );\n\n const result: PackageVersion[] = [];\n\n for (const pkg of packages) {\n // Match by name or relative path depending on scope format\n const isPathPattern = scope.includes('/') && !scope.startsWith('@');\n const matchTarget = isPathPattern ? pkg.path : pkg.name;\n const matches = isExactName ? pkg.name === scope : scopeRegex.test(matchTarget);\n if (!matches) {continue;}\n\n // Apply per-scope include/exclude on top\n if (mergedInclude.length && !matchesPackagePattern(pkg.name, pkg.path, mergedInclude)) {continue;}\n if (mergedExclude.length && matchesPackagePattern(pkg.name, pkg.path, mergedExclude)) {continue;}\n\n result.push(pkg);\n }\n\n if (result.length === 0) {\n // Check if the scope would have matched something if not for exclude\n const wouldMatchExcluded = packages.some(p => {\n const matchTarget = isPathPattern(scope) ? p.path : p.name;\n const scopeMatches = isExactName ? p.name === scope : scopeRegex.test(matchTarget);\n if (!scopeMatches) {return false;}\n return mergedExclude.length > 0 && matchesPackagePattern(p.name, p.path, mergedExclude);\n });\n\n if (wouldMatchExcluded) {\n throw new Error(`Scope \"${scope}\" matches packages that are excluded by configuration`);\n }\n\n const globalInclude = globalFilter?.include;\n if (globalInclude?.length) {\n throw new Error(`Scope \"${scope}\" did not match any packages. Note: packages.include restricts discovery to: ${globalInclude.join(', ')}`);\n }\n\n throw new Error(`Scope \"${scope}\" did not match any discovered packages`);\n }\n\n return result;\n}\n\nfunction isPathPattern(scope: string): boolean {\n return scope.includes('/') && !scope.startsWith('@');\n}\n\n/**\n * Discover sub-repos as release units via .gitmodules.\n * Each sub-repo root package.json is a release unit (even if private).\n */\nasync function discoverSubRepoPackages(workspaceRoot: string, config?: ReleaseConfig): Promise<PackageVersion[]> {\n const subRepoPaths = discoverSubRepoPaths(workspaceRoot);\n const packages: PackageVersion[] = [];\n const globalFilter = config?.packages;\n\n for (const subRepoPath of subRepoPaths) {\n try {\n const pkgJson = JSON.parse(\n await readFile(join(subRepoPath, 'package.json'), 'utf-8')\n );\n if (!pkgJson.name) {continue;}\n\n const rel = relative(workspaceRoot, subRepoPath);\n\n // Apply global include/exclude\n if (globalFilter?.include?.length && !matchesPackagePattern(pkgJson.name, rel, globalFilter.include)) {continue;}\n if (globalFilter?.exclude?.length && matchesPackagePattern(pkgJson.name, rel, globalFilter.exclude)) {continue;}\n\n packages.push({\n name: pkgJson.name,\n path: subRepoPath,\n currentVersion: pkgJson.version || '0.0.0',\n nextVersion: pkgJson.version || '0.0.0',\n bump: 'auto',\n isPublished: false,\n });\n } catch {\n // Sub-repo without valid package.json — skip\n }\n }\n\n return packages;\n}\n\n/**\n * Check if file should be ignored (node_modules, dist, etc.)\n */\nfunction shouldIgnoreFile(file: string): boolean {\n const ignoredPaths = [\n 'node_modules/',\n '.git/',\n 'dist/',\n 'build/',\n '.next/',\n '.nuxt/',\n 'coverage/',\n '.cache/',\n 'tmp/',\n ];\n\n return ignoredPaths.some(path => file.includes(path));\n}\n\nasync function detectModifiedPackages(\n git: ReturnType<typeof simpleGit>,\n packages: PackageVersion[],\n cwd: string,\n): Promise<PackageVersion[]> {\n const modified: PackageVersion[] = [];\n\n for (let i = 0; i < packages.length; i++) {\n if (i % 10 === 0) {\n await new Promise((res) => { setImmediate(res); });\n }\n\n const pkg = packages[i]!;\n const pkgRel = relative(resolve(cwd), resolve(pkg.path));\n const changed = await hasChangesSinceTag(git, pkg.name, pkgRel);\n\n if (changed) {\n modified.push(pkg);\n }\n }\n\n return modified;\n}\n\nasync function computeNextVersion(\n packagePath: string,\n currentVersion: string,\n bump: VersionBump,\n git: ReturnType<typeof simpleGit>,\n gitCwd: string,\n pkgName: string,\n): Promise<string> {\n if (bump === 'auto') {\n const detectedBump = await detectVersionFromCommits(git, packagePath, gitCwd, pkgName);\n return semver.inc(currentVersion, detectedBump) || currentVersion;\n }\n return semver.inc(currentVersion, bump) || currentVersion;\n}\n\nasync function detectVersionFromCommits(\n git: ReturnType<typeof simpleGit>,\n packagePath: string,\n gitCwd: string,\n pkgName: string,\n): Promise<'major' | 'minor' | 'patch'> {\n try {\n const relPath = relative(resolve(gitCwd), resolve(packagePath));\n const messages = await getCommitsSinceTag(git, pkgName, relPath);\n\n let hasMinor = false;\n let hasBreaking = false;\n\n for (const message of messages) {\n const msg = message.toLowerCase();\n if (msg.includes('!:') || msg.includes('breaking change')) {\n hasBreaking = true;\n } else if (msg.startsWith('feat') || msg.startsWith('feature')) {\n hasMinor = true;\n }\n }\n\n if (hasBreaking) {return 'major';}\n if (hasMinor) {return 'minor';}\n return 'patch';\n } catch {\n return 'patch';\n }\n}\n\nfunction detectBumpType(currentVersion: string, nextVersion: string): VersionBump {\n if (semver.major(currentVersion) < semver.major(nextVersion)) {\n return 'major';\n }\n if (semver.minor(currentVersion) < semver.minor(nextVersion)) {\n return 'minor';\n }\n return 'patch';\n}\n\n/**\n * Match a package against a list of patterns.\n * - Patterns starting with '@' or without '/' → matched against package name.\n * - Patterns containing '/' (non-scoped) → matched against relative path.\n * - Supports '*' wildcard (single path segment, not separator).\n */\nexport function matchesPackagePattern(pkgName: string, relativePath: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n const isPathPattern = pattern.includes('/') && !pattern.startsWith('@');\n const target = isPathPattern ? relativePath : pkgName;\n const regex = new RegExp(\n '^' + pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '[^/]*') + '$'\n );\n if (regex.test(target)) {return true;}\n }\n return false;\n}\n\n","/**\n * @module @kb-labs/release-manager-core/shell-adapter\n * Shell adapter for release-core - wraps execa with SDK types\n */\n\nimport { execa } from 'execa';\nimport type { ShellAPI, ExecResult, ExecOptions } from '@kb-labs/sdk';\n\n/**\n * Create a ShellAPI adapter using execa\n * This is used in core libraries where ctx.runtime.shell is not available\n */\nexport function createExecaShellAdapter(): ShellAPI {\n return {\n async exec(command: string, args?: string[], options?: ExecOptions): Promise<ExecResult> {\n try {\n const result = await execa(command, args || [], {\n cwd: options?.cwd,\n timeout: options?.timeout,\n preferLocal: true,\n env: options?.env || process.env,\n });\n return {\n ok: result.exitCode === 0,\n code: result.exitCode,\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n };\n } catch (error: any) {\n return {\n ok: false,\n code: error.exitCode || 1,\n stdout: error.stdout || '',\n stderr: error.stderr || error.message || '',\n };\n }\n },\n };\n}\n\n","/**\n * Publisher - handles package publishing and changelog updates\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { PackageVersion, ReleasePlan } from './types';\nimport type { ShellAPI } from '@kb-labs/sdk';\nimport { createExecaShellAdapter } from './shell-adapter';\n\nexport interface PublisherOptions {\n cwd: string;\n plan: ReleasePlan;\n dryRun?: boolean;\n shell?: ShellAPI;\n config?: import('./types').ReleaseConfig;\n}\n\nexport interface PublishingResult {\n published: string[];\n skipped: string[];\n errors: string[];\n versionUpdates: Array<{\n package: string;\n from: string;\n to: string;\n updated: boolean;\n }>;\n}\n\n/**\n * Publish packages according to plan\n */\nexport async function publishPackages(options: PublisherOptions): Promise<PublishingResult> {\n const { plan, dryRun, shell } = options;\n const shellApi = shell || createExecaShellAdapter();\n const result: PublishingResult = {\n published: [],\n skipped: [],\n errors: [],\n versionUpdates: [],\n };\n\n if (dryRun) {\n // In dry-run, just report what would be published\n for (const pkg of plan.packages) {\n result.skipped.push(`${pkg.name}@${pkg.nextVersion} (dry-run)`);\n // Record planned version update (not applied)\n result.versionUpdates.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: false,\n });\n }\n return result;\n }\n\n // Publish each package\n for (const pkg of plan.packages) {\n try {\n const registry = plan.registry || 'https://registry.npmjs.org';\n\n // 1. Update version in package.json BEFORE publishing\n try {\n await updatePackageVersion(pkg);\n result.versionUpdates.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: true,\n });\n } catch (versionError) {\n const msg = `Failed to update version for ${pkg.name}: ${versionError instanceof Error ? versionError.message : String(versionError)}`;\n result.errors.push(msg);\n result.versionUpdates.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: false,\n });\n continue; // Skip publish if version update failed\n }\n\n // 2. Publish to npm\n const pm = options.config?.publish?.packageManager ?? 'pnpm';\n const access = options.config?.publish?.access ?? 'public';\n const publishResult = await shellApi.exec(\n pm,\n ['publish', '--access', access, '--registry', registry],\n {\n cwd: pkg.path,\n timeout: 60000,\n }\n );\n\n if (publishResult.ok) {\n result.published.push(`${pkg.name}@${pkg.nextVersion}`);\n } else {\n const errorDetails = publishResult.stderr || publishResult.stdout || 'Unknown error';\n result.errors.push(`Failed to publish ${pkg.name}: ${errorDetails}`);\n }\n } catch (error) {\n const msg = `Failed to publish ${pkg.name}: ${error instanceof Error ? error.message : String(error)}`;\n result.errors.push(msg);\n }\n }\n\n return result;\n}\n\n/**\n * Update package.json version to nextVersion\n * Should be called BEFORE generating changelog so versions match\n */\nexport async function updatePackageVersion(pkg: PackageVersion): Promise<void> {\n const packageJsonPath = join(pkg.path, 'package.json');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n\n packageJson.version = pkg.nextVersion;\n\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Update versions for all packages in the plan\n */\nexport async function updatePackageVersions(plan: ReleasePlan): Promise<Array<{\n package: string;\n from: string;\n to: string;\n updated: boolean;\n}>> {\n const results: Array<{\n package: string;\n from: string;\n to: string;\n updated: boolean;\n }> = [];\n\n for (const pkg of plan.packages) {\n try {\n await updatePackageVersion(pkg);\n results.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: true,\n });\n } catch (error) {\n console.warn(`Failed to update version for ${pkg.name}: ${error instanceof Error ? error.message : String(error)}`);\n results.push({\n package: pkg.name,\n from: pkg.currentVersion || 'unknown',\n to: pkg.nextVersion || 'unknown',\n updated: false,\n });\n }\n }\n\n return results;\n}\n\n/**\n * Generate changelog entry for release\n * Note: This is a simplified wrapper. Full changelog generation is handled by @kb-labs/release-manager-changelog\n */\nexport async function generateChangelog(options: {\n cwd: string;\n plan: ReleasePlan;\n}): Promise<string> {\n const { cwd, plan } = options;\n \n const changelogPath = join(cwd, 'CHANGELOG.md');\n let existingChangelog = '';\n \n try {\n existingChangelog = await readFile(changelogPath, 'utf-8');\n } catch {\n // Changelog doesn't exist yet\n }\n\n const date = new Date().toISOString().split('T')[0];\n const header = `## [${date}] Release\\n\\n`;\n \n const entries: string[] = [];\n for (const pkg of plan.packages) {\n entries.push(`- **${pkg.name}**: ${pkg.currentVersion} → ${pkg.nextVersion}`);\n }\n \n const newEntry = header + entries.join('\\n') + '\\n\\n';\n \n // Prepend to existing changelog\n const updatedChangelog = newEntry + existingChangelog;\n \n // Write back\n try {\n await mkdir(join(cwd, '.kb', 'release'), { recursive: true });\n await writeFile(changelogPath, updatedChangelog, 'utf-8');\n } catch (error) {\n console.warn(`Failed to write changelog: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return newEntry;\n}\n\n/**\n * Generate enhanced changelog using @kb-labs/release-manager-changelog\n * This is the recommended approach for full-featured changelog generation\n *\n * Note: Full integration available via @kb-labs/release-manager-changelog package and CLI command\n */\nexport async function generateEnhancedChangelog(options: {\n cwd: string;\n plan: ReleasePlan;\n from?: string;\n to?: string;\n config?: any;\n}): Promise<{ changelog: string; manifest: any }> {\n // Full changelog generation is available via @kb-labs/release-manager-changelog\n // For now, fallback to simple changelog\n const simpleChangelog = await generateChangelog({\n cwd: options.cwd,\n plan: options.plan,\n });\n\n return {\n changelog: simpleChangelog,\n manifest: null,\n };\n}\n\n/**\n * Copy changelog to each package directory\n * This writes CHANGELOG.md per package with proper header\n */\nexport async function copyChangelogToPackages(options: {\n cwd: string;\n plan: ReleasePlan;\n changelog: string;\n}): Promise<void> {\n const { plan, changelog } = options;\n\n for (const pkg of plan.packages) {\n try {\n // For single-package releases, use the entire changelog\n // For multi-package releases, extract package-specific section\n let packageChangelog: string;\n\n if (plan.packages.length === 1) {\n // Single package release: use entire changelog as-is\n packageChangelog = changelog;\n } else {\n // Multi-package release: extract section for this package\n packageChangelog = createPackageChangelog(pkg, changelog);\n }\n\n if (!packageChangelog || packageChangelog.trim().length === 0) {\n console.warn(`No changelog content for ${pkg.name}, skipping`);\n continue;\n }\n\n // Write to package directory\n const changelogPath = join(pkg.path, 'CHANGELOG.md');\n\n // Read existing changelog if exists\n let existingChangelog = '';\n try {\n existingChangelog = await readFile(changelogPath, 'utf-8');\n } catch {\n // No existing changelog, start fresh\n }\n\n // Check if this version already exists in changelog to avoid duplicates\n const versionPattern = new RegExp(\n `^##\\\\s+${pkg.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+${pkg.nextVersion.replace(/\\./g, '\\\\.')}`,\n 'm'\n );\n\n let updatedChangelog: string;\n if (existingChangelog && versionPattern.test(existingChangelog)) {\n // Version already exists - replace the section instead of prepending\n // Find where current version section starts and next section begins\n const lines = existingChangelog.split('\\n');\n let startIdx = -1;\n let endIdx = lines.length;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line && versionPattern.test(line)) {\n startIdx = i;\n } else if (startIdx !== -1 && line && /^##\\s+@?[\\w-]+/.test(line)) {\n // Found next section header\n endIdx = i;\n break;\n }\n }\n\n if (startIdx !== -1) {\n // Replace the existing section\n const before = lines.slice(0, startIdx).join('\\n');\n const after = lines.slice(endIdx).join('\\n');\n updatedChangelog = (before ? before + '\\n' : '') + packageChangelog + (after ? '\\n' + after : '');\n } else {\n // Fallback: just use new changelog\n updatedChangelog = packageChangelog;\n }\n } else {\n // Prepend new entry\n updatedChangelog = packageChangelog + (existingChangelog ? '\\n' + existingChangelog : '');\n }\n\n await writeFile(changelogPath, updatedChangelog.trim() + '\\n', 'utf-8');\n } catch (error) {\n console.warn(`Failed to write changelog for ${pkg.name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n\n/**\n * Create package-specific changelog entry with proper header\n */\nfunction createPackageChangelog(pkg: PackageVersion, changelog: string): string {\n // Extract ONLY the section for this package from the full changelog\n // Format: ## @scope/package-name X.Y.Z\n const packageHeaderPattern = new RegExp(\n `^##\\\\s+${pkg.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+\\\\d+\\\\.\\\\d+\\\\.\\\\d+`,\n 'gm'\n );\n\n const allHeaders = Array.from(changelog.matchAll(/^##\\s+(@[\\w-]+\\/)?[\\w-]+\\s+\\d+\\.\\d+\\.\\d+/gm));\n\n // Find start index for this package\n let startIdx = -1;\n let endIdx = changelog.length;\n\n for (let i = 0; i < allHeaders.length; i++) {\n const match = allHeaders[i];\n if (!match || !match.index) {continue;}\n\n if (packageHeaderPattern.test(match[0])) {\n startIdx = match.index;\n // Find next package header\n if (i + 1 < allHeaders.length) {\n endIdx = allHeaders[i + 1]!.index!;\n }\n break;\n }\n }\n\n if (startIdx === -1) {\n // Package section not found in changelog, return empty\n return '';\n }\n\n // Extract the section for this package\n return changelog.substring(startIdx, endIdx).trim();\n}\n\n/**\n * Commit and tag release changes\n *\n * Each package is committed inside its own git repo (supports submodules).\n * After all packages are committed, tags are created in cwd (the monorepo root).\n */\nexport async function commitAndTagRelease(options: {\n cwd: string;\n plan: ReleasePlan;\n dryRun?: boolean;\n /** Pass --no-verify to git push and pushTags. Default: false — hooks run normally. */\n noVerify?: boolean;\n}): Promise<{ committed: boolean; tagged: string[]; pushed: boolean }> {\n const { cwd, plan, dryRun, noVerify = false } = options;\n const simpleGit = (await import('simple-git')).default;\n\n const result = {\n committed: false,\n tagged: [] as string[],\n pushed: false,\n };\n\n if (dryRun) {\n return result;\n }\n\n try {\n const commitMessage = createCommitMessage(plan);\n\n // 1. Commit each package in its own git repo\n for (const pkg of plan.packages) {\n const pkgGit = simpleGit(pkg.path);\n\n // Stage package.json and CHANGELOG.md (only if it exists)\n const filesToStage = ['package.json'];\n const changelogPath = join(pkg.path, 'CHANGELOG.md');\n if (existsSync(changelogPath)) {filesToStage.push('CHANGELOG.md');}\n await pkgGit.add(filesToStage);\n\n try {\n await pkgGit.commit(commitMessage);\n result.committed = true;\n } catch (commitError) {\n const msg = commitError instanceof Error ? commitError.message : String(commitError);\n if (!msg.includes('nothing to commit') && !msg.includes('nothing added to commit')) {\n throw commitError;\n }\n }\n }\n\n // 2. Create tags in cwd (monorepo root)\n const git = simpleGit(cwd);\n\n // Lockstep (all packages same version) → single repo-level tag: v{version}\n // Independent → per-package tag: {name}@{version}\n const uniqueVersions = new Set(plan.packages.map(p => p.nextVersion));\n const isLockstep = plan.packages.length > 1 && uniqueVersions.size === 1;\n\n if (isLockstep) {\n const version = plan.packages[0]!.nextVersion;\n const tagName = `v${version}`;\n await git.addTag(tagName);\n result.tagged.push(tagName);\n } else {\n for (const pkg of plan.packages) {\n const pkgGit = simpleGit(pkg.path);\n const tagName = `${pkg.name}@${pkg.nextVersion}`;\n await pkgGit.addTag(tagName);\n result.tagged.push(tagName);\n }\n }\n\n // 3. Push each package repo\n const pushFlags: string[] = noVerify ? ['--no-verify'] : [];\n const pushTagsOptions = noVerify ? ['--no-verify'] : undefined;\n for (const pkg of plan.packages) {\n const pkgGit = simpleGit(pkg.path);\n if (result.committed) {\n await pkgGit.push(pushFlags);\n }\n await pkgGit.pushTags(pushTagsOptions);\n }\n result.pushed = true;\n\n } catch (error) {\n console.error(`Git operations failed: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n\n return result;\n}\n\n/**\n * Create conventional commit message for release\n */\nfunction createCommitMessage(plan: ReleasePlan): string {\n const lines: string[] = [];\n\n if (plan.packages.length === 1 && plan.packages[0]) {\n const pkg = plan.packages[0];\n lines.push(`chore(release): publish ${pkg.name}@${pkg.nextVersion}`);\n } else {\n lines.push(`chore(release): publish ${plan.packages.length} packages`);\n }\n\n lines.push('');\n\n for (const pkg of plan.packages) {\n lines.push(`- ${pkg.name}@${pkg.nextVersion}`);\n }\n\n return lines.join('\\n');\n}\n\n","/**\n * Rollback - manages release snapshots and recovery\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { ReleasePlan, PackageVersion } from './types';\n\nexport interface RollbackSnapshot {\n ts: string;\n packages: PackageVersion[];\n}\n\n// MAX_HISTORY = 5; // Future use for snapshot retention\n\n/**\n * Save current state for potential rollback\n */\nexport async function saveSnapshot(options: {\n cwd: string;\n plan: ReleasePlan;\n}): Promise<void> {\n const { cwd, plan } = options;\n \n const snapshot: RollbackSnapshot = {\n ts: new Date().toISOString(),\n packages: plan.packages.map(pkg => ({\n ...pkg,\n nextVersion: pkg.currentVersion, // Store current before update\n })),\n };\n\n const snapshotDir = join(cwd, '.kb', 'release');\n await mkdir(snapshotDir, { recursive: true });\n \n const snapshotPath = join(snapshotDir, 'backup.json');\n await writeFile(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf-8');\n \n // Cleanup old snapshots\n await cleanupOldSnapshots(snapshotDir);\n}\n\n/**\n * Restore from snapshot\n */\nexport async function restoreSnapshot(cwd: string): Promise<void> {\n const snapshotPath = join(cwd, '.kb', 'release', 'backup.json');\n \n if (!existsSync(snapshotPath)) {\n throw new Error('No backup snapshot found');\n }\n\n const snapshotContent = await readFile(snapshotPath, 'utf-8');\n const snapshot: RollbackSnapshot = JSON.parse(snapshotContent);\n\n // Restore package.json versions\n for (const pkg of snapshot.packages) {\n const packageJsonPath = join(pkg.path, 'package.json');\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));\n \n packageJson.version = pkg.currentVersion;\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n }\n}\n\nasync function cleanupOldSnapshots(_snapshotDir: string): Promise<void> {\n // For now, just keep the latest backup.json\n // In the future, could maintain timestamped backups\n // and trim to MAX_HISTORY\n}\n\n","/**\n * Main release runner - orchestrates full release lifecycle\n */\n\nimport type {\n ReleaseConfig,\n ReleaseContext,\n ReleaseResult,\n ReleaseStage,\n CheckId,\n CheckResult,\n} from './types';\n\nexport interface RunnerOptions {\n config: ReleaseConfig;\n context: ReleaseContext;\n runChecks?: (stage: ReleaseStage) => Promise<Partial<Record<CheckId, CheckResult>>>;\n executePlan?: () => Promise<void>;\n onStageChange?: (stage: ReleaseStage) => void;\n}\n\n/**\n * Run full release process\n */\nexport async function runRelease(options: RunnerOptions): Promise<ReleaseResult> {\n const {\n config,\n runChecks,\n executePlan,\n onStageChange,\n } = options;\n\n const startTime = Date.now();\n const errors: string[] = [];\n let checks: Partial<Record<CheckId, CheckResult>> | undefined;\n\n try {\n // Stage 1: Planning\n onStageChange?.('planning');\n \n // Stage 2: Pre-release checks\n if (config.verify && config.verify.length > 0 && runChecks) {\n onStageChange?.('checking');\n checks = await runChecks('checking');\n \n // Check if any checks failed\n const failedChecks = Object.entries(checks)\n .filter(([_, result]) => result && !result.ok)\n .map(([id]) => id);\n \n if (failedChecks.length > 0) {\n errors.push(`Pre-release checks failed: ${failedChecks.join(', ')}`);\n \n if (config.strict) {\n return {\n ok: false,\n timingMs: Date.now() - startTime,\n errors,\n checks,\n };\n }\n }\n }\n\n // Stage 3: Versioning and publishing\n onStageChange?.('publishing');\n \n if (executePlan) {\n await executePlan();\n }\n\n // Stage 4: Verification\n onStageChange?.('verifying');\n \n return {\n ok: errors.length === 0,\n timingMs: Date.now() - startTime,\n errors: errors.length > 0 ? errors : undefined,\n checks,\n };\n } catch (error) {\n // Rollback on error\n onStageChange?.('rollback');\n \n errors.push(error instanceof Error ? error.message : String(error));\n \n return {\n ok: false,\n timingMs: Date.now() - startTime,\n errors,\n checks,\n };\n }\n}\n\n","/**\n * JSON reporter for release reports\n */\n\nimport type { ReleaseReport } from '../types';\n\nexport function renderJson(report: ReleaseReport): string {\n return JSON.stringify(report, null, 2);\n}\n\n","/**\n * Markdown reporter for release reports\n */\n\nimport type { ReleaseReport } from '../types';\n\nexport function renderMarkdown(report: ReleaseReport): string {\n const lines: string[] = [];\n \n lines.push('# 🧩 KB Labs Release Summary');\n lines.push('');\n lines.push(`**Timestamp**: ${report.ts}`);\n lines.push(`**Stage**: ${report.stage}`);\n lines.push('');\n\n if (report.result.ok) {\n lines.push('## ✅ Release: SUCCESS');\n } else {\n lines.push('## ❌ Release: FAILED');\n }\n \n lines.push('');\n\n // Checks section\n if (report.result.checks) {\n lines.push('## Quality Checks');\n lines.push('');\n\n for (const [id, result] of Object.entries(report.result.checks)) {\n if (!result) {continue;}\n const icon = result.ok ? '✅' : '❌';\n lines.push(`- ${icon} **${id}**: ${result.ok ? 'PASSED' : 'FAILED'}`);\n if (result.hint && !result.ok) {\n lines.push(` - ${result.hint}`);\n }\n }\n lines.push('');\n }\n\n // Per-package checks\n if (report.result.checksPerPackage) {\n lines.push('## Package Quality Checks');\n lines.push('');\n\n for (const [pkgName, pkgChecks] of Object.entries(report.result.checksPerPackage)) {\n lines.push(`### ${pkgName}`);\n lines.push('');\n for (const [id, result] of Object.entries(pkgChecks)) {\n if (!result) {continue;}\n const icon = result.ok ? '✅' : '❌';\n lines.push(`- ${icon} **${id}**: ${result.ok ? 'PASSED' : 'FAILED'}`);\n if (result.hint && !result.ok) {\n lines.push(` - ${result.hint}`);\n }\n }\n lines.push('');\n }\n }\n\n // Published packages\n if (report.result.published && report.result.published.length > 0) {\n lines.push('## 🚀 Published Packages');\n lines.push('');\n for (const pkg of report.result.published) {\n lines.push(`- ${pkg}`);\n }\n lines.push('');\n }\n\n // Errors\n if (report.result.errors && report.result.errors.length > 0) {\n lines.push('## ❌ Errors');\n lines.push('');\n for (const error of report.result.errors) {\n lines.push(`- ${error}`);\n }\n lines.push('');\n }\n\n // Timing\n lines.push(`**Duration**: ${formatTiming(report.result.timingMs)}`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction formatTiming(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\n","/**\n * Text reporter for release reports\n */\n\nimport type { ReleaseReport } from '../types';\n\nexport function renderText(report: ReleaseReport): string {\n const lines: string[] = [];\n \n lines.push('[release] ' + (report.result.ok ? 'OK' : 'FAILED'));\n lines.push('');\n\n // Checks\n if (report.result.checks) {\n for (const [id, result] of Object.entries(report.result.checks)) {\n if (!result) {continue;}\n lines.push(`[${id}] ${result.ok ? 'pass' : 'fail'}`);\n if (result.hint && !result.ok) {\n lines.push(` ${result.hint}`);\n }\n }\n lines.push('');\n }\n\n // Per-package checks\n if (report.result.checksPerPackage) {\n for (const [pkgName, pkgChecks] of Object.entries(report.result.checksPerPackage)) {\n lines.push(`[${pkgName}]`);\n for (const [id, result] of Object.entries(pkgChecks)) {\n if (!result) {continue;}\n lines.push(` [${id}] ${result.ok ? 'pass' : 'fail'}`);\n if (result.hint && !result.ok) {\n lines.push(` ${result.hint}`);\n }\n }\n }\n lines.push('');\n }\n\n // Published\n if (report.result.published && report.result.published.length > 0) {\n lines.push('[published] ' + report.result.published.length + ' package(s)');\n for (const pkg of report.result.published) {\n lines.push(` ${pkg}`);\n }\n lines.push('');\n }\n\n // Errors\n if (report.result.errors && report.result.errors.length > 0) {\n lines.push('[errors]');\n for (const error of report.result.errors) {\n lines.push(` ${error}`);\n }\n lines.push('');\n }\n\n lines.push(`[timing] ${formatTiming(report.result.timingMs)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatTiming(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\n","/**\n * Safe build — builds into temp dir, then atomically swaps dist/.\n * Prevents crashing running services whose dist/ is wiped by tsup's `clean: true`.\n */\n\nimport { rename, rm, cp } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport type { BuildResult, PackageVersion } from './types';\n\n/**\n * Build all packages in a plan using safe build strategy.\n * Stops on first failure.\n */\nexport async function buildPackages(\n packages: PackageVersion[],\n options?: {\n logger?: { info?: (...args: any[]) => void; warn?: (...args: any[]) => void; error?: (...args: any[]) => void };\n onProgress?: (pkg: string, result: BuildResult) => void;\n },\n): Promise<BuildResult[]> {\n const results: BuildResult[] = [];\n\n for (const pkg of packages) {\n options?.logger?.info?.(`Building ${pkg.name}...`);\n const result = await runSafeBuild(pkg.path, pkg.name);\n results.push({ ...result, name: pkg.name });\n\n options?.onProgress?.(pkg.name, { ...result, name: pkg.name });\n\n if (!result.success) {\n options?.logger?.error?.(`Build failed for ${pkg.name}: ${result.error}`);\n break;\n }\n\n options?.logger?.info?.(`Built ${pkg.name} in ${result.durationMs}ms`);\n }\n\n return results;\n}\n\n/**\n * Run build for a single package using safe temp-dir strategy when tsup is detected.\n * Falls back to regular `pnpm run build` for non-tsup packages.\n */\nexport async function runSafeBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const usesTsup = existsSync(join(packagePath, 'tsup.config.ts'))\n || existsSync(join(packagePath, 'tsup.config.js'));\n\n if (usesTsup) {\n return runTsupSafeBuild(packagePath, packageName);\n }\n\n return runDirectBuild(packagePath, packageName);\n}\n\n/**\n * Check if a shell command is a build command that should use safe build.\n */\nexport function isBuildCommand(command: string, args?: string[]): boolean {\n const full = [command, ...(args ?? [])].join(' ').trim();\n return /\\b(pnpm|npm|yarn)\\s+(run\\s+)?build\\b/.test(full);\n}\n\nasync function runTsupSafeBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const startTime = Date.now();\n const buildId = randomBytes(6).toString('hex');\n const tempDir = join(tmpdir(), `kb-release-build-${buildId}`);\n const distDir = join(packagePath, 'dist');\n const backupDir = join(packagePath, `dist.bak-${buildId}`);\n\n try {\n const buildResult = await spawnCommand(`npx tsup -d ${tempDir}`, packagePath);\n\n if (!buildResult.success) {\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n return { ...buildResult, name: packageName, durationMs: Date.now() - startTime };\n }\n\n if (existsSync(distDir)) {\n await rename(distDir, backupDir);\n }\n\n try {\n await rename(tempDir, distDir);\n } catch {\n await cp(tempDir, distDir, { recursive: true });\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n\n await rm(backupDir, { recursive: true, force: true }).catch(() => {});\n return { success: true, name: packageName, durationMs: Date.now() - startTime };\n } catch (err) {\n if (existsSync(backupDir) && !existsSync(distDir)) {\n await rename(backupDir, distDir).catch(() => {});\n }\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n return {\n success: false,\n name: packageName,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startTime,\n };\n }\n}\n\nasync function runDirectBuild(packagePath: string, packageName: string): Promise<BuildResult> {\n const result = await spawnCommand('pnpm run build', packagePath);\n return { ...result, name: packageName };\n}\n\nexport interface SpawnResult extends Omit<BuildResult, 'name'> {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Spawn a shell command and collect results.\n * Captures both stdout and stderr — build tools often write errors to stdout.\n */\nexport function spawnCommand(command: string, cwd: string, timeoutMs = 5 * 60 * 1000): Promise<SpawnResult> {\n const startTime = Date.now();\n\n return new Promise((resolve) => {\n const child = spawn(command, [], {\n cwd,\n stdio: 'pipe',\n shell: true,\n env: { ...process.env },\n });\n\n let stdout = '';\n let stderr = '';\n child.stdout?.on('data', (data) => { stdout += data.toString(); });\n child.stderr?.on('data', (data) => { stderr += data.toString(); });\n\n child.on('close', (code) => {\n const exitCode = code ?? 1;\n const durationMs = Date.now() - startTime;\n if (exitCode === 0) {\n resolve({ success: true, durationMs, stdout, stderr, exitCode });\n return;\n }\n\n // Build error message from available output (last N lines to keep it readable)\n const combined = (stderr || stdout).trim();\n const tail = combined\n .split('\\n')\n .slice(-30)\n .join('\\n');\n\n resolve({\n success: false,\n error: tail || `Build failed with exit code ${exitCode}`,\n durationMs,\n stdout,\n stderr,\n exitCode,\n });\n });\n\n child.on('error', (err) => {\n resolve({ success: false, error: err.message, durationMs: Date.now() - startTime, stdout: '', stderr: '', exitCode: 1 });\n });\n\n setTimeout(() => {\n child.kill();\n resolve({ success: false, error: `Timed out after ${timeoutMs / 1000}s`, durationMs: Date.now() - startTime, stdout: '', stderr: '', exitCode: 1 });\n }, timeoutMs);\n });\n}\n","/**\n * Unified check runner for release manager.\n * Reads config.checks[], supports parser field, script path resolution, perPackage routing.\n */\n\nimport { join } from 'node:path';\nimport type { CustomCheckConfig, CheckResult, CheckResultDetails } from './types';\nimport { spawnCommand } from './build';\n\nexport interface CheckRunnerOptions {\n repoRoot: string;\n packagePaths: string[];\n scopePath?: string;\n logger?: { info?: (...args: any[]) => void; warn?: (...args: any[]) => void };\n}\n\n/**\n * Run all configured checks against packages.\n * Handles: parser evaluation, script path resolution, perPackage/scopePath/repoRoot routing.\n */\nexport async function runReleaseChecks(\n checks: CustomCheckConfig[],\n options: CheckRunnerOptions,\n): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n for (const check of checks) {\n const result = await runSingleCheck(check, options);\n results.push(result);\n\n options.logger?.info?.(`Check ${check.id}: ${result.ok ? 'passed' : 'failed'} (${result.timingMs}ms)`);\n\n // Stop on first non-optional failure\n if (!result.ok && !check.optional) {\n break;\n }\n }\n\n return results;\n}\n\nasync function runSingleCheck(\n check: CustomCheckConfig,\n options: CheckRunnerOptions,\n): Promise<CheckResult> {\n const runIn = check.runIn ?? 'perPackage';\n let pathsToRun: string[];\n\n if (runIn === 'repoRoot') {\n pathsToRun = [options.repoRoot];\n } else if (runIn === 'scopePath') {\n pathsToRun = [options.scopePath ?? options.repoRoot];\n } else {\n pathsToRun = options.packagePaths.length > 0 ? options.packagePaths : [options.repoRoot];\n }\n\n // Run perPackage checks in parallel (concurrency=8); single-path checks run sequentially.\n const CONCURRENCY = 8;\n\n const resolvedArgs = (check.args ?? []).map(arg =>\n arg.match(/\\.(sh|js|ts|mjs|cjs)$/) ? join(options.repoRoot, arg) : arg\n );\n const fullCommand = [check.command, ...resolvedArgs].join(' ');\n const timeoutMs = check.timeoutMs ?? 120_000;\n\n type PkgRunResult = { path: string; ok: boolean; details: CheckResultDetails; durationMs: number };\n\n async function runForPath(pkgPath: string): Promise<PkgRunResult> {\n const result = await spawnCommand(fullCommand, pkgPath, timeoutMs);\n const ok = evaluateParser(check, result.stdout, result.stderr, result.exitCode);\n return {\n path: pkgPath,\n ok,\n durationMs: result.durationMs,\n details: {\n packagePath: pkgPath,\n stdout: result.stdout || undefined,\n stderr: result.stderr || undefined,\n exitCode: result.exitCode,\n error: result.error ?? (!ok ? `exit code ${result.exitCode}` : undefined),\n },\n };\n }\n\n let pkgResults: PkgRunResult[];\n\n if (runIn === 'perPackage' && pathsToRun.length > 1) {\n // Parallel with concurrency limit\n pkgResults = [];\n for (let i = 0; i < pathsToRun.length; i += CONCURRENCY) {\n const batch = pathsToRun.slice(i, i + CONCURRENCY);\n pkgResults.push(...await Promise.all(batch.map(runForPath)));\n }\n } else {\n pkgResults = [await runForPath(pathsToRun[0]!)];\n }\n\n const firstFailure = pkgResults.find(r => !r.ok)?.details;\n const totalDurationMs = pkgResults.reduce((sum, r) => sum + r.durationMs, 0);\n const perPackage: NonNullable<CheckResult['packages']> | undefined = pathsToRun.length > 1\n ? pkgResults.map(r => ({ path: r.path, ok: r.ok, details: r.ok ? undefined : r.details }))\n : undefined;\n\n const allOk = !firstFailure;\n\n return {\n id: check.id,\n ok: allOk,\n details: firstFailure,\n hint: check.optional ? 'optional' : undefined,\n timingMs: totalDurationMs,\n packages: perPackage && perPackage.length > 0 ? perPackage : undefined,\n };\n}\n\nfunction evaluateParser(\n check: CustomCheckConfig,\n stdout: string,\n stderr: string,\n exitCode: number,\n): boolean {\n const parser = check.parser ?? 'exitcode';\n\n if (parser === 'exitcode') {\n return exitCode === 0;\n }\n\n if (parser === 'json') {\n try {\n const parsed = JSON.parse(stdout);\n return parsed.ok === true || parsed.success === true || parsed.status === 'ok';\n } catch {\n return false;\n }\n }\n\n if (typeof parser === 'function') {\n return parser(stdout, stderr, exitCode);\n }\n\n return exitCode === 0;\n}\n","/**\n * Package verifier — npm pack → extract → verify artifacts before publish.\n * Catches: directory imports, test file leaks, missing exports, syntax errors.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync, mkdirSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\nimport { rmSync, writeFileSync } from 'node:fs';\nimport type { VerifyResult, PackageVersion } from './types';\n\n/**\n * Verify all packages in a plan are publishable.\n */\nexport async function verifyPackages(\n packages: PackageVersion[],\n options?: {\n logger?: { info?: (...args: any[]) => void };\n onProgress?: (pkg: string, result: VerifyResult) => void;\n },\n): Promise<VerifyResult[]> {\n const results: VerifyResult[] = [];\n\n for (const pkg of packages) {\n const result = verifyPackage(pkg.path, pkg.name);\n results.push(result);\n options?.onProgress?.(pkg.name, result);\n }\n\n return results;\n}\n\n/**\n * Verify a single package is publishable.\n * npm pack → extract → check exports, directory imports, test leaks, syntax.\n */\nexport function verifyPackage(packagePath: string, packageName?: string): VerifyResult {\n const pkgJsonPath = join(packagePath, 'package.json');\n if (!existsSync(pkgJsonPath)) {\n return { name: packageName ?? packagePath, success: true, issues: [] }; // skip\n }\n\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const name = packageName ?? pkg.name ?? packagePath;\n\n // Skip private packages\n if (pkg.private) {\n return { name, success: true, issues: [] };\n }\n\n if (!existsSync(join(packagePath, 'dist'))) {\n return { name, success: true, issues: [] }; // no dist = not built yet\n }\n\n const issues: string[] = [];\n const tmpDir = join(tmpdir(), `kb-verify-${randomBytes(6).toString('hex')}`);\n\n try {\n mkdirSync(tmpDir, { recursive: true });\n\n // 1. npm pack (with link: → * replacement)\n const origPkg = readFileSync(pkgJsonPath, 'utf-8');\n const modPkg = JSON.parse(origPkg);\n for (const section of ['dependencies', 'devDependencies', 'peerDependencies']) {\n const deps = modPkg[section];\n if (!deps) {continue;}\n for (const [k, v] of Object.entries(deps)) {\n if (typeof v === 'string' && (v as string).startsWith('link:')) {\n deps[k] = '*';\n }\n }\n }\n writeFileSync(pkgJsonPath, JSON.stringify(modPkg, null, 2) + '\\n');\n\n let tgzFile: string | undefined;\n try {\n execSync(`npm pack --pack-destination ${tmpDir}`, { cwd: packagePath, stdio: 'pipe', timeout: 30_000 });\n const files = readdirSync(tmpDir).filter(f => f.endsWith('.tgz'));\n tgzFile = files[0] ? join(tmpDir, files[0]) : undefined;\n } finally {\n // Always restore original package.json\n writeFileSync(pkgJsonPath, origPkg);\n }\n\n if (!tgzFile) {\n issues.push('npm pack produced no tarball');\n return { name, success: false, issues };\n }\n\n // 2. Extract\n execSync(`tar xzf ${tgzFile}`, { cwd: tmpDir, stdio: 'pipe' });\n const extractedDir = join(tmpDir, 'package');\n\n // 3. Test file leaks\n const testFiles = findFiles(join(extractedDir, 'dist'), f =>\n f.includes('.spec.') || f.includes('.test.') || f.includes('__tests__')\n );\n if (testFiles.length > 0) {\n issues.push(`Test files in dist/: ${testFiles.slice(0, 3).join(', ')}`);\n }\n\n // 4. Exports exist\n const extractedPkg = JSON.parse(readFileSync(join(extractedDir, 'package.json'), 'utf-8'));\n for (const field of ['main', 'module', 'types'] as const) {\n const val = extractedPkg[field];\n if (val && !existsSync(join(extractedDir, val))) {\n issues.push(`${field}: ${val} does not exist in published package`);\n }\n }\n\n if (extractedPkg.exports) {\n checkExportsExist(extractedPkg.exports, extractedDir, 'exports', issues);\n }\n\n // 5. Directory imports in ESM entry\n const esmEntry = resolveEsmEntry(extractedPkg);\n if (esmEntry) {\n const esmPath = join(extractedDir, esmEntry);\n if (existsSync(esmPath)) {\n checkDirectoryImports(esmPath, join(extractedDir, 'dist'), issues);\n\n // Syntax check\n try {\n execSync(`node --check ${esmPath}`, { stdio: 'pipe', timeout: 10_000 });\n } catch {\n issues.push(`ESM syntax error in ${esmEntry}`);\n }\n }\n }\n\n // 6. CJS syntax check\n const cjsEntry = resolveCjsEntry(extractedPkg);\n if (cjsEntry) {\n const cjsPath = join(extractedDir, cjsEntry);\n if (existsSync(cjsPath)) {\n try {\n execSync(`node --check ${cjsPath}`, { stdio: 'pipe', timeout: 10_000 });\n } catch {\n issues.push(`CJS syntax error in ${cjsEntry}`);\n }\n }\n }\n } catch (err) {\n issues.push(`Verification error: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n\n return { name, success: issues.length === 0, issues };\n}\n\nfunction resolveEsmEntry(pkg: any): string | undefined {\n return pkg.exports?.['.']?.import ?? pkg.module ?? pkg.main;\n}\n\nfunction resolveCjsEntry(pkg: any): string | undefined {\n const req = pkg.exports?.['.']?.require;\n if (req) {return req;}\n if (pkg.main?.endsWith('.cjs')) {return pkg.main;}\n return undefined;\n}\n\nfunction checkExportsExist(exports: any, baseDir: string, prefix: string, issues: string[]): void {\n if (typeof exports === 'string') {\n // Skip wildcard patterns like \"./dist/*\" — can't verify statically\n if (exports.includes('*')) { return; }\n if (!existsSync(join(baseDir, exports))) {\n issues.push(`${prefix}: ${exports} missing`);\n }\n } else if (exports && typeof exports === 'object') {\n for (const [k, v] of Object.entries(exports)) {\n // Skip wildcard export keys like \"./dist/*\"\n if (k.includes('*')) { continue; }\n checkExportsExist(v, baseDir, `${prefix}.${k}`, issues);\n }\n }\n}\n\nfunction checkDirectoryImports(filePath: string, distDir: string, issues: string[]): void {\n const content = readFileSync(filePath, 'utf-8');\n const importRegex = /(?:export|import)\\s.*?from\\s+['\"](\\.[^'\"]*)['\"]/g;\n let match: RegExpExecArray | null;\n\n while ((match = importRegex.exec(content)) !== null) {\n const target = match[1];\n if (!target || target.includes('.')) {continue;} // has extension, ok\n const targetPath = resolve(dirname(filePath), target);\n if (existsSync(targetPath) && statSync(targetPath).isDirectory()) {\n issues.push(`Directory import '${target}' in ${filePath.split('/').pop()}`);\n }\n }\n}\n\nfunction findFiles(dir: string, predicate: (f: string) => boolean): string[] {\n if (!existsSync(dir)) {return [];}\n const results: string[] = [];\n function walk(d: string) {\n try {\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n const full = join(d, entry.name);\n if (entry.isDirectory()) {walk(full);}\n else if (predicate(full)) {results.push(entry.name);}\n }\n } catch { /* skip */ }\n }\n walk(dir);\n return results;\n}\n","/**\n * Unified release pipeline — single orchestrator for CLI and REST.\n *\n * Flow: plan → snapshot → checks → build → verify → version bump → changelog → publish → git → report\n */\n\nimport { join } from 'node:path';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { planRelease } from './planner';\nimport { saveSnapshot, restoreSnapshot } from './rollback';\nimport { updatePackageVersions } from './publisher';\nimport { copyChangelogToPackages, commitAndTagRelease } from './publisher';\nimport { buildPackages } from './build';\nimport { runReleaseChecks } from './checks';\nimport { verifyPackages } from './verifier';\nimport type {\n PipelineOptions,\n PipelineResult,\n ReleaseReport,\n ReleaseStage,\n VersionBump,\n} from './types';\n\n/**\n * Run the complete release pipeline.\n * Both CLI and REST call this with different injected publishers/changelog generators.\n */\nexport async function runReleasePipeline(options: PipelineOptions): Promise<PipelineResult> {\n const {\n cwd, repoRoot, scopeCwd, scope, config, dryRun = false,\n skipChecks = false, skipBuild = false, skipVerify = false,\n noVerify = false,\n checks: checkConfigs, publisher, changelog: changelogGen,\n logger, onProgress,\n } = options;\n\n const flow = options.flow;\n\n const startTime = Date.now();\n const progress = (stage: ReleaseStage, msg: string) => {\n logger?.info?.(msg);\n onProgress?.(stage, msg);\n };\n\n // 1. Plan — always discover from repoRoot with scope as a filter.\n // scopeCwd is used only for checks/git/changelog (physical path ops), not for discovery.\n progress('planning', 'Discovering packages and planning release...');\n const plan = await planRelease({\n cwd: repoRoot,\n config,\n scope,\n flow, // already includes defaultFlow fallback\n bumpOverride: config.bump as VersionBump | undefined,\n });\n\n if (plan.packages.length === 0) {\n return {\n success: false,\n plan,\n report: buildReport('planning', plan, repoRoot, dryRun, startTime, {\n ok: false, errors: [`No packages found for scope: ${scope || 'all'}`], timingMs: 0,\n }),\n };\n }\n\n progress('planning', `Found ${plan.packages.length} package(s) to release`);\n\n // 2. Snapshot (for rollback)\n await saveSnapshot({ cwd: repoRoot, plan });\n\n // 3. Checks\n if (!skipChecks && checkConfigs && checkConfigs.length > 0) {\n progress('checking', `Running ${checkConfigs.length} pre-release check(s)...`);\n\n const packagePaths = plan.packages.map(p => p.path);\n const checkResults = await runReleaseChecks(checkConfigs, {\n repoRoot,\n packagePaths,\n scopePath: scopeCwd,\n logger,\n });\n\n const failed = checkResults.filter(r => !r.ok && r.hint !== 'optional');\n if (failed.length > 0) {\n await restoreSnapshot(repoRoot);\n\n // Build rich per-check error messages for both human and agent consumption\n const errorLines = failed.flatMap(f => {\n const lines: string[] = [`check \"${f.id}\" failed`];\n if (f.details?.packagePath) lines.push(` package: ${f.details.packagePath}`);\n if (f.details?.error) lines.push(` reason: ${f.details.error}`);\n if (f.details?.stderr?.trim()) lines.push(` stderr: ${f.details.stderr.trim().split('\\n').slice(0, 5).join('\\n ')}`);\n if (f.details?.stdout?.trim() && !f.details?.stderr?.trim()) lines.push(` output: ${f.details.stdout.trim().split('\\n').slice(0, 5).join('\\n ')}`);\n if (f.packages?.filter(p => !p.ok).length) {\n const failedPkgs = f.packages.filter(p => !p.ok);\n lines.push(` failed in ${failedPkgs.length}/${f.packages.length} package(s):`);\n for (const pkg of failedPkgs.slice(0, 10)) {\n lines.push(` - ${pkg.path}${pkg.details?.error ? `: ${pkg.details.error}` : ''}`);\n }\n }\n return lines;\n });\n\n return {\n success: false,\n plan,\n report: buildReport('checking', plan, repoRoot, dryRun, startTime, {\n ok: false,\n checks: Object.fromEntries(checkResults.map(r => [r.id, r])),\n errors: errorLines,\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n progress('checking', 'Pre-release checks passed');\n }\n\n // 4. Build\n if (!skipBuild && !dryRun) {\n progress('versioning', `Building ${plan.packages.length} package(s)...`);\n const buildResults = await buildPackages(plan.packages, { logger });\n const buildFailed = buildResults.filter(r => !r.success);\n\n if (buildFailed.length > 0) {\n await restoreSnapshot(repoRoot);\n return {\n success: false,\n plan,\n report: buildReport('versioning', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: buildFailed.map(f => `Build failed: ${f.name} — ${f.error}`),\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n\n // 5. Verify (pack + install check)\n if (!skipVerify && !dryRun) {\n progress('verifying', 'Verifying package artifacts...');\n const verifyResults = await verifyPackages(plan.packages, { logger });\n const verifyFailed = verifyResults.filter(r => !r.success);\n\n if (verifyFailed.length > 0) {\n await restoreSnapshot(repoRoot);\n const allIssues = verifyFailed.flatMap(r => r.issues.map(i => `${r.name}: ${i}`));\n return {\n success: false,\n plan,\n report: buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: [`Package verification failed:\\n ${allIssues.join('\\n ')}`],\n timingMs: Date.now() - startTime,\n }),\n };\n }\n\n progress('verifying', 'Package artifacts verified');\n }\n\n // 6. Version bump\n progress('versioning', 'Updating package versions...');\n if (!dryRun) {\n const versionUpdates = await updatePackageVersions(plan);\n const failedUpdates = versionUpdates.filter(u => !u.updated);\n if (failedUpdates.length > 0) {\n await restoreSnapshot(repoRoot);\n return {\n success: false,\n plan,\n report: buildReport('versioning', plan, repoRoot, dryRun, startTime, {\n ok: false,\n errors: failedUpdates.map(u => `Version update failed: ${u.package}`),\n versionUpdates,\n timingMs: Date.now() - startTime,\n }),\n };\n }\n }\n\n // 7. Changelog\n let changelogMd = '';\n if (changelogGen) {\n progress('versioning', 'Generating changelog...');\n try {\n changelogMd = await changelogGen.generate(plan, { repoRoot, gitCwd: scopeCwd, config });\n } catch (err) {\n logger?.warn?.(`Changelog generation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n if (changelogMd && !dryRun) {\n await copyChangelogToPackages({ cwd: repoRoot, plan, changelog: changelogMd });\n const changelogPath = join(repoRoot, '.kb', 'release', 'CHANGELOG.md');\n await mkdir(join(repoRoot, '.kb', 'release'), { recursive: true });\n await writeFile(changelogPath, changelogMd, 'utf-8');\n }\n\n // 8. Git commit + tag (before publish so tree is clean for pnpm publish git-checks)\n let gitResult: { committed: boolean; tagged: string[]; pushed: boolean } | undefined;\n if (!dryRun) {\n progress('verifying', 'Committing and tagging release...');\n gitResult = await commitAndTagRelease({ cwd: scopeCwd, plan, dryRun, noVerify });\n }\n\n // 9. Publish\n progress('publishing', dryRun ? 'Simulating publish (dry-run)...' : 'Publishing packages...');\n const packagesToPublish = plan.packages.map(pkg => ({\n name: pkg.name,\n version: pkg.nextVersion,\n path: pkg.path,\n }));\n\n const publishResult = await publisher.publish(packagesToPublish, {\n dryRun,\n access: 'public',\n });\n\n // 10. Report\n const report = buildReport('verifying', plan, repoRoot, dryRun, startTime, {\n ok: publishResult.errors.length === 0 && (!gitResult || gitResult.committed),\n published: publishResult.published,\n skipped: publishResult.skipped,\n changelog: changelogMd || undefined,\n git: gitResult,\n errors: publishResult.errors.length > 0 ? publishResult.errors : undefined,\n timingMs: Date.now() - startTime,\n });\n\n // Save report\n const scopeDir = scope ? scope.replace(/[@/]/g, '-').replace(/^-/, '') : 'root';\n const historyDir = join(repoRoot, '.kb', 'release', 'history', scopeDir, new Date().toISOString().replace(/[:.]/g, '-'));\n await mkdir(historyDir, { recursive: true });\n await writeFile(join(historyDir, 'report.json'), JSON.stringify(report, null, 2), 'utf-8');\n\n return { success: report.result.ok, plan, report };\n}\n\nfunction buildReport(\n stage: ReleaseStage,\n plan: any,\n repoRoot: string,\n dryRun: boolean,\n startTime: number,\n result: any,\n): ReleaseReport {\n return {\n schemaVersion: '1.0',\n ts: new Date().toISOString(),\n context: { repo: repoRoot, cwd: repoRoot, branch: 'unknown', dryRun },\n stage,\n plan,\n result: { ...result, timingMs: result.timingMs ?? (Date.now() - startTime) },\n };\n}\n","/**\n * Scope utilities — resolve scope name to filesystem path.\n *\n * \"scope\" is a filter/selector concept (e.g. \"@kb-labs/release-manager\", \"installer/kb-labs-create\").\n * \"scopePath\" is the resolved absolute filesystem path used for checks (runIn: scopePath) and git ops.\n *\n * Discovery (planRelease) always uses repoRoot + scope filter — never scopePath directly.\n */\n\nimport { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\n/**\n * Resolve a scope name to an absolute filesystem path.\n *\n * - 'root' → repoRoot\n * - '@kb-labs/foo' → directory containing package.json with that name\n * - 'installer/kb-labs-create' → repoRoot/installer/kb-labs-create (direct path)\n *\n * Used only where a physical path is required:\n * - checks with runIn: 'scopePath'\n * - git commit/tag cwd\n * - changelog gitCwd\n *\n * NOT used for package discovery — planRelease always takes (repoRoot, scope).\n */\nexport async function resolveScopePath(repoRoot: string, scope: string): Promise<string> {\n if (!scope || scope === 'root') {\n return repoRoot;\n }\n\n // Scoped npm package name → scan package.json files\n if (scope.startsWith('@')) {\n const packageJsonPaths = await globby('**/package.json', {\n cwd: repoRoot,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.*/**'],\n });\n\n for (const pkgJsonPath of packageJsonPaths) {\n try {\n const pkg = JSON.parse(await readFile(pkgJsonPath, 'utf-8'));\n if (pkg.name === scope) {\n return join(pkgJsonPath, '..');\n }\n } catch { /* skip */ }\n }\n }\n\n // Direct relative path (e.g. 'installer/kb-labs-create', 'plugins/kb-labs-mind')\n return join(repoRoot, scope);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kb-labs/release-manager-core",
3
- "version": "0.7.0",
3
+ "version": "2.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",
@@ -27,25 +27,14 @@
27
27
  "url": "https://github.com/kirill-baranov/kb-labs-release-manager.git",
28
28
  "directory": "packages/release-manager-core"
29
29
  },
30
- "scripts": {
31
- "clean": "rimraf dist",
32
- "build": "tsup",
33
- "dev": "tsup --watch",
34
- "type-check": "tsc --noEmit",
35
- "lint": "eslint .",
36
- "lint:fix": "eslint . --fix",
37
- "test": "vitest run --passWithNoTests -c ../../vitest.config.ts",
38
- "test:watch": "vitest -c ../../vitest.config.ts"
39
- },
40
30
  "dependencies": {
41
- "@kb-labs/sdk": "workspace:*",
42
31
  "execa": "^8.0.0",
43
32
  "globby": "^11.0.0",
44
33
  "semver": "^7.6.3",
45
- "simple-git": "^3.25.0"
34
+ "simple-git": "^3.25.0",
35
+ "@kb-labs/sdk": "1.6.5"
46
36
  },
47
37
  "devDependencies": {
48
- "@kb-labs/devkit": "workspace:*",
49
38
  "@types/fs-extra": "^11.0.0",
50
39
  "@types/node": "^24.3.3",
51
40
  "@types/semver": "^7.5.8",
@@ -53,10 +42,21 @@
53
42
  "rimraf": "^6.0.1",
54
43
  "tsup": "^8.5.0",
55
44
  "typescript": "^5.6.3",
56
- "vitest": "^3.2.4"
45
+ "vitest": "^3.2.4",
46
+ "@kb-labs/devkit": "2.6.0"
57
47
  },
58
48
  "engines": {
59
49
  "node": ">=20.0.0",
60
50
  "pnpm": ">=9.0.0"
51
+ },
52
+ "scripts": {
53
+ "clean": "rimraf dist",
54
+ "build": "tsup",
55
+ "dev": "tsup --watch",
56
+ "type-check": "tsc --noEmit",
57
+ "lint": "eslint .",
58
+ "lint:fix": "eslint . --fix",
59
+ "test": "vitest run --passWithNoTests -c ../../vitest.config.ts",
60
+ "test:watch": "vitest -c ../../vitest.config.ts"
61
61
  }
62
- }
62
+ }