From 811f4a8f4a1263a22e34832da367981ff3f09b67 Mon Sep 17 00:00:00 2001 From: 15972095207 <2484216370@qq.com> Date: Mon, 6 Jul 2026 16:09:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20do=E5=91=BD=E4=BB=A4=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=EF=BC=88=E6=A8=A1=E5=9D=97=E5=90=8D=E5=88=97=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E5=91=BD=E4=BB=A4+=E7=AE=80=E7=9F=AD=E7=89=88/=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E7=89=88=E7=A4=BA=E4=BE=8B+50+=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E8=AF=8D=E5=8C=B9=E9=85=8D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/do.go | 134 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 109 insertions(+), 25 deletions(-) diff --git a/cmd/do.go b/cmd/do.go index a343ba2..cec8a7d 100644 --- a/cmd/do.go +++ b/cmd/do.go @@ -10,51 +10,83 @@ import ( ) // NLCommand 自然语言命令路由 -// 用法: gitlink-cli do "列出issue" -// 关键词匹配 → 推荐命令 + 自动显示参数说明 +// 用法: gitlink-cli do "列出issue" 或 gitlink-cli do wiki +// 关键词匹配 → 推荐命令 + 显示参数 + 简短/完全示例 +// 输入模块名(如 wiki)→ 列出该模块全部命令 func newDoCmd() *cobra.Command { return &cobra.Command{ - Use: `do "自然语言描述"`, - Short: "Natural language command helper (e.g. do \"list my issues\")", - Long: `用自然语言描述你想做的事,自动匹配命令并显示参数。例如: gitlink-cli do "列出issue"`, - Args: cobra.MinimumNArgs(1), + Use: `do "自然语言描述或模块名"`, + Short: "Natural language command helper (e.g. do \"list issues\" or do wiki)", + Long: `用自然语言描述你想做的事,自动匹配命令并显示参数。 +也可以直接输入模块名查看该模块全部命令。 + +示例: + gitlink-cli do 列出issue # 匹配到 issue +list + gitlink-cli do wiki # 列出 wiki 全部命令 + gitlink-cli do 创建标签 # 匹配到 label +create`, + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { input := strings.ToLower(strings.Join(args, " ")) + input = strings.TrimSpace(input) + exePath, _ := os.Executable() + + // 1. 先检查是否是模块名(如 wiki/issue/pr/label...) + modules := []string{"wiki", "issue", "pr", "label", "notification", "snippet", + "repo", "release", "branch", "member", "milestone", "webhook", + "ci", "search", "org", "user", "compare", "workflow"} + for _, mod := range modules { + if input == mod { + fmt.Printf("📦 %s 模块全部命令:\n", mod) + fmt.Println(strings.Repeat("=", 50)) + helpCmd := exec.Command(exePath, mod, "--help") + helpCmd.Stdout = os.Stdout + helpCmd.Stderr = os.Stderr + helpCmd.Run() + fmt.Println(strings.Repeat("=", 50)) + fmt.Println("\n💡 选择一个命令运行,例如:") + fmt.Printf(" gitlink-cli %s +list\n", mod) + fmt.Printf(" gitlink-cli %s +list --owner ylly --repo gitlink-cli --format json (完全版)\n", mod) + return + } + } + + // 2. 关键词匹配 matched := matchNL(input) if matched == "" { - fmt.Println("❌ 未识别的命令。试试这些关键词:") - fmt.Println(" issue / pr / label / wiki / release / repo") - fmt.Println(" snippet / notification / member / branch / search") - fmt.Println(" list / create / view / merge / close / 登录") - fmt.Println("\n示例: gitlink-cli do \"列出issue\"") + fmt.Println("❌ 未识别。试试这些:") + fmt.Println(" 输入模块名(wiki/issue/pr/label/notification/snippet/repo...)") + fmt.Println(" 或描述操作(列出issue/创建标签/登录/搜索仓库...)") + fmt.Println("\n示例:") + fmt.Println(" gitlink-cli do wiki # 查看 wiki 全部命令") + fmt.Println(" gitlink-cli do 列出issue # 匹配 issue +list") os.Exit(1) } - // 拆分出 group 和 subcommand parts := strings.Fields(matched) fmt.Printf("✅ 匹配到命令: %s\n\n", matched) - // 自动显示该命令的 --help(让用户看到所有参数) + // 显示该命令的 --help if len(parts) >= 2 { group := parts[0] sub := parts[1] fmt.Println("📋 命令参数说明:") fmt.Println(strings.Repeat("-", 50)) - - // 调用 gitlink-cli --help - helpArgs := []string{group, sub, "--help"} - exePath, _ := os.Executable() - helpCmd := exec.Command(exePath, helpArgs...) + helpCmd := exec.Command(exePath, group, sub, "--help") helpCmd.Stdout = os.Stdout helpCmd.Stderr = os.Stderr helpCmd.Run() - fmt.Println(strings.Repeat("-", 50)) - fmt.Printf("\n💡 完整命令示例:\n") - fmt.Printf(" .\\gitlink-cli.exe %s --owner ylly --repo gitlink-cli --format json\n", matched) + + // 显示简短版 + 完全版示例 + fmt.Println("\n💡 命令示例:") + fmt.Printf(" 简短版(在自己的仓库目录里):\n") + fmt.Printf(" gitlink-cli %s\n", matched) + fmt.Printf(" 完全版(任何目录都能用):\n") + fmt.Printf(" gitlink-cli %s --owner ylly --repo gitlink-cli --format json\n", matched) } else { - fmt.Printf("💡 运行:.\\gitlink-cli.exe %s\n", matched) + // auth login / auth status 等无子命令的 + fmt.Printf("\n💡 运行:gitlink-cli %s\n", matched) } }, } @@ -67,28 +99,79 @@ func matchNL(input string) string { cmd string } rules := []rule{ + // Issue {[]string{"issue", "疑修", "问题", "list", "列", "查看"}, "issue +list"}, {[]string{"issue", "create", "新建", "创建", "提"}, "issue +create"}, + {[]string{"issue", "view", "详情", "看"}, "issue +view"}, + {[]string{"issue", "close", "关闭"}, "issue +close"}, + {[]string{"issue", "update", "更新", "修改"}, "issue +update"}, + {[]string{"issue", "comment", "评论", "回复"}, "issue +comment"}, + {[]string{"issue", "batch", "批量", "关闭"}, "issue +batch-close"}, + {[]string{"issue", "assigners", "负责人", "分配", "候选"}, "issue +assigners"}, + {[]string{"issue", "authors", "作者"}, "issue +authors"}, + // PR {[]string{"pr", "pull", "合并请求", "merge", "list"}, "pr +list"}, + {[]string{"pr", "create", "新建", "提交"}, "pr +create"}, + {[]string{"pr", "view", "详情", "看"}, "pr +view"}, + {[]string{"pr", "merge", "合并"}, "pr +merge"}, + {[]string{"pr", "diff", "差异", "变更"}, "pr +diff"}, + {[]string{"pr", "files", "文件", "变更文件"}, "pr +files"}, + {[]string{"pr", "review", "审查", "review"}, "pr +review"}, + {[]string{"pr", "close", "关闭"}, "pr +close"}, + {[]string{"pr", "reopen", "重开", "重新打开"}, "pr +reopen"}, + // Label {[]string{"label", "tag", "标签", "list"}, "label +list"}, {[]string{"label", "tag", "标签", "create", "新建", "创建"}, "label +create"}, + {[]string{"label", "tag", "标签", "update", "更新", "修改"}, "label +update"}, + {[]string{"label", "tag", "标签", "delete", "删除"}, "label +delete"}, + {[]string{"label", "tag", "标签", "batch", "批量"}, "label +batch-create"}, + // Wiki {[]string{"wiki", "文档", "知识库", "list"}, "wiki +list"}, {[]string{"wiki", "文档", "create", "新建", "创建"}, "wiki +create"}, + {[]string{"wiki", "文档", "view", "查看"}, "wiki +view"}, + {[]string{"wiki", "文档", "update", "更新"}, "wiki +update"}, + {[]string{"wiki", "文档", "delete", "删除"}, "wiki +delete"}, + // Release {[]string{"release", "发布", "版本", "list"}, "release +list"}, {[]string{"release", "发布", "create", "新建"}, "release +create"}, + {[]string{"release", "发布", "view", "查看"}, "release +view"}, + // Repo {[]string{"repo", "仓库", "info", "信息"}, "repo +info"}, {[]string{"repo", "仓库", "create", "新建", "创建"}, "repo +create"}, + {[]string{"repo", "仓库", "readme"}, "repo +readme"}, + {[]string{"repo", "仓库", "fork", "复刻"}, "repo +fork"}, + {[]string{"repo", "仓库", "list", "列"}, "repo +list"}, + // Auth {[]string{"auth", "login", "登录", "认证"}, "auth login"}, {[]string{"auth", "status", "状态"}, "auth status"}, - {[]string{"snippet", "片段", "代码", "list"}, "snippet +list"}, - {[]string{"snippet", "片段", "代码", "create", "新建"}, "snippet +create"}, + // Snippet + {[]string{"snippet", "片段", "代码片段", "list"}, "snippet +list"}, + {[]string{"snippet", "片段", "代码片段", "create", "新建", "保存"}, "snippet +create"}, + {[]string{"snippet", "片段", "代码片段", "view", "查看"}, "snippet +view"}, + {[]string{"snippet", "片段", "代码片段", "delete", "删除"}, "snippet +delete"}, + // Notification {[]string{"notification", "通知", "消息", "list"}, "notification +list"}, + {[]string{"notification", "通知", "read", "已读"}, "notification +read"}, + {[]string{"notification", "通知", "delete", "删除"}, "notification +delete"}, + // Member {[]string{"member", "成员", "list"}, "member +list"}, + {[]string{"member", "成员", "add", "添加"}, "member +add"}, + {[]string{"member", "成员", "invite", "邀请"}, "member +invite-link"}, + // Branch {[]string{"branch", "分支", "list"}, "branch +list"}, + {[]string{"branch", "分支", "create", "新建"}, "branch +create"}, + // CI {[]string{"ci", "构建", "流水线", "list"}, "ci +list"}, - {[]string{"search", "搜索", "查找"}, "search +repos"}, + {[]string{"ci", "构建", "log", "日志"}, "ci +logs"}, + // Search + {[]string{"search", "搜索", "查找", "repos"}, "search +repos"}, + {[]string{"search", "搜索", "查找", "user", "用户"}, "search +users"}, + // Milestone {[]string{"milestone", "里程碑", "list"}, "milestone +list"}, + {[]string{"milestone", "里程碑", "create", "新建"}, "milestone +create"}, + // Webhook {[]string{"webhook", "钩子", "list"}, "webhook +list"}, + {[]string{"webhook", "钩子", "create", "新建"}, "webhook +create"}, } bestMatch := "" @@ -106,6 +189,7 @@ func matchNL(input string) string { } } + // 降级:只匹配1个关键词 if bestMatch == "" { for _, r := range rules { for _, kw := range r.keywords {