Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 55 additions & 10 deletions cmd/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,35 @@ import (
// Provider types for infrastructure
var validProviders = map[string]string{"gcp": "Google Cloud", "aws": "Amazon Web Services", "azure": "Microsoft Azure", "vmware": "VMware"}

// Provider-specific regions
var providerRegions = map[string][]tui.Option{
"gcp": {
{ID: "us-central1", Text: tui.PadRight("US Central", 15, " ") + tui.Muted("us-central1")},
{ID: "us-west1", Text: tui.PadRight("US West", 15, " ") + tui.Muted("us-west1")},
{ID: "us-east1", Text: tui.PadRight("US East", 15, " ") + tui.Muted("us-east1")},
{ID: "europe-west1", Text: tui.PadRight("Europe West", 15, " ") + tui.Muted("europe-west1")},
{ID: "asia-southeast1", Text: tui.PadRight("Asia Southeast", 15, " ") + tui.Muted("asia-southeast1")},
},
"aws": {
{ID: "us-east-1", Text: tui.PadRight("US East (N. Virginia)", 15, " ") + tui.Muted("us-east-1")},
{ID: "us-east-2", Text: tui.PadRight("US East (Ohio)", 15, " ") + tui.Muted("us-east-2")},
{ID: "us-west-1", Text: tui.PadRight("US West (N. California)", 15, " ") + tui.Muted("us-west-1")},
{ID: "us-west-2", Text: tui.PadRight("US West (Oregon)", 15, " ") + tui.Muted("us-west-2")},
},
"azure": {
{ID: "eastus", Text: tui.PadRight("East US", 15, " ") + tui.Muted("eastus")},
{ID: "westus2", Text: tui.PadRight("West US 2", 15, " ") + tui.Muted("westus2")},
{ID: "westeurope", Text: tui.PadRight("West Europe", 15, " ") + tui.Muted("westeurope")},
{ID: "southeastasia", Text: tui.PadRight("Southeast Asia", 15, " ") + tui.Muted("southeastasia")},
{ID: "canadacentral", Text: tui.PadRight("Canada Central", 15, " ") + tui.Muted("canadacentral")},
},
"vmware": {
{ID: "datacenter-1", Text: tui.PadRight("Datacenter 1", 15, " ") + tui.Muted("datacenter-1")},
{ID: "datacenter-2", Text: tui.PadRight("Datacenter 2", 15, " ") + tui.Muted("datacenter-2")},
{ID: "datacenter-3", Text: tui.PadRight("Datacenter 3", 15, " ") + tui.Muted("datacenter-3")},
},
}

// Size types for clusters
var validSizes = []string{"dev", "small", "medium", "large"}

Expand Down Expand Up @@ -53,6 +82,15 @@ func validateFormat(format string) error {
return fmt.Errorf("invalid format %s, must be one of: %s", format, validFormats)
}

// getRegionsForProvider returns the available regions for a specific provider
func getRegionsForProvider(provider string) []tui.Option {
if regions, ok := providerRegions[provider]; ok {
return regions
}
// Fallback to GCP regions if provider not found
return providerRegions["gcp"]
}

func outputJSON(data interface{}) {
encoder := json.NewEncoder(os.Stdout)
encoder.SetIndent("", " ")
Expand Down Expand Up @@ -132,6 +170,9 @@ Examples:
apikey, _ := util.EnsureLoggedIn(ctx, logger, cmd)
apiUrl, _, _ := util.GetURLs(logger)

// Check if clustering is enabled for cluster operations
infrastructure.EnsureClusteringEnabled(ctx, logger, apiUrl, apikey)

var name string
if len(args) > 0 {
name = args[0]
Expand Down Expand Up @@ -190,12 +231,7 @@ Examples:
}

if region == "" {
// TODO: move these to use an option based on the selected provider
opts := []tui.Option{
{ID: "us-central1", Text: tui.PadRight("US Central", 15, " ") + tui.Muted("us-central1")},
{ID: "us-west1", Text: tui.PadRight("US West", 15, " ") + tui.Muted("us-west1")},
{ID: "us-east1", Text: tui.PadRight("US East", 15, " ") + tui.Muted("us-east1")},
}
opts := getRegionsForProvider(provider)
region = tui.Select(logger, "Which region should we use?", "The region to deploy the cluster", opts)
}

Expand All @@ -219,10 +255,6 @@ Examples:
}
}

