@longzai-intelligence-scripts/cli 0.0.9 → 0.0.10

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 +1 -1
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -209,7 +209,7 @@ ${K.default.gray(jf+kf.repeat(a+2)+Mf)}
209
209
  `);process.stdout.write(G.cursor.move(-999,e.length-1)),process.stdout.write(G.erase.down(e.length))},g=e=>e.replace(/\.+$/,``),_=e=>{let t=(performance.now()-e)/1e3,n=Math.floor(t/60),r=Math.floor(t%60);return n>0?`[${n}m ${r}s]`:`[${r}s]`},v=(u=``)=>{o=!0,i=lf(),s=g(u),l=performance.now(),process.stdout.write(`${K.default.gray(Y)}
210
210
  `);let d=0,f=0;p(),a=setInterval(()=>{if(r&&s===c)return;h(),c=s;let n=K.default.magenta(t[d]);if(r)process.stdout.write(`${n} ${s}...`);else if(e===`timer`)process.stdout.write(`${n} ${s} ${_(l)}`);else{let e=`.`.repeat(Math.floor(f)).slice(0,3);process.stdout.write(`${n} ${s}${e}`)}d=d+1<t.length?d+1:0,f=f<t.length?f+.125:0},n)},y=(t=``,n=0)=>{o=!1,clearInterval(a),h();let r=n===0?K.default.green(Tf):n===1?K.default.red(Cf):K.default.red(wf);s=g(t??s),e===`timer`?process.stdout.write(`${r} ${s} ${_(l)}
211
211
  `):process.stdout.write(`${r} ${s}
