bin/repo-sync ports the Alphalink dotfiles repo/repo-reset zsh functions to
bash + zsh on Linux and macOS, for several forges at once: GitLab, GitHub
(+GHES), Gitea/Forgejo, Bitbucket Cloud, via curl + jq (no per-forge CLI).
Tokens live in ~/.config/repos/forges.conf (0600, parsed line by line, never
tracked), written by `repo-sync add`. Cache ~/.cache/repos/list refreshed
at most once a day (mkdir lock: flock is not on macOS), same namespace/project
on two forges kept once, archived and mirrors skipped. Layout
~/repos/<namespace with / as @>/<project>.
rc files: `repo <project> [namespace]` clones on demand and cd's, with
completion (bash compgen, zsh _describe), background refresh at shell start.
install.sh: jq in the apt and brew lists, chmod repo-sync.
Verified: shellcheck + bash -n, zsh -n; stub-curl harness over the four forges
(pagination, dedup, auth headers, lock, stale cache, path/clone); live GitLab
refresh (139 projects, 3s).
VS Code Remote-SSH integrated terminals are non-login interactive shells:
they source ~/.bashrc but never ~/.profile, where the resume menu was wired
(login-scope, BDR-007). The auto-check therefore never fired in the user's
actual environment, even after install.sh.
Source dtach-router from bashrc-linux (every interactive shell) instead, and
turn install.sh's wire_dtach_profile() into unwire_dtach_profile(): it now
strips any stale ~/.profile block so a plain SSH login (which reads ~/.bashrc
via ~/.profile) does not prompt twice. README updated to match.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CN1KSmsuLG6TxSeN5m8xvM
Executing dtach-router broke its return-based interactive guard and
errored on /dev/tty in non-interactive login shells (bash -lc, cron,
scp). It is now sourced via a guarded, idempotent ~/.profile block
(case $- in *i*) ... . dtach-router) installed by wire_dtach_profile(),
which migrates the old execute-based block. Also adds cc (create) and
d (re-summon) aliases to bashrc-linux.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CN1KSmsuLG6TxSeN5m8xvM
The bin/ scripts and pipx CLIs land in ~/.local/bin, which was not on
PATH in either deployed bashrc. Add an idempotent PATH guard to
bashrc-linux and bashrc-osx so dt, claude-provider, pymupdf, etc. are
found after login. Update the install.sh and README notes to match.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Rework install.sh:
- detect OS via uname (Darwin -> bashrc-osx, else bashrc-linux);
remove the {server|linux|arm|osx} argument and bashrc-server
- fix broken /tmp/config paths that made server+osx install no bashrc
- switch #!/bin/sh -> bash, add set -euo pipefail, quote expansions
- clone nerdtree into bundle (was a no-op cp of a dir), drop the
redundant molokai clone (already tracked in vim/colors)
- guard apt-get behind command -v so macOS skips it
- make re-runnable; drop the no-op trailing 'source ~/.bashrc'
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>