7 "charm.land/lipgloss/v2"
8 "charm.land/lipgloss/v2/table"
9 "github.com/charmbracelet/crush/internal/projects"
10 "github.com/charmbracelet/x/term"
11 "github.com/spf13/cobra"
14var projectsCmd = &cobra.Command{
16 Short: "List project directories",
17 Long: "List directories where Crush project data is known to exist",
19# List all projects in a table
22# Output projects data as JSON
25 RunE: func(cmd *cobra.Command, args []string) error {
26 jsonOutput, _ := cmd.Flags().GetBool("json")
28 projectList, err := projects.List()
35 Projects []projects.Project `json:"projects"`
36 }{Projects: projectList}
38 data, err := json.Marshal(output)
42 cmd.Println(string(data))
46 if len(projectList) == 0 {
47 cmd.Println("No projects tracked yet.")
51 if term.IsTerminal(os.Stdout.Fd()) {
52 // We're in a TTY: make it fancy.
54 Border(lipgloss.RoundedBorder()).
55 StyleFunc(func(row, col int) lipgloss.Style {
56 return lipgloss.NewStyle().Padding(0, 2)
58 Headers("Path", "Data Dir", "Last Accessed")
60 for _, p := range projectList {
61 t.Row(p.Path, p.DataDir, p.LastAccessed.Local().Format("2006-01-02 15:04"))
67 // Not a TTY: plain output
68 for _, p := range projectList {
69 cmd.Printf("%s\t%s\t%s\n", p.Path, p.DataDir, p.LastAccessed.Format("2006-01-02T15:04:05Z07:00"))
76 projectsCmd.Flags().Bool("json", false, "Output as JSON")
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list