@longzai-intelligence-issues/config 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  $ oxlint && oxfmt --check
2
2
  Found 0 warnings and 0 errors.
3
- Finished in 159ms on 13 files with 186 rules using 10 threads.
3
+ Finished in 234ms on 13 files with 186 rules using 10 threads.
4
4
  Checking formatting...
5
5
 
6
6
  All matched files use the correct format.
7
- Finished in 134ms on 22 files using 10 threads.
7
+ Finished in 154ms on 22 files using 10 threads.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,12 @@
5
5
  格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
6
6
  本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
7
7
 
8
+ ## [0.0.4] - 2026-09-14
9
+
10
+ ### 变更
11
+
12
+ - init 配置模板 import 回归 @longzai-intelligence-issues/config(原单依赖方案已回滚)
13
+
8
14
  ## [0.0.3] - 2026-09-14
9
15
 
10
16
  ### 变更
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import"./rolldown-runtime-BqT_7tdF.js";import*as e from"zod";import{loadUnifiedConfig as t}from"@longzai-intelligence-shared-config/core";import{existsSync as n}from"node:fs";import{resolve as r}from"node:path";import{pathToFileURL as i}from"node:url";const a=[`files`,`sqlite`,`postgres`,`mysql`,`memory`],o=[`待补跑`,`待复跑`,`待低负载`,`环境不具备`,`挂起`,`后补跑`],s=`^\\d{1,4}[-._]`,c=[`docs`],l=`docs/issues`,u=`.lzi/issues/issues.sqlite`,d=/^[a-z][a-z0-9-]*$/,f=/^\d+$/,p=/^\.[A-Za-z0-9]+$/,m=e.object({number:e.string().regex(f),reason:e.string().min(1)}),h=e.object({file:e.string().min(1),rule:e.string().min(1),issue:e.string().min(1)}),g=e.object({glob:e.string().min(1),reason:e.string().min(1)}),_=e.object({key:e.string().regex(d),title:e.string().min(1),paths:e.array(e.string().min(1)).min(1),registryDir:e.string().min(1),numbering:e.object({reserved:e.array(m)}).default({reserved:[]}),slugDigitPolicy:e.enum([`forbid`,`allow`]).optional()}),v=e.object({strategy:e.enum(a).default(`files`),sqlitePath:e.string().min(1).default(u)}),y=e.object({baseline:e.array(h).default([]),strictLegacy:e.boolean().default(!1),rulePacks:e.array(e.string().min(1)).default([])}),b=e.object({scopeKey:e.string().min(1),number:e.string().regex(f),files:e.array(e.string().min(1)).min(2),status:e.enum([`待清偿`,`维持现状`]),reason:e.string().min(1)}),x=e.object({allowlist:e.array(b).default([]),globalExclusions:e.array(g).default([]),audit:e.object({roots:e.array(e.string().min(1)).min(1).default([...c]),numberishPattern:e.string().min(1).default(s),pending:e.array(g).default([])}).default({roots:[...c],numberishPattern:s,pending:[]})}),S=e.object({scanRoots:e.array(e.string().min(1)).min(1),includeExtensions:e.array(e.string().regex(p)).default([`.md`]),exclusions:e.array(g).default([]),baseline:e.array(h).default([])}),C=e.object({pendingWords:e.array(e.string().min(1)).default([...o]),heavyPattern:e.string().min(1).optional(),fullPattern:e.string().min(1).optional(),blockingMustBeGreen:e.boolean().default(!0)}),w=e.object({builtin:e.boolean().default(!0),extraDir:e.string().min(1).optional()}),T=e.object({schemaVersion:e.literal(1),storage:v.default({strategy:`files`,sqlitePath:u}),scopes:e.array(_).min(1),lint:y.default({baseline:[],strictLegacy:!1,rulePacks:[]}),numbering:x.default({allowlist:[],globalExclusions:[],audit:{roots:[...c],numberishPattern:s,pending:[]}}),slugDigitAllowlist:e.array(g).default([]),docs:S.optional(),close:C.default({pendingWords:[...o],blockingMustBeGreen:!0}),prompts:w.default({builtin:!0})});function E(e){let t=T.safeParse(e);if(!t.success){let e=t.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`;`);throw Error(`lzi-issues 配置形态非法:${e}`)}return t.data}function D(e){return e}const O=[`/**`," * lzi-issues 配置(单一真源)——由 `lzi-issues init` 生成。",` *`,` * 引擎零仓库知识:一切仓库特有信息(scope 注册 / 扫描面 / 门禁参数)只在本文件登记。`,` * 存储默认 files(Local First):issue 为注册表 markdown,派生数据统一 .lzi/issues/。`,` */`].join(`
2
2
  `);function k(e){return`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`)}'`}function A(e,t){if(e.length===0)return`[]`;let n=` `.repeat(t+1),r=` `.repeat(t);return e.every(e=>typeof e==`object`&&!!e)?`[\n${e.map(e=>`${n}${N(e,t+1)},`).join(`