212
- `),m(),i()};return{start:v,stop:y,message:(e=``)=>{s=g(e??s)}}},Kf={red:e=>K.default.red(e),green:e=>K.default.green(e),yellow:e=>K.default.yellow(e),blue:e=>K.default.blue(e),cyan:e=>K.default.cyan(e),magenta:e=>K.default.magenta(e),gray:e=>K.default.gray(e),bold:e=>K.default.bold(e),dim:e=>K.default.dim(e)},qf={async select(e,t){let n=await Vf({message:e,options:t.map(e=>({value:e.value,label:e.label,hint:e.hint}))});return sf(n)&&(Uf(`操作已取消`),process.exit(0)),typeof n==`string`?n:String(n)},async textInput(e,t){let n=await zf({message:e,placeholder:t?.placeholder,defaultValue:t?.defaultValue});return sf(n)&&(Uf(`操作已取消`),process.exit(0)),typeof n==`string`?n:String(n)},async confirm(e,t){let n=await Bf({message:e,initialValue:t?.defaultValue??!1});return sf(n)&&(Uf(`操作已取消`),process.exit(0)),typeof n==`boolean`?n:!!n},spinner(){let e=Gf();return{start(t){e.start(t)},stop(t){e.stop(t)}}},note(e,t){Hf(e,t)},log:{info(e){Wf.info(K.default.blue(e))},success(e){Wf.success(K.default.green(e))},warn(e){Wf.warn(K.default.yellow(e))},error(e){Wf.error(K.default.red(e))},step(e){Wf.step(e)}}},Jf=[`root`,`root-engineering`,`package`],Yf=e=>{let t=u(e)?e:f(process.cwd(),e);for(;t!==`/`;){let e=d(t,`lzi-scripts.config.ts`);if(i(e))return e;t=l(t)}return null},Xf=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Zf=e=>typeof e==`string`&&Jf.includes(e),Qf=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),$f=e=>{if(!Xf(e))return{};let t={};typeof e.registryRoot==`string`&&(t.registryRoot=e.registryRoot),Zf(e.profile)&&(t.profile=e.profile);let n=[];if(Array.isArray(e.exempt))for(let t of e.exempt)Xf(t)&&Qf(t.scripts)&&typeof t.reason==`string`&&t.reason.length>0&&n.push({scripts:t.scripts,reason:t.reason});n.length>0&&(t.exempt=n);let r=[];if(Array.isArray(e.extraAlternatives))for(let t of e.extraAlternatives)Xf(t)&&typeof t.script==`string`&&typeof t.definition==`string`&&r.push({script:t.script,definition:t.definition});return r.length>0&&(t.extraAlternatives=r),t},ep=async(e=process.cwd())=>{let t=Yf(e);if(t===null)return{config:{},configPath:null};try{let e=await import(t),n=typeof e==`object`&&e&&`default`in e?e.default:e;if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`配置 default export 须为对象: ${t}`);return{config:$f(n),configPath:t}}catch(e){throw e instanceof Error&&e.message.startsWith(`配置 default export`)?e:Error(`加载配置文件失败: ${t} ${e instanceof Error?e.message:String(e)}`)}},tp=d(`registry`,`index.ts`),np=e=>typeof e==`string`,rp=e=>typeof e==`object`&&!!e&&!Array.isArray(e),ip=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),ap=e=>e===`required`||e===`recommended`,op=e=>{if(!rp(e)||!np(e.name)||!np(e.definition)||!np(e.family)||!ap(e.severity)||e.alternatives!==void 0&&!ip(e.alternatives))return null;let t={name:e.name,definition:e.definition,severity:e.severity,family:e.family};return e.alternatives!==void 0&&(t.alternatives=e.alternatives),t},sp=e=>{if(!rp(e)||e.formatVersion!==1)return null;let t={};if(rp(e.profiles))for(let[n,r]of Object.entries(e.profiles)){if(n!==`root`&&n!==`root-engineering`&&n!==`package`)continue;let e=[];if(Array.isArray(r))for(let t of r){let n=op(t);n!==null&&e.push(n)}t[n]=e}let n=[];if(Array.isArray(e.companions))for(let t of e.companions)rp(t)&&np(t.path)&&np(t.reason)&&ap(t.severity)&&n.push({path:t.path,severity:t.severity,reason:t.reason});let r=[];if(Array.isArray(e.legacyMappings))for(let t of e.legacyMappings)rp(t)&&np(t.legacyPrefix)&&np(t.targetScript)&&np(t.targetPackage)&&np(t.note)&&r.push({legacyPrefix:t.legacyPrefix,targetScript:t.targetScript,targetPackage:t.targetPackage,note:t.note});return{formatVersion:1,profiles:t,companions:n,legacyMappings:r}},cp=async e=>{let t=u(e)?e:f(process.cwd(),e),n=d(t,tp);if(!i(n))return null;try{let e=await import(n),t=typeof e==`object`&&e&&`default`in e?e.default:e;return sp(t)}catch{return null}},lp=async e=>{if(e.explicit!==void 0&&e.explicit!==``){let t=await cp(e.explicit);return t===null?null:{data:t,root:f(process.cwd(),e.explicit),source:`explicit`}}if(e.configRoot!==void 0&&e.configRoot!==``){let t=await cp(f(e.repoDir,e.configRoot));if(t!==null)return{data:t,root:f(e.repoDir,e.configRoot),source:`config`}}let t=process.env.LZI_SCRIPTS_REGISTRY_ROOT;if(t!==void 0&&t!==``){let e=await cp(t);if(e!==null)return{data:e,root:f(t),source:`env`}}let n=d(l(e.repoDir),`longzai-intelligence-scripts-registry`),r=await cp(n);return r===null?null:{data:r,root:n,source:`sibling`}};function up(e){return{ok:!0,value:e}}function X(e){return{ok:!1,error:e}}const dp=/^[a-z][a-z0-9-]*$/,fp=[`edition-root`,`customer-root`,`single-repo`],pp=pc([`high`,`normal`,`low`]),mp=pc(fp),hp=/\S/,gp=nc({id:U().regex(dp,`范围 id 非法(应为小写字母开头的字母数字连字符)`),kind:mp,remotes:$s(U().regex(hp,`远程位置非法(不得为空串或纯空白)`)).default([]),tags:$s(U().regex(hp,`标签非法(不得为空串或纯空白)`)).default([]),priority:pp.default(`normal`),excludes:$s(U().min(1)).default([]),projectPriorities:dc(U(),pp).default({})}).check(e=>{e.value.kind===`single-repo`&&(e.value.excludes.length>0&&e.issues.push({code:`custom`,input:e.value,path:[`excludes`],message:`single-repo 范围禁用 excludes(声明的即唯一项目,如需排除请改用 edition-root/customer-root)`}),Object.keys(e.value.projectPriorities).length>0&&e.issues.push({code:`custom`,input:e.value,path:[`projectPriorities`],message:`single-repo 范围禁用 projectPriorities(优先级直接设于 scope 级)`}))}),_p=`scopes`,vp=/^[a-z][a-z0-9-]*\.scope\.ts$/;async function yp(e){let t=d(e,_p);if(!i(t))return X({code:`SCOPES_DIR_MISSING`,message:`声明域目录缺失:${t}(应为 project-registry 仓根下 ${_p}/,含 *.scope.ts 声明文件)`});let n=s(t).filter(e=>vp.test(e)).sort((e,t)=>e<t?-1:1);if(n.length===0)return X({code:`SCOPE_REGISTRY_EMPTY`,message:`范围声明域为空:${t}(无 *.scope.ts——范围消失属配置事故,如需清空请显式移除 registryRoot 配置)`});let r=/* @__PURE__ */ new Set,a=[];for(let e of n){let n=d(t,e),i=await import(p(n).href),o=gp.safeParse(i.default);if(!o.success){let e=o.error.issues[0];return X({code:`SCOPE_DECLARATION_INVALID`,message:`范围声明结构非法:${n}(${e?.path.join(`.`)??``} ${e?.message??``})`})}let s=e.replace(/\.scope\.ts$/,``);if(o.data.id!==s)return X({code:`SCOPE_ID_MISMATCH`,message:`范围 id 与文件名不一致:${n}(id=${o.data.id},应为 ${s}——命名即身份)`});if(r.has(o.data.id))return X({code:`SCOPE_ID_CONFLICT`,message:`范围 id 重复:${o.data.id}(声明域内同 id 即同范围,不得重复声明)`});r.add(o.data.id),a.push(o.data)}return up(a)}const bp=`LZI_PROJECT_REGISTRY_ROOT`,xp=`LZI_PROJECT_MARKDOWN_REGISTRY_ROOT`,Sp=`LZI_PROJECT_SCOPE_ROOTS`,Cp=`LZI_PROJECT_MARKDOWN_SCOPE_ROOTS`,wp=/^[a-z][a-z0-9-]*=\/\S+$/;function Tp(e){return e.split(`,`).map(e=>e.trim()).filter(e=>e!==``)}function Ep(e){let t=/* @__PURE__ */ new Map;for(let n of Tp(e)){if(!wp.test(n))return X({message:`范围根映射段非法:${n}(应为 id=绝对路径 形态,id 为小写字母开头的字母数字连字符)`});let e=n.indexOf(`=`),r=n.slice(0,e),i=f(n.slice(e+1));if(t.has(r))return X({message:`范围根映射 id 重复:${r}(同一范围不得重复映射)`});t.set(r,i)}return up(t)}function Dp(e,t,n,r){return e!==void 0&&t!==void 0&&e.trim()!==t.trim()?X({code:`ACQUISITION_ENV_INVALID`,message:`环境变量双名冲突:${n} 与 ${r} 同时在场且值不一致(请统一使用新名 ${n})`,variables:[n,r]}):up({value:e??t,variables:e===void 0?t===void 0?[]:[r]:[n]})}function Op(e=process.env){let t=Dp(e[bp],e[xp],bp,xp);if(!t.ok)return X(t.error);let n=Dp(e[Sp],e[Cp],Sp,Cp);if(!n.ok)return X(n.error);let r;if(n.value.value!==void 0){let e=Ep(n.value.value);if(!e.ok)return X({code:`ACQUISITION_ENV_INVALID`,message:e.error.message,variables:[...n.value.variables]});r=e.value}return up({registryRoot:t.value.value===void 0?void 0:f(t.value.value.trim()),scopeRoots:r})}const kp=/^[A-Za-z0-9_][A-Za-z0-9._-]*$/;function Ap(e,t){return e.name<t.name?-1:+(e.name>t.name)}function jp(e){return i(d(e,`.git`))}function Mp(e,t){return t.get(e.id)}function Np(e,t,n,r){if(n.has(e.id))return X({code:`SCOPE_ID_CONFLICT`,message:`范围 id 冲突:${e.id}(声明域内不得重复)`});n.add(e.id);let a=Mp(e,t);return a===void 0?X({code:`SCOPE_ROOT_UNMAPPED`,message:`范围根未映射:${e.id}(声明零本地路径,请在 .env 的 LZI_PROJECT_SCOPE_ROOTS 或 LZI_PROJECT_MARKDOWN_SCOPE_ROOTS 补 id=绝对路径 映射)`}):i(a)?up({def:e,root:a,sourceId:r}):X({code:`DIR_NOT_FOUND`,message:`范围根不存在:${a}(范围 ${e.id} 机内映射目标)`})}function Pp(e,t){let n=[],r=[];for(let i of[...s(e.root,{withFileTypes:!0})].sort(Ap)){if(i.name.startsWith(`.`))continue;if(!i.isDirectory()){r.push({scope:e.def.id,entry:i.name,reason:`ROOT_FILE`});continue}if(e.def.excludes.includes(i.name)){r.push({scope:e.def.id,entry:i.name,reason:`EXCLUDED`});continue}let a=d(e.root,i.name);t!==void 0&&f(a)===f(t)?r.push({scope:e.def.id,entry:i.name,reason:`EXCLUDED_PATH`}):!jp(a)||!kp.test(i.name)?r.push({scope:e.def.id,entry:i.name,reason:`NOT_A_REPO`}):n.push({scope:e.def.id,scopeKind:e.def.kind,priority:e.def.projectPriorities[i.name]??e.def.priority,sourceId:e.sourceId,project:i.name,path:a})}return{scope:e.def.id,scopeKind:e.def.kind,priority:e.def.priority,scopeRoot:e.root,sourceId:e.sourceId,projects:n,skipped:r}}function Fp(e,t){let n=c(e.root);return t!==void 0&&f(e.root)===f(t)||!jp(e.root)||!kp.test(n)?X({code:`SCOPE_ROOT_INVALID`,message:`single-repo 范围根非法:${e.root}(应为含 .git 的合规项目目录,且不得为排除路径)`}):up({scope:e.def.id,scopeKind:`single-repo`,priority:e.def.priority,scopeRoot:e.root,sourceId:e.sourceId,projects:[{scope:e.def.id,scopeKind:`single-repo`,priority:e.def.priority,sourceId:e.sourceId,project:n,path:e.root}]})}function Ip(e,t,n){let r=[],i=[],a=/* @__PURE__ */ new Set,o=/* @__PURE__ */ new Map;for(let s of e){let e=Np(s,n.scopeRoots,a,n.sourceId);if(!e.ok)return X(e.error);let c,l=[];if(s.kind===`single-repo`){let n=Fp(e.value,t);if(!n.ok)return X(n.error);c=n.value}else{let n=Pp(e.value,t);c=n,l=n.skipped}for(let e of c.projects){let t=o.get(e.project);if(t!==void 0)return X({code:`PROJECT_NAME_CONFLICT`,message:`项目名跨范围冲突:${e.project}(${t} 与 ${e.scope} 均含此名;归档平铺要求项目名全局唯一,可在后登记范围的 excludes 中显式排除)`});o.set(e.project,e.scope)}r.push(c),i.push(...l)}return r.sort((e,t)=>e.scope<t.scope?-1:+(e.scope>t.scope)),i.sort((e,t)=>e.scope===t.scope?e.entry<t.entry?-1:+(e.entry>t.entry):e.scope<t.scope?-1:1),up({scopes:r,skipped:i})}const Lp=n(g);function Rp(e){return typeof e==`object`&&!!e&&`stderr`in e}async function zp(e,t){try{let{stdout:n}=await Lp(`git`,[`-C`,e,...t],{encoding:`utf8`});return{ok:!0,stdout:n.trim()}}catch(e){let t=Rp(e)?e.stderr:void 0;return{ok:!1,stderr:typeof t==`string`?t:String(e)}}}function Bp(e){return typeof e==`object`&&!!e}function Vp(e){let t=d(e,`package.json`);if(!i(t))return{packageName:null,description:null};let n;try{n=JSON.parse(o(t,`utf8`))}catch{return{packageName:null,description:null}}if(!Bp(n))return{packageName:null,description:null};let r=n.name,a=n.description;return{packageName:typeof r==`string`&&r!==``?r:null,description:typeof a==`string`&&a!==``?a:null}}async function Hp(e){let t=await zp(e.path,[`rev-parse`,`--git-dir`]);if(!t.ok)return X({code:`INSPECT_FAILED`,scope:e.scope,project:e.project,message:`仓库健康探测失败:${e.path}(${t.stderr})`});let n=await zp(e.path,[`remote`,`get-url`,`origin`]),r=n.ok&&n.stdout!==``?n.stdout:null,i=Vp(e.path);return up({scope:e.scope,scopeKind:e.scopeKind,priority:e.priority,sourceId:e.sourceId,project:e.project,projectPath:e.path,remoteUrl:r,packageName:i.packageName,description:i.description})}async function Up(e,t,n){let r=Math.max(1,Math.floor(t)),i=[],a=0;for(;a<e.length;){let t=e.slice(a,a+r),o=await Promise.all(t.map((e,t)=>n(e,a+t)));i.push(...o),a+=r}return i}async function Wp(e={}){let t=Op(e.processEnv??process.env);if(!t.ok)return X(t.error);let n=e.registryRoot??t.value.registryRoot;if(n===void 0)return X({code:`ACQUISITION_ENV_INVALID`,message:`未定位 registry 仓根(请在 .env 配置 LZI_PROJECT_REGISTRY_ROOT 或显式传入 registryRoot)`});let r=await yp(n);if(!r.ok)return X(r.error);let i=e.scopeRoots??t.value.scopeRoots??/* @__PURE__ */ new Map,a=e.scopeIds===void 0?void 0:new Set(e.scopeIds),o=a===void 0?[]:[...a].filter(e=>!r.value.some(t=>t.id===e));if(o.length>0)return X({code:`SCOPE_SELECTOR_UNKNOWN`,message:`圈定的范围 id 不在声明域:${o.join(`、`)}(合法范围 id:${r.value.map(e=>e.id).join(`、`)})`});let s=r.value,c=[];if(a!==void 0){s=r.value.filter(e=>a.has(e.id));let e=s.filter(e=>!i.has(e.id)).map(e=>e.id);if(e.length>0)return X({code:`SCOPE_ROOT_UNMAPPED`,message:`范围根未映射:${e.join(`、`)}(声明零本地路径,请在 .env 的 LZI_PROJECT_SCOPE_ROOTS 补 id=绝对路径 映射)`})}else if(s=r.value.filter(e=>i.has(e.id)),c=r.value.filter(e=>!i.has(e.id)).map(e=>e.id),s.length===0)return X({code:`SCOPE_ROOT_UNMAPPED`,message:`范围根未映射:${r.value.map(e=>e.id).join(`、`)}(本机未配置任何范围根映射,请在 .env 的 LZI_PROJECT_SCOPE_ROOTS 补 id=绝对路径 映射)`});let l=Ip(s,e.excludePath,{scopeRoots:i,sourceId:`scope-declarations`});if(!l.ok)return X(l.error);let u=l.value.scopes.flatMap(e=>[...e.projects]),d=[],f=/* @__PURE__ */ new Map;if(e.inspect===!0){let e=await Up(u,16,async e=>Hp(e));for(let t of e)t.ok?f.set(t.value.project,t.value):d.push({scope:t.error.scope,project:t.error.project,message:t.error.message})}let p=u.map(e=>{let t=f.get(e.project);return{scope:e.scope,scopeKind:e.scopeKind,priority:e.priority,sourceId:e.sourceId,project:e.project,path:e.path,remoteUrl:t?.remoteUrl??null,packageName:t?.packageName??null,description:t?.description??null}});return up({registryRoot:n,scopes:l.value.scopes,projects:p,skipped:l.value.skipped,unmappedScopes:c,inspectFailures:d,inspected:e.inspect===!0})}function Gp(e){return typeof e==`object`&&!!e}function Kp(e){return typeof e==`object`&&!!e}function qp(e){return e.split(/&&|\|\||;|\|/).map(e=>e.trim()).filter(e=>e.length>0)}function Jp(e){let t=e.split(/\s+/).filter(e=>e.length>0);for(let e of t)if(!/^[A-Za-z_][A-Za-z0-9_]*=/.test(e))return e;return null}function Yp(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}const Xp=async e=>{let t=d(e,`oxlint.config.ts`);if(!i(t))return null;try{let e=await import(p(t).href);if(!Gp(e))return null;let n=e.default;if(n?.rules===void 0)return null;let r=n.rules[`@longzai-intelligence-oxlint/package-json-plugin/require-build-script-toolchain`];if(!Array.isArray(r)||r.length<2)return null;let i=r[1];return Kp(i)?i:null}catch{return null}},Zp=async e=>{let t=await Xp(e.unitDir);if(t===null)return[];let n=[{key:`dev`,list:Yp(t.dev)},{key:`build`,list:Yp(t.build)},{key:`build:prod`,list:Yp(t.buildProd)}],r=[];for(let t of n){if(t.list.length===0)continue;let n=e.scripts[t.key];if(typeof n==`string`)for(let i of qp(n)){let n=Jp(i);n!==null&&!t.list.includes(n)&&r.push({rule:`scripts/build-toolchain-mismatch`,level:`warning`,script:e.scriptNamePrefix===void 0?t.key:`${e.scriptNamePrefix}:${t.key}`,message:`命令 "${n}" 不在本单元预设允许的清单内(允许 ${t.list.join(`、`)}),build 脚本形态按单元所属预设校验`,hint:`改用本单元预设允许的命令,判据经单元 oxlint 配置流转,依据 ADR 0221`})}}return r},Qp=/* @__PURE__ */ new Set([`cd`,`exit`,`export`,`echo`,`true`,`false`,`set`,`wait`]),$p=e=>e.startsWith(`"`)&&e.endsWith(`"`)&&e.length>=2||e.startsWith(`'`)&&e.endsWith(`'`)&&e.length>=2?e.slice(1,-1):e,em=e=>/^[A-Za-z_][A-Za-z0-9_]*=/.test(e),tm=e=>{let t=e.trim().split(/\s+/).filter(e=>e.length>0).map($p),n=0;for(;n<t.length&&em(t[n]??``);)n++;let r=t[n];return r===void 0||r.length===0?null:{bin:r,args:t.slice(n+1)}},nm=e=>{let t=e.split(/\s*(?:&&|\|\||;)\s*/).map(e=>e.trim()).filter(e=>e.length>0),n=[];for(let e of t){let t=tm(e);t!==null&&!Qp.has(t.bin)&&n.push(t)}return n},rm=e=>/\.(?:mjs|cjs|js|ts|mts|cts)$/.test(e),im=e=>e===`check`||e.endsWith(`:check`),am=e=>{let t=/* @__PURE__ */ new Map;for(let n of nm(e)){if(!n.bin.startsWith(`lzi-`))continue;let e=(t.get(n.bin)??0)+1;if(t.set(n.bin,e),e>=2)return n.bin}return null},om=(e,t)=>im(e)?am(t):null,sm=e=>{let t=[],n=/* @__PURE__ */ new Set,r=t=>e.scriptNamePrefix===void 0?t:`${e.scriptNamePrefix} :: ${t}`;for(let[i,a]of Object.entries(e.scripts)){if(e.exemptedNames.has(i))continue;let o=om(i,a);o!==null&&(n.add(i),t.push({rule:`scripts/check-chain-split`,level:`error`,script:r(i),message:`脚本 ${i} 以串联拆分域门禁,${o} 出现多段`,hint:`check 脚本须为单命令形态,应统一为 ${o} check`}))}return{violations:t,hitScripts:n}},cm=e=>i(e),lm=(e,t)=>{let n=u(t)?t:f(process.cwd(),t);for(;n!==`/`;){let t=d(n,`node_modules`,`.bin`,e);if(cm(t))return t;n=l(n)}let r=process.env.PATH??``;for(let t of r.split(`:`)){if(t.length===0)continue;let n=d(t,e);if(cm(n))return n}return null},um=e=>{let t=e.prober.probe(e.execPath,e.baseArgs);if(t===null){e.notes.push(`${e.binName} 的 help 输出不可解析,跳过命令面校验`);return}let n=[],r=t;for(let t of e.args){if(t.startsWith(`-`)||r===null)break;if(r.has(t))n.push(t),r=e.prober.probe(e.execPath,[...e.baseArgs,...n]);else{e.violations.push({rule:`scripts/dead-command`,level:`error`,script:e.scriptLabel,message:`${e.binName} 无子命令 ${t},实际命令面: ${[...r].join(` `)}`});return}}},dm=e=>{let t=[],n=[],r=t=>e.scriptNamePrefix===void 0?t:`${e.scriptNamePrefix} :: ${t}`;for(let[a,o]of Object.entries(e.scripts)){if(e.skipScripts.has(a))continue;let s=r(a),c=e.presumedAliveValues.has(o),l=nm(o);for(let r of l){if(r.bin===`lzi-dev-cli`&&(r.args[0]===`version`||r.args[0]===`changelog`)){t.push({rule:`scripts/legacy-command`,level:`error`,script:s,message:`${a} 指向已迁出的旧命令面: ${o}`,hint:"version 域归 `lzi-version` 与 `lzi-dependencies`,changelog 域归 `lzi-changelog`"});continue}if(r.bin===`bun`||r.bin===`bunx`){let o=r.args[0];if(r.bin===`bun`&&o!==void 0&&rm(o)){let l=f(e.repoDir,o);if(!i(l)){t.push({rule:`scripts/bin-missing`,level:`error`,script:s,message:`${a} 引用的文件不存在: ${o}`});continue}c||um({prober:e.prober,execPath:process.execPath,baseArgs:[l],args:r.args.slice(1),binName:`bun ${o}`,scriptLabel:s,violations:t,notes:n})}continue}let l=lm(r.bin,e.repoDir);l===null?t.push({rule:`scripts/bin-missing`,level:`error`,script:s,message:`${a} 调用的命令不可解析: ${r.bin}`,hint:`请确认依赖已安装且 bin 已在依赖树或 PATH 中`}):r.bin.startsWith(`lzi-`)&&!c&&um({prober:e.prober,execPath:l,baseArgs:[],args:r.args,binName:r.bin,scriptLabel:s,violations:t,notes:n})}}return{violations:t,notes:n}},fm=(e,t)=>{for(let n of t)if(e===n.legacyPrefix||e.startsWith(`${n.legacyPrefix} `))return n;return null},pm=e=>{let t=[],n=/* @__PURE__ */ new Set,r=t=>e.scriptNamePrefix===void 0?t:`${e.scriptNamePrefix} :: ${t}`;for(let i of e.entries){if(e.exemptedNames.has(i.name))continue;let a=i.severity===`required`?`error`:`warning`,o=e.scripts[i.name];if(o===void 0){t.push({rule:`scripts/missing-required`,level:a,script:r(i.name),message:`缺少标准脚本 ${i.name}`,hint:`标准定义: ${i.definition}`});continue}let s=fm(o,e.legacyMappings);if(s!==null){n.add(i.name),t.push({rule:`scripts/legacy-command`,level:`error`,script:r(i.name),message:`${i.name} 指向已迁出的旧命令面: ${o}`,hint:`${s.note},标准定义: ${i.definition}`});continue}let c=e.extraAlternatives.get(i.name)??[];o===i.definition||(i.alternatives?.includes(o)??!1)||c.includes(o)||t.push({rule:`scripts/definition-drift`,level:a,script:r(i.name),message:`脚本 ${i.name} 定义偏离标准`,hint:`当前: ${o},标准: ${i.definition}`})}return{violations:t,legacyHitScripts:n}},mm=e=>typeof e==`object`&&!!e&&!Array.isArray(e),hm=e=>mm(e)&&Object.values(e).every(e=>typeof e==`string`),gm=e=>{if(!mm(e))return{};let t={};if(typeof e.name==`string`&&(t.name=e.name),hm(e.scripts)&&(t.scripts=e.scripts),hm(e.dependencies)&&(t.dependencies=e.dependencies),hm(e.devDependencies)&&(t.devDependencies=e.devDependencies),Array.isArray(e.workspaces)){let n=e.workspaces.filter(e=>typeof e==`string`);n.length>0&&(t.workspaces=n)}return t},_m=async e=>{if(!i(e))throw Error(`package.json 不存在: ${e}`);let t=await Bun.file(e).text();return gm(JSON.parse(t))},vm=async e=>{let t=f(e.repoDir),n=[],r=[],a={};try{let e=await ep(t);e.configPath!==null&&l(e.configPath)===t&&(a=e.config)}catch(e){n.push({rule:`scripts/config-error`,level:`error`,message:`就地配置加载失败: ${e instanceof Error?e.message:String(e)}`})}let o;try{o=await _m(d(t,`package.json`))}catch(e){return n.push({rule:`scripts/config-error`,level:`error`,message:e instanceof Error?e.message:String(e)}),{repoName:c(t),repoDir:t,profile:`unknown`,scriptCount:0,violations:n,notes:r}}let s=o.scripts??{},u=e.profileOverride??a.profile??(o.workspaces===void 0?`root`:`root-engineering`),p=e.registry.profiles[u]??[],m=new Set((a.exempt??[]).flatMap(e=>e.scripts)),h=/* @__PURE__ */ new Map;for(let e of a.extraAlternatives??[]){let t=h.get(e.script)??[];t.push(e.definition),h.set(e.script,t)}let g=/* @__PURE__ */ new Set;for(let t of Object.values(e.registry.profiles))for(let e of t??[]){g.add(e.definition);for(let t of e.alternatives??[])g.add(t)}for(let e of h.values())for(let t of e)g.add(t);let _=pm({scripts:s,entries:p,legacyMappings:e.registry.legacyMappings,exemptedNames:m,extraAlternatives:h});n.push(..._.violations);let v=sm({scripts:s,exemptedNames:m});if(n.push(...v.violations),u!==`package`)for(let r of e.registry.companions)i(d(t,r.path))||n.push({rule:`scripts/config-companion-missing`,level:r.severity===`required`?`error`:`warning`,message:`兼伴配置文件缺失: ${r.path}`,hint:r.reason});let y=dm({scripts:s,repoDir:t,prober:e.prober,skipScripts:/* @__PURE__ */ new Set([..._.legacyHitScripts,...v.hitScripts]),presumedAliveValues:g});if(n.push(...y.violations),r.push(...y.notes),o.workspaces===void 0){let e=await Zp({scripts:s,unitDir:t});n.push(...e)}if(u===`root-engineering`&&e.skipNested!==!0){let i=e.registry.profiles.package??[];for(let a of ym(t))try{let o=(await _m(d(t,a))).scripts??{};if(Object.keys(o).length===0)continue;let s=pm({scripts:o,entries:i,legacyMappings:e.registry.legacyMappings,exemptedNames:m,extraAlternatives:h,scriptNamePrefix:a});n.push(...s.violations);let c=sm({scripts:o,exemptedNames:m,scriptNamePrefix:a});n.push(...c.violations);let u=dm({scripts:o,repoDir:l(d(t,a)),prober:e.prober,skipScripts:/* @__PURE__ */ new Set([...s.legacyHitScripts,...c.hitScripts]),presumedAliveValues:g,scriptNamePrefix:a});n.push(...u.violations),r.push(...u.notes);let f=await Zp({scripts:o,unitDir:l(d(t,a)),scriptNamePrefix:a});n.push(...f)}catch{r.push(`嵌套 package.json 解析失败,跳过: ${a}`)}}return{repoName:c(t),repoDir:t,profile:u,scriptCount:Object.keys(s).length,violations:n,notes:[...new Set(r)]}},ym=e=>{let t=Bun.spawnSync([`git`,`ls-files`,`--`,`*/package.json`],{cwd:e,stdout:`pipe`,stderr:`pipe`});return t.exitCode===0?(t.stdout?.toString()??``).trim().split(`
212
+ `),m(),i()};return{start:v,stop:y,message:(e=``)=>{s=g(e??s)}}},Kf={red:e=>K.default.red(e),green:e=>K.default.green(e),yellow:e=>K.default.yellow(e),blue:e=>K.default.blue(e),cyan:e=>K.default.cyan(e),magenta:e=>K.default.magenta(e),gray:e=>K.default.gray(e),bold:e=>K.default.bold(e),dim:e=>K.default.dim(e)},qf={async select(e,t){let n=await Vf({message:e,options:t.map(e=>({value:e.value,label:e.label,hint:e.hint}))});return sf(n)&&(Uf(`操作已取消`),process.exit(0)),typeof n==`string`?n:String(n)},async textInput(e,t){let n=await zf({message:e,placeholder:t?.placeholder,defaultValue:t?.defaultValue});return sf(n)&&(Uf(`操作已取消`),process.exit(0)),typeof n==`string`?n:String(n)},async confirm(e,t){let n=await Bf({message:e,initialValue:t?.defaultValue??!1});return sf(n)&&(Uf(`操作已取消`),process.exit(0)),typeof n==`boolean`?n:!!n},spinner(){let e=Gf();return{start(t){e.start(t)},stop(t){e.stop(t)}}},note(e,t){Hf(e,t)},log:{info(e){Wf.info(K.default.blue(e))},success(e){Wf.success(K.default.green(e))},warn(e){Wf.warn(K.default.yellow(e))},error(e){Wf.error(K.default.red(e))},step(e){Wf.step(e)}}},Jf=[`root`,`root-engineering`,`package`],Yf=e=>{let t=u(e)?e:f(process.cwd(),e);for(;t!==`/`;){let e=d(t,`lzi-scripts.config.ts`);if(i(e))return e;t=l(t)}return null},Xf=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Zf=e=>typeof e==`string`&&Jf.includes(e),Qf=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),$f=e=>{if(!Xf(e))return{};let t={};typeof e.registryRoot==`string`&&(t.registryRoot=e.registryRoot),Zf(e.profile)&&(t.profile=e.profile);let n=[];if(Array.isArray(e.exempt))for(let t of e.exempt)Xf(t)&&Qf(t.scripts)&&typeof t.reason==`string`&&t.reason.length>0&&n.push({scripts:t.scripts,reason:t.reason});n.length>0&&(t.exempt=n);let r=[];if(Array.isArray(e.extraAlternatives))for(let t of e.extraAlternatives)Xf(t)&&typeof t.script==`string`&&typeof t.definition==`string`&&r.push({script:t.script,definition:t.definition});return r.length>0&&(t.extraAlternatives=r),t},ep=async(e=process.cwd())=>{let t=Yf(e);if(t===null)return{config:{},configPath:null};try{let e=await import(t),n=typeof e==`object`&&e&&`default`in e?e.default:e;if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`配置 default export 须为对象: ${t}`);return{config:$f(n),configPath:t}}catch(e){throw e instanceof Error&&e.message.startsWith(`配置 default export`)?e:Error(`加载配置文件失败: ${t} ${e instanceof Error?e.message:String(e)}`)}},tp=d(`registry`,`index.ts`),np=e=>typeof e==`string`,rp=e=>typeof e==`object`&&!!e&&!Array.isArray(e),ip=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),ap=e=>e===`required`||e===`recommended`,op=e=>{if(!rp(e)||!np(e.name)||!np(e.definition)||!np(e.family)||!ap(e.severity)||e.alternatives!==void 0&&!ip(e.alternatives))return null;let t={name:e.name,definition:e.definition,severity:e.severity,family:e.family};return e.alternatives!==void 0&&(t.alternatives=e.alternatives),t},sp=e=>{if(!rp(e)||e.formatVersion!==1)return null;let t={};if(rp(e.profiles))for(let[n,r]of Object.entries(e.profiles)){if(n!==`root`&&n!==`root-engineering`&&n!==`package`)continue;let e=[];if(Array.isArray(r))for(let t of r){let n=op(t);n!==null&&e.push(n)}t[n]=e}let n=[];if(Array.isArray(e.companions))for(let t of e.companions)rp(t)&&np(t.path)&&np(t.reason)&&ap(t.severity)&&n.push({path:t.path,severity:t.severity,reason:t.reason});let r=[];if(Array.isArray(e.legacyMappings))for(let t of e.legacyMappings)rp(t)&&np(t.legacyPrefix)&&np(t.targetScript)&&np(t.targetPackage)&&np(t.note)&&r.push({legacyPrefix:t.legacyPrefix,targetScript:t.targetScript,targetPackage:t.targetPackage,note:t.note});return{formatVersion:1,profiles:t,companions:n,legacyMappings:r}},cp=async e=>{let t=u(e)?e:f(process.cwd(),e),n=d(t,tp);if(!i(n))return null;try{let e=await import(n),t=typeof e==`object`&&e&&`default`in e?e.default:e;return sp(t)}catch{return null}},lp=async e=>{if(e.explicit!==void 0&&e.explicit!==``){let t=await cp(e.explicit);return t===null?null:{data:t,root:f(process.cwd(),e.explicit),source:`explicit`}}if(e.configRoot!==void 0&&e.configRoot!==``){let t=await cp(f(e.repoDir,e.configRoot));if(t!==null)return{data:t,root:f(e.repoDir,e.configRoot),source:`config`}}let t=process.env.LZI_SCRIPTS_REGISTRY_ROOT;if(t!==void 0&&t!==``){let e=await cp(t);if(e!==null)return{data:e,root:f(t),source:`env`}}let n=d(l(e.repoDir),`longzai-intelligence-scripts-registry`),r=await cp(n);return r===null?null:{data:r,root:n,source:`sibling`}};function up(e){return{ok:!0,value:e}}function X(e){return{ok:!1,error:e}}const dp=/^[a-z][a-z0-9-]*$/,fp=[`edition-root`,`customer-root`,`single-repo`],pp=pc([`high`,`normal`,`low`]),mp=pc(fp),hp=/\S/,gp=nc({id:U().regex(dp,`范围 id 非法(应为小写字母开头的字母数字连字符)`),kind:mp,remotes:$s(U().regex(hp,`远程位置非法(不得为空串或纯空白)`)).default([]),tags:$s(U().regex(hp,`标签非法(不得为空串或纯空白)`)).default([]),priority:pp.default(`normal`),excludes:$s(U().min(1)).default([]),projectPriorities:dc(U(),pp).default({})}).check(e=>{e.value.kind===`single-repo`&&(e.value.excludes.length>0&&e.issues.push({code:`custom`,input:e.value,path:[`excludes`],message:`single-repo 范围禁用 excludes(声明的即唯一项目,如需排除请改用 edition-root/customer-root)`}),Object.keys(e.value.projectPriorities).length>0&&e.issues.push({code:`custom`,input:e.value,path:[`projectPriorities`],message:`single-repo 范围禁用 projectPriorities(优先级直接设于 scope 级)`}))}),_p=`scopes`,vp=/^[a-z][a-z0-9-]*\.scope\.ts$/;async function yp(e){let t=d(e,_p);if(!i(t))return X({code:`SCOPES_DIR_MISSING`,message:`声明域目录缺失:${t}(应为 project-registry 仓根下 ${_p}/,含 *.scope.ts 声明文件)`});let n=s(t).filter(e=>vp.test(e)).sort((e,t)=>e<t?-1:1);if(n.length===0)return X({code:`SCOPE_REGISTRY_EMPTY`,message:`范围声明域为空:${t}(无 *.scope.ts——范围消失属配置事故,如需清空请显式移除 registryRoot 配置)`});let r=/* @__PURE__ */ new Set,a=[];for(let e of n){let n=d(t,e),i=await import(p(n).href),o=gp.safeParse(i.default);if(!o.success){let e=o.error.issues[0];return X({code:`SCOPE_DECLARATION_INVALID`,message:`范围声明结构非法:${n}(${e?.path.join(`.`)??``} ${e?.message??``})`})}let s=e.replace(/\.scope\.ts$/,``);if(o.data.id!==s)return X({code:`SCOPE_ID_MISMATCH`,message:`范围 id 与文件名不一致:${n}(id=${o.data.id},应为 ${s}——命名即身份)`});if(r.has(o.data.id))return X({code:`SCOPE_ID_CONFLICT`,message:`范围 id 重复:${o.data.id}(声明域内同 id 即同范围,不得重复声明)`});r.add(o.data.id),a.push(o.data)}return up(a)}const bp=`LZI_PROJECT_REGISTRY_ROOT`,xp=`LZI_PROJECT_MARKDOWN_REGISTRY_ROOT`,Sp=`LZI_PROJECT_SCOPE_ROOTS`,Cp=`LZI_PROJECT_MARKDOWN_SCOPE_ROOTS`,wp=/^[a-z][a-z0-9-]*=\/\S+$/;function Tp(e){return e.split(`,`).map(e=>e.trim()).filter(e=>e!==``)}function Ep(e){let t=/* @__PURE__ */ new Map;for(let n of Tp(e)){if(!wp.test(n))return X({message:`范围根映射段非法:${n}(应为 id=绝对路径 形态,id 为小写字母开头的字母数字连字符)`});let e=n.indexOf(`=`),r=n.slice(0,e),i=f(n.slice(e+1));if(t.has(r))return X({message:`范围根映射 id 重复:${r}(同一范围不得重复映射)`});t.set(r,i)}return up(t)}function Dp(e,t,n,r){return e!==void 0&&t!==void 0&&e.trim()!==t.trim()?X({code:`ACQUISITION_ENV_INVALID`,message:`环境变量双名冲突:${n} 与 ${r} 同时在场且值不一致(请统一使用新名 ${n})`,variables:[n,r]}):up({value:e??t,variables:e===void 0?t===void 0?[]:[r]:[n]})}function Op(e=process.env){let t=Dp(e[bp],e[xp],bp,xp);if(!t.ok)return X(t.error);let n=Dp(e[Sp],e[Cp],Sp,Cp);if(!n.ok)return X(n.error);let r;if(n.value.value!==void 0){let e=Ep(n.value.value);if(!e.ok)return X({code:`ACQUISITION_ENV_INVALID`,message:e.error.message,variables:[...n.value.variables]});r=e.value}return up({registryRoot:t.value.value===void 0?void 0:f(t.value.value.trim()),scopeRoots:r})}const kp=/^[A-Za-z0-9_][A-Za-z0-9._-]*$/;function Ap(e,t){return e.name<t.name?-1:+(e.name>t.name)}function jp(e){return i(d(e,`.git`))}function Mp(e,t){return t.get(e.id)}function Np(e,t,n,r){if(n.has(e.id))return X({code:`SCOPE_ID_CONFLICT`,message:`范围 id 冲突:${e.id}(声明域内不得重复)`});n.add(e.id);let a=Mp(e,t);return a===void 0?X({code:`SCOPE_ROOT_UNMAPPED`,message:`范围根未映射:${e.id}(声明零本地路径,请在 .env 的 LZI_PROJECT_SCOPE_ROOTS 或 LZI_PROJECT_MARKDOWN_SCOPE_ROOTS 补 id=绝对路径 映射)`}):i(a)?up({def:e,root:a,sourceId:r}):X({code:`DIR_NOT_FOUND`,message:`范围根不存在:${a}(范围 ${e.id} 机内映射目标)`})}function Pp(e,t){let n=[],r=[];for(let i of[...s(e.root,{withFileTypes:!0})].sort(Ap)){if(i.name.startsWith(`.`))continue;if(!i.isDirectory()){r.push({scope:e.def.id,entry:i.name,reason:`ROOT_FILE`});continue}if(e.def.excludes.includes(i.name)){r.push({scope:e.def.id,entry:i.name,reason:`EXCLUDED`});continue}let a=d(e.root,i.name);t!==void 0&&f(a)===f(t)?r.push({scope:e.def.id,entry:i.name,reason:`EXCLUDED_PATH`}):!jp(a)||!kp.test(i.name)?r.push({scope:e.def.id,entry:i.name,reason:`NOT_A_REPO`}):n.push({scope:e.def.id,scopeKind:e.def.kind,priority:e.def.projectPriorities[i.name]??e.def.priority,sourceId:e.sourceId,project:i.name,path:a})}return{scope:e.def.id,scopeKind:e.def.kind,priority:e.def.priority,scopeRoot:e.root,sourceId:e.sourceId,projects:n,skipped:r}}function Fp(e,t){let n=c(e.root);return t!==void 0&&f(e.root)===f(t)||!jp(e.root)||!kp.test(n)?X({code:`SCOPE_ROOT_INVALID`,message:`single-repo 范围根非法:${e.root}(应为含 .git 的合规项目目录,且不得为排除路径)`}):up({scope:e.def.id,scopeKind:`single-repo`,priority:e.def.priority,scopeRoot:e.root,sourceId:e.sourceId,projects:[{scope:e.def.id,scopeKind:`single-repo`,priority:e.def.priority,sourceId:e.sourceId,project:n,path:e.root}]})}function Ip(e,t,n){let r=[],i=[],a=/* @__PURE__ */ new Set,o=/* @__PURE__ */ new Map;for(let s of e){let e=Np(s,n.scopeRoots,a,n.sourceId);if(!e.ok)return X(e.error);let c,l=[];if(s.kind===`single-repo`){let n=Fp(e.value,t);if(!n.ok)return X(n.error);c=n.value}else{let n=Pp(e.value,t);c=n,l=n.skipped}for(let e of c.projects){let t=o.get(e.project);if(t!==void 0)return X({code:`PROJECT_NAME_CONFLICT`,message:`项目名跨范围冲突:${e.project}(${t} 与 ${e.scope} 均含此名;归档平铺要求项目名全局唯一,可在后登记范围的 excludes 中显式排除)`});o.set(e.project,e.scope)}r.push(c),i.push(...l)}return r.sort((e,t)=>e.scope<t.scope?-1:+(e.scope>t.scope)),i.sort((e,t)=>e.scope===t.scope?e.entry<t.entry?-1:+(e.entry>t.entry):e.scope<t.scope?-1:1),up({scopes:r,skipped:i})}const Lp=n(g);function Rp(e){return typeof e==`object`&&!!e&&`stderr`in e}async function zp(e,t){try{let{stdout:n}=await Lp(`git`,[`-C`,e,...t],{encoding:`utf8`});return{ok:!0,stdout:n.trim()}}catch(e){let t=Rp(e)?e.stderr:void 0;return{ok:!1,stderr:typeof t==`string`?t:String(e)}}}function Bp(e){return typeof e==`object`&&!!e}function Vp(e){let t=d(e,`package.json`);if(!i(t))return{packageName:null,description:null};let n;try{n=JSON.parse(o(t,`utf8`))}catch{return{packageName:null,description:null}}if(!Bp(n))return{packageName:null,description:null};let r=n.name,a=n.description;return{packageName:typeof r==`string`&&r!==``?r:null,description:typeof a==`string`&&a!==``?a:null}}async function Hp(e){let t=await zp(e.path,[`rev-parse`,`--git-dir`]);if(!t.ok)return X({code:`INSPECT_FAILED`,scope:e.scope,project:e.project,message:`仓库健康探测失败:${e.path}(${t.stderr})`});let n=await zp(e.path,[`remote`,`get-url`,`origin`]),r=n.ok&&n.stdout!==``?n.stdout:null,i=Vp(e.path);return up({scope:e.scope,scopeKind:e.scopeKind,priority:e.priority,sourceId:e.sourceId,project:e.project,projectPath:e.path,remoteUrl:r,packageName:i.packageName,description:i.description})}async function Up(e,t,n){let r=Math.max(1,Math.floor(t)),i=[],a=0;for(;a<e.length;){let t=e.slice(a,a+r),o=await Promise.all(t.map((e,t)=>n(e,a+t)));i.push(...o),a+=r}return i}async function Wp(e={}){let t=Op(e.processEnv??process.env);if(!t.ok)return X(t.error);let n=e.registryRoot??t.value.registryRoot;if(n===void 0)return X({code:`ACQUISITION_ENV_INVALID`,message:`未定位 registry 仓根(请在 .env 配置 LZI_PROJECT_REGISTRY_ROOT 或显式传入 registryRoot)`});let r=await yp(n);if(!r.ok)return X(r.error);let i=e.scopeRoots??t.value.scopeRoots??/* @__PURE__ */ new Map,a=e.scopeIds===void 0?void 0:new Set(e.scopeIds),o=a===void 0?[]:[...a].filter(e=>!r.value.some(t=>t.id===e));if(o.length>0)return X({code:`SCOPE_SELECTOR_UNKNOWN`,message:`圈定的范围 id 不在声明域:${o.join(`、`)}(合法范围 id:${r.value.map(e=>e.id).join(`、`)})`});let s=r.value,c=[];if(a!==void 0){s=r.value.filter(e=>a.has(e.id));let e=s.filter(e=>!i.has(e.id)).map(e=>e.id);if(e.length>0)return X({code:`SCOPE_ROOT_UNMAPPED`,message:`范围根未映射:${e.join(`、`)}(声明零本地路径,请在 .env 的 LZI_PROJECT_SCOPE_ROOTS 补 id=绝对路径 映射)`})}else if(s=r.value.filter(e=>i.has(e.id)),c=r.value.filter(e=>!i.has(e.id)).map(e=>e.id),s.length===0)return X({code:`SCOPE_ROOT_UNMAPPED`,message:`范围根未映射:${r.value.map(e=>e.id).join(`、`)}(本机未配置任何范围根映射,请在 .env 的 LZI_PROJECT_SCOPE_ROOTS 补 id=绝对路径 映射)`});let l=Ip(s,e.excludePath,{scopeRoots:i,sourceId:`scope-declarations`});if(!l.ok)return X(l.error);let u=l.value.scopes.flatMap(e=>[...e.projects]),d=[],f=/* @__PURE__ */ new Map;if(e.inspect===!0){let e=await Up(u,16,async e=>Hp(e));for(let t of e)t.ok?f.set(t.value.project,t.value):d.push({scope:t.error.scope,project:t.error.project,message:t.error.message})}let p=u.map(e=>{let t=f.get(e.project);return{scope:e.scope,scopeKind:e.scopeKind,priority:e.priority,sourceId:e.sourceId,project:e.project,path:e.path,remoteUrl:t?.remoteUrl??null,packageName:t?.packageName??null,description:t?.description??null}});return up({registryRoot:n,scopes:l.value.scopes,projects:p,skipped:l.value.skipped,unmappedScopes:c,inspectFailures:d,inspected:e.inspect===!0})}function Gp(e){return typeof e==`object`&&!!e}function Kp(e){return typeof e==`object`&&!!e}function qp(e){return e.split(/&&|\|\||;|\|/).map(e=>e.trim()).filter(e=>e.length>0)}function Jp(e){let t=e.split(/\s+/).filter(e=>e.length>0);for(let e of t)if(!/^[A-Za-z_][A-Za-z0-9_]*=/.test(e))return e;return null}function Yp(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}const Xp=async e=>{let t=d(e,`oxlint.config.ts`);if(!i(t))return null;try{let e=await import(p(t).href);if(!Gp(e))return null;let n=e.default;if(n?.rules===void 0)return null;let r=n.rules[`@longzai-intelligence-oxlint/package-json-plugin/require-build-script-toolchain`];if(!Array.isArray(r)||r.length<2)return null;let i=r[1];return Kp(i)?i:null}catch{return null}},Zp=async e=>{let t=await Xp(e.unitDir);if(t===null)return[];let n=[{key:`dev`,list:Yp(t.dev)},{key:`build`,list:Yp(t.build)},{key:`build:prod`,list:Yp(t.buildProd)}],r=[];for(let t of n){if(t.list.length===0)continue;let n=e.scripts[t.key];if(typeof n==`string`)for(let i of qp(n)){let n=Jp(i);n!==null&&!t.list.includes(n)&&r.push({rule:`scripts/build-toolchain-mismatch`,level:`error`,script:e.scriptNamePrefix===void 0?t.key:`${e.scriptNamePrefix}:${t.key}`,message:`命令 "${n}" 不在本单元预设允许的清单内(允许 ${t.list.join(`、`)}),build 脚本形态按单元所属预设校验`,hint:`改用本单元预设允许的命令,判据经单元 oxlint 配置流转,依据 ADR 0221`})}}return r},Qp=/* @__PURE__ */ new Set([`cd`,`exit`,`export`,`echo`,`true`,`false`,`set`,`wait`]),$p=e=>e.startsWith(`"`)&&e.endsWith(`"`)&&e.length>=2||e.startsWith(`'`)&&e.endsWith(`'`)&&e.length>=2?e.slice(1,-1):e,em=e=>/^[A-Za-z_][A-Za-z0-9_]*=/.test(e),tm=e=>{let t=e.trim().split(/\s+/).filter(e=>e.length>0).map($p),n=0;for(;n<t.length&&em(t[n]??``);)n++;let r=t[n];return r===void 0||r.length===0?null:{bin:r,args:t.slice(n+1)}},nm=e=>{let t=e.split(/\s*(?:&&|\|\||;)\s*/).map(e=>e.trim()).filter(e=>e.length>0),n=[];for(let e of t){let t=tm(e);t!==null&&!Qp.has(t.bin)&&n.push(t)}return n},rm=e=>/\.(?:mjs|cjs|js|ts|mts|cts)$/.test(e),im=e=>e===`check`||e.endsWith(`:check`),am=e=>{let t=/* @__PURE__ */ new Map;for(let n of nm(e)){if(!n.bin.startsWith(`lzi-`))continue;let e=(t.get(n.bin)??0)+1;if(t.set(n.bin,e),e>=2)return n.bin}return null},om=(e,t)=>im(e)?am(t):null,sm=e=>{let t=[],n=/* @__PURE__ */ new Set,r=t=>e.scriptNamePrefix===void 0?t:`${e.scriptNamePrefix} :: ${t}`;for(let[i,a]of Object.entries(e.scripts)){if(e.exemptedNames.has(i))continue;let o=om(i,a);o!==null&&(n.add(i),t.push({rule:`scripts/check-chain-split`,level:`error`,script:r(i),message:`脚本 ${i} 以串联拆分域门禁,${o} 出现多段`,hint:`check 脚本须为单命令形态,应统一为 ${o} check`}))}return{violations:t,hitScripts:n}},cm=e=>i(e),lm=(e,t)=>{let n=u(t)?t:f(process.cwd(),t);for(;n!==`/`;){let t=d(n,`node_modules`,`.bin`,e);if(cm(t))return t;n=l(n)}let r=process.env.PATH??``;for(let t of r.split(`:`)){if(t.length===0)continue;let n=d(t,e);if(cm(n))return n}return null},um=e=>{let t=e.prober.probe(e.execPath,e.baseArgs);if(t===null){e.notes.push(`${e.binName} 的 help 输出不可解析,跳过命令面校验`);return}let n=[],r=t;for(let t of e.args){if(t.startsWith(`-`)||r===null)break;if(r.has(t))n.push(t),r=e.prober.probe(e.execPath,[...e.baseArgs,...n]);else{e.violations.push({rule:`scripts/dead-command`,level:`error`,script:e.scriptLabel,message:`${e.binName} 无子命令 ${t},实际命令面: ${[...r].join(` `)}`});return}}},dm=e=>{let t=[],n=[],r=t=>e.scriptNamePrefix===void 0?t:`${e.scriptNamePrefix} :: ${t}`;for(let[a,o]of Object.entries(e.scripts)){if(e.skipScripts.has(a))continue;let s=r(a),c=e.presumedAliveValues.has(o),l=nm(o);for(let r of l){if(r.bin===`lzi-dev-cli`&&(r.args[0]===`version`||r.args[0]===`changelog`)){t.push({rule:`scripts/legacy-command`,level:`error`,script:s,message:`${a} 指向已迁出的旧命令面: ${o}`,hint:"version 域归 `lzi-version` 与 `lzi-dependencies`,changelog 域归 `lzi-changelog`"});continue}if(r.bin===`bun`||r.bin===`bunx`){let o=r.args[0];if(r.bin===`bun`&&o!==void 0&&rm(o)){let l=f(e.repoDir,o);if(!i(l)){t.push({rule:`scripts/bin-missing`,level:`error`,script:s,message:`${a} 引用的文件不存在: ${o}`});continue}c||um({prober:e.prober,execPath:process.execPath,baseArgs:[l],args:r.args.slice(1),binName:`bun ${o}`,scriptLabel:s,violations:t,notes:n})}continue}let l=lm(r.bin,e.repoDir);l===null?t.push({rule:`scripts/bin-missing`,level:`error`,script:s,message:`${a} 调用的命令不可解析: ${r.bin}`,hint:`请确认依赖已安装且 bin 已在依赖树或 PATH 中`}):r.bin.startsWith(`lzi-`)&&!c&&um({prober:e.prober,execPath:l,baseArgs:[],args:r.args,binName:r.bin,scriptLabel:s,violations:t,notes:n})}}return{violations:t,notes:n}},fm=(e,t)=>{for(let n of t)if(e===n.legacyPrefix||e.startsWith(`${n.legacyPrefix} `))return n;return null},pm=e=>{let t=[],n=/* @__PURE__ */ new Set,r=t=>e.scriptNamePrefix===void 0?t:`${e.scriptNamePrefix} :: ${t}`;for(let i of e.entries){if(e.exemptedNames.has(i.name))continue;let a=i.severity===`required`?`error`:`warning`,o=e.scripts[i.name];if(o===void 0){t.push({rule:`scripts/missing-required`,level:a,script:r(i.name),message:`缺少标准脚本 ${i.name}`,hint:`标准定义: ${i.definition}`});continue}let s=fm(o,e.legacyMappings);if(s!==null){n.add(i.name),t.push({rule:`scripts/legacy-command`,level:`error`,script:r(i.name),message:`${i.name} 指向已迁出的旧命令面: ${o}`,hint:`${s.note},标准定义: ${i.definition}`});continue}let c=e.extraAlternatives.get(i.name)??[];o===i.definition||(i.alternatives?.includes(o)??!1)||c.includes(o)||t.push({rule:`scripts/definition-drift`,level:a,script:r(i.name),message:`脚本 ${i.name} 定义偏离标准`,hint:`当前: ${o},标准: ${i.definition}`})}return{violations:t,legacyHitScripts:n}},mm=e=>typeof e==`object`&&!!e&&!Array.isArray(e),hm=e=>mm(e)&&Object.values(e).every(e=>typeof e==`string`),gm=e=>{if(!mm(e))return{};let t={};if(typeof e.name==`string`&&(t.name=e.name),hm(e.scripts)&&(t.scripts=e.scripts),hm(e.dependencies)&&(t.dependencies=e.dependencies),hm(e.devDependencies)&&(t.devDependencies=e.devDependencies),Array.isArray(e.workspaces)){let n=e.workspaces.filter(e=>typeof e==`string`);n.length>0&&(t.workspaces=n)}return t},_m=async e=>{if(!i(e))throw Error(`package.json 不存在: ${e}`);let t=await Bun.file(e).text();return gm(JSON.parse(t))},vm=async e=>{let t=f(e.repoDir),n=[],r=[],a={};try{let e=await ep(t);e.configPath!==null&&l(e.configPath)===t&&(a=e.config)}catch(e){n.push({rule:`scripts/config-error`,level:`error`,message:`就地配置加载失败: ${e instanceof Error?e.message:String(e)}`})}let o;try{o=await _m(d(t,`package.json`))}catch(e){return n.push({rule:`scripts/config-error`,level:`error`,message:e instanceof Error?e.message:String(e)}),{repoName:c(t),repoDir:t,profile:`unknown`,scriptCount:0,violations:n,notes:r}}let s=o.scripts??{},u=e.profileOverride??a.profile??(o.workspaces===void 0?`root`:`root-engineering`),p=e.registry.profiles[u]??[],m=new Set((a.exempt??[]).flatMap(e=>e.scripts)),h=/* @__PURE__ */ new Map;for(let e of a.extraAlternatives??[]){let t=h.get(e.script)??[];t.push(e.definition),h.set(e.script,t)}let g=/* @__PURE__ */ new Set;for(let t of Object.values(e.registry.profiles))for(let e of t??[]){g.add(e.definition);for(let t of e.alternatives??[])g.add(t)}for(let e of h.values())for(let t of e)g.add(t);let _=pm({scripts:s,entries:p,legacyMappings:e.registry.legacyMappings,exemptedNames:m,extraAlternatives:h});n.push(..._.violations);let v=sm({scripts:s,exemptedNames:m});if(n.push(...v.violations),u!==`package`)for(let r of e.registry.companions)i(d(t,r.path))||n.push({rule:`scripts/config-companion-missing`,level:r.severity===`required`?`error`:`warning`,message:`兼伴配置文件缺失: ${r.path}`,hint:r.reason});let y=dm({scripts:s,repoDir:t,prober:e.prober,skipScripts:/* @__PURE__ */ new Set([..._.legacyHitScripts,...v.hitScripts]),presumedAliveValues:g});if(n.push(...y.violations),r.push(...y.notes),o.workspaces===void 0){let e=await Zp({scripts:s,unitDir:t});n.push(...e)}if(u===`root-engineering`&&e.skipNested!==!0){let i=e.registry.profiles.package??[];for(let a of ym(t))try{let o=(await _m(d(t,a))).scripts??{};if(Object.keys(o).length===0)continue;let s=pm({scripts:o,entries:i,legacyMappings:e.registry.legacyMappings,exemptedNames:m,extraAlternatives:h,scriptNamePrefix:a});n.push(...s.violations);let c=sm({scripts:o,exemptedNames:m,scriptNamePrefix:a});n.push(...c.violations);let u=dm({scripts:o,repoDir:l(d(t,a)),prober:e.prober,skipScripts:/* @__PURE__ */ new Set([...s.legacyHitScripts,...c.hitScripts]),presumedAliveValues:g,scriptNamePrefix:a});n.push(...u.violations),r.push(...u.notes);let f=await Zp({scripts:o,unitDir:l(d(t,a)),scriptNamePrefix:a});n.push(...f)}catch{r.push(`嵌套 package.json 解析失败,跳过: ${a}`)}}return{repoName:c(t),repoDir:t,profile:u,scriptCount:Object.keys(s).length,violations:n,notes:[...new Set(r)]}},ym=e=>{let t=Bun.spawnSync([`git`,`ls-files`,`--`,`*/package.json`],{cwd:e,stdout:`pipe`,stderr:`pipe`});return t.exitCode===0?(t.stdout?.toString()??``).trim().split(`
213
213
  `).map(e=>e.trim()).filter(t=>t.length>0&&i(d(e,t))):[]},bm=e=>{let t=e.split(`
