feat: implement meeting, support, propose, and monitor command groups

- Added meeting.go: list, get, create, update, attend, delete
- Added support.go: list, get, create, update, take, transition, delete
- Added propose.go: list, get, create, update, accept, reject, reopen
- Added monitor.go: overview, server list/get/create/delete, api-key generate/revoke
- Updated main.go with dispatch handlers for all four new groups
- All commands follow existing patterns (token resolution, --json, table output)

Covers TODO items 1.12, 1.13, 1.14, 1.15 from hf-cross-project-todo.md
This commit is contained in:
zhi
2026-03-21 15:24:43 +00:00
parent a01e602118
commit 34f52cb9e3
5 changed files with 1571 additions and 0 deletions

View File

@@ -158,6 +158,18 @@ func handleGroup(group help.Group, args []string) {
case "task":
handleTaskCommand(sub.Name, remaining)
return
case "meeting":
handleMeetingCommand(sub.Name, remaining)
return
case "support":
handleSupportCommand(sub.Name, remaining)
return
case "propose":
handleProposeCommand(sub.Name, remaining)
return
case "monitor":
handleMonitorCommand(sub.Name, remaining)
return
}
output.Errorf("hf %s %s is recognized but not implemented yet", group.Name, sub.Name)
@@ -540,3 +552,227 @@ func handleProjectCommand(subCmd string, args []string) {
output.Errorf("hf project %s is not implemented yet", subCmd)
}
}
func handleMeetingCommand(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])
}
}
switch subCmd {
case "list":
commands.RunMeetingList(filtered, tokenFlag)
case "get":
if len(filtered) < 1 {
output.Error("usage: hf meeting get <meeting-code>")
}
commands.RunMeetingGet(filtered[0], tokenFlag)
case "create":
commands.RunMeetingCreate(filtered, tokenFlag)
case "update":
if len(filtered) < 1 {
output.Error("usage: hf meeting update <meeting-code> [--title ...] [--desc ...] [--status ...] [--time ...]")
}
commands.RunMeetingUpdate(filtered[0], filtered[1:], tokenFlag)
case "attend":
if len(filtered) < 1 {
output.Error("usage: hf meeting attend <meeting-code>")
}
commands.RunMeetingAttend(filtered[0], tokenFlag)
case "delete":
if len(filtered) < 1 {
output.Error("usage: hf meeting delete <meeting-code>")
}
commands.RunMeetingDelete(filtered[0], tokenFlag)
default:
output.Errorf("hf meeting %s is not implemented yet", subCmd)
}
}
func handleSupportCommand(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])
}
}
switch subCmd {
case "list":
commands.RunSupportList(filtered, tokenFlag)
case "get":
if len(filtered) < 1 {
output.Error("usage: hf support get <support-code>")
}
commands.RunSupportGet(filtered[0], tokenFlag)
case "create":
commands.RunSupportCreate(filtered, tokenFlag)
case "update":
if len(filtered) < 1 {
output.Error("usage: hf support update <support-code> [--title ...] [--desc ...] [--status ...] [--priority ...]")
}
commands.RunSupportUpdate(filtered[0], filtered[1:], tokenFlag)
case "take":
if len(filtered) < 1 {
output.Error("usage: hf support take <support-code>")
}
commands.RunSupportTake(filtered[0], tokenFlag)
case "transition":
if len(filtered) < 2 {
output.Error("usage: hf support transition <support-code> <status>")
}
commands.RunSupportTransition(filtered[0], filtered[1], tokenFlag)
case "delete":
if len(filtered) < 1 {
output.Error("usage: hf support delete <support-code>")
}
commands.RunSupportDelete(filtered[0], tokenFlag)
default:
output.Errorf("hf support %s is not implemented yet", subCmd)
}
}
func handleProposeCommand(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])
}
}
switch subCmd {
case "list":
commands.RunProposeList(filtered, tokenFlag)
case "get":
if len(filtered) < 1 {
output.Error("usage: hf propose get <propose-code>")
}
commands.RunProposeGet(filtered[0], tokenFlag)
case "create":
commands.RunProposeCreate(filtered, tokenFlag)
case "update":
if len(filtered) < 1 {
output.Error("usage: hf propose update <propose-code> [--title ...] [--desc ...]")
}
commands.RunProposeUpdate(filtered[0], filtered[1:], tokenFlag)
case "accept":
if len(filtered) < 1 {
output.Error("usage: hf propose accept <propose-code> --milestone <milestone-code>")
}
commands.RunProposeAccept(filtered[0], filtered[1:], tokenFlag)
case "reject":
if len(filtered) < 1 {
output.Error("usage: hf propose reject <propose-code> [--reason <reason>]")
}
commands.RunProposeReject(filtered[0], filtered[1:], tokenFlag)
case "reopen":
if len(filtered) < 1 {
output.Error("usage: hf propose reopen <propose-code>")
}
commands.RunProposeReopen(filtered[0], tokenFlag)
default:
output.Errorf("hf propose %s is not implemented yet", subCmd)
}
}
func handleMonitorCommand(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])
}
}
switch subCmd {
case "overview":
commands.RunMonitorOverview(tokenFlag)
case "server":
handleMonitorServerCommand(filtered, tokenFlag)
case "api-key":
handleMonitorAPIKeyCommand(filtered, tokenFlag)
default:
output.Errorf("hf monitor %s is not implemented yet", subCmd)
}
}
func handleMonitorServerCommand(args []string, tokenFlag string) {
if len(args) == 0 {
output.Error("usage: hf monitor server <list|get|create|delete> ...")
}
subCmd := args[0]
remaining := args[1:]
switch subCmd {
case "list":
commands.RunMonitorServerList(tokenFlag)
case "get":
if len(remaining) < 1 {
output.Error("usage: hf monitor server get <identifier>")
}
commands.RunMonitorServerGet(remaining[0], tokenFlag)
case "create":
commands.RunMonitorServerCreate(remaining, tokenFlag)
case "delete":
if len(remaining) < 1 {
output.Error("usage: hf monitor server delete <identifier>")
}
commands.RunMonitorServerDelete(remaining[0], tokenFlag)
default:
output.Errorf("unknown monitor server subcommand: %s", subCmd)
}
}
func handleMonitorAPIKeyCommand(args []string, tokenFlag string) {
if len(args) == 0 {
output.Error("usage: hf monitor api-key <generate|revoke> <identifier>")
}
subCmd := args[0]
remaining := args[1:]
switch subCmd {
case "generate":
if len(remaining) < 1 {
output.Error("usage: hf monitor api-key generate <identifier>")
}
commands.RunMonitorAPIKeyGenerate(remaining[0], tokenFlag)
case "revoke":
if len(remaining) < 1 {
output.Error("usage: hf monitor api-key revoke <identifier>")
}
commands.RunMonitorAPIKeyRevoke(remaining[0], tokenFlag)
default:
output.Errorf("unknown monitor api-key subcommand: %s", subCmd)
}
}