@longzai-intelligence-toolchain/core 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -76,6 +76,16 @@ declare const DOMAIN_COUNT: number;
76
76
  declare const resolveBinCommand: (bin: string) => string | null;
77
77
  //#endregion
78
78
  //#region src/delegate.usecase.d.ts
79
+ /**
80
+ * 初始化 logger 预设
81
+ *
82
+ * @remarks
83
+ * logger 0.1.5 起创建日志器前须初始化预设,本函数供 CLI 入口在装配
84
+ * 命令前调用。传输恒定走 pino 文件通道输出到 stderr——pretty 传输的
85
+ * 包内锚定经构建打包后解析失效,系 logger 台账在册待裁项,伞形 CLI
86
+ * 的委托日志只有罕见错误行,不依赖彩色排版
87
+ */
88
+ declare const initializeLoggerPreset: () => void;
79
89
  /**
80
90
  * 委托执行结果
81
91
  */
@@ -159,7 +169,10 @@ declare const defineCheckEntry: (entry: CheckEntry) => CheckEntry;
159
169
  *
160
170
  * @remarks
161
171
  * 核心集为每仓应具备的基线检查,扩展集为域表内既有域的独占检查,
162
- * 扩展集以引擎 bin 可解析为纳入条件。域表外引擎的检查不入本表
172
+ * 扩展集以引擎 bin 可解析为纳入条件。域表外引擎的检查不入本表。
173
+ * dependencies 项经 2026-10-17 用户指令增补,校验全群内部包依赖
174
+ * 均为 registry 最新版。overrides 项经同日用户指令增补,校验全部
175
+ * 清单未声明未豁免的强制版本字段
163
176
  */
164
177
  declare const CHECK_ENTRIES: readonly CheckEntry[];
165
178
  //#endregion