3
3
  `)}\n${r}]`:`[${e.map(e=>N(e,t+1)).join(`, `)}]`}function j(e,t){let n=Object.keys(e).filter(t=>e[t]!==void 0);if(n.length===0)return`{}`;let r=` `.repeat(t+1),i=` `.repeat(t);return`{\n${n.map(n=>`${r}${n}: ${N(e[n],t+1)},`).join(`
4
- `)}\n${i}}`}function M(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function N(e,t){return typeof e==`string`?k(e):Array.isArray(e)?A(e,t):M(e)?j(e,t):String(e)}function P(e){return`export default defineConfig(${N(e,0)});\n`}function F(e,t=O){return`import { defineConfig } from '@longzai-intelligence-issues/cli';\n\n${t}\n${P(e)}`}function I(e){return N({key:e.key,title:e.title,paths:e.paths??[`.`],registryDir:e.registryDir??`docs/issues`},2).trimStart()}function L(e){return F({schemaVersion:1,scopes:[{key:e.key,title:e.title,paths:e.paths??[`.`],registryDir:e.registryDir??`docs/issues`}]})}function R(e,t){let n=e[t]??``,r={"[":`]`,"{":`}`,"(":`)`}[n];if(r===void 0)throw Error(`扫描起点不是开括号:位置 ${t}`);let i=0;for(let a=t;a<e.length;a+=1){let t=e[a]??``,o=e[a+1]??``;if(t===`/`&&o===`/`){if(a=e.indexOf(`
4
+ `)}\n${i}}`}function M(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function N(e,t){return typeof e==`string`?k(e):Array.isArray(e)?A(e,t):M(e)?j(e,t):String(e)}function P(e){return`export default defineConfig(${N(e,0)});\n`}function F(e,t=O){return`import { defineConfig } from '@longzai-intelligence-issues/config';\n\n${t}\n${P(e)}`}function I(e){return N({key:e.key,title:e.title,paths:e.paths??[`.`],registryDir:e.registryDir??`docs/issues`},2).trimStart()}function L(e){return F({schemaVersion:1,scopes:[{key:e.key,title:e.title,paths:e.paths??[`.`],registryDir:e.registryDir??`docs/issues`}]})}function R(e,t){let n=e[t]??``,r={"[":`]`,"{":`}`,"(":`)`}[n];if(r===void 0)throw Error(`扫描起点不是开括号:位置 ${t}`);let i=0;for(let a=t;a<e.length;a+=1){let t=e[a]??``,o=e[a+1]??``;if(t===`/`&&o===`/`){if(a=e.indexOf(`
5
5
  `,a),a===-1)break;continue}if(t===`/`&&o===`*`){if(a=e.indexOf(`*/`,a+2),a===-1)throw Error(`括号扫描遇未闭合块注释`);a+=1;continue}if(t===`'`||t===`"`||t==="`"){for(a+=1;a<e.length;){let n=e[a]??``;if(n===`\\`){a+=2;continue}if(n===t)break;a+=1}continue}if(t===n)i+=1;else if(t===r&&(--i,i===0))return a}throw Error(`括号不配平:scopes 数组未闭合`)}function z(e,t){if(RegExp(`key\\s*:\\s*'${t.key}'`).test(e))throw Error(`scope key「${t.key}」已注册,拒绝重复追加`);let n=/scopes\s*:\s*\[/.exec(e);if(n===null)throw Error(`配置文件缺少 scopes 数组,无法追加 scope`);let r=R(e,(n.index??0)+n[0].length-1),i=r-1;for(;i>=0&&/\s/.test(e[i]??``);)--i;let a=e[i]===`,`?`\n ${I(t)}`:`,\n ${I(t)}`;return`${e.slice(0,r)}${a}${e.slice(r)}`}const B=[`/**`," * lzi-issues 配置(单一真源)——由 `--write-baseline --issue <指针>` 再生。",` *`,` * 棘轮基线语义:基线按 (file, rule) 精确命中豁免存量违规;基线外新增违规仍红;`,` * 基线条目无对应现行违规计陈旧红——修复存量即须同步删除对应条目,棘轮只许缩短直至清零;`,` * 每条豁免必须携带 issue 收编指针(非空)。`,` *`,` * 注意:再生以解析值重建本文件,节内手工注释不保留——长篇说明请写入 docs/guides。`,` */`].join(`
