Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
43795ca
refactor(status): sweep file conventions — extensionless imports, .ts…
kylebernhardy Jul 13, 2026
5995cea
refactor(status): align the info banner on the accent token
kylebernhardy Jul 13, 2026
f521c67
refactor(status): code-review follow-ups for the conventions sweep
kylebernhardy Jul 14, 2026
c7ea1a3
refactor(status): group imports above spec consts; type bannerStyle a…
kylebernhardy Jul 14, 2026
0600a35
refactor(theme): move useResolvedTheme to src/hooks beside the app th…
kylebernhardy Jul 14, 2026
4011813
fix(applications): bound type-acquisition extra libs so the Monaco wo…
dawsontoth Jul 14, 2026
fc7acd2
perf(applications): skip type acquisition once the extra-lib budget i…
dawsontoth Jul 14, 2026
c72fdd7
refactor(applications): seal the extra-lib budget on aggregate exhaus…
dawsontoth Jul 14, 2026
6abfb7b
fix(preview): make the worktree preview launcher work from a linked w…
dawsontoth Jul 14, 2026
c0df19c
fix(preview): portable node-version sort + strip leading v from .nvmrc
dawsontoth Jul 14, 2026
15aac8c
fix(preview): only report a Node PATH adjustment when one actually ha…
dawsontoth Jul 14, 2026
728c312
feat(status): sync chart crosshairs across panels on a Status tab
kylebernhardy Jul 15, 2026
8b5b419
fix(status): keep the analytics window stable across tab switches; sh…
kylebernhardy Jul 15, 2026
1fc976d
fix(status): include instanceClient in the AnalyticsProvider memo dep…
kylebernhardy Jul 15, 2026
36a349e
feat(status): add KPI stat strip to the Health tab
kylebernhardy Jul 15, 2026
94d8446
fix(status): correct KPI CPU scope summing, placeholder-phase deltas,…
kylebernhardy Jul 15, 2026
f51b7e9
fix(status): unsign zero-rounding deltas, role=img on delta row, skip…
kylebernhardy Jul 15, 2026
4d4ecc1
feat(status): drill into node-pair series from replication heatmap cells
kylebernhardy Jul 15, 2026
db32fb6
perf(status): skip drilldown recompute while the dialog is closed (re…
kylebernhardy Jul 15, 2026
a025778
feat(status): add CSV export beside the chart PNG export buttons
kylebernhardy Jul 15, 2026
a9cf34a
fix(status): gate CSV export on settled data; self-describing heatmap…
kylebernhardy Jul 15, 2026
e91dccf
fix(status): deferred blob-URL revoke, BOM for Excel, tolerant csvFie…
kylebernhardy Jul 15, 2026
cd0d26e
fix(status): stop the freshness watcher updating TimeRangePicker duri…
kylebernhardy Jul 15, 2026
2b34cf2
refactor(status): freshness snapshots as two primitive stores (review)
kylebernhardy Jul 15, 2026
0d40308
fix(status): keep rotated heatmap column labels clear of the cell grid
kylebernhardy Jul 15, 2026
13874f0
fix(status): shorten heatmap axis node names instead of char-truncati…
kylebernhardy Jul 15, 2026
1b7a52b
refactor(status): factor sin/cos out of computeHeaderHeight at the fi…
kylebernhardy Jul 15, 2026
4d1b2fc
fix(status): one shared chart tooltip with short node labels
kylebernhardy Jul 15, 2026
97c5602
fix(status): tooltip only on the hovered chart; disable hover animation
kylebernhardy Jul 15, 2026
4bd488d
fix(status): epoch-align the table-size trend grid for value-sync
kylebernhardy Jul 15, 2026
88971df
fix(status): review fixes — memoize nodeNames, boundary-safe labels, …
kylebernhardy Jul 15, 2026
bc47816
fix(status): shorten node names in the NodeLegend filter chips (#1515)
kylebernhardy Jul 15, 2026
95ab07e
test: fail on render-phase update warnings; smoke-render every regist…
kylebernhardy Jul 15, 2026
fce6944
test: don't shadow a primary assertion failure from the tripwire hook…
kylebernhardy Jul 15, 2026
73968a9
test: address review — derived coverage, real-render tiers, tripwire …
kylebernhardy Jul 15, 2026
d537563
feat(databases): resizable browse-table columns
DavidCockerill Jul 14, 2026
2f0a9d7
feat(databases): drag-to-resize the sidebar
DavidCockerill Jul 14, 2026
2a2cbc5
fix(databases): scope resize handles to opt-in tables
DavidCockerill Jul 14, 2026
b8ccccd
fix(databases): address review — resize UX, sidebar a11y, persist bug
DavidCockerill Jul 14, 2026
a800d0b
fix(databases): widen the sidebar resize hit area
DavidCockerill Jul 14, 2026
6836b65
fix(databases): give the browse sidebar a visible resting edge
dawsontoth Jul 15, 2026
6e5a7b8
fix(databases): don't text-select the column header while resizing
dawsontoth Jul 15, 2026
63c61c1
feat(cluster-ops): instance container-op UI + safe mode + stopped-sta…
DavidCockerill Jul 7, 2026
c5a233e
feat(cluster-ops): cluster-wide container ops + safe-mode pill
DavidCockerill Jul 8, 2026
39395a5
feat(users): resend invite button for pending org users
DavidCockerill Jul 8, 2026
ef6f418
feat(clusters): surface container ops on the overview + card status/s…
DavidCockerill Jul 9, 2026
f864102
fix(studio): address Gemini review — drop double-toasts, guard cluste…
DavidCockerill Jul 9, 2026
b6479f1
fix(studio): drop terminate onError double-toast in ClusterStateMenu
DavidCockerill Jul 9, 2026
c867f3a
fix(studio): address Kris review — safe-mode confirm on instance ops,…
DavidCockerill Jul 16, 2026
5549f74
feat(secrets): pick the scoped component from a cluster-aware picker
dawsontoth Jul 15, 2026
64993da
fix(secrets): tighten component-picker degradation and keyboard nav
dawsontoth Jul 15, 2026
39061af
fix(secrets): consistent commit paths, re-entrancy + aria guards
dawsontoth Jul 16, 2026
ad75d63
feat(users): make removing a user from an organization intuitive
dawsontoth Jul 15, 2026
181f8d0
fix(users): read the 404 status from error.response.status (review)
dawsontoth Jul 15, 2026
752c20f
fix(users): drop autoFocus on the destructive confirm button (review)
dawsontoth Jul 16, 2026
1ba72a7
feat(secrets): teach secrets.subscribe() and link docs in config guid…
dawsontoth Jul 14, 2026
a25dc8f
fix(secrets): guard the subscribe example against unhandled rejections
dawsontoth Jul 14, 2026
edd32de
fix(secrets): render the config docs link at the start of the toolbar
dawsontoth Jul 14, 2026
b69bf7a
chore(deps): update dependency dprint to v0.55.2
renovate[bot] Jul 20, 2026
0ef0383
fix(clusters): hide overlapping version tags in the version picker
dawsontoth Jul 17, 2026
67b1481
fix(clusters): trust the cast type instead of guarding response.value…
dawsontoth Jul 17, 2026
ab99c36
test(clusters): cover the HarperVersions query wiring and dedupe bran…
dawsontoth Jul 17, 2026
9bceaf3
test(clusters): document that a malformed HarperVersions response sur…
dawsontoth Jul 20, 2026
24bc532
chore(deps): update actions/setup-node action to v7
renovate[bot] Jul 20, 2026
eca16ed
fix(deps): update dependency react-dropzone to v17
renovate[bot] Jul 20, 2026
877e2d8
fix(deps): update all non-major dependencies
renovate[bot] Jul 20, 2026
8500080
fix(deps): retarget router-core patch to 1.171.15
dawsontoth Jul 20, 2026
f47ceba
feat(clusters): hide container ops on self-hosted, gate Deployments o…
dawsontoth Jul 20, 2026
dbd04b1
chore(renovate): group pre-1.0 dprint/oxfmt bumps with non-major deps
dawsontoth Jul 20, 2026
d47dab6
fix(renovate): group all pre-1.0 dprint/oxfmt updates
dawsontoth Jul 20, 2026
fc03a9b
fix(browse): handle rows with an undefined primary key (#1199)
dawsontoth Jul 16, 2026
770e2c9
test(browse): cover EditTableRowModal missing-primary-key handling
dawsontoth Jul 16, 2026
2e71295
fix(browse): show a clear message when a row can't be loaded by its p…
dawsontoth Jul 16, 2026
791164b
feat(applications): banner when editor IntelliSense degrades
dawsontoth Jul 16, 2026
5368b7c
fix(applications): reword budget banner — drop the reset claim
dawsontoth Jul 16, 2026
e8d8843
refactor(applications): name the banner's props interface
dawsontoth Jul 16, 2026
625fa88
feat(org-users): show Resend invite in the user detail modal
dawsontoth Jul 21, 2026
424c097
feat(auth): route unverified users to email verification on login
dawsontoth Jul 21, 2026
744de9e
refactor(auth): address PR review on unverified-login flow
dawsontoth Jul 21, 2026
57afe6e
fix(auth): sign out and redirect on 401 from the CM API
DavidCockerill Jul 15, 2026
3cc4de0
fix(auth): guard 401 handler against non-Axios rejection reasons
DavidCockerill Jul 17, 2026
29421bd
fix(auth): scope 401 interceptor away from auth flows; idempotent ins…
DavidCockerill Jul 20, 2026
b5083d8
fix(auth): full local sign-out on 401 + auth-generation guard
DavidCockerill Jul 21, 2026
d92d9d7
feat(fabric-admin): add Fabric Admin section with API token generator
DavidCockerill Jul 16, 2026
483c758
fix(fabric-admin): drop local onError toast to avoid double-toasting
DavidCockerill Jul 17, 2026
1e9f23e
fix(fabric-admin): gate on fabric_admin only; drop extra Navbar subsc…
DavidCockerill Jul 20, 2026
3e2e052
refactor(admin): rename "Fabric Admin" section to "Admin"
DavidCockerill Jul 20, 2026
81b2cd8
fix(admin): keep API token out of MutationCache; test isFabricAdmin b…
DavidCockerill Jul 21, 2026
603dca0
feat: scope cluster version selector to org-deployed versions
Devin-Holland Jul 20, 2026
59fdd97
fix: exclude all of the edited cluster's versions from the picker
Devin-Holland Jul 21, 2026
c34b2be
refactor: address review — org-scoped versions query is required + us…
Devin-Holland Jul 21, 2026
2ccba97
refactor: org-first HarperVersions cache key
Devin-Holland Jul 22, 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
48 changes: 44 additions & 4 deletions .claude/preview-worktree.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ set -e
root="${CLAUDE_PROJECT_DIR:-$PWD}"
cd "$root"

# The main checkout is the source of the shared node_modules / .env.local. CLAUDE_PROJECT_DIR is
# the *current* checkout, which is the worktree itself when we're launched from one — so derive
# the main checkout from git rather than assuming $root is it. (Assuming $root pointed the
# symlinks below at a worktree's own node_modules → a self-referential link → ELOOP on start.)
main_checkout="$(cd "$(dirname "$(git rev-parse --git-common-dir)")" && pwd)"

# Read the target worktree from .claude/preview-cwd (repo-relative). `read` trims surrounding
# whitespace and tolerates a missing trailing newline; fall back to the main checkout when the
# file is absent or empty.
Expand All @@ -35,13 +41,47 @@ fi
# Guard with both -e and -L so an existing real dir/file AND a dangling symlink are left alone
# (a broken symlink passes -e but `ln -s` over it would fail with "File exists").
if [ ! -e node_modules ] && [ ! -L node_modules ]; then
ln -s "$root/node_modules" node_modules
ln -s "$main_checkout/node_modules" node_modules
echo "[preview] Symlinked node_modules from the main checkout." >&2
fi
if [ ! -e .env.local ] && [ ! -L .env.local ] && [ -f "$root/.env.local" ]; then
ln -s "$root/.env.local" .env.local
if [ ! -e .env.local ] && [ ! -L .env.local ] && [ -f "$main_checkout/.env.local" ]; then
ln -s "$main_checkout/.env.local" .env.local
echo "[preview] Symlinked .env.local from the main checkout." >&2
fi

# The preview launcher may inherit an older default Node than pnpm 11 needs (>=22.13). Prefer the
# repo's pinned .nvmrc version; otherwise fall back to the newest installed nvm node >=22.
current_major="$(node -v 2>/dev/null | sed 's/^v//; s/\..*//')"
if [ -z "$current_major" ] || [ "$current_major" -lt 22 ]; then
want=""
[ -f "$root/.nvmrc" ] && want="$(tr -d '[:space:]' < "$root/.nvmrc")"
want="${want#v}" # .nvmrc may write the version with or without a leading `v`.
adjusted=""
if [ -n "$want" ] && [ -d "$HOME/.nvm/versions/node/v${want}/bin" ]; then
PATH="$HOME/.nvm/versions/node/v${want}/bin:$PATH"
adjusted=1
elif [ -d "$HOME/.nvm/versions/node" ]; then
# Newest installed >=22. Portable numeric sort (descending) instead of `sort -V`, which is a
# GNU/newer-BSD extension missing from older `sort` (e.g. stock macOS).
for v in $(ls -1 "$HOME/.nvm/versions/node" | sed 's/^v//' | sort -t. -k1,1rn -k2,2rn -k3,3rn); do
if [ "${v%%.*}" -ge 22 ]; then
PATH="$HOME/.nvm/versions/node/v$v/bin:$PATH"
adjusted=1
break
fi
done
fi
# Only claim an adjustment when PATH actually changed; otherwise warn (pnpm will likely fail).
if [ -n "$adjusted" ]; then
export PATH
echo "[preview] Adjusted PATH to Node $(node -v 2>/dev/null) for pnpm." >&2
else
echo "[preview] Warning: Node $(node -v 2>/dev/null) is older than pnpm 11 needs (>=22.13) and no nvm Node >=22 was found — pnpm may fail." >&2
fi
fi

echo "[preview] Serving $(pwd) on port 5173" >&2
exec pnpm run dev
# node_modules is symlinked from the main checkout; skip pnpm's pre-run deps check so it can't
# try to reinstall/purge it (the workspace state won't match, and a purge would mutate the
# shared checkout). We just want to run the dev script against the already-installed modules.
exec pnpm --config.verify-deps-before-run=false run dev
2 changes: 1 addition & 1 deletion .github/workflows/deploy-dev-with-restart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
- name: Set up pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
- name: Set up pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-prod-with-restart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
- name: Set up pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
- name: Set up pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-stage-with-restart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
- name: Set up pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-stage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
- name: Set up pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/verify-pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- name: Set up pnpm
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
Expand All @@ -38,7 +38,7 @@ jobs:
# Runs on test failure too — coverage is still written thanks to
# reportOnFailure in vitest.config.ts.
if: always()
uses: davelosert/vitest-coverage-report-action@3c054a2d2e2ca45446417ad5d6d5eb33092af8f1 # v2.12.1
uses: davelosert/vitest-coverage-report-action@8b157684c6a6b259b97d45e72b44242865c0f6a5 # v2.12.2
- name: Run lint
run: pnpm lint
- name: Build
Expand Down
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
"@tailwindcss/vite": "^4.0.9",
"@tanstack/react-query": "^5.90.2",
"@tanstack/react-query-devtools": "^5.90.2",
"@tanstack/react-router": "1.170.17",
"@tanstack/react-router": "1.170.18",
"@tanstack/react-router-devtools": "1.167.0",
"@tanstack/react-table": "^8.21.2",
"@types/node": "^24.0.0",
Expand All @@ -73,7 +73,7 @@
"react": "^19.0.0",
"react-complex-tree": "^2.6.1",
"react-dom": "^19.0.0",
"react-dropzone": "^15.0.0",
"react-dropzone": "^17.0.0",
"react-hook-form": "^7.54.2",
"react-markdown": "^10.1.0",
"recharts": "^3.2.1",
Expand Down Expand Up @@ -103,7 +103,7 @@
"dotenv-cli": "^11.0.0",
"dprint": "^0.55.0",
"happy-dom": "^20.9.0",
"harper": "5.1.18",
"harper": "5.1.21",
"husky": "^9.1.7",
"jsdom": "^29.0.0",
"oxlint": "^1.32.0",
Expand All @@ -112,6 +112,6 @@
"vite": "^8.0.0",
"vitest": "^4.0.0"
},
"packageManager": "pnpm@11.11.0",
"packageManager": "pnpm@11.13.1",
"license": "Apache-2.0"
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
diff --git a/dist/cjs/load-matches.cjs b/dist/cjs/load-matches.cjs
index c09976a80c2c112b7dac6f941e643c81eeaf8d52..9858f1f29c91f4e859ad4cf1e586722730c44754 100644
index c09976a..9858f1f 100644
--- a/dist/cjs/load-matches.cjs
+++ b/dist/cjs/load-matches.cjs
@@ -5,6 +5,31 @@ const require_root = require("./root.cjs");
Expand Down Expand Up @@ -148,10 +148,10 @@ index c09976a80c2c112b7dac6f941e643c81eeaf8d52..9858f1f29c91f4e859ad4cf1e5867227
exports.loadRouteChunk = loadRouteChunk;
exports.routeNeedsPreload = routeNeedsPreload;
diff --git a/dist/cjs/router.cjs b/dist/cjs/router.cjs
index b928d955ea81a572f2770baf30bfc9001e4a9011..c9f95fdc964f0bb03474c8b4c3914b73feb61395 100644
index 69080aa..e63a3c7 100644
--- a/dist/cjs/router.cjs
+++ b/dist/cjs/router.cjs
@@ -768,6 +768,7 @@ var RouterCore = class {
@@ -766,6 +766,7 @@ var RouterCore = class {
});
return matches;
} catch (err) {
Expand All @@ -160,7 +160,7 @@ index b928d955ea81a572f2770baf30bfc9001e4a9011..c9f95fdc964f0bb03474c8b4c3914b73
if (err.options.reloadDocument) return;
return await this.preloadRoute({
diff --git a/dist/esm/load-matches.js b/dist/esm/load-matches.js
index bcea2e0d88d037a01b93bf36dd6e643f98028e83..f8253bec33e2b4aba3e412b1195c4cfbb9e68a70 100644
index bcea2e0..f8253be 100644
--- a/dist/esm/load-matches.js
+++ b/dist/esm/load-matches.js
@@ -5,6 +5,31 @@ import { rootRouteId } from "./root.js";
Expand Down Expand Up @@ -310,7 +310,7 @@ index bcea2e0d88d037a01b93bf36dd6e643f98028e83..f8253bec33e2b4aba3e412b1195c4cfb
//# sourceMappingURL=load-matches.js.map
\ No newline at end of file
diff --git a/dist/esm/router.js b/dist/esm/router.js
index 05cd2d21ab580df0956d03e2b4aabb29649edb40..ba24e4a0ef4e7008e3fec5651e6b85b156a01f47 100644
index 7cd17f8..3be3ef9 100644
--- a/dist/esm/router.js
+++ b/dist/esm/router.js
@@ -7,7 +7,7 @@ import { setupScrollRestoration } from "./scroll-restoration.js";
Expand All @@ -322,7 +322,7 @@ index 05cd2d21ab580df0956d03e2b4aabb29649edb40..ba24e4a0ef4e7008e3fec5651e6b85b1
import { composeRewrites, executeRewriteInput, executeRewriteOutput, rewriteBasepath } from "./rewrite.js";
import { createRouterStores } from "./stores.js";
import { createBrowserHistory, parseHref } from "@tanstack/history";
@@ -768,6 +768,7 @@ var RouterCore = class {
@@ -766,6 +766,7 @@ var RouterCore = class {
});
return matches;
} catch (err) {
Expand Down
Loading