918 -> 138 lines, across five libs plus two data-file payloads. The two generated scripts became data files rather than heredocs. ENTER_EOF alone was 279 lines, so any lib containing it would have been over the cap however the rest was arranged. Both heredocs were quoted, so their bodies were already literal text with no build-time interpolation, and copying them verbatim is exactly equivalent. The payloads are named *.sh.in on purpose. The pre-commit hook globs staged files by '\.(sh|bash|zsh)$', runs shfmt -w on them and re-stages the result -- and shfmt does reformat these bodies. That would have changed their bytes and destroyed the property this split is verified by. The .in extension keeps them out of every .sh-globbing hook without a suppression or an exclude regex. cat + chmod 0755 became a single `install -m 0755`, closing the window the original left between creating the file and making it executable. The load-bearing check: running install_enter_script and install_unlock_script against a scratch directory produces mode-0755 files whose sha256 sums are identical to the copies already deployed in /usr/local/bin on this machine. The split provably emits the exact bytes that are running today, and it touched no system file -- sha256sum -c on both deployed artifacts passes unchanged. help, status and an unknown command are byte-identical to their pre-split baselines. A line-multiset check leaves exactly six lines unaccounted for: the two cat/heredoc openers, the two terminators and the two chmod calls that install -m now performs. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .github | ||
| .hippo | ||
| .vscode | ||
| billsplit | ||
| bucket_catch | ||
| docs | ||
| focus_owner | ||
| kcd2_dice_solver | ||
| linux_configuration | ||
| meta | ||
| phone_focus_mode | ||
| poker-stakes | ||
| python_pkg | ||
| reverse_survivors | ||
| third_party/agent-skills | ||
| .binary-allowlist | ||
| .copilotignore | ||
| .fvmrc | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| .prettierignore | ||
| .shellcheckrc | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| DESIGN_AUDIT_TODO.md | ||
| lint_python.sh | ||
| NEXT_SESSION_PROMPT.md | ||
| pyproject.toml | ||
| README.md | ||
| refactor_claude_todo_resume.md | ||
| refactor_claude_todo.md | ||
| requirements.txt | ||
| run.sh | ||
testsAndMisc
A collection of personal projects, scripts, and experiments — from a GPS-based phone focus tool to Linux/Arch automation, with CI, linting, and pre-commit hooks across the board.
Highlights
Phone Focus Mode
Location-based app restriction for rooted Android. Automatically disables non-whitelisted apps within 500 m of home using ADB + Magisk. Features Haversine distance calculation, hysteresis to prevent toggling, fail-safe unlock, and state persistence. Bash, Android ADB.
Linux Configuration
Automated Arch Linux setup: fresh-install scripts, i3 window manager config, LaTeX environment, and system tests. Includes documentation and test result logging.
Scripts
Utility scripts for development workflows — build file validation, secret detection, and custom makepkg helpers.
Repository Layout
| Path | Description |
|---|---|
python_pkg/ |
Python packages (each maintained subpackage lives here) |
billsplit/ |
Receipt bill-splitting Flutter app — people, groups, per-item assignment, e-paragon import and xlsx export (Dart, 100 % line coverage gate) |
linux_configuration/ |
Arch Linux setup, i3 config, system maintenance scripts |
focus_owner/ |
Device Owner app enforcing focus mode on the unrooted Pixel 6a — geofence + night curfew, hides apps the phone cannot un-hide (Dart/Kotlin) |
phone_focus_mode/ |
GPS-based Android focus enforcer (rooted-era scripts; config.sh is still the policy source of truth for focus_owner/) |
reverse_survivors/ |
Reverse Survivors — React/Vite game where you play the horde against an AI survivor (TypeScript, 100 % coverage gate) |
scripts/ |
Workspace-level helper scripts and pre-commit hooks |
docs/ |
Reference docs and historical reports |
third_party/ |
Vendored upstream skills/agents |
meta/ |
Repo-wide tooling: pyproject.toml, requirements.txt, .pre-commit-config.yaml, run.sh, lint_python.sh, .fvmrc. Symlinked into the repo root so tools that auto-discover from root keep working. |
Archived / unmaintained projects live in the sibling repository
testsAndMisc-archive.
Tooling
- Python linting: Ruff with all rules enabled (see
meta/pyproject.toml) - Dependencies:
pip install -r meta/requirements.txt(combined runtime + dev) - CI: GitHub Actions — lint, build, and test on push
- Testing: pytest (Python), custom shell-based test harness for scripts