---
name: gitlink-issue
version: 2.0.0
description: "Issue 管理：创建、查看、更新、关闭/批量关闭 Issue，管理评论/操作记录。当用户需要操作 GitLink Issue 时触发。"
metadata:
  requires:
    bins: ["gitlink-cli"]
  cliHelp: "gitlink-cli issue --help"
---

# gitlink-issue（Issue 操作）

**CRITICAL — 开始前必须先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md)，其中包含认证、权限处理和 API 注意事项。**
**CRITICAL — 所有 Shortcuts 在执行写入/删除操作前，务必先确认用户意图。**
**CRITICAL — GitLink 操作只能用 `gitlink-cli`。禁止用 `gh`（GitHub CLI）操作 GitLink 资源。`gh` 仅适用于 GitHub 平台。**

> **前置条件：** 先阅读 [`../gitlink-shared/SKILL.md`](../gitlink-shared/SKILL.md) 了解认证和全局参数。

## Shortcuts

| Shortcut | 说明 | 需要认证 |
|----------|------|----------|
| `issue +list` | Issue 列表 | 否（公开项目） |
| `issue +create` | 创建 Issue | 是 |
| `issue +view` | Issue 详情 | 否（公开项目） |
| `issue +update` | 更新 Issue | 是 |
| `issue +close` | 关闭 Issue | 是 |
| `issue +batch-close` | 批量关闭 Issue，支持 `--dry-run` 预览 | 是（dry-run 不写入） |
| `issue +comment` | 添加评论，支持回复、附件、@接收人和 dry-run | 是 |
| `issue +comments` | 查看 Issue 评论和操作记录 | 否（公开项目） |
| `issue +comment-update` | 更新 Issue 评论，支持 dry-run | 是 |
| `issue +comment-delete` | 删除 Issue 评论，支持 dry-run | 是 |
| `issue +comment-children` | 查看评论的子评论 | 否（公开项目） |
| `issue +assigners` | 查询 Issue 负责人列表 | 否（公开项目） |
| `issue +authors` | 查询 Issue 发布人列表 | 否（公开项目） |
| `issue +statuses` | 查询 Issue 状态列表 | 否（公开项目） |
| `issue +tags` | 查询 Issue 标签列表 | 否（公开项目） |
| `issue +priorities` | 查询 Issue 优先级列表 | 否（公开项目） |

## 使用示例

```bash
# 列出 Issue
gitlink-cli issue +list --owner Gitlink --repo forgeplus --state open

# 搜索并排序 Issue
gitlink-cli issue +list --owner Gitlink --repo forgeplus --state open --keyword 登录 --sort-by issues.updated_on --sort-direction desc

# 创建 Issue
gitlink-cli issue +create --owner myuser --repo myrepo --title "Bug: 登录失败" --body "复现步骤：..."

# 查看 Issue 详情（使用网页可见的 Issue 编号）
gitlink-cli issue +view --owner Gitlink --repo forgeplus --number 4

# 更新 Issue
gitlink-cli issue +update --number 4 --title "新标题" --body "更新描述"

# 关闭 Issue
gitlink-cli issue +close --number 4

# 预览批量关闭 Issue，不修改数据
gitlink-cli issue +batch-close --owner myuser --repo myrepo --numbers 123,124 --dry-run

# 从 CSV 文件批量关闭 Issue
gitlink-cli issue +batch-close --owner myuser --repo myrepo --from issues.csv

# 添加评论
gitlink-cli issue +comment --number 4 --body "已修复，请验证"

# 回复评论 / @用户 / 携带附件（写操作先 dry-run）
gitlink-cli issue +comment --number 4 --body "请 @alice 复核" --receivers alice --attachment-ids 10,11 --dry-run

# 查看评论和操作记录
gitlink-cli issue +comments --number 4 --category all --page 1 --limit 20
gitlink-cli issue +comments --number 4 --category comment --keyword "复现"

# 更新/删除评论（先 dry-run）
gitlink-cli issue +comment-update --number 4 --comment-id 58 --body "更新后的评论" --dry-run
gitlink-cli issue +comment-delete --number 4 --comment-id 58 --dry-run

# 查看子评论
gitlink-cli issue +comment-children --number 4 --comment-id 58

# 查询 Issue 负责人
gitlink-cli issue +assigners --owner Gitlink --repo forgeplus --keyword alice

# 查询 Issue 发布人
gitlink-cli issue +authors --owner Gitlink --repo forgeplus --keyword bob
```

## Raw API 补充

```bash
# Issue 评论相关接口已由 issue +comments / +comment-update / +comment-delete / +comment-children 覆盖。

# 批量更新 Issue（仍使用旧版 API，需传数据库 ID）
gitlink-cli api POST /:owner/:repo/issues/series_update --body '{"ids":[1,2,3],"status_id":"closed"}'
```

## GitLink Issue 字段映射

| gitlink-cli 参数 | GitLink API 字段 | 说明 |
|------------------|-----------------|------|
| `--number` / `-n` | `project_issues_index` | Issue 编号（网页 URL 中的序号） |
| `--id` / `-i` | `project_issues_index` | `--number` 的兼容别名，不是数据库内部 ID |
| `--title` | `subject` | Issue 标题 |
| `--body` | `description` | Issue 描述 |
| `--assignee` | `assigned_to_id` | 指派人 ID |
| `--milestone` | `fixed_version_id` | 里程碑 ID |
| `--state` | `status_id` | 状态（open=1，closed=5，也可直接传数字 ID） |
| `--priority-id` | `priority_id` | 优先级 ID |
| `--tag-ids` / `--label` | `issue_tag_ids` | Issue 标签 ID 数组 |
| `--assigner-ids` | `assigner_ids` | 负责人 ID 数组 |
| `--branch` | `branch_name` | 关联分支 |
| `--start-date` | `start_date` | 开始日期 |
| `--due-date` | `due_date` | 截止日期 |

## API 注意事项

- **Issue 编号（`--number`）是网页 URL 中看到的序号**（如 `issues/4` 中的 `4`），不是数据库内部 ID
- `--id` / `-i` 仅作为 `--number` / `-n` 的兼容别名，传入的仍然是网页 URL 中的 Issue 编号
- **批量关闭使用 `--numbers`，同样传网页 URL 中的 Issue 编号**，不是数据库内部 ID
- Issue 操作和 Issue 评论操作使用 v1 API（`/api/v1/`），支持按 Issue 编号查询和操作
- **创建 Issue 时 CLI 会自动设置 `status_id: 1`（新增）和 `priority_id: 2`（正常）**
- **更新/关闭 Issue 时必须保留当前 `subject` 和 `description`**，即使只修改状态（CLI 会先读取当前 Issue 并自动带回）
- v1 API 写操作必须使用 `access_token`（非 `token`）认证，CLI 已自动处理

## Issue 状态映射（status_id）

| status_id | 名称 | 说明 |
|-----------|------|------|
| 1 | 新增 | 新建 Issue 的默认状态 |
| 2 | 正在解决 | 处理中 |
| 3 | 已解决 | 已修复 |
| 5 | 关闭 | 关闭（`+close` 命令使用此值） |
