ruview @ v1409
integrity
- size
- 60.4 MiB
- downloaded
- last checked
release notes
Automated release from CI pipeline
Changes: feat(homecore-ui iter 6): Settings probe-before-persist token validation
CRUD increment 6/6 — closes the sprint. Bearer-token editor now probes /api/config with the new value BEFORE writing it to localStorage, so a typo'd or revoked token can't lock the UI out of the backend.
Three actions:
- Test token probe /api/config, no localStorage write
- Probe & Save probe; write only on 2xx
- Clear remove from localStorage
Inline probe result with sigils: ✓ token accepted (40 ms) — server v0.1.0-alpha.0 ✗ HTTP 401: unauthorized ⋯ probing /api/config…
currently stored: line shows masked + length: dev-…ken (9 chars)
so the operator can see what's persisted without exposing the secret.
Empty input → red border + disabled Test/Save buttons. Bad probes do NOT persist (this is the whole point — never write a token that the backend rejects).
frontend/src/pages/Settings.ts — full rewrite (~190 LOC, +110 vs previous version). No new dependencies.
Browser-verified end-to-end:
- Backend section: Home / 0.1.0-alpha.0 / RUNNING / components OK
- Test token: probe ✓, 40 ms, version reported
- Empty input: buttons disabled + red border
- Probe & Save: persists to localStorage, toast shown,
currently stored:updates to masked new token - Clear: localStorage null,
currently stored: (empty) - 0 unexpected console errors
Note: a clean reload lands on Dashboard (the SPA router has no URL-encoded view yet). The token persistence itself survives reload correctly; route persistence is a small follow-up if you want direct URLs like /?view=settings.
CRUD sprint summary (6/6 runtime-validated): iter 1 Add Entity e7215a16e iter 2 Edit Entity 89190b6c2 iter 3 Delete + DELETE route c0bb6f4fc iter 4 Live validation polish 3f5a7411d iter 5 Call Service 99c78f512 iter 6 Settings probe-before-persist (this)
Co-Authored-By: claude-flow ruv@ruv.net
Docker Image:
ghcr.io/ruvnet/RuView:224689a5bcce61b87ce9f670649569bc2e023f00
download
curl -fL -o v1409.zip https://ratatoskr.space/pkg/ruview/v1409.zip
printf '%s %s\n' '71b32d701e338da75129d311c2d8667f70d8b43e9d6c115e962e86b09cf7c567' 'v1409.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1409.zip"
$out = "v1409.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "71b32d701e338da75129d311c2d8667f70d8b43e9d6c115e962e86b09cf7c567") { throw "sha256 mismatch" }
curl -fL -o v1409.tar.gz https://ratatoskr.space/pkg/ruview/v1409.tar.gz
printf '%s %s\n' '7237012e15ce7e3fac9df3317dbe3a720994f10577790e52115fc610ba313b32' 'v1409.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1409.tar.gz"
$out = "v1409.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "7237012e15ce7e3fac9df3317dbe3a720994f10577790e52115fc610ba313b32") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v1409.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1409.zip
printf '%s %s\n' '71b32d701e338da75129d311c2d8667f70d8b43e9d6c115e962e86b09cf7c567' 'v1409.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1409.zip"
$out = "v1409.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "71b32d701e338da75129d311c2d8667f70d8b43e9d6c115e962e86b09cf7c567") { throw "sha256 mismatch" }
curl -fL -o v1409.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1409.tar.gz
printf '%s %s\n' '7237012e15ce7e3fac9df3317dbe3a720994f10577790e52115fc610ba313b32' 'v1409.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1409.tar.gz"
$out = "v1409.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "7237012e15ce7e3fac9df3317dbe3a720994f10577790e52115fc610ba313b32") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v1409.zip | zip | 60.4 MiB |
blake3-24 19c727b978273fbefdf84906c79b65f85b420c9fb1903817
sha256 71b32d701e338da75129d311c2d8667f70d8b43e9d6c115e962e86b09cf7c567
sha1 d55ddf54e532c7b50689667d2f017bb96b059f60
|
| v1409.tar.gz | tar.gz | 58.7 MiB |
blake3-24 8109e18cdd89a796059037673a87e8e038aaf30653e4f393
sha256 7237012e15ce7e3fac9df3317dbe3a720994f10577790e52115fc610ba313b32
sha1 bb7d6a3a2fde203f4ab610389711f74e21afa014
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v1409.tar.gz"],
integrity = "sha256-cjcBLhXOfj+snfMxfb46cgmU8QV3eQ5SEV/GELoxOzI=",
strip_prefix = "ruview-v1409",
)
.url = "https://ratatoskr.space/pkg/ruview/v1409.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1409.tar.gz"],
integrity = "sha256-cjcBLhXOfj+snfMxfb46cgmU8QV3eQ5SEV/GELoxOzI=",
strip_prefix = "ruview-v1409",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1409.tar.gz",