Commit Graph

683 Commits

Author SHA1 Message Date
Shaun Arman
aee739c078 feat(kube): nav restructure, action menus, new resource lists, advanced components
Navigation:
- Restructure to match requested layout: Cluster, Nodes, Workloads, Config,
  Network, Storage, Namespaces, Events, Helm, Access Control, Custom Resources
- Workloads: add Overview dashboard and Replication Controllers
- Config: add PDB, PriorityClass, RuntimeClass, Lease, Mutating/Validating Webhooks
- Network: add Endpoints, EndpointSlices, IngressClasses; move Port Forwarding here
- Helm and Custom Resources sections wired through

New shared components:
- ResourceActionMenu: state-aware MoreHorizontal dropdown
- ConfirmDeleteDialog: confirmation guard for all destructive operations
- ScaleModal: replica count dialog (Deployments, StatefulSets, ReplicaSets, RCs)
- LogsModal: container log viewer replacing PodList inline dialog
- ShellExecModal: kubectl exec -it with container and shell selector
- AttachModal: kubectl attach -it with container selector

New resource list components (12):
ReplicationControllerList, PodDisruptionBudgetList, PriorityClassList,
RuntimeClassList, LeaseList, MutatingWebhookList, ValidatingWebhookList,
EndpointList, EndpointSliceList, IngressClassList, NamespaceList,
WorkloadOverview

New advanced components (5):
LogStreamPanel (Tauri-event streaming, follow/search/download),
HelmChartList, HelmReleaseList, CrdList, CustomResourceList

Updated 24 existing list components with context-appropriate action menus:
- Pods: Logs, Shell, Attach, Edit, Delete, Force Delete (state-aware)
- Deployments: Scale, Restart, Rollback, Edit, Delete
- StatefulSets/ReplicaSets: Scale, Restart/none, Edit, Delete
- DaemonSets: Restart, Edit, Delete
- Jobs: Edit, Delete
- CronJobs: Suspend/Resume (state-aware), Trigger, Edit, Delete
- Services/Ingresses/ConfigMaps/Secrets/HPAs/PVCs/PVs/StorageClasses/
  NetworkPolicies/ResourceQuotas/LimitRanges: Edit, Delete
- Nodes: Cordon/Uncordon (state-aware), Drain, Edit
- All RBAC resources: Edit, Delete

Co-Authored-By: TFTSR Engineering <noreply@tftsr.com>
2026-06-08 20:38:05 -05:00
Shaun Arman
9c9ca16966 feat(kube): implement 44 new Rust K8s commands + helm binary support
New list commands: list_replicationcontrollers, list_poddisruptionbudgets,
list_priorityclasses, list_runtimeclasses, list_leases,
list_mutatingwebhookconfigurations, list_validatingwebhookconfigurations,
list_endpoints, list_endpointslices, list_ingressclasses,
list_namespaces_resource, list_crds, list_custom_resources

New action commands: force_delete_resource, describe_resource,
get_resource_yaml, attach_pod, restart_statefulset, restart_daemonset,
scale_statefulset, scale_replicaset, scale_replicationcontroller,
suspend_cronjob, resume_cronjob, trigger_cronjob,
create_namespace, delete_namespace

Log streaming: stream_pod_logs (tokio task + Tauri events), stop_log_stream

Helm: helm_list_repos, helm_add_repo, helm_update_repos, helm_search_repo,
helm_list_releases, helm_uninstall, helm_rollback

Infrastructure: shell/helm.rs locate_helm(), scripts/download-helm.sh,
AppState.log_streams for stream lifecycle management

363/363 tests passing, zero clippy warnings

Co-Authored-By: TFTSR Engineering <noreply@tftsr.com>
2026-06-08 20:34:01 -05:00
Shaun Arman
879fdf4239 feat(kube): add TypeScript types and command stubs for all new K8s resources
Add interfaces and invoke() wrappers for new resource types, Helm, CRDs,
resource actions (attach, force-delete, describe, get-yaml, log streaming),
and workload controls (restart/scale statefulset/daemonset/replicaset, cronjob ops).

Co-Authored-By: TFTSR Engineering <noreply@tftsr.com>
2026-06-08 20:16:55 -05:00
Shaun Arman
e68f61461e fix(ci): cargo fmt kube.rs + switch pr-review to qwen3-coder-next
- Apply cargo fmt to src-tauri/src/commands/kube.rs (CI was failing)
- Update pr-review.yml to use qwen3-coder-next model via liteLLM
- Add TICKET-kube-ui-feature-parity.md gap analysis for FreeLens parity