214
214
  `),n=t.findIndex(e=>e.trim()===`Commands:`);if(n===-1)return null;let r=/* @__PURE__ */ new Set;for(let e=n+1;e<t.length;e++){let n=t[e]??``;if(n.trim().length===0||!n.startsWith(` `))break;let i=n.trim().split(/\s+/)[0]??``;i.length===0||i.startsWith(`-`)||r.add(i)}return r.size===0?null:r};var xm=class{cache=/* @__PURE__ */ new Map;isolatedCwd=null;ensureIsolatedCwd(){return this.isolatedCwd===null&&(this.isolatedCwd=a(d(t(),`lzi-scripts-probe-`))),this.isolatedCwd}probe(e,t=[]){let n=`${e}::${t.join(` `)}`,r=this.cache.get(n);if(r!==void 0)return r;let i=``;try{let n=Bun.spawnSync([e,...t,`--help`],{cwd:this.ensureIsolatedCwd(),stdout:`pipe`,stderr:`pipe`,timeout:8e3}),r=n.stdout?.toString()??``;i=r.length>0?r:n.stderr?.toString()??``}catch{i=``}let a=bm(i);return this.cache.set(n,a),a}};const Sm=(e,t)=>Bun.spawnSync([`git`,`diff`,`--quiet`,`HEAD`,`--`,t],{cwd:e,stdout:`pipe`,stderr:`pipe`}).exitCode===0,Cm=(e,t,n)=>Bun.spawnSync([`git`,`commit`,...t,`-m`,n],{cwd:e,stdout:`pipe`,stderr:`pipe`}).exitCode===0,wm=async(e,t,n)=>{let r=0,i=async()=>{for(;r<e.length;){let t=e[r];if(r++,t===void 0)break;await n(t)}},a=Array.from({length:Math.min(t,e.length)},()=>i());await Promise.all(a)},Z={RED:`\x1B[0;31m`,GREEN:`\x1B[0;32m`,YELLOW:`\x1B[1;33m`,BLUE:`\x1B[0;34m`,RESET:`\x1B[0m`};function Tm(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 Q(...e){process.stdout.write(`${Tm(e)}\n`)}function $(...e){process.stderr.write(`${Tm(e)}\n`)}function Em(e){let t=e;for(;;){if(i(d(t,`longzai-intelligence-globals`))||i(d(t,`lzi-architecture.yaml`)))return t;let e=d(t,`..`);if(e===t)return;t=e}}function Dm(e){return e.filter(e=>i(d(e.path,`package.json`))).map(e=>({name:e.project,dir:e.path}))}async function Om(e){if(e.projectScope!==void 0){let t=await Wp({scopeIds:[e.projectScope]});return t.ok||($(`错误: 项目范围解析失败: ${t.error.message}`),$(`提示: 请确认 .env 配置 LZI_PROJECT_REGISTRY_ROOT 与 LZI_PROJECT_SCOPE_ROOTS`),process.exit(1)),{registryRoot:t.value.registryRoot,scopeId:e.projectScope,projects:Dm(t.value.projects),source:`env`}}let t=Em(e.cwd??process.cwd());t===void 0&&($(`错误: 未定位产品群聚合根(一级子目录应存在 longzai-intelligence-globals 仓)`),$(`提示: 请自产品群内任意仓库运行,或使用 --project-scope <id> 显式圈定范围`),process.exit(1));let n=c(t),r=d(t,`longzai-intelligence-project-registry`);i(d(r,`scopes`))||($(`错误: registry 声明域缺失: ${d(r,`scopes`)}`),$(`提示: 请确认 longzai-intelligence-project-registry 仓已在聚合根就位`),process.exit(1));let a=await Wp({registryRoot:r,scopeIds:[n],scopeRoots:/* @__PURE__ */ new Map([[n,t]])});return a.ok||($(`错误: 项目范围解析失败: ${a.error.message}`),process.exit(1)),{registryRoot:r,scopeId:n,projects:Dm(a.value.projects),source:`structure`}}const km=async e=>{let t=e.concurrency??10,n=await Om({projectScope:e.projectScope}),r=n.projects;if(Q(`${Z.BLUE}═══ lzi-scripts check-across ═══${Z.RESET}`),Q(`项目获取来源: ${n.source===`structure`?`结构锚点(cwd 上溯聚合根)`:`显式圈定(--project-scope)`}`),Q(`registry: ${n.registryRoot}`),Q(`项目范围: ${n.scopeId}`),Q(`发现 ${r.length} 个子项目,并发审计(并发 ${t})...`),Q(``),r.length===0){Q(`${Z.YELLOW}聚合根下无含 package.json 的子项目,结束${Z.RESET}`);return}let i=await lp({explicit:e.registry,repoDir:r[0]?.dir??n.registryRoot});i===null&&($(`错误: 未找到标准脚本注册真源仓`),$(`提示: 使用 --registry <path> 显式指定,或设置 LZI_SCRIPTS_REGISTRY_ROOT,或将真源仓克隆为聚合根下的兄弟目录`),process.exit(2));let a=new xm,o=[],s=0;await wm(r,t,async e=>{let t=await vm({repoDir:e.dir,registry:i.data,prober:a});o.push(t),s++;let n=t.violations.some(e=>e.level===`error`)?`${Z.RED}✗${Z.RESET}`:t.violations.length>0?`${Z.YELLOW}⚠${Z.RESET}`:`${Z.GREEN}✓${Z.RESET}`,c=t.violations.filter(e=>e.level===`error`).length,l=t.violations.length-c;Q(` [${s}/${r.length}] ${n} ${e.name}(${c} 违例 / ${l} 警告)`)}),Q(``);let c=o.filter(e=>e.violations.some(e=>e.level===`error`)),l=o.filter(e=>e.violations.length>0&&!e.violations.some(e=>e.level===`error`)),u=o.filter(e=>e.violations.length===0);if(Q(`${Z.BLUE}═══ 普查结果 ═══${Z.RESET}`),e.format===`json`)Q(JSON.stringify({rootDir:n.registryRoot,total:o.length,clean:u.length,warnRepos:l.length,errorRepos:c.length,audits:o},null,2));else{Q(`${Z.RED}✗ 存在违例: ${c.length}${Z.RESET}`);for(let e of c){let t=e.violations.filter(e=>e.level===`error`);Q(` ${e.repoName}`);for(let e of t)Q(` ${e.rule}${e.script===void 0?``:` [${e.script}]`}: ${e.message}`)}Q(``),Q(`${Z.BLUE}汇总: ${u.length} 干净 / ${l.length} 警告 / ${c.length} 违例(共 ${o.length} 仓)${Z.RESET}`)}process.exitCode=+(c.length>0)},Am=e=>{Q(`${Z.BLUE}═══ lzi-scripts check ═══${Z.RESET}`),Q(`目标仓: ${e.repoName}(${e.repoDir})`),Q(`审计档案: ${e.profile}`),Q(`脚本总数: ${e.scriptCount}`),Q(``);let t=e.violations.filter(e=>e.level===`error`),n=e.violations.filter(e=>e.level===`warning`);if(t.length===0&&n.length===0&&e.notes.length===0)Q(`${Z.GREEN}✓ 全部通过${Z.RESET}`);else{for(let e of t)Q(`${Z.RED}✗ ${e.rule}${e.script===void 0?``:` [${e.script}]`}${Z.RESET}`),Q(` ${e.message}`),e.hint!==void 0&&Q(` ${e.hint}`);for(let e of n)Q(`${Z.YELLOW}⚠ ${e.rule}${e.script===void 0?``:` [${e.script}]`}${Z.RESET}`),Q(` ${e.message}`),e.hint!==void 0&&Q(` ${e.hint}`);for(let t of e.notes)Q(`${Z.YELLOW}· ${t}${Z.RESET}`);Q(``),Q(`${Z.BLUE}汇总: ${t.length} 违例 / ${n.length} 警告 / ${e.notes.length} 说明${Z.RESET}`)}},jm=async e=>{try{let t=await ep(process.cwd()),n=t.configPath===null?process.cwd():l(t.configPath),r=await lp({explicit:e.registry,configRoot:t.config.registryRoot,repoDir:n});r===null&&($(`错误: 未找到标准脚本注册真源仓`),$(`提示: 使用 --registry <path> 显式指定真源仓根目录`),$(`提示: 或在就地配置 lzi-scripts.config.ts 声明 registryRoot`),$(`提示: 或在 .env 设置 LZI_SCRIPTS_REGISTRY_ROOT`),$(`提示: 或将真源仓克隆为同工作区兄弟目录 longzai-intelligence-scripts-registry`),process.exit(2));let i=await vm({repoDir:n,registry:r.data,prober:new xm});e.format===`json`?Q(JSON.stringify({repo:i.repoName,repoDir:i.repoDir,profile:i.profile,scriptCount:i.scriptCount,registrySource:r.source,violations:i.violations,notes:i.notes},null,2)):Am(i);let a=i.violations.filter(e=>e.level===`error`).length;process.exitCode=+(a>0)}catch(e){$(`错误: ${e instanceof Error?e.message:String(e)}`),process.exit(2)}},Mm=(e,t)=>{for(let n of Object.values(t.profiles))for(let t of n??[])if(t.name===e)return t;return null},Nm=(e,t)=>{if(t.length===0)return e;let n=new Set(e.split(/\s+/)),r=t.split(/\s+/).filter(e=>!(e.startsWith(`-`)&&n.has(e)));return r.length===0?e:`${e} ${r.join(` `)}`},Pm=(e,t)=>{let n=fm(e,t.legacyMappings);if(n===null)return null;let r=Mm(n.targetScript,t);return r===null?null:Nm(r.definition,e.slice(n.legacyPrefix.length).trim())},Fm=(e,t,n)=>{let r=om(e,t);return r===null?null:Mm(e,n)?.definition??`${r} check`},Im=(e,t)=>{let n=[];for(let[r,i]of Object.entries(e)){let e=Pm(i,t);if(e!==null&&e!==i){n.push({scriptName:r,from:i,to:e,kind:`legacy`});continue}let a=Fm(r,i,t);a!==null&&a!==i&&n.push({scriptName:r,from:i,to:a,kind:`check-chain-split`})}return n},Lm=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Rm=async(e,t)=>{let n=await Bun.file(e).text(),r=JSON.parse(n);if(!Lm(r))throw Error(`package.json 顶层非对象: ${e}`);let i={};if(Lm(r.scripts))for(let[e,t]of Object.entries(r.scripts))typeof t==`string`&&(i[e]=t);for(let e of t)i[e.scriptName]=e.to;return r.scripts=i,await Bun.write(e,`${JSON.stringify(r,null,2)}\n`),t.length},zm=async(e,t,n,r)=>{try{let i=(await _m(d(e.dir,`package.json`))).scripts??{},a=Im(i,t);return a.length===0?{name:e.name,status:`skipped-nochange`,rewrites:a}:Sm(e.dir,`package.json`)?r?{name:e.name,status:`success`,rewrites:a}:(await Rm(d(e.dir,`package.json`),a),Cm(e.dir,[`package.json`],n)?{name:e.name,status:`success`,rewrites:a}:{name:e.name,status:`failed`,rewrites:a,reason:`git commit 失败,保留现场待人工介入`}):{name:e.name,status:`skipped-dirty`,rewrites:a,reason:`package.json 已有未提交改动`}}catch(t){return{name:e.name,status:`failed`,rewrites:[],reason:t instanceof Error?t.message:String(t)}}},Bm=async e=>{let t=e.concurrency??10,n=await Om({projectScope:e.projectScope}),r=n.projects,i=await lp({explicit:e.registry,repoDir:r[0]?.dir??n.registryRoot});i===null&&($(`错误: 未找到标准脚本注册真源仓(同 check-across 命令解析链提示)`),process.exit(2));let a=e.message??`chore: 迁移标准化脚本至新命令面`;Q(`${Z.BLUE}═══ lzi-scripts fix-across ═══${Z.RESET}`),Q(`聚合根: ${n.registryRoot}`),Q(`发现 ${r.length} 个子项目,并发改写(并发 ${t})...`),e.dryRun&&Q(`${Z.YELLOW}[dry-run] 预览模式,不写文件、不提交${Z.RESET}`),Q(``);let o=[],s=0;await wm(r,t,async t=>{let n=await zm(t,i.data,a,e.dryRun);o.push(n),s++;let c=n.status===`success`?`${Z.GREEN}✓${Z.RESET}`:n.status===`failed`?`${Z.RED}✗${Z.RESET}`:`·`;Q(` [${s}/${r.length}] ${c} ${t.name}`)}),Q(``);let c=o.filter(e=>e.status===`success`),l=o.filter(e=>e.status===`skipped-dirty`),u=o.filter(e=>e.status===`skipped-nochange`),d=o.filter(e=>e.status===`failed`);Q(`${Z.BLUE}═══ 处理结果 ═══${Z.RESET}`);let f=e.dryRun?`将改写`:`已改写并提交`;Q(`${Z.GREEN}✓ ${f}: ${c.length}${Z.RESET}`);for(let e of c){Q(` ${e.name}`);for(let t of e.rewrites)Q(` ${t.scriptName}: ${t.from} → ${t.to}`)}if(l.length>0){Q(``),Q(`${Z.YELLOW}⚠ 跳过(文件已改动): ${l.length}${Z.RESET}`);for(let e of l)Q(` ${e.name}: ${e.reason}`)}if(u.length>0&&(Q(``),Q(`跳过(无可改写形态): ${u.length}`)),d.length>0){Q(``),Q(`${Z.RED}✗ 失败(需人工介入): ${d.length}${Z.RESET}`);for(let e of d)Q(` ${e.name}: ${e.reason}`)}Q(``),Q(`${Z.BLUE}汇总: ${c.length} ${f} / ${l.length} 跳过(dirty) / ${u.length} 跳过(无匹配) / ${d.length} 失败${Z.RESET}`),!e.dryRun&&c.length>0&&(Q(``),Q(`下一步:推送到远程`),Q(` bun push-all`)),d.length>0&&(process.exitCode=1)},Vm=e=>e===`legacy`?`遗留死链`:`拆分串联`,Hm=async e=>{try{let t=await ep(process.cwd()),n=t.configPath===null?process.cwd():l(t.configPath),r=await lp({explicit:e.registry,configRoot:t.config.registryRoot,repoDir:n});r===null&&($(`错误: 未找到标准脚本注册真源仓(同 check 命令解析链提示)`),process.exit(2));let a=await _m(d(n,`package.json`)),o=a.scripts??{},s=Im(o,r.data);if(s.length===0){Q(`${Z.GREEN}✓ 未发现可改写形态(遗留死链或拆分串联),无需改写${Z.RESET}`);return}Q(`${Z.BLUE}═══ lzi-scripts fix ═══${Z.RESET}`);for(let e of s)Q(` ${e.scriptName}(${Vm(e.kind)})`),Q(` ${Z.RED}- ${e.from}${Z.RESET}`),Q(` ${Z.GREEN}+ ${e.to}${Z.RESET}`);if(e.dryRun)Q(``),Q(`${Z.YELLOW}[dry-run] 预览模式,不写文件${Z.RESET}`);else{let e=await Rm(d(n,`package.json`),s);Q(``),Q(`${Z.GREEN}✓ 已写入 package.json(${e} 条改写)${Z.RESET}`)}let c=/* @__PURE__ */ new Set;for(let e of s){if(e.kind!==`legacy`)continue;let t=fm(e.from,r.data.legacyMappings);t!==null&&c.add(t.targetPackage)}for(let e of c)a.devDependencies?.[e]===void 0&&a.dependencies?.[e]===void 0&&Q(`${Z.YELLOW}⚠ 依赖提示: ${e} 未在 package.json 声明,请补装${Z.RESET}`);for(let e of r.data.companions)i(d(n,e.path))||Q(`${Z.YELLOW}⚠ 兼伴提示: ${e.path} 缺失(${e.reason})${Z.RESET}`)}catch(e){$(`错误: ${e instanceof Error?e.message:String(e)}`),process.exit(2)}},Um=async()=>{let e=d(process.cwd(),`lzi-scripts.config.ts`);i(e)?(Q(`${Z.YELLOW}⚠ 配置文件已存在,拒绝覆盖: ${e}${Z.RESET}`),process.exitCode=1):(await Bun.write(e,`import { defineConfig } from '@longzai-intelligence-scripts/config';
215
215
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-scripts/cli",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "description": "Longzai Intelligence 标准脚本审计 CLI(lzi-scripts)",
5
5
  "license": "UNLICENSED",
6
6
  "bin": {
@@ -36,7 +36,7 @@
36
36
  "dependencies": {
37
37
  "@longzai-intelligence-cli/core": "^0.0.10",
38
38
  "@longzai-intelligence-cli/standard": "^0.0.10",
39
- "@longzai-intelligence-scripts/core": "0.0.9",
39
+ "@longzai-intelligence-scripts/core": "0.0.10",
40
40
  "zod": "^4.4.3"
41
41
  }
42
42
  }