@charisol/plexo-sdk

中文文档
2.0.26发布于 2026/10/31MITTypeScriptESM + CJS近 30 天下载 2183

Plexo可视化电子邮件和登陆页构建器 SDK – 有AI集成的拖放模板编辑器.

中文使用文档
文档目录30 节
  1. 特征
  2. 安装
  3. 快速启动
  4. 普通反应( Vite / CRA)
  5. Next.js (App路由器) (英语)
  6. 第1步——创建动态包装器
  7. 步骤2——在服务器组件页面中使用
  8. 推荐参考
  9. PlexoBuilder
  10. AI 配置
  11. PlexoBuilderRef - 强制性API
  12. V2 编辑 - @charisol/plexo-sdk/v2
  13. 什么是默认,什么是道具,什么是独立的
  14. 编辑
  15. 电子邮件
  16. 格式发送消息的地方
  17. 编译
  18. 可见的画布
  19. 未信任输入
  20. 从以前的 V2 升级
  21. 框架说明
  22. 维特
  23. Next.js (页路由器)
  24. Remix / react 路由器 v7
  25. 更改日志
  26. 1.1.0 国家
  27. 未释放
  28. 1.0.1 (中文(简体) )
  29. 1.0.0 (单位:千美元)
  30. 许可证

@charisol/ plexo- sdk (英语)

视觉拖放电子邮件和登陆页面构建器 SDK 有AI集成——为React所建.

npm version license


特征

  • 🎨 视觉拖放构建器 ——有活编辑的行,列和元素
  • 📧 电子邮件和登陆页面模式( L) - 为两者出口清洁、生产准备的HTML
  • 🤖 AI 内容生成 ——在OpenAI,双子座和克洛德的支持下,编辑单个元素,编辑整个布局,或从一个快取生成新的布局
  • 🔒 服务器代理的 AI, 没有曝光密钥 —— 您的提供者 API 密钥从未发送到浏览器或存储到浏览器中; 每个 AI 请求都会用您的 Plexo API 密钥进行认证, 并根据您的账户服务器侧配置解决
  • 💬 Claude-Code-style AI反馈 – 加载气泡后一行汇总变化,用于每个元素编辑器和布局快栏
  • 🖼️ 股票图像搜索 - 脱脂、脱脂、皮克萨拜一体化
  • 🎨 设计代号系统 ——斯特拉塔标志性支持统一品牌主题
  • 📦 纯客户端部分 ——无自主机;SDK使用您 Plexo API 密钥直接与 Plexo 所主持的 API 进行 AI/publish/编译

安装

npm install @charisol/plexo-sdk

同伴依赖关系 (如尚未安装)

npm install react react-dom

快速启动

普通反应( Vite / CRA)

import { useRef } from 'react';
import { PlexoBuilder, type PlexoBuilderRef } from '@charisol/plexo-sdk';
// Import the builder's stylesheet
import '@charisol/plexo-sdk/dist/plexo-sdk.css';

export function Editor() {
  const builderRef = useRef<PlexoBuilderRef>(null);

  const handleSave = async () => {
    const result = await builderRef.current?.exportDesign('email');
    console.log('HTML:', result?.html);
    console.log('JSON:', result?.json);
  };

  return (
    <div style={{ height: '100vh' }}>
      <PlexoBuilder
        ref={builderRef}
        apiKey="your-api-key"
        mode="email"
        backgroundColor="#ffffff"
        themeBgColor="#6d28d9"
        themeFgColor="#ffffff"
        textColor="#111827"
        showSaveButton={false}
      />
      <button onClick={handleSave}>Save</button>
    </div>
  );
}

Next.js (App路由器) (英语)

重要内容: SDK是一个纯客户端组件,使用拖放和浏览器API. 绝对不能在服务器上制造.

第1步——创建动态包装器

因为SDK只使用浏览器 API,用 next/dynamic 并禁用 SSR。 请确定导入 CSS 样式表 :

// components/template-editor.tsx
'use client';

import dynamic from 'next/dynamic';
import type { PlexoBuilderRef } from '@charisol/plexo-sdk';
import { useRef } from 'react';

