# Skills Push

> 将指定 skills 推送到目标 git 仓库的分支上。自动管理上下文目录、克隆仓库、复制 skills 并推送。触发词：推送 skill、部署 skill、push skill、部署到仓库。

- Skill: `jeandoom/skills-push` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jeandoom/skills-push`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jeandoom/skills-push/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Jeandoom (https://skillmd.com/u/jeandoom)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/jeandoom/skills-push

---


# Skills Push — Skills 远程部署工具

将指定的 skills 推送到目标 git 仓库的指定分支上，自动管理上下文目录和仓库克隆。

## 触发条件

- 用户说"推送 skill"、"部署 skill"、"push skill"、"部署到仓库"
- 用户提到将 skill 同步/部署到某个项目/仓库
- 用户提到 skills-push

## 输入

- **必须**：skills 名称列表（逗号分隔或逐个列出）
- **必须**：目标仓库 git URL
- **可选**：目标分支（默认 `main`）
- **可选**：目标路径（不提供时向用户确认）

## 执行流程（5 步）

---

### 步骤 ①：解析输入

从用户输入提取：

| 字段 | 必须性 | 说明 |
|------|--------|------|
| skills 列表 | 必须 | 要部署的 skill 名称 |
| 仓库 URL | 必须 | git 远程仓库地址 |
| 分支 | 可选 | 默认 `main` |
| 目标路径 | 可选 | 不提供时向用户确认 |

**缺少必须信息时**：用 AskUserQuestion 向用户确认。

**目标路径选择**（向用户展示）：

| 选项 | 目标路径 | 说明 |
|------|---------|------|
| A | `.claude/skills/` | Claude Code 标准路径（推荐） |
| B | `skills/` | 本项目风格路径 |
| 其他 | 用户填写 | 自定义路径 |

**Skills 来源**（自动推断，优先本项目）：

1. 本项目 `skills/<name>/` — 优先（版本控制的源码）
2. 全局 `~/.claude/skills/<name>/` — fallback
3. 都没找到 → 提示用户："skill `<name>` 未找到，请确认名称是否正确"

---

### 步骤 ②：创建/恢复上下文

**上下文目录结构**：

```
skills-context/
├── context.md       # 上下文说明文件
└── repos/           # 克隆的仓库
    └── <repo-name>/
```

**新建上下文**：

1. 创建 `skills-context/` 目录
2. 创建 `skills-context/repos/` 目录
3. 创建 `context.md` 初始内容

**断点续查**：

若 `skills-context/` 已存在且有 `context.md`，读取恢复状态，复用 `repos/` 下已克隆的仓库。

**context.md 格式**：

```markdown
# Skills Push 上下文

## 仓库列表

### <repo-name>
- URL: https://jihulab.com/xxx/yyy.git
- 分支: main
- 目标路径: .claude/skills/
- 最后部署: 2026-06-09
- 已部署 Skills: opser, slser
```

---

### 步骤 ③：仓库管理

从 context.md 或用户输入获取仓库信息，对每个目标仓库执行：

**已有仓库**（`repos/` 下存在且 remote URL 匹配）：

```bash
cd skills-context/repos/<repo-name>
git fetch origin
git checkout <branch>
git pull origin <branch>
```

**新仓库**：

```bash
git clone --branch <branch> <url> skills-context/repos/<repo-name>/
```

**失败处理**：

| 错误 | 处理 |
|------|------|
| 分支不存在 | 提示用户确认分支名，或创建新分支 |
| 仓库不存在 | 提示用户确认 URL |
| 网络超时 | 重试一次，仍失败则提示用户检查网络 |

---

### 步骤 ④：复制并推送

**自带脚本保证**:复制时整目录拷贝,每个 skill 的 `scripts/` 随行,确保推送的 skill 可用。**不解析** skill 对其他 skill 的依赖(保持简单);编排型 skill(如 bug-killer)仍依赖目标用户已自行安装其引用的 skill。

对每个 skill 执行：

1. **收集文件**：

```bash
find <source-dir> -type f \
  ! -path "*/__pycache__/*" \
  ! -name "*.pyc" \
  ! -name ".DS_Store"
