Files
LazyPM/cmd/pm/init.go
Robin Olsen e3124527ae make this flag always there
load env at init
2026-03-10 13:29:05 +01:00

225 lines
5.8 KiB
Go

package main
import (
"context"
"log"
"os"
"github.com/LazyBachelor/LazyPM/cmd/pm/tasks"
"github.com/LazyBachelor/LazyPM/internal/app"
"github.com/LazyBachelor/LazyPM/internal/commands/issues"
"github.com/LazyBachelor/LazyPM/internal/commands/survey"
"github.com/LazyBachelor/LazyPM/internal/models"
"github.com/LazyBachelor/LazyPM/pkg/repl"
"github.com/LazyBachelor/LazyPM/pkg/task"
"github.com/LazyBachelor/LazyPM/pkg/tui"
"github.com/LazyBachelor/LazyPM/pkg/web"
"github.com/joho/godotenv"
"github.com/spf13/cobra"
)
func init() {
err := godotenv.Load(".env")
if err != nil {
log.Println("Error loading .env file")
}
models.BaseConfig = models.BaseConfig.LoadFromEnv()
task.RegisterInterface("tui", tui.New())
task.RegisterInterface("web", web.New())
task.RegisterInterface("repl", repl.New())
task.RegisterTask("create_issue", func(app *app.App) task.Tasker {
return tasks.NewCreateIssueTask(app)
})
task.RegisterTask("coding_task", func(app *app.App) task.Tasker {
return tasks.NewCodingTask(app)
})
task.RegisterTask("git_task", func(app *app.App) task.Tasker {
return tasks.NewGitTask(app)
})
task.RegisterTask("sprint_planning", func(app *app.App) task.Tasker {
return tasks.NewSprintPlanningTask(app)
})
task.RegisterTask("issue_triage", func(app *app.App) task.Tasker {
return tasks.NewIssueTriageTask(app)
})
task.RegisterTask("milestone_tracking", func(app *app.App) task.Tasker {
return tasks.NewMilestoneTrackingTask(app)
})
task.RegisterTask("dependency_management", func(app *app.App) task.Tasker {
return tasks.NewDependencyManagementTask(app)
})
task.RegisterTask("team_capacity", func(app *app.App) task.Tasker {
return tasks.NewTeamCapacityTask(app)
})
task.RegisterTask("report_generation", func(app *app.App) task.Tasker {
return tasks.NewReportGenerationTask(app)
})
task.RegisterTask("stakeholder_update", func(app *app.App) task.Tasker {
return tasks.NewStakeholderUpdateTask(app)
})
task.RegisterTask("priority_management", func(app *app.App) task.Tasker {
return tasks.NewPriorityManagementTask(app)
})
task.RegisterTask("backlog_refinement", func(app *app.App) task.Tasker {
return tasks.NewBacklogRefinementTask(app)
})
cobra.EnableCommandSorting = false
if os.Getenv("DEV") == "True" {
issues.RootCmd.SetCompletionCommandGroupID("other")
} else {
issues.RootCmd.CompletionOptions.DisableDefaultCmd = true
}
setupLazyInitialization()
RootCmd.AddGroup(&cobra.Group{ID: "issues", Title: "Issue Management"})
issues.CreateCmd.GroupID = "issues"
issues.GetCmd.GroupID = "issues"
issues.ListCmd.GroupID = "issues"
issues.UpdateCmd.GroupID = "issues"
issues.CloseCmd.GroupID = "issues"
issues.DeleteCmd.GroupID = "issues"
RootCmd.AddCommand(issues.CreateCmd)
RootCmd.AddCommand(issues.GetCmd)
RootCmd.AddCommand(issues.ListCmd)
RootCmd.AddCommand(issues.UpdateCmd)
RootCmd.AddCommand(issues.CloseCmd)
RootCmd.AddCommand(issues.DeleteCmd)
RootCmd.AddGroup(&cobra.Group{ID: "comment", Title: "Comment Management"})
issues.CommentCmd.GroupID = "comment"
issues.CommentsCmd.GroupID = "comment"
RootCmd.AddCommand(issues.CommentCmd)
RootCmd.AddCommand(issues.CommentsCmd)
var SurveyRootCmd = survey.RootCmd
SurveyRootCmd.GroupID = "survey"
RootCmd.AddGroup(&cobra.Group{ID: "survey", Title: "Survey Commands"})
survey.StartCmd.RunE = runStartCmd
SurveyRootCmd.AddCommand(survey.StartCmd)
SurveyRootCmd.AddCommand(survey.StatusCmd)
SurveyRootCmd.AddCommand(survey.SubmitCmd)
SurveyRootCmd.AddCommand(survey.ListTasksCmd)
SurveyRootCmd.AddCommand(survey.ListInterfacesCmd)
RootCmd.AddCommand(SurveyRootCmd)
RootCmd.AddGroup(&cobra.Group{ID: "other", Title: "Additional Commands"})
RootCmd.SetHelpCommandGroupID("other")
RootCmd.AddCommand(replCmd)
}
var replCmd = &cobra.Command{
Use: "repl",
GroupID: "other",
Short: "Start the interactive REPL interface",
Long: `Start the interactive Read-Eval-Print Loop (REPL) for managing your projects and issues in an interactive terminal environment.`,
RunE: func(cmd *cobra.Command, args []string) error {
return repl.New().Run(cmd.Context(), App.Config)
},
}
func initializeApp(ctx context.Context) (*app.App, func(), error) {
return app.New(ctx, tasks.BaseConfig().WithAutoInit(true))
}
func setupLazyInitialization() {
prevPreRun := RootCmd.PersistentPreRun
prevPreRunE := RootCmd.PersistentPreRunE
RootCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error {
if commandNeedsApp(cmd) {
if err := ensureAppInitialized(cmd.Context()); err != nil {
return err
}
}
if prevPreRunE != nil {
if err := prevPreRunE(cmd, args); err != nil {
return err
}
}
if prevPreRun != nil {
prevPreRun(cmd, args)
}
return nil
}
}
func commandNeedsApp(cmd *cobra.Command) bool {
name := cmd.Name()
switch name {
case "help", "completion":
return false
}
if cmd == RootCmd || name == "survey" {
return false
}
if parent := cmd.Parent(); parent != nil && parent.Name() == "survey" {
switch name {
case "tasks", "interfaces":
return false
}
}
return true
}
func ensureAppInitialized(ctx context.Context) error {
if App != nil {
survey.SetApp(App)
issues.SetApp(App)
return nil
}
application, cleanup, err := initializeApp(ctx)
if err != nil {
return err
}
App = application
appCleanup = cleanup
survey.SetApp(App)
issues.SetApp(App)
return nil
}
func initInterfaces() map[string]task.Interface {
interfaces := make(map[string]task.Interface)
for _, name := range task.ListInterfaces() {
i, err := task.GetInterface(name)
if err != nil {
continue
}
interfaces[name] = i
}
return interfaces
}
func initTasks(app *app.App) map[string]task.Tasker {
taskMap := make(map[string]task.Tasker)
for _, name := range task.ListTasks() {
t, err := task.GetTask(name, app)
if err != nil {
continue
}
taskMap[name] = t
}
return taskMap
}