@longzai-intelligence-release/core 0.0.3 → 0.0.4

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.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -5,8 +5,8 @@ import"./rolldown-runtime-BqT_7tdF.js";import{loadReleaseConfig as e}from"@longz
5
5
  `),process.stdout.write(`总包数: ${e.total}\n`),process.stdout.write(`${m.GREEN}成功: ${e.success}${m.RESET}\n`),process.stdout.write(`${m.YELLOW}跳过: ${e.skip}${m.RESET}\n`),process.stdout.write(`${m.RED}失败: ${e.fail}${m.RESET}\n`),process.stdout.write(`
6
6
  `);let t=e.results.filter(e=>e.result===`skip`);if(t.length>0){E(`跳过的包:`);for(let e of t)process.stdout.write(` - ${e.name}\n`);process.stdout.write(`
7
7
  `)}let n=e.results.filter(e=>e.result===`fail`);if(n.length>0){D(`失败的包:`);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){w(`验证发布结果:`);for(let e of r)process.stdout.write(` npm info ${e.name}\n`)}},I=i.object({workspaces:i.record(i.string(),i.unknown())}),L=i.object({name:i.string(),version:i.string().optional()});var R=class extends Error{constructor(e){super(e),this.name=`LockfileParseError`}};const z=async e=>{let t=n(e,`bun.lock`),r=Bun.file(t);if(!await r.exists())return null;let i=(await r.text()).replace(/,(\s*[}\]])/g,`$1`),a;try{a=JSON.parse(i)}catch(e){throw new R(`bun.lock 解析失败(${t}): ${e instanceof Error?e.message:String(e)}`)}let o=I.safeParse(a);if(!o.success)throw new R(`bun.lock 缺少 workspaces 段或结构不合法(${t})`);let s=/* @__PURE__ */ new Map;for(let e of Object.values(o.data.workspaces)){let t=L.safeParse(e);t.success&&t.data.version!==void 0&&s.set(t.data.name,t.data.version)}return s},B=(e,t)=>{let n=[];for(let r of e){let e=t.get(r.dependency)??null;e!==r.manifestVersion&&n.push({dependent:r.dependent,dependency:r.dependency,manifestVersion:r.manifestVersion,lockVersion:e})}return n},te=async e=>{let t;try{t=await z(e.rootDir)}catch(e){return D(e instanceof Error?e.message:String(e)),!1}if(t===null)return w(`未找到 bun.lock,跳过 workspace 快照一致性闸门(无 lockfile 即无过期快照面)`),!0;let n=[];for(let t of e.manifests)for(let r of t.workspaceDeps){let i=e.allPackages.get(r);if(i===void 0)return D(`workspace 依赖 ${r}(被 ${t.name} 声明)未能在仓内解析到包目录,终止发布`),!1;n.push({dependent:t.name,dependency:r,manifestVersion:await P(i)})}let r=B(n,t);if(r.length>0){D(`bun.lock workspace 版本快照与 package.json 不一致(${r.length} 处),终止发布:`);for(let e of r)D(` - ${e.dependent} → ${e.dependency}: package.json ${e.manifestVersion} vs bun.lock ${e.lockVersion??`未记录`}`);return D(`修复指引:在仓根刷新 lockfile 后重试(声明私有轨 scope 的仓经 lzi-npm-registry with -- bun install 刷新;版本盖章流程不重写快照,issue 0002)`),!1}return w(`bun.lock workspace 版本快照一致性校验通过`),!0},ne=i.record(i.string(),i.unknown());i.record(i.string(),i.string());const V=i.object({name:i.string()}),H=async e=>{let t=Bun.file(`${e}/package.json`),n=ne.safeParse(await t.json());if(!n.success)throw Error(`package.json 格式不合法: ${e}`);return n.data},U=async(e,t,n)=>{let i=`${t}/${e}/package.json`;if(await Bun.file(i).exists()){let n=await H(`${t}/${e}`),i=V.safeParse(n);return i.success?{name:i.data.name,path:r(`${t}/${e}`),workspaceDeps:o(n)}:null}let a=n.get(e);if(a){let e=await H(a),t=V.safeParse(e);return t.success?{name:t.data.name,path:r(a),workspaceDeps:o(e)}:null}return null},W=e=>{let t=e.indexOf(`/`);if(!(!e.startsWith(`@`)||t<=1))return e.slice(1,t)},G=e=>e.replace(/\/+$/,``),K=e=>typeof e==`object`&&!!e&&!Array.isArray(e),q=e=>{let t;try{t=Bun.TOML.parse(e)}catch{return{}}if(!K(t))return{};let n=`install`in t?t.install:void 0;if(!K(n))return{};let r=`scopes`in n?n.scopes:void 0;if(!K(r))return{};let i={};for(let[e,t]of Object.entries(r))typeof t==`string`&&(i[e.replace(/^@+/,``)]=t);return i},J=e=>{let t=/^@([^:\s]+):registry\s*=\s*(\S+)$/,n={};for(let r of e.split(`
