Skip to content

Commit e53e275

Browse files
committed
feat(cli): add remaining missing commands for full API coverage
New modules: - devices: paired device list/revoke/pairing-status (WS RPC) - export/import: agents, teams, skills, MCP export/import with previews New commands added to existing modules: - agents: wake, files list/get/set - knowledge-graph: dedup scan/list/dismiss, merge - memory: index, index-all, chunks - teams tasks: delete - mcp servers: reconnect - providers: verify-embedding
1 parent b0e192c commit e53e275

File tree

9 files changed

+755
-0
lines changed

9 files changed

+755
-0
lines changed

cmd/agents_files.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package cmd
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/spf13/cobra"
7+
)
8+
9+
var agentsFilesCmd = &cobra.Command{
10+
Use: "files",
11+
Short: "Manage agent context files",
12+
}
13+
14+
var agentsFilesListCmd = &cobra.Command{
15+
Use: "list <agentID>", Short: "List agent files", Args: cobra.ExactArgs(1),
16+
RunE: func(cmd *cobra.Command, args []string) error {
17+
ws, err := newWS("cli")
18+
if err != nil {
19+
return err
20+
}
21+
if _, err := ws.Connect(); err != nil {
22+
return err
23+
}
24+
defer ws.Close()
25+
data, err := ws.Call("agents.files.list", map[string]any{"agent_id": args[0]})
26+
if err != nil {
27+
return err
28+
}
29+
printer.Print(unmarshalList(data))
30+
return nil
31+
},
32+
}
33+
34+
var agentsFilesGetCmd = &cobra.Command{
35+
Use: "get <agentID> <fileName>", Short: "Get agent file content", Args: cobra.ExactArgs(2),
36+
RunE: func(cmd *cobra.Command, args []string) error {
37+
ws, err := newWS("cli")
38+
if err != nil {
39+
return err
40+
}
41+
if _, err := ws.Connect(); err != nil {
42+
return err
43+
}
44+
defer ws.Close()
45+
data, err := ws.Call("agents.files.get", map[string]any{"agent_id": args[0], "file_name": args[1]})
46+
if err != nil {
47+
return err
48+
}
49+
m := unmarshalMap(data)
50+
if content := str(m, "content"); content != "" {
51+
fmt.Println(content)
52+
} else {
53+
printer.Print(m)
54+
}
55+
return nil
56+
},
57+
}
58+
59+
var agentsFilesSetCmd = &cobra.Command{
60+
Use: "set <agentID> <fileName>", Short: "Set agent file content", Args: cobra.ExactArgs(2),
61+
RunE: func(cmd *cobra.Command, args []string) error {
62+
ws, err := newWS("cli")
63+
if err != nil {
64+
return err
65+
}
66+
if _, err := ws.Connect(); err != nil {
67+
return err
68+
}
69+
defer ws.Close()
70+
contentVal, _ := cmd.Flags().GetString("content")
71+
content, err := readContent(contentVal)
72+
if err != nil {
73+
return err
74+
}
75+
_, err = ws.Call("agents.files.set", map[string]any{
76+
"agent_id": args[0], "file_name": args[1], "content": content,
77+
})
78+
if err != nil {
79+
return err
80+
}
81+
printer.Success("File updated")
82+
return nil
83+
},
84+
}
85+
86+
func init() {
87+
agentsFilesSetCmd.Flags().String("content", "", "Content (or @filepath)")
88+
_ = agentsFilesSetCmd.MarkFlagRequired("content")
89+
90+
agentsFilesCmd.AddCommand(agentsFilesListCmd, agentsFilesGetCmd, agentsFilesSetCmd)
91+
agentsCmd.AddCommand(agentsFilesCmd)
92+
}

