announcement-bar · v1.0.0
站点顶部可关闭的公告条:后台维护公告内容与生效时间,前台自动取「当前生效」的一条展示。包含自己的数据表、后台页面、公开接口与权限点,是模块引擎的完整示例。
9 文件源码 19 KB下载 9 KB>=1.0.0
sha256 17e2f8317130…
这套系统是源码交付的:你可以改核心,也可以做成**不碰核心**的扩展。 三者的边界是刻意划清的 —— 如果它们都能做同样的事,社区贡献的扩展最后一定会互相打架。 一个共同前提:扩展只能「另加」,不能「覆盖」(核心优先是有意设计)。
engines/themes/<id>/
engines/modules/<id>/
engines/plugins/<id>/
「我这个需求能不能用扩展做、代价是什么」—— 有 10 个常见场景的对照表,见 扩展能做到什么深度。 做不到的六件事也写在那儿(不能改核心、带表的模块要停服重建、运行时页面不认 definePageMeta、没有沙箱…)✓ —— 先看那两条再动手,比写完才发现便宜 ✓。
四套自研业务系统各自有一篇文档页(内容由后台「页面内容」维护 ✓,改文档不用改代码 ✓)。 每套系统在这里给出三个入口:文档、系统详情(能力范围与交付方式)、版本日志(更新了什么)。
本站整站源码可以一键下载(`.tar.gz` ✓,包内顶层目录就是 www.hejun1.com/ ✓)。 「包里没有什么」和「包里有什么」一样重要 —— 下面是实时生成的清单: 尺寸、摘要、按目录的分布、以及完整排除清单与理由。先看清单再决定下不下 ✓。
下完可自己核对: certutil -hashfile 文件名 SHA256(Windows)或 sha256sum 文件名(Linux/macOS),与上面的 sha256 比对 ✓。 响应头也有 x-sha256 ✓。
| engines/ | 364 | 24.2 MB |
| server/ | 254 | 1.1 MB |
| public/ | 9 | 758 KB |
| pages/ | 47 | 729 KB |
| (根目录文件) | 18 | 607 KB |
| scripts/ | 32 | 497 KB |
| tests/ | 60 | 333 KB |
| docs/ | 17 | 298 KB |
| components/ | 46 | 275 KB |
| composables/ | 19 | 115 KB |
| prisma/ | 13 | 79 KB |
| layouts/ | 3 | 45 KB |
| assets/ | 2 | 31 KB |
| plugins/ | 5 | 27 KB |
| modules/ | 1 | 25 KB |
| deploy/ | 1 | 2 KB |
| _bt_default/ | 3 | 1 KB |
| middleware/ | 1 | 1 KB |
| types/ | 1 | 1 KB |
| .well-known/ | 2 | 1 KB |
这里只列到目录一级;逐个文件的完整列表在「包含清单(JSON)」里 ✓
node_modules/ · .output/ · .nuxt/ · dist/ · .engine-build/ · coverage/ · storage/依赖与构建产物(体积是源码的数倍,且随机器而异);storage/ 是运行期数据(2026-10-07 起放站点备份 —— 全站数据 ✗,绝不外发)
.playwright-cli/ · .codebuddy/ · .task/ · .vscode/ · .github/工具缓存与项目协作数据,跑站点不需要
*.old / *.bak / *.orig · .output*(部署回滚位与产物目录)实测生产站点根有 .output.old(759 个文件 / 10.1MB)与 engines.old(352 个文件 / 24MB)——它们是上一次部署的回滚备份,既让公开包凭空多出一倍体积,又含过时代码
.env密钥与连接串 —— 绝不外发
.env.* (保留 .env.example)各环境密钥;模板 .env.example 会随包提供
*.log / *.log.*运行日志(会泄露路径与内部数据)
docs/site-audit-report.json|.md巡检报告:描述站点当前内部状况,不适合公开
deploy/*.conf实测 nginx 配置里含证书私钥路径(服务器布局)
根目录的 *.png / *.jpg / *.jpeg实测根目录有 4 张开发对比截图;public/ 内的图片不受影响
login.yaml实测是 Playwright 把后台登录页 dump 出来的调试快照
$nullPowerShell 重定向写错产生的垃圾文件
*.pem / *.key / *.crt / *.p12兜底:任何私钥/证书文件一律不进包
npm ci → 复制 .env.example 为 .env 并填写 → npx prisma db push → npm run db:seed → npm run dev(需要 Node ≥ 20、PostgreSQL、Redis ✓)。 使用条款见包内 LICENSE —— 默认是保守措辞(允许学习与在你已获授权的站点上二次开发;整体再分发与竞品服务需书面许可 ✓)。 随源码交付的官方扩展与主题,可以在这里浏览源码或下载。 下载下来的是 `.tar.gz`,与 npm run engine:pack 的产物同格式(包内顶层目录就是包 id),改完可以装回去。
docs/marketplace-selfserve.md)。 announcement-bar · v1.0.0
站点顶部可关闭的公告条:后台维护公告内容与生效时间,前台自动取「当前生效」的一条展示。包含自己的数据表、后台页面、公开接口与权限点,是模块引擎的完整示例。
9 文件源码 19 KB下载 9 KB>=1.0.0
sha256 17e2f8317130…
changelog-center · v1.0.0
按产品分组的版本日志:后台维护(新增 / 编辑 / 删除),公开接口 GET /api/products/{slug}/changelogs 供前台的产品更新记录页消费。表通过外键挂在…
9 文件源码 9 KB下载 4 KB>=1.0.0
sha256 8d1ede6230f2…
demo-accounts · v1.0.0
给客户开的限时只读演示账号:后台按产品开通(写入 Redis 里的限时会话,到期自动失效),访客用临时口令换一个只读 Cookie 再进演示站。表通过外键挂在产品表上,所以依赖「系统产…
9 文件源码 12 KB下载 6 KB>=1.0.0
sha256 12880f6f2a79…
faq-manager · v1.0.0
常见问题:后台维护(新增 / 编辑 / 排序 / 隐藏 / 回收站),公开接口 GET /api/faqs 供前台 FAQ 页与任意页面消费。自带数据表、后台页面与权限点,是「业务模块…
10 文件源码 19 KB下载 8 KB>=1.0.0
sha256 8509e01182e9…
lead-inbox · v1.0.0
访客留言的统一收件箱:前台表单写入(手机号 / 微信校验 + 通知 + lead:created 扩展点),后台可搜索、改状态、写跟进备注、进回收站、按状态导出 CSV。自带数据表、后…
10 文件源码 24 KB下载 10 KB>=1.0.0
sha256 e85c5da75045…
product-catalog · v1.0.0
自研业务系统的产品目录:后台维护产品(图集、卖点、交付方式、SEO)与分类标签,公开接口 GET /api/products 供前台系统页与留言表单消费。自带 products / t…
17 文件源码 40 KB下载 14 KB>=1.0.0
sha256 9a75164c1b42…
lead-dup-guard · v1.0.0
监听 lead:created,用同一联系方式在近 30 天内是否提交过需求,把「重复线索」写进操作日志,方便销售判断是不是同一波需求反复来问。
2 文件源码 3 KB下载 2 KB>=1.0.0
sha256 57fdb3012b73…
监听:lead:created
hejun-default · v1.0.0
本站现有的整套前台外观:首页、产品系统(列表/详情/版本日志)、FAQ、联系我们、二次开发、文档与隐私页,以及页头页脚与页面区块。作为可切换的主题包交付 —— 换主题即换整套外观。
26 文件源码 286 KB下载 91 KB>=1.0.0
sha256 810bdf08d66d…
moderncommerce · v1.0.0
第二套主题:由 HTML 模板 Moderncommerce 转换而来,含首页与 服务 / 案例 / 博客 / 团队 / 联系 / FAQ 共 13 个页面,自带完整样式与动效(jQu…
268 文件源码 23.8 MB下载 21.7 MB>=1.0.0
sha256 542ffd93ba5d…
23.8 MB 超过上传上限 20MB ⇒ 走不了「上传安装」,请解压到 engines/themes/moderncommerce 后点「重新扫描」✓
下载下来的包怎么装回去?两条路:① 后台「扩展市场 → 上传安装」(需要它在上传上限内;未签名的包在信任白名单非空时会被拒绝 —— 那就用你自己 engine:keygen 生成的密钥签一次); ② 手工解压到站点 engines/<类型>/ 下,再点一次「重新扫描」。 想接自己的扩展源(`ENGINE_INDEX_URL` 指向一份静态索引 JSON),见 完整文档的「打包、分发与安装」。
按顺序走完 00→10 就相当于"从零到把扩展发出去"的完整路径。每一节的「照抄验证」都是**可执行、可观察**的判据 —— 没有它,这一步就等于没写 ✓。字段表、扩展点清单、清单全字段这些会随代码变化的内容不在这里重复,它们在完整开发文档里由源码生成 ✓。
把"只写扩展"和"要看到它跑起来"这两种工作方式的最少依赖分清楚 —— 前者只需要 Node。
1node -v
要 Node ≥ 20。写包、校验清单、打包这三件事**只需要 Node**(引擎 CLI 是纯 Node 脚本 ✓),不需要数据库。
照抄验证:打印 v20 或更高。低于 20 时 CLI 会因语法/API 不兼容直接报错。
2npm ci
装整站依赖。要"看到扩展真的在站点里跑起来"时才需要这一步(引擎的运行时编译依赖 esbuild 与 @vue/compiler-sfc ✓)。
照抄验证:无 ERROR;node_modules 出现。
3npm run engine:list
列出仓库里的全部扩展包与清单校验结果。这是**不需要数据库**就能跑的 ✓。
照抄验证:打印每个包的类型 / id / 版本 / 说明,末尾一行「共 N 个包,其中 0 个清单有问题 ✓」。
4npm run dev(另开一个终端)
要看到界面效果就得起整站,而起整站需要 PostgreSQL 与 Redis(见仓库 .env.example ✓)。
照抄验证:打开 http://localhost:3000 能访问;终端里出现「Nitro built」。
5npm run engine:validate
每次改完包都先跑它。它同时校验规范快照与源码是否一致 ⇒ 也能挡住「文档过期」✓。
照抄验证:「0 个清单有问题、0 处区域契约错误、0 处主题契约错误」——**有告警也要处理**,它是零告警口径。
走通"生成骨架 → 写逻辑 → 启用 → 看到它生效"这一整条路。插件是最容易上手的类型。
1npm run engine:new -- --type plugin --id my-plugin --name "我的插件"
生成 engines/plugins/my-plugin/(manifest.json + hooks.ts + README.md ✓)。生成的骨架**本身是干净的**:零错误零告警。
照抄验证:提示「生成」且 engine:validate 立刻通过。
2编辑 manifest.json,把 "hooks": ["lead:created"] 填上
声明与实现**必须一致**:声明了没实现会被拒绝;实现了没声明则不会被注册(最坑的一种,因为它不报错但什么都不发生 ✓)。
照抄验证:engine:validate 仍通过;清单里 hooks 不再是空数组。
3编辑 hooks.ts:on('lead:created', async ({ lead }) => { log('收到新线索 ' + lead.id) })
log 会自动加 [engine:my-plugin] 前缀 ✓,这是后面"确认它真的跑了"的抓手。
照抄验证:engine:validate 通过(它会检查 on() 用到的扩展点都在清单里声明过 ✓)。
4后台 →「引擎与扩展」→ 重新扫描 → 启用
新装的包**默认停用** ✓。插件与钩子是运行时加载的:改完源码只需再点一次「重新扫描」,不用重新构建、也不用重启。
照抄验证:列表里出现我的插件,状态为已启用;重新扫描的返回里 uiErrors 为空。
5前台打开 /contact,提交一条需求
这一步才是真正的验收:**扩展点被触发**。
照抄验证:服务端控制台出现 [engine:my-plugin] 开头的一行日志,里面带你刚才那条线索的 id ✓。
做出"能在页面里放一块、参数后台可调、样式自己写的展示单元"。这是社区最容易被贡献的一类。
1先读一个真实的:engines/themes/hejun-default/components/FeatureSteps.vue
它就是"三步走"区块。要点只有两条:① 清单 settings 里的 key 与组件的 props **同名**就自动拿到值 ✓;② 只有 public: true 的设置项才会下发到前台 ✓。
照抄验证:在后台「引擎与扩展 → 禾君默认主题」能看到它的设置项并改值,前台刷新后跟着变。
2npm run engine:new -- --type theme --id my-block --name "我的区块"
区块就是"只有组件、没有布局与页面的 theme"✓ —— 类型名仍是 theme ✓(历史上叫过 template,那个名字已经不用了 ✓)。
照抄验证:engine:validate 通过,输出里出现 my-block。
3在 manifest.json 里声明 regions,例如 ["home.after-systems"]
区域是"页面留给扩展的位置"✓。站点里可用的区域清单在 engine:validate 输出的末尾 ✓;**声明了站点不存在的区域,校验会直接失败** ✓(宁可报错,也不让你做出一个永远不显示的区块 ✗)。
照抄验证:engine:validate 通过;若故意写一个不存在的区域,它会报错并列出可用清单 ✓ —— 这一条建议你真试一次。
4在站点页面里放 <TemplateSlots region="home.after-systems" />(或由主题自动注入)
页面只留位置,谁声明了该区域谁就出现在那里 ✓;没有扩展声明时它渲染为空 ✓(不会留下空洞 ✓)。
照抄验证:启用后前台对应位置出现你的区块;停用后立刻消失。
一整套业务能力:后台能管、接口能用、权限可分配、数据可存。
1npm run engine:new -- --type module --id my-module --name "我的模块"
模块骨架比插件多几个位置:pages/admin/、server/api/、schema.example.prisma ✓。
照抄验证:engine:validate 通过。
2照 faq-manager 写后台页:engines/modules/faq-manager/pages/admin/faqs.vue
这是"随源码交付"的真实模块 ✓(你也可以在开发者中心的「源码拉取」里直接下载它的源码 ✓)。后台页要完整语义(admin 布局 + 鉴权)就得随源码构建一次 ✓。
照抄验证:重新扫描后后台侧边栏出现你的菜单项,能进页面。
3在清单里声明 permissions,接口放进包内 server/api/admin/
**不必改核心的 route-perms.ts** ✓:声明的权限点会自动出现在后台「角色权限」里等分配 ✓;包内 server/ 路径原样映射为 /api/… ✓。
照抄验证:后台「角色权限」里能看到你声明的权限点;未分配时调接口返回 403,分配后通过 ✓。
4要建表时:写 schema.prisma(只写自己的 model)→ npm run engine:schema → npx prisma db push → 停服 npx prisma generate → 重启
这是**唯一绕不开重启**的部分 ✓:Prisma Client 由构建期生成,运行时加不了 model ✓。Windows 上 dev server 占着查询引擎 dll,不停服 generate 会 EPERM ✓。
照抄验证:重启后接口里 prisma.你的模型 可用;后台「扩展详情」显示它带了数据表。
5卸载时:npm run engine:remove -- --type module --id my-module
它会先跑扩展自己的 onUninstall 清理数据,再删目录与状态记录 ✓。数据表要不要手动清,写在 README 里 ✓(审核表也查这一条 ✓)。
照抄验证:提示卸载完成;engine:list 里不再出现它。
深入参考:模块自带后台接口与权限点数据模型
整套外观可切换:布局 + 样式(+ 新页面)。
1读两份真实主题:engines/themes/hejun-default(禾君默认)、engines/themes/moderncommerce(Modern Commerce)
两份都可以在开发者中心的「源码拉取」里浏览或下载 ✓(Modern Commerce 压缩后 21.68MB,超过后台上传上限 20MB ⇒ 它那条要**手工解压**到 engines/themes/ 下 ✓,页面会明确标出来 ✓)。
照抄验证:后台「主题」页能看到它们,且**同时只能激活一个** ✓。
2npm run engine:new -- --type theme --id my-theme --name "我的主题"
主题可含 layouts/(引擎会用它接管站点布局 ✓)与 assets/*.css(构建期注入站点样式表 ✓)。
照抄验证:engine:validate 通过;后台主题页出现你的主题。
3在后台「主题」页切换激活
切换是**可逆**的:未激活主题的页面与样式一律 404 ✓(有巡检闸门守着 ✓)。
照抄验证:前台外观立刻改变;切回默认主题后完全恢复。
4注意一条天花板:**扩展页面不能覆盖核心页面**
核心页面是构建期注册的具体路由,扩展页面撞上它永远不会被渲染 ✓(这是"核心优先"的有意设计 ✓)。要改核心页面就改核心源码,而不是硬写扩展 ✓。
照抄验证:试图用同名路径覆盖核心页面时,重新扫描的返回里会有告警 ✓。
深入参考:扩展能做到什么深度主题设计(离线文档)
把"改了没反应"变成"知道是哪一类没生效"。
1看「重新扫描」的返回值(后台「引擎与扩展」页)
接口、组件、页面的编译失败都会出现在 uiErrors 里 ✓。**编译失败的组件不会覆盖构建期那份** ⇒ 表现为"还是旧内容"✗ —— 这是最容易被误判成"热更新坏了"的一种 ✓。
照抄验证:故意在组件模板里写一处语法错 → 重新扫描 → uiErrors 里出现该文件与错误行 ✓。
2看服务端日志里 [engine:<包 id>] 开头的行
钩子里的异常会被引擎吞掉并记日志("顺带做的事"不该让主流程失败 ✓),所以**必须看日志**才知道钩子有没有跑、有没有报错 ✓。
照抄验证:启用插件后提交一条线索,日志里出现对应的 [engine:...] 行。
3看运行时产物目录 .engine-build/<包 id>@<版本>/
引擎把包内 .vue 就地编译成 ESM 后放在这里 ✓。怀疑"编译出来的东西不对"时直接看它 ✓。
照抄验证:该目录随包版本变化;engine:gc 会清掉旧版本(每包保留最近 2 个 ✓)。
4改了什么之后要做什么(照这张表来)
hooks.ts / 包内 server/api / 包内 components 与 pages / manifest.json ⇒ 点一次「重新扫描」✓;已有页面的模板(构建期注册的那份)⇒ 重新构建 + 重启 ✓;包内 schema.prisma ⇒ schema → db push → 停服 generate → 重启 ✓。
照抄验证:按表操作后现象与预期一致;不一致时先怀疑"是不是改错了表里的那一格" ✓。
把包交给别人装;付费包还能"装得上、看得见,但没授权就不跑"。
1npm run engine:keygen
生成一对 ed25519 密钥:私钥(ENGINE_PRIVATE_KEY)只留在你机器上 ✓,公钥交给站主加进「信任白名单」✓。**私钥绝不入库、绝不提交** ✓。
照抄验证:打印出新生成的密钥标识(keyId);再次执行会提示已有密钥。
2npm run engine:pack -- --type module --id my-module --sign
产出两个文件:包本体 .tar.gz(包内路径是 <id>/…✓)与同名描述文件 .json(含 sha256、作者、引擎兼容范围、签名与 keyId ✓)。
照抄验证:打印 sha256;描述文件里有 signature 与 keyId 字段。
3npx sha256sum dist/engines/<...>.tar.gz(或 certutil -hashfile ... SHA256)
自己核对一遍摘要与描述文件是否一致 ✓ —— 站主装不上时的第一件事就是比对这两个数 ✓。
照抄验证:算出来的摘要与描述文件里的 sha256 完全相同。
4付费包:npm run engine:license -- issue --type module --id <id> --to "客户名" --per-major --days 365 --domain client-a.com
三个收费选择都是签发参数、不用改代码 ✓(绑不绑域名、买断大版本还是永久、有效期 ✓)。签发完用 --verify 自查,--list 看台账 ✓。
照抄验证:verify 输出"有效";站主贴进后台时会**先校验再保存**,读不出来/不是给这个包的/签名对不上都会当场说明原因 ✓。
5注意:它不是 DRM
校验跑在站主自己的服务器上,他拥有代码与数据库 ⇒ 有能力改掉 ✓。它给的是"明确的契约状态 + 防误用" ✓,真正的约束力来自合同与交付关系 ✓。
照抄验证:这一点值得写进你的交付说明里 ✓(免得客户以为它防得住有心人)。
知道你的包走哪条路进来,以及要交什么。
1纯前端型(主题 / 区块)→ 开发者中心的「上架」自助通道
这是**唯一一条自助通道** ✓:只接受主题包(含只有组件的区块 ✓),且要求"签名者公钥已登记" ✓ —— 即站主的信任白名单里得有你的公钥 ✓(否则你会看到"信任表里还没有任何作者公钥"这句话 ✓,那就是原因本身 ✓)。
照抄验证:先点「预检(不写入)」:它会解包、跑闸门,把"将写到哪里、覆盖什么、为什么不行"全摆出来 ✓;确认后才「发布」✓。
2含服务端能力的(模块 / 插件)→ 把 .tar.gz + 描述文件 + 公钥交给站主,人工收录
原因不是"我们不爱做工具"✗,而是隔离:扩展的服务端代码跑在与核心同一个进程里、拿到同一份 prisma ✓ ⇒ 装陌生人的服务端代码 = 把自己的数据库交给它 ✓。这条边界写在 docs/marketplace-selfserve.md ✓。
照抄验证:站主侧会看到这包是谁签的(keyId)与从哪条通道进来的(installedFrom)✓ —— 出事时查得出"这个包是谁给的" ✓。
3《上架清单》——作者要交什么
① 清单合法(engine:validate 通过)且 compat.engine 明确声明 ✓;② 语义化版本,破坏性变更必须升大版本 ✓;③ 包内必须有 README.md(后台扩展详情页直接显示它 ✓)✓;④ 声明清楚:自带几张表、用哪些权限点、注入哪些区域、是否联网、是否含定时任务 ✓;⑤ 签名与公钥随包提交 ✓。
照抄验证:逐条对照一遍;缺 README 或声明不清的包,收录时会被退回 ✓。
4《审核表》——站主收录时逐条过(你提前自查一遍)
解包规则(无符号链接 / 无绝对路径 / 无 .. / 单顶层目录 = 包 id)✓;**不在运行时下载代码**(fetch 后 eval / 动态 import 远程 JS —— 这是绕过签名与审核的唯一路径 ✗)✓;不改核心表结构、不写别的模块的表 ✓;权限点粒度合理(不搞一个权限管全部 ✓)✓;联网地址白名单化写进 README ✓;有 README + 卸载说明(数据表要不要手动清 ✓)✓。
照抄验证:把"联网地址"与"要动哪些表"写进 README 再交付 ✓ —— 这两条是站主最先问的 ✓。
深入参考:开发者上传入口(本页下方)接口变更记录
让你的扩展在引擎升级后不会突然不可用。
1在清单里如实写 compat.engine 与 compat.nuxt
引擎会**真的比对**这两个区间 ✓(nuxt 以前是死字段,现在会参与判断 ✓)。写宽了会在升级后炸、写窄了会白白不可用 ✓。
照抄验证:engine:validate 不再给出"要求引擎 X,当前 Y"这类告警。
2破坏性变更 = 老调用方或老扩展会坏
删接口、删字段、可选字段变必填、字段类型变化、权限点变化、访问要求变严、删页面、扩展点或清单字段被移除 ✓;其余算兼容变更 ✓。**对扩展作者而言**:你的扩展如果依赖了某个扩展点或某个核心接口,那些东西被标记为破坏性时就要跟着改 ✓。
照抄验证:升级前先跑一次 API 变更记录(下一节),只看 since 之后的部分 ✓。
3GET /api/dev-docs?since=<你上次适配的引擎版本>
只返回那之后的变化 ✓(返回里带 changelogSince ✓)。这是给扩展作者准备的机器可读入口 ✓。
照抄验证:返回的 changelog 列表里能一眼看出有没有 breaking 项 ✓。
深入参考:接口变更记录(网页版)
把"没反应"拆成可检查的几类。
1症状:后台启用了扩展,但前台没有任何变化
按顺序查:① 扩展是否真的启用 ✓;② 它声明的扩展点是否"可用"(未实现的扩展点声明会被拒绝 ✓);③ 设置项里是不是把功能关了 ✓。
照抄验证:三步各有一条可观察的证据(列表状态 / 校验输出 / 设置值),别凭印象 ✓。
2症状:组件在页面上没出现,或者还是旧内容
先点一次「重新扫描」✓。返回里有 uiErrors ⇒ 编译失败 ⇒ 失败的组件**不会覆盖构建期那份** ⇒ 现象就是"还是旧的" ✓。另外用 <component :is="名字"> 渲染时,名字要和文件名一致 ✓。
照抄验证:重新扫描的返回里 uiErrors 为空,且页面显示的是新内容。
3症状:扩展接口 404 或报 xxx is not a function
404 ⇒ 依次确认:文件在包内 server/api/ 下 ✓、做过一次重新扫描 ✓、没与核心接口重名(重名会被跳过并在服务端日志告警 ✓)。is not a function ⇒ 用了"可直接使用的名字"清单以外的标识符 ✓(用清单里的名字,或显式 import ✓)。
照抄验证:日志里没有"跳过扩展接口"的告警;调用返回 200 而不是 404。
4症状:我改了包内 server/ 下的新接口文件,但前台还是 404(实测踩过 ✓)
**新加的服务端路由需要重启 dev server** ✓ —— 改动已有文件会热更新,但**新增**的路由文件在当前开发环境里要重启一次才注册 ✓。这一条是本站在做「源码拉取」时自己踩到的 ✓,写下来免得你也白查一轮 ✓。
照抄验证:重启后同一个 URL 从 404 变成 200。
5症状:包下载下来改完,后台上传被 413 挡住
安装器有**自己的**体积上限(`LIMITS.maxTotalBytes`,当前 20MB ✓)。超过它的包(例如 Modern Commerce 主题,压缩后 21.68MB ✓)走不了上传通道 ✓ ⇒ 改成**手工解压**:把 tar.gz 解到你站点的 engines/<类型>/ 下(包内顶层目录就是包 id ✓),再点一次「重新扫描」✓。
照抄验证:engine:list 里能看到它、后台能启用 ✓(这条不受上传上限约束 ✓)。
知道"引擎/接口/规范改了什么",以及怎么只看自己关心的那一段。
1网页版:/docs#changelog
由脚本从**代码差异生成**(不是手写的 ✓),所以它不会过期 ✓。破坏性变更被单独标出来 ✓。
照抄验证:能看到每次变更的日期、引擎版本、逐条变更与是否破坏性 ✓。
2机器可读版:GET /api/dev-docs?since=<引擎版本>
同上,但按 since 过滤 ✓,适合放进你的 CI 或适配清单 ✓。
照抄验证:返回里 changelogSince 与请求的 since 一致。
3维护者侧:npm run api:changelog -- --note "说明"
改动核心接口/模型/页面/扩展规范后跑一次,把变化落账 ✓。有静态闸门守着接口快照与代码一致 ✓ —— 破坏性变更不走这一步会被拦下 ✓。
照抄验证:报告里不再出现 api-drift 这类失败。
纯前端型(主题 / 区块)走下面的自助通道(唯一的自助通道); 含服务端能力的模块与插件走人工收录 —— 原因不是"工具没做", 而是隔离:扩展的服务端代码跑在与核心同一个进程里、拿到同一份数据库权限, 装陌生人的服务端代码等于把自己的数据库交给它。这条边界写在 docs/marketplace-selfserve.md。
开发文档已经并进这里 ✓ —— 顶部导航只保留「开发者中心」一条 ✓, 完整文档仍是独立一页(`/docs` ✓:1700 行、含生成型数据与锚点,塞进本页只会变成怪物 ✗), 下面按文档本身的章节给出直达入口 ✓。接口、模型、页面与组件清单全部由源码扫描生成, 改代码后它自己就更新 ✓ —— 所以这里不抄第二份。
引擎与扩展(规范正文)
三类扩展、包内部布局、manifest 全字段、settings 子字段、扩展点清单、hooks.ts 接口与生命周期、权限点、运行时编译的边界、打包签名授权、三种安装方式、13 条常见报错对照
/docs#engines
扩展能做到什么深度
10 个常见场景的能力对照 + 六条天花板(含成因与对策)+ 改了什么时候生效
/docs#depth
接口与规范变更记录
由代码差异生成,不会过期;破坏性变更单独标注;可用 GET /api/dev-docs?since= 只看那之后的变化
/docs#changelog
内容契约(主题可依赖的数据)
产品、页面、站点配置、FAQ、导航、搜索、表单 —— 哪些字段是稳定承诺
/docs#contract
离线交付也能拿到全部材料:docs/engine-spec.md(权威规范 §0–§14)、 docs/engine-capabilities.md(能力与天花板)、 docs/theme-design.md(主题设计)、 docs/official-modules.md(官方包规格), 以及本页指南的离线版 docs/dev-guide.md —— 它们都在整站源码包里 ✓。 机器可读的接口与模型清单:dev-docs.json。