这是一份当前使用文档。Agent 和页面作者先复用现有能力,再决定是否需要扩展主题。pages 描述站点现在如何工作;posts 保存有日期的产品变化。如果编译器或主题行为发生变化,应更新本页和其他当前页面。需要新增 Block 或修改主题时,请阅读二次开发

学习路径

让可选类别默认关闭,只在同意后加载受信任的 HTTP(S) 脚本。 打开“Cookie 同意”

自定义渲染

先复用 Pattern 和 Block,再复制主题实现可复用扩展。 打开“自定义”

1. 安装

Pageskill 要求 Node.js >=22.12.0 和 npm。在本仓库中操作:

git clone https://github.com/jsw-teams/pageskill.git
cd pageskill
npm install

使用源码 CLI 前,先编译运行时、主题和后端:

npm run compile-runtime
npm run compile-theme
npm run compile-backend

要在其他目录创建中性的站点,可链接本地 CLI,让它复制真实的 starter/ 模板:

npm link
mkdir my-site
cd my-site
pageskill init

pageskill init 不会在 CLI 里再生成一套隐藏模板,而是复制 starter/,包括 config.yml、内容和主题资源。

2. 先发现并复用能力

新页面先看能力目录,再开始写内容:

pageskill catalog
pageskill inspect pattern:landing
pageskill inspect block:hero
pageskill inspect collection:pages

从结果中选择已有 Pattern、Block 和 collection schema,填写 Markdown、Frontmatter 与 config.yml 数据。下面的最小页面使用仓库和 starter 都提供的 landing Pattern 与 hero Block;页面作者只写内容和属性,不需要逐页手写 HTML:

---
title: 产品入口
description: 说明这个入口页面的用途。
pattern: landing
---

:::hero{tone="brand" align="left"}
# 让 Agent 复用已有结构

把页面内容写在 Markdown 中。
:::

接着运行 pageskill checkpageskill g --profile。只有 catalog/inspect 没有覆盖需求时,才复制主题并实现一次可复用 Pattern 或 Block;扩展流程见二次开发

3. 写入第一批内容

源码目录有两个 collection:

content/
├─ pages/<id>/<locale>.md       当前站点信息
├─ posts/<id>/<locale>.md       有日期的产品笔记
└─ assets/                      图片及其他站点资源

当前页面写在 content/pages/。当首页、About、Guide、Reference 和目录页回答“站点现在怎样工作”时,它们都属于 pagesdocspages 中的 Pattern,不是第三个 collection。

---
title: 本地搜索
description: 当前构建如何建立索引并标记结果位置。
pattern: docs
---

# 本地搜索

Pageskill 当前为每种语言建立静态索引,并按命中的标题、章节、正文或路径标记结果位置。

本仓库的完整默认主题含有 docs Pattern;pageskill init 复制的最小 starter 只有 landingdocumentblog 等目录能力。使用 starter 时先用 document,或复制提供 docs 的主题,并以 pageskill catalog 确认能力后再采用上面的示例。

只有在记录一次有日期的决定、实现、发布、事故、部署或测量时,才在 content/posts/<id>/<locale>.md 写产品笔记。date 字段必填。

---
title: 搜索结果新增命中位置
description: 记录 2026-08-10 新增可见命中位置标签的变更。
date: 2026-08-10
pattern: blog
---

# 搜索结果新增命中位置

这篇笔记记录当天改了什么以及为什么这样改。当前搜索用法仍然写在 Guide 中。

当前行为变化时,更新原来的页面。旧产品笔记保留为历史;新的有日期变化新增一篇笔记。这样 pages 表示当前状态,posts 表示时间线历史。

4. 检查源码

预览或部署前先运行:

pageskill check

检查会验证 YAML Frontmatter、必填 schema 字段、collection 路由、翻译组、Pattern 和 Block 名称、指令属性以及路由冲突。产品笔记缺少 date 会检查失败;当前页面不需要日期。

需要确认当前主题实际提供了什么能力时,使用源码发现命令:

pageskill catalog
pageskill inspect collection:pages
pageskill inspect collection:posts
pageskill inspect block:hero

catalog 读取源码能力,不要求先完整构建站点。inspect 为内容 id 或明确 namespace 返回结构化事实。

5. 本地预览

启动增量预览服务:

pageskill s

