Skip to content

feat(site): 新增项目官网(静态站点 + Cloudflare Pages 自动部署)#61

Merged
jnMetaCode merged 3 commits into
mainfrom
feat/site
Jun 19, 2026
Merged

feat(site): 新增项目官网(静态站点 + Cloudflare Pages 自动部署)#61
jnMetaCode merged 3 commits into
mainfrom
feat/site

Conversation

@jnMetaCode

Copy link
Copy Markdown
Owner

你要解决什么问题?

superpowers-zh 此前没有项目官网/展示站点,skill 列表只能在 GitHub README 里看,对中文用户的浏览和分享体验不友好。需要一个自动从 skills/ 生成、随仓库更新自动部署的中英双语站点。

这个 PR 做了什么改变?

新增 site/ 静态站点生成器(从 skills/ + 模板生成中英双语站,42 页:中/英首页 + 20 skill × 2 语言详情),并加一个 GitHub Actions workflow,在 push 到 main 且 site/skills/ 变更时构建并部署到 Cloudflare Pages。

这个改变适合放在核心库中吗?

属于项目自身的基础设施(官网 + 部署),面向所有中文用户,随仓库一起维护。不引入运行时依赖(wrangler 仅部署期用,构建只用 Node 标准库)。

你考虑了哪些替代方案?

  • 手动维护 HTML / 第三方文档站(如 VitePress):放弃。build.mjs 直接从 skills/ 源生成,skill 更新后站点自动同步,零额外依赖、零内容重复。
  • 构建产物入库:放弃。site/dist/ 已加入 .gitignore,只提交源码,由 CI 重建——避免产物与源码漂移、避免大 diff。

这个 PR 是否包含多个不相关的改变?

否。全部围绕"项目官网"一件事:生成器源码 + 忽略产物规则 + 部署 workflow + package.json 的 site 脚本,彼此直接依赖。与 v6 同步系列 PR(#57#60)文件不重叠。

已有的 PR

测试环境

工具(如 Claude Code、Cursor) 工具版本 模型 模型版本/ID
Node.js(跑 site 构建) v22.14.0

评估

基础设施改动(非 skill 行为内容),用构建验证:

  • node site/build.mjs 构建成功,生成 42 页(中/英首页 + 20 skill × 2 语言)到 site/dist
  • site/dist/ 已确认被 .gitignore 排除、未入库(只提交源码)
  • site/build.mjs 经扫描无硬编码密钥
  • 部署 workflow 只在 push 到 main 时触发,不在 PR 分支触发

⚠️ 合并前置条件:① 仓库 Settings → Secrets 已配 CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID(已配);② Cloudflare 已建好名为 superpowers-zh-site 的 Pages 项目。合并到 main 后首次部署才会成功。

严格性

  • 非 skill 行为措辞改动(站点生成器 + 部署基建);用构建验证(见上)
  • 经构建验证,产物正确、无密钥泄漏、产物不入库
  • 未触碰任何精心调优的行为内容(红旗表、合理化列表、"人类搭档"用语)

人工审核

  • 提交前已有人工审核过完整的 diff

为 superpowers-zh 增加官方站点:用 site/build.mjs 从 skills/ 与模板生成
中英双语静态站(42 页:中/英首页 + 20 skill × 2 语言详情),部署到
Cloudflare Pages。

- site/build.mjs + site/md.mjs + site/template/:站点生成器源码
- site/README.md:站点说明
- .gitignore:忽略 site/dist/(构建产物不入库,CI 重建)
- .github/workflows/deploy-site.yml:push 到 main 且 site/ 或 skills/
  变更时,构建并部署到 Cloudflare Pages 项目 superpowers-zh-site
  (需仓库 Secrets:CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID)
- package.json:加 site / site:deploy 脚本

验证:node site/build.mjs 构建成功,生成 42 页到 site/dist;
site/dist 已确认被 gitignore 排除、未入库;build.mjs 无硬编码密钥。
@jnMetaCode

Copy link
Copy Markdown
Owner Author

ℹ️ 关于 CI:「全量审计」红是继承自 main 的既有问题,与本 PR 无关

合并前置条件:① 仓库 Secrets 已配 CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID(已配);② Cloudflare 需建好名为 superpowers-zh-site 的 Pages 项目。部署只在合并到 main 后触发。

安全审核发现两处防御纵深缺口(当前内容可信、非活跃漏洞,但公开站应补齐):

1. 部署站 _headers 此前只有 Cache-Control,缺所有安全响应头。
   现新增全站 /* 头:
   - Content-Security-Policy:default-src 'self';script-src 'self' + 本站
     内联脚本的 SHA-256 hash(构建时从生成 HTML 实测,禁用 unsafe-inline/
     unsafe-eval 又不误伤自有脚本);style-src 'self';object-src 'none';
     base-uri 'self';frame-ancestors 'none';form-action 'self'
   - X-Content-Type-Options: nosniff / X-Frame-Options: DENY /
     Referrer-Policy: no-referrer / Cross-Origin-Opener-Policy: same-origin /
     Permissions-Policy(关闭定位/麦克风/摄像头)
2. md.mjs 链接渲染未校验 scheme。现仅放行 http/https/mailto/锚点/相对
   路径,阻断 javascript:/data:/vbscript: 等可执行 scheme,并转义引号防
   属性逃逸。

验证:重建 42 页成功;独立核验全站 84 处内联脚本的 hash 全部命中 CSP
白名单(0 缺失 → CSP 不会打断站点);链接净化单测 5/5(正常/锚点/相对
保留,javascript:/data: 中和为 #);站点正常外链完好。外部资源仅 <a>
导航链接,不受 default-src 影响。
部署 job 持有可写的 Cloudflare API token,第三方 action 用可变标签
(@V3 等)存在标签劫持/供应链风险。改为 commit SHA 固定,附版本注释:

- actions/checkout@34e1148… # v4
- actions/setup-node@49933ea… # v4
- cloudflare/wrangler-action@9acf94a… # v3

SHA 与 GitHub 当前标签解析一致(checkout/setup-node 的 SHA 也与既往
CI 日志中运行器解析的值吻合)。YAML 已校验合法。
@jnMetaCode jnMetaCode merged commit cc5841f into main Jun 19, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant