mirror of
https://github.com/garrytan/gstack.git
synced 2026-10-31 22:14:25 +01:00
* fix(make-pdf,design): real TOC page numbers and anchors; design models move to gpt-5.5 + gpt-image-2 (#2903, #2807) * ci: pin every action to a SHA, Scorecard, checksummed Bun, scoped Codex CLI in the CI image, macOS named-regressions job (#1948, #1706, #1997) * fix(cso,browse): Windows/macOS lease identity, retention skips bad runs, truthful 'not assessed' reports, env.kv false positive, Windows browse spawn fixes (#2894, #2912, #2048, #2637, #2805) * fix(outside-voice): one Codex model precedence for probe and dispatch, bounded timeouts with KILL escalation, probe cache identity, guarded mktemp, skills hidden in nested Codex (#2776, #2914, #2787, #2881, #2847) * feat(setup): install registry, ./setup --status, staged activation, per-scope migrations, host tiers and conformance kit, OpenCode/Hermes fixes, Copilot CLI (experimental), disabled_skills, slimmer CLAUDE.md (#1925, #2879, #2347, #2338, #2626, #2629, #2825, #2015, #393, #1206, #2096) Co-authored-by: Andrey Esipov <61357035+andrey-esipov@users.noreply.github.com> Co-authored-by: Matthew Williams <5863886+ridermw@users.noreply.github.com> Co-authored-by: Rocky Wu <92764750+lolisaigao1234@users.noreply.github.com> * fix(preamble): skills start in worktree-isolated Claude Code sessions — one literal skill-start line, context-recovery helper, no eval in skill blocks, $N token tripwire, honest plan-mode precedence (#2763, #2896, #2851) * fix(setup): per-install renders for renamed, vendored and custom-config installs, space-safe alias roots, per-host /cso launcher path (#1882, #2906) * test: free tests never write the real HOME (home-write tripwire), no orphaned browse daemons, symlinked-TMPDIR (macOS) fixes, gbrain-on-PATH isolation (#2895, #2816, #2829, #2841, #2982, #2911, #2909, #2908, #2910) * chore: integrate wave follow-ups — regenerate all hosts, README model docs, TODOS, touchfiles, duration seeds, Bun 1.3 telemetry test fix, replay fixtures pinned to their recorded bytes * v1.91.14.0: release metadata * test(browse): group-kill cleanup falls back to the leader when macOS returns EPERM for a live group * ci: Codex login steps run under bash (the CI container's default sh rejects pipefail) * fix: full-suite repairs — private state roots for 7 real-HOME writers, truthful home-guard attribution with --attribute-home, gstack-paths shim in ship-hook fixtures, Copilot in team-init probes, test-of-test detector, cookie review fixture pinned to the approved excerpt * fix(windows): LF for Dockerfiles, normalized home-guard exclusions, path.relative fixture containment, ship push test spawn timeouts * test(design-detect): widen the whole-scan budget test's timing margins so a loaded macOS runner can't time out the single-batch call * fix(evals): qa protocol names defined for the judge, async PTY judge so overlapping sessions keep their cleanup deadline, bws setup cases use the standard JUDGE_MS tier * test(pty): the non-blocking judge case is POSIX-only (its fake judge is a shebang script, like the PTY harness it covers) * test(evals): ship-coverage-audit names absolute skill paths, uses Read, and skips the Step 7 artifact nothing consumes (removes the mechanism behind 3 of 4 historical timeouts) * test: deflake terminal-agent concurrent startup (write the placeholder record before spawning, like the product) and qa-evidence resumed pipe (barrier on a full high-water mark instead of a sleep) * fix(design): daemon log stream handles open errors instead of crashing the daemon; shutdown test awaits the stubbed exit * test(evals): skillify checks the product's resolved state root (no GSTACK_HOME bypass), negative cases check every root; tpa shims live outside the agent's cwd and answer consistently * test(evals): coverage-audit detector splits parallel columns at │ rails and [+] groups; coverage prompts name absolute skill paths; TODOs from the gate eval census * fix(plan-eng-review): scope gate always sends the menu (no headless 'Scope pending' exit); PTY harness ends idle turn-ends and API-error panels promptly with a precise diagnostic * test(evals): one position-bound coverage-read rule credits read-only && chains (labels, context ranges, git displays in either order) and still rejects forged output * fix(ship): documentation section has one saved source inserted by cat (never retyped); spawned-marker evidence is the child output; refreshed codex/factory ship goldens * test(docsync): the byte-exact insert positive is POSIX-only (the bash-command observer refuses backslash paths by design) * test(evals): plan-design-with-ui focus-title rule accepts the comma-less 'dimensions or focus' wording (replayed on the captured CI run, negative controls kept) * fix(qa-callers): exploratory preflight says the scope/method Reads come after exploratory.md; design-review scan check credits an executed scan proven by one engine run over the changed files --------- Co-authored-by: Andrey Esipov <61357035+andrey-esipov@users.noreply.github.com> Co-authored-by: Matthew Williams <5863886+ridermw@users.noreply.github.com> Co-authored-by: Rocky Wu <92764750+lolisaigao1234@users.noreply.github.com>
114 lines
4.4 KiB
YAML
114 lines
4.4 KiB
YAML
name: Windows Setup E2E
|
|
|
|
# End-to-end fresh-install gate for Windows. Runs `./setup` on a clean
|
|
# windows-latest checkout and asserts the build completes, binaries
|
|
# resolve via find-browse, and the gstack-paths state root resolves
|
|
# cleanly. Catches Bun shell-parser regressions in package.json's build
|
|
# chain (#1538, #1537, #1530, #1457, #1561) before they reach users.
|
|
#
|
|
# Separate from windows-free-tests.yml because that one runs a curated
|
|
# unit-test subset; this one exercises the install path itself.
|
|
#
|
|
# Runner: GitHub-hosted free windows-latest. ~3-5 min total.
|
|
|
|
on:
|
|
pull_request:
|
|
branches: [main]
|
|
paths:
|
|
- 'package.json'
|
|
- 'scripts/build.sh'
|
|
- 'scripts/write-version-files.sh'
|
|
- 'setup'
|
|
- 'browse/src/cli.ts'
|
|
- 'browse/src/find-browse.ts'
|
|
- 'bin/gstack-paths'
|
|
- '.github/workflows/windows-setup-e2e.yml'
|
|
workflow_dispatch:
|
|
|
|
concurrency:
|
|
# PR-number keyed: head_ref carries no fork prefix, so same-name branches
|
|
# from two forks would share one group and cancel each other's runs.
|
|
group: windows-setup-e2e-${{ github.event.pull_request.number || github.run_id }}
|
|
cancel-in-progress: true
|
|
|
|
# Install-path exercise only — no token writes.
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
windows-setup:
|
|
runs-on: windows-latest
|
|
timeout-minutes: 10
|
|
|
|
steps:
|
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
|
|
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
|
|
with:
|
|
bun-version: 1.4.0
|
|
|
|
# Same lockfile-keyed install cache as windows-free-tests.yml (install
|
|
# was 45s of a 64s job, all network).
|
|
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
|
|
with:
|
|
path: ~/.bun/install/cache
|
|
key: windows-bun-${{ hashFiles('bun.lock') }}
|
|
# A lockfile bump starts from the previous cache instead of cold
|
|
# (restore alone costs ~43s; without this a bump pays it for nothing).
|
|
restore-keys: |
|
|
windows-bun-
|
|
|
|
- name: Configure git identity
|
|
run: |
|
|
git config --global user.email "windows-setup-e2e@gstack.test"
|
|
git config --global user.name "Windows Setup E2E"
|
|
git config --global init.defaultBranch main
|
|
shell: bash
|
|
|
|
- name: Install dependencies
|
|
run: bun install --frozen-lockfile
|
|
shell: bash
|
|
|
|
- name: Run bun run build (the previously-broken path)
|
|
# This is the regression gate. Bun's Windows shell parser rejected
|
|
# multiple constructs the old inline build chain used; the wave
|
|
# moved the build to scripts/build.sh. If this step fails on
|
|
# Windows, the build chain regressed.
|
|
run: bun run build
|
|
shell: bash
|
|
env:
|
|
GSTACK_SKIP_PLAYWRIGHT: '1'
|
|
|
|
- name: Verify binaries exist (with .exe extension on Windows)
|
|
run: |
|
|
set -e
|
|
test -f browse/dist/browse.exe || test -f browse/dist/browse || (echo "MISSING: browse" && exit 1)
|
|
test -f browse/dist/find-browse.exe || test -f browse/dist/find-browse || (echo "MISSING: find-browse" && exit 1)
|
|
test -f design/dist/design.exe || test -f design/dist/design || (echo "MISSING: design" && exit 1)
|
|
test -f bin/gstack-global-discover.exe || test -f bin/gstack-global-discover || (echo "MISSING: gstack-global-discover" && exit 1)
|
|
echo "All binaries present"
|
|
shell: bash
|
|
|
|
- name: Verify find-browse resolves to the .exe variant
|
|
run: |
|
|
set -e
|
|
OUT=$(bun browse/src/find-browse.ts 2>&1) || true
|
|
echo "find-browse output: $OUT"
|
|
# On Windows, find-browse should successfully resolve to a binary,
|
|
# whether or not it has the .exe extension on disk. Empty output
|
|
# or "not found" means the .exe extension resolver regressed.
|
|
echo "$OUT" | grep -qE '(browse\.exe|browse)$' || (echo "find-browse failed to resolve binary on Windows" && exit 1)
|
|
shell: bash
|
|
|
|
- name: Verify gstack-paths state root resolves
|
|
run: |
|
|
set -e
|
|
eval "$(bash bin/gstack-paths)"
|
|
test -n "$GSTACK_STATE_ROOT" || (echo "GSTACK_STATE_ROOT empty" && exit 1)
|
|
test -n "$PLAN_ROOT" || (echo "PLAN_ROOT empty" && exit 1)
|
|
test -n "$TMP_ROOT" || (echo "TMP_ROOT empty" && exit 1)
|
|
echo "GSTACK_STATE_ROOT=$GSTACK_STATE_ROOT"
|
|
echo "PLAN_ROOT=$PLAN_ROOT"
|
|
echo "TMP_ROOT=$TMP_ROOT"
|
|
shell: bash
|