// Import the builder's stylesheet
import '@charisol/plexo-sdk/dist/plexo-sdk.css';

// Never SSR the builder — it relies on browser APIs (drag-and-drop, ResizeObserver, etc.)
const PlexoBuilder = dynamic(
  () => import('@charisol/plexo-sdk').then((m) => ({ default: m.PlexoBuilder })),
  { ssr: false, loading: () => <p>Loading builder…</p> }
);

export function TemplateEditor() {
  const builderRef = useRef<PlexoBuilderRef>(null);

  const handleSave = async () => {
    const result = await builderRef.current?.exportDesign('email');
    console.log(result?.html);
  };

  return (
    <div style={{ height: '100vh' }}>
      <PlexoBuilder
        ref={builderRef}
        apiKey="your-api-key"
        mode="email"
        backgroundColor="#ffffff"
        themeBgColor="#6d28d9"
        themeFgColor="#ffffff"
        textColor="#111827"
        showSaveButton={false}
      />
      <button onClick={handleSave}>Save</button>
    </div>
  );
}

步骤2——在服务器组件页面中使用

// app/editor/page.tsx  (Server Component — no "use client")
import { TemplateEditor } from '@/components/template-editor';

export default function EditorPage() {
  return <TemplateEditor />;
}

推荐参考

PlexoBuilder

Prop类型默认说明
mode'email' | 'landing_page'—— 说要求. 编辑器输出模式
apiKeystring—— 说要求. 您的 Plexo API 密钥
initialTemplateTemplateJSON—— 说预装已保存的模板 JSON
initialHtmlstring—— 说预装原始 HTML( 登陆页面模式)
initialCssstring—— 说预装 CSS( 登陆页面模式)
initialJsstring—— 说预装JS(登陆页面模式)
showSaveButtonbooleantrue显示/ 隐藏内置保存按钮
onSave(data: { json, html }) => void—— 说内置保存按钮时调用
autoSavebooleanfalse定期自动保存
autoSaveDurationnumber3000自动保存间隔( ms)
onUpload(file: File) => Promise<string> | string—— 说自定义图像上传处理器, 返回 URL
backgroundColorstring'#0e1526'帆布背景颜色
themeBgColorstring'#4f46e5'主要品牌/颜色
themeFgColorstring'#ffffff'品牌元素的前景颜色
textColorstring'#e2e8f0'默认正文文字颜色
useAibooleanfalse启用 AI 内容生成 。 当地大门——如果 false,AI UI是隐蔽/残废的,没有来回旅行
aiProvider'openai' | 'gemini' | 'claude' | string'openai'只显示/ 标签 . 实际使用的提供者是您 Plexo 账户配置中解析的服务器侧面—— 此道具不选择或覆盖它
aiTier'AUTO' | 'BASIC' | 'MEDIUM' | 'HIGH' | string'AUTO'请求模式级, 随每个 AI 请求一起发送, 作为您账户默认级的覆盖 . AUTO 让服务器根据快速复杂度选择 BASIC/MEDIUM/HIGH / 请求
unsplashKeystring—— 说股票图像的 API 密钥
pexelsKeystring—— 说股票图像的 Pexels API 密钥
pixabayKeystring—— 说股票图像的 Pixabay API 密钥
readOnlybooleanfalse将画布强制为只读预览( 不拖放, 没有属性面板, 没有保存按钮) , 不管内置的预览/ 编辑切换 。 对于执行自己许可模式的东道主应用程序(如取景者/评论者合作者角色). onRequestComment 仍然开火时 readOnly 开始.
commentModebooleanfalse打开时,单击任何行/列/元素呼叫 onRequestComment 与该节点的id/type而不是选择它进行编辑——一个Figma风格"点击来给一个评论"主机特性的构件.
onRequestComment(target: CommentTarget) => void—— 说在画布点击时开火 commentMode 开始. CommentTarget 实值 { nodeId, nodeType: 'row' | 'column' | 'element', clientX, clientY }。 。 。 .

AI 配置

