From 5f5b11f8b8f16fc8eb979bd7fb81cb30f2a566df Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 21:38:21 +0000 Subject: [PATCH 1/3] Add brev org create command with set suggestion Co-Authored-By: Alec Fong --- pkg/cmd/org/create.go | 67 +++++++++++++++++++++++++++++++++++++++++++ pkg/cmd/org/org.go | 2 ++ 2 files changed, 69 insertions(+) create mode 100644 pkg/cmd/org/create.go diff --git a/pkg/cmd/org/create.go b/pkg/cmd/org/create.go new file mode 100644 index 000000000..20fba99ac --- /dev/null +++ b/pkg/cmd/org/create.go @@ -0,0 +1,67 @@ +package org + +import ( + "fmt" + "time" + + "github.com/brevdev/brev-cli/pkg/cmd/cmderrors" + "github.com/brevdev/brev-cli/pkg/cmdcontext" + breverrors "github.com/brevdev/brev-cli/pkg/errors" + "github.com/brevdev/brev-cli/pkg/store" + "github.com/brevdev/brev-cli/pkg/terminal" + "github.com/spf13/cobra" +) + +func NewCmdOrgCreate(t *terminal.Terminal, orgcmdStore OrgCmdStore) *cobra.Command { + cmd := &cobra.Command{ + Annotations: map[string]string{"context": ""}, + Use: "create", + Short: "Create a new organization", + Long: "Create a new organization with the specified name", + Example: ` + brev org create my-new-org + `, + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + err := cmdcontext.InvokeParentPersistentPreRun(cmd, args) + if err != nil { + return breverrors.WrapAndTrace(err) + } + return nil + }, + Args: cmderrors.TransformToValidationError(cobra.ExactArgs(1)), + RunE: func(cmd *cobra.Command, args []string) error { + err := createOrg(args[0], orgcmdStore, t) + if err != nil { + return breverrors.WrapAndTrace(err) + } + return nil + }, + } + return cmd +} + +func createOrg(orgName string, createStore OrgCmdStore, t *terminal.Terminal) error { + if len(orgName) == 0 { + return breverrors.NewValidationError("organization name cannot be empty") + } + + startTime := time.Now() + + t.Vprintf("Creating organization %s...\n", t.Green(orgName)) + + org, err := createStore.CreateOrganization(store.CreateOrganizationRequest{ + Name: orgName, + }) + if err != nil { + return breverrors.WrapAndTrace(err) + } + + duration := time.Since(startTime) + fmt.Print("\n") + t.Vprint(t.Green(fmt.Sprintf("✓ Successfully created organization %s (ID: %s) in %v\n", org.Name, org.ID, duration.Round(time.Millisecond)))) + fmt.Print("\n") + t.Vprintf(t.Yellow("Switch to this organization:\n")) + t.Vprintf(t.Yellow("\tbrev org set %s\n"), org.Name) + + return nil +} diff --git a/pkg/cmd/org/org.go b/pkg/cmd/org/org.go index 98a1bf12b..fbb2e94dd 100644 --- a/pkg/cmd/org/org.go +++ b/pkg/cmd/org/org.go @@ -30,6 +30,7 @@ type OrgCmdStore interface { GetServerSockFile() string CreateInviteLink(organizationID string) (string, error) GetCurrentWorkspaceID() (string, error) + CreateOrganization(req store.CreateOrganizationRequest) (*entity.Organization, error) } func NewCmdOrg(t *terminal.Terminal, orgcmdStore OrgCmdStore, noorgcmdStore OrgCmdStore) *cobra.Command { @@ -64,6 +65,7 @@ func NewCmdOrg(t *terminal.Terminal, orgcmdStore OrgCmdStore, noorgcmdStore OrgC cmd.AddCommand(NewCmdOrgSet(t, orgcmdStore, noorgcmdStore)) cmd.AddCommand(NewCmdOrgLs(t, orgcmdStore)) + cmd.AddCommand(NewCmdOrgCreate(t, orgcmdStore)) cmd.AddCommand(invite.NewCmdInvite(t, orgcmdStore, noorgcmdStore)) return cmd From d9f376d65ef6cd71d87cd61c9159d2c22cf343a4 Mon Sep 17 00:00:00 2001 From: Colin McNaughton Date: Fri, 31 Oct 2025 10:56:59 -0400 Subject: [PATCH 2/3] Fix string formatting in org create output --- pkg/cmd/org/create.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cmd/org/create.go b/pkg/cmd/org/create.go index 20fba99ac..f2aa05fad 100644 --- a/pkg/cmd/org/create.go +++ b/pkg/cmd/org/create.go @@ -60,8 +60,8 @@ func createOrg(orgName string, createStore OrgCmdStore, t *terminal.Terminal) er fmt.Print("\n") t.Vprint(t.Green(fmt.Sprintf("✓ Successfully created organization %s (ID: %s) in %v\n", org.Name, org.ID, duration.Round(time.Millisecond)))) fmt.Print("\n") - t.Vprintf(t.Yellow("Switch to this organization:\n")) - t.Vprintf(t.Yellow("\tbrev org set %s\n"), org.Name) + t.Vprint(t.Yellow("Switch to this organization:\n")) + t.Vprint(t.Yellow(fmt.Sprintf("\tbrev org set %s\n", org.Name))) return nil } From 5c6a4154db4a0ddc281da69d9ab1e0e8ed468f04 Mon Sep 17 00:00:00 2001 From: Colin McNaughton Date: Fri, 31 Oct 2025 11:04:50 -0400 Subject: [PATCH 3/3] Add org create command to housekeeping group --- pkg/cmd/org/create.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cmd/org/create.go b/pkg/cmd/org/create.go index f2aa05fad..85aff5db3 100644 --- a/pkg/cmd/org/create.go +++ b/pkg/cmd/org/create.go @@ -14,7 +14,7 @@ import ( func NewCmdOrgCreate(t *terminal.Terminal, orgcmdStore OrgCmdStore) *cobra.Command { cmd := &cobra.Command{ - Annotations: map[string]string{"context": ""}, + Annotations: map[string]string{"housekeeping": ""}, Use: "create", Short: "Create a new organization", Long: "Create a new organization with the specified name",