if err := infrastructure.Setup(ctx, logger, &infrastructure.Cluster{ID: "1234", Token: "", Provider: provider, Name: name, Type: size, Region: region}, format); err != nil {
logger.Fatal("%s", err)
}

ready := tui.Ask(logger, "Ready to create the cluster", true)
if !ready {
logger.Info("Cluster creation cancelled")
Expand All @@ -243,6 +275,10 @@ Examples:
if err != nil {
errsystem.New(errsystem.ErrCreateProject, err, errsystem.WithContextMessage("Failed to create cluster")).ShowErrorAndExit()
}

if err := infrastructure.Setup(ctx, logger, cluster, format); err != nil {
logger.Fatal("%s", err)
}
})

if format == "json" {
Expand Down Expand Up @@ -273,6 +309,9 @@ Examples:
apikey, _ := util.EnsureLoggedIn(ctx, logger, cmd)
apiUrl, _, _ := util.GetURLs(logger)

// Check if clustering is enabled for cluster operations
infrastructure.EnsureClusteringEnabled(ctx, logger, apiUrl, apikey)

format, _ := cmd.Flags().GetString("format")
if format != "" {
if err := validateFormat(format); err != nil {
Expand Down Expand Up @@ -358,6 +397,9 @@ Examples:
apikey, _ := util.EnsureLoggedIn(ctx, logger, cmd)
apiUrl, _, _ := util.GetURLs(logger)

// Check if clustering is enabled for cluster operations
infrastructure.EnsureClusteringEnabled(ctx, logger, apiUrl, apikey)

clusterID := args[0]
force, _ := cmd.Flags().GetBool("force")

Expand Down Expand Up @@ -399,6 +441,9 @@ Examples:
apikey, _ := util.EnsureLoggedIn(ctx, logger, cmd)
apiUrl, _, _ := util.GetURLs(logger)

// Check if clustering is enabled for cluster operations
infrastructure.EnsureClusteringEnabled(ctx, logger, apiUrl, apikey)

clusterID := args[0]
format, _ := cmd.Flags().GetString("format")

Expand Down
104 changes: 100 additions & 4 deletions cmd/machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"github.com/agentuity/cli/internal/infrastructure"
"github.com/agentuity/cli/internal/util"
"github.com/agentuity/go-common/env"
"github.com/agentuity/go-common/logger"
"github.com/agentuity/go-common/tui"
"github.com/spf13/cobra"
)
Expand Down Expand Up @@ -49,6 +50,9 @@ Examples:
apikey, _ := util.EnsureLoggedIn(ctx, logger, cmd)
apiUrl, _, _ := util.GetURLs(logger)

// Check if clustering is enabled for machine operations
infrastructure.EnsureMachineClusteringEnabled(ctx, logger, apiUrl, apikey)

var clusterFilter string
if len(args) > 0 {
clusterFilter = args[0]
Expand Down Expand Up @@ -168,6 +172,9 @@ Examples:
apikey, _ := util.EnsureLoggedIn(ctx, logger, cmd)
apiUrl, _, _ := util.GetURLs(logger)

// Check if clustering is enabled for machine operations
infrastructure.EnsureMachineClusteringEnabled(ctx, logger, apiUrl, apikey)

machineID := args[0]
force, _ := cmd.Flags().GetBool("force")

Expand Down Expand Up @@ -209,6 +216,9 @@ Examples:
apikey, _ := util.EnsureLoggedIn(ctx, logger, cmd)
apiUrl, _, _ := util.GetURLs(logger)

// Check if clustering is enabled for machine operations
infrastructure.EnsureMachineClusteringEnabled(ctx, logger, apiUrl, apikey)

machineID := args[0]
format, _ := cmd.Flags().GetString("format")

Expand Down Expand Up @@ -284,7 +294,17 @@ var machineCreateCmd = &cobra.Command{
Use: "create [cluster_id] [provider] [region]",
GroupID: "info",
Short: "Create a new machine for a cluster",
Args: cobra.ExactArgs(3),
Long: `Create a new machine for a cluster.

Arguments:
[cluster_id] The cluster ID to create a machine in (optional in interactive mode)
[provider] The cloud provider (optional in interactive mode)
[region] The region to deploy in (optional in interactive mode)

Examples:
agentuity machine create
agentuity machine create cluster-001 aws us-east-1`,
Args: cobra.MaximumNArgs(3),
Aliases: []string{"new"},
Run: func(cmd *cobra.Command, args []string) {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
Expand All @@ -293,9 +313,26 @@ var machineCreateCmd = &cobra.Command{
apikey, _ := util.EnsureLoggedIn(ctx, logger, cmd)
apiUrl, _, _ := util.GetURLs(logger)

clusterID := args[0]
provider := args[1]
region := args[2]
// Check if clustering is enabled for machine operations
infrastructure.EnsureMachineClusteringEnabled(ctx, logger, apiUrl, apikey)

var clusterID, provider, region string

// If all arguments provided, use them directly
if len(args) == 3 {
clusterID = args[0]
provider = args[1]
region = args[2]
} else if tui.HasTTY {
// Interactive mode - prompt for missing values
cluster := promptForClusterSelection(ctx, logger, apiUrl, apikey)
provider = cluster.Provider
region = promptForRegionSelection(ctx, logger, provider)
clusterID = cluster.ID
} else {
// Non-interactive mode - require all arguments
errsystem.New(errsystem.ErrMissingRequiredArgument, fmt.Errorf("cluster_id, provider, and region are required in non-interactive mode"), errsystem.WithContextMessage("Missing required arguments")).ShowErrorAndExit()
}

orgId := promptForClusterOrganization(ctx, logger, cmd, apiUrl, apikey, "What organization should we create the machine in?")

Expand Down Expand Up @@ -332,4 +369,63 @@ func init() {

// Flags for machine status command
machineStatusCmd.Flags().String("format", "table", "Output format (table, json)")

}

// promptForClusterSelection prompts the user to select a cluster from available clusters
func promptForClusterSelection(ctx context.Context, logger logger.Logger, apiUrl, apikey string) infrastructure.Cluster {
clusters, err := infrastructure.ListClusters(ctx, logger, apiUrl, apikey)
if err != nil {
errsystem.New(errsystem.ErrApiRequest, err, errsystem.WithContextMessage("Failed to list clusters")).ShowErrorAndExit()
}

if len(clusters) == 0 {
errsystem.New(errsystem.ErrApiRequest, fmt.Errorf("no clusters found"), errsystem.WithUserMessage("No clusters found. Please create a cluster first using 'agentuity cluster create'")).ShowErrorAndExit()
}

if len(clusters) == 1 {
cluster := clusters[0]
fmt.Printf("Using cluster: %s (%s)\n", cluster.Name, cluster.ID)
return cluster
}

// Sort clusters by Name then ID for deterministic display order
sort.Slice(clusters, func(i, j int) bool {
if clusters[i].Name != clusters[j].Name {
return clusters[i].Name < clusters[j].Name
}
return clusters[i].ID < clusters[j].ID
})

var opts []tui.Option
for _, cluster := range clusters {
displayText := fmt.Sprintf("%s (%s) - %s %s", cluster.Name, cluster.ID, cluster.Provider, cluster.Region)
opts = append(opts, tui.Option{ID: cluster.ID, Text: displayText})
}

id := tui.Select(logger, "Select a cluster to create a machine in:", "Choose the cluster where you want to deploy the new machine", opts)

// Handle user cancellation (empty string)
if id == "" {
errsystem.New(errsystem.ErrApiRequest, fmt.Errorf("no cluster selected"), errsystem.WithUserMessage("No cluster selected")).ShowErrorAndExit()
}

// Find the selected cluster
for _, cluster := range clusters {
if cluster.ID == id {
return cluster
}
}

// This should never happen, but handle it as an impossible path
errsystem.New(errsystem.ErrApiRequest, fmt.Errorf("selected cluster not found: %s", id), errsystem.WithUserMessage("Selected cluster not found")).ShowErrorAndExit()
return infrastructure.Cluster{} // This line will never be reached
}

// promptForRegionSelection prompts the user to select a region
func promptForRegionSelection(ctx context.Context, logger logger.Logger, provider string) string {
// Get regions for the provider (reuse the same logic from cluster.go)
fmt.Println("Provider:", provider)
opts := getRegionsForProvider(provider)
return tui.Select(logger, "Which region should we use?", "The region to deploy the machine", opts)
}
12 changes: 6 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.25.1

require (
github.com/Masterminds/semver v1.5.0
github.com/agentuity/go-common v1.0.91
github.com/agentuity/go-common v1.0.93
github.com/agentuity/mcp-golang/v2 v2.0.2
github.com/bmatcuk/doublestar/v4 v4.8.1
github.com/charmbracelet/bubbles v0.20.0
Expand Down Expand Up @@ -45,12 +45,12 @@ require (
github.com/catppuccin/go v0.2.0 // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/charmbracelet/colorprofile v0.3.1 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/x/ansi v0.8.0 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
github.com/cloudflare/circl v1.6.0 // indirect
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 // indirect
github.com/cockroachdb/redact v1.1.6 // indirect
Expand All @@ -72,15 +72,15 @@ require (
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/invopop/jsonschema v0.13.0 // indirect
github.com/invopop/jsonschema v0.12.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mailru/easyjson v0.9.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/maruel/natural v1.1.1 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
Expand Down
25 changes: 13 additions & 12 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/ProtonMail/go-crypto v1.1.5 h1:eoAQfK2dwL+tFSFpr7TbOaPNUbPiJj4fLYwwGE1FQO4=
github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
github.com/agentuity/go-common v1.0.91 h1:60CNTdJnm/KKsNG7R1NHa7bALvvROijCAzvPXmpS0iE=
github.com/agentuity/go-common v1.0.91/go.mod h1:iliwcRguPH18rPv1049wFTETZn0wUdD4SN6rN8VcAoA=
github.com/agentuity/go-common v1.0.93 h1:V08Zp6CWeVQmmIgJUIX5UD7OLarsl5Epin6xNAKaC7Y=
github.com/agentuity/go-common v1.0.93/go.mod h1:D+H8zHEHpEj7qQtZSG0ZqpAx1h2a1HHLMQJc0ZG+j/I=
github.com/agentuity/mcp-golang/v2 v2.0.2 h1:wZqS/aHWZsQoU/nd1E1/iMsVY2dywWT9+PFlf+3YJxo=
github.com/agentuity/mcp-golang/v2 v2.0.2/go.mod h1:U105tZXyTatxxOBlcObRgLb/ULvGgT2DJ1nq/8++P6Q=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
Expand Down Expand Up @@ -41,8 +41,8 @@ github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQW
github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU=
github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI=
github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo=
github.com/charmbracelet/colorprofile v0.3.1 h1:k8dTHMd7fgw4bnFd7jXTLZrSU/CQrKnL3m+AxCzDz40=
github.com/charmbracelet/colorprofile v0.3.1/go.mod h1:/GkGusxNs8VB/RSOh3fu0TJmQ4ICMMPApIIVn0KszZ0=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
github.com/charmbracelet/huh v0.6.0 h1:mZM8VvZGuE0hoDXq6XLxRtgfWyTI3b2jZNKh0xWmax8=
github.com/charmbracelet/huh v0.6.0/go.mod h1:GGNKeWCeNzKpEOh/OJD8WBwTQjV3prFAtQPpLv+AVwU=
github.com/charmbracelet/huh/spinner v0.0.0-20250313000648-36d9de46d64e h1:J8uxtAwJwvw0r5Wf+dfglLl/s+LcuUwj6VvoMyFw89U=
Expand All @@ -51,16 +51,16 @@ github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoF
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k=
github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b h1:MnAMdlwSltxJyULnrYbkZpp4k58Co7Tah3ciKhSNo0Q=
github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 h1:qko3AQ4gK1MTS/de7F5hPGx6/k1u0w4TeYmBFwzYVP4=
github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0/go.mod h1:pBhA0ybfXv6hDjQUZ7hk1lVxBiUbupdw5R31yPUViVQ=
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk=
github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I=
github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8=
github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 h1:ASDL+UJcILMqgNeV5jiqR4j+sTuvQNHdf2chuKj1M5k=
Expand Down Expand Up @@ -133,10 +133,11 @@ github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSAS
github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E=
github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI=
github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
Expand All @@ -154,8 +155,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/marcozac/go-jsonc v0.1.1 h1:dnZgAYinXsnI73ZemlbQYPOo1uZYD/LSYI7Aw9IbIeM=
github.com/marcozac/go-jsonc v0.1.1/go.mod h1:BFDFoML/0Y4/XnOpOdomjrDBn1nIG96p7dlVXBDaybI=
github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo=
Expand Down
Loading