setup-template

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

setup-template

setup-template

masseater/typescript-template から作ったリポジトリで使う前提で書いている。 それ以外のリポジトリで使ってもよい。 ただしその場合は、手順を始める前に、どの手順を適用するかをユーザーに確認する。
設定はすべて
gh
で行う。対象リポジトリを
REPO=<owner>/<name>
とする。 どの手順も、同じ値で何度実行しても結果が変わらない。
本内容以用于 masseater/typescript-template 创建的仓库为前提编写。 也可以用于其他仓库。 不过,在这种情况下,开始执行步骤之前,需要先向用户确认要应用哪些步骤。
所有设置均通过
gh
完成。将目标仓库设为
REPO=<owner>/<name>
。 每个步骤都具备幂等性,使用相同的值重复执行不会改变结果。

この skill が必要な理由と達成したい状態

需要此 skill 的原因与目标状态

この skill が必要な理由は、テンプレートから作ったリポジトリに、コードとワークフローは引き継がれても、secrets、Actions の権限、ルールセットなど GitHub 側の設定とアプリ名が引き継がれないことにある。ワークフローのファイルは揃っているので設定の抜けは見えず、抜けたまま動く自動化は失敗するか何もしないまま、誰も気づかない。
この skill で達成したい状態は、作った直後から、テンプレートと同じ自動化と保護が効いていることである。
需要此 skill 的原因是:从模板创建的仓库虽然会继承代码和 workflow,但 GitHub 端的 secrets、Actions 权限、ruleset 等设置以及应用名称不会继承。由于 workflow 文件已经齐全,设置缺失并不容易被发现;而缺少相关设置的自动化可能会执行失败,也可能什么都不做,且不会有人察觉。
此 skill 的目标状态是:仓库创建后立即生效与模板相同的自动化和保护机制。

1. アプリ名を変える

1. 更改应用名称

apps/web/app-name.ts
の
APP_NAME
は、テンプレートの名前のままになっている。 リポジトリ名に合わせて変える。 同じ Cloudflare アカウントの別リポジトリと名前が重なると、互いのリソースを置き換え合う。
apps/web/app-name.ts
中的
APP_NAME
仍保留着模板中的名称。 需要将其改为与仓库名称一致的值。 如果与同一 Cloudflare 账户下的其他仓库重名,它们的资源会相互覆盖。

2. secrets を登録する

2. 注册 secrets

値はユーザーに尋ねる。
sh
gh secret set OPENROUTER_API_KEY --repo "$REPO"
gh secret set CLAUDE_CODE_OAUTH_TOKEN --repo "$REPO"
gh secret set CLOUDFLARE_ACCOUNT_ID --repo "$REPO"
gh secret set CLOUDFLARE_API_TOKEN --repo "$REPO"
名前用途
OPENROUTER_API_KEY
verify ワークフローの oxlint-plugin-decision
CLAUDE_CODE_OAUTH_TOKEN
verify 失敗時に Claude Code が自動修正する
CLOUDFLARE_ACCOUNT_ID
デプロイ先と Alchemy の状態を置くアカウント
CLOUDFLARE_API_TOKEN
同じアカウントの API トークン
Organization のリポジトリなら、Organization の secrets に一度登録すれば、各リポジトリでの登録は要らない。
向用户询问相应的值。
sh
gh secret set OPENROUTER_API_KEY --repo "$REPO"
gh secret set CLAUDE_CODE_OAUTH_TOKEN --repo "$REPO"
gh secret set CLOUDFLARE_ACCOUNT_ID --repo "$REPO"
gh secret set CLOUDFLARE_API_TOKEN --repo "$REPO"
名称用途
OPENROUTER_API_KEY
verify workflow 的 oxlint-plugin-decision
CLAUDE_CODE_OAUTH_TOKEN
verify 失败时由 Claude Code 自动修复
CLOUDFLARE_ACCOUNT_ID
存放部署目标及 Alchemy 状态的账户
CLOUDFLARE_API_TOKEN
同一账户的 API token
如果仓库属于 Organization,只需在 Organization 的 secrets 中注册一次,无需在每个仓库中分别注册。

3. Actions に PR の作成を許可する

3. 允许 Actions 创建 PR

