# Gitlaber

> Jihulab (GitLab) 代码查询、变更查询与代码拉取工具 - 通过自然语言查看项目文件代码、提交记录，支持 PAT 认证 fetch/pull，环境-分支映射。

- Skill: `jeandoom/gitlaber` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add jeandoom/gitlaber`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jeandoom/gitlaber/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/gitlaber

---


# Jihulab Code Query Skill

通过 GitLab API V4 查询 jihulab.com 上的项目代码和变更记录，并支持通过 PAT 认证拉取代码。

## 前置条件

- Python 3.8+ 已安装
- `requests` 库已安装（`pip install requests`）
- 已配置个人访问令牌

## 工具位置

```
<skill-dir>/jihulab.py
```

## 配置管理

### 设置访问令牌

当用户说"设置 jihulab token/令牌"时，使用共享凭证管理（推荐）：

```bash
python -m scripts.credentials setup gitlaber
# 或仍可用旧子命令（已转发到共享凭证库）
python <skill-dir>/jihulab.py token set <glpat-xxx>
```

凭证统一存储在 `~/.claude/credentials.env`，字段名 `JH_TOKEN`。

### 管理环境-分支映射

当用户说"配置环境 xxx 用分支 yyy"时：

```bash
python <skill-dir>/jihulab.py env set <env-name> <branch>
python <skill-dir>/jihulab.py env list
python <skill-dir>/jihulab.py env remove <env-name>
```

常用配置示例：
- `env set prod master` — prod 环境对应 master 分支
- `env set staging develop` — staging 环境对应 develop 分支

## 查看文件代码

当用户说"查看/显示 xxx 项目的 yyy 文件"时：

```bash
python <skill-dir>/jihulab.py file <group/project> <file-path> [--branch <name>] [--start N] [--end N]
```

**参数说明**：
- `group/project` — 项目路径，如 `my-team/my-project`
- `file-path` — 仓库内文件路径，如 `src/main.py`
- `--branch` — 分支名或环境名。如果是环境名（如 prod），自动映射到对应分支。不指定则使用项目默认分支
- `--start / --end` — 行号范围（1-based），可选

**示例**：
- "查看 prod 环境的 my-team/api 的 src/app.py" → `python <skill-dir>/jihulab.py file my-team/api src/app.py --branch prod`
- "看 src/app.py 第 20-50 行" → 追加 `--start 20 --end 50`
- "看 feature-login 分支的 config.yaml" → `--branch feature-login`

## 查看变更记录

当用户说"查看/显示 xxx 项目的提交记录/变更记录/commit"时：

```bash
python <skill-dir>/jihulab.py commits <group/project> [--path <file>] [--branch <name>] [--since YYYY-MM-DD] [--until YYYY-MM-DD] [--limit N]
```

**参数说明**：
- `--path` — 按文件路径筛选
- `--branch` — 分支名或环境名
- `--since / --until` — 日期范围
- `--limit` — 返回条数（默认 20）

**示例**：
- "看下 my-team/api 最近 10 条提交" → `python <skill-dir>/jihulab.py commits my-team/api --limit 10`
- "查看 prod 环境的 src/main.py 变更" → `python <skill-dir>/jihulab.py commits my-team/api --path src/main.py --branch prod`

## 拉取代码（fetch / pull）

当用户说"拉取/更新/同步 projects/xxx 的代码"时，使用 PAT 认证方式 fetch/pull：

```bash
# 拉取并合并（fetch + merge）
python <skill-dir>/jihulab.py pull <local-dir> [--branch <name>]

# 仅拉取不合并
python <skill-dir>/jihulab.py fetch <local-dir> [--branch <name>]
```

**参数说明**：
- `local-dir` — 本地项目路径（如 `projects/aix-py`），支持相对/绝对路径
- `--branch` — 可选，分支名或环境名，默认当前分支

**工作原理**：
1. 自动从 `<local-dir>/.git/config` 读取 remote origin 的 SSH URL
2. 将 SSH URL 转为 HTTPS+PAT URL（`https://oauth2:<PAT>@jihulab.com/...`）
3. 执行 `git fetch <https-url> <branch>`
4. `pull` 命令会额外执行 `git merge FETCH_HEAD` 并显示更新摘要

**示例**：
- "拉取 aix-py 最新代码" → `python <skill-dir>/jihulab.py pull projects/aix-py`
- "更新 aix-py 的 master 分支" → `python <skill-dir>/jihulab.py pull projects/aix-py --branch master`
- "仅 fetch aix-py 不合并" → `python <skill-dir>/jihulab.py fetch projects/aix-py`
- "拉取 prod 环境代码" → `python <skill-dir>/jihulab.py pull projects/aix-py --branch prod`

**注意**：`projects/` 目录下的直接 `git fetch/pull` 会被 hook 拦截，必须通过此 skill 操作。

## 分支解析规则

`--branch` 参数按以下优先级解析：

1. 用户明确指定分支名 → 先检查是否匹配环境名，是则映射，否则直接使用
2. 用户提到环境名（如 prod/staging）→ 查 `env-config.json` 映射到分支
3. 未指定 → 不传 ref 参数，API 返回默认分支内容

## 常用项目速查

| 项目 | ID | 路径 |
|------|-----|------|
| ai-dispatcher | 233017 | maycur/maycur-llm/ai-dispatcher |
| aix-py | 281452 | maycur/maycur-llm/aix-py |
| maycur-ai-audit | 338301 | maycur/maycur-llm/maycur-ai-audit |
| dify | 227411 | maycur/maycur-llm/dify |
| dify-dsl-backup | 275434 | maycur/maycur-llm/dify-dsl-backup |
| ai-audit-server | 326189 | maycur/maycur-llm/ai-audit-server |

## 代码搜索技巧

当 `file` 命令无法定位目标文件时，可通过 GitLab API 搜索：

### 搜索项目
```bash
TOKEN=$(python -c "import json; print(json.load(open('<skill-dir>/config.json'))['token'])")
curl -s --header "PRIVATE-TOKEN: $TOKEN" \
  "https://jihulab.com/api/v4/projects?search=PROJECT_NAME&per_page=10" \
  | python -c "import sys,json; [print(f'{p[\"id\"]:6d}  {p[\"path_with_namespace\"]}') for p in json.load(sys.stdin)]"
```

### 搜索代码（Blob Search）
```bash
curl -s --header "PRIVATE-TOKEN: $TOKEN" \
  "https://jihulab.com/api/v4/projects/PROJECT_ID/search?scope=blobs&search=KEYWORD&per_page=20" \
  | python -c "import sys,json; [print(f'{b[\"filepath\"]}:{b[\"startline\"]}') for b in json.load(sys.stdin)]"
```

### 注意事项

- Blob search 可能返回空结果（权限/索引原因），此时改用浏览目录 + 查看文件方式
- 递归目录列表 `recursive=true` 默认 `per_page=20`，大项目需增加 `per_page` 或分页
- CLI 不支持 `search` 子命令，搜索需直接调 API

## 注意事项

- 所有命令在项目根目录下执行
- 首次使用前必须先配置令牌：`python -m scripts.credentials setup gitlaber`（或 `python <skill-dir>/jihulab.py token set <your-token>`）
- 如果返回 404 错误，提示用户检查项目路径格式（`group/project`）和文件路径
- 如果返回 401 错误，提示用户令牌可能已过期，需要重新设置
- **先确认目标项目**：排查问题时先确定代码在哪个项目，避免在错误仓库搜索（如审核代码在 aix-py 不在 ai-dispatcher）

