feat(knowledge-base): wrap KnowledgeBase API in the CLI

Add `hf knowledge-base` group: list/get/tree/topics, create/update/delete,
link/unlink to projects, and add/update/delete for topics, categories and
facts. Mirrors the project command style (flag parsing, JSON/table output,
token resolution). Registered in the dispatcher and the help surface, gated
on the knowledge-base.* permissions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
h z
2026-05-31 15:03:22 +01:00
parent c0ab087436
commit 4df6e1bd5f
3 changed files with 762 additions and 0 deletions

View File

@@ -216,6 +216,9 @@ func handleGroup(group help.Group, args []string) {
case "project":
handleProjectCommand(sub.Name, remaining)
return
case "knowledge-base":
handleKnowledgeBaseCommand(sub.Name, remaining)
return
case "milestone":
handleMilestoneCommand(sub.Name, remaining)
return
@@ -731,6 +734,83 @@ func handleProjectCommand(subCmd string, args []string) {
}
}
func handleKnowledgeBaseCommand(subCmd string, args []string) {
tokenFlag := ""
var filtered []string
for i := 0; i < len(args); i++ {
switch args[i] {
case "--token":
if i+1 < len(args) {
i++
tokenFlag = args[i]
}
default:
filtered = append(filtered, args[i])
}
}
needArg := func(usage string) {
if len(filtered) < 1 {
output.Error(usage)
}
}
switch subCmd {
case "list":
commands.RunKnowledgeBaseList(filtered, tokenFlag)
case "get":
needArg("usage: hf knowledge-base get <kb-code>")
commands.RunKnowledgeBaseGet(filtered[0], tokenFlag)
case "create":
commands.RunKnowledgeBaseCreate(filtered, tokenFlag)
case "update":
needArg("usage: hf knowledge-base update <kb-code> [--title ...] [--desc ...]")
commands.RunKnowledgeBaseUpdate(filtered[0], filtered[1:], tokenFlag)
case "delete":
needArg("usage: hf knowledge-base delete <kb-code>")
commands.RunKnowledgeBaseDelete(filtered[0], tokenFlag)
case "tree":
needArg("usage: hf knowledge-base tree <kb-code>")
commands.RunKnowledgeBaseTree(filtered[0], tokenFlag)
case "link":
needArg("usage: hf knowledge-base link <kb-code> --project <project-code>")
commands.RunKnowledgeBaseLink(filtered[0], filtered[1:], tokenFlag)
case "unlink":
needArg("usage: hf knowledge-base unlink <kb-code> --project <project-code>")
commands.RunKnowledgeBaseUnlink(filtered[0], filtered[1:], tokenFlag)
case "topics":
needArg("usage: hf knowledge-base topics <kb-code>")
commands.RunKnowledgeBaseTopics(filtered[0], tokenFlag)
case "add-topic":
needArg("usage: hf knowledge-base add-topic <kb-code> --topic <name> [--desc ...]")
commands.RunKnowledgeBaseAddTopic(filtered[0], filtered[1:], tokenFlag)
case "update-topic":
needArg("usage: hf knowledge-base update-topic <topic-id> [--topic ...] [--desc ...]")
commands.RunKnowledgeBaseUpdateTopic(filtered[0], filtered[1:], tokenFlag)
case "delete-topic":
needArg("usage: hf knowledge-base delete-topic <topic-id>")
commands.RunKnowledgeBaseDeleteTopic(filtered[0], tokenFlag)
case "add-category":
commands.RunKnowledgeBaseAddCategory(filtered, tokenFlag)
case "update-category":
needArg("usage: hf knowledge-base update-category <category-id> [--name ...] [--parent ...] [--desc ...]")
commands.RunKnowledgeBaseUpdateCategory(filtered[0], filtered[1:], tokenFlag)
case "delete-category":
needArg("usage: hf knowledge-base delete-category <category-id>")
commands.RunKnowledgeBaseDeleteCategory(filtered[0], tokenFlag)
case "add-fact":
commands.RunKnowledgeBaseAddFact(filtered, tokenFlag)
case "update-fact":
needArg("usage: hf knowledge-base update-fact <fact-id> [--fact ...] [--category ...]")
commands.RunKnowledgeBaseUpdateFact(filtered[0], filtered[1:], tokenFlag)
case "delete-fact":
needArg("usage: hf knowledge-base delete-fact <fact-id>")
commands.RunKnowledgeBaseDeleteFact(filtered[0], tokenFlag)
default:
output.Errorf("hf knowledge-base %s is not implemented yet", subCmd)
}
}
func handleMeetingCommand(subCmd string, args []string) {
tokenFlag := ""
var filtered []string