Skip to content

Commit 4e69e2f

Browse files
chuongld20claude
andcommitted
chore: simplify Phase 3 code and bump version to v0.3.0
- Deduplicate server resolution logic in listCmd and statsCmd (use resolveServer) - Mark unused helpText param as _ in tui/keys.go - Bump version from 0.2.0 to 0.3.0 - Update CLAUDE.md with Phase 3 packages and commands Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1255719 commit 4e69e2f

3 files changed

Lines changed: 16 additions & 29 deletions

File tree

CLAUDE.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@ Go CLI tool that turns any Linux machine into a ready-to-use dev environment in
99
- `internal/server/` — Server pool management (add/remove/list/health), least-loaded selector
1010
- `internal/workspace/` — Workspace model, Manager interface, resource limits, user-scoped naming
1111
- `internal/tailscale/` — Tailscale Manager interface (serve/unserve/status)
12+
- `internal/tui/` — Interactive TUI dashboard with Bubble Tea (workspace list, logs viewer, keyboard navigation)
13+
- `internal/template/` — Workspace templates system (built-in + user-defined, YAML-based)
14+
- `internal/snapshot/` — Snapshot & restore workspace state (Docker volumes, compressed tar archives)
15+
- `internal/metrics/` — Resource metrics collector (CPU, memory, disk, network I/O per workspace/server)
1216
- `internal/integration/` — Multi-user integration tests (build tag: integration)
1317
- `internal/testutil/` — Shared test helpers for SSH, Docker, assertions
1418
- `.claude/specs/` — Product vision and design documents
1519

1620
## Key Patterns
1721
- **Cobra CLI**: All commands defined as funcs returning `*cobra.Command`, wired in `main()`
18-
- **Interface-driven**: `workspace.Manager`, `tailscale.Manager`, `identity.Resolver`, `port.Registry`, `server.Pool` define contracts
22+
- **Interface-driven**: `workspace.Manager`, `tailscale.Manager`, `identity.Resolver`, `port.Registry`, `server.Pool`, `metrics.Collector`, `snapshot.Manager` define contracts
1923
- **Config**: Per-project `devbox.yaml` parsed into `DevboxConfig` struct with yaml tags; `name` and `server` are required fields
2024
- **Error wrapping**: `fmt.Errorf("context: %w", err)` for all error propagation
2125
- **Single binary**: No runtime dependencies, cross-compile with `GOOS`/`GOARCH`
@@ -33,4 +37,8 @@ go vet ./... # Lint
3337
./devbox up [project] # Start workspace (auto-selects server, resolves user)
3438
./devbox stop|list|destroy|ssh # Workspace lifecycle commands
3539
./devbox server add|remove|list # Server pool management
40+
./devbox tui # Interactive TUI dashboard
41+
./devbox template list|create # Workspace templates
42+
./devbox snapshot|restore # Snapshot & restore workspace state
43+
./devbox stats [workspace] # Resource metrics
3644
```

cmd/devbox/main.go

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
)
3030

3131
var (
32-
version = "0.2.0"
32+
version = "0.3.0"
3333
verbose bool
3434
noColor bool
3535
)
@@ -682,30 +682,9 @@ func statsCmd() *cobra.Command {
682682
RunE: func(cmd *cobra.Command, args []string) error {
683683
serverFlag, _ := cmd.Flags().GetString("server")
684684

685-
if serverFlag == "" {
686-
cfg, err := config.LoadFromDir(".")
687-
if err == nil {
688-
serverFlag = cfg.Server
689-
}
690-
}
691-
692-
// Resolve server name from pool.
693-
if serverFlag != "" {
694-
configPath, _ := server.DefaultConfigPath()
695-
if pool, err := server.NewFilePool(configPath, nil); err == nil {
696-
if servers, err := pool.List(); err == nil {
697-
for _, srv := range servers {
698-
if srv.Name == serverFlag {
699-
serverFlag = server.SSHHost(&srv)
700-
break
701-
}
702-
}
703-
}
704-
}
705-
}
706-
707-
if serverFlag == "" {
708-
return fmt.Errorf("devbox stats: no server specified — use --server flag or create devbox.yaml")
685+
host, err := resolveServer(serverFlag)
686+
if err != nil {
687+
return fmt.Errorf("devbox stats: %w", err)
709688
}
710689

711690
sshExec, err := devboxssh.New()
@@ -720,7 +699,7 @@ func statsCmd() *cobra.Command {
720699
if len(args) == 1 {
721700
// Single workspace mode.
722701
container := args[0]
723-
wm, err := collector.CollectWorkspace(ctx, serverFlag, container)
702+
wm, err := collector.CollectWorkspace(ctx, host, container)
724703
if err != nil {
725704
return fmt.Errorf("devbox stats: %w", err)
726705
}
@@ -733,7 +712,7 @@ func statsCmd() *cobra.Command {
733712
}
734713

735714
// Server overview mode.
736-
sm, err := collector.CollectServer(ctx, serverFlag)
715+
sm, err := collector.CollectServer(ctx, host)
737716
if err != nil {
738717
return fmt.Errorf("devbox stats: %w", err)
739718
}

internal/tui/keys.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,6 @@ func DefaultKeyMap() KeyMap {
6868
}
6969

7070
// helpText returns a formatted help string for the help bar.
71-
func helpText(km KeyMap) string {
71+
func helpText(_ KeyMap) string {
7272
return " s:start x:stop d:destroy enter:ssh l:logs r:refresh /:filter q:quit"
7373
}

0 commit comments

Comments
 (0)