Co-Authored-By: TFTSR Engineering <noreply@tftsr.com>
2026-06-08 20:15:19 -05:00
58edc75ab5 Merge pull request 'fix(ui): correct font contrast and background colors in dark mode' (#84) from fix/dark-mode-font-contrast into master
Some checks failed
Auto Tag / changelog (push) Has been cancelled
Auto Tag / wiki-sync (push) Has been cancelled
Auto Tag / build-linux-amd64 (push) Has been cancelled
Auto Tag / autotag (push) Has been cancelled
Auto Tag / build-windows-amd64 (push) Has been cancelled
Auto Tag / build-macos-arm64 (push) Has been cancelled
Auto Tag / build-linux-arm64 (push) Has been cancelled
Test / rust-clippy (push) Has been cancelled
Test / rust-tests (push) Has been cancelled
Test / frontend-typecheck (push) Has been cancelled
Test / frontend-tests (push) Has been cancelled
Test / rust-fmt-check (push) Has been cancelled
Reviewed-on: #84
2026-06-08 14:47:58 +00:00
007897a952 Merge branch 'master' into fix/dark-mode-font-contrast
Some checks failed
PR Review Automation / review (pull_request) Has been cancelled
Test / rust-tests (pull_request) Has been cancelled
Test / rust-fmt-check (pull_request) Has been cancelled
Test / frontend-tests (pull_request) Has been cancelled
Test / rust-clippy (pull_request) Has been cancelled
Test / frontend-typecheck (pull_request) Has been cancelled
2026-06-08 14:47:41 +00:00
gitea-actions[bot]
3b0c61d4b0 chore: update CHANGELOG.md for v1.1.0 [skip ci] 2026-06-08 02:49:25 +00:00
0d7534d8d9 Merge pull request 'fix(kube): add two-stage test connection diagnostics' (#83) from fix/kube-test-connection-diagnostics into master
Some checks failed
Auto Tag / wiki-sync (push) Successful in 10s
Test / frontend-tests (push) Successful in 1m45s
Test / rust-fmt-check (push) Failing after 20m24s
Auto Tag / build-windows-amd64 (push) Successful in 13m2s
Auto Tag / changelog (push) Successful in 1m40s
Test / rust-clippy (push) Successful in 21m35s
Test / rust-tests (push) Successful in 24m19s
Auto Tag / build-linux-arm64 (push) Successful in 12m45s
Renovate / renovate (push) Failing after 17s
Auto Tag / autotag (push) Successful in 8s
Test / frontend-typecheck (push) Successful in 1m36s
Auto Tag / build-linux-amd64 (push) Successful in 10m44s
Auto Tag / build-macos-arm64 (push) Successful in 4m8s
Reviewed-on: #83
2026-06-08 02:33:00 +00:00
Shaun Arman
d331e9c7c7 fix(ui): correct font contrast and background colors in dark mode
All checks were successful
Test / frontend-tests (pull_request) Successful in 1m38s
Test / frontend-typecheck (pull_request) Successful in 1m40s
Test / rust-fmt-check (pull_request) Successful in 14m53s
Test / rust-tests (pull_request) Successful in 18m2s
Test / rust-clippy (pull_request) Successful in 15m46s
PR Review Automation / review (pull_request) Successful in 3m46s
Replace hardcoded light-mode Tailwind colors with dark: variants
across six components. Issues that broke readability:

- PiiDiffViewer / Security: toggle knob was bg-white (invisible on
  bg-muted in dark mode) -> bg-background
- ImageGallery: thumbnail container, filename labels, alert banners,
  and modal chrome all used hardcoded gray/white backgrounds with dark
  text; added full dark: variants throughout
- ShellExecution TIER_CONFIG: tier cards used bg-green/yellow/red-50
  (near-white) with dark text; added dark:bg-*-950/30 backgrounds and
  light text for all three tiers
- ShellApprovalModal: tier 2 badge hardcoded bg-yellow-50/text-yellow-700;
  added dark: variants
- LogUpload: PII warning alert used bg-amber-50/text-amber-800; added
  dark:bg-amber-900/20 and lighter text for dark mode
2026-06-07 21:30:50 -05:00
Shaun Arman
5e5f167538 security(kube): restrict temp kubeconfig files to owner-only permissions
Some checks failed
Test / rust-tests (pull_request) Has been cancelled
Test / rust-clippy (pull_request) Has been cancelled
PR Review Automation / review (pull_request) Successful in 3m39s
Test / frontend-tests (pull_request) Successful in 1m39s
Test / frontend-typecheck (pull_request) Successful in 1m47s
Test / rust-fmt-check (pull_request) Has been cancelled
Add write_secure_temp_file() helper that creates files with mode 0600
on Unix (owner read/write only) instead of the default 0644
(world-readable). All 41 temp kubeconfig write sites updated.

Kubeconfig files contain cluster credentials; world-readable temp files
would expose them to any local user on the system.
2026-06-07 21:26:46 -05:00
Shaun Arman
590baf0059 fix(kube): add two-stage diagnostics to test_kubectl_connection
Some checks failed
PR Review Automation / review (pull_request) Has been cancelled
Test / rust-tests (pull_request) Has been cancelled
Test / rust-clippy (pull_request) Has been cancelled
Test / rust-fmt-check (pull_request) Has been cancelled
Test / frontend-tests (pull_request) Successful in 1m37s
Test / frontend-typecheck (pull_request) Successful in 1m44s
- Add detect_auth_method() to identify kubeconfig credential type
  (exec plugin, bearer token, inline cert, file-path cert, basic auth)
  and surface warnings when the auth requires an external binary or file
- Split test into Stage 1 (kubectl get --raw=/healthz, no auth) and
  Stage 2 (kubectl cluster-info, authenticated), so connectivity and
  auth failures are reported distinctly rather than collapsing both
  into opaque memcache.go noise
- Output now includes auth method and per-stage result for faster
  diagnosis of 'server requires credentials' vs unreachable host
2026-06-07 21:21:22 -05:00
gitea-actions[bot]
a3f9a59443 chore: update CHANGELOG.md for v1.1.0 [skip ci] 2026-06-08 01:52:33 +00:00
d65593af1e Merge pull request 'fix(kube): switch to --kubeconfig flag, add Test Connection diagnostic, fix SelectValue label' (#82) from fix/kube-select-label-and-context into master
Some checks failed
Test / frontend-typecheck (push) Successful in 2m1s
Auto Tag / build-linux-amd64 (push) Successful in 10m6s
Auto Tag / build-windows-amd64 (push) Successful in 11m43s
Auto Tag / build-linux-arm64 (push) Successful in 11m41s
Test / rust-fmt-check (push) Successful in 16m8s
Auto Tag / build-macos-arm64 (push) Has been cancelled
Test / rust-clippy (push) Successful in 17m52s
Auto Tag / autotag (push) Successful in 16s
Test / rust-tests (push) Successful in 19m23s
Auto Tag / wiki-sync (push) Successful in 17s
Auto Tag / changelog (push) Successful in 1m41s
Test / frontend-tests (push) Successful in 1m50s
Reviewed-on: #82
2026-06-08 01:50:24 +00:00
fd3b7a8ff6 Merge branch 'master' into fix/kube-select-label-and-context
Some checks failed
PR Review Automation / review (pull_request) Has been cancelled
Test / frontend-tests (pull_request) Has been cancelled
Test / rust-clippy (pull_request) Has been cancelled
Test / frontend-typecheck (pull_request) Has been cancelled
Test / rust-tests (pull_request) Has been cancelled
Test / rust-fmt-check (pull_request) Has been cancelled
2026-06-08 01:50:05 +00:00
Shaun Arman
48292e959e fix(kube): switch to --kubeconfig flag; add Test Connection diagnostic
Some checks failed
PR Review Automation / review (pull_request) Has been cancelled
Test / frontend-typecheck (pull_request) Successful in 1m37s
Test / frontend-tests (pull_request) Successful in 1m39s
Test / rust-fmt-check (pull_request) Successful in 10m45s
Test / rust-clippy (pull_request) Successful in 12m27s
Test / rust-tests (pull_request) Successful in 14m43s
Credential error persists: switch all 40 kubectl invocations from using
KUBECONFIG env var to the explicit --kubeconfig CLI flag. The flag has higher
precedence in kubectl's lookup order and is unambiguous regardless of any
inherited KUBECONFIG env var in the parent process environment.

Also adds test_kubectl_connection Tauri command (runs kubectl cluster-info
with the stored kubeconfig) and a Test button in Settings → Kubeconfig so
the exact kubectl output — context name, exit code, full stdout/stderr — is
visible without needing to inspect tracing logs. This output will reveal
whether the issue is expired certs, a missing exec-auth plugin, wrong context,
or something else entirely.
2026-06-07 20:31:50 -05:00
gitea-actions[bot]
98e2abb463 chore: update CHANGELOG.md for v1.1.0 [skip ci] 2026-06-08 00:57:57 +00:00
7ba927e1a7 Merge pull request 'fix(kube): use current-context for kubectl auth; fix SelectValue label display' (#81) from fix/kube-select-label-and-context into master
Some checks failed
Test / rust-fmt-check (push) Successful in 16m19s
Test / rust-clippy (push) Successful in 17m59s
Test / rust-tests (push) Successful in 20m11s
Auto Tag / autotag (push) Successful in 7s
Auto Tag / wiki-sync (push) Successful in 7s
Auto Tag / changelog (push) Successful in 1m27s
Test / frontend-tests (push) Successful in 1m44s
Test / frontend-typecheck (push) Successful in 1m46s
Auto Tag / build-linux-amd64 (push) Successful in 9m49s
Auto Tag / build-macos-arm64 (push) Has been cancelled
Auto Tag / build-linux-arm64 (push) Successful in 11m58s
Auto Tag / build-windows-amd64 (push) Successful in 12m1s
Reviewed-on: #81
2026-06-08 00:56:19 +00:00
Shaun Arman
a2cff014e9 fix(kube): use current-context for kubectl auth; fix SelectValue label display
Some checks failed
Test / rust-tests (pull_request) Successful in 14m31s
PR Review Automation / review (pull_request) Has been cancelled
Test / frontend-typecheck (pull_request) Successful in 1m35s
Test / frontend-tests (pull_request) Successful in 1m40s
Test / rust-fmt-check (pull_request) Successful in 11m1s
Test / rust-clippy (pull_request) Successful in 12m39s
## kubectl credentials still failing after --context fix

Root cause: both extract_context() (kube.rs) and upload_kubeconfig() (shell.rs)
ignored the kubeconfig's current-context field and always picked contexts[0] from
the contexts array. If a kubeconfig has multiple contexts and current-context
points to entry N>0, we silently used the wrong context — one that may have empty
or expired credentials — causing the 401 "the server has asked for the client to
provide credentials" error on every kubectl call.

Fixes:
- extract_context(): read current-context field first; fall back to contexts[0]
  only when current-context is absent or empty.
- extract_current_context_name(): new helper in kubeconfig.rs using the same
  line-scanner approach as parse_kubeconfig_contexts (no extra dependencies).
- upload_kubeconfig(): use current-context to select the matching context entry
  when storing context name in kubeconfig_files; falls back to first entry.

NOTE: existing kubeconfig rows in the database have the old (wrong) context
stored. Re-uploading kubeconfig files after deploying this build will fix them.

## Cluster dropdown still showing UUID

Root cause: SelectValue rendered ctx.value (the raw UUID passed to SelectItem's
value prop) instead of the display label (SelectItem's children). The custom
Select component had no mechanism to mirror a selected item's children into the
trigger area.

Fix: Select now builds a value→label Map by walking the children tree at render
time (collectLabels). The map is memoised on children. SelectValue reads the
display label from the map; if found, shows the label; otherwise falls back to
the raw value so existing behaviour is preserved for callers that don't need it.
2026-06-07 19:40:53 -05:00
gitea-actions[bot]
e046605ae6 chore: update CHANGELOG.md for v1.1.0 [skip ci] 2026-06-08 00:18:03 +00:00
a9f213abe5 Merge pull request 'fix(kube): correct kubectl context, dialog close, icon visibility, cluster name' (#80) from fix/kube-cluster-connection into master
Some checks are pending
Test / frontend-typecheck (push) Successful in 1m52s
Auto Tag / build-linux-amd64 (push) Successful in 9m37s
Auto Tag / build-linux-arm64 (push) Successful in 11m30s
Auto Tag / build-windows-amd64 (push) Successful in 11m45s
Test / rust-fmt-check (push) Successful in 15m32s
Test / rust-clippy (push) Successful in 17m19s
Auto Tag / build-macos-arm64 (push) Blocked by required conditions
Test / rust-tests (push) Successful in 18m53s
Auto Tag / autotag (push) Successful in 6s
Auto Tag / wiki-sync (push) Successful in 7s
Auto Tag / changelog (push) Successful in 1m34s
Test / frontend-tests (push) Successful in 1m45s
Reviewed-on: #80
2026-06-08 00:16:24 +00:00
8a51fbf269 Merge branch 'master' into fix/kube-cluster-connection
Some checks failed
PR Review Automation / review (pull_request) Has been cancelled
Test / rust-fmt-check (pull_request) Has been cancelled
Test / frontend-tests (pull_request) Has been cancelled
Test / rust-tests (pull_request) Has been cancelled
Test / rust-clippy (pull_request) Has been cancelled
Test / frontend-typecheck (pull_request) Has been cancelled
2026-06-08 00:15:52 +00:00
Shaun Arman
fb55601e3b fix(kube): correct kubectl context, dialog close, icon visibility, cluster name
Some checks failed
Test / rust-tests (pull_request) Successful in 14m38s
PR Review Automation / review (pull_request) Has been cancelled
Test / frontend-tests (pull_request) Successful in 1m50s
Test / frontend-typecheck (pull_request) Successful in 1m56s
Test / rust-fmt-check (pull_request) Successful in 11m10s
Test / rust-clippy (pull_request) Successful in 12m54s
1. kubectl credentials error (41 places in kube.rs)
   Every kubectl invocation used .env("KUBERNETES_CONTEXT", context) which
   is not a real kubectl environment variable — kubectl silently ignores it
   and falls back to whatever current-context is set in the kubeconfig YAML.
   If that context has expired or wrong credentials the auth failure occurs.
   Replaced all 41 instances with .arg("--context").arg(context) so kubectl
   always uses the correct context from the stored kubeconfig.

2. Cluster name still showed UUID (two causes)
   a) Hotbar read from kubernetesStore.clusters (ClusterInfo[]) which is never
      populated by the kubeconfig-based flow — always empty, so selectedCluster
      was always undefined. Removed the Zustand cluster lookup from Hotbar and
      added a clusterName prop passed from KubernetesPage.tsx (selectedConfig?.name).
   b) ClusterOverview fell back to showing raw clusterId UUID when clusterName
      was undefined. Changed subtitle to render conditionally so UUID never shows.

3. Bell dialog had no way to close
   Custom DialogContent had no X button and no backdrop-click handler.
   Added X close button (top-right) and backdrop-click-to-close.

4. Hotbar icons invisible in dark mode
   variant="ghost" only styles hover state with no baseline text color.
   Added className="text-foreground" to all icon-only ghost buttons.
2026-06-07 18:58:16 -05:00
gitea-actions[bot]
5cf1806d64 chore: update CHANGELOG.md for v1.1.0 [skip ci] 2026-06-07 23:33:37 +00:00
a626f053ed Merge pull request 'fix(kube): bridge kubeconfig storage to in-memory cluster map and fix UI issues' (#79) from fix/kube-cluster-connection into master
Some checks failed
Auto Tag / build-linux-amd64 (push) Successful in 9m19s
Auto Tag / build-windows-amd64 (push) Successful in 11m25s
Auto Tag / build-linux-arm64 (push) Successful in 11m34s
Auto Tag / build-macos-arm64 (push) Failing after 10m46s
Test / rust-fmt-check (push) Successful in 15m53s
Test / rust-clippy (push) Successful in 17m33s
Test / rust-tests (push) Successful in 19m2s
Auto Tag / autotag (push) Successful in 7s
Auto Tag / wiki-sync (push) Successful in 7s
Auto Tag / changelog (push) Successful in 1m26s
Test / frontend-typecheck (push) Successful in 1m49s
Test / frontend-tests (push) Successful in 1m46s
Reviewed-on: #79
2026-06-07 23:32:00 +00:00
Shaun Arman
7d8d5bdbba fix(classifier): fix 3 safety bugs, extract const arrays, make tier UI dynamic
All checks were successful
Test / frontend-typecheck (pull_request) Successful in 1m36s
Test / frontend-tests (pull_request) Successful in 1m40s
PR Review Automation / review (pull_request) Successful in 10m27s
Test / rust-fmt-check (pull_request) Successful in 11m4s
Test / rust-clippy (pull_request) Successful in 12m50s
Test / rust-tests (pull_request) Successful in 14m20s
Bug 1 — Dead multi-word tier3 entries / missing single-token commands
  parse_single_command() extracts only the first token as `command`, so
  multi-word entries like "kill -9", "init 0", "service stop" in the tier3
  array never matched. Adding the single-token forms "kill", "pkill",
  "killall", "init" to TIER3_COMMANDS ensures these commands are always
  denied. Removed all dead multi-word entries.

Bug 2 — systemctl Tier 1 special case was dead code
  systemctl was not in tier1_general, so the block that was supposed to
  auto-execute `systemctl status` never ran. Moved systemctl handling into
  its own block (TIER1_SYSTEMCTL_SUBCOMMANDS / TIER2_SYSTEMCTL_SUBCOMMANDS)
  evaluated before the general tier checks. status, is-active, is-enabled,
  list-units, list-unit-files → Tier 1; all others → Tier 2.

Bug 3 — ldapmodify / ldapdelete / ldapadd misclassified as Tier 1
  Both appeared in the old tier1_general and tier2_general arrays; the tier1
  check ran first, so LDAP write operations auto-executed. Removed them from
  tier1. ldapsearch (read-only) remains Tier 1.

Dynamic Safety Architecture UI
  Extracted all tier classification arrays to module-level pub const slices
  (TIER3_COMMANDS, TIER1_KUBECTL_SUBCOMMANDS, etc.) so both the classifier
  logic and a new get_classifier_rules() Tauri command share a single source
  of truth. ShellExecution.tsx now calls getClassifierRulesCmd() on mount and
  renders the actual command lists in collapsible per-tier cards — any change
  to the const arrays is automatically reflected in the UI with no manual
  documentation update needed.

Also fixes the cargo fmt CI failure introduced in the previous commit
(ClusterClient::new call reformatted to a single line).
2026-06-07 18:15:42 -05:00
Shaun Arman
ef3709ffe9 fix(kube): bridge kubeconfig storage to in-memory cluster map and fix UI issues
Some checks failed
PR Review Automation / review (pull_request) Has been cancelled
Test / frontend-tests (pull_request) Successful in 1m37s
Test / frontend-typecheck (pull_request) Successful in 1m46s
Test / rust-fmt-check (pull_request) Failing after 10m52s
Test / rust-clippy (pull_request) Successful in 12m34s
Test / rust-tests (pull_request) Successful in 14m8s
Resolves four bugs in the Kubernetes management interface:

1. **Cluster not found error** - commands/kube.rs::list_nodes (and all other
   kube resource commands) look up clusters from state.clusters (in-memory map)
   which was never populated from the kubeconfig_files table. Add a new
   connect_cluster_from_kubeconfig Tauri command that reads the encrypted
   kubeconfig from the DB, decrypts it, and inserts a ClusterClient into
   state.clusters. Wire it into KubernetesPage on initial load and cluster
   change so the in-memory map is always populated before any kube command runs.

2. **Dropdown selection has no effect** - same root cause as #1; activating a
   kubeconfig only updated the DB flag but never loaded the client into memory.
   handleClusterChange now calls connectClusterFromKubeconfigCmd after activation.

3. **GUID shown instead of cluster name** - ClusterOverview displayed the raw
   internal UUID as the page subtitle. Now accepts a clusterName prop (populated
   from kubeconfig.context) and renders that instead. ClusterDetails similarly
   changed to show kubeconfig.context in the header, not the UUID.

4. **Bell icon not clickable** - Hotbar bell button had no onClick handler. Add
   optional onNotifications / notificationCount props; badge count is now dynamic
   rather than hardcoded. KubernetesPage wires up a notifications dialog showing
   active cluster context and a link to the Events section.

All changes follow TDD: failing tests written first, then implementation.
2026-06-07 17:39:07 -05:00
Shaun Arman
687d9f3466 chore: remove internal migration entry from CHANGELOG.md [skip ci] 2026-06-07 17:20:29 -05:00
Shaun Arman
2a81353778 fix(ci): exclude internal migration commits from changelog
Add skip rules for the initial full-copy/sanitization commits so they
never appear in generated release notes or CHANGELOG.md.
2026-06-07 17:19:17 -05:00
gitea-actions[bot]
8b6e349585 chore: update CHANGELOG.md for v1.1.0 [skip ci] 2026-06-07 22:09:19 +00:00
Shaun Arman
e703d2da59 fix(ci): generate per-release changelog body using positional range arg
All checks were successful
Test / rust-fmt-check (push) Successful in 16m7s
Test / rust-clippy (push) Successful in 17m39s
Test / rust-tests (push) Successful in 19m11s
Auto Tag / autotag (push) Successful in 12s
Auto Tag / wiki-sync (push) Successful in 15s
Auto Tag / changelog (push) Successful in 1m28s
Auto Tag / build-macos-arm64 (push) Successful in 8m47s
Test / frontend-typecheck (push) Successful in 1m54s
Test / frontend-tests (push) Successful in 1m44s
Auto Tag / build-linux-amd64 (push) Successful in 9m59s
Auto Tag / build-windows-amd64 (push) Successful in 11m47s
Auto Tag / build-linux-arm64 (push) Successful in 12m3s
git-cliff's --tag flag sets the display label for unreleased commits;
it does not scope commits to a range. Passing a range string to --tag
caused git-cliff to emit the full cumulative history for every release.

Move the revision range from --tag to a positional argument so only
commits between PREV_TAG and CURRENT_TAG appear in each release body.
CHANGELOG.md generation is unaffected (still full history).
2026-06-07 17:06:48 -05:00
gitea-actions[bot]
55a9f286e3 chore: update CHANGELOG.md for v1.1.0 [skip ci] 2026-06-07 22:02:54 +00:00
c87e5f0f91 Merge pull request 'feat(kubernetes): implement Lens Desktop v5 feature-parity UI' (#78) from feature/kubernetes-management-v2 into master
Some checks failed
Test / rust-fmt-check (push) Has been cancelled
Test / rust-tests (push) Has been cancelled
Auto Tag / build-macos-arm64 (push) Blocked by required conditions
Test / rust-clippy (push) Has been cancelled
Auto Tag / autotag (push) Successful in 6s
Auto Tag / wiki-sync (push) Successful in 9s
Auto Tag / changelog (push) Successful in 1m28s
Test / frontend-typecheck (push) Successful in 1m40s
Test / frontend-tests (push) Successful in 1m42s
Auto Tag / build-linux-amd64 (push) Has been cancelled
Auto Tag / build-windows-amd64 (push) Has been cancelled
Auto Tag / build-linux-arm64 (push) Has been cancelled
Reviewed-on: #78
2026-06-07 22:01:20 +00:00
Shaun Arman
316f5250b6 ci(pr-review): switch LLM model to qwen36-35b-a3b-nvfp4
Some checks failed
Test / rust-tests (pull_request) Successful in 14m12s
PR Review Automation / review (pull_request) Has been cancelled
Test / frontend-typecheck (pull_request) Successful in 1m41s
Test / frontend-tests (pull_request) Successful in 1m40s
Test / rust-fmt-check (pull_request) Successful in 11m20s
Test / rust-clippy (pull_request) Successful in 12m31s
2026-06-07 16:42:47 -05:00
Shaun Arman
3f4869af01 feat(kubernetes): implement Lens Desktop v5 feature-parity UI
Some checks failed
PR Review Automation / review (pull_request) Has been cancelled
Test / frontend-typecheck (pull_request) Has been cancelled
Test / rust-clippy (pull_request) Has been cancelled
Test / frontend-tests (pull_request) Has been cancelled
Test / rust-fmt-check (pull_request) Has been cancelled
Test / rust-tests (pull_request) Has been cancelled
Complete overhaul of the Kubernetes management page from a basic config
panel into a full Lens-style IDE shell with 26 resource types, real-time
data, and a comprehensive test suite.

Layout & navigation:
- Rewrite KubernetesPage as a Lens v5-style shell: collapsible sidebar
  (Workloads / Services & Networking / Config & Storage / Access Control /
  Cluster), top hotbar with cluster+namespace selectors, Ctrl+K command
  palette
- All 26 resource types now accessible via sidebar navigation (previously 5)

New resource types (Rust + TypeScript + React):
- StorageClasses, NetworkPolicies, ResourceQuotas, LimitRanges
- 4 new Tauri commands registered in generate_handler![]

Component implementations (replacing stubs with real IPC):
- Terminal: full xterm.js with multi-tab sessions and exec_pod IPC
- YamlEditor: Monaco editor with YAML syntax highlighting
- MetricsChart: recharts LineChart/BarChart
- ClusterOverview: live node/pod/deployment/namespace counts
- ClusterDetails: real kubeconfig + node data
- PodDetail, DeploymentDetail, ServiceDetail, ConfigMapDetail, SecretDetail:
  all connected to real IPC data, zero hardcoded values
- CreateResourceModal, EditResourceModal: wired to createResourceCmd /
  editResourceCmd
- RbacViewer: live data from 4 RBAC IPC commands
- RbacEditor: create roles/cluster-roles via YAML editor
- CommandPalette: 12 real navigation commands, keyboard nav

Dependencies added: xterm@5, xterm-addon-fit, xterm-addon-web-links,
@monaco-editor/react@4, recharts@2

Tooling:
- Replace eslint-plugin-react (incompatible with ESLint 10) with
  @eslint-react/eslint-plugin; fix eslint.config.js for flat config
- Fix pre-existing hoisting lint errors in Security.tsx, PortForwardForm.tsx
- Fix eventBus.ts: replace all `any` generics with `unknown`

Tests: 251 passing across 35 test files (was 94/19)
- 16 new test files covering all new and fixed components (TDD)
- npx tsc --noEmit: 0 errors
- cargo clippy -- -D warnings: 0 warnings
- cargo fmt --check: passes
- eslint src/ --max-warnings 0: 0 issues
2026-06-07 16:41:28 -05:00
gitea-actions[bot]
de79cdca3b chore: update CHANGELOG.md for v1.1.0 [skip ci] 2026-06-07 18:32:01 +00:00
77833f6ee8 Merge pull request 'fix(kubernetes): use kubeconfig files from Settings instead of duplicate cluster management' (#77) from feature/kubernetes-management-v2 into master
Some checks failed
Auto Tag / build-macos-arm64 (push) Failing after 25m47s
Auto Tag / autotag (push) Successful in 16s
Auto Tag / wiki-sync (push) Successful in 17s
Test / frontend-tests (push) Successful in 1m39s
Test / frontend-typecheck (push) Successful in 1m46s
Auto Tag / changelog (push) Successful in 1m57s
Auto Tag / build-linux-amd64 (push) Successful in 9m26s
Auto Tag / build-windows-amd64 (push) Successful in 11m10s
Auto Tag / build-linux-arm64 (push) Successful in 11m20s
Test / rust-fmt-check (push) Successful in 15m31s
Test / rust-clippy (push) Successful in 17m24s
Test / rust-tests (push) Successful in 18m47s
Reviewed-on: #77
2026-06-07 18:28:52 +00:00
2b2bc07954 Merge branch 'master' into feature/kubernetes-management-v2
Some checks failed
Test / rust-clippy (pull_request) Has been cancelled
Test / frontend-typecheck (pull_request) Has been cancelled
Test / frontend-tests (pull_request) Has been cancelled
Test / rust-fmt-check (pull_request) Has been cancelled
Test / rust-tests (pull_request) Has been cancelled
PR Review Automation / review (pull_request) Has been cancelled
2026-06-07 18:28:39 +00:00
Shaun Arman
5b85480608 fix(kubernetes): sync active kubeconfig to store's selectedClusterId
All checks were successful
PR Review Automation / review (pull_request) Successful in 3m31s
Test / frontend-tests (pull_request) Successful in 1m34s
Test / frontend-typecheck (pull_request) Successful in 1m37s
Test / rust-fmt-check (pull_request) Successful in 11m55s
Test / rust-clippy (pull_request) Successful in 12m56s
Test / rust-tests (pull_request) Successful in 13m59s
- Update handleActivateKubeconfig to call setSelectedCluster after activation
- ResourceBrowser now loads resources for the activated kubeconfig's cluster
- All tests passing, build successful
2026-06-07 12:29:39 -05:00
Shaun Arman
e928011839 fix(kubernetes): use kubeconfig files from Settings instead of duplicate cluster management
Some checks failed
Test / frontend-tests (pull_request) Successful in 1m28s
Test / frontend-typecheck (pull_request) Successful in 1m34s
PR Review Automation / review (pull_request) Successful in 3m42s
Test / rust-tests (pull_request) Has been cancelled
Test / rust-fmt-check (pull_request) Has been cancelled
Test / rust-clippy (pull_request) Has been cancelled
- Remove duplicate 'Add Cluster' button and modal
- Remove duplicate 'Start Port Forward' button and modal
- KubernetesPage now uses kubeconfig files from Settings → Kubeconfig
- Clusters section displays kubeconfig files with active indicator
- Port forwarding section shows active port forwards without duplicate controls
- All tests passing, build successful
2026-06-07 12:19:08 -05:00
gitea-actions[bot]
6703fed6e0 chore: update CHANGELOG.md for v1.1.0 [skip ci] 2026-06-07 16:54:18 +00:00
1d108ed4a9 Merge pull request 'feat(kubernetes): implement Phase 7 - Real-time updates with Lens Desktop v5.x feature parity' (#76) from feature/kubernetes-management-v2 into master
Some checks failed
Auto Tag / autotag (push) Successful in 14s
Auto Tag / wiki-sync (push) Successful in 20s
Test / frontend-typecheck (push) Successful in 1m46s
Test / frontend-tests (push) Successful in 1m37s
Auto Tag / changelog (push) Successful in 1m41s
Auto Tag / build-linux-amd64 (push) Successful in 9m44s
Auto Tag / build-windows-amd64 (push) Successful in 11m52s
Auto Tag / build-linux-arm64 (push) Successful in 11m56s
Test / rust-fmt-check (push) Successful in 16m26s
Test / rust-clippy (push) Successful in 17m53s
Test / rust-tests (push) Successful in 19m26s
Auto Tag / build-macos-arm64 (push) Failing after 20m24s
Reviewed-on: #76
2026-06-07 16:52:11 +00:00
Shaun Arman
91b6bf3d90 ci(pr-review): fetch existing PR comments before LLM analysis
Some checks failed
PR Review Automation / review (pull_request) Has been cancelled
Test / rust-tests (pull_request) Has been cancelled
Test / frontend-typecheck (pull_request) Has been cancelled
Test / frontend-tests (pull_request) Has been cancelled
Test / rust-clippy (pull_request) Has been cancelled
Test / rust-fmt-check (pull_request) Has been cancelled
Add a new 'Fetch PR comment history' step that pulls both review posts
and issue comments from the Gitea API before the LLM is called.
The full comment history is injected into the prompt with an explicit
instruction to silently discard any finding already marked as invalid,
acknowledged as intentional, or confirmed fixed in a prior round.
This prevents the reviewer from repeatedly raising refuted findings
across successive push events on the same PR.
2026-06-07 11:47:28 -05:00
Shaun Arman
468a69d89e fix(kubernetes): remove redundant TS cast and fix cargo fmt failures
All checks were successful
Test / frontend-tests (pull_request) Successful in 1m28s
Test / frontend-typecheck (pull_request) Successful in 1m36s
PR Review Automation / review (pull_request) Successful in 4m1s
Test / rust-fmt-check (pull_request) Successful in 10m59s
Test / rust-clippy (pull_request) Successful in 12m49s
Test / rust-tests (pull_request) Successful in 14m17s
- Remove redundant `as Set<ResourceType>` cast in kubernetesStore initial
  state; the generic parameter already constrains the type
- Reformat watcher.rs vec! literal and Watcher::new call to satisfy
  rustfmt line-length rules (CI was failing cargo fmt --check)
2026-06-07 11:37:17 -05:00
Shaun Arman
8753a05a04 fix(kubernetes): address PR #76 review findings
Some checks failed
Test / frontend-tests (pull_request) Successful in 1m35s
Test / frontend-typecheck (pull_request) Successful in 1m43s
PR Review Automation / review (pull_request) Successful in 4m12s
Test / rust-fmt-check (pull_request) Failing after 11m14s
Test / rust-clippy (pull_request) Successful in 12m46s
Test / rust-tests (pull_request) Successful in 13m56s
- Remove duplicate state.inner() calls in subscribe_to_k8s_events and
  subscribe_to_all_k8s_events (copy-paste error)
- Share all AppState Arc fields in OAuth callback task — clusters,
  port_forwards, refresh_registry, and watchers were previously
  constructed as fresh isolated instances instead of being cloned from
  the live AppState
- Replace infinite sleep loop in Watcher::start with an immediate
  warn-and-return, preventing Tokio thread leaks from stub watchers
2026-06-07 11:20:57 -05:00
Shaun Arman
664aeaafad docs: update documentation for Kubernetes Management UI
Some checks failed
Test / frontend-tests (pull_request) Successful in 1m29s
Test / frontend-typecheck (pull_request) Successful in 1m38s
PR Review Automation / review (pull_request) Successful in 3m58s
Test / rust-clippy (pull_request) Has been cancelled
Test / rust-fmt-check (pull_request) Has been cancelled
Test / rust-tests (pull_request) Has been cancelled
- Add ADR-010: Kubernetes Management UI with Lens Desktop v5.x feature parity
- Add Kubernetes-Management.md wiki page
- Update CHANGELOG.md with Phase 7 features
- Update README.md with kubernetesStore and components
- Update docs/architecture/README.md with ADR-010
- Fix build issues: downgrade tailwindcss v4 to v3, add vite-env.d.ts, fix tsconfig
- All 114 frontend tests passing, 331 Rust tests passing, build successful
2026-06-07 11:09:22 -05:00
Shaun Arman
e51bfc4ce9 feat(kubernetes): implement Phase 7 - real-time updates
- Add event bus (src/lib/eventBus.ts) for frontend event handling
- Add watcher module (src-tauri/src/kube/watcher.rs) for K8s resource watching
- Add backend commands: subscribe_to_k8s_events, subscribe_to_all_k8s_events, unsubscribe_from_k8s_events
- Add watchers field to AppState for tracking active watchers
- Update mod.rs to export watcher module
- All tests pass, build successful
2026-06-07 10:53:18 -05:00
Shaun Arman
512feb5e49 feat(kubernetes): implement Phase 3 - detail views and cluster management
- Add detail views: PodDetail, DeploymentDetail, ServiceDetail, ConfigMapDetail, SecretDetail
- Add cluster management views: ClusterOverview, ClusterDetails
- Add UX components: Hotbar, CommandPalette, Toast, LoadingSpinner
- Add resource management: CreateResourceModal, EditResourceModal
- Add RBAC management: RbacViewer, RbacEditor
- Update index.tsx exports for all new components
- All components pass ESLint, TypeScript, and pass 114 tests
- Build successful
2026-06-07 10:43:20 -05:00
Shaun Arman
a3da4f5ce7 feat(kubernetes): implement Phase 1 & 2: resource discovery UIs and advanced features
- Add kubernetesStore.ts with Zustand state management (clusters, namespaces, resources, terminals, search, bulk selection)
- Create 15 resource list components (Secret, ReplicaSet, Job, CronJob, Ingress, PVC, PV, ServiceAccount, Role, ClusterRole, RoleBinding, ClusterRoleBinding, HPA, Node, Event, ConfigMap)
- Add advanced components (Terminal, YamlEditor, MetricsChart, SearchBar, ContextSwitcher, ApplicationView, PodDetail)
- Update KubernetesPage.tsx to integrate kubernetesStore and add cluster management
- Add ContextInfo and ResourceInfo types to tauriCommands.ts
- All components pass ESLint, TypeScript, and pass 114 tests
- Build successful
2026-06-07 10:24:26 -05:00
gitea-actions[bot]
e9db4e2fd0 chore: update CHANGELOG.md for v1.1.0 [skip ci] 2026-06-07 05:57:30 +00:00
Shaun Arman
d2f1333c09 fix: use public Gitea URL in test workflow
Some checks failed
Auto Tag / autotag (push) Successful in 10s
Auto Tag / wiki-sync (push) Successful in 13s
Test / frontend-tests (push) Successful in 1m32s
Test / frontend-typecheck (push) Successful in 1m39s
Auto Tag / changelog (push) Successful in 1m49s
Auto Tag / build-macos-arm64 (push) Successful in 2m43s
Auto Tag / build-linux-amd64 (push) Successful in 9m41s
Renovate / renovate (push) Failing after 2m6s
Auto Tag / build-windows-amd64 (push) Successful in 11m52s
Auto Tag / build-linux-arm64 (push) Successful in 11m52s
Test / rust-fmt-check (push) Successful in 16m48s
Test / rust-clippy (push) Successful in 18m21s
Test / rust-tests (push) Successful in 19m49s
- Replace internal 172.0.0.29:3000 URL with public gogs.tftsr.com URL
- This allows CI runners to access the repository
2026-06-07 00:55:02 -05:00