setup-template
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinesesetup-template
setup-template
masseater/typescript-template から作ったリポジトリで使う前提で書いている。
それ以外のリポジトリで使ってもよい。
ただしその場合は、手順を始める前に、どの手順を適用するかをユーザーに確認する。
設定はすべて で行う。対象リポジトリを とする。
どの手順も、同じ値で何度実行しても結果が変わらない。
ghREPO=<owner>/<name>本内容以用于 masseater/typescript-template 创建的仓库为前提编写。
也可以用于其他仓库。
不过,在这种情况下,开始执行步骤之前,需要先向用户确认要应用哪些步骤。
所有设置均通过 完成。将目标仓库设为 。
每个步骤都具备幂等性,使用相同的值重复执行不会改变结果。
ghREPO=<owner>/<name>この skill が必要な理由と達成したい状態
需要此 skill 的原因与目标状态
この skill が必要な理由は、テンプレートから作ったリポジトリに、コードとワークフローは引き継がれても、secrets、Actions の権限、ルールセットなど GitHub 側の設定とアプリ名が引き継がれないことにある。ワークフローのファイルは揃っているので設定の抜けは見えず、抜けたまま動く自動化は失敗するか何もしないまま、誰も気づかない。
この skill で達成したい状態は、作った直後から、テンプレートと同じ自動化と保護が効いていることである。
需要此 skill 的原因是:从模板创建的仓库虽然会继承代码和 workflow,但 GitHub 端的 secrets、Actions 权限、ruleset 等设置以及应用名称不会继承。由于 workflow 文件已经齐全,设置缺失并不容易被发现;而缺少相关设置的自动化可能会执行失败,也可能什么都不做,且不会有人察觉。
此 skill 的目标状态是:仓库创建后立即生效与模板相同的自动化和保护机制。
1. アプリ名を変える
1. 更改应用名称
apps/web/app-name.tsAPP_NAMEapps/web/app-name.tsAPP_NAME2. 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"| 名前 | 用途 |
|---|---|
| verify ワークフローの oxlint-plugin-decision |
| verify 失敗時に Claude Code が自動修正する |
| デプロイ先と Alchemy の状態を置くアカウント |
| 同じアカウントの 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"| 名称 | 用途 |
|---|---|
| verify workflow 的 oxlint-plugin-decision |
| verify 失败时由 Claude Code 自动修复 |
| 存放部署目标及 Alchemy 状态的账户 |
| 同一账户的 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=truerelease-pleasesh
gh api --method PUT "repos/$REPO/actions/permissions/workflow" \
-f default_workflow_permissions=read -F can_approve_pull_request_reviews=true4. 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=truesh
gh api --method PATCH "repos/$REPO" -f pull_request_creation_policy=collaborators_only \
-F allow_auto_merge=true -F allow_update_branch=true5. 既定ブランチを保護する
5. 保护默认分支
既定ブランチの削除と force push を禁じ、 チェックを通っていない PR と、最新の既定ブランチを取り込んでいない PR のマージを拒むルールセットを置く。
バイパスは置かない。release-please の PR は、Claude が既定ブランチを取り込んで push し、そこで動いた を通してからマージする。
同じ名前のルールセットがあれば置き換える。
up-to-dateup-to-datesh
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,拒绝合并未通过 检查以及未包含最新默认分支内容的 PR。
不设置 bypass。 的 PR 会由 Claude 合并默认分支并 push,待变更在该分支生效并通过 后再进行合并。
如果存在同名的 ruleset,则替换它。
up-to-daterelease-pleaseup-to-datesh
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 }]
}
}
]
}
JSON6. 反映を確かめる
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