AI 生成( 单元编辑, 整版编辑, 当画布为空时生成全新的布局) 完全运行 服务器侧没有 aiApiKey prop and never be——一个提供者API密钥(OpenAI, Anthropic, 或双子座)曾经被配置在您的Plexo账户上,并停留在那里,在休息时加密. SDK 认证了 AI 的同样请求 apiKey 你已经传给了 PlexoBuilder;服务器将解决您的账户提供者、密钥和默认级别.

<PlexoBuilder
  apiKey="your-plexo-api-key"
  useAi
  aiTier="AUTO" // optional override: 'AUTO' | 'BASIC' | 'MEDIUM' | 'HIGH'
  // no aiApiKey, no aiProvider selection — both are account-level, not props
  ...
/>

等级从最便宜/最差到最能: BASIC → MEDIUM → HIGH。 。 。 . AUTO (默认)将每个提示的复杂服务器侧进行分类,并自动选择正确的分级——快速"更改按钮颜色"将不会花费与"重新设计这整个登陆页"相同的预算

偶数覆盖 : TemplateJSON.body.aiConfig 可以覆盖 useAi编号 :tier 单一模板:

aiConfig?: {
  useAi?: boolean;
  tier?: string;
}

注意没有 apiKey编号 :provider 字段中的任意一个——一个模板的JSON被装入了浏览器批发中进行编辑,所以存储在其中的秘密实际上永远无法保存. 真正的密钥总是来自您的账户的服务器侧配置, 而不是模板.

如果大赦国际的要求是: 若为 apiKey 实值 "workspace-internal" (SDK由Plexo自己的仪表板提供时使用的哨兵),请求保持同源. 对于每个真实的Plexo API密钥——即任何第三方集成——请求都会被自动路由到Plexo主机制作API. 没什么好配置的 如果一个请求在这里用一个 404 失败, 则表示此软件包版本已过时; 更新为 npm install @charisol/plexo-sdk@latest。 。 。 .


PlexoBuilderRef - 强制性API

通过 ref 有关部分:

const builderRef = useRef<PlexoBuilderRef>(null);

// Export the current design
const { json, html } = await builderRef.current.exportDesign('email');
// or:
const { json, html } = await builderRef.current.exportDesign('landing_page');

// Get the JSON without compiling HTML
const json = builderRef.current.getJson();
方法签署说明
exportDesign(target: 'email' | 'landing_page') => Promise<{ json: TemplateJSON; html: string }>编译并导出当前设计
getJson() => TemplateJSON获取 JSON 原始设计快照
getNodeRect(nodeId: string) => DOMRect | null以JSON id为单位的一行/一列/一列的屏蔽矩形,或 null 如果目前尚未提供。 回顾卷轴/缩放/设备-视图-更改。 用于将主机UI(如评论针)定位到特定画布节点上.
getCanvasContainerRect() => DOMRect | null屏幕上绑定的矩形 帆布取景口本身.

V2 编辑 - @charisol/plexo-sdk/v2

一个用于登陆页和应用程序屏幕的图片式视觉构建器:自由出行或网格布局,每屏(桌面/平板/移动)布局,以及9个现成的互动元素(木卫一,视频,社交链接,菜单,HTML嵌入,表格,倒计时器,形式,手风琴). 一个设计是plain JSON——一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行一行.

import { V2Editor } from '@charisol/plexo-sdk/v2';
import '@charisol/plexo-sdk/dist/plexo-sdk.css';

// Works with no props at all: opens a blank page, fully offline.
<div style={{ height: '100vh' }}>
  <V2Editor pages={savedPages} onChange={setPages} onSave={(pages) => api.save(pages)} />
</div>

编辑器填充容器( 给父端一个高), 它只像 V1 客户端 —— 把它包入 next/dynamic 与 ssr: false 在下一个.js.

什么是默认,什么是道具,什么是独立的

