@longzai-intelligence-readme/core 0.0.1 → 0.0.2

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
@@ -1,3 +1,3 @@
1
- import{readFileSync as e,readdirSync as t,statSync as n}from"node:fs";import{join as r}from"node:path";import{RULES_SPEC_POINTER as i,RULES_VERSION as a}from"@longzai-intelligence-readme/config";const o=[{id:`E-BRAND-CN`,severity:`error`,pattern:/龙智|龙仔智能|隆智|龙崽/g,message:`中文品牌译名——品牌唯一正确表达为 "Longzai Intelligence",任何中文译名禁止`},{id:`E-SHORT-SCOPE`,severity:`error`,pattern:/@lzi\//g,message:`短 scope 包名——包名一律长形式 @longzai-intelligence-*`},{id:`E-BAD-ABBR`,severity:`error`,pattern:/\bLI\b|\bLZ\b/g,message:`禁用缩写——品牌缩写仅 LZI/lzi`},{id:`E-INTERNAL-NET`,severity:`error`,pattern:/\b(?:10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|172\.(?:1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3})\b|\b[\w-]+\.(?:local|internal|corp)\b/g,message:`内网地址/域名——README 按发布口径处理,不得含内网信息(示例也用占位形态)`},{id:`E-ABS-PATH`,severity:`error`,pattern:/\/Volumes\/|\/Users\/[A-Za-z0-9_-]+|\/home\/[A-Za-z0-9_-]+/g,message:`本机绝对路径——示例一律用 ~/ 或 <占位> 形态`},{id:`E-EMAIL`,severity:`error`,pattern:/[\w.+-]+@(?!([\w-]+\.)*example\.(?:com|org|net)\b)[A-Za-z][\w-]*(?:\.[\w-]+)*\.[A-Za-z]{2,}/g,message:`邮箱形态——README 不含联系方式(文档示例域 example.* 及其子域除外)`},{id:`E-CREDENTIAL`,severity:`error`,pattern:/(?:api[_-]?key|secret|passwd|password|token)\s*[:=]\s*(?!['"]?(?:your-|xxx|<))\S+/gi,message:`凭据形态——密钥/token/口令及其实值不得出现(占位示例除外)`},{id:`E-SCALE`,severity:`error`,pattern:/\d{2,}\s*个(?:子)?(?:项目|仓库|仓)/g,message:`内部规模数字(「N 个项目」类)——不入发布 README`},{id:`E-OPS`,severity:`error`,pattern:/\bbun\s+(?:push-all|push|version:upgrade-across|version:upgrade|agent:sync|vscode:sync)\b/g,message:`跨仓运维命令——产品群级操作不入 README`},{id:`E-ORG-COMPARE`,severity:`error`,pattern:/与\s*`?@longzai-intelligence-[a-z-]+`?(?:[、,]\s*`?@longzai-intelligence-[a-z-]+`?)*\s*同级/g,message:`内部组织结构对比表述——不入发布 README`},{id:`E-GIT-REMOTE`,severity:`error`,pattern:/git@[A-Za-z0-9.-]+:[\w./-]+|longzai-tech\b/g,message:`内部 git remote/组织账号/托管位置——不入 README`},{id:`E-DEV-CONSTRAINT`,severity:`error`,pattern:/禁止在[^,。\n]{0,12}(?:运行|执行)|请在(?:子包|各应用目录|应用目录|包目录|各仓)/g,message:`内部工程约束——面向仓内开发者的禁令/流程,迁内部承接文件`},{id:`E-MIT`,severity:`error`,pattern:/\[MIT\]|MIT License/gi,message:`MIT 表述——默认 UNLICENSED,禁默认 MIT`}],s=[{id:`W-MECH`,severity:`warn`,pattern:/\.lzi\/|\.lzi\b|lzi-architecture(?:\.sample)?\.yaml|docs\/ledgers|lzi-[a-z-]+\.config\.ts/g,message:`内部治理机制命名/路径(线索级,人工判定;机制即本仓产品者可豁免登记)`},{id:`W-TOOL`,severity:`warn`,pattern:/\blzi-(?:builder|projects|dev-cli|release|env|git|decision|issues|vscode|agent|npm-registry|bun)\b/g,message:`内部工具名(线索级,人工判定)`},{id:`W-ADR`,severity:`warn`,pattern:/ADR[\s-]?\d{3,4}/g,message:`ADR 编号引用(线索级,人工判定;指向本仓决策记录者可豁免登记)`}],c=[...o,...s],l=/^#\s+Longzai Intelligence(\s|$)/,u=/^#\s+/,d=/^#{1,3}\s*(?:许可证|贡献|License|Contributing)\s*$/,f=/^#{1,3}\s*(?:创建初衷|工作范围)\s*$/,p=/[│├└]/,m=/#\s+\S/,h=3,g=40,_=8,v=120,y=/* @__PURE__ */ new Set([`node_modules`,`dist`,`out`,`.turbo`,`.git`,`build`,`.next`,`coverage`,`.cache`,`target`,`.venv`]),b=[`packages`,`apps`],x=e=>{let t=[];C(r(e,`README.md`))&&t.push({relPath:`README.md`,kind:`root`});for(let n of b){let i=r(e,n);w(i)&&S(i,n,0,t)}return t},S=(e,n,i,a)=>{if(i>3)return;let o;try{o=t(e,{withFileTypes:!0})}catch{return}for(let t of o){if(y.has(t.name))continue;let o=`${n}/${t.name}`;t.isDirectory()?S(r(e,t.name),o,i+1,a):t.isFile()&&t.name===`README.md`&&a.push({relPath:o,kind:`nested`})}},C=e=>{try{return n(e).isFile()}catch{return!1}},w=e=>{try{return n(e).isDirectory()}catch{return!1}},T=(e,t)=>{let n=[],r=t.split(`
1
+ import{readFileSync as e,readdirSync as t,statSync as n}from"node:fs";import{join as r}from"node:path";import{RULES_SPEC_POINTER as i,RULES_VERSION as a}from"@longzai-intelligence-readme/config";const o=[{id:`E-BRAND-CN`,severity:`error`,pattern:/龙智|龙仔智能|隆智|龙崽/g,message:`中文品牌译名——品牌唯一正确表达为 "Longzai Intelligence",任何中文译名禁止`},{id:`E-SHORT-SCOPE`,severity:`error`,pattern:/@lzi\//g,message:`短 scope 包名——包名一律长形式 @longzai-intelligence-*`},{id:`E-BAD-ABBR`,severity:`error`,pattern:/\bLI\b|\bLZ\b/g,message:`禁用缩写——品牌缩写仅 LZI/lzi`},{id:`E-INTERNAL-NET`,severity:`error`,pattern:/\b(?:10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|172\.(?:1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3})\b|\b[\w-]+\.(?:local|internal|corp)\b/g,message:`内网地址/域名——README 按发布口径处理,不得含内网信息(示例也用占位形态)`},{id:`E-ABS-PATH`,severity:`error`,pattern:/\/Volumes\/|\/Users\/[A-Za-z0-9_-]+|\/home\/[A-Za-z0-9_-]+/g,message:`本机绝对路径——示例一律用 ~/ 或 <占位> 形态`},{id:`E-EMAIL`,severity:`error`,pattern:/[\w.+-]+@(?!([\w-]+\.)*example\.(?:com|org|net)\b)[A-Za-z][\w-]*(?:\.[\w-]+)*\.[A-Za-z]{2,}/g,message:`邮箱形态——README 不含联系方式(文档示例域 example.* 及其子域除外)`},{id:`E-CREDENTIAL`,severity:`error`,pattern:/(?:api[_-]?key|secret|passwd|password|token)\s*[:=]\s*(?!['"]?(?:your-|xxx|<))\S+/gi,message:`凭据形态——密钥/token/口令及其实值不得出现(占位示例除外)`},{id:`E-SCALE`,severity:`error`,pattern:/\d{2,}\s*个(?:子)?(?:项目|仓库|仓)/g,message:`内部规模数字(「N 个项目」类)——不入发布 README`},{id:`E-OPS`,severity:`error`,pattern:/\bbun\s+(?:push-all|push|version:upgrade-across|version:upgrade|agent:sync|vscode:sync)\b/g,message:`跨仓运维命令——产品群级操作不入 README`},{id:`E-ORG-COMPARE`,severity:`error`,pattern:/与\s*`?@longzai-intelligence-[a-z-]+`?(?:[、,]\s*`?@longzai-intelligence-[a-z-]+`?)*\s*同级/g,message:`内部组织结构对比表述——不入发布 README`},{id:`E-GIT-REMOTE`,severity:`error`,pattern:/git@[A-Za-z0-9.-]+:[\w./-]+|longzai-tech\b/g,message:`内部 git remote/组织账号/托管位置——不入 README`},{id:`E-DEV-CONSTRAINT`,severity:`error`,pattern:/禁止在[^,。\n]{0,12}(?:运行|执行)|请在(?:子包|各应用目录|应用目录|包目录|各仓)/g,message:`内部工程约束——面向仓内开发者的禁令/流程,迁内部承接文件`},{id:`E-MIT`,severity:`error`,pattern:/\[MIT\]|MIT License/gi,message:`MIT 表述——默认 UNLICENSED,禁默认 MIT`}],s=[{id:`W-MECH`,severity:`warn`,pattern:/\.lzi\/|\.lzi\b|lzi-architecture(?:\.sample)?\.yaml|docs\/ledgers|lzi-[a-z-]+\.config\.ts/g,message:`内部治理机制命名/路径(线索级,人工判定;机制即本仓产品者可豁免登记)`},{id:`W-TOOL`,severity:`warn`,pattern:/\blzi-(?:builder|projects|dev-cli|release|env|git|decision|issues|vscode|agent|npm-registry|bun)\b/g,message:`内部工具名(线索级,人工判定)`},{id:`W-ADR`,severity:`warn`,pattern:/ADR[\s-]?\d{3,4}/g,message:`ADR 编号引用(线索级,人工判定;指向本仓决策记录者可豁免登记)`}],c=[...o,...s],l=/^#\s+Longzai Intelligence(\s|$)/,u=/^#\s+/,d=/^#{1,3}\s*(?:许可证|贡献|License|Contributing)\s*$/,f=/^#{1,3}\s*(?:创建初衷|工作范围)\s*$/,p=/[│├└]/,m=/#\s+\S/,h=3,g=40,_=8,v=120,y=/* @__PURE__ */ new Set([`node_modules`,`dist`,`out`,`.turbo`,`.git`,`build`,`.next`,`coverage`,`.cache`,`target`,`.venv`,`docs`]),b=[`packages`,`apps`],x=e=>{let t=[];C(r(e,`README.md`))&&t.push({relPath:`README.md`,kind:`root`});for(let n of b){let i=r(e,n);w(i)&&S(i,n,0,t)}return t},S=(e,n,i,a)=>{if(i>3)return;let o;try{o=t(e,{withFileTypes:!0})}catch{return}for(let t of o){if(y.has(t.name))continue;let o=`${n}/${t.name}`;t.isDirectory()?S(r(e,t.name),o,i+1,a):t.isFile()&&t.name===`README.md`&&a.push({relPath:o,kind:`nested`})}},C=e=>{try{return n(e).isFile()}catch{return!1}},w=e=>{try{return n(e).isDirectory()}catch{return!1}},T=(e,t)=>{let n=[],r=t.split(`
2
2
  `);return n.push(...E(e.relPath,r)),n.push(...D(e,r)),n.sort((e,t)=>(e.line??0)-(t.line??0)),n},E=(e,t)=>{let n=[];for(let r of c){let i=0;for(let a=0;a<t.length&&i<8;a+=1){let o=t[a];if(o===void 0)break;new RegExp(r.pattern.source,r.pattern.flags).test(o)&&(n.push({file:e,line:a+1,rule:r.id,severity:r.severity,message:r.message,excerpt:A(o)}),i+=1)}}return n},D=(e,t)=>{let n=[];e.kind===`root`&&n.push(...O(e.relPath,t));let r=t.map((e,t)=>({line:e,number:t+1})).filter(e=>d.test(e.line));for(let t of r)n.push({file:e.relPath,line:t.number,rule:`E-FORBIDDEN-SECTION`,severity:`error`,message:`许可证/贡献段落——由 package.json 承载,README 不设该段`,excerpt:A(t.line)});let i=t.map((e,t)=>({line:e,number:t+1})).filter(e=>f.test(e.line));for(let t of i)n.push({file:e.relPath,line:t.number,rule:`E-CHARTER-SECTION`,severity:`error`,message:`立项文体节(创建初衷/工作范围)——发布 README 精简口径,内部细节迁内部承接文件`,excerpt:A(t.line)});return n.push(...k(e.relPath,t)),n},O=(e,t)=>{let n=t.findIndex(e=>u.test(e)),r=n===-1?void 0:t[n];return r!==void 0&&l.test(r)?[]:[{file:e,line:n===-1?null:n+1,rule:`E-ROOT-TITLE`,severity:`error`,message:"根标题须为 `# Longzai Intelligence <Name>`——缺品牌前缀/纯中文/仓库名或包名充当标题均不合规",excerpt:r===void 0?void 0:A(r)}]},k=(e,t)=>{let n=[],r=t.map((e,t)=>({line:e,number:t+1})).filter(e=>p.test(e.line));if(r.length===0)return n;let i=r.filter(e=>m.test(e.line));return i.length>=3&&n.push({file:e,line:i[0]?.number??null,rule:`E-TREE-ANNOTATED`,severity:`error`,message:`结构树逐行注释(${i.length} 行)——树只表达层级,职责在正文说明`,excerpt:i[0]===void 0?void 0:A(i[0].line)}),r.length>40&&n.push({file:e,line:r[0]?.number??null,rule:`E-TREE-LONG`,severity:`error`,message:`结构树过长(${r.length} 行 > 40)——发布 README 精简口径`,excerpt:r[0]===void 0?void 0:A(r[0].line)}),n},A=e=>{let t=e.trim();return t.length>120?`${t.slice(0,120)}…`:t},j=t=>{let n=t.exemptions??[],o=x(t.repoRoot),s=[];for(let n of o){let i=null;try{i=e(r(t.repoRoot,n.relPath),`utf8`)}catch{continue}s.push(...T(n,i))}let c=e=>{for(let t of n)if(t.file===e.file&&t.rule===e.rule)return t;return null},l=[],u=[];for(let e of s){let t=c(e);t===null?l.push(e):u.push({...e,reason:t.reason})}return{rulesVersion:a,specPointer:i,violations:l,exempted:u,summary:{filesScanned:o.length,rootCount:o.filter(e=>e.kind===`root`).length,nestedCount:o.filter(e=>e.kind===`nested`).length,errorCount:l.filter(e=>e.severity===`error`).length,warnCount:l.filter(e=>e.severity===`warn`).length,exemptedCount:u.length}}},M=e=>{let t=[];t.push(`[INFO] readme:check 规则版本 ${e.rulesVersion}`),t.push(`[INFO] 依据 ${e.specPointer}`),t.push(`[INFO] 扫描 README ${e.summary.filesScanned} 个(根 ${e.summary.rootCount}、嵌套 ${e.summary.nestedCount})`);for(let n of e.violations)t.push(N(n));for(let n of e.exempted)t.push(P(n));return e.summary.errorCount===0?t.push(`[SUCCESS] readme:check 通过(0 error、${e.summary.warnCount} warn、豁免 ${e.summary.exemptedCount})`):t.push(`✖ ${e.summary.errorCount} error、${e.summary.warnCount} warn(豁免 ${e.summary.exemptedCount})`),t.join(`
3
3
  `)},N=e=>{let t=e.line===null?e.file:`${e.file}:${e.line}`,n=e.excerpt===void 0?``:`|摘录:${e.excerpt}`;return`${t} [${e.rule}] ${e.message}${n}`},P=e=>`[豁免] ${e.line===null?e.file:`${e.file}:${e.line}`} [${e.rule}](原因:${e.reason})`,F=e=>JSON.stringify(e,null,2);export{f as CHARTER_SECTION_PATTERN,o as ERROR_LINE_RULES,v as EXCERPT_MAX_LENGTH,d as FORBIDDEN_SECTION_PATTERN,u as H1_HEADING_PATTERN,c as LINE_RULES,_ as MAX_HITS_PER_RULE,l as ROOT_TITLE_PATTERN,m as TREE_ANNOTATED_PATTERN,h as TREE_ANNOTATED_THRESHOLD,p as TREE_LINE_PATTERN,g as TREE_LONG_THRESHOLD,s as WARN_LINE_RULES,x as collectReadmeTargets,M as formatGateReport,F as formatGateReportJson,j as runReadmeGate,T as scanReadmeContent};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-readme/core",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Longzai Intelligence README 门禁引擎(发布口径规则集、README 发现器、报告)",
5
5
  "license": "UNLICENSED",
6
6
  "files": [
@@ -31,7 +31,7 @@
31
31
  "clean": "lzi-dev-cli clean"
32
32
  },
33
33
  "dependencies": {
34
- "@longzai-intelligence-readme/config": "0.0.1",
34
+ "@longzai-intelligence-readme/config": "0.0.2",
35
35
  "zod": "^4.4.3"
36
36
  }
37
37
  }