spr had no .gitattributes at all, despite shipping ctrl/*.sh and generating
gen/<room>/ctrl/*.sh. A checkout on Windows/WSL rewrites those to CRLF, and a
shell script with CRLF fails as `bad interpreter: /usr/bin/env bash^M` — which
reads as a broken installer rather than a line-ending problem.
Copied verbatim from rig/.gitattributes and deliberately duplicated rather than
shared: rig/ has to carry its own so it survives being handed over alone.
No tracked file in either repo currently has CRLF, so `git add --renormalize .`
rewrote nothing. Landing it now, while that is true, keeps it off the diff of
whatever lands next.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A rig is a copy of rig/ renamed after the environment it models, so its k8s
files spell out a real architecture — the one thing that must not be committed
here. rig/.gitignore already refuses them, but only within rig/: a copy is a
SIBLING of rig/, where that file has no reach. spr had no rule at all, so the
first `git add -A` after the fold would have committed one.
Anchored at the root, and the negation names the full path because `*-rig/` is
unanchored and would otherwise match rig/sample-rig too.
Verified both ways: a file under client-rig/ is ignored, one under
rig/sample-rig/ is not.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Live .env files (with real OAuth secrets) were tracked. Replaced with .env.example
templates. Existing .env files kept on disk so the sample still runs.
NOTE: prior history (8c5deb7, 88c2860) on gitea/main still contains the leaked
GOOGLE_CLIENT_SECRET. Rotate the credential in Google Cloud Console and decide
whether to rewrite history.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Unified google vein with OAuth + Sheets API
- Prefixed vein module loading (vein_google) to avoid pip package shadowing
- Preload pip packages before vein loading
- Added common/auth framework
- Rebranded sbwrapper from Pawprint to Soleprint
- Removed cfg/ from history (now separate repo)
- Keep cfg/standalone/ as sample configuration
- gitignore cfg/amar/ and cfg/dlt/ (private configs)
- Station: Ward -> Station, Cabinet -> Desk, Table -> Desk
- Atlas: Album -> Atlas
- All templates now read from config.json for titles/taglines
- Added shunts.json and plexuses.json data files
- run.py passes system and components to all templates