ai_xiaopei
9 days ago 4bb2313aadcd0644b6ad515406b4f8842e024a55
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package cmd
 
import (
    "fmt"
    "os"
    "strings"
 
    "github.com/spf13/cobra"
)
 
var (
    vaultPath string
    dbPath    string
)
 
// buildLong 为父命令动态生成 Long,格式:# cmd - Short\n子命令详细用法
func buildLong(cmd *cobra.Command) string {
    var sb strings.Builder
    sb.WriteString(fmt.Sprintf("# %s - %s\n", cmd.Name(), cmd.Short))
    for _, sub := range cmd.Commands() {
        if sub.Hidden {
            continue
        }
        if sub.Long != "" {
            sb.WriteString(sub.Long)
            // 确保 Long 末尾有换行
            if !strings.HasSuffix(sub.Long, "\n") {
                sb.WriteString("\n")
            }
        } else {
            sb.WriteString(fmt.Sprintf("%s # %s\n", sub.CommandPath(), sub.Short))
        }
    }
    return sb.String()
}
 
var rootCmd = &cobra.Command{
    Use:   "kb-cli",
    Short: "知识库搜索与管理工具",
    Long: `kb-cli - 知识库搜索与管理工具
 
Global: [--vault=<路径>] [--db=<路径>]`,
}
 
func Execute() {
    // 为每个父命令动态生成 Long(包含子命令详细用法)
    for _, cmd := range rootCmd.Commands() {
        if cmd.HasAvailableSubCommands() && !cmd.Hidden {
            cmd.Long = buildLong(cmd)
        }
    }
 
    // root Long = 头部 + 所有一级子命令的 Long
    var sb strings.Builder
    sb.WriteString(rootCmd.Long)
    for _, cmd := range rootCmd.Commands() {
        if cmd.Hidden {
            continue
        }
        sb.WriteString("\n")
        sb.WriteString(cmd.Long)
    }
    rootCmd.Long = sb.String()
 
    if err := rootCmd.Execute(); err != nil {
        cobra.CheckErr(err)
    }
}
 
func init() {
    homeDir, _ := os.UserHomeDir()
    defaultVault := os.Getenv("KB_VAULT")
    if defaultVault == "" {
        defaultVault = homeDir + "/aisim/note/001/笔记001"
    }
    defaultDB := homeDir + "/.cache/kb-cli/kb.db"
 
    rootCmd.PersistentFlags().StringVar(&vaultPath, "vault", defaultVault, "知识库根目录")
    rootCmd.PersistentFlags().StringVar(&dbPath, "db", defaultDB, "索引数据库路径")
 
    // 自定义 help 模板:只输出 Long
    helpTemplate := `{{.Long}}`
    rootCmd.SetUsageTemplate(helpTemplate)
    rootCmd.SetHelpTemplate(helpTemplate)
 
    rootCmd.SilenceUsage = true
    rootCmd.SilenceErrors = true
}