@longzai-intelligence-docs/core 0.0.10 → 0.0.12

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
@@ -240,6 +240,120 @@ declare function validateWaiverEntries(entries: readonly WaiverEntry[]): string[
240
240
  */
241
241
  declare function evaluateWaivers(violationKeys: readonly string[], entries: readonly WaiverEntry[]): WaiverEvaluation;
242
242
  //#endregion
243
+ //#region src/slug-style.constants.d.ts
244
+ /**
245
+ * slug 风格口径常量——docs 域文档命名单一真源
246
+ *
247
+ * 三域形态集中于此:语义域与编号域的文档 slug、标识符域 kebab。docs 家族
248
+ * 各工具的文件名门禁、建档派生与配置校验一律消费本模块,杜绝各仓自持正则
249
+ * 漂移
250
+ *
251
+ * @remarks
252
+ * 红线一——禁止机械剥离数字:数字是标题的语义内容而非形态噪音,派生只做
253
+ * 形态归一,数字纪律一律由域级政策门禁裁决
254
+ * 红线二——禁止逃生门:政策 `forbid` 与 `allow` 只在域级声明且为唯一配置
255
+ * 轴,无任何逐条豁免通道,既有违规如实上报不吸收
256
+ */
257
+ /**
258
+ * 语义域 slug 源串——无锚形态源,供文件名复合正则组合
259
+ *
260
+ * @remarks
261
+ * 复合消费面组合时以本源串为段构造,禁止手写字符类副本;与
262
+ * `SEMANTIC_SLUG_PATTERN` 的一致性由守卫测试锁定
263
+ */
264
+ declare const SEMANTIC_SLUG_SOURCE = "[a-z]+(?:-[a-z]+)*";
265
+ /**
266
+ * 语义域 slug 形态——纯字母 ASCII kebab,禁数字
267
+ *
268
+ * @remarks
269
+ * 语义命名注册表——pitfalls、standards 族——文件名 slug 即错误类型或
270
+ * 标准标识:字母段以单连字符分隔,数字、大小写、下划线、连续连字符一律
271
+ * 拒绝;编号前缀形态属编号域通道,同样拒绝
272
+ */
273
+ declare const SEMANTIC_SLUG_PATTERN: RegExp;
274
+ /**
275
+ * 编号域 slug 段源串——无锚形态源,供文件名复合正则组合
276
+ *
277
+ * @remarks
278
+ * 与 `NUMBERED_SLUG_PATTERN` 的一致性由守卫测试锁定
279
+ */
280
+ declare const NUMBERED_SLUG_SOURCE = "[a-z0-9]+(?:-[a-z0-9]+)*";
281
+ /**
282
+ * 编号域 slug 段形态——宽收集 ASCII kebab
283
+ *
284
+ * @remarks
285
+ * 编号注册表——records、issues、decision 族——`NNNN-<slug>.md` 的 slug
286
+ * 段收集形态,形态层允许数字:数字纪律由域级 `slugDigitPolicy` 政策裁决,
287
+ * 不在形态层表达
288
+ */
289
+ declare const NUMBERED_SLUG_PATTERN: RegExp;
290
+ /**
291
+ * 标识符域 kebab 源串——无锚形态源,供文件名复合正则组合
292
+ *
293
+ * @remarks
294
+ * 声明档文件名形态 `*.plugin.ts` 等以本源串组合标识符段;与
295
+ * `IDENTIFIER_KEBAB_PATTERN` 的一致性由守卫测试锁定
296
+ */
297
+ declare const IDENTIFIER_KEBAB_SOURCE = "[a-z][a-z0-9-]*";
298
+ /**
299
+ * 标识符域 kebab 形态——小写字母起首,允许中段数字与连字符
300
+ *
301
+ * @remarks
302
+ * 配置与声明面标识符——插件名、scope key、文档分类名——的形态口径;与
303
+ * 文档 slug 分属两域,不得混用
304
+ */
305
+ declare const IDENTIFIER_KEBAB_PATTERN: RegExp;
306
+ /**
307
+ * slug 数字政策合法值域——域级唯一配置轴
308
+ *
309
+ * @remarks
310
+ * `forbid` 禁数字、`allow` 放行数字,整域声明、缺省按 `forbid` 执行;
311
+ * 不存在逐条豁免通道
312
+ */
313
+ declare const SLUG_DIGIT_POLICIES: readonly ['forbid', 'allow'];
314
+ //#endregion
315
+ //#region src/slug-style.core.d.ts
316
+ /**
317
+ * slug 数字政策——域级唯一配置轴
318
+ */
319
+ type SlugDigitPolicy = (typeof SLUG_DIGIT_POLICIES)[number];
320
+ /**
321
+ * 判定文本是否含数字字符
322
+ *
323
+ * @param text - 待判定文本
324
+ * @returns 含任一数字字符为 true
325
+ */
326
+ declare function containsDigit(text: string): boolean;
327
+ /**
328
+ * 提取编号注册表文件名的 slug 段
329
+ *
330
+ * 剥前缀数字键、单个分隔符与最后一个扩展名;空 slug 段放行为空串,非前缀
331
+ * 数字形态返回 null——不属判定面
332
+ *
333
+ * @param basename - 文件基名
334
+ * @returns slug 段;非判定面为 null
335
+ */
336
+ declare function extractSlugSegment(basename: string): string | null;
337
+ /**
338
+ * 标题派生 slug——仅形态归一,数字保留
339
+ *
340
+ * 小写化、空白与下划线转连字符、剥字符集外字符、折叠连续连字符、去首尾
341
+ * 连字符。数字属语义内容一律保留——禁止机械剥离,禁数字域的处置由门禁整
342
+ * 体拒绝并指路人工显式命名;中文标题可能派生为空串,由调用侧门禁拒绝
343
+ *
344
+ * @param title - 原始标题
345
+ * @returns 形态归一后的 slug 候选,可能为空串
346
+ */
347
+ declare function titleToKebabSlug(title: string): string;
348
+ /**
349
+ * 判定 slug 是否违反所在域的数字政策
350
+ *
351
+ * @param slug - slug 字符串
352
+ * @param policy - 域级数字政策
353
+ * @returns 禁数字域且含数字为 true
354
+ */
355
+ declare function violatesSlugDigitPolicy(slug: string, policy: SlugDigitPolicy): boolean;
356
+ //#endregion
243
357
  //#region src/load-plugin.utils.d.ts
244
358
  /**
245
359
  * 外部插件装载失败错误
@@ -260,7 +374,7 @@ declare class PluginLoadError extends Error {
260
374
  constructor(entry: string, message: string);
261
375
  }
262
376
  /**
263
- * 装载外部自持插件(jiti + zod 形状校验)
377
+ * 装载外部自持插件(原生 import + zod 形状校验)
264
378
  *
265
379
  * 外部插件与平台内插件同一契约;建议外部插件经 definePlugin 声明
266
380
  * (声明期即校验),装载期形状校验为最后防线。装载失败抛 PluginLoadError,
@@ -510,4 +624,4 @@ type PaginatedResult<T> = {
510
624
  };
511
625
  };
512
626
  //#endregion
513
- export { DOCS_REGISTRY_DECLARATION_DIR, DOCS_REGISTRY_REPO_NAME, DOCS_REGISTRY_ROOT_ENV_KEY, type DocCategory, type DocCategoryEntry, DocCategoryEntrySchema, DocCategorySchema, type DocVersion, DocVersionSchema, type DocsPlugin, type DocsPluginCommandFactory, type DocsPluginContext, type DocsPluginHooks, type DocsPluginProvides, type PaginatedResult, type PluginEntry, PluginEntrySchema, PluginLoadError, type TruthSourceEntry, TruthSourceEntrySchema, type TruthSourceProbe, type TruthSourceRender, type WaiverEntry, type WaiverEvaluation, buildServiceRegistry, defineDocCategory, definePlugin, definePluginEntry, defineTruthSourceEntry, evaluateWaivers, loadExternalPlugin, pluginCommand, resolveConsumedServices, runPipelineHooks, validateWaiverEntries };
627
+ export { DOCS_REGISTRY_DECLARATION_DIR, DOCS_REGISTRY_REPO_NAME, DOCS_REGISTRY_ROOT_ENV_KEY, type DocCategory, type DocCategoryEntry, DocCategoryEntrySchema, DocCategorySchema, type DocVersion, DocVersionSchema, type DocsPlugin, type DocsPluginCommandFactory, type DocsPluginContext, type DocsPluginHooks, type DocsPluginProvides, IDENTIFIER_KEBAB_PATTERN, IDENTIFIER_KEBAB_SOURCE, NUMBERED_SLUG_PATTERN, NUMBERED_SLUG_SOURCE, type PaginatedResult, type PluginEntry, PluginEntrySchema, PluginLoadError, SEMANTIC_SLUG_PATTERN, SEMANTIC_SLUG_SOURCE, SLUG_DIGIT_POLICIES, type SlugDigitPolicy, type TruthSourceEntry, TruthSourceEntrySchema, type TruthSourceProbe, type TruthSourceRender, type WaiverEntry, type WaiverEvaluation, buildServiceRegistry, containsDigit, defineDocCategory, definePlugin, definePluginEntry, defineTruthSourceEntry, evaluateWaivers, extractSlugSegment, loadExternalPlugin, pluginCommand, resolveConsumedServices, runPipelineHooks, titleToKebabSlug, validateWaiverEntries, violatesSlugDigitPolicy };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import"./rolldown-runtime-BqT_7tdF.js";import{createJiti as e}from"jiti";import*as t from"node:path";import*as n from"zod";function r(e){return{name:e.name,description:e.description,arguments:e.arguments,options:e.options,schema:e.schema,action:async(t,n)=>{await e.action(e.schema.parse(t),n)}}}function i(e){if(!/^[a-z][a-z0-9-]*$/.test(e.name))throw Error(`插件名须为 kebab-case(小写字母开头,仅小写字母/数字/连字符):${e.name}`);if(e.version.trim()===``)throw Error(`插件 ${e.name} 的 version 不得为空`);if(e.commands.length===0)throw Error(`插件 ${e.name} 须至少声明一个命令工厂`);return e}function a(e){let t={},n=[];for(let r of e){let e=r.provides??{};for(let[i,a]of Object.entries(e)){if(i in t){n.push(`服务「${i}」被重复提供(${i} 已在册,${r.name} 重复声明)`);continue}t[i]=a}}for(let r of e){let e=r.consumes??[];for(let i of e)i in t||n.push(`插件「${r.name}」消费的服务「${i}」无提供方(在册服务:${Object.keys(t).join(`、`)||`无`})`)}return{services:t,errors:n}}function o(e,t){let n={};for(let r of e.consumes??[])n[r]=t[r];return n}async function s(e,t){for(let n of e){let e=n[t];e!==void 0&&await e()}}function c(e){let t=[],n=/* @__PURE__ */ new Set;for(let r of e)r.target.trim()===``&&t.push(`豁免条目 target 不得为空`),r.reason.trim()===``&&t.push(`豁免条目「${r.target}」reason 不得为空`),r.issue.trim()===``&&t.push(`豁免条目「${r.target}」issue 收编指针不得为空`),n.has(r.target)&&t.push(`豁免条目「${r.target}」重复登记`),n.add(r.target);return t}function l(e,t){let n=c(t);if(n.length>0)throw Error(`豁免条目形状非法,拒绝判定:${n.join(`;`)}`);let r=new Set(e),i=[],a=[],o=/* @__PURE__ */ new Set;for(let e of t)r.has(e.target)?(i.push(e),o.add(e.target)):a.push(e);return{suppressed:i,active:e.filter(e=>!o.has(e)),stale:a}}var u=class extends Error{entry;constructor(e,t){super(`外部插件「${e}」装载失败:${t}`),this.name=`PluginLoadError`,this.entry=e}};const d=n.object({name:n.string().regex(/^[a-z][a-z0-9-]*$/,`name 须为 kebab-case 非空字符串`),version:n.string().min(1,`version 须为非空字符串`),commands:n.custom(e=>Array.isArray(e)&&e.length>0&&e.every(e=>typeof e==`function`),`commands 须为非空的命令工厂函数数组`),provides:n.custom(e=>typeof e==`object`&&!!e&&!Array.isArray(e),`provides 存在时须为对象(服务名 → API 对象)`).optional(),consumes:n.array(n.string()).optional(),hooks:n.custom(e=>typeof e==`object`&&!!e&&Object.values(e).every(e=>e===void 0||typeof e==`function`),`hooks 存在时须为对象且各钩子为函数`).optional(),configSchema:n.custom(e=>typeof e==`object`&&!!e&&`parse`in e,`configSchema 存在时须为具备 parse 方法的 zod schema`).optional()});function f(e,n){return e.startsWith(`./`)||e.startsWith(`../`)?t.resolve(n,e):e}function p(e){return typeof e==`object`&&!!e&&`default`in e}async function m(t,n){let r=e(n,{interopDefault:!0}),i=f(t,n),a=await r.import(i).catch(e=>{throw new u(t,`模块不可达(${e instanceof Error?e.message:String(e)})`)}),o=p(a)?a.default:a,s=d.safeParse(o);if(!s.success)throw new u(t,s.error.issues.map(e=>e.message).join(`;`));return s.data}const h=n.strictObject({name:n.string().regex(/^[a-z][a-z0-9-]*$/,`name 须为 kebab-case 非空字符串`),status:n.enum([`登记中`,`已发布`]),holdingRepo:n.string().min(1,`holdingRepo 须为非空字符串(自持仓仓名)`),entryPackage:n.string().min(1).optional(),version:n.string().min(1).optional(),compatibleRange:n.string().min(1).optional(),docs:n.string().min(1).optional(),summary:n.string().min(1,`summary 须为非空一句话职能`)}).refine(e=>e.status!==`已发布`||e.entryPackage!==void 0,{error:`已发布条目必须携带 entryPackage`,path:[`entryPackage`]}).refine(e=>e.status!==`已发布`||e.version!==void 0,{error:`已发布条目必须携带 version`,path:[`version`]}),g=n.strictObject({category:n.string().regex(/^[a-z][a-z0-9-]*$/,`category 须为 kebab-case 非空字符串`),names:n.array(n.string().regex(/^[a-z][a-z0-9-]*$/,`文档名须为 kebab-case 非空字符串`)).min(1,`names 须为非空数组`)}).refine(e=>new Set(e.names).size===e.names.length,{error:`names 不得重复`,path:[`names`]}),_=n.strictObject({artifact:n.string().min(1,`artifact 须为非空产物路径或形态描述`),mechanism:n.string().min(1,`mechanism 须为非空生成机制描述`),handEdit:n.enum([`禁手编`,`可手编`]),marker:n.string().min(1).optional()}),v=n.strictObject({path:n.string().min(1,`path 须为非空仓内相对路径`)}),y=n.strictObject({path:n.string().min(1,`path 须为非空仓内相对路径`)}),b=n.strictObject({path:n.string().min(1,`path 须为非空仓内相对路径`),contains:n.string().min(1,`contains 须为非空标记子串`)}),x=n.strictObject({repo:n.string().min(1,`repo 须为非空探针目标仓名`),requires:n.array(v).min(1).optional(),ifPresent:n.array(y).min(1).optional(),markerIn:n.array(b).min(1).optional()}).refine(e=>e.requires!==void 0||e.ifPresent!==void 0||e.markerIn!==void 0,{error:`探针至少须声明 requires / ifPresent / markerIn 之一`,path:[`requires`]}),S=n.strictObject({name:n.string().regex(/^[a-z][a-z0-9-]*$/,`name 须为 kebab-case 非空字符串`),summary:n.string().min(1,`summary 须为非空一句话职能`),status:n.enum([`登记中`,`已确认`]),truthSource:n.strictObject({repo:n.string().min(1,`repo 须为非空真源仓或仓族描述`),path:n.string().min(1,`path 须为非空真源路径`)}),renders:n.array(_).min(1).optional(),distribution:n.string().min(1).optional(),consumers:n.array(n.string().min(1)).min(1,`consumers 须为非空消费面清单`),probes:n.array(x).min(1).optional(),notes:n.string().min(1).optional()});function C(e){let t=h.safeParse(e);if(!t.success)throw Error(`插件登记条目非法:${t.error.issues.map(e=>`${e.path.join(`.`)||`(root)`}——${e.message}`).join(`;`)}`);return t.data}function w(e){let t=g.safeParse(e);if(!t.success)throw Error(`文档目录条目非法:${t.error.issues.map(e=>`${e.path.join(`.`)||`(root)`}——${e.message}`).join(`;`)}`);return t.data}function T(e){let t=S.safeParse(e);if(!t.success)throw Error(`真源登记条目非法:${t.error.issues.map(e=>`${e.path.join(`.`)||`(root)`}——${e.message}`).join(`;`)}`);return t.data}const E=`longzai-intelligence-docs-registry`,D=`LZI_DOCS_REGISTRY_ROOT`,O=`registry`,k=n.object({id:n.string(),name:n.string().min(1,`分类名称不能为空`),slug:n.string().min(1,`分类标识不能为空`),description:n.string().nullable(),parentId:n.string().nullable(),sortOrder:n.number().int().min(0),createdAt:n.string(),updatedAt:n.string()}),A=n.object({id:n.string(),docId:n.string(),version:n.string().min(1,`版本号不能为空`),content:n.string(),createdAt:n.string(),updatedAt:n.string()});export{O as DOCS_REGISTRY_DECLARATION_DIR,E as DOCS_REGISTRY_REPO_NAME,D as DOCS_REGISTRY_ROOT_ENV_KEY,g as DocCategoryEntrySchema,k as DocCategorySchema,A as DocVersionSchema,h as PluginEntrySchema,u as PluginLoadError,S as TruthSourceEntrySchema,a as buildServiceRegistry,w as defineDocCategory,i as definePlugin,C as definePluginEntry,T as defineTruthSourceEntry,l as evaluateWaivers,m as loadExternalPlugin,r as pluginCommand,o as resolveConsumedServices,s as runPipelineHooks,c as validateWaiverEntries};
1
+ import"./rolldown-runtime-BqT_7tdF.js";import{createRequire as e}from"node:module";import*as t from"node:path";import{pathToFileURL as n}from"node:url";import*as r from"zod";const i=`[a-z]+(?:-[a-z]+)*`,a=/^[a-z]+(?:-[a-z]+)*$/,o=`[a-z0-9]+(?:-[a-z0-9]+)*`,s=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,c=`[a-z][a-z0-9-]*`,l=/^[a-z][a-z0-9-]*$/,u=[`forbid`,`allow`];function d(e){return{name:e.name,description:e.description,arguments:e.arguments,options:e.options,schema:e.schema,action:async(t,n)=>{await e.action(e.schema.parse(t),n)}}}function f(e){if(!l.test(e.name))throw Error(`插件名须为 kebab-case(小写字母开头,仅小写字母/数字/连字符):${e.name}`);if(e.version.trim()===``)throw Error(`插件 ${e.name} 的 version 不得为空`);if(e.commands.length===0)throw Error(`插件 ${e.name} 须至少声明一个命令工厂`);return e}function p(e){let t={},n=[];for(let r of e){let e=r.provides??{};for(let[i,a]of Object.entries(e)){if(i in t){n.push(`服务「${i}」被重复提供(${i} 已在册,${r.name} 重复声明)`);continue}t[i]=a}}for(let r of e){let e=r.consumes??[];for(let i of e)i in t||n.push(`插件「${r.name}」消费的服务「${i}」无提供方(在册服务:${Object.keys(t).join(`、`)||`无`})`)}return{services:t,errors:n}}function m(e,t){let n={};for(let r of e.consumes??[])n[r]=t[r];return n}async function h(e,t){for(let n of e){let e=n[t];e!==void 0&&await e()}}function g(e){let t=[],n=/* @__PURE__ */ new Set;for(let r of e)r.target.trim()===``&&t.push(`豁免条目 target 不得为空`),r.reason.trim()===``&&t.push(`豁免条目「${r.target}」reason 不得为空`),r.issue.trim()===``&&t.push(`豁免条目「${r.target}」issue 收编指针不得为空`),n.has(r.target)&&t.push(`豁免条目「${r.target}」重复登记`),n.add(r.target);return t}function _(e,t){let n=g(t);if(n.length>0)throw Error(`豁免条目形状非法,拒绝判定:${n.join(`;`)}`);let r=new Set(e),i=[],a=[],o=/* @__PURE__ */ new Set;for(let e of t)r.has(e.target)?(i.push(e),o.add(e.target)):a.push(e);return{suppressed:i,active:e.filter(e=>!o.has(e)),stale:a}}function v(e){return/\d/.test(e)}function y(e){let t=/^\d+[-._ ](.+)\.[^.]+$/.exec(e);return t===null?null:t[1]??``}function b(e){return e.toLowerCase().replace(/[\s_]+/g,`-`).replace(/[^a-z0-9-]/g,``).replace(/-+/g,`-`).replace(/^-|-$/g,``)}function x(e,t){return t===`forbid`&&v(e)}var S=class extends Error{entry;constructor(e,t){super(`外部插件「${e}」装载失败:${t}`),this.name=`PluginLoadError`,this.entry=e}};const C=r.object({name:r.string().regex(l,`name 须为 kebab-case 非空字符串`),version:r.string().min(1,`version 须为非空字符串`),commands:r.custom(e=>Array.isArray(e)&&e.length>0&&e.every(e=>typeof e==`function`),`commands 须为非空的命令工厂函数数组`),provides:r.custom(e=>typeof e==`object`&&!!e&&!Array.isArray(e),`provides 存在时须为对象(服务名 → API 对象)`).optional(),consumes:r.array(r.string()).optional(),hooks:r.custom(e=>typeof e==`object`&&!!e&&Object.values(e).every(e=>e===void 0||typeof e==`function`),`hooks 存在时须为对象且各钩子为函数`).optional(),configSchema:r.custom(e=>typeof e==`object`&&!!e&&`parse`in e,`configSchema 存在时须为具备 parse 方法的 zod schema`).optional()});function w(r,i){let a=e(t.join(i,`package.json`));return r.startsWith(`./`)||r.startsWith(`../`)?n(t.resolve(i,r)).href:n(a.resolve(r)).href}function T(e){return typeof e==`object`&&!!e&&`default`in e}async function E(e,t){let n=await import(w(e,t)).catch(t=>{throw new S(e,`模块不可达(${t instanceof Error?t.message:String(t)})`)}),r=T(n)?n.default:n,i=C.safeParse(r);if(!i.success)throw new S(e,i.error.issues.map(e=>e.message).join(`;`));return i.data}const D=r.strictObject({name:r.string().regex(l,`name 须为 kebab-case 非空字符串`),status:r.enum([`登记中`,`已发布`]),holdingRepo:r.string().min(1,`holdingRepo 须为非空字符串(自持仓仓名)`),entryPackage:r.string().min(1).optional(),version:r.string().min(1).optional(),compatibleRange:r.string().min(1).optional(),docs:r.string().min(1).optional(),summary:r.string().min(1,`summary 须为非空一句话职能`)}).refine(e=>e.status!==`已发布`||e.entryPackage!==void 0,{error:`已发布条目必须携带 entryPackage`,path:[`entryPackage`]}).refine(e=>e.status!==`已发布`||e.version!==void 0,{error:`已发布条目必须携带 version`,path:[`version`]}),O=r.strictObject({category:r.string().regex(l,`category 须为 kebab-case 非空字符串`),names:r.array(r.string().regex(l,`文档名须为 kebab-case 非空字符串`)).min(1,`names 须为非空数组`)}).refine(e=>new Set(e.names).size===e.names.length,{error:`names 不得重复`,path:[`names`]}),k=r.strictObject({artifact:r.string().min(1,`artifact 须为非空产物路径或形态描述`),mechanism:r.string().min(1,`mechanism 须为非空生成机制描述`),handEdit:r.enum([`禁手编`,`可手编`]),marker:r.string().min(1).optional()}),A=r.strictObject({path:r.string().min(1,`path 须为非空仓内相对路径`)}),j=r.strictObject({path:r.string().min(1,`path 须为非空仓内相对路径`)}),M=r.strictObject({path:r.string().min(1,`path 须为非空仓内相对路径`),contains:r.string().min(1,`contains 须为非空标记子串`)}),N=r.strictObject({repo:r.string().min(1,`repo 须为非空探针目标仓名`),requires:r.array(A).min(1).optional(),ifPresent:r.array(j).min(1).optional(),markerIn:r.array(M).min(1).optional()}).refine(e=>e.requires!==void 0||e.ifPresent!==void 0||e.markerIn!==void 0,{error:`探针至少须声明 requires / ifPresent / markerIn 之一`,path:[`requires`]}),P=r.strictObject({name:r.string().regex(l,`name 须为 kebab-case 非空字符串`),summary:r.string().min(1,`summary 须为非空一句话职能`),status:r.enum([`登记中`,`已确认`]),truthSource:r.strictObject({repo:r.string().min(1,`repo 须为非空真源仓或仓族描述`),path:r.string().min(1,`path 须为非空真源路径`)}),renders:r.array(k).min(1).optional(),distribution:r.string().min(1).optional(),consumers:r.array(r.string().min(1)).min(1,`consumers 须为非空消费面清单`),probes:r.array(N).min(1).optional(),notes:r.string().min(1).optional()});function F(e){let t=D.safeParse(e);if(!t.success)throw Error(`插件登记条目非法:${t.error.issues.map(e=>`${e.path.join(`.`)||`(root)`}——${e.message}`).join(`;`)}`);return t.data}function I(e){let t=O.safeParse(e);if(!t.success)throw Error(`文档目录条目非法:${t.error.issues.map(e=>`${e.path.join(`.`)||`(root)`}——${e.message}`).join(`;`)}`);return t.data}function L(e){let t=P.safeParse(e);if(!t.success)throw Error(`真源登记条目非法:${t.error.issues.map(e=>`${e.path.join(`.`)||`(root)`}——${e.message}`).join(`;`)}`);return t.data}const R=`longzai-intelligence-docs-registry`,z=`LZI_DOCS_REGISTRY_ROOT`,B=`registry`,V=r.object({id:r.string(),name:r.string().min(1,`分类名称不能为空`),slug:r.string().min(1,`分类标识不能为空`),description:r.string().nullable(),parentId:r.string().nullable(),sortOrder:r.number().int().min(0),createdAt:r.string(),updatedAt:r.string()}),H=r.object({id:r.string(),docId:r.string(),version:r.string().min(1,`版本号不能为空`),content:r.string(),createdAt:r.string(),updatedAt:r.string()});export{B as DOCS_REGISTRY_DECLARATION_DIR,R as DOCS_REGISTRY_REPO_NAME,z as DOCS_REGISTRY_ROOT_ENV_KEY,O as DocCategoryEntrySchema,V as DocCategorySchema,H as DocVersionSchema,l as IDENTIFIER_KEBAB_PATTERN,c as IDENTIFIER_KEBAB_SOURCE,s as NUMBERED_SLUG_PATTERN,o as NUMBERED_SLUG_SOURCE,D as PluginEntrySchema,S as PluginLoadError,a as SEMANTIC_SLUG_PATTERN,i as SEMANTIC_SLUG_SOURCE,u as SLUG_DIGIT_POLICIES,P as TruthSourceEntrySchema,p as buildServiceRegistry,v as containsDigit,I as defineDocCategory,f as definePlugin,F as definePluginEntry,L as defineTruthSourceEntry,_ as evaluateWaivers,y as extractSlugSegment,E as loadExternalPlugin,d as pluginCommand,m as resolveConsumedServices,h as runPipelineHooks,b as titleToKebabSlug,g as validateWaiverEntries,x as violatesSlugDigitPolicy};
package/package.json CHANGED
@@ -1,6 +1,14 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-docs/core",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
+ "description": "Longzai Intelligence Docs 核心类型与插件契约",
5
+ "keywords": [
6
+ "longzai-intelligence",
7
+ "docs",
8
+ "core",
9
+ "types",
10
+ "plugin"
11
+ ],
4
12
  "license": "UNLICENSED",
5
13
  "files": [
6
14
  "dist"
@@ -31,7 +39,6 @@
31
39
  },
32
40
  "dependencies": {
33
41
  "@longzai-intelligence-cli/core": "^0.0.8",
34
- "jiti": "^2.6.1",
35
42
  "zod": "^4.4.3"
36
43
  },
37
44
  "devDependencies": {