release-please と自動修正のワークフローが PR を作る。
sh
gh api --method PUT "repos/$REPO/actions/permissions/workflow" \
  -f default_workflow_permissions=read -F can_approve_pull_request_reviews=true
release-please
和自动修复 workflow 会创建 PR。
sh
gh api --method PUT "repos/$REPO/actions/permissions/workflow" \
  -f default_workflow_permissions=read -F can_approve_pull_request_reviews=true

4. PR を作れる人を collaborator に限り、auto-merge を有効にする

4. 将 PR 创建者限制为 collaborator,并启用 auto-merge

sh
gh api --method PATCH "repos/$REPO" -f pull_request_creation_policy=collaborators_only \
  -F allow_auto_merge=true -F allow_update_branch=true
sh
gh api --method PATCH "repos/$REPO" -f pull_request_creation_policy=collaborators_only \
  -F allow_auto_merge=true -F allow_update_branch=true

5. 既定ブランチを保護する

5. 保护默认分支

既定ブランチの削除と force push を禁じ、
up-to-date
チェックを通っていない PR と、最新の既定ブランチを取り込んでいない PR のマージを拒むルールセットを置く。 バイパスは置かない。release-please の PR は、Claude が既定ブランチを取り込んで push し、そこで動いた
up-to-date
を通してからマージする。 同じ名前のルールセットがあれば置き換える。
sh
id="$(gh api "repos/$REPO/rulesets" --jq '.[] | select(.name == "protect default branch") | .id')"
gh api --method "$([ -n "$id" ] && echo PUT || echo POST)" "repos/$REPO/rulesets${id:+/$id}" --input - <<'JSON'
{
  "name": "protect default branch",
  "target": "branch",
  "enforcement": "active",
  "conditions": { "ref_name": { "include": ["~DEFAULT_BRANCH"], "exclude": [] } },
  "bypass_actors": [],
  "rules": [
    { "type": "deletion" },
    { "type": "non_fast_forward" },
    {
      "type": "required_status_checks",
      "parameters": {
        "strict_required_status_checks_policy": true,
        "do_not_enforce_on_create": false,
        "required_status_checks": [{ "context": "up-to-date", "integration_id": 15368 }]
      }
    }
  ]
}
JSON
禁止删除默认分支和 force push,并创建一个 ruleset,拒绝合并未通过
up-to-date
检查以及未包含最新默认分支内容的 PR。 不设置 bypass。
release-please
的 PR 会由 Claude 合并默认分支并 push,待变更在该分支生效并通过
up-to-date
后再进行合并。 如果存在同名的 ruleset,则替换它。
sh
id="$(gh api "repos/$REPO/rulesets" --jq '.[] | select(.name == "protect default branch") | .id')"
gh api --method "$([ -n "$id" ] && echo PUT || echo POST)" "repos/$REPO/rulesets${id:+/$id}" --input - <<'JSON'
{
  "name": "protect default branch",
  "target": "branch",
  "enforcement": "active",
  "conditions": { "ref_name": { "include": ["~DEFAULT_BRANCH"], "exclude": [] } },
  "bypass_actors": [],
  "rules": [
    { "type": "deletion" },
    { "type": "non_fast_forward" },
    {
      "type": "required_status_checks",
      "parameters": {
        "strict_required_status_checks_policy": true,
        "do_not_enforce_on_create": false,
        "required_status_checks": [{ "context": "up-to-date", "integration_id": 15368 }]
      }
    }
  ]
}
JSON

6. 反映を確かめる

6. 确认配置已生效

gh api "repos/$REPO" --jq '[.pull_request_creation_policy, .allow_auto_merge]'
が
["collaborators_only",true]
を返すことを確かめる。
gh api "repos/$REPO/rules/branches/$(gh api "repos/$REPO" --jq .default_branch)" --jq '[.[].type]'
に
required_status_checks
があることも確かめる。
确认
gh api "repos/$REPO" --jq '[.pull_request_creation_policy, .allow_auto_merge]'
返回
["collaborators_only",true]
。 还要确认
gh api "repos/$REPO/rules/branches/$(gh api "repos/$REPO" --jq .default_branch)" --jq '[.[].type]'
中包含
required_status_checks
。