@longzai-intelligence-toolchain/core 0.0.1 → 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
  */
@@ -99,6 +109,147 @@ type DelegateResult = {
99
109
  */
100
110
  declare const delegateToDomain: (entry: DomainEntry, args: readonly string[], override?: DomainOverride) => Promise<DelegateResult>;
101
111
  //#endregion
112
+ //#region src/check-table.constants.d.ts
113
+ /**
114
+ * check 聚合命令的检查项条目
115
+ *
116
+ * @remarks
117
+ * 检查项映射到域表内既有域的引擎 check 子命令,伞形只登记映射不实现
118
+ * 检查逻辑。增删检查项一律编辑本文件,经 `defineCheckEntry` 工厂声明
119
+ */
120
+ type CheckEntry = {
121
+ /**
122
+ * 检查项 id,聚合报告与 include/exclude 选择的定位键
123
+ */
124
+ id: string;
125
+ /**
126
+ * 所属域名,须为域表内既有域名
127
+ */
128
+ domain: string;
129
+ /**
130
+ * 原样透传给引擎 bin 的参数数组
131
+ */
132
+ args: readonly string[];
133
+ /**
134
+ * 是否属于核心集,核心集缺引擎计失败附补依赖指引,扩展集缺引擎注记不适用
135
+ */
136
+ core: boolean;
137
+ /**
138
+ * 能力探测标记,非空时先以 help 输出判定该子命令在已安装引擎版本中是否存在
139
+ */
140
+ probe?: string;
141
+ /**
142
+ * 检查项职责的一句话说明,显示于聚合报告
143
+ */
144
+ description: string;
145
+ };
146
+ /**
147
+ * 检查项条目的 zod schema
148
+ */
149
+ declare const checkEntrySchema: z.ZodObject<{
150
+ id: z.ZodString;
151
+ domain: z.ZodString;
152
+ args: z.ZodArray<z.ZodString>;
153
+ core: z.ZodBoolean;
154
+ probe: z.ZodOptional<z.ZodString>;
155
+ description: z.ZodString;
156
+ }, z.core.$strip>;
157
+ /**
158
+ * 检查项条目声明工厂
159
+ *
160
+ * @remarks
161
+ * 传入值经 zod 运行时校验,校验失败即抛错并携带字段路径,禁止静默收录非法条目
162
+ * @param entry - 检查项条目
163
+ * @returns 经校验的检查项条目
164
+ * @throws {@link Error} 条目校验失败时抛出,消息含字段路径与原因
165
+ */
166
+ declare const defineCheckEntry: (entry: CheckEntry) => CheckEntry;
167
+ /**
168
+ * check 聚合命令的检查项表
169
+ *
170
+ * @remarks
171
+ * 核心集为每仓应具备的基线检查,扩展集为域表内既有域的独占检查,
172
+ * 扩展集以引擎 bin 可解析为纳入条件。域表外引擎的检查不入本表。
173
+ * dependencies 项经 2026-10-17 用户指令增补,校验全群内部包依赖
174
+ * 均为 registry 最新版。overrides 项经同日用户指令增补,校验全部
175
+ * 清单未声明未豁免的强制版本字段
176
+ */
177
+ declare const CHECK_ENTRIES: readonly CheckEntry[];
178
+ //#endregion
179
+ //#region src/check.usecase.d.ts
180
+ /**
181
+ * 单个检查项的执行状态
182
+ *
183
+ * @remarks
184
+ * pass 与 fail 为引擎退出码判定。missing 为核心集缺引擎,计入失败。
185
+ * not-applicable 为扩展集缺引擎,capability-missing 为引擎版本不含
186
+ * 子命令,disabled 为就地配置禁用,三者均不计入失败
187
+ */
188
+ type CheckRunStatus = 'pass' | 'fail' | 'missing' | 'not-applicable' | 'capability-missing' | 'disabled';
189
+ /**
190
+ * 单个检查项的执行结果
191
+ */
192
+ type CheckItemResult = {
193
+ /**
194
+ * 检查项 id
195
+ */
196
+ id: string;
197
+ /**
198
+ * 所属域名
199
+ */
200
+ domain: string;
201
+ /**
202
+ * 实际执行的引擎命令展示文本
203
+ */
204
+ command: string;
205
+ /**
206
+ * 执行状态
207
+ */
208
+ status: CheckRunStatus;
209
+ /**
210
+ * 引擎退出码,未实际执行时为 null
211
+ */
212
+ exitCode: number | null;
213
+ };
214
+ /**
215
+ * 聚合执行结果
216
+ */
217
+ type CheckRunResult = {
218
+ /**
219
+ * 各检查项结果,按执行顺序排列
220
+ */
221
+ results: CheckItemResult[];
222
+ /**
223
+ * 聚合退出码,失败项数上限 255
224
+ */
225
+ exitCode: number;
226
+ };
227
+ /**
228
+ * check 聚合命令的入参选项
229
+ */
230
+ type CheckRunOptions = {
231
+ /**
232
+ * 限定执行的检查项,值为检查项 id 或域名
233
+ */
234
+ only?: readonly string[];
235
+ /**
236
+ * 剔除的检查项,值为检查项 id 或域名
237
+ */
238
+ skip?: readonly string[];
239
+ };
240
+ /**
241
+ * 执行 check 聚合命令
242
+ *
243
+ * @remarks
244
+ * 检查项选择优先级为命令行 `only`、就地配置 `checks.include`、默认全集,
245
+ * 命令行 `skip` 与就地配置 `checks.exclude` 叠加剔除。串行执行不
246
+ * fail-fast,末尾输出汇总与修复指引。聚合退出码为失败项数,其中
247
+ * 核心集缺引擎计入失败,上限 255
248
+ * @param options - 聚合命令入参选项
249
+ * @returns 聚合执行结果,含逐项结果与退出码
250
+ */
251
+ declare const runCheckCommand: (options?: CheckRunOptions) => Promise<CheckRunResult>;
252
+ //#endregion
102
253
  //#region src/native/cli-output.utils.d.ts
103
254
  /**
104
255
  * CLI 输出工具
@@ -315,4 +466,4 @@ declare const formatForbidMessage: (task: string, candidates: Candidate[], turbo
315
466
  */
316
467
  declare const runForbidCommand: (options: ForbidOptions) => Promise<void>;
317
468
  //#endregion
318
- export { COLORS, DOMAIN_COUNT, DOMAIN_ENTRIES, type DelegateResult, type DomainEntry, PORTFOLIO_CONFIG_FILE_NAME, type PortfolioSource, type PushAllOptions, type ResolvedPortfolio, defineDomainEntry, delegateToDomain, domainEntrySchema, extractScripts, formatForbidMessage, hasScript, loadToolchainConfig, readPackageJson, readWorkspacePatterns, resolveBinCommand, resolvePortfolioConfig, 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}from"@longzai-intelligence-toolchain/config";import{loadConfigFile as m}from"@longzai-intelligence-shared-config/core";const h=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)}),g=e=>{let t=h.safeParse(e);if(!t.success){let e=t.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `);throw Error(`域表条目校验失败: ${e}`)}return e},_=Object.freeze([g({domain:`version`,bin:`lzi-version`,packageName:`@longzai-intelligence-version/cli`,description:`版本号同步与检查`}),g({domain:`dependencies`,bin:`lzi-dependencies`,packageName:`@longzai-intelligence-dependencies/cli`,description:`依赖版本升级与跨仓批量升级`}),g({domain:`changelog`,bin:`lzi-changelog`,packageName:`@longzai-intelligence-changelog/cli`,description:`变更日志条目追加与撤回`}),g({domain:`release`,bin:`lzi-release`,packageName:`@longzai-intelligence-release/cli`,description:`版本发布操作`}),g({domain:`config`,bin:`lzi-config`,packageName:`@longzai-intelligence-config/cli`,description:`scripts 与配置文件基线门禁`}),g({domain:`env`,bin:`lzi-env-cli`,packageName:`@longzai-intelligence-env/cli`,description:`环境变量声明门禁`}),g({domain:`tsconfig`,bin:`lzi-tsconfig`,packageName:`@longzai-intelligence-tsconfig/cli`,description:`tsconfig 形态门禁`}),g({domain:`scripts`,bin:`lzi-scripts`,packageName:`@longzai-intelligence-scripts/cli`,description:`标准脚本完备性审计`}),g({domain:`git`,bin:`lzi-git`,packageName:`@longzai-intelligence-git/cli`,description:`gitignore 治理与 git 透传`}),g({domain:`vscode`,bin:`lzi-vscode-cli`,packageName:`@longzai-intelligence-vscode/cli`,description:`工作区编辑器设置同步`}),g({domain:`agent`,bin:`lzi-agent-cli`,packageName:`@longzai-intelligence-agent-tools/cli`,description:`指令面真源合成`}),g({domain:`decision`,bin:`lzi-decision`,packageName:`@longzai-intelligence-decision/cli`,description:`ADR 编号与索引门禁`}),g({domain:`standards`,bin:`lzi-standards`,packageName:`@longzai-intelligence-standards/cli`,description:`标准注册表治理`}),g({domain:`oxlint`,bin:`lzi-oxlint`,packageName:`@longzai-intelligence-oxlint/cli`,description:`lint 依赖声明形态检查`}),g({domain:`bun`,bin:`lzi-bun-cli`,packageName:`@longzai-intelligence-bun/cli`,description:`Bun 工具链配置生成与锁文件审计`}),g({domain:`builder`,bin:`lzi-builder`,packageName:`@longzai-intelligence-builder/cli`,description:`统一构建`}),g({domain:`bootstrap`,bin:`lzi-bootstrap`,packageName:`@longzai-intelligence-bootstrap/cli`,description:`产品启动器`}),g({domain:`port`,bin:`lzi-port`,packageName:`@longzai-intelligence-port/cli`,description:`端口注册与查询`})]),v=_.length,y=e=>{try{return t(e,n.X_OK),!0}catch{return!1}},b=e=>{if(c(e))return y(e)?e:null;let t=process.cwd();for(;;){let n=l(t,`node_modules`,`.bin`,e);if(y(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(y(n))return n}return null},x=f(`@longzai-intelligence-toolchain/core/delegate`),S=async(e,t,n)=>{if(n?.enabled===!1)return x.error(`域 ${e.domain} 已被就地配置禁用`),{exitCode:1};let r=n?.bin??e.bin,i=b(r);return i===null?(x.error(`未找到可执行命令:${r}`),x.error(`请安装引擎依赖:${e.packageName}`),{exitCode:127}):{exitCode:await Bun.spawn([i,...t],{stdin:`inherit`,stdout:`inherit`,stderr:`inherit`}).exited??1}},C={RED:`\x1B[0;31m`,GREEN:`\x1B[0;32m`,YELLOW:`\x1B[1;33m`,BLUE:`\x1B[0;34m`,RESET:`\x1B[0m`};function w(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 T(...e){process.stdout.write(`${w(e)}\n`)}function E(...e){process.stderr.write(`${w(e)}\n`)}const D=`lzi-architecture.yaml`,O=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),k=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&&O(e.exclude)&&(t.exclude=e.exclude),t},A=async e=>{try{let t=await Bun.file(e).text();return k(Bun.YAML.parse(t))}catch(t){E(`错误:加载配置文件失败:${e}`,t instanceof Error?t.message:String(t)),process.exit(1)}},j=e=>typeof e!=`object`||!e||Array.isArray(e)?{}:`exclude`in e&&O(e.exclude)?{exclude:e.exclude}:{},M=async e=>{if(e){let t=d(process.cwd(),e);r(t)||(E(`错误:配置文件不存在:${t}`),process.exit(1));let n=await A(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 m(e),r=j(n);return{rootDir:s(d(t)),exclude:r.exclude??[],source:`globals`}}catch(t){E(`错误:加载 globals 聚合配置失败:${e}`,t instanceof Error?t.message:String(t)),process.exit(1)}}let n=process.cwd();for(;n!==`/`;){let e=l(n,D);if(r(e)){let t=await A(e);return{rootDir:d(s(e),t.root??`../`),exclude:t.exclude??[],source:`yaml-upward`}}n=s(n)}return null},N=(e,t)=>{let n;try{n=i(e)}catch{E(`错误:无法读取聚合根目录:${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)},P=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},F=e=>Bun.spawnSync([`git`,`rev-parse`,`--abbrev-ref`,`--symbolic-full-name`,`@{upstream}`],{cwd:e,stdout:`pipe`,stderr:`pipe`}).exitCode===0,I=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},L=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},R=e=>{let t=L(e);return t?Bun.spawnSync([`git`,`push`,`origin`,`HEAD:${t}`],{cwd:e,stdout:`pipe`,stderr:`pipe`}).exitCode===0:!1},z=async e=>{let{dryRun:t}=e,n=e.concurrency??10,i=await M(e.config);i||(E(`错误:未找到产品群配置文件 ${D}`),E(`提示:请在 architecture 项目创建该配置文件,参考 lzi-architecture.sample.yaml`),E(`提示:或使用 --config <path> 显式指定`),E(`提示:或在 .env 设置 LZI_GLOBALS_ROOT 定位 globals 仓 TS 配置,见 ADR 0081`),process.exit(1));let a=i.rootDir;r(a)||(E(`错误:聚合根目录不存在:${a}`),process.exit(1));let o=i.exclude;T(`${C.BLUE}═══ push-all ═══${C.RESET}`),T(`聚合配置来源:${i.source}`),T(`聚合根:${a}`),T(`并发数:${n}`),o.length>0&&T(`排除项目:${o.join(`, `)}`),t&&T(`${C.YELLOW}[dry-run] 预览模式,不实际推送${C.RESET}`),T(``);let s=N(a,o);T(`发现 ${s.length} 个子项目,正在扫描推送状态`),T(``);let c=[],l=[],u=[],d=[];for(let e of s){let{name:t,dir:n}=e;if(!P(n)){l.push(t);continue}if(!F(n)){u.push(t);continue}let r=I(n);r===0?d.push(t):c.push({name:t,dir:n,ahead:r})}if(t){T(`${C.GREEN}待推送:${c.length}${C.RESET}`);for(let e of c)T(` ${e.name},ahead ${e.ahead}`);l.length>0&&(T(``),T(`跳过,无 git remote:${l.length}`)),u.length>0&&T(`跳过,无 upstream tracking:${u.length}`),d.length>0&&T(`跳过,已是最新:${d.length}`),T(``),T(`${C.BLUE}汇总:${c.length} 待推送,${d.length} 已最新,${l.length+u.length} 跳过${C.RESET}`);return}if(c.length===0){T(`${C.GREEN}所有项目均已是最新,无需推送${C.RESET}`),T(`跳过,无 git remote:${l.length}`),T(`跳过,无 upstream tracking:${u.length}`),T(`跳过,已是最新:${d.length}`);return}T(`待推送 ${c.length} 个项目,并发数 ${n},开始推送`),T(``);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=R(t.dir);f.push({name:t.name,status:r?`pushed`:`failed`,ahead:t.ahead,reason:r?void 0:`git push 失败`}),p++;let i=r?`${C.GREEN}✓${C.RESET}`:`${C.RED}✗${C.RESET}`;T(` [${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`);T(`${C.BLUE}═══ 处理结果 ═══${C.RESET}`),T(`${C.GREEN}已推送:${h.length}${C.RESET}`);for(let e of h)T(` ${e.name},ahead ${e.ahead}`);if(g.length>0){T(``),T(`${C.RED}失败:${g.length}${C.RESET}`);for(let e of g)T(` ${e.name}:${e.reason}`)}T(``),T(`${C.BLUE}汇总:${h.length} 已推送,${g.length} 失败,${d.length} 已最新,${l.length+u.length} 跳过${C.RESET}`),g.length>0&&(process.exitCode=1)},B=[`packages/*`,`apps/*`],V=e.record(e.string(),e.unknown()),H=e.record(e.string(),e.string()),U=e.array(e.string()),W=e.object({name:e.string()}),G=async e=>Bun.file(e).json(),K=async e=>{try{let t=V.safeParse(await G(`${e}/package.json`));if(t.success){let e=t.data.workspaces,n=U.safeParse(e);if(n.success&&n.data.length>0)return n.data;let r=V.safeParse(e);if(r.success){let e=U.safeParse(r.data.packages);if(e.success&&e.data.length>0)return e.data}}}catch{}return B},q=async e=>{let t=/* @__PURE__ */ new Map,n=await K(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 G(r),n=W.safeParse(e);if(n.success){let e=r.replace(/[/\\]package\.json$/,``);t.set(n.data.name,e)}}catch{}}catch{}return t},J=async e=>{let t=V.safeParse(await Bun.file(`${e}/package.json`).json());if(!t.success)throw Error(`package.json 格式不合法:${e}`);return t.data},Y=e=>{let t=H.safeParse(e.scripts);return t.success?t.data:{}},X=(e,t)=>{let n=Y(e)[t];return typeof n==`string`&&n.trim()!==``},Z=(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
- `)},Q=/* @__PURE__ */ new Set([`dev`,`build`,`lint`,`test`,`typecheck`]),$=async e=>{let{task:t}=e,n=process.cwd(),r=await q(n),i=[];for(let[,e]of r)try{let r=await J(e);if(!X(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=Q.has(t),o=Z(t,i,a),s=C.RED,c=C.RESET;T(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
- `)),E(``),E(`如需在根目录触发全量任务,请显式使用 turbo,不要直接运行根脚本。`),process.exit(1)};export{C as COLORS,v as DOMAIN_COUNT,_ as DOMAIN_ENTRIES,D as PORTFOLIO_CONFIG_FILE_NAME,g as defineDomainEntry,S as delegateToDomain,h as domainEntrySchema,Y as extractScripts,Z as formatForbidMessage,X as hasScript,p as loadToolchainConfig,J as readPackageJson,K as readWorkspacePatterns,b as resolveBinCommand,M as resolvePortfolioConfig,$ as runForbidCommand,z as runPushAllCommand,q as scanAllPackages,E as stderr,T 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.1",
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.1",
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": {