Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
0ac3f71
fix(session-update): recover a conflicting autostash by its unmerged …
BenjaminDSmithy Oct 9, 2026
e31f606
fix(session-update): trust only git's autostash id; owe setup on a stop
BenjaminDSmithy Oct 14, 2026
4ba05ea
fix(session-update): reap heartbeat and its sleeper on exit
Jesssullivan Oct 15, 2026
59c2a24
test(session-update): repin the lock trap and heartbeat to #3191's cl…
garrytan Oct 15, 2026
6744dd3
fix(session-update): move installs only through gstack-ff-update; ext…
garrytan Oct 15, 2026
1ed7a8d
fix(gstack-upgrade): Step 4 fast-forwards through gstack-ff-update (#…
garrytan Oct 15, 2026
e5ea788
fix(setup.ps1): run under Windows PowerShell 5.1's legacy argument pa…
garrytan Oct 15, 2026
d5b784e
fix(setup): register hooks at the $HOME path when CLAUDE_CONFIG_DIR l…
Brit-juho Oct 14, 2026
b725a44
fix(setup): one sourced helper picks the hook root for setup and gsta…
garrytan Oct 15, 2026
be90d2a
fix(setup): remove 1.31-era unprefixed Cursor skill folders (#3133)
szsunyuan Oct 12, 2026
b32609e
fix(setup): name the skills dir in the flat-name cleanup line (#3133)
garrytan Oct 15, 2026
71574e1
fix(setup): install Chromium with `bun x`, and name exit 127 for what…
garrytan Oct 15, 2026
eb4589c
ci(windows): prove setup.ps1 on PowerShell 5.1 and the held-install r…
garrytan Oct 15, 2026
4763905
test(ff-update): a killed step-4 run fails the status check instead o…
garrytan Oct 15, 2026
e971c6f
ci(windows): the held-install job runs without the bun cache step
garrytan Oct 15, 2026
546793d
test(fixtures): register #3191's heartbeat fixture as free
garrytan Oct 15, 2026
bbc8485
fix(session-update): leave the bun-version-unreadable banner case to …
garrytan Oct 15, 2026
173dd56
fix(setup.ps1): resolve Git Bash in the shared order, with GSTACK_BAS…
garrytan Oct 15, 2026
a2c9bed
fix(setup.ps1): give the empty-argument refusal its result code (SETU…
garrytan Oct 15, 2026
c1c8d64
ci(windows): silence SC2016 on the PowerShell version probe (the $ is…
garrytan Oct 15, 2026
d9bd145
ci(windows-setup): give tar a POSIX path for the spaced checkout
garrytan Oct 16, 2026
4cd8004
ci(windows-setup): dereference symlinks when copying the spaced checkout
garrytan Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
320 changes: 319 additions & 1 deletion .github/workflows/windows-setup-e2e.yml

Large diffs are not rendered by default.

18 changes: 10 additions & 8 deletions bin/gstack-browser-ensure
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
# preflight in every browser skill (scripts/resolvers/browse.ts) runs this
# helper instead, so the first browser skill run installs it. Probes a
# Chromium launch through Playwright (node when present; Bun cannot launch
# Chromium on Windows) and, when the probe fails, runs `bunx playwright
# install chromium` under the same lock ./setup uses, then re-probes.
# Chromium on Windows) and, when the probe fails, runs `bun x playwright
# install chromium` (not bunx: a winget Bun ships none, #3131) under the same
# lock ./setup uses, then re-probes.
#
# --check probe only; never install (exit 1 when Chromium is unavailable)
# --quiet print only the final line
Expand All @@ -32,7 +33,7 @@ for _arg in "$@"; do
--check) CHECK=1 ;;
--quiet) QUIET=1 ;;
--with-deps) WITH_DEPS="--with-deps" ;;
-h|--help) sed -n '3,25p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
-h|--help) sed -n '3,24p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
*) echo "gstack-browser-ensure: unknown argument '$_arg'" >&2; exit 2 ;;
esac
done
Expand Down Expand Up @@ -78,7 +79,7 @@ fi
probe
[ "$PROBE_RC" -eq 0 ] && ok
[ "$CHECK" -eq 1 ] && fail "Chromium did not launch via $ENGINE ($(first_line "$PROBE_OUT"))" "$ROOT/bin/gstack-browser-ensure (installs Chromium; ~115 MiB)"
command -v bun >/dev/null 2>&1 || fail "Chromium is not installed and bun is not on PATH to install it" "install Bun, then re-run $0"
BUN=$(command -v bun 2>/dev/null) || fail "Chromium is not installed and bun is not on PATH to install it" "install Bun, then re-run $0"

