mit einem Klick
sync-viewer-symlinks
// Ensure site/viewer/lib has correct symlinks to src/viewer/assets/lib
// Ensure site/viewer/lib has correct symlinks to src/viewer/assets/lib
Run the end-to-end viewer smoke test (`tests/viewer_smoke.sh`). Spawns `rezolus view` in upload-only, file, A/B, and proxy modes, exercises the API endpoints, and verifies experiment attach/detach. Use after any change touching `src/viewer/` or before opening a viewer-related PR.
Create a feature branch, commit changes, push, and open a PR against iopsystems/rezolus
Create a release PR with version bump and changelog update
| name | sync-viewer-symlinks |
| description | Ensure site/viewer/lib has correct symlinks to src/viewer/assets/lib |
Synchronize symlinks in site/viewer/lib/ so that the site viewer picks up
all shared modules from src/viewer/assets/lib/.
The site viewer (site/viewer/) shares most of its JavaScript and CSS with
the agent viewer (src/viewer/assets/). Shared files are kept as symlinks
in site/viewer/lib/ pointing into src/viewer/assets/lib/. A small set of
site-specific files are standalone (not symlinked).
When new files are added to src/viewer/assets/lib/, the corresponding
symlink in site/viewer/lib/ must be created manually. This skill detects
and fixes any missing symlinks.
These files in site/viewer/lib/ are site-specific and must NOT be replaced
with symlinks:
data.js — site-specific wrapper that imports shared logic from data_base.jsscript.js — site-specific entry pointdashboards.js — site-specific dashboard definitionsviewer_api.js — site-specific API transport layersrc/viewer/assets/lib/data.js is symlinked as site/viewer/lib/data_base.js
(different name, because site has its own data.js wrapper)Scan src/viewer/assets/lib/ recursively for all .js and .css files
For each source file, determine the expected symlink path in
site/viewer/lib/ using these rules:
script.js, viewer_api.js (top-level only)data.js (top-level) → data_base.js symlinkCheck whether the expected symlink exists and points to the correct
target. Compute the relative path from the symlink location back to the
source file (e.g., ../../../src/viewer/assets/lib/charts/chart.js for a
file in site/viewer/lib/charts/).
Create any missing symlinks. Create parent directories if needed. Report each symlink created.
Detect any stale symlinks in site/viewer/lib/ that point to
non-existent source files, and report them (but don't delete without
asking).
Stage newly created symlinks with git add.
Report a summary: how many symlinks checked, how many created, any stale links found.
A Claude Code hook at .claude/settings.json runs
.claude/scripts/pre-commit-check.sh before every git commit. It blocks
the commit if:
site/viewer/lib/src/viewer/dashboard/ or src/viewer/plot.rs files are staged)Both files are git-ignored (.claude/* excluding skills). To set up the
hook on a fresh checkout, create .claude/settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash(git commit*)",
"hooks": [
{
"type": "command",
"command": ".claude/scripts/pre-commit-check.sh",
"timeout": 120
}
]
}
]
}
}
And copy or recreate .claude/scripts/pre-commit-check.sh (see the
existing copy in this repo's working tree for reference).