diff --git a/README.md b/README.md index fc2e5a1..6711900 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,12 @@ gitlink-cli issue +batch-close --owner Gitlink --repo forgeplus --from issues.cs # Add a comment gitlink-cli issue +comment --owner Gitlink --repo forgeplus -i 123 -b "Fixed" + +# List issue assigners +gitlink-cli issue +assigners --owner Gitlink --repo forgeplus + +# List issue authors +gitlink-cli issue +authors --owner Gitlink --repo forgeplus ``` ### Pull Requests diff --git a/README.zh-CN.md b/README.zh-CN.md index bd305f7..1a56fe4 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -235,6 +235,12 @@ gitlink-cli issue +batch-close --owner Gitlink --repo forgeplus --from issues.cs # 添加评论 gitlink-cli issue +comment --owner Gitlink --repo forgeplus -i 123 -b "已修复" + +# 列出 Issue 负责人 +gitlink-cli issue +assigners --owner Gitlink --repo forgeplus + +# 列出 Issue 发布人 +gitlink-cli issue +authors --owner Gitlink --repo forgeplus ``` ### Pull Request diff --git a/shortcuts/issue/issue.go b/shortcuts/issue/issue.go index 902fda8..7c0bc68 100644 --- a/shortcuts/issue/issue.go +++ b/shortcuts/issue/issue.go @@ -223,6 +223,48 @@ func Shortcuts() []*common.Shortcut { return ctx.Output(env) }, }, + { + Name: "assigners", + Description: "List issue assigners", + Flags: []common.Flag{ + {Name: "keyword", Short: "k", Usage: "Search keyword"}, + }, + Run: func(ctx *common.RuntimeContext) error { + if err := ctx.ResolveOwnerRepo(); err != nil { + return err + } + q := url.Values{} + if keyword := ctx.Arg("keyword"); keyword != "" { + q.Set("keyword", keyword) + } + env, err := ctx.CallAPIWithQuery("GET", v1RepoPath(ctx)+"/issue_assigners", q) + if err != nil { + return err + } + return ctx.Output(env) + }, + }, + { + Name: "authors", + Description: "List issue authors", + Flags: []common.Flag{ + {Name: "keyword", Short: "k", Usage: "Search keyword"}, + }, + Run: func(ctx *common.RuntimeContext) error { + if err := ctx.ResolveOwnerRepo(); err != nil { + return err + } + q := url.Values{} + if keyword := ctx.Arg("keyword"); keyword != "" { + q.Set("keyword", keyword) + } + env, err := ctx.CallAPIWithQuery("GET", v1RepoPath(ctx)+"/issue_authors", q) + if err != nil { + return err + } + return ctx.Output(env) + }, + }, } } diff --git a/shortcuts/issue/issue_test.go b/shortcuts/issue/issue_test.go index 088f82c..661a4de 100644 --- a/shortcuts/issue/issue_test.go +++ b/shortcuts/issue/issue_test.go @@ -131,6 +131,52 @@ func TestBatchClosePreservesCurrentDescription(t *testing.T) { assertEqual(t, updatePayload["status_id"], float64(5)) } +func TestIssueAssignersShortcutWithKeyword(t *testing.T) { + server := newIssueTestServer(t, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" || r.URL.Path != "/v1/owner/repo/issue_assigners.json" { + t.Fatalf("unexpected request: %s %s", r.Method, r.URL.Path) + } + assertEqual(t, r.URL.Query().Get("keyword"), "alice") + writeJSON(t, w, map[string]interface{}{ + "total_count": 1, + "assigners": []map[string]interface{}{ + {"id": 7, "name": "Alice", "login": "alice"}, + }, + }) + }) + defer server.Close() + + err := runIssueShortcut(t, server, "assigners", map[string]string{ + "keyword": "alice", + }) + if err != nil { + t.Fatalf("assigners shortcut failed: %v", err) + } +} + +func TestIssueAuthorsShortcutWithKeyword(t *testing.T) { + server := newIssueTestServer(t, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" || r.URL.Path != "/v1/owner/repo/issue_authors.json" { + t.Fatalf("unexpected request: %s %s", r.Method, r.URL.Path) + } + assertEqual(t, r.URL.Query().Get("keyword"), "bob") + writeJSON(t, w, map[string]interface{}{ + "total_count": 1, + "authors": []map[string]interface{}{ + {"id": 8, "name": "Bob", "login": "bob"}, + }, + }) + }) + defer server.Close() + + err := runIssueShortcut(t, server, "authors", map[string]string{ + "keyword": "bob", + }) + if err != nil { + t.Fatalf("authors shortcut failed: %v", err) + } +} + func runIssueShortcut(t *testing.T, server *httptest.Server, name string, args map[string]string) error { t.Helper() shortcut := findIssueShortcut(t, name) diff --git a/skills/gitlink-issue/SKILL.md b/skills/gitlink-issue/SKILL.md index 1938da6..0928362 100644 --- a/skills/gitlink-issue/SKILL.md +++ b/skills/gitlink-issue/SKILL.md @@ -27,6 +27,8 @@ metadata: | `issue +close` | 关闭 Issue | 是 | | `issue +batch-close` | 批量关闭 Issue,支持 `--dry-run` 预览 | 是(dry-run 不写入) | | `issue +comment` | 添加评论 | 是 | +| `issue +assigners` | 查询 Issue 负责人列表 | 否(公开项目) | +| `issue +authors` | 查询 Issue 发布人列表 | 否(公开项目) | ## 使用示例 @@ -54,6 +56,12 @@ gitlink-cli issue +batch-close --owner myuser --repo myrepo --from issues.csv # 添加评论 gitlink-cli issue +comment --number 4 --body "已修复,请验证" + +# 查询 Issue 负责人 +gitlink-cli issue +assigners --owner Gitlink --repo forgeplus --keyword alice + +# 查询 Issue 发布人 +gitlink-cli issue +authors --owner Gitlink --repo forgeplus --keyword bob ``` ## Raw API 补充 diff --git a/skills/gitlink-issue/references/gitlink-issue-assigners.md b/skills/gitlink-issue/references/gitlink-issue-assigners.md new file mode 100644 index 0000000..23f1a4e --- /dev/null +++ b/skills/gitlink-issue/references/gitlink-issue-assigners.md @@ -0,0 +1,25 @@ +# Issue Assigners + +Use `issue +assigners` to list users that can be assigned to Issues in a repository. +This helps users find the assignee ID before creating or updating an Issue. + +## Usage + +```bash +gitlink-cli issue +assigners --owner Gitlink --repo forgeplus +gitlink-cli issue +assigners --owner Gitlink --repo forgeplus --keyword alice +``` + +## Options + +| Option | Description | +|--------|-------------| +| `--owner` | Repository owner | +| `--repo` | Repository name | +| `--keyword`, `-k` | Optional search keyword | + +## API + +```http +GET /api/v1/{owner}/{repo}/issue_assigners.json +``` diff --git a/skills/gitlink-issue/references/gitlink-issue-authors.md b/skills/gitlink-issue/references/gitlink-issue-authors.md new file mode 100644 index 0000000..49edc9f --- /dev/null +++ b/skills/gitlink-issue/references/gitlink-issue-authors.md @@ -0,0 +1,25 @@ +# Issue Authors + +Use `issue +authors` to list users who have authored Issues in a repository. +This helps users find author IDs for Issue filtering and reporting workflows. + +## Usage + +```bash +gitlink-cli issue +authors --owner Gitlink --repo forgeplus +gitlink-cli issue +authors --owner Gitlink --repo forgeplus --keyword bob +``` + +## Options + +| Option | Description | +|--------|-------------| +| `--owner` | Repository owner | +| `--repo` | Repository name | +| `--keyword`, `-k` | Optional search keyword | + +## API + +```http +GET /api/v1/{owner}/{repo}/issue_authors.json +```