它的栖息地点实例
SDK 默认 - 没有配置的工作编辑器内部整个编辑 UI, 撤消( 每个手势一个步骤), 抓取, 桌面/ 平板/ 移动框, 键盘快捷键( 瞄准编辑器, 永远不要主机页面), 取色器, Fit- to- screen, 九个元素, 嵌入小图像的图像上传, 一个空白的起始页
主机道具 ——需要主机的服务器,账户或秘密<V2Editor … /> 道具保存( e)onSave, (中文(简体) ), onPublish, (中文(简体) ), autoSave),文件 (onUpload, (中文(简体) ), onUploadFont, (中文(简体) ), media, (中文(简体) ), stockImages),大赦国际onAskSol),品牌颜色(colors)),现成部分sections),链接目标(linkTargets),将表格发送(formAction, (中文(简体) ), apiKey, (中文(简体) ), templateId),权限(readOnly, (中文(简体) ), commentMode),头槽,关闭面板(features(中文(简体) )
单独条目 没有反应,在服务器上运行@charisol/plexo-sdk/v2/compilecompilePageToHtml, (中文(简体) ), compilePageToReact, (中文(简体) ), parsePages, (中文(简体) ), convertLegacyDesign,帧大小, computePlacements

流出SOL(英语:SOL). onAskSol(question, context, io) 可能流: 调用 io.onText(replySoFar) 每次到来时,都会有完整的答复(面板显示其不断增长) io.signal ——当所有者按住停止时会中止. 尽头还满回覆. 忽略主机 io 然后把答复还给我 继续工作 添加 solAutoApply 每个更改 SOL 写( 栅栏 plexo-commands 列表)是在其到达时在页面上作出的,所以在SOL仍在回答时会更改页面;一个Undo收回整个答案. 无 solAutoApply 拥有者仍在审查并按下应用程序. context 还携带 nodeName 更早的时候 history因此,后续如"让它更短"是有道理的. readStreamingSolReply 如果一个主机建立自己的面板,(导出)是递增读取器.

缺少道具时没有假的:没有 onAskSol sOL 按钮是隐藏的,没有 onSave 没有保存按钮, 没有 onUpload 图像被嵌入到设计中( 最多1.5 MB ) , 并有清晰的信息 onUploadFont 字体拾取器只提供Google字体(没有“添加字体”按钮)。 上传的字体被存储在设计系统中(designSystem.fonts)并编为 @font-face 规则;如果主机将字体文件存储在另一个来源,请将其传递给 sanitizeV2Html(html, { fontOrigins: [...] })。 。 。 . compilePageToHtml ưμ㼯a head (发音) <link> 标记)和 fontLinks 给那个地方的主机 html + 键 css 在他们自己的页面。 没有任何提供者密钥生活在浏览器中——AI和sock-image搜索通过主机,如V1中.

编辑

编辑自己的颜色(不是你的访客页面)遵循了三个道具. 传出其中任何一个;其他的阴影(平面,边框,徘徊状态,哑音文字)都是从这些阴影中混合而来,所以有暗色文字的浅色背景既能起作用,又能黑暗. 没有通过=Plexo的 石灰上黑色外观.

<V2Editor theme={{ accent: '#96F02E', background: '#000000', text: '#ffffff' }} />

电子邮件

同一编辑器设计电子邮件: <V2Editor mode="email" />。在电子邮件模式中,仅提供每个电子邮件应用程序所能绘制的内容:文本、按钮、图片、分页符、列的间隔和行(在电话上堆放),即时制作的电子邮件部分(标题、主要信息、文本、要闻、呼吁行动、图片、页脚)。 没有免费放置、网格、阴影、动画或脚本, 用编译器写入已完成的电子邮件( 带有内含样式的表格, 外加纯文本版本) :

import { compilePageToEmail, emailIssues, starterEmailPages } from '@charisol/plexo-sdk/v2/compile';
const { html, text, warnings } = compilePageToEmail(page, { designSystem, preheader: 'Your account is ready' });

合并标签, 如 {{first_name}} 让发件人来填写.

格式发送消息的地方

按顺序排列:表单自己的地址(所有者打出)-主机地址 formAction(formId) • 在Plexo内apiKey="workspace-internal" 加号 templateId) Plexo 自己的形式收件箱 ~ 无所事事,编辑和编译者都直截了当地说. 一个具有真实的Plexo密钥的第三方应用程序不能获得Plexo的收件箱(它从页面的自有域中找到网站),所以通过 formAction。 。 。 .