# Same lock ./setup takes (#2136), so two installs never race on the cache.
LOCK="${TMPDIR:-/tmp}/gstack-playwright-install.lock"
Expand All @@ -102,17 +103,18 @@ log "gstack-browser-ensure: installing Playwright Chromium (one-time, ~115 MiB;
started=$(date +%s)
(
cd "$ROOT"
if [ -n "$OVERRIDE" ]; then PLAYWRIGHT_HOST_PLATFORM_OVERRIDE="$OVERRIDE" bunx playwright install $WITH_DEPS chromium
else bunx playwright install $WITH_DEPS chromium; fi
if [ -n "$OVERRIDE" ]; then PLAYWRIGHT_HOST_PLATFORM_OVERRIDE="$OVERRIDE" "$BUN" x playwright install $WITH_DEPS chromium
else "$BUN" x playwright install $WITH_DEPS chromium; fi
) </dev/null >&2 &
pid=$!
waited=0
while kill -0 "$pid" 2>/dev/null; do
if [ "$waited" -ge "$TIMEOUT" ]; then kill "$pid" 2>/dev/null; wait "$pid" 2>/dev/null; fail "bunx playwright install chromium exceeded ${TIMEOUT}s" "raise GSTACK_PLAYWRIGHT_INSTALL_TIMEOUT=<seconds> and re-run $0"; fi
if [ "$waited" -ge "$TIMEOUT" ]; then kill "$pid" 2>/dev/null; wait "$pid" 2>/dev/null; fail "$BUN x playwright install chromium exceeded ${TIMEOUT}s" "raise GSTACK_PLAYWRIGHT_INSTALL_TIMEOUT=<seconds> and re-run $0"; fi
sleep 1; waited=$((waited + 1))
done
wait "$pid"; rc=$?
[ "$rc" -eq 0 ] || fail "bunx playwright install chromium exited $rc (offline, proxy, or blocked download?)" "fix network access to the Playwright CDN, then re-run $0"
[ "$rc" -ne 127 ] || fail "$BUN x playwright install chromium exited 127 (command not found)" "install Bun from bun.sh (winget Bun ships no bunx), then re-run $0"
[ "$rc" -eq 0 ] || fail "$BUN x playwright install chromium exited $rc (offline, proxy, or blocked download?)" "fix network access to the Playwright CDN, then re-run $0"
log "gstack-browser-ensure: Chromium installed in $(( $(date +%s) - started ))s"
probe
[ "$PROBE_RC" -eq 0 ] && ok
Expand Down
28 changes: 28 additions & 0 deletions bin/gstack-claude-root.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# shellcheck shell=bash
# gstack-claude-root.sh — sourced helper: the stable install root that Claude
# hook commands are registered at (setup's canonical-only rule). Used by setup
# and bin/gstack-memorable so both write the same path into settings.json.
#
# gstack_canonical_claude_root prints ${CLAUDE_CONFIG_DIR:-$HOME/.claude}/skills/gstack,
# or $HOME/.claude/skills/gstack when that
# install exists and the config-dir root is
# missing (the installer writes to $HOME) or
# resolves to the same tree (a per-session
# CLAUDE_CONFIG_DIR whose skills link back to
# $HOME, #3180: only the $HOME spelling
# outlives the session)
#
# Neither answer is the running tree, so canonical-only still holds. No side
# effects; safe under set -u.

gstack_canonical_claude_root() {
local root="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/skills/gstack"
local home_root="$HOME/.claude/skills/gstack"
if [ -x "$home_root/bin/gstack-session-update" ]; then
if [ ! -x "$root/bin/gstack-session-update" ] \
|| [ "$(CDPATH= cd -- "$root" && pwd -P)" = "$(CDPATH= cd -- "$home_root" && pwd -P)" ]; then
root="$home_root"
fi
fi
printf '%s\n' "$root"
}
1 change: 1 addition & 0 deletions bin/gstack-doctor-components.sh
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ gstack_result_anchor() {
RUNTIME_PIN_CONFLICT) printf '%s' 'capy-install-runtime-conflict' ;;
BROWSER_UNAVAILABLE) printf '%s' 'browser-ensure-failed' ;;
INSTALL_PREFLIGHT_FAILED) printf '%s' 'capy-install-preflight-failed' ;;
SETUP_PS1_EMPTY_ARGUMENT) printf '%s' 'setup-ps1-empty-argument' ;;
POLICY_SOURCE_UNAVAILABLE) printf '%s' 'policy-source-unavailable' ;;
POLICY_INVALID) printf '%s' 'policy-invalid' ;;
POLICY_CONTAINMENT) printf '%s' 'policy-containment' ;;
Expand Down
Loading