Skip to content

v0.9.1

Choose a tag to compare

@BinaryHB0916 BinaryHB0916 released this 13 May 10:45
· 12 commits to main since this release
62be319

Fixed

  • install.sh / bootstrap.sh API rate-limit fallback — Both scripts called api.github.com/repos/$REPO/releases/latest to resolve the latest release. The unauthenticated GitHub REST endpoint allows only 60 requests/hour/IP, so on shared IPs (corporate proxies, VPNs, NAT pools) the call returned HTTP 403 even when releases existed. The previous fallback path treated empty API responses as "no releases at all" and then re-hit the same rate-limited endpoint from install.sh, producing a contradictory Error: Could not determine version. Use bootstrap.sh to install: message to users who had already used bootstrap.sh. Added a two-stage resolver in both scripts: api.github.com (canonical) → raw.githubusercontent.com/$REPO/main/VERSION (CDN fallback, not subject to API rate limits, kept in sync by every /release-isparto run) → install-from-main-unverified (last resort). Affected users on rate-limited IPs now see the upgrade succeed transparently.

  • install.sh:48 version_lt() BSD sort portability — The semver comparator used sort -V, a feature only available in BSD sort from macOS Big Sur (11.0, 2020) onward. Replaced with pure-bash field-by-field MAJOR.MINOR.PATCH numeric comparison plus lexicographic pre-release tail; preserves the existing semver-regression guard (e.g. 0.10.0 > 0.9.0) without depending on sort feature levels. Closes Backlog FR-51.

  • lib/patch-settings.py portable hook command + equivalence-based dedupinstall.sh expanded $HOME at install time when composing the Bash hook command written to ~/.claude/settings.json, baking the installer's user-specific absolute path (/Users/<install-time-user>/.isparto/...) into the registered command string. When the settings file was shared across Macs (iCloud Drive symlink, scp, Migration Assistant), the absolute path was broken on the receiving Mac and produced No such file or directory hook noise on every Bash tool invocation. Compounded by lib/patch-settings.py's string-exact command == hook_cmd dedup (different absolute paths looked distinct → both kept) and its cleanup-only-for-WORKFLOW_MATCHERS scope (the Bash matcher's stale entries were never audited), causing accumulation across reinstalls. Three-layer fix: install.sh:667 now writes a single-quoted literal 'if [ -f "$HOME/.isparto/..." ]; then bash "$HOME/.isparto/..."; fi' that resolves $HOME at hook-execution time rather than install time; lib/patch-settings.py adds an _is_pre_tool_check_hook(cmd) substring helper and rewrites patch_user's Bash-matcher dedup to be semantic-equivalence based (any command containing pre-tool-check.sh is treated as a Process Observer hook registration); patch_user now strips all stale entries and installs exactly one canonical conditional form, preserving non-pre-tool-check.sh hooks unchanged. Idempotent — repeated patch-user invocations after migration produce no file change. Cross-machine deployment note: users whose ~/.claude/settings.json is shared across multiple Macs (iCloud / Dropbox / symlinks) must run ~/.isparto/install.sh --upgrade on EACH Mac before the file converges to a single canonical entry; otherwise the second machine's old install.sh would re-introduce a broken absolute-path entry on its next upgrade and sync it back. Closes Backlog FR-52.

  • Process Observer git-push guard no longer spans compound-command segmentsgit push -u origin <feature-branch> && git checkout main ... is now allowed as a feature-branch push followed by a separate branch switch, while real direct pushes such as git push -u origin main and git push origin HEAD:main remain blocked. Added a --self-test flag to hooks/process-observer/scripts/pre-tool-check.sh with 6 fixtures (3 should-match + 3 should-not-match) covering compound commands, quoted PR-body mentions, and force pushes.