@kb-labs/release-manager-cli 2.81.0 → 2.87.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/cli/commands/build.d.ts +10 -0
- package/dist/cli/commands/build.js +87 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/changelog.js +65 -57
- package/dist/cli/commands/changelog.js.map +1 -1
- package/dist/cli/commands/checks.d.ts +10 -0
- package/dist/cli/commands/checks.js +93 -0
- package/dist/cli/commands/checks.js.map +1 -0
- package/dist/cli/commands/git.d.ts +13 -0
- package/dist/cli/commands/git.js +93 -0
- package/dist/cli/commands/git.js.map +1 -0
- package/dist/cli/commands/pack.d.ts +10 -0
- package/dist/cli/commands/pack.js +83 -0
- package/dist/cli/commands/pack.js.map +1 -0
- package/dist/cli/commands/plan.js +40 -41
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/publish.js +225 -194
- package/dist/cli/commands/publish.js.map +1 -1
- package/dist/cli/commands/report.js +28 -31
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/rollback.js +0 -3
- package/dist/cli/commands/rollback.js.map +1 -1
- package/dist/cli/commands/run.js +386 -300
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/verify.js +29 -28
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/commands/version.d.ts +12 -0
- package/dist/cli/commands/version.js +111 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.js +146 -13
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +9 -0
- package/dist/manifest.js +131 -0
- package/dist/manifest.js.map +1 -1
- package/dist/rest/handlers/build-handler.js +22 -20
- package/dist/rest/handlers/build-handler.js.map +1 -1
- package/dist/rest/handlers/changelog-generate-handler.js +75 -88
- package/dist/rest/handlers/changelog-generate-handler.js.map +1 -1
- package/dist/rest/handlers/changelog-handler.js +1 -4
- package/dist/rest/handlers/changelog-handler.js.map +1 -1
- package/dist/rest/handlers/changelog-save-handler.js +0 -2
- package/dist/rest/handlers/changelog-save-handler.js.map +1 -1
- package/dist/rest/handlers/checklist-handler.js +113 -99
- package/dist/rest/handlers/checklist-handler.js.map +1 -1
- package/dist/rest/handlers/generate-handler.js +0 -3
- package/dist/rest/handlers/generate-handler.js.map +1 -1
- package/dist/rest/handlers/git-timeline-handler.js.map +1 -1
- package/dist/rest/handlers/history-changelog-handler.js +0 -1
- package/dist/rest/handlers/history-changelog-handler.js.map +1 -1
- package/dist/rest/handlers/history-handler.js +2 -3
- package/dist/rest/handlers/history-handler.js.map +1 -1
- package/dist/rest/handlers/history-plan-handler.js +0 -1
- package/dist/rest/handlers/history-plan-handler.js.map +1 -1
- package/dist/rest/handlers/history-report-handler.js +0 -1
- package/dist/rest/handlers/history-report-handler.js.map +1 -1
- package/dist/rest/handlers/plan-handler.js +0 -3
- package/dist/rest/handlers/plan-handler.js.map +1 -1
- package/dist/rest/handlers/preview-handler.js +0 -1
- package/dist/rest/handlers/preview-handler.js.map +1 -1
- package/dist/rest/handlers/report-handler.js +1 -1
- package/dist/rest/handlers/report-handler.js.map +1 -1
- package/dist/rest/handlers/reset-handler.js +0 -1
- package/dist/rest/handlers/reset-handler.js.map +1 -1
- package/dist/rest/handlers/run-checks-handler.js +0 -1
- package/dist/rest/handlers/run-checks-handler.js.map +1 -1
- package/dist/rest/handlers/run-handler.js +72 -52
- package/dist/rest/handlers/run-handler.js.map +1 -1
- package/dist/rest/handlers/status-handler.js +0 -2
- package/dist/rest/handlers/status-handler.js.map +1 -1
- package/dist/setup/handler.js.map +1 -1
- package/package.json +9 -8
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { CLIInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
interface BuildFlags {
|
|
5
|
+
scope?: string;
|
|
6
|
+
json?: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<BuildFlags>, unknown>;
|
|
9
|
+
|
|
10
|
+
export { _default as default };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { defineCommand, findRepoRoot, useConfig, useLoader } from '@kb-labs/sdk';
|
|
2
|
+
import { planRelease, buildPackages } from '@kb-labs/release-manager-core';
|
|
3
|
+
|
|
4
|
+
// src/cli/commands/build.ts
|
|
5
|
+
|
|
6
|
+
// src/cli/commands/build.ts
|
|
7
|
+
function buildSections(results, symbols) {
|
|
8
|
+
const sections = [];
|
|
9
|
+
const passed = results.filter((r) => r.success);
|
|
10
|
+
const failed = results.filter((r) => !r.success);
|
|
11
|
+
if (passed.length > 0) {
|
|
12
|
+
sections.push({
|
|
13
|
+
header: "Built",
|
|
14
|
+
items: passed.map((r) => `${symbols.success} ${r.name}${r.durationMs ? ` (${r.durationMs}ms)` : ""}`)
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
if (failed.length > 0) {
|
|
18
|
+
sections.push({
|
|
19
|
+
header: "Failed",
|
|
20
|
+
items: failed.flatMap((r) => {
|
|
21
|
+
const lines = [`${symbols.error} ${r.name}`];
|
|
22
|
+
if (r.error) {
|
|
23
|
+
lines.push(` ${r.error.slice(0, 200)}`);
|
|
24
|
+
}
|
|
25
|
+
return lines;
|
|
26
|
+
})
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return sections;
|
|
30
|
+
}
|
|
31
|
+
var build_default = defineCommand({
|
|
32
|
+
id: "release:build",
|
|
33
|
+
description: "Build packages from release plan using safe build strategy",
|
|
34
|
+
handler: {
|
|
35
|
+
async execute(ctx, input) {
|
|
36
|
+
const { flags } = input;
|
|
37
|
+
const cwd = ctx.cwd || process.cwd();
|
|
38
|
+
const repoRoot = await findRepoRoot(cwd);
|
|
39
|
+
const fileConfig = await useConfig();
|
|
40
|
+
const config = fileConfig ?? {};
|
|
41
|
+
const planLoader = useLoader("Discovering packages...");
|
|
42
|
+
planLoader.start();
|
|
43
|
+
const plan = await planRelease({ cwd: repoRoot, config, scope: flags.scope });
|
|
44
|
+
planLoader.succeed(`Found ${plan.packages.length} package(s)`);
|
|
45
|
+
if (plan.packages.length === 0) {
|
|
46
|
+
const msg = `No packages found${flags.scope ? ` matching scope: ${flags.scope}` : ""}`;
|
|
47
|
+
if (flags.json) {
|
|
48
|
+
ctx.ui?.json?.({ ok: true, failed: [], results: [], message: msg });
|
|
49
|
+
} else {
|
|
50
|
+
ctx.ui?.write?.(msg);
|
|
51
|
+
}
|
|
52
|
+
console.log("::kb-output::" + JSON.stringify({ ok: true, failed: [] }));
|
|
53
|
+
return { exitCode: 0, ok: true, failed: [], results: [] };
|
|
54
|
+
}
|
|
55
|
+
const buildLoader = useLoader(`Building ${plan.packages.length} package(s)...`);
|
|
56
|
+
buildLoader.start();
|
|
57
|
+
const results = await buildPackages(plan.packages, {
|
|
58
|
+
logger: ctx.platform?.logger,
|
|
59
|
+
onProgress: (name, result) => {
|
|
60
|
+
ctx.platform?.logger?.info?.(`Built ${name}`, { ok: result.success, ms: result.durationMs });
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const ok = results.every((r) => r.success);
|
|
64
|
+
const failed = results.filter((r) => !r.success).map((r) => r.name);
|
|
65
|
+
if (ok) {
|
|
66
|
+
buildLoader.succeed(`Built ${results.length} package(s)`);
|
|
67
|
+
} else {
|
|
68
|
+
buildLoader.fail(`${failed.length} package(s) failed to build`);
|
|
69
|
+
}
|
|
70
|
+
console.log("::kb-output::" + JSON.stringify({ ok, failed }));
|
|
71
|
+
if (flags.json) {
|
|
72
|
+
ctx.ui?.json?.({ ok, failed, results });
|
|
73
|
+
return { exitCode: ok ? 0 : 1, ok, failed, results };
|
|
74
|
+
}
|
|
75
|
+
ctx.ui.sideBox({
|
|
76
|
+
title: "Build Results",
|
|
77
|
+
sections: buildSections(results, ctx.ui.symbols),
|
|
78
|
+
status: ok ? "success" : "error"
|
|
79
|
+
});
|
|
80
|
+
return { exitCode: ok ? 0 : 1, ok, failed, results };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
export { build_default as default };
|
|
86
|
+
//# sourceMappingURL=build.js.map
|
|
87
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":";;;;;;AAyBA,SAAS,aAAA,CACP,SACA,OAAA,EAC6C;AAC7C,EAAA,MAAM,WAAwD,EAAC;AAE/D,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAC5C,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,OAAO,CAAA;AAE7C,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,MAAA,EAAQ,OAAA;AAAA,MACR,OAAO,MAAA,CAAO,GAAA,CAAI,OAAK,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,EAAG,EAAE,UAAA,GAAa,CAAA,EAAA,EAAK,EAAE,UAAU,CAAA,GAAA,CAAA,GAAQ,EAAE,CAAA,CAAE;AAAA,KACnG,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAA,KAAK;AACzB,QAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAC3C,QAAA,IAAI,EAAE,KAAA,EAAO;AAAE,UAAA,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,QAAG;AACzD,QAAA,OAAO,KAAA;AAAA,MACT,CAAC;AAAA,KACF,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,IAAO,gBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,eAAA;AAAA,EACJ,WAAA,EAAa,4DAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA0D;AAC5F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAG,CAAA;AAEvC,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAyB;AAClD,MAAA,MAAM,MAAA,GAAwB,cAAc,EAAC;AAE7C,MAAA,MAAM,UAAA,GAAa,UAAU,yBAAyB,CAAA;AACtD,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,EAAE,GAAA,EAAK,UAAU,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AAC5E,MAAA,UAAA,CAAW,OAAA,CAAQ,CAAA,MAAA,EAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,WAAA,CAAa,CAAA;AAE7D,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,GAAA,GAAM,oBAAoB,KAAA,CAAM,KAAA,GAAQ,oBAAoB,KAAA,CAAM,KAAK,KAAK,EAAE,CAAA,CAAA;AACpF,QAAA,IAAI,MAAM,IAAA,EAAM;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,EAAG,OAAA,EAAS,KAAK,CAAA;AAAA,QAAG,CAAA,MAClF;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,QAAG;AAC7B,QAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAG,CAAC,CAAA;AACtE,QAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,QAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,MAC1D;AAEA,MAAA,MAAM,cAAc,SAAA,CAAU,CAAA,SAAA,EAAY,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,cAAA,CAAgB,CAAA;AAC9E,MAAA,WAAA,CAAY,KAAA,EAAM;AAElB,MAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,IAAA,CAAK,QAAA,EAAU;AAAA,QACjD,MAAA,EAAQ,IAAI,QAAA,EAAU,MAAA;AAAA,QACtB,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,KAAW;AAC5B,UAAA,GAAA,CAAI,QAAA,EAAU,MAAA,EAAQ,IAAA,GAAO,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,EAAE,EAAA,EAAI,MAAA,CAAO,OAAA,EAAS,EAAA,EAAI,MAAA,CAAO,YAAY,CAAA;AAAA,QAC7F;AAAA,OACD,CAAA;AAED,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACvC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA;AAE9D,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAA,MAAA,EAAS,OAAA,CAAQ,MAAM,CAAA,WAAA,CAAa,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,2BAAA,CAA6B,CAAA;AAAA,MAChE;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,kBAAkB,IAAA,CAAK,SAAA,CAAU,EAAE,EAAA,EAAI,MAAA,EAAQ,CAAC,CAAA;AAE5D,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,EAAA,EAAI,MAAA,EAAQ,SAAS,CAAA;AACtC,QAAA,OAAO,EAAE,QAAA,EAAU,EAAA,GAAK,IAAI,CAAA,EAAG,EAAA,EAAI,QAAQ,OAAA,EAAQ;AAAA,MACrD;AAEA,MAAA,GAAA,CAAI,GAAG,OAAA,CAAQ;AAAA,QACb,KAAA,EAAO,eAAA;AAAA,QACP,QAAA,EAAU,aAAA,CAAc,OAAA,EAAS,GAAA,CAAI,GAAG,OAAO,CAAA;AAAA,QAC/C,MAAA,EAAQ,KAAK,SAAA,GAAY;AAAA,OAC1B,CAAA;AAED,MAAA,OAAO,EAAE,QAAA,EAAU,EAAA,GAAK,IAAI,CAAA,EAAG,EAAA,EAAI,QAAQ,OAAA,EAAQ;AAAA,IACrD;AAAA;AAEJ,CAAC","file":"build.js","sourcesContent":["/**\n * Release build command — build packages in plan using safe build strategy.\n * Atomic step: reads plan, builds, emits output marker for workflow.\n */\n\nimport { defineCommand, type CLIInput, type CommandResult, type PluginContextV3, useLoader, useConfig } from '@kb-labs/sdk';\nimport {\n planRelease,\n buildPackages,\n type ReleaseConfig,\n type BuildResult,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\n\ninterface BuildFlags {\n scope?: string;\n json?: boolean;\n}\n\ntype ReleaseBuildResult = CommandResult & {\n ok?: boolean;\n failed?: string[];\n results?: BuildResult[];\n};\n\nfunction buildSections(\n results: BuildResult[],\n symbols: { success: string; error: string },\n): Array<{ header?: string; items: string[] }> {\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n const passed = results.filter(r => r.success);\n const failed = results.filter(r => !r.success);\n\n if (passed.length > 0) {\n sections.push({\n header: 'Built',\n items: passed.map(r => `${symbols.success} ${r.name}${r.durationMs ? ` (${r.durationMs}ms)` : ''}`),\n });\n }\n\n if (failed.length > 0) {\n sections.push({\n header: 'Failed',\n items: failed.flatMap(r => {\n const lines = [`${symbols.error} ${r.name}`];\n if (r.error) { lines.push(` ${r.error.slice(0, 200)}`); }\n return lines;\n }),\n });\n }\n\n return sections;\n}\n\nexport default defineCommand({\n id: 'release:build',\n description: 'Build packages from release plan using safe build strategy',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<BuildFlags>): Promise<ReleaseBuildResult> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = fileConfig ?? {};\n\n const planLoader = useLoader('Discovering packages...');\n planLoader.start();\n const plan = await planRelease({ cwd: repoRoot, config, scope: flags.scope });\n planLoader.succeed(`Found ${plan.packages.length} package(s)`);\n\n if (plan.packages.length === 0) {\n const msg = `No packages found${flags.scope ? ` matching scope: ${flags.scope}` : ''}`;\n if (flags.json) { ctx.ui?.json?.({ ok: true, failed: [], results: [], message: msg }); }\n else { ctx.ui?.write?.(msg); }\n console.log('::kb-output::' + JSON.stringify({ ok: true, failed: [] }));\n return { exitCode: 0, ok: true, failed: [], results: [] };\n }\n\n const buildLoader = useLoader(`Building ${plan.packages.length} package(s)...`);\n buildLoader.start();\n\n const results = await buildPackages(plan.packages, {\n logger: ctx.platform?.logger,\n onProgress: (name, result) => {\n ctx.platform?.logger?.info?.(`Built ${name}`, { ok: result.success, ms: result.durationMs });\n },\n });\n\n const ok = results.every(r => r.success);\n const failed = results.filter(r => !r.success).map(r => r.name);\n\n if (ok) {\n buildLoader.succeed(`Built ${results.length} package(s)`);\n } else {\n buildLoader.fail(`${failed.length} package(s) failed to build`);\n }\n\n console.log('::kb-output::' + JSON.stringify({ ok, failed }));\n\n if (flags.json) {\n ctx.ui?.json?.({ ok, failed, results });\n return { exitCode: ok ? 0 : 1, ok, failed, results };\n }\n\n ctx.ui.sideBox({\n title: 'Build Results',\n sections: buildSections(results, ctx.ui.symbols),\n status: ok ? 'success' : 'error',\n });\n\n return { exitCode: ok ? 0 : 1, ok, failed, results };\n },\n },\n});\n"]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { join } from 'path';
|
|
2
|
-
import { mkdir,
|
|
2
|
+
import { mkdir, writeFile, stat, readFile } from 'fs/promises';
|
|
3
3
|
import { defineCommand, findRepoRoot, useLoader, useConfig, useLLM, displayArtifacts } from '@kb-labs/sdk';
|
|
4
4
|
import { planRelease } from '@kb-labs/release-manager-core';
|
|
5
|
-
import 'globby';
|
|
6
5
|
import { generateChangelog, generateSimpleChangelog } from '@kb-labs/release-manager-changelog';
|
|
7
6
|
|
|
8
7
|
// src/cli/commands/changelog.ts
|
|
@@ -51,6 +50,66 @@ function createChangelogGenerator(config, llm) {
|
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
// src/cli/commands/changelog.ts
|
|
53
|
+
async function resolveGitCwd(scope, packages, repoRoot) {
|
|
54
|
+
if (!scope || !packages[0]) {
|
|
55
|
+
return repoRoot;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
return await findRepoRoot(packages[0].path);
|
|
59
|
+
} catch {
|
|
60
|
+
return packages[0].path;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function removeExistingVersionBlock(existing, newMarkdown) {
|
|
64
|
+
const newVersionMatch = newMarkdown.match(/^## \[([^\]]+)\]/m);
|
|
65
|
+
if (!newVersionMatch) {
|
|
66
|
+
return existing;
|
|
67
|
+
}
|
|
68
|
+
const versionHeader = `## [${newVersionMatch[1]}]`;
|
|
69
|
+
const blockStart = existing.indexOf(versionHeader);
|
|
70
|
+
if (blockStart === -1) {
|
|
71
|
+
return existing;
|
|
72
|
+
}
|
|
73
|
+
const nextBlockStart = existing.indexOf("\n## [", blockStart + 1);
|
|
74
|
+
const blockEnd = nextBlockStart !== -1 ? nextBlockStart : existing.length;
|
|
75
|
+
const before = existing.substring(0, blockStart).trimEnd();
|
|
76
|
+
const after = existing.substring(blockEnd).trimStart();
|
|
77
|
+
return before && after ? `${before}
|
|
78
|
+
|
|
79
|
+
${after}` : before || after;
|
|
80
|
+
}
|
|
81
|
+
async function mergeChangelogContent(changelogPath, newMarkdown) {
|
|
82
|
+
let existing = "";
|
|
83
|
+
try {
|
|
84
|
+
existing = await readFile(changelogPath, "utf-8");
|
|
85
|
+
const footerStart = existing.indexOf("\n---\n\n*Generated automatically");
|
|
86
|
+
if (footerStart !== -1) {
|
|
87
|
+
existing = existing.substring(0, footerStart);
|
|
88
|
+
}
|
|
89
|
+
existing = removeExistingVersionBlock(existing, newMarkdown);
|
|
90
|
+
} catch {
|
|
91
|
+
}
|
|
92
|
+
return existing ? `${newMarkdown}
|
|
93
|
+
|
|
94
|
+
${existing}` : newMarkdown;
|
|
95
|
+
}
|
|
96
|
+
function buildChangelogSections(plan, format, artifacts) {
|
|
97
|
+
const sections = [];
|
|
98
|
+
sections.push({
|
|
99
|
+
header: "Summary",
|
|
100
|
+
items: [
|
|
101
|
+
`Packages: ${plan.packages.map((p) => p.name).join(", ")}`,
|
|
102
|
+
`Format: ${format === "both" ? "Markdown + JSON" : format}`
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
if (artifacts.length > 0) {
|
|
106
|
+
sections.push({
|
|
107
|
+
header: "Artifacts",
|
|
108
|
+
items: displayArtifacts(artifacts, { showSize: true, showTime: true, showDescription: true, maxItems: 10, title: "" })
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return sections;
|
|
112
|
+
}
|
|
54
113
|
var changelog_default = defineCommand({
|
|
55
114
|
id: "release:changelog",
|
|
56
115
|
description: "Generate changelog from conventional commits",
|
|
@@ -69,53 +128,20 @@ var changelog_default = defineCommand({
|
|
|
69
128
|
loader.fail(`No packages found matching scope: ${flags.scope || "all"}`);
|
|
70
129
|
return { exitCode: 1 };
|
|
71
130
|
}
|
|
72
|
-
|
|
73
|
-
if (flags.scope && plan.packages[0]) {
|
|
74
|
-
try {
|
|
75
|
-
gitCwd = await findRepoRoot(plan.packages[0].path);
|
|
76
|
-
} catch {
|
|
77
|
-
gitCwd = plan.packages[0].path;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
131
|
+
const gitCwd = await resolveGitCwd(flags.scope, plan.packages, repoRoot);
|
|
80
132
|
loader.update({ text: "Generating changelog..." });
|
|
81
133
|
const llm = useLLM();
|
|
82
134
|
const generator = createChangelogGenerator(config, llm ?? void 0);
|
|
83
135
|
const markdown = await generator.generate(plan, { repoRoot, gitCwd, config });
|
|
84
136
|
const format = flags.format || config.changelog?.format || "both";
|
|
85
|
-
loader.update({ text: "Saving artifacts..." });
|
|
86
137
|
const outputDir = join(repoRoot, ".kb", "release");
|
|
87
138
|
const artifacts = [];
|
|
88
139
|
if (!flags.json) {
|
|
140
|
+
loader.update({ text: "Saving artifacts..." });
|
|
89
141
|
await mkdir(outputDir, { recursive: true });
|
|
90
142
|
if (markdown && (format === "md" || format === "both")) {
|
|
91
143
|
const changelogPath = join(outputDir, "CHANGELOG.md");
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
existing = await readFile(changelogPath, "utf-8");
|
|
95
|
-
const footerStart = existing.indexOf("\n---\n\n*Generated automatically");
|
|
96
|
-
if (footerStart !== -1) {
|
|
97
|
-
existing = existing.substring(0, footerStart);
|
|
98
|
-
}
|
|
99
|
-
const newVersionMatch = markdown.match(/^## \[([^\]]+)\]/m);
|
|
100
|
-
if (newVersionMatch) {
|
|
101
|
-
const version = newVersionMatch[1];
|
|
102
|
-
const versionHeader = `## [${version}]`;
|
|
103
|
-
const blockStart = existing.indexOf(versionHeader);
|
|
104
|
-
if (blockStart !== -1) {
|
|
105
|
-
const nextBlockStart = existing.indexOf("\n## [", blockStart + 1);
|
|
106
|
-
const blockEnd = nextBlockStart !== -1 ? nextBlockStart : existing.length;
|
|
107
|
-
const before = existing.substring(0, blockStart).trimEnd();
|
|
108
|
-
const after = existing.substring(blockEnd).trimStart();
|
|
109
|
-
existing = before && after ? `${before}
|
|
110
|
-
|
|
111
|
-
${after}` : before || after;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
} catch {
|
|
115
|
-
}
|
|
116
|
-
const combined = existing ? `${markdown}
|
|
117
|
-
|
|
118
|
-
${existing}` : markdown;
|
|
144
|
+
const combined = await mergeChangelogContent(changelogPath, markdown);
|
|
119
145
|
await writeFile(changelogPath, combined, "utf-8");
|
|
120
146
|
const stats = await stat(changelogPath);
|
|
121
147
|
artifacts.push({
|
|
@@ -135,27 +161,9 @@ ${existing}` : markdown;
|
|
|
135
161
|
artifacts: artifacts.map((a) => ({ name: a.name, path: a.path, size: a.size ?? 0 }))
|
|
136
162
|
});
|
|
137
163
|
} else {
|
|
138
|
-
const sections = [];
|
|
139
|
-
sections.push({
|
|
140
|
-
header: "Summary",
|
|
141
|
-
items: [
|
|
142
|
-
`Packages: ${plan.packages.map((p) => p.name).join(", ")}`,
|
|
143
|
-
`Format: ${format === "both" ? "Markdown + JSON" : format}`
|
|
144
|
-
]
|
|
145
|
-
});
|
|
146
|
-
if (artifacts.length > 0) {
|
|
147
|
-
const artifactsLines = displayArtifacts(artifacts, {
|
|
148
|
-
showSize: true,
|
|
149
|
-
showTime: true,
|
|
150
|
-
showDescription: true,
|
|
151
|
-
maxItems: 10,
|
|
152
|
-
title: ""
|
|
153
|
-
});
|
|
154
|
-
sections.push({ header: "Artifacts", items: artifactsLines });
|
|
155
|
-
}
|
|
156
164
|
ctx.ui.sideBox({
|
|
157
165
|
title: "Changelog Generated",
|
|
158
|
-
sections,
|
|
166
|
+
sections: buildChangelogSections(plan, format, artifacts),
|
|
159
167
|
status: "success"
|
|
160
168
|
});
|
|
161
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/shared/changelog-factory.ts","../../../src/cli/commands/changelog.ts"],"names":["join","readFile"],"mappings":"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","file":"changelog.js","sourcesContent":["/**\n * Shared changelog generator factory.\n * Used by both CLI (run.ts) and REST (run-handler.ts) to avoid duplication.\n */\n\nimport {\n generateChangelog,\n generateSimpleChangelog,\n type ChangelogPackageInfo,\n} from '@kb-labs/release-manager-changelog';\nimport type { ReleaseConfig, ChangelogGenerator } from '@kb-labs/release-manager-core';\n\nexport function createChangelogGenerator(config: ReleaseConfig, llm?: any): ChangelogGenerator {\n return {\n async generate(plan, opts) {\n const locale = (config.changelog?.locale as 'en' | 'ru') || 'en';\n const packages: ChangelogPackageInfo[] = plan.packages.map(pkg => ({\n name: pkg.name,\n path: pkg.path,\n currentVersion: pkg.currentVersion,\n nextVersion: pkg.nextVersion,\n bump: pkg.bump === 'auto' ? 'patch' : pkg.bump,\n }));\n try {\n const result = await generateChangelog({\n repoRoot: opts.repoRoot,\n gitCwd: opts.gitCwd,\n packages,\n range: { to: 'HEAD' },\n changelog: {\n template: config.changelog?.template ?? undefined,\n locale,\n metadata: config.changelog?.metadata,\n ignoreAuthors: config.changelog?.ignoreAuthors,\n includeTypes: config.changelog?.includeTypes as string[],\n excludeTypes: config.changelog?.excludeTypes as string[],\n collapseMerges: config.changelog?.collapseMerges,\n collapseReverts: config.changelog?.collapseReverts,\n preferMergeSummary: config.changelog?.preferMergeSummary,\n groups: config.changelog?.groups,\n },\n git: {\n autoUnshallow: config.git?.autoUnshallow,\n requireSignedTags: config.git?.requireSignedTags,\n baseUrl: config.git?.baseUrl ?? undefined,\n },\n platform: llm ? { llm } : undefined,\n });\n return result.markdown;\n } catch {\n return generateSimpleChangelog(packages, locale);\n }\n },\n };\n}\n","/**\n * Release changelog command — thin adapter over planRelease + createChangelogGenerator.\n */\n\nimport { join } from 'node:path';\nimport { stat, writeFile, mkdir, readFile } from 'node:fs/promises';\nimport { defineCommand, type CLIInput, type PluginContextV3, useLLM, useLoader, displayArtifacts, type ArtifactInfo, useConfig } from '@kb-labs/sdk';\nimport { planRelease, type ReleaseConfig } from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { createChangelogGenerator } from '../../shared/changelog-factory';\n\ninterface ChangelogFlags {\n scope?: string;\n flow?: string;\n from?: string;\n to?: string;\n 'since-tag'?: string;\n format?: 'json' | 'md' | 'both';\n level?: 'compact' | 'standard' | 'detailed';\n template?: string;\n 'breaking-only'?: boolean;\n json?: boolean;\n}\n\ninterface ReleaseChangelogResult {\n exitCode: number;\n artifacts?: Array<{ name: string; path: string; size: number }>;\n}\n\nexport default defineCommand({\n id: 'release:changelog',\n description: 'Generate changelog from conventional commits',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<ChangelogFlags>): Promise<ReleaseChangelogResult> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n // 1. Load config + discover packages\n const loader = useLoader('Loading configuration...');\n loader.start();\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = fileConfig ?? {};\n\n loader.update({ text: 'Discovering packages...' });\n\n const plan = await planRelease({ cwd: repoRoot, config, scope: flags.scope, flow: flags.flow });\n\n if (plan.packages.length === 0) {\n loader.fail(`No packages found matching scope: ${flags.scope || 'all'}`);\n return { exitCode: 1 };\n }\n\n // 2. Determine git working directory (for submodule support)\n let gitCwd = repoRoot;\n if (flags.scope && plan.packages[0]) {\n try {\n gitCwd = await findRepoRoot(plan.packages[0].path);\n } catch {\n gitCwd = plan.packages[0].path;\n }\n }\n\n // 3. Generate changelog via shared factory\n loader.update({ text: 'Generating changelog...' });\n\n const llm = useLLM();\n const generator = createChangelogGenerator(config, llm ?? undefined);\n const markdown = await generator.generate(plan, { repoRoot, gitCwd, config });\n\n const format = flags.format || config.changelog?.format || 'both';\n\n // 4. Save artifacts\n loader.update({ text: 'Saving artifacts...' });\n\n const outputDir = join(repoRoot, '.kb', 'release');\n const artifacts: ArtifactInfo[] = [];\n\n if (!flags.json) {\n await mkdir(outputDir, { recursive: true });\n\n if (markdown && (format === 'md' || format === 'both')) {\n const changelogPath = join(outputDir, 'CHANGELOG.md');\n\n // Read existing, strip same-version block if present, then prepend new content\n let existing = '';\n try {\n existing = await readFile(changelogPath, 'utf-8');\n const footerStart = existing.indexOf('\\n---\\n\\n*Generated automatically');\n if (footerStart !== -1) {\n existing = existing.substring(0, footerStart);\n }\n // Extract version from new markdown (first ## [x.y.z] line)\n const newVersionMatch = markdown.match(/^## \\[([^\\]]+)\\]/m);\n if (newVersionMatch) {\n const version = newVersionMatch[1];\n // Find and remove the existing block for this version\n // A block starts with ## [version] and ends before the next ## [ or EOF\n const versionHeader = `## [${version}]`;\n const blockStart = existing.indexOf(versionHeader);\n if (blockStart !== -1) {\n const nextBlockStart = existing.indexOf('\\n## [', blockStart + 1);\n const blockEnd = nextBlockStart !== -1 ? nextBlockStart : existing.length;\n const before = existing.substring(0, blockStart).trimEnd();\n const after = existing.substring(blockEnd).trimStart();\n existing = before && after ? `${before}\\n\\n${after}` : before || after;\n }\n }\n } catch { /* file doesn't exist yet */ }\n\n const combined = existing ? `${markdown}\\n\\n${existing}` : markdown;\n await writeFile(changelogPath, combined, 'utf-8');\n\n const stats = await stat(changelogPath);\n artifacts.push({\n name: 'Changelog',\n path: changelogPath,\n size: stats.size,\n modified: stats.mtime,\n description: 'Generated changelog in Markdown format',\n });\n }\n }\n\n loader.succeed('Changelog generated successfully');\n\n // 5. Output\n if (flags.json) {\n ctx.ui?.json?.({\n packagesCount: plan.packages.length,\n markdown: format === 'md' || format === 'both' ? markdown : undefined,\n artifacts: artifacts.map(a => ({ name: a.name, path: a.path, size: a.size ?? 0 })),\n });\n } else {\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n sections.push({\n header: 'Summary',\n items: [\n `Packages: ${plan.packages.map(p => p.name).join(', ')}`,\n `Format: ${format === 'both' ? 'Markdown + JSON' : format}`,\n ],\n });\n\n if (artifacts.length > 0) {\n const artifactsLines = displayArtifacts(artifacts, {\n showSize: true,\n showTime: true,\n showDescription: true,\n maxItems: 10,\n title: '',\n });\n sections.push({ header: 'Artifacts', items: artifactsLines });\n }\n\n ctx.ui.sideBox({\n title: 'Changelog Generated',\n sections,\n status: 'success',\n });\n }\n\n return {\n exitCode: 0,\n artifacts: artifacts.map(a => ({ name: a.name, path: a.path, size: a.size ?? 0 })),\n };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/changelog-factory.ts","../../../src/cli/commands/changelog.ts"],"names":[],"mappings":"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","file":"changelog.js","sourcesContent":["/**\n * Shared changelog generator factory.\n * Used by both CLI (run.ts) and REST (run-handler.ts) to avoid duplication.\n */\n\nimport {\n generateChangelog,\n generateSimpleChangelog,\n type ChangelogPackageInfo,\n} from '@kb-labs/release-manager-changelog';\nimport type { ReleaseConfig, ChangelogGenerator } from '@kb-labs/release-manager-core';\n\nexport function createChangelogGenerator(config: ReleaseConfig, llm?: any): ChangelogGenerator {\n return {\n async generate(plan, opts) {\n const locale = (config.changelog?.locale as 'en' | 'ru') || 'en';\n const packages: ChangelogPackageInfo[] = plan.packages.map(pkg => ({\n name: pkg.name,\n path: pkg.path,\n currentVersion: pkg.currentVersion,\n nextVersion: pkg.nextVersion,\n bump: pkg.bump === 'auto' ? 'patch' : pkg.bump,\n }));\n try {\n const result = await generateChangelog({\n repoRoot: opts.repoRoot,\n gitCwd: opts.gitCwd,\n packages,\n range: { to: 'HEAD' },\n changelog: {\n template: config.changelog?.template ?? undefined,\n locale,\n metadata: config.changelog?.metadata,\n ignoreAuthors: config.changelog?.ignoreAuthors,\n includeTypes: config.changelog?.includeTypes as string[],\n excludeTypes: config.changelog?.excludeTypes as string[],\n collapseMerges: config.changelog?.collapseMerges,\n collapseReverts: config.changelog?.collapseReverts,\n preferMergeSummary: config.changelog?.preferMergeSummary,\n groups: config.changelog?.groups,\n },\n git: {\n autoUnshallow: config.git?.autoUnshallow,\n requireSignedTags: config.git?.requireSignedTags,\n baseUrl: config.git?.baseUrl ?? undefined,\n },\n platform: llm ? { llm } : undefined,\n });\n return result.markdown;\n } catch {\n return generateSimpleChangelog(packages, locale);\n }\n },\n };\n}\n","/**\n * Release changelog command — thin adapter over planRelease + createChangelogGenerator.\n */\n\nimport { join } from 'node:path';\nimport { stat, writeFile, mkdir, readFile } from 'node:fs/promises';\nimport { defineCommand, type CLIInput, type PluginContextV3, useLLM, useLoader, displayArtifacts, type ArtifactInfo, useConfig } from '@kb-labs/sdk';\nimport { planRelease, type ReleaseConfig } from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { createChangelogGenerator } from '../../shared/changelog-factory';\n\ninterface ChangelogFlags {\n scope?: string;\n flow?: string;\n from?: string;\n to?: string;\n 'since-tag'?: string;\n format?: 'json' | 'md' | 'both';\n level?: 'compact' | 'standard' | 'detailed';\n template?: string;\n 'breaking-only'?: boolean;\n json?: boolean;\n}\n\ninterface ReleaseChangelogResult {\n exitCode: number;\n artifacts?: Array<{ name: string; path: string; size: number }>;\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nasync function resolveGitCwd(\n scope: string | undefined,\n packages: Array<{ path: string }>,\n repoRoot: string,\n): Promise<string> {\n if (!scope || !packages[0]) { return repoRoot; }\n try {\n return await findRepoRoot(packages[0].path);\n } catch {\n return packages[0].path;\n }\n}\n\n/** Remove a version block from existing changelog content, if present. */\nfunction removeExistingVersionBlock(existing: string, newMarkdown: string): string {\n const newVersionMatch = newMarkdown.match(/^## \\[([^\\]]+)\\]/m);\n if (!newVersionMatch) { return existing; }\n\n const versionHeader = `## [${newVersionMatch[1]}]`;\n const blockStart = existing.indexOf(versionHeader);\n if (blockStart === -1) { return existing; }\n\n const nextBlockStart = existing.indexOf('\\n## [', blockStart + 1);\n const blockEnd = nextBlockStart !== -1 ? nextBlockStart : existing.length;\n const before = existing.substring(0, blockStart).trimEnd();\n const after = existing.substring(blockEnd).trimStart();\n return before && after ? `${before}\\n\\n${after}` : before || after;\n}\n\n/** Read existing changelog, strip footer + duplicate version, then prepend new content. */\nasync function mergeChangelogContent(changelogPath: string, newMarkdown: string): Promise<string> {\n let existing = '';\n try {\n existing = await readFile(changelogPath, 'utf-8');\n const footerStart = existing.indexOf('\\n---\\n\\n*Generated automatically');\n if (footerStart !== -1) { existing = existing.substring(0, footerStart); }\n existing = removeExistingVersionBlock(existing, newMarkdown);\n } catch { /* file doesn't exist yet */ }\n return existing ? `${newMarkdown}\\n\\n${existing}` : newMarkdown;\n}\n\nfunction buildChangelogSections(\n plan: { packages: Array<{ name: string }> },\n format: string,\n artifacts: ArtifactInfo[],\n): Array<{ header?: string; items: string[] }> {\n const sections: Array<{ header?: string; items: string[] }> = [];\n sections.push({\n header: 'Summary',\n items: [\n `Packages: ${plan.packages.map(p => p.name).join(', ')}`,\n `Format: ${format === 'both' ? 'Markdown + JSON' : format}`,\n ],\n });\n if (artifacts.length > 0) {\n sections.push({\n header: 'Artifacts',\n items: displayArtifacts(artifacts, { showSize: true, showTime: true, showDescription: true, maxItems: 10, title: '' }),\n });\n }\n return sections;\n}\n\n// ── command ────────────────────────────────────────────────────────────────\n\nexport default defineCommand({\n id: 'release:changelog',\n description: 'Generate changelog from conventional commits',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<ChangelogFlags>): Promise<ReleaseChangelogResult> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const loader = useLoader('Loading configuration...');\n loader.start();\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = fileConfig ?? {};\n\n loader.update({ text: 'Discovering packages...' });\n const plan = await planRelease({ cwd: repoRoot, config, scope: flags.scope, flow: flags.flow });\n\n if (plan.packages.length === 0) {\n loader.fail(`No packages found matching scope: ${flags.scope || 'all'}`);\n return { exitCode: 1 };\n }\n\n const gitCwd = await resolveGitCwd(flags.scope, plan.packages, repoRoot);\n\n loader.update({ text: 'Generating changelog...' });\n const llm = useLLM();\n const generator = createChangelogGenerator(config, llm ?? undefined);\n const markdown = await generator.generate(plan, { repoRoot, gitCwd, config });\n\n const format = flags.format || config.changelog?.format || 'both';\n const outputDir = join(repoRoot, '.kb', 'release');\n const artifacts: ArtifactInfo[] = [];\n\n if (!flags.json) {\n loader.update({ text: 'Saving artifacts...' });\n await mkdir(outputDir, { recursive: true });\n\n if (markdown && (format === 'md' || format === 'both')) {\n const changelogPath = join(outputDir, 'CHANGELOG.md');\n const combined = await mergeChangelogContent(changelogPath, markdown);\n await writeFile(changelogPath, combined, 'utf-8');\n const stats = await stat(changelogPath);\n artifacts.push({\n name: 'Changelog',\n path: changelogPath,\n size: stats.size,\n modified: stats.mtime,\n description: 'Generated changelog in Markdown format',\n });\n }\n }\n\n loader.succeed('Changelog generated successfully');\n\n if (flags.json) {\n ctx.ui?.json?.({\n packagesCount: plan.packages.length,\n markdown: format === 'md' || format === 'both' ? markdown : undefined,\n artifacts: artifacts.map(a => ({ name: a.name, path: a.path, size: a.size ?? 0 })),\n });\n } else {\n ctx.ui.sideBox({\n title: 'Changelog Generated',\n sections: buildChangelogSections(plan, format, artifacts),\n status: 'success',\n });\n }\n\n return {\n exitCode: 0,\n artifacts: artifacts.map(a => ({ name: a.name, path: a.path, size: a.size ?? 0 })),\n };\n },\n },\n});\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { CLIInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
interface ChecksFlags {
|
|
5
|
+
scope?: string;
|
|
6
|
+
json?: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<ChecksFlags>, unknown>;
|
|
9
|
+
|
|
10
|
+
export { _default as default };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { defineCommand, findRepoRoot, useConfig, useLoader } from '@kb-labs/sdk';
|
|
2
|
+
import { planRelease, resolveScopePath, runReleaseChecks } from '@kb-labs/release-manager-core';
|
|
3
|
+
|
|
4
|
+
// src/cli/commands/checks.ts
|
|
5
|
+
|
|
6
|
+
// src/cli/commands/checks.ts
|
|
7
|
+
function buildChecksSections(results, symbols) {
|
|
8
|
+
const sections = [];
|
|
9
|
+
const passed = results.filter((r) => r.ok);
|
|
10
|
+
const failed = results.filter((r) => !r.ok);
|
|
11
|
+
if (passed.length > 0) {
|
|
12
|
+
sections.push({
|
|
13
|
+
header: "Passed",
|
|
14
|
+
items: passed.map((r) => `${symbols.success} ${r.id}${r.timingMs ? ` (${r.timingMs}ms)` : ""}`)
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
if (failed.length > 0) {
|
|
18
|
+
sections.push({
|
|
19
|
+
header: "Failed",
|
|
20
|
+
items: failed.flatMap((r) => {
|
|
21
|
+
const lines = [`${symbols.error} ${r.id}`];
|
|
22
|
+
if (r.details?.stderr) {
|
|
23
|
+
lines.push(` ${r.details.stderr.slice(0, 120)}`);
|
|
24
|
+
}
|
|
25
|
+
if (r.hint) {
|
|
26
|
+
lines.push(` Hint: ${r.hint}`);
|
|
27
|
+
}
|
|
28
|
+
return lines;
|
|
29
|
+
})
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return sections;
|
|
33
|
+
}
|
|
34
|
+
var checks_default = defineCommand({
|
|
35
|
+
id: "release:checks",
|
|
36
|
+
description: "Run pre-release checks from release config",
|
|
37
|
+
handler: {
|
|
38
|
+
async execute(ctx, input) {
|
|
39
|
+
const { flags } = input;
|
|
40
|
+
const cwd = ctx.cwd || process.cwd();
|
|
41
|
+
const repoRoot = await findRepoRoot(cwd);
|
|
42
|
+
const fileConfig = await useConfig();
|
|
43
|
+
const config = fileConfig ?? {};
|
|
44
|
+
const checks = config.checks ?? [];
|
|
45
|
+
if (checks.length === 0) {
|
|
46
|
+
const msg = "No checks configured in release config";
|
|
47
|
+
if (flags.json) {
|
|
48
|
+
ctx.ui?.json?.({ ok: true, failed: [], results: [], message: msg });
|
|
49
|
+
} else {
|
|
50
|
+
ctx.ui?.write?.(msg);
|
|
51
|
+
}
|
|
52
|
+
console.log("::kb-output::" + JSON.stringify({ ok: true, failed: [] }));
|
|
53
|
+
return { exitCode: 0, ok: true, failed: [], results: [] };
|
|
54
|
+
}
|
|
55
|
+
const planLoader = useLoader("Discovering packages...");
|
|
56
|
+
planLoader.start();
|
|
57
|
+
const plan = await planRelease({ cwd: repoRoot, config, scope: flags.scope });
|
|
58
|
+
planLoader.succeed(`Found ${plan.packages.length} package(s)`);
|
|
59
|
+
const scopePath = await resolveScopePath(repoRoot, flags.scope ?? "root");
|
|
60
|
+
const packagePaths = plan.packages.map((p) => p.path);
|
|
61
|
+
const checksLoader = useLoader(`Running ${checks.length} check(s)...`);
|
|
62
|
+
checksLoader.start();
|
|
63
|
+
const results = await runReleaseChecks(checks, {
|
|
64
|
+
repoRoot,
|
|
65
|
+
packagePaths,
|
|
66
|
+
scopePath,
|
|
67
|
+
logger: ctx.platform?.logger
|
|
68
|
+
});
|
|
69
|
+
const ok = results.every((r) => r.ok);
|
|
70
|
+
const failed = results.filter((r) => !r.ok).map((r) => r.id);
|
|
71
|
+
if (ok) {
|
|
72
|
+
checksLoader.succeed(`All ${results.length} check(s) passed`);
|
|
73
|
+
} else {
|
|
74
|
+
checksLoader.fail(`${failed.length} check(s) failed`);
|
|
75
|
+
}
|
|
76
|
+
console.log("::kb-output::" + JSON.stringify({ ok, failed }));
|
|
77
|
+
if (flags.json) {
|
|
78
|
+
ctx.ui?.json?.({ ok, failed, results });
|
|
79
|
+
return { exitCode: ok ? 0 : 1, ok, failed, results };
|
|
80
|
+
}
|
|
81
|
+
ctx.ui.sideBox({
|
|
82
|
+
title: "Pre-release Checks",
|
|
83
|
+
sections: buildChecksSections(results, ctx.ui.symbols),
|
|
84
|
+
status: ok ? "success" : "error"
|
|
85
|
+
});
|
|
86
|
+
return { exitCode: ok ? 0 : 1, ok, failed, results };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
export { checks_default as default };
|
|
92
|
+
//# sourceMappingURL=checks.js.map
|
|
93
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/checks.ts"],"names":[],"mappings":"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","file":"checks.js","sourcesContent":["/**\n * Release checks command — run pre-release checks from config.\n * Atomic step: reads plan, runs checks, emits output marker for workflow.\n */\n\nimport { defineCommand, type CLIInput, type CommandResult, type PluginContextV3, useLoader, useConfig } from '@kb-labs/sdk';\nimport {\n planRelease,\n runReleaseChecks,\n resolveScopePath,\n type ReleaseConfig,\n type CheckResult,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\n\ninterface ChecksFlags {\n scope?: string;\n json?: boolean;\n}\n\ntype ReleaseChecksResult = CommandResult & {\n ok?: boolean;\n failed?: string[];\n results?: CheckResult[];\n};\n\nfunction buildChecksSections(\n results: CheckResult[],\n symbols: { success: string; error: string; warning: string },\n): Array<{ header?: string; items: string[] }> {\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n const passed = results.filter(r => r.ok);\n const failed = results.filter(r => !r.ok);\n\n if (passed.length > 0) {\n sections.push({\n header: 'Passed',\n items: passed.map(r => `${symbols.success} ${r.id}${r.timingMs ? ` (${r.timingMs}ms)` : ''}`),\n });\n }\n\n if (failed.length > 0) {\n sections.push({\n header: 'Failed',\n items: failed.flatMap(r => {\n const lines = [`${symbols.error} ${r.id}`];\n if (r.details?.stderr) { lines.push(` ${r.details.stderr.slice(0, 120)}`); }\n if (r.hint) { lines.push(` Hint: ${r.hint}`); }\n return lines;\n }),\n });\n }\n\n return sections;\n}\n\nexport default defineCommand({\n id: 'release:checks',\n description: 'Run pre-release checks from release config',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<ChecksFlags>): Promise<ReleaseChecksResult> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = fileConfig ?? {};\n const checks = config.checks ?? [];\n\n if (checks.length === 0) {\n const msg = 'No checks configured in release config';\n if (flags.json) {\n ctx.ui?.json?.({ ok: true, failed: [], results: [], message: msg });\n } else {\n ctx.ui?.write?.(msg);\n }\n console.log('::kb-output::' + JSON.stringify({ ok: true, failed: [] }));\n return { exitCode: 0, ok: true, failed: [], results: [] };\n }\n\n const planLoader = useLoader('Discovering packages...');\n planLoader.start();\n const plan = await planRelease({ cwd: repoRoot, config, scope: flags.scope });\n planLoader.succeed(`Found ${plan.packages.length} package(s)`);\n\n const scopePath = await resolveScopePath(repoRoot, flags.scope ?? 'root');\n const packagePaths = plan.packages.map(p => p.path);\n\n const checksLoader = useLoader(`Running ${checks.length} check(s)...`);\n checksLoader.start();\n\n const results = await runReleaseChecks(checks, {\n repoRoot,\n packagePaths,\n scopePath,\n logger: ctx.platform?.logger,\n });\n\n const ok = results.every(r => r.ok);\n const failed = results.filter(r => !r.ok).map(r => r.id);\n\n if (ok) {\n checksLoader.succeed(`All ${results.length} check(s) passed`);\n } else {\n checksLoader.fail(`${failed.length} check(s) failed`);\n }\n\n console.log('::kb-output::' + JSON.stringify({ ok, failed }));\n\n if (flags.json) {\n ctx.ui?.json?.({ ok, failed, results });\n return { exitCode: ok ? 0 : 1, ok, failed, results };\n }\n\n ctx.ui.sideBox({\n title: 'Pre-release Checks',\n sections: buildChecksSections(results, ctx.ui.symbols),\n status: ok ? 'success' : 'error',\n });\n\n return { exitCode: ok ? 0 : 1, ok, failed, results };\n },\n },\n});\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { CLIInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
interface GitFlags {
|
|
5
|
+
scope?: string;
|
|
6
|
+
bump?: 'patch' | 'minor' | 'major' | 'auto';
|
|
7
|
+
'dry-run'?: boolean;
|
|
8
|
+
'no-verify'?: boolean;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<GitFlags>, unknown>;
|
|
12
|
+
|
|
13
|
+
export { _default as default };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { defineCommand, findRepoRoot, useConfig, useLoader } from '@kb-labs/sdk';
|
|
2
|
+
import { planRelease, resolveScopePath, commitAndTagRelease } from '@kb-labs/release-manager-core';
|
|
3
|
+
|
|
4
|
+
// src/cli/commands/git.ts
|
|
5
|
+
|
|
6
|
+
// src/cli/commands/git.ts
|
|
7
|
+
function buildGitSections(result, dryRun, symbols) {
|
|
8
|
+
if (dryRun) {
|
|
9
|
+
return [{ items: [`${symbols.warning} Dry-run: no git operations performed`] }];
|
|
10
|
+
}
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
header: "Git Operations",
|
|
14
|
+
items: [
|
|
15
|
+
`${result.committed ? symbols.success : symbols.warning} Commit: ${result.committed ? "created" : "skipped"}`,
|
|
16
|
+
`${result.tagged.length > 0 ? symbols.success : symbols.warning} Tags: ${result.tagged.length > 0 ? result.tagged.join(", ") : "none"}`,
|
|
17
|
+
`${result.pushed ? symbols.success : symbols.warning} Push: ${result.pushed ? "done" : "skipped"}`
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
var git_default = defineCommand({
|
|
23
|
+
id: "release:git",
|
|
24
|
+
description: "Commit, tag, and push release changes",
|
|
25
|
+
handler: {
|
|
26
|
+
async execute(ctx, input) {
|
|
27
|
+
const { flags } = input;
|
|
28
|
+
const dryRun = flags["dry-run"] ?? false;
|
|
29
|
+
const noVerify = flags["no-verify"] ?? false;
|
|
30
|
+
const cwd = ctx.cwd || process.cwd();
|
|
31
|
+
const repoRoot = await findRepoRoot(cwd);
|
|
32
|
+
const fileConfig = await useConfig();
|
|
33
|
+
const config = {
|
|
34
|
+
...fileConfig,
|
|
35
|
+
...flags.bump && { bump: flags.bump }
|
|
36
|
+
};
|
|
37
|
+
const planLoader = useLoader("Loading release plan...");
|
|
38
|
+
planLoader.start();
|
|
39
|
+
const plan = await planRelease({
|
|
40
|
+
cwd: repoRoot,
|
|
41
|
+
config,
|
|
42
|
+
scope: flags.scope,
|
|
43
|
+
bumpOverride: flags.bump
|
|
44
|
+
});
|
|
45
|
+
planLoader.succeed(`Loaded plan: ${plan.packages.length} package(s)`);
|
|
46
|
+
if (plan.packages.length === 0) {
|
|
47
|
+
const msg = `No packages found${flags.scope ? ` matching scope: ${flags.scope}` : ""}`;
|
|
48
|
+
if (flags.json) {
|
|
49
|
+
ctx.ui?.json?.({ committed: false, tagged: [], pushed: false, message: msg });
|
|
50
|
+
} else {
|
|
51
|
+
ctx.ui?.write?.(msg);
|
|
52
|
+
}
|
|
53
|
+
console.log("::kb-output::" + JSON.stringify({ committed: false, tagged: [], pushed: false }));
|
|
54
|
+
return { exitCode: 0, committed: false, tagged: [], pushed: false };
|
|
55
|
+
}
|
|
56
|
+
const scopePath = await resolveScopePath(repoRoot, flags.scope ?? "root");
|
|
57
|
+
const gitLoader = useLoader(dryRun ? "Dry-run: skipping git operations" : "Committing, tagging, pushing...");
|
|
58
|
+
gitLoader.start();
|
|
59
|
+
const result = await commitAndTagRelease({
|
|
60
|
+
cwd: scopePath,
|
|
61
|
+
plan,
|
|
62
|
+
dryRun,
|
|
63
|
+
noVerify
|
|
64
|
+
});
|
|
65
|
+
if (dryRun) {
|
|
66
|
+
gitLoader.succeed("Dry-run: no git operations performed");
|
|
67
|
+
} else if (result.pushed) {
|
|
68
|
+
gitLoader.succeed(`Committed, tagged (${result.tagged.length}), pushed`);
|
|
69
|
+
} else {
|
|
70
|
+
gitLoader.succeed(`Committed, tagged (${result.tagged.length})`);
|
|
71
|
+
}
|
|
72
|
+
console.log("::kb-output::" + JSON.stringify({
|
|
73
|
+
committed: result.committed,
|
|
74
|
+
tagged: result.tagged,
|
|
75
|
+
pushed: result.pushed
|
|
76
|
+
}));
|
|
77
|
+
if (flags.json) {
|
|
78
|
+
ctx.ui?.json?.(result);
|
|
79
|
+
return { exitCode: 0, ...result };
|
|
80
|
+
}
|
|
81
|
+
ctx.ui.sideBox({
|
|
82
|
+
title: dryRun ? "Git (dry-run)" : "Git Operations",
|
|
83
|
+
sections: buildGitSections(result, dryRun, ctx.ui.symbols),
|
|
84
|
+
status: "success"
|
|
85
|
+
});
|
|
86
|
+
return { exitCode: 0, ...result };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
export { git_default as default };
|
|
92
|
+
//# sourceMappingURL=git.js.map
|
|
93
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/git.ts"],"names":[],"mappings":"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","file":"git.js","sourcesContent":["/**\n * Release git command — commit, tag, and push release changes.\n * Atomic step: reads plan, runs git ops, emits output marker for workflow.\n */\n\nimport { defineCommand, type CLIInput, type CommandResult, type PluginContextV3, useLoader, useConfig } from '@kb-labs/sdk';\nimport {\n planRelease,\n commitAndTagRelease,\n resolveScopePath,\n type ReleaseConfig,\n type VersionBump,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\n\ninterface GitFlags {\n scope?: string;\n bump?: 'patch' | 'minor' | 'major' | 'auto';\n 'dry-run'?: boolean;\n 'no-verify'?: boolean;\n json?: boolean;\n}\n\ntype ReleaseGitResult = CommandResult & {\n committed?: boolean;\n tagged?: string[];\n pushed?: boolean;\n};\n\nfunction buildGitSections(\n result: { committed: boolean; tagged: string[]; pushed: boolean },\n dryRun: boolean,\n symbols: { success: string; warning: string },\n): Array<{ header?: string; items: string[] }> {\n if (dryRun) {\n return [{ items: [`${symbols.warning} Dry-run: no git operations performed`] }];\n }\n\n return [\n {\n header: 'Git Operations',\n items: [\n `${result.committed ? symbols.success : symbols.warning} Commit: ${result.committed ? 'created' : 'skipped'}`,\n `${result.tagged.length > 0 ? symbols.success : symbols.warning} Tags: ${result.tagged.length > 0 ? result.tagged.join(', ') : 'none'}`,\n `${result.pushed ? symbols.success : symbols.warning} Push: ${result.pushed ? 'done' : 'skipped'}`,\n ],\n },\n ];\n}\n\nexport default defineCommand({\n id: 'release:git',\n description: 'Commit, tag, and push release changes',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<GitFlags>): Promise<ReleaseGitResult> {\n const { flags } = input;\n const dryRun = flags['dry-run'] ?? false;\n const noVerify = flags['no-verify'] ?? false;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = {\n ...fileConfig,\n ...(flags.bump && { bump: flags.bump }),\n };\n\n const planLoader = useLoader('Loading release plan...');\n planLoader.start();\n const plan = await planRelease({\n cwd: repoRoot,\n config,\n scope: flags.scope,\n bumpOverride: flags.bump as VersionBump | undefined,\n });\n planLoader.succeed(`Loaded plan: ${plan.packages.length} package(s)`);\n\n if (plan.packages.length === 0) {\n const msg = `No packages found${flags.scope ? ` matching scope: ${flags.scope}` : ''}`;\n if (flags.json) { ctx.ui?.json?.({ committed: false, tagged: [], pushed: false, message: msg }); }\n else { ctx.ui?.write?.(msg); }\n console.log('::kb-output::' + JSON.stringify({ committed: false, tagged: [], pushed: false }));\n return { exitCode: 0, committed: false, tagged: [], pushed: false };\n }\n\n const scopePath = await resolveScopePath(repoRoot, flags.scope ?? 'root');\n\n const gitLoader = useLoader(dryRun ? 'Dry-run: skipping git operations' : 'Committing, tagging, pushing...');\n gitLoader.start();\n\n const result = await commitAndTagRelease({\n cwd: scopePath,\n plan,\n dryRun,\n noVerify,\n });\n\n if (dryRun) {\n gitLoader.succeed('Dry-run: no git operations performed');\n } else if (result.pushed) {\n gitLoader.succeed(`Committed, tagged (${result.tagged.length}), pushed`);\n } else {\n gitLoader.succeed(`Committed, tagged (${result.tagged.length})`);\n }\n\n console.log('::kb-output::' + JSON.stringify({\n committed: result.committed,\n tagged: result.tagged,\n pushed: result.pushed,\n }));\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n return { exitCode: 0, ...result };\n }\n\n ctx.ui.sideBox({\n title: dryRun ? 'Git (dry-run)' : 'Git Operations',\n sections: buildGitSections(result, dryRun, ctx.ui.symbols),\n status: 'success',\n });\n\n return { exitCode: 0, ...result };\n },\n },\n});\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { CLIInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
interface PackFlags {
|
|
5
|
+
scope?: string;
|
|
6
|
+
json?: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<PackFlags>, unknown>;
|
|
9
|
+
|
|
10
|
+
export { _default as default };
|