```

2. **排除敏感文件**：`config.json`、`env-config.json`、`.env`、`credentials.json`

3. **复制到目标**：`repos/<repo-name>/<target-path>/<name>/`

4. **保留目标独有文件**：不删除目标仓库中用户已有的本地配置文件

全部 skill 复制完成后：

### ④.a 多平台引导(检测 + 补 install.py)

检查目标仓库 `<repo>/scripts/install.py` 是否存在:

- **不存在** → 从源仓库 `copilot-skills/scripts/install.py` 复制到 `<repo>/scripts/install.py`(使该库支持 Claude/Codex/Cursor/Qoder 一键安装,可被分享后快速使用)。
- **已存在** → 跳过(幂等,不覆盖用户本地改动)。

> 这是写**仓库根目录**文件(`<repo>/scripts/`),不在 skills 目标路径下。用 Bash 直接 `cp`。

### ④.b 重生成目标库 README(整份覆盖,保留 CUSTOM NOTES)

重新分析目标库当前 `skills/` 内容,生成一份适用的新 README 并整份覆盖 `<repo>/README.md`(不要简单追加更新内容)。

**生成方式**:由你(agent)直接生成(不用 Python 脚本)。读取目标库 `skills/**/SKILL.md` 的 name/description/触发词,按下述结构组织:

1. **项目简介**:一句话——本库是 skills 集合,支持 Claude/Codex/Cursor/Qoder 安装。
2. **多平台安装**:
   ```bash
   git clone <目标库 url> <任意目录>
   cd <任意目录>
   python scripts/install.py --list
   python scripts/install.py <skill>          # 交互式选平台/级别
   python scripts/install.py <skill> --target qoder --scope project --project <工作项目>
   ```
   附四平台目标目录说明(`~/.claude/skills`、`~/.codex/skills`、`<项目>/.cursor/rules`、`<项目>/.qoder/rules`)与 Codex 重启/fallback 注记。
3. **Skill 清单表**:`| name | 说明 | 触发词 | 状态 |`,逐个 skill 一行(按目标库实际 skills 填,不是源仓库清单)。
4. **凭据配置**:需要 setup.py 的 skill(如 jenkinser/opser)列出 `python skills/<name>/scripts/setup.py`。

**CUSTOM NOTES 保留规则**:若旧 README 含 `<!-- CUSTOM NOTES -->` 与 `<!-- END CUSTOM NOTES -->` 之间的内容,原样回填到新 README 末尾;无此标记则不保留。其余内容整份覆盖。

```bash
cd skills-context/repos/<repo-name>
git add <target-path>/ scripts/install.py README.md
git status --short  # 确认变更(含 install.py、README)
git commit -m "feat: deploy skills - <skill1>, <skill2>

Skills: <skill1>, <skill2>
Source: copilot-skills
Date: YYYY-MM-DD
Bootstrap: multi-platform install + README regenerated"
git push origin <branch>
```

**推送失败处理**：

| 错误 | 处理 |
|------|------|
| 权限不足 | 提示检查 git 凭据（`git config credential.helper`） |
| 远程有更新 | `git pull --rebase origin <branch>` 后重试 push |
| 冲突 | 提示用户手动解决或选择 force push |

---

### 步骤 ⑤：更新上下文

更新 `skills-context/context.md`：

- 更新对应仓库的"最后部署"日期为当天
- 更新"已部署 Skills"列表（合并去重）
- 如有新仓库，追加到仓库列表

---

## 增量更新

重复执行时：

1. 读取 context.md 恢复已管理的仓库信息
2. 对已有仓库执行 `git pull` 而非重新 clone
3. 仅复制有变更的 skill 文件（通过 diff 判断）
4. 如无实际文件变更，跳过 commit 和 push，提示"无变更，跳过推送"
5. 每次推送后都执行 ④.b 重生成 README（反映最新 skills）
6. `install.py` 已就位则不重复复制（幂等跳过）

## 多仓库支持

支持一次推送到多个仓库。在 context.md 中维护多个仓库条目，每个仓库独立管理分支和已部署 skills。

## 输出

- `skills-context/context.md` — 上下文管理文件
- `skills-context/repos/` — 克隆的仓库（已 .gitignore）
- 推送成功后展示摘要：仓库、分支、已推送的 skills 列表
- `scripts/install.py`（首次引导时复制到目标库根目录）
- 重生成后的 `<repo>/README.md`

## 依赖

- 工具：Bash（git 操作、文件复制）
- 前置：git 可用，有目标仓库的推送权限
- 协作：可与 `skills-collect` 配合（先 collect 收集 skill，再 push 推送）

