文档工作流

Holon 网站源码位于 docs/website/,构建时会在 .tools/dist/content/ 中准备隔离的 mdorigin 内容根。源页面是 Markdown 文件,可以渲染为 HTML,也可以按 Markdown 获取。

编辑内容

在 docs/website/ 下新增或更新 Markdown 文件。用各目录的 README.md 作为分区落地页:

docs/website/
  README.md
  concepts/
    README.md
    runtime-model.md
  guides/
    README.md

面向公众的网站文案保持简洁。详细的运行时契约和设计记录仍放在仓库的 docs/ 目录下。

使用文档分层说明来判断修改应归入概念文档、任务指南、参考手册还是维护者契约。

检查契约引用

文档 CI 会检查以下位置中仓库本地的 Markdown 链接和标题锚点:

专题规范还可以在 Last verified 引用块或 Implementation references 一节中声明实现路径。把仓库路径写成代码片段,例如:

> **Last verified:** against `src/runtime/scheduler.rs` and
> `src/runtime/waiting.rs`.

其他位置需要强制校验某个源码路径时,用真实的 Markdown 链接:

[`src/http/mod.rs`](../../../src/http/mod.rs)

围栏示例、占位符和普通代码片段不会被当作当前的实现契约。如果某条本应被检查的行上是历史或提议的引用,只有在该引用之后紧接一条非空原因说明时,才能把它排除:

`src/runtime/proposed.rs` <!-- contract-ref-ignore: proposed file from accepted RFC -->

在仓库根目录运行检查:

npm --prefix docs/website/.tools run prepare:content
npm --prefix docs/website/.tools run check:content
python3 docs/website/.tools/test-check-contract-refs.py
python3 docs/website/.tools/check-contract-refs.py

失败时用 file:line:target 格式给出诊断,方便编辑器和 CI 日志直接定位声明位置。 链接与导航统一使用准备好的内容根检查,其中包含生成路由。

本地预览

使用 Node.js 22.x(不低于 22.23.4)和 Python 3.11 或更高版本。在仓库根目录运行:

npm ci --prefix docs/website/.tools
npm --prefix docs/website/.tools run dev

dev 在启动时生成内容快照,预览服务读取该快照,而不是源码树。修改任何网站正文 (包括普通 Markdown)、配置、样式、模板或展示元数据后,都需要重启预览。 仅正文改动时,也可另行运行 npm --prefix docs/website/.tools run prepare:content 刷新生成文件;配置和样式由 mdorigin 在启动时加载,必须重启才能更新。 源码改动不会自动复制;目前没有监听源码树的 watcher。

刷新索引

文档目录页只用一份受管理的索引列出本节文章。正文可保留导读和跨分区链接, 但不要复制目录,也不要把索引翻译成正文里的第二份列表。翻译各文章的 title 和 summary 后重新生成索引即可。在 docs/website 下运行 npm --prefix .tools run check:directories 检查生成目录页中的重复链接;运行前先准备内容并构建索引。

目录页可以包含受管理的索引块:

<!-- INDEX:START -->
<!-- INDEX:END -->

在 docs/website 下运行以下命令,在隔离内容根中重新生成:

npm --prefix .tools run prepare:content
npm --prefix .tools run build:index
npm --prefix .tools run check:directories

构建可部署产物

在 docs/website 下运行:

npm --prefix .tools run build

构建只准备一次内容,后续目录索引、生成链接与目录检查、搜索索引和 Cloudflare 打包都使用同一个内容根。搜索与部署产物仍分别位于 .tools/dist/search/ 和 .tools/dist/cloudflare/。生成的 .tools/dist/ 已被忽略,不应提交,也不要把生成目录复制回源码页面。

模板目录

模板目录读取仓库本地的 agent_templates/*/template.toml 和 skills.toml。 .tools/build-template-catalog.py 复制网站内容(不包含 .tools),并在 .tools/dist/content/ 中生成首页精选、完整目录页和 JSON 资源。该脚本可以从任意当前目录运行。 构建不会通过网络拉取模板,也没有目录 API:模板数据与文档来自同一次 Git 提交 SHA。

分类、精选顺序和可选的中文展示名称及摘要维护在 template-display.json, 角色契约仍以模板文件为准。缺少中文展示文案时回退到模板的英文元数据; 没有展示配置的模板仍会出现在完整目录中,并使用兜底分类。 删除精选模板后,构建会报错,直到在 template-display.json 中移除或替换对应的失效精选项。

CI 会验证模板与生成器测试,保留契约引用和生成副本检查,并使用实际内容根检查全部复制的源码、生成页面链接及导航。 PR 只构建和上传产物,不部署。

生成页面与多语言

有些页面由生成器产出,而不是人工撰写。目前只有 reference/models.md,生成命令为:

cargo run --bin holon-docgen -- models > docs/website/reference/models.md

不要人工翻译生成页面:下一次重新生成会覆盖翻译。应把该页面登记到 .tools/generated-pages.json,然后同步各语言副本:

npm --prefix .tools run sync:generated

脚本会把生成的英文页面复制到各语言路径,替换清单中列出的 front matter 字段为本地化文案, 并加上一条正文由生成器产出的说明。复制结果与原页面一起提交。文档 CI 会以 --check 运行同一脚本,一旦生成页面与其副本不一致就失败,因此重新生成后只需多跑一条命令, 不需要重新翻译。

语言自动检测

站点包含两个语言:en(默认)与 zh-CN。mdorigin.config.json 启用了 localeDetection,因此访问 / 时会按访问者偏好语言重定向一次到对应语言根路径。 深层链接不会被重定向,通过页头语言切换器做出的选择优先,爬虫始终停留在默认语言根路径。

刷新生成的契约快照

OpenAPI、HTTP 路由、CLI、运行时状态枚举和模型工具 schema 快照由主 CI 单独检查。发布契约变更前运行 make snapshots-check。如果变更是有意为之,运行 make snapshots-refresh,审阅生成的 diff,然后重新运行 make snapshots-check。

发布说明

siteUrl 配置为 https://holon.run,因此发布会为生产域名暴露规范的 sitemap 和 feed URL。