Skip to content

Commit 8431bd1

Browse files
committed
feat(workflow-cli): add plugins support
1 parent ee35c26 commit 8431bd1

16 files changed

Lines changed: 383 additions & 1052 deletions

File tree

cmd/root.go

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import (
1010

1111
"github.com/drycc/workflow-cli/internal/commands"
1212
"github.com/drycc/workflow-cli/internal/parser"
13+
"github.com/drycc/workflow-cli/internal/plugins"
1314
"github.com/drycc/workflow-cli/pkg/i18n"
15+
"github.com/drycc/workflow-cli/pkg/settings"
1416
"github.com/spf13/cobra"
1517
)
1618

@@ -57,9 +59,9 @@ func NewDryccCommand() *cobra.Command {
5759
rootCmd.AddCommand(parser.NewWorkspacesCommand(&cmdr))
5860
rootCmd.AddCommand(parser.NewPsCommand(&cmdr))
5961
rootCmd.AddCommand(parser.NewPtsCommand(&cmdr))
62+
rootCmd.AddCommand(parser.NewPluginsCommand(&cmdr))
6063
rootCmd.AddCommand(parser.NewRegistryCommand(&cmdr))
6164
rootCmd.AddCommand(parser.NewReleasesCommand(&cmdr))
62-
rootCmd.AddCommand(parser.NewResourcesCommand(&cmdr))
6365
rootCmd.AddCommand(parser.NewRoutesCommand(&cmdr))
6466
rootCmd.AddCommand(parser.NewRoutingCommand(&cmdr))
6567
rootCmd.AddCommand(parser.NewServicesCommand(&cmdr))
@@ -82,3 +84,45 @@ func NewDryccCommand() *cobra.Command {
8284

8385
return rootCmd
8486
}
87+
88+
// ExecuteWithPlugins runs the root command with plugin dispatch support
89+
func ExecuteWithPlugins(rootCmd *cobra.Command, config string) error {
90+
// Try to find the command first
91+
cmd, _, err := rootCmd.Find(os.Args[1:])
92+
if err != nil || cmd == rootCmd {
93+
// Command not found or is root command, try plugin dispatch
94+
name := firstNonFlagArg(os.Args[1:])
95+
if name != "" {
96+
if path, ok := plugins.LookupPlugin(name); ok {
97+
restArgs := argsAfter(os.Args[1:], name)
98+
s, serr := settings.Load(config)
99+
if serr != nil {
100+
// If settings can't be loaded, use empty settings
101+
s = &settings.Settings{}
102+
}
103+
return plugins.Run(path, restArgs, s)
104+
}
105+
}
106+
}
107+
return rootCmd.Execute()
108+
}
109+
110+
// firstNonFlagArg returns the first argument that doesn't start with "-"
111+
func firstNonFlagArg(args []string) string {
112+
for _, arg := range args {
113+
if len(arg) > 0 && arg[0] != '-' {
114+
return arg
115+
}
116+
}
117+
return ""
118+
}
119+
120+
// argsAfter returns all arguments after the specified name
121+
func argsAfter(args []string, name string) []string {
122+
for i, arg := range args {
123+
if arg == name {
124+
return args[i+1:]
125+
}
126+
}
127+
return args
128+
}

drycc.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,21 @@ Copyright © 2025 NAME HERE <EMAIL ADDRESS>
44
package main
55

66
import (
7-
"context"
87
"os"
98

109
"github.com/drycc/workflow-cli/cmd"
1110
)
1211

1312
func main() {
1413
rootCmd := cmd.NewDryccCommand()
15-
ctx, cancel := context.WithCancel(context.Background())
16-
defer cancel()
17-
if err := rootCmd.ExecuteContext(ctx); err != nil {
14+
15+
// Get config file path
16+
config := "~/.drycc/client.json"
17+
if v, ok := os.LookupEnv("DRYCC_PROFILE"); ok {
18+
config = v
19+
}
20+
21+
if err := cmd.ExecuteWithPlugins(rootCmd, config); err != nil {
1822
os.Exit(1)
1923
}
2024
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.26
55
require (
66
github.com/chai2010/gettext-go v1.0.3
77
github.com/containerd/console v1.0.4
8-
github.com/drycc/controller-sdk-go v0.0.0-20260528080055-65af8fd9605a
8+
github.com/drycc/controller-sdk-go v0.0.0-20260529052452-a2af31b41928
99
github.com/drycc/pkg v0.0.0-20250917064731-345368da3dbf
1010
github.com/minio/selfupdate v0.6.0
1111
github.com/olekukonko/tablewriter v0.0.5

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6N
99
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
1010
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
1111
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
12-
github.com/drycc/controller-sdk-go v0.0.0-20260528080055-65af8fd9605a h1:9e61dv4u1PHPWPp6BgtUtIw2tPxaZfLQhHDpn3DDo2w=
13-
github.com/drycc/controller-sdk-go v0.0.0-20260528080055-65af8fd9605a/go.mod h1:jV1AUDHtY8aPMF95evHQGXZOX6tUXaf7wgqzUEnD5SM=
12+
github.com/drycc/controller-sdk-go v0.0.0-20260529052452-a2af31b41928 h1:LuadAeyX7pFzdcyiOqbluZQSQaSzW5OnS4m/kZy3pbQ=
13+
github.com/drycc/controller-sdk-go v0.0.0-20260529052452-a2af31b41928/go.mod h1:jV1AUDHtY8aPMF95evHQGXZOX6tUXaf7wgqzUEnD5SM=
1414
github.com/drycc/pkg v0.0.0-20250917064731-345368da3dbf h1:CYy3NoPhfFhkGAbEppTOQfY/HC2s0FJDcBgbtRKeweg=
1515
github.com/drycc/pkg v0.0.0-20250917064731-345368da3dbf/go.mod h1:BrrNrNskHKm+nJYhXfGuI114w8nupi0AMo8QZHID7CM=
1616
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=

internal/commands/commands.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,15 +139,6 @@ type Commander interface {
139139
VolumesClient(string, string, ...string) error
140140
VolumesMount(string, string, []string) error
141141
VolumesUnmount(string, string, []string) error
142-
ResourcesServices(int) error
143-
ResourcesPlans(string, int) error
144-
ResourcesCreate(string, string, string, []string, string) error
145-
ResourcesList(string, int) error
146-
ResourceDelete(string, string, string) error
147-
ResourceGet(string, string, bool) error
148-
ResourcePut(string, string, string, []string, string) error
149-
ResourceBind(string, string) error
150-
ResourceUnbind(string, string) error
151142
}
152143

153144
// DryccCmd is a struct that implements the Commander interface and provides

0 commit comments

Comments
 (0)