@longzai-intelligence-release/core 0.0.1

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.
@@ -0,0 +1,282 @@
1
+ import "./rolldown-runtime-BqT_7tdF.js";
2
+ import { PackageManifest, scanAllPackages } from "@longzai-intelligence-dev-tools/dependency-graph";
3
+ import "zod";
4
+ //#region src/commands/publish.command.d.ts
5
+ /**
6
+ * publish 命令实现
7
+ * 按依赖拓扑顺序发布包到 npm
8
+ *
9
+ * 自 dev-tools apps/cli/src/commands/release/publish.ts 迁入(ADR 0087),适配点:
10
+ *
11
+ * - 配置改经 @longzai-intelligence-release/config 的 loadReleaseConfig 三级加载 (lzi-release.config.ts >
12
+ * lzi.config.ts#release > lzi-dev.config.ts#publish 兼容回退)
13
+ * - clean 域解耦:原直接 import dev-tools 的 runCleanCommand,改为 cleanRunner 注入 hook, 缺省 spawn `lzi-dev-cli
14
+ * clean`(全产品群各仓 root devDep,bin 必然可解析)
15
+ */
16
+ /**
17
+ * cleanRunner 的入参形态
18
+ */
19
+ type CleanRunnerOptions = {
20
+ /**
21
+ * 是否预览模式
22
+ */
23
+ dryRun: boolean;
24
+ };
25
+ /**
26
+ * publish 命令选项
27
+ */
28
+ type PublishOptions = {
29
+ /**
30
+ * 是否预览模式(不实际执行安装、构建和发布)
31
+ */
32
+ dryRun?: boolean;
33
+ /**
34
+ * 发布前清理执行器(cleanBeforePublish 开启且非 dry-run 时调用)
35
+ *
36
+ * 缺省 spawn `lzi-dev-cli clean` 子进程;宿主 CLI 自持 clean 实现时(如
37
+ * lzi-dev-cli 委托路径)应注入进程内实现,避免二次拉起进程
38
+ */
39
+ cleanRunner?: (options: CleanRunnerOptions) => Promise<unknown>;
40
+ };
41
+ /**
42
+ * 双轨归一化结果
43
+ */
44
+ type NormalizedTracks = {
45
+ /**
46
+ * 公网 npm 轨的包标识列表
47
+ */
48
+ npm: string[];
49
+ /**
50
+ * 本地私有轨的包标识列表
51
+ */
52
+ local: string[];
53
+ };
54
+ /**
55
+ * 双轨归一化入参(运行时宽松形态;类型层见 PublishPackagesConfig)
56
+ */
57
+ type PublishPackagesInput = string[] | {
58
+ npm?: unknown;
59
+ local?: unknown;
60
+ } | undefined;
61
+ /**
62
+ * 归一化发布包清单为双轨形态(ADR 0082)
63
+ *
64
+ * 字符串数组(兼容形态)≡ 全量公网轨;对象形态必须且只能含 npm/local 两键
65
+ * (私有发布仅因显式落位 local 才发生)。
66
+ *
67
+ * @param packages - 配置声明的发布包清单
68
+ * @returns 双轨归一化结果
69
+ * @throws {@link Error} 对象形态缺键、多键或键值非字符串数组时抛出
70
+ */
71
+ declare function normalizePublishTracks(packages: PublishPackagesInput): NormalizedTracks;
72
+ /**
73
+ * 执行 release publish 命令
74
+ *
75
+ * @param options - 命令选项,包含 dryRun 预览模式标志与可选的 cleanRunner 注入
76
+ */
77
+ declare const publishCommand: (options?: PublishOptions) => Promise<void>;
78
+ //#endregion
79
+ //#region src/utils/package-resolver.utils.d.ts
80
+ /**
81
+ * 读取 package.json
82
+ *
83
+ * @param dirPath - 包目录路径
84
+ * @returns 解析后的 package.json 对象
85
+ * @throws {@link Error} package.json 格式不合法
86
+ */
87
+ declare const readPackageJson: (dirPath: string) => Promise<Record<string, unknown>>;
88
+ /**
89
+ * 解析配置中的包标识为 PackageManifest
90
+ *
91
+ * 支持包名(如 '@scope/pkg')或相对路径(如 'packages/pkg')
92
+ *
93
+ * @param identifier - 包标识(包名或相对路径)
94
+ * @param rootDir - monorepo 根目录路径
95
+ * @param allPackageJsons - 包名到路径的映射表
96
+ * @returns 解析后的包清单,未找到则返回 null
97
+ */
98
+ declare const resolvePackageManifest: (identifier: string, rootDir: string, allPackageJsons: Map<string, string>) => Promise<PackageManifest | null>;
99
+ //#endregion
100
+ //#region src/utils/publish.utils.d.ts
101
+ /**
102
+ * 发布结果类型
103
+ */
104
+ type PublishResult = 'success' | 'skip' | 'fail';
105
+ /**
106
+ * 发布目标轨道(ADR 0082:包级自治的双轨发布)
107
+ *
108
+ * - `npm`:公网 npm 轨(bun publish --registry 显式钉死 npm 官方源,免疫 bunfig/.npmrc/env 中 mirror 加速配置的劫持;见
109
+ * apps/cli issue 0004)
110
+ * - `local`:本地私有轨(bun publish --registry <url>;发布前 ensure 本地 registry 在线, 地址来自 env
111
+ * `LZI_NPM_REGISTRY_URL`,凭据经 `NPM_CONFIG_TOKEN` env 继承)
112
+ */
113
+ type PublishTarget = {
114
+ /**
115
+ * 公网 npm 轨
116
+ */
117
+ kind: 'npm';
118
+ } | {
119
+ /**
120
+ * 本地私有轨
121
+ */
122
+ kind: 'local';
123
+ /**
124
+ * 本地私有 registry 基址(来自 env LZI_NPM_REGISTRY_URL)
125
+ */
126
+ registryUrl: string;
127
+ };
128
+ /**
129
+ * npm 公网轨的官方 registry 基址
130
+ *
131
+ * mirror 加速是 install 侧的既定治理(ADR 0030:bunfig `[install].registry`、.npmrc、
132
+ * `NPM_CONFIG_REGISTRY` env),对发布写入一律不合法——npm 轨发布目标固定为官方源,
133
+ * 不可配置(apps/cli issue 0004)。
134
+ */
135
+ declare const NPM_OFFICIAL_REGISTRY_URL = "https://registry.npmjs.org/";
136
+ /**
137
+ * 构造 bun publish 参数(纯函数,测试注入用)
138
+ *
139
+ * 两轨均显式 `--registry`:npm 轨钉死官方源常量(免疫 mirror 劫持,issue 0004),
140
+ * local 轨指向 env 注入的本地私有 registry(ADR 0082)。
141
+ *
142
+ * @param target - 发布目标轨道
143
+ * @param access - npm 发布访问级别
144
+ * @returns bun publish 参数列表
145
+ */
146
+ declare const buildPublishArgs: (target: PublishTarget, access: 'public' | 'restricted') => string[];
147
+ /**
148
+ * 构造 publish 子进程环境(纯函数,测试注入用)
149
+ *
150
+ * `--registry` flag 之外的第二道防线:剔除 registry 覆盖类 env,使 mirror 加速配置
151
+ * (ADR 0030)即使绕过 flag 优先级也无劫持通道;`NPM_CONFIG_TOKEN`(local 轨凭据,
152
+ * ADR 0082)与其余全部键原样保留。undefined 值键在复制时跳过(Bun.spawn 的 env
153
+ * 类型面不接受 undefined 值)。
154
+ *
155
+ * @param env - 父进程环境变量
156
+ * @returns 清洗后的子进程环境变量
157
+ */
158
+ declare const buildPublishEnv: (env: Record<string, string | undefined>) => Record<string, string>;
159
+ /**
160
+ * 发布目标的人读展示名(发布前与 dry-run 的轨道核对防线)
161
+ *
162
+ * @param target - 发布目标轨道
163
+ * @returns registry 展示名
164
+ */
165
+ declare const describePublishTarget: (target: PublishTarget) => string;
166
+ /**
167
+ * 确保本地私有 registry 在线(local 轨前置;未运行则由 registry CLI 守护拉起)
168
+ *
169
+ * @param cwd - 命令执行目录(PATH 解析发布仓 devDep 的 lzi-npm-registry bin)
170
+ * @returns 在线返回 true;否则返回 false 并输出指引
171
+ */
172
+ declare const ensureLocalRegistry: (cwd: string) => Promise<boolean>;
173
+ /**
174
+ * 包发布结果详情
175
+ */
176
+ type PackagePublishResult = {
177
+ name: string;
178
+ result: PublishResult;
179
+ error?: string;
180
+ };
181
+ /**
182
+ * 发布统计
183
+ */
184
+ type PublishStats = {
185
+ total: number;
186
+ success: number;
187
+ skip: number;
188
+ fail: number;
189
+ results: PackagePublishResult[];
190
+ };
191
+ /**
192
+ * 输出信息级别日志
193
+ *
194
+ * 按 ADR 0038,禁止 console.*;统一通过 process.stdout.write 输出。
195
+ *
196
+ * @param message - 日志消息内容
197
+ */
198
+ declare const logInfo: (message: string) => void;
199
+ /**
200
+ * 输出成功级别日志
201
+ *
202
+ * 按 ADR 0038,禁止 console.*;统一通过 process.stdout.write 输出。
203
+ *
204
+ * @param message - 日志消息内容
205
+ */
206
+ declare const logSuccess: (message: string) => void;
207
+ /**
208
+ * 输出警告级别日志
209
+ *
210
+ * 按 ADR 0038,禁止 console.*;统一通过 process.stdout.write 输出。
211
+ *
212
+ * @param message - 日志消息内容
213
+ */
214
+ declare const logWarn: (message: string) => void;
215
+ /**
216
+ * 输出错误级别日志
217
+ *
218
+ * 按 ADR 0038,禁止 console.*;统一通过 process.stderr.write 输出到错误流。
219
+ *
220
+ * @param message - 日志消息内容
221
+ */
222
+ declare const logError: (message: string) => void;
223
+ /**
224
+ * 计算依赖拓扑排序
225
+ *
226
+ * 只关注发布列表内的依赖关系,外部依赖视为已满足。
227
+ * 委托 @longzai-intelligence-dev-tools/dependency-graph 包的泛型分层拓扑排序实现。
228
+ *
229
+ * @param manifests - 待排序的包清单列表
230
+ * @returns 按层级分组的拓扑排序结果,每层可并行发布
231
+ */
232
+ declare const topologicalSort: (manifests: PackageManifest[]) => PackageManifest[][];
233
+ /**
234
+ * 安装依赖
235
+ *
236
+ * @param basePath - 项目根目录路径
237
+ * @returns 安装是否成功
238
+ */
239
+ declare const installDependencies: (basePath: string) => Promise<boolean>;
240
+ /**
241
+ * 更新依赖
242
+ *
243
+ * @param basePath - 项目根目录路径
244
+ * @returns 更新是否成功
245
+ */
246
+ declare const updateDependencies: (basePath: string) => Promise<boolean>;
247
+ /**
248
+ * 构建包
249
+ *
250
+ * @param packagePath - 包目录路径
251
+ * @param packageName - 包名称
252
+ * @returns 构建是否成功
253
+ */
254
+ declare const buildPackage: (packagePath: string, packageName: string) => Promise<boolean>;
255
+ /**
256
+ * 发布包到目标 registry
257
+ *
258
+ * @param packagePath - 包目录路径
259
+ * @param packageName - 包名称
260
+ * @param access - npm 发布访问级别
261
+ * @param target - 发布目标轨道(ADR 0082:npm 公网轨 / local 本地私有轨)
262
+ * @returns 发布结果,包含状态和可选的错误信息
263
+ */
264
+ declare const publishPackage: (packagePath: string, packageName: string, access?: 'public' | 'restricted', target?: PublishTarget) => Promise<{
265
+ result: PublishResult;
266
+ error?: string;
267
+ }>;
268
+ /**
269
+ * 读取包的版本号
270
+ *
271
+ * @param packagePath - 包目录路径
272
+ * @returns 版本号字符串,读取失败返回 'unknown'
273
+ */
274
+ declare const getPackageVersion: (packagePath: string) => Promise<string>;
275
+ /**
276
+ * 打印发布摘要
277
+ *
278
+ * @param stats - 发布统计数据
279
+ */
280
+ declare const printSummary: (stats: PublishStats) => void;
281
+ //#endregion
282
+ export { NPM_OFFICIAL_REGISTRY_URL, type PackageManifest, type PackagePublishResult, type PublishOptions, type PublishResult, type PublishStats, type PublishTarget, buildPackage, buildPublishArgs, buildPublishEnv, describePublishTarget, ensureLocalRegistry, getPackageVersion, installDependencies, logError, logInfo, logSuccess, logWarn, normalizePublishTracks, printSummary, publishCommand, publishPackage, readPackageJson, resolvePackageManifest, scanAllPackages, topologicalSort, updateDependencies };
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{loadReleaseConfig as e}from"@longzai-intelligence-release/config";import{spawnSync as t}from"node:child_process";import{join as n,resolve as r}from"node:path";import{createGraph as i,extractWorkspaceDeps as a,scanAllPackages as o,topologicalSort as s}from"@longzai-intelligence-dev-tools/dependency-graph";import*as c from"zod";function l(e){return e.map(e=>{if(typeof e==`string`)return e;if(e instanceof Error)return e.message;try{return JSON.stringify(e)}catch{return String(e)}}).join(` `)}function u(...e){process.stdout.write(`${l(e)}\n`)}const d=c.record(c.string(),c.unknown());c.record(c.string(),c.string());const f=c.object({name:c.string()}),p=async e=>{let t=Bun.file(`${e}/package.json`),n=d.safeParse(await t.json());if(!n.success)throw Error(`package.json 格式不合法: ${e}`);return n.data},m=async(e,t,n)=>{let i=`${t}/${e}/package.json`;if(await Bun.file(i).exists()){let n=await p(`${t}/${e}`),i=f.safeParse(n);return i.success?{name:i.data.name,path:r(`${t}/${e}`),workspaceDeps:a(n)}:null}let o=n.get(e);if(o){let e=await p(o),t=f.safeParse(e);return t.success?{name:t.data.name,path:r(o),workspaceDeps:a(e)}:null}return null},h={RED:`\x1B[0;31m`,GREEN:`\x1B[0;32m`,YELLOW:`\x1B[1;33m`,BLUE:`\x1B[0;34m`,RESET:`\x1B[0m`},g=`https://registry.npmjs.org/`,_=[`NPM_CONFIG_REGISTRY`,`npm_config_registry`],v=(e,t)=>[`publish`,`--access`,t,`--registry`,e.kind===`npm`?g:e.registryUrl],y=e=>{let t={};for(let[n,r]of Object.entries(e))r===void 0||_.includes(n)||(t[n]=r);return t},b=e=>e.kind===`npm`?`registry.npmjs.org(公网 npm 轨)`:`${e.registryUrl}(本地私有轨)`,x=async e=>{let t=await D(`lzi-npm-registry`,[`ensure`],e);return t.code===0||(E(`本地私有 registry 未在线且自动拉起失败`),process.stderr.write(`${t.stderr}\n`),process.stderr.write(`指引:发布仓 devDependency 添加 @longzai-intelligence-npm-registry/cli,并在仓库 .env 配置 LZI_NPM_REGISTRY_URL 与 NPM_CONFIG_TOKEN(ADR 0082)
2
+ `),!1)},S=c.object({version:c.string().optional()}),C=e=>{process.stdout.write(`${h.BLUE}[INFO]${h.RESET} ${e}\n`)},w=e=>{process.stdout.write(`${h.GREEN}[SUCCESS]${h.RESET} ${e}\n`)},T=e=>{process.stdout.write(`${h.YELLOW}[WARN]${h.RESET} ${e}\n`)},E=e=>{process.stderr.write(`${h.RED}[ERROR]${h.RESET} ${e}\n`)},D=async(e,t,n,r)=>{let i=Bun.spawn([e,...t],{cwd:n,stdout:`pipe`,stderr:`pipe`,env:r}),a=await Bun.readableStreamToText(i.stdout),o=await Bun.readableStreamToText(i.stderr);return{code:await i.exited,stdout:a,stderr:o}},O=e=>{let t=i();for(let n of e)t.addNode(n.name,n);for(let n of e)for(let e of n.workspaceDeps)t.hasNode(e)&&t.addEdge(e,n.name);return s(t).map(e=>e.map(e=>e.data))},k=async e=>{C(`安装依赖...`);let t=await D(`bun`,[`install`],e);return t.code===0?(w(`依赖安装完成`),!0):(E(`安装依赖失败`),process.stdout.write(`${t.stdout}\n`),process.stderr.write(`${t.stderr}\n`),!1)},A=async e=>(C(`更新依赖...`),(await D(`bun`,[`update`],e)).code===0?(w(`依赖更新完成`),!0):(T(`更新依赖失败,继续发布`),!1)),j=async(e,t)=>{C(`构建 ${t}...`);let n=await D(`bun`,[`run`,`build:prod`],e);return n.code===0?(w(`${t} 构建成功`),!0):(E(`${t} 构建失败`),process.stdout.write(`${n.stdout}\n`),process.stderr.write(`${n.stderr}\n`),!1)},M=async(e,t,n=`public`,r={kind:`npm`})=>{if(r.kind===`local`&&!await x(e))return{result:`fail`,error:`本地私有 registry 未在线`};C(`发布 ${t} 到 ${b(r)}...`);let i=await D(`bun`,v(r,n),e,y(process.env)),a=i.stdout+i.stderr;return i.code===0?(w(`${t} 发布成功!`),{result:`success`}):a.includes(`cannot publish over the previously published versions`)?(T(`${t} 版本已存在,跳过`),{result:`skip`}):(E(`${t} 发布失败`),process.stderr.write(`${a}\n`),{result:`fail`,error:`发布失败`})},N=async e=>{try{let t=await Bun.file(n(e,`package.json`)).json(),r=S.safeParse(t);return r.success?r.data.version??`unknown`:`unknown`}catch{return`unknown`}},P=e=>{process.stdout.write(`========================================
3
+ `),C(`发布摘要`),process.stdout.write(`========================================
4
+ `),process.stdout.write(`
5
+ `),process.stdout.write(`总包数: ${e.total}\n`),process.stdout.write(`${h.GREEN}成功: ${e.success}${h.RESET}\n`),process.stdout.write(`${h.YELLOW}跳过: ${e.skip}${h.RESET}\n`),process.stdout.write(`${h.RED}失败: ${e.fail}${h.RESET}\n`),process.stdout.write(`
6
+ `);let t=e.results.filter(e=>e.result===`skip`);if(t.length>0){T(`跳过的包:`);for(let e of t)process.stdout.write(` - ${e.name}\n`);process.stdout.write(`
7
+ `)}let n=e.results.filter(e=>e.result===`fail`);if(n.length>0){E(`失败的包:`);for(let e of n)process.stderr.write(` - ${e.name}${e.error?`: ${e.error}`:``}\n`);process.stderr.write(`
8
+ `)}let r=e.results.filter(e=>e.result===`success`);if(r.length>0){C(`验证发布结果:`);for(let e of r)process.stdout.write(` npm info ${e.name}\n`)}},F=`LZI_NPM_REGISTRY_URL`;function I(e){if(e===void 0)return{npm:[],local:[]};if(Array.isArray(e))return{npm:e,local:[]};if(typeof e!=`object`||!e)throw Error(`publish.packages 必须是字符串数组或 { npm, local } 对象(ADR 0082)`);let t=Object.keys(e),n=t.includes(`npm`),r=t.includes(`local`);if(!n||!r||t.length>2)throw Error(`publish.packages 对象形态必须且只能含 npm/local 两键(实际键:${t.join(`, `)||`空`};ADR 0082)`);let i=e.npm,a=e.local,o=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`);if(!o(i)||!o(a))throw Error(`publish.packages 的 npm/local 键值必须是字符串数组(包名或相对路径)`);return{npm:i,local:a}}const L=e=>{let t;try{t=I(e)}catch(e){E(e instanceof Error?e.message:String(e)),process.exit(1)}t.npm.length===0&&t.local.length===0&&(E(`配置文件中没有定义要发布的包`),process.exit(1));let n=process.env[F]??``;return t.local.length>0&&n===``&&(E(`本地私有轨非空但未设置 ${F}(发布仓 .env 配置,ADR 0082)`),process.exit(1)),{tracks:t,localRegistryUrl:n}},R=async(e,t,n)=>{if(n||t.fail!==0||t.success===0)return;let r=t.results.find(e=>e.result===`success`),i=e.find(e=>e.name===r?.name);if(!i)return;let a=i.name.indexOf(`/`),o=a>=0?i.name.slice(0,a):i.name,s=await N(i.path),c=s.startsWith(`^`)||s.startsWith(`~`)?s:`^${s}`;u(``),u(`下一步:提交版本变更(commit message 参考)`),u(` release: 更新版本至 v${s}`),u(``),u(`然后:升级所有消费者并推送`),u(` bun version:upgrade-across --scope ${o} --target ${c} --dry-run`),u(` bun version:upgrade-across --scope ${o} --target ${c}`),u(` bun push-all`)},z=async e=>{await Bun.spawn([`lzi-dev-cli`,`clean`],{cwd:e,stdout:`inherit`,stderr:`inherit`}).exited!==0&&T(`lzi-dev-cli clean 执行失败(继续发布,请核查清理产物是否完整)`)},B=async n=>{let i;try{i=await e()}catch(e){E(`加载配置文件失败: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}i||(E(`未找到配置文件 lzi-release.config.ts 或 lzi-dev.config.ts`),u(``),u(`请创建配置文件,示例:`),u(`
9
+ import { defineConfig } from '@longzai-intelligence-release/config';
10
+
11
+ export default defineConfig({
12
+ publish: {
13
+ packages: ['apps/cli'],
14
+ },
15
+ });
16
+ `),process.exit(1)),i.source===`legacy-dev-tools`&&T(`发布配置读取自 lzi-dev.config.ts 的 publish 字段(发布命令的兼容回退;该字段仍被 release log/version 域消费,请勿删除)。如需发布域专属清单可另建 lzi-release.config.ts,两处声明需保持一致(ADR 0087)`);let{tracks:a,localRegistryUrl:s}=L(i.config.publish?.packages),c=r(i.configPath,`..`),l=i.config.publish;l===void 0&&(E(`配置文件中没有定义要发布的包`),process.exit(1));let d=l.access??`public`,f=l.installDeps??!0,p=l.buildBeforePublish??!0,h=l.cleanBeforePublish??!0,g=n?.dryRun??!1,_=await o(c),v=/* @__PURE__ */ new Map,y=[];for(let[e,t]of[[`npm`,a.npm],[`local`,a.local]])for(let n of t){let t=await m(n,c,_);t||(E(`未找到包: ${n}`),process.exit(1)),v.has(t.name)&&(E(`包 ${t.name} 在 publish.packages 中重复声明`),process.exit(1)),v.set(t.name,e),y.push(t)}let x=e=>v.get(e)===`local`?{kind:`local`,registryUrl:s}:{kind:`npm`},S=e=>b(x(e)),w=O(y);if(g){C(`[dry-run] 预览模式,不会实际安装、构建或发布`),C(`[dry-run] 发布顺序(含目标 registry,发布前核对轨道,ADR 0082):`);for(let e=0;e<w.length;e++){let t=w[e]??[];for(let n of t)C(`[dry-run] 第 ${e+1} 层: ${n.name} → ${S(n.name)}`)}u(``)}let D={total:y.length,success:0,skip:0,fail:0,results:[]};C(`开始发布流程`),C(`基础路径: ${c}`),u(``);let F=n?.cleanRunner??(async()=>z(c));h&&!g?(C(`发布前清理构建产物`),u(``),await F({dryRun:!1}),u(``)):h&&g&&(C(`[dry-run] 跳过发布前清理`),u(``)),f&&!g?(await k(c)||(E(`安装依赖失败,终止发布`),process.exit(1)),u(``)):f&&g&&(C(`[dry-run] 跳过安装依赖`),u(``)),l.preBuildHook&&!g?(C(`执行 preBuildHook`),t(l.preBuildHook,{cwd:c,stdio:`inherit`,shell:!0}).status!==0&&(E(`preBuildHook 执行失败,终止发布`),process.exit(1)),u(``)):l.preBuildHook&&g&&(C(`[dry-run] 跳过 preBuildHook`),u(``)),u(`========================================`),u(``);for(let e=0;e<w.length;e++){let t=w[e]??[];if(t.length!==0){C(`【第 ${e+1} 层】发布 ${t.length} 个包...`),u(``);for(let e of t){let t=x(e.name);C(`开始发布: ${e.name}`),C(`路径: ${e.path}`),C(`目标: ${b(t)}`);let n=await N(e.path);if(C(`版本: ${n}`),p&&!g){if(!await j(e.path,e.name)){D.fail++,D.results.push({name:e.name,result:`fail`,error:`构建失败`}),u(``);continue}}else p&&g&&C(`[dry-run] 跳过构建 ${e.name}`);if(g)C(`[dry-run] 将发布 ${e.name}@${n} → ${b(t)}`),D.results.push({name:e.name,result:`success`}),D.success++;else{let n=await M(e.path,e.name,d,t);switch(D.results.push({name:e.name,result:n.result,error:n.error}),n.result){case`success`:D.success++;break;case`skip`:D.skip++;break;case`fail`:D.fail++}}u(``)}e<w.length-1&&(g?C(`[dry-run] 跳过更新依赖`):await A(c),u(``))}}P(D),await R(y,D,g),D.fail>0&&process.exit(1)};export{g as NPM_OFFICIAL_REGISTRY_URL,j as buildPackage,v as buildPublishArgs,y as buildPublishEnv,b as describePublishTarget,x as ensureLocalRegistry,N as getPackageVersion,k as installDependencies,E as logError,C as logInfo,w as logSuccess,T as logWarn,I as normalizePublishTracks,P as printSummary,B as publishCommand,M as publishPackage,p as readPackageJson,m as resolvePackageManifest,o as scanAllPackages,O as topologicalSort,A as updateDependencies};
@@ -0,0 +1 @@
1
+ import"node:module";export{};
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@longzai-intelligence-release/core",
3
+ "version": "0.0.1",
4
+ "description": "Longzai Intelligence 发布业务核心实现(双轨归一化、依赖拓扑分层、构建与发布管线)",
5
+ "license": "UNLICENSED",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "type": "module",
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
+ }
17
+ },
18
+ "scripts": {
19
+ "build": "lzi-builder",
20
+ "build:prod": "NODE_ENV=production bun run build",
21
+ "prepublishOnly": "bun run build:prod",
22
+ "typecheck": "bun run typecheck:app && bun run typecheck:node && bun run typecheck:test",
23
+ "typecheck:app": "lzi-tsgo typecheck tsconfig/app.json",
24
+ "typecheck:node": "lzi-tsgo typecheck tsconfig/node.json",
25
+ "typecheck:test": "lzi-tsgo typecheck tsconfig/test.json",
26
+ "lint": "oxlint && oxfmt --check",
27
+ "lint:fix": "oxlint --fix && oxfmt",
28
+ "test": "bun test",
29
+ "test:watch": "bun test --watch",
30
+ "test:coverage": "bun test --coverage",
31
+ "clean": "lzi-dev-cli clean"
32
+ },
33
+ "dependencies": {
34
+ "@longzai-intelligence-dev-tools/dependency-graph": "^0.2.29",
35
+ "@longzai-intelligence-release/config": "0.0.1",
36
+ "zod": "^4.4.3"
37
+ }
38
+ }