编译

import { compilePageToHtml, compilePageToReact, parsePages } from '@charisol/plexo-sdk/v2/compile';

const parsed = parsePages(json);                       // untrusted JSON in, plain-language error out
if (!parsed.ok) throw new Error(parsed.error);

// Landing pages / templates → HTML
const { html, css, script, document, warnings } = compilePageToHtml(parsed.pages[0], {
  apiKey: 'workspace-internal', templateId,            // inside Plexo: forms work with no setup
  // formAction: (id) => `https://api.acme.test/leads?form=${id}`,   // any other host
  // runtime: 'none',                                   // host forbids scripts on published pages
  // allowEmbedScripts: false,                          // …and wants HTML embeds script-free too
});

// App projects → a standalone React component (imports only "react")
const { code } = compilePageToReact(parsed.pages[0], { componentName: 'HomePage' });

所有东西在浏览器允许的地方作为平版 HTML 工作(scroll-snap carousel,本土手风琴和移动菜单,真实的表格,形式和视频). 可选的运行时间添加了自動自動播放和箭頭,活取计时器,并发送一个表格而不会离开页面;不允许脚本留下它的主机 runtime: 'none'。 。 。 . warnings 是所有者应该修补的普通语言的东西(一个无处发送消息的表格,一个屏幕缺失的桌面元素).

可见的画布

每台屏幕(台式1200,平板768,移动375)为相框. 这是什么 内部 框是屏幕上的页面; 什么是 外部 仅在编辑时显示的工作区域 :

  • 完全在屏幕框架外的元素不在该屏幕上发布(如果没有屏幕显示,则完全不在页面中);
  • (a) 部分外部元素被剪去其部分边缘;
  • 编辑会计算外面的东西 并提议 适合此屏幕 (移动:一叠列;平板块:被缩放为宽度)和 带入视野。当屏幕缺失桌面的元素时,编译器会发出警告.

由于片段的边缘会被剪断,在生长的东西(手风琴,带有错误信息的形式)下留下空间.

未信任输入

一个设计可以来自数据库,AI或第三方应用,因此编译者将它视为不可信:文本和属性被逃脱,链接和图像方案被允许列表,可以添加声明或获取URL的CSS值被丢弃,类名被限制,嵌入沙盒中,以及 parsePages 拒绝未知的元素类型、重复的标识和超大小的树. 不要通过 V1 的 V2 HTML sanitizeCompiledHtml。 。 。 . 它保留了 V2 的样式表和布局,但删除 <details>, (中文(简体) ), <iframe>, (中文(简体) ), <figure> 财务报告和审定财务报表 <script> ——无声地打破了手风琴,电话菜单,视频,HTML嵌入和旋转木马. V2的输出由允许标记和属性列表所构建,所以不需要该步骤;必须进行消毒的宿主应当使用允许这些标记的消毒器.

从以前的 V2 升级

