feat: switch cli indexing to code-first identifiers

This commit is contained in:
2026-04-03 16:25:11 +00:00
parent 84150df4d5
commit e2177521e0
6 changed files with 124 additions and 73 deletions

View File

@@ -32,21 +32,30 @@ type projectLookup struct {
func resolveProposalProject(c *client.Client, proposalCode string) string {
data, err := c.Get("/projects")
if err != nil {
output.Errorf("failed to list projects for proposal lookup: %v", err)
return ""
}
var projects []projectLookup
if err := json.Unmarshal(data, &projects); err != nil {
output.Errorf("cannot parse project list for proposal lookup: %v", err)
return ""
}
for _, p := range projects {
if p.ProjectCode == "" {
continue
}
if _, err := c.Get("/projects/" + p.ProjectCode + "/proposals/" + proposalCode); err == nil {
return p.ProjectCode
}
}
output.Errorf("proposal not found: %s", proposalCode)
return ""
}
func proposalPath(c *client.Client, proposalCode string) string {
if project := resolveProposalProject(c, proposalCode); project != "" {
return "/projects/" + project + "/proposals/" + proposalCode
}
return "/proposes/" + proposalCode
}
// RunProposeList implements `hf propose list --project <project-code>`.
func RunProposeList(args []string, tokenFlag string) {
token := ResolveToken(tokenFlag)
@@ -77,8 +86,9 @@ func RunProposeList(args []string, tokenFlag string) {
output.Errorf("unknown flag: %s", args[i])
}
}
legacyPath := false
if project == "" {
output.Error("usage: hf propose list --project <project-code> [--status <status>] [--order-by <field>]")
legacyPath = true
}
cfg, err := config.Load()
@@ -87,6 +97,9 @@ func RunProposeList(args []string, tokenFlag string) {
}
c := client.New(cfg.BaseURL, token)
path := "/projects/" + project + "/proposals"
if legacyPath {
path = "/proposes"
}
if encoded := query.Encode(); encoded != "" {
path += "?" + encoded
}
@@ -133,8 +146,7 @@ func RunProposeGet(proposeCode, tokenFlag string) {
output.Errorf("config error: %v", err)
}
c := client.New(cfg.BaseURL, token)
project := resolveProposalProject(c, proposeCode)
data, err := c.Get("/projects/" + project + "/proposals/" + proposeCode)
data, err := c.Get(proposalPath(c, proposeCode))
if err != nil {
output.Errorf("failed to get proposal: %v", err)
}
@@ -281,8 +293,7 @@ func RunProposeUpdate(proposeCode string, args []string, tokenFlag string) {
output.Errorf("config error: %v", err)
}
c := client.New(cfg.BaseURL, token)
project := resolveProposalProject(c, proposeCode)
_, err = c.Patch("/projects/"+project+"/proposals/"+proposeCode, bytes.NewReader(body))
_, err = c.Patch(proposalPath(c, proposeCode), bytes.NewReader(body))
if err != nil {
output.Errorf("failed to update proposal: %v", err)
}
@@ -340,8 +351,7 @@ func RunProposeAccept(proposeCode string, args []string, tokenFlag string) {
output.Errorf("config error: %v", err)
}
c := client.New(cfg.BaseURL, token)
project := resolveProposalProject(c, proposeCode)
data, err := c.Post("/projects/"+project+"/proposals/"+proposeCode+"/accept", bytes.NewReader(body))
data, err := c.Post(proposalPath(c, proposeCode)+"/accept", bytes.NewReader(body))
if err != nil {
output.Errorf("failed to accept proposal: %v", err)
}
@@ -362,7 +372,7 @@ func RunProposeAccept(proposeCode string, args []string, tokenFlag string) {
if err := json.Unmarshal(data, &resp); err == nil && len(resp.GeneratedTasks) > 0 {
fmt.Printf("\nGenerated %d story task(s):\n", len(resp.GeneratedTasks))
for _, gt := range resp.GeneratedTasks {
code := ""
code := "(no task_code)"
if gt.TaskCode != nil {
code = *gt.TaskCode
}
@@ -410,8 +420,7 @@ func RunProposeReject(proposeCode string, args []string, tokenFlag string) {
output.Errorf("config error: %v", err)
}
c := client.New(cfg.BaseURL, token)
project := resolveProposalProject(c, proposeCode)
_, err = c.Post("/projects/"+project+"/proposals/"+proposeCode+"/reject", body)
_, err = c.Post(proposalPath(c, proposeCode)+"/reject", body)
if err != nil {
output.Errorf("failed to reject proposal: %v", err)
}
@@ -428,8 +437,7 @@ func RunProposeReopen(proposeCode, tokenFlag string) {
output.Errorf("config error: %v", err)
}
c := client.New(cfg.BaseURL, token)
project := resolveProposalProject(c, proposeCode)
_, err = c.Post("/projects/"+project+"/proposals/"+proposeCode+"/reopen", nil)
_, err = c.Post(proposalPath(c, proposeCode)+"/reopen", nil)
if err != nil {
output.Errorf("failed to reopen proposal: %v", err)
}