打开http://127.0.0.1:4173/。默认端口被占用时:

pageskill s --port=4174

服务启动时先构建一次,然后监听 config.ymlcontent/themes/。受影响的输出重建后浏览器会刷新,所以 Markdown、Frontmatter、CSS 或主题修改不需要重启进程即可看到。构建诊断错误会打印出来,但预览进程会继续运行,方便修复后再次构建。

在仓库源码中,等价的 npm 别名是 npm run snpm run s -- --port=4174

6. 构建 dist/

生成构建输出:

pageskill g
pageskill g --profile

短命令和 pageskill build 执行相同操作。它写入 dist/,包括 HTML、单行压缩并带指纹的 CSS、浏览器 ESM 资源、Feed、sitemap、搜索数据、llms.txt、自定义 404 页面和目标平台部署文件。构建 profile 位于 dist/.pagekiln/build-profile.json

在源码仓库中可运行 npm run g -- --profile。不要手动编辑 dist/,应修改源码后重新生成。

7. 从 config.yml 部署

部署写在站点配置文件中,不把供应商凭据放到命令行。可以选择一个或多个 target:

deployment:
  targets: [cloudflare-pages, vps]
  cloudflare:
    apiTokenEnv: CLOUDFLARE_API_TOKEN
    pages:
      project: example-site
      branch: production
  vps:
    host: vps.example.com
    user: deploy
    port: 22
    remotePath: /var/www/example-site
    identityFile: ~/.ssh/id_ed25519
    publicKeyFile: ~/.ssh/id_ed25519.pub

支持的 target 是 cloudflare-pagescloudflare-workersgithub-pagesvps,以及可选的 openai-sites connector handoff。凭据放在环境变量、本机 SSH agent 或 SSH 密钥文件中,不要把 token 或私钥内容写进 config.yml

上传前先查看解析后的操作:

pageskill d --dry-run

确认后上传:

pageskill d

pageskill d 会先构建。Cloudflare Pages 使用 Wrangler 发布目标整理后的输出;Cloudflare Workers 使用生成的标准 module Worker;GitHub Pages 把公开 snapshot 推送到配置的远程分支且不运行 API;VPS 使用 SCP 复制目标部署输出到配置的路径。VPS 必须已有 SSH 访问权限、远程目录,并在使用密钥认证时把公钥放进服务器的 authorized_keys

静态生成是默认渲染方式,不限制产品使用动态能力:普通内容会预先生成,需要交互时再调用同一个 Worker/Fetch 服务提供的同源 API。同一个 Worker/Fetch 服务处理生成页面和 /api/*;其他动态路径写入 deployment.dynamicRoutes。部署目标会将公开资源与私有 server 代码分开。不要把含有私有代码的构建输出作为公开静态根目录;server/_pagekiln/.pagekiln/、Worker 文件和 *.toml 必须留在私有目录,秘密只在运行时读取。GitHub Pages 只推送公开 snapshot,不运行 API;Workers 和动态 VPS 使用各自的服务端边界。Cloudflare Workers 默认将公开资源放在 dist/public,通过 assets.directory: public 隔离公开目录;.assetsignore 仅作为额外排除层,Cloudflare Pages 使用目标专用的部署整理,将私有路径排除在公开资源之外。高级部署兼容设置与边界见二次开发。OpenAI Sites 不是本项目的默认绑定,部分地区可能无法访问;需要广泛可达性时,应从目标地区测试最终域名。

8. 修改主题或新增 Block

将主题复制到 themes/<name>/,在 theme.ts 实现 Block,在 theme.yml 注册;主题共用 CSS 放入 style.css,Block 专用 CSS 放入声明的 blocks/<id>.css。然后依次运行 cataloginspectcheckbuildserve。完整示例见二次开发

不要为了保留旧实现而增加第二份 CSS、浏览器脚本或兼容 wrapper。重新设计替代旧规则或处理器时,删除重复项并检查生成结果。

9. 发布前检查

npm test
pageskill check
pageskill g --profile
pageskill inspect collection:posts
pageskill d --dry-run

检查三种语言链接、自定义 404、feed.xmlsitemap.xmlllms.txt、可选 Cookie 脚本、键盘焦点、窄屏表格和生成的部署文件。产品笔记必须按日期倒序出现在 archive/feed;当前页面不应被强制要求填写日期。