9
- `)){let e=r.trim(),i=t.exec(e);i?.[1]!==void 0&&i[2]!==void 0&&!i[2].includes("${")&&(n[i[1]]=i[2])}return n},Y=async e=>{let t=[{label:`bunfig.toml`,path:n(e,`bunfig.toml`)},{label:`项目 .npmrc`,path:n(e,`.npmrc`)},{label:`用户 ~/.npmrc`,path:n(d(),`.npmrc`)}],r=[];for(let e of t){if(!l(e.path))continue;let t=u(e.path,`utf8`);if(e.label===`bunfig.toml`){let n=q(t);Object.keys(n).length===0&&t.trim()!==``&&E(`bunfig.toml 解析不出 [install.scopes](可能无该段或格式异常),预检按空映射处理`),r.push({label:e.label,scopes:n})}else r.push({label:e.label,scopes:J(t)})}return r},X=e=>{let t=W(e.packageName);if(t===void 0)return[];let n=[];for(let r of e.sources){let e=r.scopes[t];e!==void 0&&n.push({label:r.label,url:e})}let r=G(e.expectedRegistryUrl),i=[];if(e.track===`npm`){if(n.length===0)return i.push(`${e.packageName} 的 scope @${t} 未注册进任何 [install.scopes] / @scope:registry 映射——bun 1.3.x 实测 scope 缺位时 --registry 旗标路径凭据解析不可靠,公网轨发布会以 missing authentication 失败;请运行 bun run bun-config:generate 重新生成(lzi-bun-cli 会兜底注入本仓 scope)`),i;for(let a of n)G(a.url)!==r&&i.push(`${e.packageName} 的 scope @${t} 在 ${a.label} 中映射到 ${a.url},按 bun 优先级(scope 映射 > --registry 旗标)发布将写入该源而非轨道目标 ${e.expectedRegistryUrl},并以 missing authentication 失败;请运行 bun run bun-config:generate 重新生成或修正 ${a.label} 的该条映射`);return i}for(let a of n)G(a.url)!==r&&i.push(`${e.packageName} 的 scope @${t} 在 ${a.label} 中映射到 ${a.url},按 bun 优先级(scope 映射 > --registry 旗标)发布将偏离本地私有轨目标 ${e.expectedRegistryUrl};请在 lzi-bun.config.ts 的 install.privateScopes 排除该 scope(ADR 0082)后运行 bun run bun-config:generate 重新生成`);return i},Z=async e=>{w(`发布 registry 预检(scope 映射优先级防线)...`);let t=await Y(e.rootDir),n=[];for(let r of e.manifests){let i=e.trackByName.get(r.name)??`npm`;n.push(...X({packageName:r.name,track:i,expectedRegistryUrl:i===`local`?e.localRegistryUrl:h,sources:t}))}if(n.length>0){D(`发布 registry 预检失败(${n.length} 项违规,均为发布目标被静默改写或 scope 缺位的风险):`);for(let e of n)D(` - ${e}`);return!1}return w(`发布 registry 预检通过(scope 映射与轨道声明一致)`),!0},Q=`LZI_NPM_REGISTRY_URL`;function $(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 re=e=>{let t;try{t=$(e)}catch(e){D(e instanceof Error?e.message:String(e)),process.exit(1)}t.npm.length===0&&t.local.length===0&&(D(`配置文件中没有定义要发布的包`),process.exit(1));let n=process.env[Q]??``;return t.local.length>0&&n===``&&(D(`本地私有轨非空但未设置 ${Q}(发布仓 .env 配置,ADR 0082)`),process.exit(1)),{tracks:t,localRegistryUrl:n}},ie=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 P(i.path),c=s.startsWith(`^`)||s.startsWith(`~`)?s:`^${s}`;p(``),p(`下一步:提交版本变更(commit message 参考)`),p(` release: 更新版本至 v${s}`),p(``),p(`然后:升级所有消费者并推送`),p(` bun version:upgrade-across --scope ${o} --target ${c} --dry-run`),p(` bun version:upgrade-across --scope ${o} --target ${c}`),p(` bun push-all`)},ae=async e=>{await Z(e)||process.exit(1)},oe=async e=>{let t=/* @__PURE__ */ new Map,n=[];for(let[r,i]of[[`npm`,e.tracks.npm],[`local`,e.tracks.local]])for(let a of i){let i=await U(a,e.rootDir,e.allPackages);i||(D(`未找到包: ${a}`),process.exit(1)),t.has(i.name)&&(D(`包 ${i.name} 在 publish.packages 中重复声明`),process.exit(1)),t.set(i.name,r),n.push(i)}return{manifests:n,trackByName:t}},se=async e=>{await Bun.spawn([`lzi-dev-cli`,`clean`],{cwd:e,stdout:`inherit`,stderr:`inherit`}).exited!==0&&E(`lzi-dev-cli clean 执行失败(继续发布,请核查清理产物是否完整)`)},ce=async n=>{let i;try{i=await e()}catch(e){D(`加载配置文件失败: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}i||(D(`未找到配置文件 lzi-release.config.ts 或 lzi-dev.config.ts`),p(``),p(`请创建配置文件,示例:`),p(`
8
+ `)}},I=i.object({workspaces:i.record(i.string(),i.unknown())}),L=i.object({name:i.string(),version:i.string().optional()});var R=class extends Error{constructor(e){super(e),this.name=`LockfileParseError`}};const z=async e=>{let t=n(e,`bun.lock`),r=Bun.file(t);if(!await r.exists())return null;let i=(await r.text()).replace(/,(\s*[}\]])/g,`$1`),a;try{a=JSON.parse(i)}catch(e){throw new R(`bun.lock 解析失败(${t}): ${e instanceof Error?e.message:String(e)}`)}let o=I.safeParse(a);if(!o.success)throw new R(`bun.lock 缺少 workspaces 段或结构不合法(${t})`);let s=/* @__PURE__ */ new Map;for(let e of Object.values(o.data.workspaces)){let t=L.safeParse(e);t.success&&t.data.version!==void 0&&s.set(t.data.name,t.data.version)}return s},B=(e,t)=>{let n=[];for(let r of e){let e=t.get(r.dependency)??null;e!==r.manifestVersion&&n.push({dependent:r.dependent,dependency:r.dependency,manifestVersion:r.manifestVersion,lockVersion:e})}return n},te=async e=>{let t;try{t=await z(e.rootDir)}catch(e){return D(e instanceof Error?e.message:String(e)),!1}if(t===null)return w(`未找到 bun.lock,跳过 workspace 快照一致性闸门(无 lockfile 即无过期快照面)`),!0;let n=[];for(let t of e.manifests)for(let r of t.workspaceDeps){let i=e.allPackages.get(r);if(i===void 0)return D(`workspace 依赖 ${r}(被 ${t.name} 声明)未能在仓内解析到包目录,终止发布`),!1;n.push({dependent:t.name,dependency:r,manifestVersion:await P(i)})}let r=B(n,t);if(r.length>0){D(`bun.lock workspace 版本快照与 package.json 不一致,共 ${r.length} 处,终止发布`);for(let e of r)D(` - 依赖方 ${e.dependent} 依赖 ${e.dependency},package.json 为 ${e.manifestVersion},bun.lock 快照为 ${e.lockVersion??`未记录`}`);return D(`修复指引:在仓根重新执行 version sync 刷新快照后重试。`),D(`手工改版本号的场景,将 bun.lock workspaces 段内的版本字段对齐 package.json。`),!1}return w(`bun.lock workspace 版本快照一致性校验通过`),!0},ne=i.record(i.string(),i.unknown());i.record(i.string(),i.string());const V=i.object({name:i.string()}),H=async e=>{let t=Bun.file(`${e}/package.json`),n=ne.safeParse(await t.json());if(!n.success)throw Error(`package.json 格式不合法: ${e}`);return n.data},U=async(e,t,n)=>{let i=`${t}/${e}/package.json`;if(await Bun.file(i).exists()){let n=await H(`${t}/${e}`),i=V.safeParse(n);return i.success?{name:i.data.name,path:r(`${t}/${e}`),workspaceDeps:o(n)}:null}let a=n.get(e);if(a){let e=await H(a),t=V.safeParse(e);return t.success?{name:t.data.name,path:r(a),workspaceDeps:o(e)}:null}return null},W=e=>{let t=e.indexOf(`/`);if(!(!e.startsWith(`@`)||t<=1))return e.slice(1,t)},G=e=>e.replace(/\/+$/,``),K=e=>typeof e==`object`&&!!e&&!Array.isArray(e),q=e=>{let t;try{t=Bun.TOML.parse(e)}catch{return{}}if(!K(t))return{};let n=`install`in t?t.install:void 0;if(!K(n))return{};let r=`scopes`in n?n.scopes:void 0;if(!K(r))return{};let i={};for(let[e,t]of Object.entries(r))typeof t==`string`&&(i[e.replace(/^@+/,``)]=t);return i},J=e=>{let t=/^@([^:\s]+):registry\s*=\s*(\S+)$/,n={};for(let r of e.split(`
9
+ `)){let e=r.trim(),i=t.exec(e);i?.[1]!==void 0&&i[2]!==void 0&&!i[2].includes("${")&&(n[i[1]]=i[2])}return n},Y=async e=>{let t=[{label:`bunfig.toml`,path:n(e,`bunfig.toml`)},{label:`项目 .npmrc`,path:n(e,`.npmrc`)},{label:`用户 ~/.npmrc`,path:n(d(),`.npmrc`)}],r=[];for(let e of t){if(!l(e.path))continue;let t=u(e.path,`utf8`);if(e.label===`bunfig.toml`){let n=q(t);Object.keys(n).length===0&&t.trim()!==``&&E(`bunfig.toml 解析不出 [install.scopes](可能无该段或格式异常),预检按空映射处理`),r.push({label:e.label,scopes:n})}else r.push({label:e.label,scopes:J(t)})}return r},X=e=>{let t=W(e.packageName);if(t===void 0)return[];let n=[];for(let r of e.sources){let e=r.scopes[t];e!==void 0&&n.push({label:r.label,url:e})}let r=G(e.expectedRegistryUrl),i=[];if(e.track===`npm`){if(n.length===0)return i.push(`${e.packageName} 的 scope @${t} 未注册进任何 [install.scopes] / @scope:registry 映射——bun 1.3.x 实测 scope 缺位时 --registry 旗标路径凭据解析不可靠,公网轨发布会以 missing authentication 失败;请运行 bun run bun-config:generate 重新生成(lzi-bun-cli 会兜底注入本仓 scope)`),i;for(let a of n)G(a.url)!==r&&i.push(`${e.packageName} 的 scope @${t} 在 ${a.label} 中映射到 ${a.url},按 bun 优先级(scope 映射 > --registry 旗标)发布将写入该源而非轨道目标 ${e.expectedRegistryUrl},并以 missing authentication 失败;请运行 bun run bun-config:generate 重新生成或修正 ${a.label} 的该条映射`);return i}for(let a of n)G(a.url)!==r&&i.push(`${e.packageName} 的 scope @${t} 在 ${a.label} 中映射到 ${a.url},按 bun 优先级(scope 映射 > --registry 旗标)发布将偏离本地私有轨目标 ${e.expectedRegistryUrl};请在 lzi-bun.config.ts 的 install.privateScopes 排除该 scope(ADR 0082)后运行 bun run bun-config:generate 重新生成`);return i},Z=async e=>{w(`发布 registry 预检(scope 映射优先级防线)...`);let t=await Y(e.rootDir),n=[];for(let r of e.manifests){let i=e.trackByName.get(r.name)??`npm`;n.push(...X({packageName:r.name,track:i,expectedRegistryUrl:i===`local`?e.localRegistryUrl:h,sources:t}))}if(n.length>0){D(`发布 registry 预检失败(${n.length} 项违规,均为发布目标被静默改写或 scope 缺位的风险):`);for(let e of n)D(` - ${e}`);return!1}return w(`发布 registry 预检通过(scope 映射与轨道声明一致)`),!0},Q=`LZI_NPM_REGISTRY_URL`;function $(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 re=e=>{let t;try{t=$(e)}catch(e){D(e instanceof Error?e.message:String(e)),process.exit(1)}t.npm.length===0&&t.local.length===0&&(D(`配置文件中没有定义要发布的包`),process.exit(1));let n=process.env[Q]??``;return t.local.length>0&&n===``&&(D(`本地私有轨非空但未设置 ${Q}(发布仓 .env 配置,ADR 0082)`),process.exit(1)),{tracks:t,localRegistryUrl:n}},ie=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 P(i.path),c=s.startsWith(`^`)||s.startsWith(`~`)?s:`^${s}`;p(``),p(`下一步:提交版本变更`),p(` release: 更新版本至 v${s}`),p(``),p(`然后:升级所有消费者并推送`),p(` bun version:upgrade-across --scope ${o} --target ${c} --dry-run`),p(` bun version:upgrade-across --scope ${o} --target ${c}`),p(` bun push-all`)},ae=async e=>{await Z(e)||process.exit(1)},oe=async e=>{let t=/* @__PURE__ */ new Map,n=[];for(let[r,i]of[[`npm`,e.tracks.npm],[`local`,e.tracks.local]])for(let a of i){let i=await U(a,e.rootDir,e.allPackages);i||(D(`未找到包: ${a}`),process.exit(1)),t.has(i.name)&&(D(`包 ${i.name} 在 publish.packages 中重复声明`),process.exit(1)),t.set(i.name,r),n.push(i)}return{manifests:n,trackByName:t}},se=async e=>{await Bun.spawn([`lzi-dev-cli`,`clean`],{cwd:e,stdout:`inherit`,stderr:`inherit`}).exited!==0&&E(`lzi-dev-cli clean 执行失败(继续发布,请核查清理产物是否完整)`)},ce=async n=>{let i;try{i=await e()}catch(e){D(`加载配置文件失败: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}i||(D(`未找到配置文件 lzi-release.config.ts 或 lzi-dev.config.ts`),p(``),p(`请创建配置文件,示例:`),p(`
10
10
  import { defineConfig } from '@longzai-intelligence-release/config';
11
11
 
12
12
  export default defineConfig({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-release/core",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Longzai Intelligence 发布业务核心实现(双轨归一化、依赖拓扑分层、构建与发布管线)",
5
5
  "license": "UNLICENSED",
6
6
  "files": [
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "@longzai-intelligence-dev-tools/dependency-graph": "^0.2.29",
35
- "@longzai-intelligence-release/config": "0.0.3",
35
+ "@longzai-intelligence-release/config": "0.0.4",
36
36
  "zod": "^4.4.3"
37
37
  }
38
38
  }