feat(site): 新增项目官网(静态站点 + Cloudflare Pages 自动部署)#61
Merged
Conversation
为 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 无硬编码密钥。
Owner
Author
|
ℹ️ 关于 CI:「全量审计」红是继承自 main 的既有问题,与本 PR 无关。
合并前置条件:① 仓库 Secrets 已配 |
安全审核发现两处防御纵深缺口(当前内容可信、非活跃漏洞,但公开站应补齐):
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 已校验合法。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
你要解决什么问题?
superpowers-zh 此前没有项目官网/展示站点,skill 列表只能在 GitHub README 里看,对中文用户的浏览和分享体验不友好。需要一个自动从
skills/生成、随仓库更新自动部署的中英双语站点。这个 PR 做了什么改变?
新增
site/静态站点生成器(从skills/+ 模板生成中英双语站,42 页:中/英首页 + 20 skill × 2 语言详情),并加一个 GitHub Actions workflow,在 push 到 main 且site/或skills/变更时构建并部署到 Cloudflare Pages。这个改变适合放在核心库中吗?
属于项目自身的基础设施(官网 + 部署),面向所有中文用户,随仓库一起维护。不引入运行时依赖(
wrangler仅部署期用,构建只用 Node 标准库)。你考虑了哪些替代方案?
build.mjs直接从skills/源生成,skill 更新后站点自动同步,零额外依赖、零内容重复。site/dist/已加入.gitignore,只提交源码,由 CI 重建——避免产物与源码漂移、避免大 diff。这个 PR 是否包含多个不相关的改变?
否。全部围绕"项目官网"一件事:生成器源码 + 忽略产物规则 + 部署 workflow + package.json 的 site 脚本,彼此直接依赖。与 v6 同步系列 PR(#57–#60)文件不重叠。
已有的 PR
测试环境
评估
基础设施改动(非 skill 行为内容),用构建验证:
node site/build.mjs构建成功,生成 42 页(中/英首页 + 20 skill × 2 语言)到site/distsite/dist/已确认被.gitignore排除、未入库(只提交源码)site/build.mjs经扫描无硬编码密钥严格性
人工审核