@longzai-intelligence-docs/core 0.0.10 → 0.0.11

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
@@ -260,7 +260,7 @@ declare class PluginLoadError extends Error {
260
260
  constructor(entry: string, message: string);
261
261
  }
262
262
  /**
263
- * 装载外部自持插件(jiti + zod 形状校验)
263
+ * 装载外部自持插件(原生 import + zod 形状校验)
264
264
  *
265
265
  * 外部插件与平台内插件同一契约;建议外部插件经 definePlugin 声明
266
266
  * (声明期即校验),装载期形状校验为最后防线。装载失败抛 PluginLoadError,
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";function i(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 a(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 o(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 s(e,t){let n={};for(let r of e.consumes??[])n[r]=t[r];return n}async function c(e,t){for(let n of e){let e=n[t];e!==void 0&&await e()}}function l(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 u(e,t){let n=l(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 d=class extends Error{entry;constructor(e,t){super(`外部插件「${e}」装载失败:${t}`),this.name=`PluginLoadError`,this.entry=e}};const f=r.object({name:r.string().regex(/^[a-z][a-z0-9-]*$/,`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 p(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 m(e){return typeof e==`object`&&!!e&&`default`in e}async function h(e,t){let n=await import(p(e,t)).catch(t=>{throw new d(e,`模块不可达(${t instanceof Error?t.message:String(t)})`)}),r=m(n)?n.default:n,i=f.safeParse(r);if(!i.success)throw new d(e,i.error.issues.map(e=>e.message).join(`;`));return i.data}const g=r.strictObject({name:r.string().regex(/^[a-z][a-z0-9-]*$/,`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`]}),_=r.strictObject({category:r.string().regex(/^[a-z][a-z0-9-]*$/,`category 须为 kebab-case 非空字符串`),names:r.array(r.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`]}),v=r.strictObject({artifact:r.string().min(1,`artifact 须为非空产物路径或形态描述`),mechanism:r.string().min(1,`mechanism 须为非空生成机制描述`),handEdit:r.enum([`禁手编`,`可手编`]),marker:r.string().min(1).optional()}),y=r.strictObject({path:r.string().min(1,`path 须为非空仓内相对路径`)}),b=r.strictObject({path:r.string().min(1,`path 须为非空仓内相对路径`)}),x=r.strictObject({path:r.string().min(1,`path 须为非空仓内相对路径`),contains:r.string().min(1,`contains 须为非空标记子串`)}),S=r.strictObject({repo:r.string().min(1,`repo 须为非空探针目标仓名`),requires:r.array(y).min(1).optional(),ifPresent:r.array(b).min(1).optional(),markerIn:r.array(x).min(1).optional()}).refine(e=>e.requires!==void 0||e.ifPresent!==void 0||e.markerIn!==void 0,{error:`探针至少须声明 requires / ifPresent / markerIn 之一`,path:[`requires`]}),C=r.strictObject({name:r.string().regex(/^[a-z][a-z0-9-]*$/,`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(v).min(1).optional(),distribution:r.string().min(1).optional(),consumers:r.array(r.string().min(1)).min(1,`consumers 须为非空消费面清单`),probes:r.array(S).min(1).optional(),notes:r.string().min(1).optional()});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=_.safeParse(e);if(!t.success)throw Error(`文档目录条目非法:${t.error.issues.map(e=>`${e.path.join(`.`)||`(root)`}——${e.message}`).join(`;`)}`);return t.data}function E(e){let t=C.safeParse(e);if(!t.success)throw Error(`真源登记条目非法:${t.error.issues.map(e=>`${e.path.join(`.`)||`(root)`}——${e.message}`).join(`;`)}`);return t.data}const D=`longzai-intelligence-docs-registry`,O=`LZI_DOCS_REGISTRY_ROOT`,k=`registry`,A=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()}),j=r.object({id:r.string(),docId:r.string(),version:r.string().min(1,`版本号不能为空`),content:r.string(),createdAt:r.string(),updatedAt:r.string()});export{k as DOCS_REGISTRY_DECLARATION_DIR,D as DOCS_REGISTRY_REPO_NAME,O as DOCS_REGISTRY_ROOT_ENV_KEY,_ as DocCategoryEntrySchema,A as DocCategorySchema,j as DocVersionSchema,g as PluginEntrySchema,d as PluginLoadError,C as TruthSourceEntrySchema,o as buildServiceRegistry,T as defineDocCategory,a as definePlugin,w as definePluginEntry,E as defineTruthSourceEntry,u as evaluateWaivers,h as loadExternalPlugin,i as pluginCommand,s as resolveConsumedServices,c as runPipelineHooks,l as validateWaiverEntries};
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.11",
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": {