6
6
  `);function V(e){let t=new Map;for(let n of e){let e=`${n.file}::${n.rule}`;t.has(e)||t.set(e,{...n})}return[...t.values()].sort((e,t)=>e.file===t.file?e.rule.localeCompare(t.rule):e.file.localeCompare(t.file))}function H(e,t,n){let r=V(n);if(t===`lint`)return F({schemaVersion:e.schemaVersion,storage:e.storage,scopes:e.scopes,lint:{...e.lint,baseline:r},numbering:e.numbering,slugDigitAllowlist:e.slugDigitAllowlist,docs:e.docs,close:e.close,prompts:e.prompts},B);if(e.docs===void 0)throw Error(`配置未登记 docs 节,无法再生 docs 基线`);return F({schemaVersion:e.schemaVersion,storage:e.storage,scopes:e.scopes,lint:e.lint,numbering:e.numbering,slugDigitAllowlist:e.slugDigitAllowlist,docs:{...e.docs,baseline:r},close:e.close,prompts:e.prompts},B)}function U(e,t,n){(t.startsWith(`/`)||t.startsWith(`\\`))&&n.push(`${e}「${t}」不得为绝对路径`),t.includes(`\\`)&&n.push(`${e}「${t}」不得包含反斜杠(须为 posix 相对路径)`),t.split(`/`).includes(`..`)&&n.push(`${e}「${t}」不得包含 .. 上溯段`)}function W(e,t,n){t.includes(`\\`)&&n.push(`${e}「${t}」不得包含反斜杠`),t.startsWith(`/`)&&n.push(`${e}「${t}」不得以 / 起首(须为仓库相对 glob)`)}function G(e,t,n){let r=new Set;for(let i of t)r.has(i)&&n.push(`${e} 存在重复 glob「${i}」`),r.add(i)}function K(e){let t=[],n=new Set;e.scopes.forEach((e,r)=>{let i=`scopes[${r}](${e.key})`;n.has(e.key)&&t.push(`scope key「${e.key}」重复注册`),n.add(e.key),U(`${i}.registryDir`,e.registryDir,t);let a=new Set;for(let n of e.numbering.reserved)a.has(n.number)&&t.push(`${i} 保留号「${n.number}」重复登记`),a.add(n.number)});let r=new Set;for(let n of e.lint.baseline){let e=`${n.file}::${n.rule}`;r.has(e)&&t.push(`lint.baseline 条目(${n.file}, ${n.rule})重复`),r.add(e)}if(e.docs!==void 0){let n=new Set;for(let r of e.docs.baseline){let e=`${r.file}::${r.rule}`;n.has(e)&&t.push(`docs.baseline 条目(${r.file}, ${r.rule})重复`),n.add(e)}for(let n of e.docs.exclusions)W(`docs.exclusions`,n.glob,t);G(`docs.exclusions`,e.docs.exclusions.map(e=>e.glob),t);for(let n of e.docs.scanRoots)U(`docs.scanRoots`,n,t)}let i=new Set;for(let r of e.numbering.allowlist){n.has(r.scopeKey)||t.push(`numbering.allowlist 条目指向未登记 scope「${r.scopeKey}」(编号 ${r.number})`);let e=`${r.scopeKey}::${r.number}::${[...r.files].sort().join(`,`)}`;i.has(e)&&t.push(`numbering.allowlist 条目(${r.scopeKey} ${r.number})重复`),i.add(e)}for(let n of e.numbering.globalExclusions)W(`numbering.globalExclusions`,n.glob,t);G(`numbering.globalExclusions`,e.numbering.globalExclusions.map(e=>e.glob),t);for(let n of e.numbering.audit.pending)W(`numbering.audit.pending`,n.glob,t);G(`numbering.audit.pending`,e.numbering.audit.pending.map(e=>e.glob),t);for(let n of e.numbering.audit.roots)U(`numbering.audit.roots`,n,t);for(let n of e.slugDigitAllowlist)W(`slugDigitAllowlist`,n.glob,t);return G(`slugDigitAllowlist`,e.slugDigitAllowlist.map(e=>e.glob),t),t}function q(e){let t=K(e);if(t.length>0)throw Error(`lzi-issues 配置跨条目校验失败:${t.join(`;`)}`);return e}function J(e,t){try{return q(E(e))}catch(e){let n=e instanceof Error?e.message:String(e);throw Error(`${n}(配置文件:${t})`)}}async function Y(e={}){if(e.configPath!==void 0){let t=r(e.cwd??process.cwd(),e.configPath);return n(t)?{ok:!0,config:J(await X(t),t),configFilePath:t,source:`explicit`}:{ok:!1,reason:`未找到配置文件:${t}`}}let i=await t({standaloneFile:`lzi-issues.config.ts`,unifiedField:`issues`,cwd:e.cwd});return i.success?{ok:!0,config:J(i.config,i.configFilePath),configFilePath:i.configFilePath,source:i.source}:{ok:!1,reason:`未找到 lzi-issues.config.ts(且 lzi.config.ts 无 issues 字段)——可先执行 lzi-issues init`}}async function X(e){let t=await import(i(e).href);if(t.default===void 0)throw Error(`配置文件缺少 default 导出:${e}`);return t.default}export{O as CONFIG_SCAFFOLD_HEADER,c as DEFAULT_AUDIT_ROOTS,s as DEFAULT_NUMBERISH_PATTERN,o as DEFAULT_PENDING_WORDS,l as DEFAULT_REGISTRY_DIR,u as DEFAULT_SQLITE_PATH,p as EXTENSION_PATTERN,f as NUMBER_PATTERN,B as RATCHET_CONTRACT_HEADER,d as SCOPE_KEY_PATTERN,a as STORAGE_STRATEGIES,z as appendScopeToConfigText,h as baselineEntrySchema,D as defineConfig,V as deriveBaselineEntries,X as importConfigModule,Y as loadLziIssuesConfig,T as lziIssuesConfigSchema,E as parseLziIssuesConfig,H as renderBaselineRegeneratedConfig,F as renderConfigFile,L as renderConfigScaffoldFile,I as renderScopeEntry,P as serializeConfigBody,K as validateCrossEntries,q as validateLziIssuesConfig};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-issues/config",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "license": "UNLICENSED",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -56,15 +56,15 @@ async function importAndParse(generated: string) {
56
56
  }
57
57
 
58
58
  describe('renderConfigScaffoldFile', () => {
59
- test('生成文件含契约头、defineConfig 与缺省 scope 值(采用仓单依赖:import 指向 cli 再出口)', () => {
59
+ test('生成文件含契约头、defineConfig 与缺省 scope 值(配置导入面是 config 包——CLI 不 re-export 配置符号)', () => {
60
60
  const text = renderConfigScaffoldFile({ key: 'demo', title: '演示域' });
61
61
 
62
- expect(text.includes("import { defineConfig } from '@longzai-intelligence-issues/cli';")).toBe(
63
- true,
64
- );
65
62
  expect(
66
63
  text.includes("import { defineConfig } from '@longzai-intelligence-issues/config';"),
67
- ).toBe(false);
64
+ ).toBe(true);
65
+ expect(text.includes("import { defineConfig } from '@longzai-intelligence-issues/cli';")).toBe(
66
+ false,
67
+ );
68
68
  expect(text.includes('lzi-issues init')).toBe(true);
69
69
  expect(text.includes("key: 'demo'")).toBe(true);
70
70
  expect(text.includes("paths: ['.']")).toBe(true);
@@ -195,7 +195,7 @@ export function renderConfigFile(
195
195
  config: Record<string, unknown>,
196
196
  header: string = CONFIG_SCAFFOLD_HEADER,
197
197
  ): string {
198
- return `import { defineConfig } from '@longzai-intelligence-issues/cli';\n\n${header}\n${serializeConfigBody(config)}`;
198
+ return `import { defineConfig } from '@longzai-intelligence-issues/config';\n\n${header}\n${serializeConfigBody(config)}`;
199
199
  }
200
200
 
201
201
  /**