cmd/agents_wake.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package cmd
2+
3+
import (
4+
"net/url"
5+
6+
"github.com/spf13/cobra"
7+
)
8+
9+
var agentsWakeCmd = &cobra.Command{
10+
Use: "wake <id>",
11+
Short: "Wake up a sleeping agent",
12+
Args: cobra.ExactArgs(1),
13+
RunE: func(cmd *cobra.Command, args []string) error {
14+
c, err := newHTTP()
15+
if err != nil {
16+
return err
17+
}
18+
_, err = c.Post("/v1/agents/"+url.PathEscape(args[0])+"/wake", nil)
19+
if err != nil {
20+
return err
21+
}
22+
printer.Success("Agent woken up")
23+
return nil
24+
},
25+
}
26+
27+
func init() {
28+
agentsCmd.AddCommand(agentsWakeCmd)
29+
}

cmd/devices.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package cmd
2+
3+
import (
4+
"github.com/nextlevelbuilder/goclaw-cli/internal/output"
5+
"github.com/nextlevelbuilder/goclaw-cli/internal/tui"
6+
"github.com/spf13/cobra"
7+
)
8+
9+
var devicesCmd = &cobra.Command{Use: "devices", Short: "Manage paired devices"}
10+
11+
var devicesListCmd = &cobra.Command{
12+
Use: "list", Short: "List paired devices",
13+
RunE: func(cmd *cobra.Command, args []string) error {
14+
ws, err := newWS("cli")
15+
if err != nil {
16+
return err
17+
}
18+
if _, err := ws.Connect(); err != nil {
19+
return err
20+
}
21+
defer ws.Close()
22+
data, err := ws.Call("device.pair.list", map[string]any{})
23+
if err != nil {
24+
return err
25+
}
26+
if cfg.OutputFormat != "table" {
27+
printer.Print(unmarshalList(data))
28+
return nil
29+
}
30+
tbl := output.NewTable("ID", "NAME", "USER", "STATUS", "PAIRED_AT", "LAST_SEEN")
31+
for _, d := range unmarshalList(data) {
32+
tbl.AddRow(str(d, "id"), str(d, "device_name"), str(d, "user_id"),
33+
str(d, "status"), str(d, "paired_at"), str(d, "last_seen_at"))
34+
}
35+
printer.Print(tbl)
36+
return nil
37+
},
38+
}
39+
40+
var devicesRevokeCmd = &cobra.Command{
41+
Use: "revoke <id>", Short: "Revoke a paired device", Args: cobra.ExactArgs(1),
42+
RunE: func(cmd *cobra.Command, args []string) error {
43+
if !tui.Confirm("Revoke this device?", cfg.Yes) {
44+
return nil
45+
}
46+
ws, err := newWS("cli")
47+
if err != nil {
48+
return err
49+
}
50+
if _, err := ws.Connect(); err != nil {
51+
return err
52+
}
53+
defer ws.Close()
54+
_, err = ws.Call("device.pair.revoke", map[string]any{"id": args[0]})
55+
if err != nil {
56+
return err
57+
}
58+
printer.Success("Device revoked")
59+
return nil
60+
},
61+
}
62+
63+
var devicesPairingStatusCmd = &cobra.Command{
64+
Use: "pairing-status", Short: "Check browser pairing status",
65+
RunE: func(cmd *cobra.Command, args []string) error {
66+
ws, err := newWS("cli")
67+
if err != nil {
68+
return err
69+
}
70+
if _, err := ws.Connect(); err != nil {
71+
return err
72+
}
73+
defer ws.Close()
74+
data, err := ws.Call("browser.pairing.status", map[string]any{})
75+
if err != nil {
76+
return err
77+
}
78+
printer.Print(unmarshalMap(data))
79+
return nil
80+
},
81+
}
82+
83+
func init() {
84+
devicesCmd.AddCommand(devicesListCmd, devicesRevokeCmd, devicesPairingStatusCmd)
85+
rootCmd.AddCommand(devicesCmd)
86+
}

0 commit comments

Comments
 (0)