上个V2(V2Canvas, (中文(简体) ), useCanvasStore, (中文(简体) ), compilePageToReact(nodes, pageOrder, …)替换;这是 断开更改 改为 @charisol/plexo-sdk/v2 财务报告和审定财务报表 /v2/compile。旧版本保存的设计仍然开放: isLegacyDesign(doc) 认识他们 convertLegacyDesign(doc, { name, slug }) 将一个页面升级到一个页面(旧页面缩放以适应任何屏幕,因此平板电脑和移动设备得到匹配的缩放版式)。 未结转:品牌文本风格链接和被绑放部分.


框架说明

维特

盒子里没有工作——不需要额外配置.

Next.js (页路由器)

相同的动态导入模式适用 :

import dynamic from 'next/dynamic';

const PlexoBuilder = dynamic(
  () => import('@charisol/plexo-sdk').then((m) => ({ default: m.PlexoBuilder })),
  { ssr: false }
);

Remix / react 路由器 v7

使用 lazy 方法或仅限客户的守护:

import { lazy, Suspense } from 'react';

const PlexoBuilder = lazy(() =>
  import('@charisol/plexo-sdk').then((m) => ({ default: m.PlexoBuilder }))
);

// In your component:
<Suspense fallback={<p>Loading…</p>}>
  <PlexoBuilder ... />
</Suspense>

说明: 在雷米克,把这个放进去 clientLoader 或用途 <ClientOnly> 包装以确保它从未在服务器上被执行.


更改日志

1.1.0 国家

  • 新设 readOnly, (中文(简体) ), commentMode,以及 onRequestComment 道具,还有 getNodeRect编号 :getCanvasContainerRect 编辑 PlexoBuilderRef ——让一个主机在画布上方构建 Figma 风格的锚定评论(单击节点时) commentMode 它的编号/类型/坐标、位置、覆盖通过 getNodeRect,通过 readOnly)不需要知道画布的内部DOM结构. 完全向后兼容——现有道具或还原方法没有改变.
  • 每个行/栏/元素包装现在都装有 data-plexo-node-type="row"|"column"|"element" 属性与其现有 id (已经是节点的稳定的JSON id).

未释放

  • 断开 : 已删除 aiApiKey 道具 (英语). AI世代现在运行服务器侧- 您的提供者密钥被配置在您 Plexo 账户( 在休息时加密) 上, 而不是在每次渲染时传递给浏览器 .
  • 断开 : TemplateJSON.body.aiConfig 不再接受 apiKey编号 :provider 仅限 useAi编号 :tier 由于同样的原因(一个模板的JSON装入了客户端,所以不能安全地持有一个秘密),保留.
  • aiProvider ;有效的提供者来自您的账户配置,而不是此道具.
  • 新克洛德-Code风格的AI回馈:一个装入气泡后再以一行简写来总结变化之处,用于平面"Edit with AI"弹出和布局AI即时栏.
  • 布局AI 即时栏现在在画布为空时自动生成全新的布局,而不只是编辑已存在的内容.
  • AI请求(并发布/验证-键请求,当使用真实的Plexo API密钥而不是仪表盘的内部会话时)现在自动通向Plexo主机出品API的路由——没有配置. 这里的一款404表示已安装的软件包版本是 stale;更新到最新的.

1.0.1 (中文(简体) )

  • 固定: 已删除已滚动 CJS interop shim(require()从无害环境管理产出中——解决与涡轮包装(Next.js 15+16+)和严格的无害环境管理环境的相容性问题
  • 所有反应子路径( A)react/jsx-runtime现在已适当外部化

1.0.0 (单位:千美元)

  • 初步释放

许可证

麻省理工学院

版本与发布记录

@charisol/plexo-sdk 共发布 134 个版本,首次发布于 2026/07/22;过去 12 个月发布了 134 个版本。

版本发布日期距今
2.0.26latest2026/10/3110 天前
2.0.252026/10/2615 天前
2.0.242026/10/2119 天前
2.0.232026/10/2119 天前
2.0.222026/10/2020 天前
2.0.212026/10/2020 天前

其他发布通道:next → 1.4.1。

关于 @charisol/plexo-sdk 的常见问题

@charisol/plexo-sdk 是什么?

Plexo可视化电子邮件和登陆页构建器 SDK – 有AI集成的拖放模板编辑器.

如何安装 @charisol/plexo-sdk?

在项目目录运行 npm install @charisol/plexo-sdk,或使用 pnpm add / yarn add / bun add。

@charisol/plexo-sdk 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@charisol/plexo-sdk 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@charisol/plexo-sdk 可以商用吗?

@charisol/plexo-sdk 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@charisol/plexo-sdk 的下载量有多少?

根据 npm 官方下载统计,@charisol/plexo-sdk 在 2026/10/10 – 2026/11/08 这 30 天内被下载 2,183 次,日均约 73 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@charisol/plexo-sdk 还在维护吗?

最新版本 2.0.26 发布于 2026/10/31(10 天前);至今共发布 134 个版本,其中过去 12 个月发布了 134 个;首次发布于 2026/07/22。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。