@@ -2,11 +2,13 @@ package main
22
33import (
44 "fmt"
5+ "os"
56 "strings"
67
7- "github.com/MaximoCoder/enveil-core/config"
88 "github.com/MaximoCoder/enveil-cli/internal/serverclient"
99 "github.com/MaximoCoder/enveil-cli/internal/ui"
10+ "github.com/MaximoCoder/enveil-core/config"
11+ "github.com/MaximoCoder/enveil-core/vault"
1012 "github.com/spf13/cobra"
1113)
1214
@@ -34,11 +36,19 @@ var serverStatusCmd = &cobra.Command{
3436 RunE : runServerStatus ,
3537}
3638
39+ var serverUseProjectCmd = & cobra.Command {
40+ Use : "use-project <name>" ,
41+ Short : "Associate the current directory with an existing project on the server" ,
42+ Args : cobra .ExactArgs (1 ),
43+ RunE : runServerUseProject ,
44+ }
45+
3746func init () {
3847 rootCmd .AddCommand (serverCmd )
3948 serverCmd .AddCommand (serverConnectCmd )
4049 serverCmd .AddCommand (serverDisconnectCmd )
4150 serverCmd .AddCommand (serverStatusCmd )
51+ serverCmd .AddCommand (serverUseProjectCmd )
4252
4353 serverConnectCmd .Flags ().String ("key" , "" , "API key for authentication" )
4454 serverConnectCmd .MarkFlagRequired ("key" )
@@ -108,4 +118,97 @@ func runServerStatus(cmd *cobra.Command, args []string) error {
108118
109119 ui .Success ("Connected to %s" , cfg .ServerURL )
110120 return nil
121+ }
122+
123+ func runServerUseProject (cmd * cobra.Command , args []string ) error {
124+ name := args [0 ]
125+
126+ cfg , err := config .Load ()
127+ if err != nil {
128+ return err
129+ }
130+
131+ if ! cfg .HasServer () {
132+ return fmt .Errorf ("no server configured, run 'enveil server connect' first" )
133+ }
134+
135+ // Verificar que el proyecto existe en el servidor
136+ client := serverclient .New (cfg .ServerURL , cfg .ServerAPIKey )
137+ projects , err := client .ListProjects ()
138+ if err != nil {
139+ return fmt .Errorf ("error fetching projects from server: %w" , err )
140+ }
141+
142+ found := false
143+ for _ , p := range projects {
144+ if pname , ok := p ["Name" ].(string ); ok && pname == name {
145+ found = true
146+ break
147+ }
148+ }
149+
150+ if ! found {
151+ var names []string
152+ for _ , p := range projects {
153+ if pname , ok := p ["Name" ].(string ); ok {
154+ names = append (names , pname )
155+ }
156+ }
157+ return fmt .Errorf ("project '%s' not found on server. Available: %s" , name , strings .Join (names , ", " ))
158+ }
159+
160+ // Abrir el vault local y registrar el directorio
161+ cwd , err := os .Getwd ()
162+ if err != nil {
163+ return fmt .Errorf ("error getting current directory: %w" , err )
164+ }
165+
166+ masterKeyHex , err := promptAndDeriveKey (cfg )
167+ if err != nil {
168+ return err
169+ }
170+
171+ v , err := vault .Open (cfg .VaultPath , masterKeyHex )
172+ if err != nil {
173+ return err
174+ }
175+ defer v .Close ()
176+
177+ // Verificar si el directorio ya está registrado
178+ projectID , existingName , err := v .GetProjectByPath (cwd )
179+ if err != nil {
180+ return err
181+ }
182+
183+ if projectID != 0 {
184+ if existingName == name {
185+ ui .Warning ("Directory already associated with project '%s'" , name )
186+ return nil
187+ }
188+ return fmt .Errorf ("directory already registered as project '%s', unregister it first" , existingName )
189+ }
190+
191+ // Registrar en el vault local
192+ projectID , err = v .CreateProject (name , cwd )
193+ if err != nil {
194+ return err
195+ }
196+
197+ _ , err = v .CreateEnvironment (projectID , "development" )
198+ if err != nil {
199+ return err
200+ }
201+
202+ // Actualizar config global
203+ cfg .ActiveProject = name
204+ if cfg .ActiveEnv == "" {
205+ cfg .ActiveEnv = "development"
206+ }
207+ if err := cfg .Save (); err != nil {
208+ return err
209+ }
210+
211+ ui .Success ("Directory associated with server project '%s'" , name )
212+ ui .Info ("Run 'enveil list' to see available variables" )
213+ return nil
111214}
0 commit comments