@@ -453,4 +466,4 @@ declare const formatForbidMessage: (task: string, candidates: Candidate[], turbo
453
466
  */
454
467
  declare const runForbidCommand: (options: ForbidOptions) => Promise<void>;
455
468
  //#endregion
456
- export { CHECK_ENTRIES, COLORS, type CheckEntry, type CheckItemResult, type CheckRunOptions, type CheckRunResult, type CheckRunStatus, DOMAIN_COUNT, DOMAIN_ENTRIES, type DelegateResult, type DomainEntry, PORTFOLIO_CONFIG_FILE_NAME, type PortfolioSource, type PushAllOptions, type ResolvedPortfolio, checkEntrySchema, defineCheckEntry, defineDomainEntry, delegateToDomain, domainEntrySchema, extractScripts, formatForbidMessage, hasScript, loadToolchainConfig, readPackageJson, readWorkspacePatterns, resolveBinCommand, resolvePortfolioConfig, runCheckCommand, runForbidCommand, runPushAllCommand, scanAllPackages, stderr, stdout };
469
+ export { CHECK_ENTRIES, COLORS, type CheckEntry, type CheckItemResult, type CheckRunOptions, type CheckRunResult, type CheckRunStatus, DOMAIN_COUNT, DOMAIN_ENTRIES, type DelegateResult, type DomainEntry, PORTFOLIO_CONFIG_FILE_NAME, type PortfolioSource, type PushAllOptions, type ResolvedPortfolio, checkEntrySchema, defineCheckEntry, defineDomainEntry, delegateToDomain, domainEntrySchema, extractScripts, formatForbidMessage, hasScript, initializeLoggerPreset, loadToolchainConfig, readPackageJson, readWorkspacePatterns, resolveBinCommand, resolvePortfolioConfig, runCheckCommand, runForbidCommand, runPushAllCommand, scanAllPackages, stderr, stdout };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import*as e from"zod";import{accessSync as t,constants as n,existsSync as r,readdirSync as i,statSync as a}from"node:fs";import{delimiter as o,dirname as s,isAbsolute as c,join as l,relative as u,resolve as d}from"node:path";import{createNodeLogger as f}from"@longzai-intelligence-logger/node";import{loadToolchainConfig as p,loadToolchainConfig as m}from"@longzai-intelligence-toolchain/config";import{loadConfigFile as h}from"@longzai-intelligence-shared-config/core";const g=e.object({domain:e.string().regex(/^[a-z][a-z0-9-]*$/,`域名为小写字母开头的 kebab-case`),bin:e.string().min(1),packageName:e.string().regex(/^@[a-z0-9-]+\/[a-z0-9-]+$/,`包名为带 scope 的 npm 包名`),description:e.string().min(1)}),_=e=>{let t=g.safeParse(e);if(!t.success){let e=t.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `);throw Error(`域表条目校验失败: ${e}`)}return e},v=Object.freeze([_({domain:`version`,bin:`lzi-version`,packageName:`@longzai-intelligence-version/cli`,description:`版本号同步与检查`}),_({domain:`dependencies`,bin:`lzi-dependencies`,packageName:`@longzai-intelligence-dependencies/cli`,description:`依赖版本升级与跨仓批量升级`}),_({domain:`changelog`,bin:`lzi-changelog`,packageName:`@longzai-intelligence-changelog/cli`,description:`变更日志条目追加与撤回`}),_({domain:`release`,bin:`lzi-release`,packageName:`@longzai-intelligence-release/cli`,description:`版本发布操作`}),_({domain:`config`,bin:`lzi-config`,packageName:`@longzai-intelligence-config/cli`,description:`scripts 与配置文件基线门禁`}),_({domain:`env`,bin:`lzi-env-cli`,packageName:`@longzai-intelligence-env/cli`,description:`环境变量声明门禁`}),_({domain:`tsconfig`,bin:`lzi-tsconfig`,packageName:`@longzai-intelligence-tsconfig/cli`,description:`tsconfig 形态门禁`}),_({domain:`scripts`,bin:`lzi-scripts`,packageName:`@longzai-intelligence-scripts/cli`,description:`标准脚本完备性审计`}),_({domain:`git`,bin:`lzi-git`,packageName:`@longzai-intelligence-git/cli`,description:`gitignore 治理与 git 透传`}),_({domain:`vscode`,bin:`lzi-vscode-cli`,packageName:`@longzai-intelligence-vscode/cli`,description:`工作区编辑器设置同步`}),_({domain:`agent`,bin:`lzi-agent-cli`,packageName:`@longzai-intelligence-agent-tools/cli`,description:`指令面真源合成`}),_({domain:`decision`,bin:`lzi-decision`,packageName:`@longzai-intelligence-decision/cli`,description:`ADR 编号与索引门禁`}),_({domain:`standards`,bin:`lzi-standards`,packageName:`@longzai-intelligence-standards/cli`,description:`标准注册表治理`}),_({domain:`oxlint`,bin:`lzi-oxlint`,packageName:`@longzai-intelligence-oxlint/cli`,description:`lint 依赖声明形态检查`}),_({domain:`bun`,bin:`lzi-bun-cli`,packageName:`@longzai-intelligence-bun/cli`,description:`Bun 工具链配置生成与锁文件审计`}),_({domain:`builder`,bin:`lzi-builder`,packageName:`@longzai-intelligence-builder/cli`,description:`统一构建`}),_({domain:`bootstrap`,bin:`lzi-bootstrap`,packageName:`@longzai-intelligence-bootstrap/cli`,description:`产品启动器`}),_({domain:`port`,bin:`lzi-port`,packageName:`@longzai-intelligence-port/cli`,description:`端口注册与查询`})]),y=v.length,b=e=>{try{return t(e,n.X_OK),!0}catch{return!1}},x=e=>{if(c(e))return b(e)?e:null;let t=process.cwd();for(;;){let n=l(t,`node_modules`,`.bin`,e);if(b(n))return n;let r=l(t,`..`);if(r===t)break;t=r}let n=(process.env.PATH??``).split(o);for(let t of n){if(t.length===0)continue;let n=l(t,e);if(b(n))return n}return null},S=f(`@longzai-intelligence-toolchain/core/delegate`),C=async(e,t,n)=>{if(n?.enabled===!1)return S.error(`域 ${e.domain} 已被就地配置禁用`),{exitCode:1};let r=n?.bin??e.bin,i=x(r);return i===null?(S.error(`未找到可执行命令:${r}`),S.error(`请安装引擎依赖:${e.packageName}`),{exitCode:127}):{exitCode:await Bun.spawn([i,...t],{stdin:`inherit`,stdout:`inherit`,stderr:`inherit`}).exited??1}},w=e.object({id:e.string().regex(/^[a-z][a-z0-9-]*$/,`检查项 id 为小写字母开头的 kebab-case`),domain:e.string().regex(/^[a-z][a-z0-9-]*$/,`域名为小写字母开头的 kebab-case`),args:e.array(e.string().min(1)).min(1),core:e.boolean(),probe:e.string().min(1).optional(),description:e.string().min(1)}),T=e=>{let t=w.safeParse(e);if(!t.success){let e=t.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `);throw Error(`检查项条目校验失败: ${e}`)}return e},E=Object.freeze([T({id:`lockfile`,domain:`bun`,args:[`lockfile`,`check`],core:!0,description:`bun 单一锁文件不变量审计`}),T({id:`node-links`,domain:`bun`,args:[`node-links`,`check`],core:!0,probe:`node-links`,description:`node_modules 悬挂符号链接检测`}),T({id:`bunfig-drift`,domain:`bun`,args:[`config`,`generate`,`--check`,`--recursive`],core:!0,description:`bunfig.toml 与生成器预期漂移校验`}),T({id:`tsconfig`,domain:`tsconfig`,args:[`check`],core:!0,description:`tsconfig 形态门禁`}),T({id:`oxlint`,domain:`oxlint`,args:[`check`],core:!0,description:`lint 依赖声明形态检查`}),T({id:`env`,domain:`env`,args:[`check`],core:!0,description:`环境变量声明门禁`}),T({id:`gitignore`,domain:`git`,args:[`gitignore`,`check`],core:!0,description:`gitignore 归一化守门`}),T({id:`vscode`,domain:`vscode`,args:[`sync`,`--check`],core:!0,description:`编辑器设置同步校验`}),T({id:`version`,domain:`version`,args:[`check`],core:!0,description:`版本号一致性检查`}),T({id:`agent-sync`,domain:`agent`,args:[`sync`,`--check`],core:!1,description:`指令面真源同步校验`}),T({id:`decision-lint`,domain:`decision`,args:[`lint`],core:!1,description:`ADR 正文形态检查`}),T({id:`decision-numbering`,domain:`decision`,args:[`numbering`,`check`],core:!1,description:`ADR 编号连续性检查`}),T({id:`decision-index`,domain:`decision`,args:[`index`,`check`],core:!1,description:`ADR 索引一致性检查`}),T({id:`standards-lint`,domain:`standards`,args:[`lint`],core:!1,description:`标准注册表正文形态检查`}),T({id:`standards-index`,domain:`standards`,args:[`index`,`check`],core:!1,description:`标准注册表索引一致性检查`})]),D={RED:`\x1B[0;31m`,GREEN:`\x1B[0;32m`,YELLOW:`\x1B[1;33m`,BLUE:`\x1B[0;34m`,RESET:`\x1B[0m`};function O(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 k(...e){process.stdout.write(`${O(e)}\n`)}function A(...e){process.stderr.write(`${O(e)}\n`)}const j=new Map(v.map(e=>[e.domain,e])),M=(e,t)=>t.includes(e.id)||t.includes(e.domain),ee=async(e,t)=>{let n=Bun.spawn([e,`--help`],{stdout:`pipe`,stderr:`pipe`}),[r,i]=await Promise.all([n.exited,new Response(n.stdout).text()]);return r===0&&i.includes(t)},te=async(e,t)=>{let n=j.get(e.domain);if(n===void 0)throw Error(`检查项 ${e.id} 引用的域 ${e.domain} 不在域表内`);let r=`${n.bin} ${e.args.join(` `)}`,i=t?.[e.domain];if(i?.enabled===!1)return k(`${D.YELLOW}- ${e.id} ${r} 已禁用${D.RESET}`),{id:e.id,domain:e.domain,command:r,status:`disabled`,exitCode:null};let a=i?.bin??n.bin,o=x(a);if(o===null)return e.core?(A(`${D.RED}✗ ${e.id} 缺引擎,请安装 ${n.packageName}${D.RESET}`),{id:e.id,domain:e.domain,command:r,status:`missing`,exitCode:null}):(k(`${D.YELLOW}- ${e.id} ${r} 不适用,未安装 ${n.packageName}${D.RESET}`),{id:e.id,domain:e.domain,command:r,status:`not-applicable`,exitCode:null});if(e.probe!==void 0&&!await ee(o,e.probe))return A(`${D.YELLOW}⚠ ${e.id} 已安装引擎不含该子命令,跳过检查,升级 ${n.packageName} 后自动生效${D.RESET}`),{id:e.id,domain:e.domain,command:r,status:`capability-missing`,exitCode:null};k(`${D.BLUE}▶ ${e.id} ${e.description}${D.RESET}`);let s=await Bun.spawn([o,...e.args],{stdin:`inherit`,stdout:`inherit`,stderr:`inherit`}).exited??1;return{id:e.id,domain:e.domain,command:r,status:s===0?`pass`:`fail`,exitCode:s}},ne=async(e={})=>{let t=(await m())?.config,n=t?.checks,r;r=e.only!==void 0&&e.only.length>0?E.filter(t=>M(t,e.only??[])):n?.include!==void 0&&n.include.length>0?E.filter(e=>M(e,n.include??[])):E;let i=[...e.skip??[],...n?.exclude??[]];if(i.length>0&&(r=r.filter(e=>!M(e,i))),r.length===0)return A(`未命中任何检查项,请核对 only、skip 与就地配置的 checks 选择`),{results:[],exitCode:1};k(`开始聚合检查,共 ${r.length} 项,串行执行`);let a=[];for(let e of r)a.push(await te(e,t?.domains));let o=e=>a.filter(t=>t.status===e).length;k(``),k(`检查汇总: 通过 ${o(`pass`)},失败 ${o(`fail`)},缺引擎 ${o(`missing`)},能力缺失 ${o(`capability-missing`)},不适用 ${o(`not-applicable`)},已禁用 ${o(`disabled`)}`);for(let e of a){if(e.status===`pass`)continue;let t=e.status===`fail`&&e.exitCode!==null?`${e.id} ${e.command} 退出码 ${e.exitCode}`:`${e.id} ${e.command} ${e.status}`;k(e.status===`fail`||e.status===`missing`?`${D.RED} ✗ ${t}${D.RESET}`:`${D.YELLOW} - ${t}${D.RESET}`)}let s=o(`fail`)+o(`missing`);return s>0&&A(`修复指引: 对失败项以 lzi-toolchain <域名> <参数> 单独重跑查看引擎明细`),{results:a,exitCode:Math.min(s,255)}},N=`lzi-architecture.yaml`,P=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),re=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};return`root`in e&&typeof e.root==`string`&&(t.root=e.root),`exclude`in e&&P(e.exclude)&&(t.exclude=e.exclude),t},F=async e=>{try{let t=await Bun.file(e).text();return re(Bun.YAML.parse(t))}catch(t){A(`错误:加载配置文件失败:${e}`,t instanceof Error?t.message:String(t)),process.exit(1)}},ie=e=>typeof e!=`object`||!e||Array.isArray(e)?{}:`exclude`in e&&P(e.exclude)?{exclude:e.exclude}:{},I=async e=>{if(e){let t=d(process.cwd(),e);r(t)||(A(`错误:配置文件不存在:${t}`),process.exit(1));let n=await F(t);return{rootDir:d(s(t),n.root??`../`),exclude:n.exclude??[],source:`explicit`}}let t=process.env.LZI_GLOBALS_ROOT;if(t!==void 0&&t!==``){let e=l(d(t),`lzi-architecture.config.ts`);if(r(e))try{let{config:n}=await h(e),r=ie(n);return{rootDir:s(d(t)),exclude:r.exclude??[],source:`globals`}}catch(t){A(`错误:加载 globals 聚合配置失败:${e}`,t instanceof Error?t.message:String(t)),process.exit(1)}}let n=process.cwd();for(;n!==`/`;){let e=l(n,N);if(r(e)){let t=await F(e);return{rootDir:d(s(e),t.root??`../`),exclude:t.exclude??[],source:`yaml-upward`}}n=s(n)}return null},ae=(e,t)=>{let n;try{n=i(e)}catch{A(`错误:无法读取聚合根目录:${e}`),process.exit(1)}let o=new Set(t);return n.filter(e=>!(e.startsWith(`.`)||e===`node_modules`||o.has(e))).map(t=>{let n=l(e,t);try{if(a(n).isDirectory()&&r(l(n,`.git`)))return{name:t,dir:n}}catch{}return null}).filter(e=>e!==null)},oe=e=>{let t=Bun.spawnSync([`git`,`remote`],{cwd:e,stdout:`pipe`,stderr:`pipe`}),n=t.stdout.toString().trim();return t.exitCode===0&&n.length>0},L=e=>Bun.spawnSync([`git`,`rev-parse`,`--abbrev-ref`,`--symbolic-full-name`,`@{upstream}`],{cwd:e,stdout:`pipe`,stderr:`pipe`}).exitCode===0,R=e=>{let t=Bun.spawnSync([`git`,`rev-list`,`--count`,`@{upstream}..HEAD`],{cwd:e,stdout:`pipe`,stderr:`pipe`});if(t.exitCode!==0)return 0;let n=Number.parseInt(t.stdout.toString().trim(),10);return Number.isNaN(n)?0:n},z=e=>{let t=Bun.spawnSync([`git`,`rev-parse`,`--abbrev-ref`,`--symbolic-full-name`,`@{upstream}`],{cwd:e,stdout:`pipe`,stderr:`pipe`});if(t.exitCode!==0)return null;let n=t.stdout.toString().trim(),r=n.indexOf(`/`);return r>=0?n.slice(r+1):n},B=e=>{let t=z(e);return t?Bun.spawnSync([`git`,`push`,`origin`,`HEAD:${t}`],{cwd:e,stdout:`pipe`,stderr:`pipe`}).exitCode===0:!1},V=async e=>{let{dryRun:t}=e,n=e.concurrency??10,i=await I(e.config);i||(A(`错误:未找到产品群配置文件 ${N}`),A(`提示:请在 architecture 项目创建该配置文件,参考 lzi-architecture.sample.yaml`),A(`提示:或使用 --config <path> 显式指定`),A(`提示:或在 .env 设置 LZI_GLOBALS_ROOT 定位 globals 仓 TS 配置,见 ADR 0081`),process.exit(1));let a=i.rootDir;r(a)||(A(`错误:聚合根目录不存在:${a}`),process.exit(1));let o=i.exclude;k(`${D.BLUE}═══ push-all ═══${D.RESET}`),k(`聚合配置来源:${i.source}`),k(`聚合根:${a}`),k(`并发数:${n}`),o.length>0&&k(`排除项目:${o.join(`, `)}`),t&&k(`${D.YELLOW}[dry-run] 预览模式,不实际推送${D.RESET}`),k(``);let s=ae(a,o);k(`发现 ${s.length} 个子项目,正在扫描推送状态`),k(``);let c=[],l=[],u=[],d=[];for(let e of s){let{name:t,dir:n}=e;if(!oe(n)){l.push(t);continue}if(!L(n)){u.push(t);continue}let r=R(n);r===0?d.push(t):c.push({name:t,dir:n,ahead:r})}if(t){k(`${D.GREEN}待推送:${c.length}${D.RESET}`);for(let e of c)k(` ${e.name},ahead ${e.ahead}`);l.length>0&&(k(``),k(`跳过,无 git remote:${l.length}`)),u.length>0&&k(`跳过,无 upstream tracking:${u.length}`),d.length>0&&k(`跳过,已是最新:${d.length}`),k(``),k(`${D.BLUE}汇总:${c.length} 待推送,${d.length} 已最新,${l.length+u.length} 跳过${D.RESET}`);return}if(c.length===0){k(`${D.GREEN}所有项目均已是最新,无需推送${D.RESET}`),k(`跳过,无 git remote:${l.length}`),k(`跳过,无 upstream tracking:${u.length}`),k(`跳过,已是最新:${d.length}`);return}k(`待推送 ${c.length} 个项目,并发数 ${n},开始推送`),k(``);let f=[],p=0,m=c.length;await(async(e,t)=>{let n=0,r=async()=>{for(;n<e.length;){let t=e[n];if(!t)break;n++;let r=B(t.dir);f.push({name:t.name,status:r?`pushed`:`failed`,ahead:t.ahead,reason:r?void 0:`git push 失败`}),p++;let i=r?`${D.GREEN}✓${D.RESET}`:`${D.RED}✗${D.RESET}`;k(` [${p}/${m}] ${i} ${t.name}`)}},i=Array.from({length:Math.min(t,e.length)},()=>r());await Promise.all(i)})(c,n);let h=f.filter(e=>e.status===`pushed`),g=f.filter(e=>e.status===`failed`);k(`${D.BLUE}═══ 处理结果 ═══${D.RESET}`),k(`${D.GREEN}已推送:${h.length}${D.RESET}`);for(let e of h)k(` ${e.name},ahead ${e.ahead}`);if(g.length>0){k(``),k(`${D.RED}失败:${g.length}${D.RESET}`);for(let e of g)k(` ${e.name}:${e.reason}`)}k(``),k(`${D.BLUE}汇总:${h.length} 已推送,${g.length} 失败,${d.length} 已最新,${l.length+u.length} 跳过${D.RESET}`),g.length>0&&(process.exitCode=1)},H=[`packages/*`,`apps/*`],U=e.record(e.string(),e.unknown()),W=e.record(e.string(),e.string()),G=e.array(e.string()),K=e.object({name:e.string()}),q=async e=>Bun.file(e).json(),J=async e=>{try{let t=U.safeParse(await q(`${e}/package.json`));if(t.success){let e=t.data.workspaces,n=G.safeParse(e);if(n.success&&n.data.length>0)return n.data;let r=U.safeParse(e);if(r.success){let e=G.safeParse(r.data.packages);if(e.success&&e.data.length>0)return e.data}}}catch{}return H},Y=async e=>{let t=/* @__PURE__ */ new Map,n=await J(e);for(let r of n)try{let n=new Bun.Glob(`${r}/package.json`);for await(let r of n.scan({cwd:e,absolute:!0}))try{let e=await q(r),n=K.safeParse(e);if(n.success){let e=r.replace(/[/\\]package\.json$/,``);t.set(n.data.name,e)}}catch{}}catch{}return t},X=async e=>{let t=U.safeParse(await Bun.file(`${e}/package.json`).json());if(!t.success)throw Error(`package.json 格式不合法:${e}`);return t.data},Z=e=>{let t=W.safeParse(e.scripts);return t.success?t.data:{}},Q=(e,t)=>{let n=Z(e)[t];return typeof n==`string`&&n.trim()!==``},$=(e,t,n)=>{if(t.length===0)return[`禁止在 monorepo 根目录运行 ${e}。`,``,`当前 workspace 内无子包声明 "${e}" 脚本。`,`请进入具体子包目录后执行,或确认任务名是否正确。`].join(`
1
+ import"./rolldown-runtime-BqT_7tdF.js";import*as e from"zod";import{accessSync as t,constants as n,existsSync as r,readdirSync as i,statSync as a}from"node:fs";import{delimiter as o,dirname as s,isAbsolute as c,join as l,relative as u,resolve as d}from"node:path";import{createNodeLogger as f,initializeNodeLoggerPreset as p}from"@longzai-intelligence-logger/node";import{loadToolchainConfig as m,loadToolchainConfig as h}from"@longzai-intelligence-toolchain/config";import{loadConfigFile as g}from"@longzai-intelligence-shared-config/core";const _=e.object({domain:e.string().regex(/^[a-z][a-z0-9-]*$/,`域名为小写字母开头的 kebab-case`),bin:e.string().min(1),packageName:e.string().regex(/^@[a-z0-9-]+\/[a-z0-9-]+$/,`包名为带 scope 的 npm 包名`),description:e.string().min(1)}),v=e=>{let t=_.safeParse(e);if(!t.success){let e=t.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `);throw Error(`域表条目校验失败: ${e}`)}return e},y=Object.freeze([v({domain:`version`,bin:`lzi-version`,packageName:`@longzai-intelligence-version/cli`,description:`版本号同步与检查`}),v({domain:`dependencies`,bin:`lzi-dependencies`,packageName:`@longzai-intelligence-dependencies/cli`,description:`依赖版本升级与跨仓批量升级`}),v({domain:`changelog`,bin:`lzi-changelog`,packageName:`@longzai-intelligence-changelog/cli`,description:`变更日志条目追加与撤回`}),v({domain:`release`,bin:`lzi-release`,packageName:`@longzai-intelligence-release/cli`,description:`版本发布操作`}),v({domain:`config`,bin:`lzi-config`,packageName:`@longzai-intelligence-config/cli`,description:`scripts 与配置文件基线门禁`}),v({domain:`env`,bin:`lzi-env-cli`,packageName:`@longzai-intelligence-env/cli`,description:`环境变量声明门禁`}),v({domain:`tsconfig`,bin:`lzi-tsconfig`,packageName:`@longzai-intelligence-tsconfig/cli`,description:`tsconfig 形态门禁`}),v({domain:`scripts`,bin:`lzi-scripts`,packageName:`@longzai-intelligence-scripts/cli`,description:`标准脚本完备性审计`}),v({domain:`git`,bin:`lzi-git`,packageName:`@longzai-intelligence-git/cli`,description:`gitignore 治理与 git 透传`}),v({domain:`vscode`,bin:`lzi-vscode-cli`,packageName:`@longzai-intelligence-vscode/cli`,description:`工作区编辑器设置同步`}),v({domain:`agent`,bin:`lzi-agent-cli`,packageName:`@longzai-intelligence-agent-tools/cli`,description:`指令面真源合成`}),v({domain:`decision`,bin:`lzi-decision`,packageName:`@longzai-intelligence-decision/cli`,description:`ADR 编号与索引门禁`}),v({domain:`standards`,bin:`lzi-standards`,packageName:`@longzai-intelligence-standards/cli`,description:`标准注册表治理`}),v({domain:`oxlint`,bin:`lzi-oxlint`,packageName:`@longzai-intelligence-oxlint/cli`,description:`lint 依赖声明形态检查`}),v({domain:`bun`,bin:`lzi-bun-cli`,packageName:`@longzai-intelligence-bun/cli`,description:`Bun 工具链配置生成与锁文件审计`}),v({domain:`builder`,bin:`lzi-builder`,packageName:`@longzai-intelligence-builder/cli`,description:`统一构建`}),v({domain:`bootstrap`,bin:`lzi-bootstrap`,packageName:`@longzai-intelligence-bootstrap/cli`,description:`产品启动器`}),v({domain:`port`,bin:`lzi-port`,packageName:`@longzai-intelligence-port/cli`,description:`端口注册与查询`})]),ee=y.length,b=e=>{try{return t(e,n.X_OK),!0}catch{return!1}},x=e=>{if(c(e))return b(e)?e:null;let t=process.cwd();for(;;){let n=l(t,`node_modules`,`.bin`,e);if(b(n))return n;let r=l(t,`..`);if(r===t)break;t=r}let n=(process.env.PATH??``).split(o);for(let t of n){if(t.length===0)continue;let n=l(t,e);if(b(n))return n}return null},S=()=>{p({transport:{target:`pino/file`,options:{destination:2}}})};let C=null;const w=()=>(C===null&&(C=f(`@longzai-intelligence-toolchain/core/delegate`)),C),T=async(e,t,n)=>{if(n?.enabled===!1)return w().error(`域 ${e.domain} 已被就地配置禁用`),{exitCode:1};let r=n?.bin??e.bin,i=x(r);return i===null?(w().error(`未找到可执行命令:${r}`),w().error(`请安装引擎依赖:${e.packageName}`),{exitCode:127}):{exitCode:await Bun.spawn([i,...t],{stdin:`inherit`,stdout:`inherit`,stderr:`inherit`}).exited??1}},E=e.object({id:e.string().regex(/^[a-z][a-z0-9-]*$/,`检查项 id 为小写字母开头的 kebab-case`),domain:e.string().regex(/^[a-z][a-z0-9-]*$/,`域名为小写字母开头的 kebab-case`),args:e.array(e.string().min(1)).min(1),core:e.boolean(),probe:e.string().min(1).optional(),description:e.string().min(1)}),D=e=>{let t=E.safeParse(e);if(!t.success){let e=t.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `);throw Error(`检查项条目校验失败: ${e}`)}return e},O=Object.freeze([D({id:`lockfile`,domain:`bun`,args:[`lockfile`,`check`],core:!0,description:`bun 单一锁文件不变量审计`}),D({id:`node-links`,domain:`bun`,args:[`node-links`,`check`],core:!0,probe:`node-links`,description:`node_modules 悬挂符号链接检测`}),D({id:`bunfig-drift`,domain:`bun`,args:[`config`,`generate`,`--check`,`--recursive`],core:!0,description:`bunfig.toml 与生成器预期漂移校验`}),D({id:`tsconfig`,domain:`tsconfig`,args:[`check`],core:!0,description:`tsconfig 形态门禁`}),D({id:`oxlint`,domain:`oxlint`,args:[`check`],core:!0,description:`lint 依赖声明形态检查`}),D({id:`env`,domain:`env`,args:[`check`],core:!0,description:`环境变量声明门禁`}),D({id:`gitignore`,domain:`git`,args:[`gitignore`,`check`],core:!0,description:`gitignore 归一化守门`}),D({id:`vscode`,domain:`vscode`,args:[`sync`,`--check`],core:!0,description:`编辑器设置同步校验`}),D({id:`version`,domain:`version`,args:[`check`],core:!0,description:`版本号一致性检查`}),D({id:`dependencies`,domain:`dependencies`,args:[`check`],core:!0,probe:`check`,description:`Longzai Intelligence 包依赖新鲜度检查`}),D({id:`overrides`,domain:`dependencies`,args:[`overrides`,`check`],core:!0,probe:`overrides`,description:`package.json 强制版本字段禁令检查`}),D({id:`agent-sync`,domain:`agent`,args:[`sync`,`--check`],core:!1,description:`指令面真源同步校验`}),D({id:`decision-lint`,domain:`decision`,args:[`lint`],core:!1,description:`ADR 正文形态检查`}),D({id:`decision-numbering`,domain:`decision`,args:[`numbering`,`check`],core:!1,description:`ADR 编号连续性检查`}),D({id:`decision-index`,domain:`decision`,args:[`index`,`check`],core:!1,description:`ADR 索引一致性检查`}),D({id:`standards-lint`,domain:`standards`,args:[`lint`],core:!1,description:`标准注册表正文形态检查`}),D({id:`standards-index`,domain:`standards`,args:[`index`,`check`],core:!1,description:`标准注册表索引一致性检查`})]),k={RED:`\x1B[0;31m`,GREEN:`\x1B[0;32m`,YELLOW:`\x1B[1;33m`,BLUE:`\x1B[0;34m`,RESET:`\x1B[0m`};function A(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 j(...e){process.stdout.write(`${A(e)}\n`)}function M(...e){process.stderr.write(`${A(e)}\n`)}const te=new Map(y.map(e=>[e.domain,e])),N=(e,t)=>t.includes(e.id)||t.includes(e.domain),ne=async(e,t)=>{let n=Bun.spawn([e,`--help`],{stdout:`pipe`,stderr:`pipe`}),[r,i]=await Promise.all([n.exited,new Response(n.stdout).text()]);return r===0&&i.includes(t)},re=async(e,t)=>{let n=te.get(e.domain);if(n===void 0)throw Error(`检查项 ${e.id} 引用的域 ${e.domain} 不在域表内`);let r=`${n.bin} ${e.args.join(` `)}`,i=t?.[e.domain];if(i?.enabled===!1)return j(`${k.YELLOW}- ${e.id} ${r} 已禁用${k.RESET}`),{id:e.id,domain:e.domain,command:r,status:`disabled`,exitCode:null};let a=i?.bin??n.bin,o=x(a);if(o===null)return e.core?(M(`${k.RED}✗ ${e.id} 缺引擎,请安装 ${n.packageName}${k.RESET}`),{id:e.id,domain:e.domain,command:r,status:`missing`,exitCode:null}):(j(`${k.YELLOW}- ${e.id} ${r} 不适用,未安装 ${n.packageName}${k.RESET}`),{id:e.id,domain:e.domain,command:r,status:`not-applicable`,exitCode:null});if(e.probe!==void 0&&!await ne(o,e.probe))return M(`${k.YELLOW}⚠ ${e.id} 已安装引擎不含该子命令,跳过检查,升级 ${n.packageName} 后自动生效${k.RESET}`),{id:e.id,domain:e.domain,command:r,status:`capability-missing`,exitCode:null};j(`${k.BLUE}▶ ${e.id} ${e.description}${k.RESET}`);let s=await Bun.spawn([o,...e.args],{stdin:`inherit`,stdout:`inherit`,stderr:`inherit`}).exited??1;return{id:e.id,domain:e.domain,command:r,status:s===0?`pass`:`fail`,exitCode:s}},ie=async(e={})=>{let t=(await h())?.config,n=t?.checks,r;r=e.only!==void 0&&e.only.length>0?O.filter(t=>N(t,e.only??[])):n?.include!==void 0&&n.include.length>0?O.filter(e=>N(e,n.include??[])):O;let i=[...e.skip??[],...n?.exclude??[]];if(i.length>0&&(r=r.filter(e=>!N(e,i))),r.length===0)return M(`未命中任何检查项,请核对 only、skip 与就地配置的 checks 选择`),{results:[],exitCode:1};j(`开始聚合检查,共 ${r.length} 项,串行执行`);let a=[];for(let e of r)a.push(await re(e,t?.domains));let o=e=>a.filter(t=>t.status===e).length;j(``),j(`检查汇总: 通过 ${o(`pass`)},失败 ${o(`fail`)},缺引擎 ${o(`missing`)},能力缺失 ${o(`capability-missing`)},不适用 ${o(`not-applicable`)},已禁用 ${o(`disabled`)}`);for(let e of a){if(e.status===`pass`)continue;let t=e.status===`fail`&&e.exitCode!==null?`${e.id} ${e.command} 退出码 ${e.exitCode}`:`${e.id} ${e.command} ${e.status}`;j(e.status===`fail`||e.status===`missing`?`${k.RED} ✗ ${t}${k.RESET}`:`${k.YELLOW} - ${t}${k.RESET}`)}let s=o(`fail`)+o(`missing`);return s>0&&M(`修复指引: 对失败项以 lzi-toolchain <域名> <参数> 单独重跑查看引擎明细`),{results:a,exitCode:Math.min(s,255)}},P=`lzi-architecture.yaml`,F=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),ae=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};return`root`in e&&typeof e.root==`string`&&(t.root=e.root),`exclude`in e&&F(e.exclude)&&(t.exclude=e.exclude),t},I=async e=>{try{let t=await Bun.file(e).text();return ae(Bun.YAML.parse(t))}catch(t){M(`错误:加载配置文件失败:${e}`,t instanceof Error?t.message:String(t)),process.exit(1)}},oe=e=>typeof e!=`object`||!e||Array.isArray(e)?{}:`exclude`in e&&F(e.exclude)?{exclude:e.exclude}:{},L=async e=>{if(e){let t=d(process.cwd(),e);r(t)||(M(`错误:配置文件不存在:${t}`),process.exit(1));let n=await I(t);return{rootDir:d(s(t),n.root??`../`),exclude:n.exclude??[],source:`explicit`}}let t=process.env.LZI_GLOBALS_ROOT;if(t!==void 0&&t!==``){let e=l(d(t),`lzi-architecture.config.ts`);if(r(e))try{let{config:n}=await g(e),r=oe(n);return{rootDir:s(d(t)),exclude:r.exclude??[],source:`globals`}}catch(t){M(`错误:加载 globals 聚合配置失败:${e}`,t instanceof Error?t.message:String(t)),process.exit(1)}}let n=process.cwd();for(;n!==`/`;){let e=l(n,P);if(r(e)){let t=await I(e);return{rootDir:d(s(e),t.root??`../`),exclude:t.exclude??[],source:`yaml-upward`}}n=s(n)}return null},se=(e,t)=>{let n;try{n=i(e)}catch{M(`错误:无法读取聚合根目录:${e}`),process.exit(1)}let o=new Set(t);return n.filter(e=>!(e.startsWith(`.`)||e===`node_modules`||o.has(e))).map(t=>{let n=l(e,t);try{if(a(n).isDirectory()&&r(l(n,`.git`)))return{name:t,dir:n}}catch{}return null}).filter(e=>e!==null)},R=e=>{let t=Bun.spawnSync([`git`,`remote`],{cwd:e,stdout:`pipe`,stderr:`pipe`}),n=t.stdout.toString().trim();return t.exitCode===0&&n.length>0},z=e=>Bun.spawnSync([`git`,`rev-parse`,`--abbrev-ref`,`--symbolic-full-name`,`@{upstream}`],{cwd:e,stdout:`pipe`,stderr:`pipe`}).exitCode===0,B=e=>{let t=Bun.spawnSync([`git`,`rev-list`,`--count`,`@{upstream}..HEAD`],{cwd:e,stdout:`pipe`,stderr:`pipe`});if(t.exitCode!==0)return 0;let n=Number.parseInt(t.stdout.toString().trim(),10);return Number.isNaN(n)?0:n},V=e=>{let t=Bun.spawnSync([`git`,`rev-parse`,`--abbrev-ref`,`--symbolic-full-name`,`@{upstream}`],{cwd:e,stdout:`pipe`,stderr:`pipe`});if(t.exitCode!==0)return null;let n=t.stdout.toString().trim(),r=n.indexOf(`/`);return r>=0?n.slice(r+1):n},H=e=>{let t=V(e);return t?Bun.spawnSync([`git`,`push`,`origin`,`HEAD:${t}`],{cwd:e,stdout:`pipe`,stderr:`pipe`}).exitCode===0:!1},U=async e=>{let{dryRun:t}=e,n=e.concurrency??10,i=await L(e.config);i||(M(`错误:未找到产品群配置文件 ${P}`),M(`提示:请在 architecture 项目创建该配置文件,参考 lzi-architecture.sample.yaml`),M(`提示:或使用 --config <path> 显式指定`),M(`提示:或在 .env 设置 LZI_GLOBALS_ROOT 定位 globals 仓 TS 配置,见 ADR 0081`),process.exit(1));let a=i.rootDir;r(a)||(M(`错误:聚合根目录不存在:${a}`),process.exit(1));let o=i.exclude;j(`${k.BLUE}═══ push-all ═══${k.RESET}`),j(`聚合配置来源:${i.source}`),j(`聚合根:${a}`),j(`并发数:${n}`),o.length>0&&j(`排除项目:${o.join(`, `)}`),t&&j(`${k.YELLOW}[dry-run] 预览模式,不实际推送${k.RESET}`),j(``);let s=se(a,o);j(`发现 ${s.length} 个子项目,正在扫描推送状态`),j(``);let c=[],l=[],u=[],d=[];for(let e of s){let{name:t,dir:n}=e;if(!R(n)){l.push(t);continue}if(!z(n)){u.push(t);continue}let r=B(n);r===0?d.push(t):c.push({name:t,dir:n,ahead:r})}if(t){j(`${k.GREEN}待推送:${c.length}${k.RESET}`);for(let e of c)j(` ${e.name},ahead ${e.ahead}`);l.length>0&&(j(``),j(`跳过,无 git remote:${l.length}`)),u.length>0&&j(`跳过,无 upstream tracking:${u.length}`),d.length>0&&j(`跳过,已是最新:${d.length}`),j(``),j(`${k.BLUE}汇总:${c.length} 待推送,${d.length} 已最新,${l.length+u.length} 跳过${k.RESET}`);return}if(c.length===0){j(`${k.GREEN}所有项目均已是最新,无需推送${k.RESET}`),j(`跳过,无 git remote:${l.length}`),j(`跳过,无 upstream tracking:${u.length}`),j(`跳过,已是最新:${d.length}`);return}j(`待推送 ${c.length} 个项目,并发数 ${n},开始推送`),j(``);let f=[],p=0,m=c.length;await(async(e,t)=>{let n=0,r=async()=>{for(;n<e.length;){let t=e[n];if(!t)break;n++;let r=H(t.dir);f.push({name:t.name,status:r?`pushed`:`failed`,ahead:t.ahead,reason:r?void 0:`git push 失败`}),p++;let i=r?`${k.GREEN}✓${k.RESET}`:`${k.RED}✗${k.RESET}`;j(` [${p}/${m}] ${i} ${t.name}`)}},i=Array.from({length:Math.min(t,e.length)},()=>r());await Promise.all(i)})(c,n);let h=f.filter(e=>e.status===`pushed`),g=f.filter(e=>e.status===`failed`);j(`${k.BLUE}═══ 处理结果 ═══${k.RESET}`),j(`${k.GREEN}已推送:${h.length}${k.RESET}`);for(let e of h)j(` ${e.name},ahead ${e.ahead}`);if(g.length>0){j(``),j(`${k.RED}失败:${g.length}${k.RESET}`);for(let e of g)j(` ${e.name}:${e.reason}`)}j(``),j(`${k.BLUE}汇总:${h.length} 已推送,${g.length} 失败,${d.length} 已最新,${l.length+u.length} 跳过${k.RESET}`),g.length>0&&(process.exitCode=1)},W=[`packages/*`,`apps/*`],G=e.record(e.string(),e.unknown()),ce=e.record(e.string(),e.string()),K=e.array(e.string()),le=e.object({name:e.string()}),q=async e=>Bun.file(e).json(),J=async e=>{try{let t=G.safeParse(await q(`${e}/package.json`));if(t.success){let e=t.data.workspaces,n=K.safeParse(e);if(n.success&&n.data.length>0)return n.data;let r=G.safeParse(e);if(r.success){let e=K.safeParse(r.data.packages);if(e.success&&e.data.length>0)return e.data}}}catch{}return W},Y=async e=>{let t=/* @__PURE__ */ new Map,n=await J(e);for(let r of n)try{let n=new Bun.Glob(`${r}/package.json`);for await(let r of n.scan({cwd:e,absolute:!0}))try{let e=await q(r),n=le.safeParse(e);if(n.success){let e=r.replace(/[/\\]package\.json$/,``);t.set(n.data.name,e)}}catch{}}catch{}return t},X=async e=>{let t=G.safeParse(await Bun.file(`${e}/package.json`).json());if(!t.success)throw Error(`package.json 格式不合法:${e}`);return t.data},Z=e=>{let t=ce.safeParse(e.scripts);return t.success?t.data:{}},Q=(e,t)=>{let n=Z(e)[t];return typeof n==`string`&&n.trim()!==``},$=(e,t,n)=>{if(t.length===0)return[`禁止在 monorepo 根目录运行 ${e}。`,``,`当前 workspace 内无子包声明 "${e}" 脚本。`,`请进入具体子包目录后执行,或确认任务名是否正确。`].join(`
2
2
  `);let r=t.map(e=>` ${e.relPath.padEnd(18)} → ${e.command}`),i=n?`\n或显式全量:turbo run ${e}`:``;return[`禁止在 monorepo 根目录运行 ${e}。`,``,`${e} 需在具体子包内执行。当前 workspace 内含该脚本的子包:`,``,...r,i].filter(e=>e!==``).join(`
3
- `)},se=/* @__PURE__ */ new Set([`dev`,`build`,`lint`,`test`,`typecheck`]),ce=async e=>{let{task:t}=e,n=process.cwd(),r=await Y(n),i=[];for(let[,e]of r)try{let r=await X(e);if(!Q(r,t))continue;let a=u(n,e);i.push({relPath:a,command:`bun run --cwd ${a} ${t}`})}catch{}i.sort((e,t)=>e.relPath.localeCompare(t.relPath));let a=se.has(t),o=$(t,i,a),s=D.RED,c=D.RESET;k(o.split(`
3
+ `)},ue=/* @__PURE__ */ new Set([`dev`,`build`,`lint`,`test`,`typecheck`]),de=async e=>{let{task:t}=e,n=process.cwd(),r=await Y(n),i=[];for(let[,e]of r)try{let r=await X(e);if(!Q(r,t))continue;let a=u(n,e);i.push({relPath:a,command:`bun run --cwd ${a} ${t}`})}catch{}i.sort((e,t)=>e.relPath.localeCompare(t.relPath));let a=ue.has(t),o=$(t,i,a),s=k.RED,c=k.RESET;j(o.split(`
4
4
  `).map((e,t)=>t===0?`${s}${e}${c}`:e).join(`
5
- `)),A(``),A(`如需在根目录触发全量任务,请显式使用 turbo,不要直接运行根脚本。`),process.exit(1)};export{E as CHECK_ENTRIES,D as COLORS,y as DOMAIN_COUNT,v as DOMAIN_ENTRIES,N as PORTFOLIO_CONFIG_FILE_NAME,w as checkEntrySchema,T as defineCheckEntry,_ as defineDomainEntry,C as delegateToDomain,g as domainEntrySchema,Z as extractScripts,$ as formatForbidMessage,Q as hasScript,p as loadToolchainConfig,X as readPackageJson,J as readWorkspacePatterns,x as resolveBinCommand,I as resolvePortfolioConfig,ne as runCheckCommand,ce as runForbidCommand,V as runPushAllCommand,Y as scanAllPackages,A as stderr,k as stdout};
5
+ `)),M(``),M(`如需在根目录触发全量任务,请显式使用 turbo,不要直接运行根脚本。`),process.exit(1)};export{O as CHECK_ENTRIES,k as COLORS,ee as DOMAIN_COUNT,y as DOMAIN_ENTRIES,P as PORTFOLIO_CONFIG_FILE_NAME,E as checkEntrySchema,D as defineCheckEntry,v as defineDomainEntry,T as delegateToDomain,_ as domainEntrySchema,Z as extractScripts,$ as formatForbidMessage,Q as hasScript,S as initializeLoggerPreset,m as loadToolchainConfig,X as readPackageJson,J as readWorkspacePatterns,x as resolveBinCommand,L as resolvePortfolioConfig,ie as runCheckCommand,de as runForbidCommand,U as runPushAllCommand,Y as scanAllPackages,M as stderr,j as stdout};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-toolchain/core",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Longzai Intelligence 工具链伞形核心:域表、委托内核与原生跨仓域用例",
5
5
  "keywords": [
6
6
  "core",
@@ -36,9 +36,9 @@
36
36
  "clean": "lzi-dev-cli clean"
37
37
  },
38
38
  "dependencies": {
39
- "@longzai-intelligence-logger/node": "^0.1.4",
40
- "@longzai-intelligence-shared-config/core": "^0.0.9",
41
- "@longzai-intelligence-toolchain/config": "0.0.2",
39
+ "@longzai-intelligence-logger/node": "0.1.4",
40
+ "@longzai-intelligence-shared-config/core": "^0.0.10",
41
+ "@longzai-intelligence-toolchain/config": "0.0.3",
42
42
  "zod": "^4.6.5"
43
43
  },
44
44
  "devDependencies": {