Skip to content

Commit 890e1a5

Browse files
committed
feat: Add extensions, kanban, epics, seeds, stacked diffs commands
From GitHub: - extension/ext: CLI extension management (list, install, uninstall) From Gitea: - kanban/kb/board: Kanban board management (list, create) From GitLab: - epic: Epic management (list, create) From Radicle: - seed: Seed node management (list, add) From Sapling: - stack: Stacked diff management (list) New commands: 15+ Total: 60+ commands, 170+ subcommands
1 parent a3332d7 commit 890e1a5

1 file changed

Lines changed: 317 additions & 0 deletions

File tree

cmd/gitant/advanced.go

Lines changed: 317 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,317 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"github.com/GrayCodeAI/gitant-cli/internal/cli"
8+
"github.com/spf13/cobra"
9+
)
10+
11+
var extensionCmd = &cobra.Command{
12+
Use: "extension",
13+
Short: "Manage CLI extensions (from GitHub)",
14+
Aliases: []string{"ext"},
15+
}
16+
17+
var extensionListCmd = &cobra.Command{
18+
Use: "list",
19+
Short: "List installed extensions",
20+
Run: func(cmd *cobra.Command, args []string) {
21+
daemonURL, _ := cmd.Flags().GetString("daemon-url")
22+
client := cli.NewClient(daemonURL)
23+
24+
var result struct {
25+
Extensions []struct {
26+
Name string `json:"name"`
27+
Description string `json:"description"`
28+
Version string `json:"version"`
29+
} `json:"extensions"`
30+
}
31+
if err := client.Get("/api/v1/extensions", &result); err != nil {
32+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
33+
os.Exit(1)
34+
}
35+
36+
for _, ext := range result.Extensions {
37+
fmt.Printf("%s\t%s\t%s\n", ext.Name, ext.Version, ext.Description)
38+
}
39+
},
40+
}
41+
42+
var extensionInstallCmd = &cobra.Command{
43+
Use: "install [name]",
44+
Short: "Install an extension",
45+
Args: cobra.ExactArgs(1),
46+
Run: func(cmd *cobra.Command, args []string) {
47+
daemonURL, _ := cmd.Flags().GetString("daemon-url")
48+
client := cli.NewClient(daemonURL)
49+
50+
var result map[string]interface{}
51+
if err := client.Post(fmt.Sprintf("/api/v1/extensions/%s/install", args[0]), nil, &result); err != nil {
52+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
53+
os.Exit(1)
54+
}
55+
fmt.Printf("Installed extension: %s\n", args[0])
56+
},
57+
}
58+
59+
var extensionUninstallCmd = &cobra.Command{
60+
Use: "uninstall [name]",
61+
Short: "Uninstall an extension",
62+
Args: cobra.ExactArgs(1),
63+
Run: func(cmd *cobra.Command, args []string) {
64+
daemonURL, _ := cmd.Flags().GetString("daemon-url")
65+
client := cli.NewClient(daemonURL)
66+
67+
if err := client.Delete(fmt.Sprintf("/api/v1/extensions/%s", args[0])); err != nil {
68+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
69+
os.Exit(1)
70+
}
71+
fmt.Printf("Uninstalled extension: %s\n", args[0])
72+
},
73+
}
74+
75+
var kanbanCmd = &cobra.Command{
76+
Use: "kanban",
77+
Short: "Manage Kanban boards (from Gitea)",
78+
Aliases: []string{"kb", "board"},
79+
}
80+
81+
var kanbanListCmd = &cobra.Command{
82+
Use: "list",
83+
Short: "List Kanban boards",
84+
Run: func(cmd *cobra.Command, args []string) {
85+
repo, _ := cmd.Flags().GetString("repo")
86+
daemonURL, _ := cmd.Flags().GetString("daemon-url")
87+
client := cli.NewClient(daemonURL)
88+
89+
var result struct {
90+
Boards []struct {
91+
ID string `json:"id"`
92+
Name string `json:"name"`
93+
} `json:"boards"`
94+
}
95+
if err := client.Get(fmt.Sprintf("/api/v1/repos/%s/kanban", repo), &result); err != nil {
96+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
97+
os.Exit(1)
98+
}
99+
100+
for _, b := range result.Boards {
101+
fmt.Printf("%s\t%s\n", b.ID, b.Name)
102+
}
103+
},
104+
}
105+
106+
var kanbanCreateCmd = &cobra.Command{
107+
Use: "create",
108+
Short: "Create a Kanban board",
109+
Run: func(cmd *cobra.Command, args []string) {
110+
repo, _ := cmd.Flags().GetString("repo")
111+
name, _ := cmd.Flags().GetString("name")
112+
daemonURL, _ := cmd.Flags().GetString("daemon-url")
113+
114+
if name == "" {
115+
name = PromptRequired("Board name")
116+
}
117+
118+
client := cli.NewClient(daemonURL)
119+
req := map[string]string{"name": name}
120+
121+
var result map[string]interface{}
122+
if err := client.Post(fmt.Sprintf("/api/v1/repos/%s/kanban", repo), req, &result); err != nil {
123+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
124+
os.Exit(1)
125+
}
126+
fmt.Printf("Created board: %s\n", result["id"])
127+
},
128+
}
129+
130+
var epicCmd = &cobra.Command{
131+
Use: "epic",
132+
Short: "Manage epics (from GitLab)",
133+
}
134+
135+
var epicListCmd = &cobra.Command{
136+
Use: "list",
137+
Short: "List epics",
138+
Run: func(cmd *cobra.Command, args []string) {
139+
repo, _ := cmd.Flags().GetString("repo")
140+
status, _ := cmd.Flags().GetString("status")
141+
daemonURL, _ := cmd.Flags().GetString("daemon-url")
142+
client := cli.NewClient(daemonURL)
143+
144+
path := fmt.Sprintf("/api/v1/repos/%s/epics", repo)
145+
if status != "" {
146+
path += "?status=" + status
147+
}
148+
149+
var result struct {
150+
Epics []struct {
151+
ID string `json:"id"`
152+
Title string `json:"title"`
153+
Status string `json:"status"`
154+
Progress float64 `json:"progress"`
155+
} `json:"epics"`
156+
}
157+
if err := client.Get(path, &result); err != nil {
158+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
159+
os.Exit(1)
160+
}
161+
162+
for _, e := range result.Epics {
163+
fmt.Printf("%s\t%s\t%s\t%.0f%%\n", e.ID, e.Title, e.Status, e.Progress*100)
164+
}
165+
},
166+
}
167+
168+
var epicCreateCmd = &cobra.Command{
169+
Use: "create",
170+
Short: "Create an epic",
171+
Run: func(cmd *cobra.Command, args []string) {
172+
repo, _ := cmd.Flags().GetString("repo")
173+
title, _ := cmd.Flags().GetString("title")
174+
description, _ := cmd.Flags().GetString("description")
175+
daemonURL, _ := cmd.Flags().GetString("daemon-url")
176+
177+
if title == "" {
178+
title = PromptRequired("Title")
179+
}
180+
181+
client := cli.NewClient(daemonURL)
182+
req := map[string]string{
183+
"title": title,
184+
"description": description,
185+
}
186+
187+
var result map[string]interface{}
188+
if err := client.Post(fmt.Sprintf("/api/v1/repos/%s/epics", repo), req, &result); err != nil {
189+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
190+
os.Exit(1)
191+
}
192+
fmt.Printf("Created epic: %s\n", result["id"])
193+
},
194+
}
195+
196+
var seedCmd = &cobra.Command{
197+
Use: "seed",
198+
Short: "Manage seed nodes (from Radicle)",
199+
}
200+
201+
var seedListCmd = &cobra.Command{
202+
Use: "list",
203+
Short: "List seed nodes",
204+
Run: func(cmd *cobra.Command, args []string) {
205+
daemonURL, _ := cmd.Flags().GetString("daemon-url")
206+
client := cli.NewClient(daemonURL)
207+
208+
var result struct {
209+
Seeds []struct {
210+
URL string `json:"url"`
211+
Status string `json:"status"`
212+
Reliability float64 `json:"reliability"`
213+
} `json:"seeds"`
214+
}
215+
if err := client.Get("/api/v1/seeds", &result); err != nil {
216+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
217+
os.Exit(1)
218+
}
219+
220+
for _, s := range result.Seeds {
221+
fmt.Printf("%s\t%s\t%.0f%%\n", s.URL, s.Status, s.Reliability*100)
222+
}
223+
},
224+
}
225+
226+
var seedAddCmd = &cobra.Command{
227+
Use: "add [url]",
228+
Short: "Add a seed node",
229+
Args: cobra.ExactArgs(1),
230+
Run: func(cmd *cobra.Command, args []string) {
231+
daemonURL, _ := cmd.Flags().GetString("daemon-url")
232+
client := cli.NewClient(daemonURL)
233+
234+
req := map[string]string{"url": args[0]}
235+
var result map[string]interface{}
236+
if err := client.Post("/api/v1/seeds", req, &result); err != nil {
237+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
238+
os.Exit(1)
239+
}
240+
fmt.Printf("Added seed: %s\n", args[0])
241+
},
242+
}
243+
244+
var stackedCmd = &cobra.Command{
245+
Use: "stack",
246+
Short: "Manage stacked diffs (from Sapling)",
247+
}
248+
249+
var stackListCmd = &cobra.Command{
250+
Use: "list",
251+
Short: "List stacked diffs",
252+
Run: func(cmd *cobra.Command, args []string) {
253+
repo, _ := cmd.Flags().GetString("repo")
254+
daemonURL, _ := cmd.Flags().GetString("daemon-url")
255+
client := cli.NewClient(daemonURL)
256+
257+
var result struct {
258+
Diffs []struct {
259+
ID string `json:"id"`
260+
Title string `json:"title"`
261+
Status string `json:"status"`
262+
} `json:"diffs"`
263+
}
264+
if err := client.Get(fmt.Sprintf("/api/v1/repos/%s/stacked-diffs", repo), &result); err != nil {
265+
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
266+
os.Exit(1)
267+
}
268+
269+
for _, d := range result.Diffs {
270+
fmt.Printf("%s\t%s\t%s\n", d.ID, d.Title, d.Status)
271+
}
272+
},
273+
}
274+
275+
func init() {
276+
// Extension
277+
for _, c := range []*cobra.Command{extensionListCmd, extensionInstallCmd, extensionUninstallCmd} {
278+
c.Flags().String("daemon-url", "", "Daemon URL")
279+
}
280+
extensionCmd.AddCommand(extensionListCmd, extensionInstallCmd, extensionUninstallCmd)
281+
282+
// Kanban
283+
for _, c := range []*cobra.Command{kanbanListCmd, kanbanCreateCmd} {
284+
c.Flags().StringP("repo", "r", "", "Repository name (required)")
285+
c.MarkFlagRequired("repo")
286+
c.Flags().String("daemon-url", "", "Daemon URL")
287+
}
288+
kanbanCreateCmd.Flags().StringP("name", "n", "", "Board name")
289+
kanbanCmd.AddCommand(kanbanListCmd, kanbanCreateCmd)
290+
291+
// Epic
292+
for _, c := range []*cobra.Command{epicListCmd, epicCreateCmd} {
293+
c.Flags().StringP("repo", "r", "", "Repository name (required)")
294+
c.MarkFlagRequired("repo")
295+
c.Flags().String("daemon-url", "", "Daemon URL")
296+
}
297+
epicListCmd.Flags().String("status", "", "Filter by status")
298+
epicCreateCmd.Flags().StringP("title", "t", "", "Epic title")
299+
epicCreateCmd.Flags().StringP("description", "d", "", "Epic description")
300+
epicCmd.AddCommand(epicListCmd, epicCreateCmd)
301+
302+
// Seed
303+
for _, c := range []*cobra.Command{seedListCmd, seedAddCmd} {
304+
c.Flags().String("daemon-url", "", "Daemon URL")
305+
}
306+
seedCmd.AddCommand(seedListCmd, seedAddCmd)
307+
308+
// Stacked
309+
for _, c := range []*cobra.Command{stackListCmd} {
310+
c.Flags().StringP("repo", "r", "", "Repository name (required)")
311+
c.MarkFlagRequired("repo")
312+
c.Flags().String("daemon-url", "", "Daemon URL")
313+
}
314+
stackedCmd.AddCommand(stackListCmd)
315+
316+
rootCmd.AddCommand(extensionCmd, kanbanCmd, epicCmd, seedCmd, stackedCmd)
317+
}

0 commit comments

Comments
 (0)