Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
52bd26f
commit agent files
stenh0use Apr 26, 2026
aba91c9
fix: remove unsupported start version contract
stenh0use Apr 26, 2026
df28e90
chore: enforce worktree base alignment in dev-team skill
stenh0use Apr 26, 2026
7672450
docs: add concise reboot handoff for team lead
stenh0use Apr 26, 2026
6f035bf
fix workspace permission errors
stenh0use Apr 26, 2026
bc31ea9
fix: guard cluster network dereference in get
stenh0use Apr 26, 2026
cb15c5e
fix: confine cluster and file paths to root
stenh0use Apr 26, 2026
999cf31
remove agents and skill
stenh0use Apr 26, 2026
c7f62bf
fix: handle missing cluster config dir in list
stenh0use Apr 26, 2026
1418d49
chore: normalize manager get test formatting
stenh0use Apr 26, 2026
4f1353d
fix: load persisted config for read and stop flows
stenh0use Apr 26, 2026
5393c24
fix: correct hind get status and ports rendering
stenh0use Apr 26, 2026
96a2f27
chore: ignore .claude/worktrees/ directory
stenh0use Apr 26, 2026
d91313a
fix: normalize exited to stopped in list aggregation
stenh0use Apr 26, 2026
e94e1d4
fix: propagate inspect errors in stop/delete flows
stenh0use Apr 26, 2026
36a66c4
commit working state
stenh0use Apr 26, 2026
c4a59e5
add env with ./bin in path
stenh0use Apr 26, 2026
7eae249
commit working docs
stenh0use Apr 26, 2026
b3ca90e
move development docs
stenh0use Apr 26, 2026
55049c8
allow team file edits and write
stenh0use Apr 26, 2026
9913df0
commit working logs
stenh0use Apr 26, 2026
f306176
fix: address BL-019 correctness issues
stenh0use Apr 26, 2026
ea89185
remove dead cluster cni package
stenh0use Apr 26, 2026
4e799d6
fix: align cilium docs with removed cni flag
stenh0use Apr 26, 2026
bbd4f65
test: deepen manager boundary error-path coverage
stenh0use Apr 26, 2026
6ece03c
refactor: inject provider client into cluster manager construction
stenh0use Apr 26, 2026
6d7bd34
fix: restore build file templating with relative manager paths
stenh0use Apr 26, 2026
cc6292a
refactor: extract client node factory and wire addClientNodes to fix …
stenh0use Apr 28, 2026
3264fb4
feat: add provider.Client stub for testing
stenh0use Apr 28, 2026
7f32b59
refactor: replace local provider stubs with shared mock.ClientStub
stenh0use Apr 28, 2026
a291c01
commit work
stenh0use Apr 28, 2026
f978900
fix: harden build metadata file paths
stenh0use Apr 28, 2026
8c59bc7
refactor: normalize docker statuses in provider
stenh0use Apr 28, 2026
4c4fa33
refactor: reuse client node factory in SetClientCount
stenh0use Apr 28, 2026
77cc1df
commit docker test changes
stenh0use Apr 30, 2026
12b9620
fix: restore docker command executor seam and finalize BL-009
stenh0use Apr 30, 2026
6f988fa
refactor: tighten provider and cluster boundary types
stenh0use Apr 30, 2026
35fb1c6
Merge branch 'worktree-agent-a422d93c9c1d51ec0' into refactor-cleanup
stenh0use Apr 30, 2026
75822fd
fix: align get command types after BL-009 merge
stenh0use Apr 30, 2026
9b4062e
chore: update BL-009 status and reboot handoff
stenh0use Apr 30, 2026
86060fc
refactor: finalize provider boundary cleanup and team closeout
stenh0use Apr 30, 2026
95ce231
finished first round of improvements
stenh0use Apr 30, 2026
aecb120
chore: record archive audit handoff
stenh0use Apr 30, 2026
69cc4b9
update backlog
stenh0use Apr 30, 2026
e59ce3d
update backlog
stenh0use Apr 30, 2026
9b6bb04
chore: close BL-018, promote BL-019, and commit stop/build gap fixes
stenh0use May 1, 2026
be28c2a
feat: enforce default-cluster.feature profile-selection contracts (BL…
stenh0use May 1, 2026
3ec7ac3
chore: merge BL-019 default-cluster profile-selection contracts
stenh0use May 1, 2026
a5a5987
feat: implement hind releases command (BL-020)
stenh0use May 1, 2026
5f62b20
chore: merge BL-020 hind-releases command
stenh0use May 1, 2026
1e73036
chore: close BL-016, update runtime files
stenh0use May 2, 2026
0a41deb
chore: mark backlog fully clear in handoff
stenh0use May 2, 2026
d8a3383
move team directory
stenh0use May 2, 2026
d07d413
rename specs
stenh0use May 2, 2026
2ff979c
chore: add .worktrees/ to .gitignore
stenh0use May 2, 2026
b8d9767
feat(provider): add BuildImageResult and expand BuildImageOptions
stenh0use May 2, 2026
67fc352
feat(dockercli): implement BuildImage with buildx, --load, and digest…
stenh0use May 2, 2026
749fca0
refactor(image): decouple from internal/docker, wire builder through …
stenh0use May 2, 2026
5210be8
chore(image): delete internal/docker package
stenh0use May 2, 2026
157f3b7
fix: apply staff review fixes for B-013
stenh0use May 2, 2026
2570f74
update docs post docker build change
stenh0use May 2, 2026
acd7af6
add duplicate mock to backlog
stenh0use May 2, 2026
f18d201
add won't do items
stenh0use May 2, 2026
b3cdc6d
add release versions refactor to backlog
stenh0use May 2, 2026
e7982ec
update backlog with version/release changes
stenh0use May 2, 2026
0b42db8
add cluster node id to backlog
stenh0use May 2, 2026
7cd62e2
fix change in docker cli manifest digest key
stenh0use May 2, 2026
69c7541
add testify migration to backlog
stenh0use May 2, 2026
011fd4b
add new user convenience features
stenh0use May 2, 2026
89a53ae
qa cli bugs
stenh0use May 2, 2026
801b849
add bug fixes to the backlog
stenh0use May 2, 2026
ee270ec
add pull request CI workflow checks
stenh0use May 2, 2026
bf753bc
add image build check to PR CI workflow
stenh0use May 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export PATH="$PWD/bin:$PATH"
33 changes: 33 additions & 0 deletions .github/workflows/ci-pr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: PR CI

on:
pull_request:
branches:
- main
types:
- opened
- reopened
- synchronize

jobs:
checks:
name: Test and Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.24.x'
cache: true

- name: Run tests
run: make test

- name: Build CLI
run: make hind-cli

- name: Build Images
run: ./bin/hind build all
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
.vscode
/bin/
TODO

skills-lock.json
.claude/skills/golang-pro/
.claude/worktrees/
.worktrees/
23 changes: 23 additions & 0 deletions .team/backlog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Team Backlog

Closed items: `.team/done/`

| ID | Title | Type | Priority | Size | Source | Spec |
|-------|-------|------|----------|------|--------|------|
| W-026 | Add GitHub Actions CI for pre-merge checks | maintenance | P1 | S | User | `W-026.md` |
| W-033 | Fix top-priority CLI correctness bugs (`get`/`rm` missing cluster, `stop` partial failure exits) | maintenance | P1 | M | QA audit | `W-033.md` |
| W-017 | Close `hind-stop.feature` behavior gaps | feature | P2 | L | B-015 audit | `W-015.md` |
| W-019 | Enforce `default-cluster.feature` profile-selection contracts | feature | P2 | M | B-015 audit | `W-015.md` |
| W-022 | Refactor `pkg/build/release` for a more ergonomic interface | maintenance | P2 | M | User | `W-022.md` |
| W-034 | Fix low-priority CLI behavior/UX bugs from QA (`list`/`start`/`build`/`set`) | maintenance | P3 | M | QA audit | `W-034.md` |
| W-020 | Fix all `go` test files that use duplicate mocks | maintenance | P3 | S | User | `W-020.md` |
| W-021 | Address B-013 staff review additional observations | maintenance | P3 | S | B-013 review | `W-021.md` |
| W-023 | Allow users to pass arbitrary package versions to `hind build` | feature | P3 | M | User | `W-023.md` |
| W-024 | Allow users to pass arbitrary package versions to `hind start` | feature | P3 | M | User | `W-024.md` |
| W-025 | Publish container images to an OCI registry on version update | feature | P4 | XL | User | `W-025.md` |
| W-027 | Add ID value to cluster nodes `pkg/cluster/types.go` | maintenance | P3 | S | User | `W-027.md` |
| W-028 | Migrate `*_test.go` test cases to `stretchr/testify` | maintenance | P4 | L | User | - |
| W-029 | Add ingress controller for routing traffic to the internal network | feature | P4 | XL | User | - |
| W-030 | Build and publish releases to brew for macos install | feature | P3 | L | User | - |
| W-031 | Add open subcommand to open the web ui of a component | feature | P3 | M | User | - |
| W-032 | Add login subcommand to exec into an interactive shell in a node | feature | P3 | M | User | - |
162 changes: 162 additions & 0 deletions .team/bugs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
# Bugs

Closed items: `.team/done/bugs/`

---

<!-- Template:
## W-xxx — Title

**Severity:** P1 / P2 / P3
**Status:** open / in-progress / resolved
**Source:** where it came from

**Repro steps:**
1. ...

**Expected:** ...
**Actual:** ...

**Spec:** `W-xxx.md` (if one exists)
-->

---

## BUG-001 — `hind get` succeeds silently when cluster has no config file on disk

**Severity:** P2
**Status:** open
**Source:** QA audit of assigned commands (get, list, stop, set profile)

**Root cause file:** `pkg/cluster/manager.go:325-331` (`LoadPersistedConfig`)

**Repro steps:**
1. Ensure no cluster named "ghost" has ever been created (no config file at `~/.config/hind/cluster/ghost/cluster.json`).
2. Run `hind get ghost`.
3. Observe exit code and output.

**Expected:** Command exits non-zero with a "cluster not found" error message.

**Actual:** `LoadPersistedConfig` (called by `Manager.Get`) falls through the `!m.ConfigFileExists()` branch without returning an error because `m.config.Name` is non-empty (it was set by `cluster.New` from the supplied arg). The manager then calls `provider.InspectNetwork` and `provider.InspectContainer` using the freshly-synthesised default config, both return `nil` (no such resources), and `Get` returns an empty `ClusterInfo` with no error. `get.runE` renders a table showing `Status: N/A`, `Network: ` (empty), and exits 0. The user receives no indication that the cluster does not exist.

**Contrast with `hind stop`:** `stop.runE` explicitly calls `clusterMgr.ConfigFileExists()` before proceeding and returns an error if false. `get.runE` has no equivalent guard.

---

## BUG-002 — `hind list` swallows `tabwriter.Flush` error

**Severity:** P3
**Status:** open
**Source:** QA audit of assigned commands (get, list, stop, set profile)

**Root cause file:** `pkg/cmd/hind/list/list.go:110`

**Repro steps:**
1. Any `hind list` invocation that reaches the table-printing path (at least one cluster exists).
2. Observe: the return value of `w.Flush()` is discarded.

**Expected:** The error returned by `w.Flush()` (e.g. a broken-pipe or closed writer) is propagated and causes `runE` to return a non-zero exit code, consistent with how `get.runE` handles `w.Flush()` at line 85-87 of `get.go`.

**Actual:** `w.Flush()` is called as a bare statement with no error check (`w.Flush()` on line 110, no `if err :=` wrapper). If the flush fails the error is silently dropped and the command exits 0, potentially producing truncated output.

---

## BUG-003 — `hind stop` exits 0 even when containers fail to stop

**Severity:** P2
**Status:** open
**Source:** QA audit of assigned commands (get, list, stop, set profile)

**Root cause file:** `pkg/cmd/hind/stop/stop.go:115-121`

**Two related issues in the same function:**

**Issue A — `FailedCount > 0` branch always returns nil (line 121)**
When one or more containers fail to stop (without `--force`), `runE` prints the partial-stop warning to `ErrOut` but returns `nil` — exit 0. Scripts cannot detect the failure.

**Issue B — `--force` branch (line 115) evaluated before `FailedCount` check (line 119)**
When `force=true` and containers failed to kill, the `if force` branch fires first and returns `nil` with "force stopped", so the `FailedCount` path is never reached at all. Individual failure messages are still printed to `ErrOut` (lines 103-105) but the exit code and final status message are incorrect.

**Repro steps (Issue A):**
1. Start a cluster with at least two containers.
2. Arrange for one container's stop to fail (e.g. Docker daemon error on that container).
3. Run `hind stop <cluster-name>` (no --force).
4. Observe exit code is 0 despite partial failure.

**Repro steps (Issue B):**
1. Same setup but run `hind stop --force <cluster-name>`.
2. Observe "force stopped" message and exit 0 — `FailedCount` path is never reached.

**Expected:** Both paths should return a non-nil error when `result.FailedCount > 0`.

---

## BUG-004 — `hind rm` succeeds silently when cluster does not exist

**Severity:** P2
**Status:** open
**Source:** QA audit of assigned commands (rm, start, build)

**Root cause file:** `pkg/cluster/manager.go:221-276` (`Delete`)

**Repro steps:**
1. Ensure no cluster named `ghost` exists.
2. Run `hind rm ghost`.
3. Observe output and exit code.

**Expected:** Command exits non-zero with an error such as `cluster 'ghost' does not exist`.

**Actual:** Command exits 0 and prints `Cluster 'ghost' deleted successfully`. `Delete()` does not fail when config/resources are absent, so non-existent deletion is treated as success.

---

## BUG-005 — `hind start` never returns `StartResultAlreadyRunning`

**Severity:** P3
**Status:** open
**Source:** QA audit of assigned commands (rm, start, build)

**Root cause file:** `pkg/cluster/manager.go:72-108` (`Start`)

**Repro steps:**
1. Run `hind start mycluster`.
2. Run `hind start mycluster` again while already fully running.

**Expected:** Already-running no-op path should return `StartResultAlreadyRunning` and avoid redundant connection-info output.

**Actual:** Existing-cluster path always returns `StartResultResumed`, even when reconcile has no actions. `StartResultAlreadyRunning` appears to be dead/unused.

---

## BUG-006 — `hind build` wrong-arg error message uses slice formatting

**Severity:** P3
**Status:** open
**Source:** QA audit of assigned commands (rm, start, build)

**Root cause file:** `pkg/cmd/hind/build/build.go:39`

**Repro steps:**
1. Run `hind build` (no args), or `hind build a b`.

**Expected:** Error should report argument count cleanly (e.g. `received 0` / `received 2`) or use Cobra's default exact-args error.

**Actual:** Custom message uses `%s` with `[]string`, producing messages like `accepts 1 arg, received []` or `[a b]`.

---

## BUG-007 — `hind set profile` writes success message to stderr

**Severity:** P3
**Status:** open
**Source:** QA audit of assigned commands (get, list, stop, set profile)

**Root cause file:** `pkg/cmd/hind/set/set.go:42`

**Repro steps:**
1. Run `hind set profile <existing-cluster>`.
2. Redirect stderr to `/dev/null`.

**Expected:** Success output should be on stdout if treated as user-facing command result.

**Actual:** Success message is written to `streams.ErrOut`, so it disappears when stderr is redirected.
Loading
Loading