-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcmd_dev.go
More file actions
67 lines (50 loc) · 2.6 KB
/
cmd_dev.go
File metadata and controls
67 lines (50 loc) · 2.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main
import (
"fmt"
"github.com/caiolandgraf/grove/internal/watcher"
"github.com/spf13/cobra"
)
var devCmd = &cobra.Command{
Use: "dev",
Short: "Start the development server with built-in hot reload",
Long: bold(
"dev",
) + ` compiles and runs your application, then watches for file
changes and automatically recompiles + restarts the binary on every save.
No external tools required — hot reload is built right into Grove.
` + colorBold + `Output formatting` + colorReset + `
Structured JSON logs (slog, zap, zerolog) are automatically parsed and
rendered as human-readable coloured lines:
` + colorGray + `08:38:28` + colorReset + ` ` + colorGreen + `INF` + colorReset + ` Booting application...
` + colorGray + `08:38:28` + colorReset + ` ` + colorRed + `ERR` + colorReset + ` Failed to boot application ` + colorGray + `error=...` + colorReset + `
Panics are captured and rendered as a styled block with the stack trace.
` + colorBold + `Startup hints` + colorReset + `
Grove detects common startup errors and prints an actionable hint:
` + colorGray + `· .env not found →` + colorReset + ` suggests ` + colorGreen + `cp .env.example .env` + colorReset + `
` + colorGray + `· database unreachable →` + colorReset + ` suggests ` + colorGreen + `docker compose up -d` + colorReset + `
Configure behaviour via the ` + colorCyan + `[dev]` + colorReset + ` section in ` + colorCyan + `grove.toml` + colorReset + `:
` + colorGray + `[dev]` + colorReset + `
` + colorGray + `root = "."` + colorReset + `
` + colorGray + `bin = ".grove/tmp/app"` + colorReset + `
` + colorGray + `build_cmd = "go build -o .grove/tmp/app ./cmd/api/"` + colorReset + `
` + colorGray + `watch_dirs = ["."]` + colorReset + `
` + colorGray + `exclude = [".grove", "vendor", "node_modules", "tests"]` + colorReset + `
` + colorGray + `extensions = [".go"]` + colorReset + `
` + colorGray + `debounce_ms = 50` + colorReset + `
All fields are optional — sensible defaults are used when ` + colorCyan + `grove.toml` + colorReset + `
is absent or the ` + colorCyan + `[dev]` + colorReset + ` section is omitted.
` + colorGray + `Examples:` + colorReset + `
grove dev`,
RunE: runDev,
}
// DevCmd exposes the cobra command so it can be wired from main.go.
// It is also the entry-point called by tests or external tooling.
func DevCmd() *cobra.Command { return devCmd }
func runDev(_ *cobra.Command, _ []string) error {
fmt.Println()
cfg, err := watcher.LoadConfig()
if err != nil {
return fmt.Errorf("failed to load grove.toml: %w", err)
}
return watcher.New(cfg).Start()
}