feat: issue +journals/+series-update, ci +activate/+deactivate/+authorize

- issue +journals: 查看 Issue 活动日志
- issue +series-update: 批量更新 Issue 状态
- ci +activate: 激活 CI/CD
- ci +deactivate: 停用 CI/CD
- ci +authorize: 检查 CI/CD 授权状态

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
林迪文 2026-06-03 09:02:06 +08:00
parent 9b08029643
commit 691961072a
2 changed files with 112 additions and 0 deletions

View File

@ -95,6 +95,48 @@ func Shortcuts(translators ...*i18n.Translator) []*common.Shortcut {
}
return ctx.Output(env)
},
{
Name: "activate",
Description: "为仓库激活 CI/CD 功能",
Run: func(ctx *common.RuntimeContext) error {
if err := ctx.ResolveOwnerRepo(); err != nil {
return err
}
env, err := ctx.CallAPI("POST", ctx.RepoPath()+"/activate", nil)
if err != nil {
return err
}
return ctx.Output(env)
},
},
{
Name: "deactivate",
Description: "停用仓库的 CI/CD 功能",
Run: func(ctx *common.RuntimeContext) error {
if err := ctx.ResolveOwnerRepo(); err != nil {
return err
}
env, err := ctx.CallAPI("DELETE", ctx.RepoPath()+"/deactivate", nil)
if err != nil {
return err
}
return ctx.Output(env)
},
},
{
Name: "authorize",
Description: "检查仓库的 CI/CD 授权状态",
Run: func(ctx *common.RuntimeContext) error {
if err := ctx.ResolveOwnerRepo(); err != nil {
return err
}
env, err := ctx.CallAPI("GET", ctx.RepoPath()+"/ci_authorize", nil)
if err != nil {
return err
}
return ctx.Output(env)
},
},
},
}
}

View File

@ -363,6 +363,76 @@ func Shortcuts(translators ...*i18n.Translator) []*common.Shortcut {
return ctx.Output(env)
},
},
{
Name: "journals",
Description: "查看 Issue 的活动日志(评论、状态变更等)",
Flags: []common.Flag{
{Name: "number", Short: "n", Usage: "Issue 编号(网页 URL 中的数字)", Required: true},
},
Run: func(ctx *common.RuntimeContext) error {
if err := ctx.ResolveOwnerRepo(); err != nil {
return err
}
number, err := ctx.RequireArg("number")
if err != nil {
return err
}
path := fmt.Sprintf("%s/issues/%s/journals", v1RepoPath(ctx), number)
env, err := ctx.CallAPI("GET", path, nil)
if err != nil {
return err
}
return ctx.Output(env)
},
},
{
Name: "series-update",
Description: "批量更新多个 Issue 的状态(一键关闭/重开多个 Issue",
Flags: []common.Flag{
{Name: "ids", Usage: "Issue ID 列表(逗号分隔,如 1,2,3", Required: true},
{Name: "status", Short: "s", Usage: "目标状态: open / closed", Required: true},
},
Run: func(ctx *common.RuntimeContext) error {
if err := ctx.ResolveOwnerRepo(); err != nil {
return err
}
idsStr, err := ctx.RequireArg("ids")
if err != nil {
return err
}
status, err := ctx.RequireArg("status")
if err != nil {
return err
}
// 解析逗号分隔的 ID 列表
idParts := strings.Split(idsStr, ",")
ids := make([]int, 0, len(idParts))
for _, p := range idParts {
id, err := strconv.Atoi(strings.TrimSpace(p))
if err != nil {
return fmt.Errorf("无效的 Issue ID: %s", p)
}
ids = append(ids, id)
}
// 转换状态为数字
statusID, err := normalizeIssueStatus(status)
if err != nil {
return err
}
body := map[string]interface{}{
"ids": ids,
"status_id": statusID,
}
env, err := ctx.CallAPI("POST", ctx.RepoPath()+"/issues/series_update", body)
if err != nil {
return err
}
return ctx.Output(env)
},
},
}
}