Compare commits

...
4 Commits
Author SHA1 Message Date
stefankoelle 9521f47377 Fix SPEC.md and README.md for current codebase
- SPEC.md: Windows is now a fully supported platform (not secondary)
- SPEC.md: Remove outdated 'manual pane handling' claim for Windows
- SPEC.md: Update non-functional requirements (Linux/macOS/Windows)
- README.md: Remove duplicate 'This downloads...' paragraph
- README.md: Use --namespace instead of -n in k9s examples
2026-08-09 22:32:27 +02:00
stefankoelle a1e8894222 Add security, CI, and tooling items to bugfix sprint 2026-08-09 22:30:34 +02:00
stefankoelle 43aef3b76c Add bugfix sprint to PLAN.md between v0.2.0 and v0.3.0 2026-08-09 22:29:13 +02:00
stefankoelle 84dbd9c230 Update PLAN.md: mark v0.2.0 done, add roadmap for v0.3.0 and v1.0 2026-08-09 22:27:26 +02:00
3 changed files with 93 additions and 37 deletions
+82 -22
View File
@@ -14,7 +14,7 @@ is still open. For the full requirements, see [SPEC.md](SPEC.md).
API is unreachable.
- [x] `README.md`, `config.example.yaml`.
## Phase 1 — Core logic + navigation (done, initial version)
## Phase 1 — Core logic + navigation (done)
- [x] `internal/kctl`: pure, unit-tested logic —
template resolution (`ResolveTemplate`), namespace/label filtering
@@ -49,41 +49,101 @@ is still open. For the full requirements, see [SPEC.md](SPEC.md).
**whole secret** (one ExternalSecret annotation).
- `Esc` closes the whole tmux session (`tmux kill-session`).
## Phase 2 — Hardening (open)
## Phase 2 — Hardening (done)
- [ ] Handle non-JSON AWS secrets and Kubernetes secrets with binary
(non-UTF8) values more gracefully in the diff table (currently
falls back to a single "value" key or may render oddly).
- [x] Handle non-JSON AWS secrets and Kubernetes secrets with binary
(non-UTF8) values more gracefully in the diff table.
- [ ] Add integration-style tests against a local `kind`/`k3d` cluster in
CI for the `kubeexec` wrappers currently excluded from automated
testing.
- [ ] Input validation for the free-text steps in "panel" mode (empty
region/secret name, invalid characters).
- [ ] Graceful handling when `tmux`, `k9s`, or `aws` are not installed
(currently surfaces the raw exec error).
- [ ] Structured logging / `--verbose` flag for troubleshooting failed
testing. *(Deferred — superseded by client-go in v0.3.0)*
- [x] Input validation for the free-text steps in "panel" mode.
- [x] Graceful handling when `tmux`, `k9s`, or `aws` are not installed.
- [x] Structured logging / `--verbose` flag for troubleshooting failed
`kubectl`/`aws` calls.
- [ ] Paginate/scroll the secrets diff table for secrets with many fields
instead of relying on terminal wrapping.
- [x] Paginate/scroll the secrets diff table for secrets with many fields.
## Phase 3 — Windows-native support (done)
- [x] Windows support via [psmux](https://github.com/marlocarlo/psmux)
a native, tmux-compatible terminal multiplexer. kctl-tui works
without code changes; `CheckTool("tmux")` error message includes
Windows-specific install hint.
- [x] Windows support via [psmux](https://github.com/marlocarlo/psmux).
- [x] `install.ps1` — PowerShell install script for Windows.
- [x] Updated README and SPEC with Windows + psmux setup instructions.
## Phase 4 — Nice-to-haves (open, not committed)
## Phase 4 — Nice-to-haves (done for v0.2.0)
- [x] `--version` flag — prints version, set via `-ldflags` at build time.
- [x] Config validation command (`kctl-tui config check`) — validates
required fields and shows a resolved context example.
- [ ] Optional direct use of `client-go` instead of shelling out to
`kubectl`, for faster context/namespace/label queries.
- [ ] Homebrew tap / `scoop` manifest as additional install options
alongside `install.sh`.
- [x] `kctl-tui doctor` — health check for tools, config, and connectivity.
- [x] `--help` flag with full usage documentation.
- [x] CHANGELOG.md, CONTRIBUTING.md, GitHub Issue/PR templates.
---
## Bugfix Sprint — between v0.2.0 and v0.3.0
- [ ] **Dead code** `cmd/kctl-tui/main.go:47-49` — empty
`if len(filtered) == 0` block with comment. Remove.
- [ ] **Redundant logic** `internal/kctl/diff.go:60-63`
`if lb || rb { match = l == r }` is identical to the line above.
Either dead or misunderstood.
- [ ] **Diff-scroll is a no-op** `cmd/kctl-tui/panel.go:398-413`
`renderDiffTable` is always called with `visibleHeight=0`, so
`end = len(entries)` is always true. j/k/arrows only change the
offset text but the table is always fully rendered. The CHANGELOG
promises "Diff table scroll support" but the feature is incomplete.
- [ ] **README duplicate** `README.md:98-102` — "This downloads the latest
release binary..." appears twice (once "to your PATH", once
"to /usr/local/bin"). Edit leftover.
- [ ] **go mod tidy in CI** `build.yml` — mutates `go.sum` during the
build instead of enforcing a tidy check. If someone forgets to tidy,
it's silently fixed instead of blocking the PR.
- [ ] **Bubbles filter disabled** `full.go:53`, `panel.go:87` — workaround
for the stuck-filter bug (commit 7db58b6). Users can no longer
type-to-filter. Worth restoring with a proper fix later.
- [ ] **Kleinkram:**
- `fmt.Errorf("%s", msg)``errors.New(msg)` in `kubeexec.go:41`
- `helpers.go` is a pointless 1:1 passthrough to the `kctl` package
- `IsBinary` also marks UTF-8 special chars (>0x7F) as "binary"
- [ ] **SECURITY.md** — fehlt, besonders wichtig für ein Tool mit
Secret-Workflows.
- [ ] **dependabot.yml** — automatische Dependency-Updates.
- [ ] **Checksummen für Release-Assets** — CI erzeugt Binaries aber keine
`.sha256`-Dateien; für `curl | bash`-Install wichtig.
- [ ] **Makefile / justfile** — Build/Test/Vet-Komfort.
- [ ] **golangci-lint**`go vet` allein ist dünn; optional aber empfohlen.
- [ ] **PLAN.md aufräumen** — erledigte Phasen als „Done" markieren,
offene Items konsolidieren.
---
## Roadmap
### v0.3.0 — client-go integration
Replace kubectl shell-outs with direct API calls via `client-go`.
- [ ] Add `internal/kubeclient` package using `client-go` for:
- Context/namespace/label queries (faster than kubectl JSON parsing)
- Deployment list and rollout restart/status
- Secret fetch (AWS Secrets Manager via SDK, K8s secrets via API)
- ExternalSecret annotation update
- [ ] Keep `internal/kubeexec` as fallback for operations not yet
covered by `client-go`
- [ ] Remove `kind`/`k3d` integration test plan (client-go has its own
test coverage)
- [ ] Add unit tests with `fake.Clientset` for the new package
### v1.0 — Stable release
Production-ready with package manager support and documentation.
- [ ] Homebrew tap (`skoelle/homebrew-tap`) with `kctl-tui` formula
- [ ] Scoop manifest (`skoelle/scoop-bucket`) for Windows
- [ ] Full test coverage for `internal/kubeclient`
- [ ] Documentation: architecture diagram, config reference, troubleshooting
- [ ] Semantic versioning policy documented
- [ ] Deprecation policy for config schema changes
## Notes for contributors
+2 -5
View File
@@ -42,9 +42,9 @@ See [SPEC.md](SPEC.md) for the full requirements and design rationale, and
| -> 1) Quit 2) beta 3) prod |
| each with: a) Secrets sync b) Redeploy |
+--------------------------------------------------+
| k9s --context <resolved beta context> -n <ns> |
| k9s --context <resolved beta context> --namespace <ns> --command pods |
+--------------------------------------------------+
| k9s --context <resolved prod context> -n <ns> |
| k9s --context <resolved prod context> --namespace <ns> --command pods |
+--------------------------------------------------+
```
@@ -95,9 +95,6 @@ curl -fsSL https://raw.githubusercontent.com/skoelle/kctl-tui/main/install.sh |
irm https://raw.githubusercontent.com/skoelle/kctl-tui/main/install.ps1 | iex
```
This downloads the latest release binary for your architecture from
GitHub Releases and installs it to your PATH.
This downloads the latest release binary for your OS/architecture from
GitHub Releases and installs it to `/usr/local/bin/kctl-tui`.
+9 -10
View File
@@ -7,9 +7,10 @@ work, bundling the most common workflows currently done via long
`kubectl`/`k9s`/`aws-cli` commands, operable through a text UI (arrow keys,
Esc) instead of long typed commands.
Target platform: **Linux / WSL** (primary usage scenario, since split
panes require a real terminal multiplexer). Native Windows (without WSL)
is possible but with reduced split-view functionality (see 3.6).
Target platform: **Linux / WSL / Windows** (primary usage scenario, since
split panes require a real terminal multiplexer). On Windows, use
[psmux](https://github.com/marlocarlo/psmux) as tmux-compatible
multiplexer.
**Technology decision: Go + Bubble Tea** (see section 5).
@@ -177,11 +178,11 @@ Alternatively, run kctl-tui inside WSL with standard `tmux`.
## 4. Non-functional requirements
- **Primary platform Linux/WSL**, secondary native Windows (via psmux).
- **Platforms**: Linux, macOS, Windows (via psmux or WSL).
- **Single-binary distribution** without external runtime dependency (Go
provides this natively).
- **External dependencies**: `kubectl` mandatory; `tmux`, `k9s`, `aws-cli`
depending on the action used.
- **External dependencies**: `kubectl` mandatory; `tmux`/`psmux`, `k9s`,
`aws-cli` depending on the action used.
- **Low startup time**, noticeably faster than the current `kubens`
experience.
- **No destructive actions without confirmation** (redeploy, force-sync).
@@ -243,16 +244,14 @@ Rejected options (see discussion history):
- These fixes are a prerequisite before the tool can be meaningfully
tested, since it builds directly on `kubectl config`.
## 8. Open items / out of scope (v1)
## 8. Open items / out of scope
- No automatic label setup for namespaces (migration is a separate,
one-time task).
- Split view v1 fixed at 2 status panes + 1 control pane (3 panes total).
- Split view fixed at 2 status panes + 1 control pane (3 panes total).
- No RBAC/permission checks before executing sensitive actions — the tool
assumes existing kubectl permissions.
- Configuration file format (`config.yaml`) is defined and implemented;
concrete label keys, context names, and namespace names are
project-specific and belong exclusively in the user's local, unversioned
configuration, not in this document or the source code.
- Native Windows (without WSL) remains a secondary platform with manual
pane handling instead of an automated tmux lifecycle.