Skip to content

Commit 9c8fe96

Browse files
committed
build(release): publish runtime + commands alongside core/cli; minify library builds
1 parent 46d8474 commit 9c8fe96

9 files changed

Lines changed: 74 additions & 68 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"ready": "vp check && vp run -r test && vp run -r build",
1717
"prepare": "vp config",
1818
"check": "vp check",
19-
"sync:skill-assets": "pnpm --filter bailian-cli-core run build && pnpm --filter bailian-cli run generate:reference && pnpm --filter bailian-cli run sync:skill-version",
19+
"sync:skill-assets": "pnpm --filter \"bailian-cli^...\" run build && pnpm --filter bailian-cli run generate:reference && pnpm --filter bailian-cli run sync:skill-version",
2020
"dev": "pnpm -F bailian-cli-core dev",
2121
"bl": "pnpm -F bailian-cli dev",
2222
"kscli": "pnpm -F knowledge-studio-cli dev",

packages/commands/vite.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { defineConfig } from "vite-plus";
22

33
export default defineConfig({
44
pack: {
5+
minify: true,
56
dts: {
67
tsgo: true,
78
},

packages/core/vite.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { defineConfig } from "vite-plus";
22

33
export default defineConfig({
44
pack: {
5+
minify: true,
56
dts: {
67
tsgo: true,
78
},

packages/runtime/vite.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { defineConfig } from "vite-plus";
22

33
export default defineConfig({
44
pack: {
5+
minify: true,
56
dts: {
67
tsgo: true,
78
},

tools/release/check.mjs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ export async function runCheck(options = {}) {
3434
log(`bailian-cli-core@${coreJson.version}`);
3535
log(`bailian-cli@${cliJson.version}`);
3636

37-
step("build bailian-cli-core");
38-
run("pnpm", ["--filter", "bailian-cli-core", "run", "build"]);
37+
step("build library packages (core, runtime, commands)");
38+
// `bailian-cli^...` = all workspace dependencies of bailian-cli, in topological
39+
// order, excluding bailian-cli itself. generate:reference imports their dist.
40+
run("pnpm", ["--filter", "bailian-cli^...", "run", "build"]);
3941

4042
step(
4143
channel

tools/release/lib/packages.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ import { fileURLToPath } from "url";
44

55
export const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
66

7+
// Dependency order: core ← runtime ← commands ← cli.
8+
// Consumers rely on this ordering for build/publish (dependencies first).
79
export const PACKAGES = [
810
{ key: "core", dir: "packages/core", name: "bailian-cli-core" },
11+
{ key: "runtime", dir: "packages/runtime", name: "bailian-cli-runtime" },
12+
{ key: "commands", dir: "packages/commands", name: "bailian-cli-commands" },
913
{ key: "cli", dir: "packages/cli", name: "bailian-cli" },
1014
];
1115

tools/release/lib/validate.mjs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export function assertReadmeSync() {
1919
}
2020

2121
export function loadAndValidatePackages() {
22+
const internalNames = new Set(PACKAGES.map((p) => p.name));
2223
const jsonByKey = new Map();
2324
for (const pkg of PACKAGES) {
2425
const json = readPackageJson(pkg);
@@ -29,22 +30,27 @@ export function loadAndValidatePackages() {
2930
}
3031

3132
const coreJson = jsonByKey.get("core");
32-
const cliJson = jsonByKey.get("cli");
33+
const version = coreJson.version;
3334

34-
if (cliJson.version !== coreJson.version) {
35-
throw new Error(
36-
`core and cli versions must match, got ${coreJson.version} and ${cliJson.version}.`,
37-
);
38-
}
39-
40-
const cliCoreDep = cliJson.dependencies?.["bailian-cli-core"];
41-
if (cliCoreDep !== "workspace:*") {
42-
throw new Error(
43-
`packages/cli source dependency on bailian-cli-core must be "workspace:*", got ${cliCoreDep}.`,
44-
);
35+
for (const pkg of PACKAGES) {
36+
const json = jsonByKey.get(pkg.key);
37+
// All packages release in lockstep, so every version must match.
38+
if (json.version !== version) {
39+
throw new Error(
40+
`all package versions must match ${version} (bailian-cli-core), ` +
41+
`but ${pkg.name} is ${json.version}.`,
42+
);
43+
}
44+
// Any runtime dependency on a sibling workspace package must be "workspace:*"
45+
// so `pnpm publish` rewrites it to the concrete release version.
46+
for (const [dep, range] of Object.entries(json.dependencies ?? {})) {
47+
if (internalNames.has(dep) && range !== "workspace:*") {
48+
throw new Error(`${pkg.name} dependency on ${dep} must be "workspace:*", got ${range}.`);
49+
}
50+
}
4551
}
4652

47-
return { coreJson, cliJson };
53+
return { coreJson, cliJson: jsonByKey.get("cli") };
4854
}
4955

5056
const RESERVED_CHANNELS = new Set(["latest", "beta", "alpha", "next", "rc", "canary", "dev"]);

tools/release/publish-channel.mjs

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,7 @@ import { parseArgs } from "util";
55
import { runCheck } from "./check.mjs";
66
import { headSha7, utcDateStamp } from "./lib/git.mjs";
77
import { npmViewExists, pnpmPublish } from "./lib/npm.mjs";
8-
import {
9-
findPackage,
10-
packageJsonPath,
11-
readPackageJson,
12-
writePackageJson,
13-
} from "./lib/packages.mjs";
8+
import { PACKAGES, packageJsonPath, readPackageJson, writePackageJson } from "./lib/packages.mjs";
149
import { assertChannel } from "./lib/validate.mjs";
1510

1611
function log(msg = "") {
@@ -37,16 +32,15 @@ if (!dryRun && !process.env.CI) {
3732
process.exit(1);
3833
}
3934

40-
const core = findPackage("core");
41-
const cli = findPackage("cli");
42-
const corePath = packageJsonPath(core);
43-
const cliPath = packageJsonPath(cli);
44-
const coreOriginal = readFileSync(corePath, "utf-8");
45-
const cliOriginal = readFileSync(cliPath, "utf-8");
35+
// Snapshot every package.json so the temporary version bump is reverted in
36+
// `finally`, even when the release fails midway.
37+
const originals = PACKAGES.map((pkg) => {
38+
const path = packageJsonPath(pkg);
39+
return { pkg, path, content: readFileSync(path, "utf-8") };
40+
});
4641

4742
function restoreOriginals() {
48-
writeFileSync(corePath, coreOriginal);
49-
writeFileSync(cliPath, cliOriginal);
43+
for (const { path, content } of originals) writeFileSync(path, content);
5044
}
5145

5246
try {
@@ -57,32 +51,31 @@ try {
5751
log(`channel=${channel} version=${betaVersion}`);
5852

5953
step("temporarily bump package.json (not committed)");
60-
const coreJson = readPackageJson(core);
61-
const cliJson = readPackageJson(cli);
62-
coreJson.version = betaVersion;
63-
cliJson.version = betaVersion;
64-
writePackageJson(core, coreJson);
65-
writePackageJson(cli, cliJson);
66-
// pnpm pack resolves `workspace:*` to the in-tree version, so CLI tarball
67-
// will depend on bailian-cli-core@<betaVersion> after this bump.
54+
for (const pkg of PACKAGES) {
55+
const json = readPackageJson(pkg);
56+
json.version = betaVersion;
57+
writePackageJson(pkg, json);
58+
}
59+
// pnpm pack resolves `workspace:*` to the in-tree version, so each tarball
60+
// will depend on its siblings at <betaVersion> after this bump.
6861

6962
await runCheck({ channel: true });
7063

7164
step(`idempotency: check ${betaVersion} against registry`);
72-
const corePublished = npmViewExists(core.name, betaVersion);
73-
const cliPublished = npmViewExists(cli.name, betaVersion);
74-
log(`${core.name}@${betaVersion}: ${corePublished ? "already published" : "to publish"}`);
75-
log(`${cli.name}@${betaVersion}: ${cliPublished ? "already published" : "to publish"}`);
76-
if (corePublished && cliPublished) {
77-
log("\nboth packages already published; nothing to do.");
65+
const published = new Map();
66+
for (const pkg of PACKAGES) {
67+
const exists = npmViewExists(pkg.name, betaVersion);
68+
published.set(pkg.key, exists);
69+
log(`${pkg.name}@${betaVersion}: ${exists ? "already published" : "to publish"}`);
70+
}
71+
if (PACKAGES.every((pkg) => published.get(pkg.key))) {
72+
log("\nall packages already published; nothing to do.");
7873
} else {
79-
if (!corePublished) {
80-
step(`publish ${core.name}@${betaVersion} (tag=${channel}, provenance)`);
81-
pnpmPublish(core, { tag: channel, provenance: true, dryRun });
82-
}
83-
if (!cliPublished) {
84-
step(`publish ${cli.name}@${betaVersion} (tag=${channel}, provenance)`);
85-
pnpmPublish(cli, { tag: channel, provenance: true, dryRun });
74+
// Publish in dependency order (core → runtime → commands → cli).
75+
for (const pkg of PACKAGES) {
76+
if (published.get(pkg.key)) continue;
77+
step(`publish ${pkg.name}@${betaVersion} (tag=${channel}, provenance)`);
78+
pnpmPublish(pkg, { tag: channel, provenance: true, dryRun });
8679
}
8780
}
8881

tools/release/publish-stable.mjs

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { parseArgs } from "util";
44
import { runCheck } from "./check.mjs";
55
import { createTag, currentBranch, isWorkingTreeClean, pushTag, tagExists } from "./lib/git.mjs";
66
import { npmViewExists, pnpmPublish } from "./lib/npm.mjs";
7-
import { findPackage } from "./lib/packages.mjs";
7+
import { PACKAGES } from "./lib/packages.mjs";
88

99
function log(msg = "") {
1010
process.stdout.write(`${msg}\n`);
@@ -41,27 +41,25 @@ try {
4141
}
4242

4343
const { coreJson } = await runCheck();
44-
const version = coreJson.version; // === cliJson.version, asserted by runCheck
44+
const version = coreJson.version; // all packages share this, asserted by runCheck
4545

4646
step(`idempotency: check ${version} against registry`);
47-
const core = findPackage("core");
48-
const cli = findPackage("cli");
49-
const corePublished = npmViewExists(core.name, version);
50-
const cliPublished = npmViewExists(cli.name, version);
51-
log(`${core.name}@${version}: ${corePublished ? "already published" : "to publish"}`);
52-
log(`${cli.name}@${version}: ${cliPublished ? "already published" : "to publish"}`);
53-
if (corePublished && cliPublished) {
54-
log("\nboth packages already published; nothing to do.");
47+
const published = new Map();
48+
for (const pkg of PACKAGES) {
49+
const exists = npmViewExists(pkg.name, version);
50+
published.set(pkg.key, exists);
51+
log(`${pkg.name}@${version}: ${exists ? "already published" : "to publish"}`);
52+
}
53+
if (PACKAGES.every((pkg) => published.get(pkg.key))) {
54+
log("\nall packages already published; nothing to do.");
5555
process.exit(0);
5656
}
5757

58-
if (!corePublished) {
59-
step(`publish ${core.name}@${version} (tag=latest, provenance)`);
60-
pnpmPublish(core, { tag: "latest", provenance: true, dryRun });
61-
}
62-
if (!cliPublished) {
63-
step(`publish ${cli.name}@${version} (tag=latest, provenance)`);
64-
pnpmPublish(cli, { tag: "latest", provenance: true, dryRun });
58+
// Publish in dependency order (core → runtime → commands → cli).
59+
for (const pkg of PACKAGES) {
60+
if (published.get(pkg.key)) continue;
61+
step(`publish ${pkg.name}@${version} (tag=latest, provenance)`);
62+
pnpmPublish(pkg, { tag: "latest", provenance: true, dryRun });
6563
}
6664

6765
if (dryRun) {

0 commit comments

Comments
 (0)