git:20260320.d5121e4 to git:20260801.3cb01ce

97 added, 97 removed. Audit A to A.

---
name: github-sync-helper
description: >
- 通用 GitHub 基础操作 + GitHub 平台对象(Issues/Labels/Milestones/Releases/Actions)自动化技能(Minis 环境)。当用户提到“GitHub 怎么用、clone、init、remote、branch、commit、push、pull、fetch、merge、rebase、tag、release、issues、actions、labels、milestone、保护分支、fork、PR、同步到上游(upstream)、删除分支、清空目录后恢复、直推 main、一键同步”等任意 Git/GitHub 基础操作与工作流时,必须触发本技能。
+ General GitHub basic operations + automation for GitHub platform objects (Issues/Labels/Milestones/Releases/Actions) in the Minis environment. This skill must be triggered when the user mentions any basic Git/GitHub operation or workflow, including "how to use GitHub," clone, init, remote, branch, commit, push, pull, fetch, merge, rebase, tag, release, issues, actions, labels, milestone, protected branches, fork, PR, sync to upstream, delete branches, restore after emptying a directory, push directly to main, or one-click sync.
compatibility: >
Requires git, python3. Uses env GITHUB_TOKEN for GitHub API + HTTPS push (non-interactive via GIT_ASKPASS).
---
- ## 目标
+ ## Objectives
- 把 GitHub/Git 的“基础操作”与常见协作流程固化为:
+ Codify GitHub/Git "basic operations" and common collaboration workflows into:
- 1) 清晰的命令速查(解释 + 何时用)
- 2) 可执行的一键脚本(避免重复手工步骤)
- 3) 常用输出尽量“带编号”,方便你直接回复编号选择(例如:仓库列表)
+ 1) A clear command quick reference (explanation + when to use)
+ 2) Executable one-click scripts (to avoid repetitive manual steps)
+ 3) Common outputs that are "numbered" whenever possible, so the user can reply with a number to choose an item directly, such as from a repository list
- ## 安全与约束(必须遵守)
+ ## Security and Constraints (Must Be Followed)
- | 序号 | 规则 | 原因 |
+ | No. | Rule | Reason |
|---:|---|---|
- | 1 | **不要输出 Token**:任何命令都不得把 `$GITHUB_TOKEN` echo/print 到 stdout | 防止泄露 |
- | 2 | **危险操作二次确认**:删分支、清空目录、强制覆盖、强推、直推 main | 可逆性差 |
- | 3 | 默认用“分支 + PR”协作;只有用户明确要求才“直推 main” | 降低对主分支破坏 |
- | 4 | push/pull 前先 `git status` | 防止误提交/误覆盖 |
+ | 1 | **Do not output tokens**: No command may echo or print `$GITHUB_TOKEN` to stdout | Prevent leaks |
+ | 2 | **Require a second confirmation for dangerous operations**: deleting branches, emptying directories, forced overwrites, force pushes, and direct pushes to main | These operations are hard to reverse |
+ | 3 | Use "branch + PR" collaboration by default; only "push directly to main" when the user explicitly requests it | Reduce the risk of damaging the main branch |
+ | 4 | Run `git status` before push/pull | Prevent accidental commits or overwrites |
- ## 运行方式
+ ## How to Run
- - **脚本入口**:`sh /var/minis/skills/github-sync-helper/scripts/gh_sync.sh <command> [options]`
+ - **Script entry point**: `sh /var/minis/skills/github-sync-helper/scripts/gh_sync.sh <command> [options]`
- > 脚本在“当前 git 仓库目录”下运行(必须在仓库内)。
+ > The script runs in the "current Git repository directory" and must be run inside a repository.
- ## Git/GitHub 基础操作速查(解释 + 对应脚本)
+ ## Quick Reference for Basic Git/GitHub Operations (Explanation + Corresponding Script)
- | 序号 | 类别 | 操作 | 一句话解释 | 常用命令 | 脚本支持 |
+ | No. | Category | Operation | One-sentence explanation | Common command | Script support |
|---:|---|---|---|---|---|
- | 1 | 初始化 | init | 把当前目录变成 git 仓库 | `git init` | `init` |
- | 2 | 获取代码 | clone | 从远端下载仓库到本地 | `git clone <url>` | `clone` |
- | 3 | 远端 | remote | 管理 origin/upstream 等远端 | `git remote -v/add/set-url/remove` | `remotes/add-remote/add-upstream/set-remote-url/remove-remote` |
- | 4 | 分支 | branch | 查看/创建/删除分支 | `git branch -a/-d/-D` | `branches/create-branch/delete-branches` |
- | 5 | 切换 | checkout/switch | 切换到某分支 | `git switch <b>` | `checkout` |
- | 6 | 查看变更 | status/diff/log | 看工作区改动/差异/历史 | `git status` `git diff` `git log` | `status/diff/log` |
- | 7 | 暂存 | add | 把改动加入暂存区 | `git add -A` | `add` |
- | 8 | 提交 | commit | 把暂存区打包成一次提交 | `git commit -m "..."` | `commit` |
- | 9 | 同步 | fetch/pull/push | 拉取/合并/推送提交 | `git fetch` `git pull` `git push` | `fetch/pull/push/push-main` |
- |10| 合并 | merge/rebase | 合并分支历史 | `git merge` `git rebase` | `merge/rebase`(谨慎) |
- |11| 暂存栈 | stash | 临时收起未提交改动 | `git stash` | `stash` |
- |12| 标签 | tag | 给提交打版本号 | `git tag` | `tag` |
- |13| 子模块 | submodule | 管理子仓库依赖 | `git submodule` | `submodule` |
- |15| GitHub 平台 | issues/labels/milestones/releases/actions | 通过 GitHub API 管理平台对象 |(API) | `gh-issues-list` 等(见下方) |
+ | 1 | Initialize | init | Turn the current directory into a Git repository | `git init` | `init` |
+ | 2 | Get code | clone | Download a repository from a remote to local | `git clone <url>` | `clone` |
+ | 3 | Remote | remote | Manage remotes such as origin/upstream | `git remote -v/add/set-url/remove` | `remotes/add-remote/add-upstream/set-remote-url/remove-remote` |
+ | 4 | Branch | branch | View, create, or delete branches | `git branch -a/-d/-D` | `branches/create-branch/delete-branches` |
+ | 5 | Switch | checkout/switch | Switch to a branch | `git switch <b>` | `checkout` |
+ | 6 | View changes | status/diff/log | View working tree changes, diffs, or history | `git status` `git diff` `git log` | `status/diff/log` |
+ | 7 | Stage | add | Add changes to the staging area | `git add -A` | `add` |
+ | 8 | Commit | commit | Package the staging area into a commit | `git commit -m "..."` | `commit` |
+ | 9 | Sync | fetch/pull/push | Fetch, merge, or push commits | `git fetch` `git pull` `git push` | `fetch/pull/push/push-main` |
+ |10| Merge | merge/rebase | Merge branch history | `git merge` `git rebase` | `merge/rebase` (use with caution) |
+ |11| Stash | stash | Temporarily set aside uncommitted changes | `git stash` | `stash` |
+ |12| Tag | tag | Add a version tag to a commit | `git tag` | `tag` |
+ |13| Submodule | submodule | Manage subrepository dependencies | `git submodule` | `submodule` |
+ |15| GitHub platform | issues/labels/milestones/releases/actions | Manage platform objects through the GitHub API | (API) | `gh-issues-list` and others (see below) |
- > 注:脚本的定位是“把常用基础操作变成可复用命令”。遇到复杂 rebase/冲突,仍建议用交互式终端处理。
+ > Note: The script is intended to "turn common basic operations into reusable commands." For complex rebases or conflicts, using an interactive terminal is still recommended.
- ## GitHub 平台操作(API)
+ ## GitHub Platform Operations (API)
- > 统一要求:需要 env `GITHUB_TOKEN`。
+ > Unified requirement: env `GITHUB_TOKEN` is required.
- | 序号 | command | 作用 |
+ | No. | command | Purpose |
|---:|---|---|
- | 1 | `gh-issues-list --repo <owner/repo> [--state open|closed|all]` | 列出 Issues |
- | 2 | `gh-issue-create --repo <owner/repo> --title <t> [--body <b>]` | 创建 Issue |
- | 3 | `gh-issue-close --repo <owner/repo> --number <n>` | 关闭 Issue |
- | 4 | `gh-labels-list --repo <owner/repo>` | 列出 labels |
- | 5 | `gh-label-create --repo <owner/repo> --name <n> [--color <rrggbb>] [--description <d>]` | 创建 label |
- | 6 | `gh-milestones-list --repo <owner/repo> [--state open|closed|all]` | 列出 milestones |
- | 7 | `gh-milestone-create --repo <owner/repo> --title <t> [--description <d>] [--due <YYYY-MM-DD>]` | 创建 milestone |
- | 8 | `gh-releases-list --repo <owner/repo>` | 列出 releases |
- | 9 | `gh-release-create --repo <owner/repo> --tag <vX.Y.Z> --name <n> [--body <b>] [--draft true|false] [--prerelease true|false]` | 创建 release |
- |10| `gh-actions-list --repo <owner/repo>` | 列出 workflows |
- |11| `gh-actions-dispatch --repo <owner/repo> --workflow <id_or_file> [--ref <branch>] [--inputs <json>]` | 手动触发 workflow_dispatch |
+ | 1 | `gh-issues-list --repo <owner/repo> [--state open|closed|all]` | List issues |
+ | 2 | `gh-issue-create --repo <owner/repo> --title <t> [--body <b>]` | Create an issue |
+ | 3 | `gh-issue-close --repo <owner/repo> --number <n>` | Close an issue |
+ | 4 | `gh-labels-list --repo <owner/repo>` | List labels |
+ | 5 | `gh-label-create --repo <owner/repo> --name <n> [--color <rrggbb>] [--description <d>]` | Create a label |
+ | 6 | `gh-milestones-list --repo <owner/repo> [--state open|closed|all]` | List milestones |
+ | 7 | `gh-milestone-create --repo <owner/repo> --title <t> [--description <d>] [--due <YYYY-MM-DD>]` | Create a milestone |
+ | 8 | `gh-releases-list --repo <owner/repo>` | List releases |
+ | 9 | `gh-release-create --repo <owner/repo> --tag <vX.Y.Z> --name <n> [--body <b>] [--draft true|false] [--prerelease true|false]` | Create a release |
+ |10| `gh-actions-list --repo <owner/repo>` | List workflows |
+ |11| `gh-actions-dispatch --repo <owner/repo> --workflow <id_or_file> [--ref <branch>] [--inputs <json>]` | Manually trigger workflow_dispatch |
- ## 脚本命令清单(gh_sync.sh)
+ ## Script Command List (gh_sync.sh)
- | 序号 | command | 作用 |
+ | No. | command | Purpose |
|---:|---|---|
- | 2 | `clone --url <url> [--dir <path>]` | clone 仓库到指定目录 |
- | 3 | `remotes` | 显示当前 remotes |
- | 4 | `add-remote --name <n> --url <url>` | 添加远端 |
- | 5 | `set-remote-url --name <n> --url <url>` | 修改远端 URL |
- | 6 | `remove-remote --name <n>` | 删除远端 |
- | 7 | `add-upstream --upstream <owner/repo>` | 添加 upstream remote |
- | 8 | `status` | `git status --porcelain` + 简要提示 |
- | 9 | `diff [--staged]` | 查看差异 |
- |10| `log [--n <k>]` | 查看最近提交 |
- |11| `branches` | 列出本地与远程分支 |
- |12| `create-branch --name <b> [--from <ref>]` | 创建分支 |
- |13| `checkout --name <b>` | 切换分支 |
- |14| `delete-branches --keep <branch>` | 删除除 keep 外的本地/远程分支 |
+ | 2 | `clone --url <url> [--dir <path>]` | Clone a repository to a specified directory |
+ | 3 | `remotes` | Show current remotes |
+ | 4 | `add-remote --name <n> --url <url>` | Add a remote |
+ | 5 | `set-remote-url --name <n> --url <url>` | Change a remote URL |
+ | 6 | `remove-remote --name <n>` | Remove a remote |
+ | 7 | `add-upstream --upstream <owner/repo>` | Add the upstream remote |
+ | 8 | `status` | `git status --porcelain` + brief tips |
+ | 9 | `diff [--staged]` | View differences |
+ |10| `log [--n <k>]` | View recent commits |
+ |11| `branches` | List local and remote branches |
+ |12| `create-branch --name <b> [--from <ref>]` | Create a branch |
+ |13| `checkout --name <b>` | Switch branches |
+ |14| `delete-branches --keep <branch>` | Delete local/remote branches except the branch specified by `keep` |
|15| `add --path <p>` | `git add` |
|16| `commit --message <m>` | `git commit` |
- |17| `fetch [--remote <n>]` | 拉取远端更新 |
- |18| `pull [--remote <n>] [--branch <b>]` | 拉取并合并 |
- |19| `push [--remote <n>] [--branch <b>]` | 推送 |
- |20| `push-main` | push 当前 main 到 origin(使用 token 非交互) |
- |21| `empty-dir --dir <path>` | 清空仓库内某目录但保留目录(用 .gitkeep) |
- |22| `restore-dir --src <path> --dst <path>` | 用本机目录覆盖恢复到仓库目录(会先删除 dst 内容) |
- |23| `pr --upstream <owner/repo> --head <owner:branch> --base <branch> --title <t> --body <b>` | 通过 GitHub API 创建 PR |
- |24| `gh-issues-list ...` 等 | GitHub 平台对象操作(issues/labels/milestones/releases/actions) |
+ |17| `fetch [--remote <n>]` | Fetch remote updates |
+ |18| `pull [--remote <n>] [--branch <b>]` | Pull and merge |
+ |19| `push [--remote <n>] [--branch <b>]` | Push |
+ |20| `push-main` | Push the current main branch to origin (using a token, non-interactive) |
+ |21| `empty-dir --dir <path>` | Empty a directory in the repository while preserving the directory (using .gitkeep) |
+ |22| `restore-dir --src <path> --dst <path>` | Restore to a repository directory by overwriting it with a local directory (deletes the contents of `dst` first) |
+ |23| `pr --upstream <owner/repo> --head <owner:branch> --base <branch> --title <t> --body <b>` | Create a PR through the GitHub API |
+ |24| `gh-issues-list ...` and others | GitHub platform object operations (issues/labels/milestones/releases/actions) |
- ## 典型工作流(示例)
+ ## Typical Workflows (Examples)
- ### 1)直推 main:清空目录 → 恢复目录 → push(你刚刚那套)
+ ### 1) Push directly to main: empty directory -> restore directory -> push (the workflow you just used)
```bash
sh /var/minis/skills/github-sync-helper/scripts/gh_sync.sh empty-dir --dir self-improving-agent
sh /var/minis/skills/github-sync-helper/scripts/gh_sync.sh restore-dir --src /var/minis/skills/self-improving-agent --dst self-improving-agent
sh /var/minis/skills/github-sync-helper/scripts/gh_sync.sh commit --message "restore(self-improving-agent): sync from local"
sh /var/minis/skills/github-sync-helper/scripts/gh_sync.sh push-main
```
- ### 4)仅替换仓库目标文件内容(保留原路径/文件名),然后提交并推送
+ ### 4) Replace only the contents of a target file in the repository (preserve the original path and filename), then commit and push
- 适用场景:用户要求“只内容替换”“只替换里面的 worker”“保留仓库原文件名/路径”,本意是:**只覆盖目标文件内容,不新增上传源文件名,不改仓库中的目标路径**。
+ Applicable scenarios: The user asks to "replace only the content," "replace only the worker inside," or "preserve the original repository filename/path." The intent is: **only overwrite the target file contents, without adding the source filename to the repository and without changing the target path in the repository**.
- 推荐执行顺序:
+ Recommended execution order:
```bash
- # 1. 拉取/刷新仓库
+ # 1. Pull/refresh the repository
repo_dir=/var/minis/workspace/<repo>
if [ -d "$repo_dir/.git" ]; then
cd "$repo_dir" && git fetch --all --prune && git reset --hard origin/main
else
gh repo clone <owner/repo> "$repo_dir"
fi
- # 2. 仅内容覆盖:用源文件内容覆盖仓库目标文件
+ # 2. Content-only overwrite: overwrite the target file in the repository with the source file contents
cp <source_file> "$repo_dir/<target_path>"
- # 3. 如未配置 Git 身份,优先复用 GitHub 登录名,并使用 GitHub noreply 邮箱
+ # 3. If the Git identity is not configured, prefer reusing the GitHub display name and GitHub noreply email
cd "$repo_dir"
- git config user.name '<GitHub显示名>'
+ git config user.name '<GitHubDisplay Name>'
git config user.email '<login>@users.noreply.github.com'
- # 4. 提交并直推 main(仅在用户明确要求提交/推送时执行)
+ # 4. Commit and push directly to main (only when the user explicitly requests commit/push)
git add <target_path>
git commit -m 'replace <target_path> content'
git push origin main
```
- 执行要点:
- - 用户说“只内容替换”时,统一理解为:**保留仓库中的原文件路径与文件名,仅覆盖内容**。
- - 不要把源文件名直接放进仓库;目标仍应是仓库里原本那个文件(例如 `worker.js`)。
- - 若目标路径已知,直接覆盖该路径;若未知,先在仓库中定位目标文件再替换。
- - 提交前若报 `Author identity unknown`,可在当前仓库写入:
- - `git config user.name '<GitHub显示名>'`
+ Key points:
+ - When the user says "replace content only," always interpret it as: **preserve the original file path and filename in the repository, and overwrite only the content**.
+ - Do not put the source filename directly into the repository; the target should still be the original file in the repository, such as `worker.js`.
+ - If the target path is known, overwrite that path directly; if it is unknown, first locate the target file in the repository and then replace it.
+ - If `Author identity unknown` is reported before committing, you can write the following in the current repository:
+ - `git config user.name '<GitHubDisplay Name>'`
- `git config user.email '<login>@users.noreply.github.com'`
- - 默认先 `git fetch` + `git reset --hard origin/main`,避免在旧工作树上误提交。
- - 若用户已经明确要求“提交”“推送”,可直接继续执行,无需重复确认。
+ - By default, run `git fetch` + `git reset --hard origin/main` first to avoid accidentally committing on an old working tree.
+ - If the user has already explicitly requested "commit" or "push," proceed directly without asking for confirmation again.
- ### 5)删除除 main 外的所有分支(本地+远程)
+ ### 5) Delete all branches except main (local + remote)
```bash
sh /var/minis/skills/github-sync-helper/scripts/gh_sync.sh delete-branches --keep main
```
- ### 6)不建分支,fork:main → upstream:main 直接开 PR
+ ### 6) Do not create a branch; open a PR directly from fork:main to upstream:main
```bash
sh /var/minis/skills/github-sync-helper/scripts/gh_sync.sh pr \
--upstream OpenMinis/MinisSkills \
--head mowenyun:main \
--base main \
--title "sync: ..." \
--body "..."
```
- - **仓库列表输出必须使用 Markdown 表格**,并包含 `编号` 列,便于用户直接回复编号选择。
- - 字段建议:`编号 | 仓库(owner/repo) | 可见性 | Fork | 默认分支 | 最近更新 | URL`
- - 交互建议:表格后提示“回复编号即可继续(clone/pull/提交推送/只内容替换等)”。
+ - **Repository list output must use a Markdown table** and include a `Number` column so the user can reply with a number to choose directly.
+ - Suggested fields: `Number | Repository(owner/repo) | Visibility | Fork | Default branch | Last updated | URL`
+ - Interaction suggestion: After the table, prompt: "Reply with the number to continue (clone/pull/commit and push/content-only replacement, etc.)."
- > 备注:若用户需要更多字段(description、language、stars),再加 `--json ...` 扩展。
+ > Note: If the user needs more fields (description, language, stars), add `--json ...` to extend the output.
- | 序号 | 现象 | 处理 |
+ | No. | Symptom | Handling |
|---:|---|---|
- | 1 | push 报 `could not read Username` | 需要 env `GITHUB_TOKEN`,脚本会用 `GIT_ASKPASS` 非交互认证 |
- | 2 | API 401/403 | token 权限不足(repo/public_repo)或过期 |
- | 3 | `not inside a git repo` | 先 `cd` 到仓库目录(或用 `clone`/`init`) |
+ | 1 | push reports `could not read Username` | Requires env `GITHUB_TOKEN`; the script will use `GIT_ASKPASS` for non-interactive authentication |
+ | 2 | API 401/403 | Insufficient token permissions (repo/public_repo) or token expired |
+ | 3 | `not inside a git repo` | First `cd` to the repository directory (or use `clone`/`init`) |