feat: implement role, permission, project, milestone, and task command groups

- Add role commands: list, get, create, update, delete, set/add/remove-permissions
- Add permission list command
- Add project commands: list, get, create, update, delete, members, add/remove-member
- Add milestone commands: list, get, create, update, delete, progress
- Add task commands: list, get, create, update, transition, take, delete, search
- Wire all new command groups into main.go dispatcher
- All commands support --json output mode and --token manual auth
- Passes go build and go vet cleanly
This commit is contained in:
zhi
2026-03-21 14:50:43 +00:00
parent 69287d5a49
commit 57af1512d1
5 changed files with 1851 additions and 0 deletions

View File

@@ -143,6 +143,21 @@ func handleGroup(group help.Group, args []string) {
case "user":
handleUserCommand(sub.Name, remaining)
return
case "role":
handleRoleCommand(sub.Name, remaining)
return
case "permission":
handlePermissionCommand(sub.Name, remaining)
return
case "project":
handleProjectCommand(sub.Name, remaining)
return
case "milestone":
handleMilestoneCommand(sub.Name, remaining)
return
case "task":
handleTaskCommand(sub.Name, remaining)
return
}
output.Errorf("hf %s %s is recognized but not implemented yet", group.Name, sub.Name)
@@ -256,3 +271,272 @@ func findSubCommand(group help.Group, name string) (help.Command, bool) {
}
return help.Command{}, false
}
func handleRoleCommand(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.RunRoleList(tokenFlag)
case "get":
if len(filtered) < 1 {
output.Error("usage: hf role get <role-name>")
}
commands.RunRoleGet(filtered[0], tokenFlag)
case "create":
name, desc := "", ""
global := false
var remaining []string
for i := 0; i < len(filtered); i++ {
switch filtered[i] {
case "--name":
if i+1 < len(filtered) {
i++
name = filtered[i]
}
case "--desc":
if i+1 < len(filtered) {
i++
desc = filtered[i]
}
case "--global":
if i+1 < len(filtered) {
i++
global = filtered[i] == "true"
}
default:
remaining = append(remaining, filtered[i])
}
}
_ = remaining
if name == "" {
output.Error("usage: hf role create --name <role-name>")
}
commands.RunRoleCreate(name, desc, global, tokenFlag)
case "update":
if len(filtered) < 1 {
output.Error("usage: hf role update <role-name> [--desc ...]")
}
commands.RunRoleUpdate(filtered[0], filtered[1:], tokenFlag)
case "delete":
if len(filtered) < 1 {
output.Error("usage: hf role delete <role-name>")
}
commands.RunRoleDelete(filtered[0], tokenFlag)
case "set-permissions":
if len(filtered) < 1 {
output.Error("usage: hf role set-permissions <role-name> --permission <perm> [...]")
}
roleName := filtered[0]
perms := extractPermissions(filtered[1:])
commands.RunRoleSetPermissions(roleName, perms, tokenFlag)
case "add-permissions":
if len(filtered) < 1 {
output.Error("usage: hf role add-permissions <role-name> --permission <perm> [...]")
}
roleName := filtered[0]
perms := extractPermissions(filtered[1:])
commands.RunRoleAddPermissions(roleName, perms, tokenFlag)
case "remove-permissions":
if len(filtered) < 1 {
output.Error("usage: hf role remove-permissions <role-name> --permission <perm> [...]")
}
roleName := filtered[0]
perms := extractPermissions(filtered[1:])
commands.RunRoleRemovePermissions(roleName, perms, tokenFlag)
default:
output.Errorf("hf role %s is not implemented yet", subCmd)
}
}
func extractPermissions(args []string) []string {
var perms []string
for i := 0; i < len(args); i++ {
if args[i] == "--permission" && i+1 < len(args) {
i++
perms = append(perms, args[i])
}
}
return perms
}
func handlePermissionCommand(subCmd string, args []string) {
tokenFlag := ""
for i := 0; i < len(args); i++ {
if args[i] == "--token" && i+1 < len(args) {
i++
tokenFlag = args[i]
}
}
switch subCmd {
case "list":
commands.RunPermissionList(tokenFlag)
default:
output.Errorf("hf permission %s is not implemented yet", subCmd)
}
}
func handleMilestoneCommand(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.RunMilestoneList(filtered, tokenFlag)
case "get":
if len(filtered) < 1 {
output.Error("usage: hf milestone get <milestone-code>")
}
commands.RunMilestoneGet(filtered[0], tokenFlag)
case "create":
commands.RunMilestoneCreate(filtered, tokenFlag)
case "update":
if len(filtered) < 1 {
output.Error("usage: hf milestone update <milestone-code> [--title ...] [--desc ...] [--status ...] [--due ...]")
}
commands.RunMilestoneUpdate(filtered[0], filtered[1:], tokenFlag)
case "delete":
if len(filtered) < 1 {
output.Error("usage: hf milestone delete <milestone-code>")
}
commands.RunMilestoneDelete(filtered[0], tokenFlag)
case "progress":
if len(filtered) < 1 {
output.Error("usage: hf milestone progress <milestone-code>")
}
commands.RunMilestoneProgress(filtered[0], tokenFlag)
default:
output.Errorf("hf milestone %s is not implemented yet", subCmd)
}
}
func handleTaskCommand(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.RunTaskList(filtered, tokenFlag)
case "get":
if len(filtered) < 1 {
output.Error("usage: hf task get <task-code>")
}
commands.RunTaskGet(filtered[0], tokenFlag)
case "create":
commands.RunTaskCreate(filtered, tokenFlag)
case "update":
if len(filtered) < 1 {
output.Error("usage: hf task update <task-code> [--title ...] [--desc ...] [--status ...] [--priority ...] [--assignee ...]")
}
commands.RunTaskUpdate(filtered[0], filtered[1:], tokenFlag)
case "transition":
if len(filtered) < 2 {
output.Error("usage: hf task transition <task-code> <status>")
}
commands.RunTaskTransition(filtered[0], filtered[1], tokenFlag)
case "take":
if len(filtered) < 1 {
output.Error("usage: hf task take <task-code>")
}
commands.RunTaskTake(filtered[0], tokenFlag)
case "delete":
if len(filtered) < 1 {
output.Error("usage: hf task delete <task-code>")
}
commands.RunTaskDelete(filtered[0], tokenFlag)
case "search":
commands.RunTaskSearch(filtered, tokenFlag)
default:
output.Errorf("hf task %s is not implemented yet", subCmd)
}
}
func handleProjectCommand(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.RunProjectList(filtered, tokenFlag)
case "get":
if len(filtered) < 1 {
output.Error("usage: hf project get <project-code>")
}
commands.RunProjectGet(filtered[0], tokenFlag)
case "create":
commands.RunProjectCreate(filtered, tokenFlag)
case "update":
if len(filtered) < 1 {
output.Error("usage: hf project update <project-code> [--name ...] [--desc ...] [--repo ...]")
}
commands.RunProjectUpdate(filtered[0], filtered[1:], tokenFlag)
case "delete":
if len(filtered) < 1 {
output.Error("usage: hf project delete <project-code>")
}
commands.RunProjectDelete(filtered[0], tokenFlag)
case "members":
if len(filtered) < 1 {
output.Error("usage: hf project members <project-code>")
}
commands.RunProjectMembers(filtered[0], tokenFlag)
case "add-member":
if len(filtered) < 1 {
output.Error("usage: hf project add-member <project-code> --user <username> --role <role-name>")
}
commands.RunProjectAddMember(filtered[0], filtered[1:], tokenFlag)
case "remove-member":
if len(filtered) < 1 {
output.Error("usage: hf project remove-member <project-code> --user <username>")
}
commands.RunProjectRemoveMember(filtered[0], filtered[1:], tokenFlag)
default:
output.Errorf("hf project %s is not implemented yet", subCmd)
}
}