Files
gitea/skills/repo-sync/SKILL.md
jiantw83 72ba7b8801 chore(gitea): 技能依結束碼分流,可併行的步驟改成同時跑
技能以前只寫成功路徑。腳本回非 0 時,模型得自己猜下一步,猜錯就是靜靜
往下走。現在每一支腳本在檔頭宣告自己的結束碼,技能也逐碼寫明要停、要
問、還是要改參數再呼叫一次。兩支技能補上連線變數的解析步驟,讓缺值在
第一步就浮出來,而不是在中途撞出一行英文錯誤。

流程也拉平了。取內容、選範本、問輸出位置這幾件事彼此不相依,改成同一批
送出;存取庫批次同步從逐一處理改成各存取庫同時進行,一個 owner 底下有
上百個存取庫時差距最明顯。

相依的技能組下限寫進外掛設定,版本推進。
2026-08-31 11:13:32 +08:00

3.2 KiB

name, description
name description
repo-sync Batch-sync all readable repos of a chosen Gitea owner into the working directory. List owners, let the user pick, then clone or update each repo through tools/repo-sync.sh; a repo reported dirty goes to jsc-git:pr against the base branch that same script reports. Use for workspace bootstrap or bulk refresh; not for a single repo.

repo-sync — batch-sync repositories

Steps

  1. Run tools/gitea.sh owners to list every {owner} the user can read. The script reads GITEA_HOST and GITEA_TOKEN from the inherited environment and retries once with the tea CLI login token, so take no separate inventory first — a missing value surfaces here, before any work is done. Route on the result: at least one {owner} printed → next step; the script stops with GITEA_HOST is required or GITEA_TOKEN is required → ask the user for that one value per the jsc-ask:ask rules and run the command again, guessing no host; exit 7 → report that the key is invalid or lacks permission, and stop; exit 8 → report the HTTP status in the message, and stop; exit 0 with no output → report that this key can read no owner, and stop. Done when at least one {owner} is printed, or the run stopped with one of those reasons.

  2. Ask the user which {owner} to sync, per the jsc-ask:ask rules. Every option states the owner's repo count and impact scope. Done when the user has named exactly one {owner} from that list.

  3. Run tools/gitea.sh repos {owner} to list every readable {repo} under that owner. Exit 7 and exit 8 stop the run with the same report as step 1; an empty list means this owner has no readable repo and there is nothing to sync. Done when the command has printed the full {owner}/{repo} list for the chosen owner, or the run stopped.

  4. Sync every {repo} from step 3 in parallel — one sub agent per repo, all launched in the same batch, never one after another. Each repo has its own directory and its own remote, so nothing makes them wait for each other, and a hundred-repo owner otherwise costs a hundred sequential clones. Each sub agent does this:

    1. Run tools/repo-sync.sh {owner}/{repo}. The script owns the clone-versus-pull decision and the base-branch precedence, so run no git clone, git checkout or git pull by hand, and derive no branch name yourself. Route on its single line of output: cloned or updated (exit 0) → this repo is done; dirty {branch} (exit 0) → go to substep 2; failed {reason} (exit 1) → record that reason and stop this repo. Done when exactly one of those four outcomes is recorded for this repo.
    2. dirty {branch} → call jsc-git:pr with {branch} from that same output line as the base, passed through verbatim. It commits, branches, pushes and opens the PR itself, so add none of those steps. Done when jsc-git:pr returns the PR URL and reports it with the table format in jsc-meta/references/pr-report.md.

    Done when every repo's sub agent has returned one of those outcomes; one repo failing never cancels the others.

  5. Report the sync result for every repo: cloned, updated, PR table row, or the failure reason. Done when every {repo} from step 3 carries one of those four results, and all PR rows share one table when more than one PR exists.