mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-05 16:34:00 +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>
151 lines
8.3 KiB
Cheetah
151 lines
8.3 KiB
Cheetah
## Step 1.5 (dry-run flow): First-run / config-changed validation
|
|
|
|
You are here because the Step 1.5 detection in the skeleton printed `FIRST_RUN`
|
|
or `CONFIG_CHANGED` (a `CONFIRMED` run never reads this section). Nothing has
|
|
been merged or deployed yet.
|
|
|
|
**CONFIG_CHANGED:** Say "Your deploy configuration changed; I'll validate it again."
|
|
**FIRST_RUN:** Say "This is the first run for this project. I'll detect the setup,
|
|
test read-only access, and show you what merge would trigger before asking for approval."
|
|
Both follow 1.5a-e. Explain each check in plain English; nothing deploys in this dry run.
|
|
|
|
### 1.5a: Deploy infrastructure detection
|
|
|
|
Run the deploy configuration bootstrap to detect the platform and settings:
|
|
|
|
{{DEPLOY_BOOTSTRAP}}
|
|
|
|
Parse the output and record: the detected platform, production URL, deploy workflow (if any),
|
|
and any persisted config from CLAUDE.md.
|
|
|
|
### 1.5b: Command validation
|
|
|
|
Test each detected read-only command. Gather staging facts in 1.5c before displaying
|
|
the combined validation table below; no deploy trigger runs during this dry run.
|
|
|
|
```bash
|
|
# Test gh auth (already passed in Step 1, but confirm)
|
|
gh auth status 2>&1 | head -3
|
|
|
|
# Test platform CLI if detected
|
|
# Fly.io: fly status --app {app} 2>/dev/null
|
|
# Heroku: heroku releases --app {app} -n 1 2>/dev/null
|
|
# Vercel: vercel ls 2>/dev/null | head -3
|
|
|
|
# Test production URL reachability
|
|
# curl -sf {production-url} -o /dev/null -w "%{http_code}" 2>/dev/null
|
|
```
|
|
|
|
Run whichever commands are relevant based on the detected platform. Build the results into this table:
|
|
|
|
```
|
|
╔══════════════════════════════════════════════════════════╗
|
|
║ DEPLOY INFRASTRUCTURE VALIDATION ║
|
|
╠══════════════════════════════════════════════════════════╣
|
|
║ Platform: {platform} (from {source}) ║
|
|
║ App: {app name or "N/A"} ║
|
|
║ Prod URL: {url or "not configured"} ║
|
|
║ COMMAND VALIDATION ║
|
|
║ ├─ gh auth status: ✓ PASS ║
|
|
║ ├─ {platform CLI}: ✓ PASS / ⚠ NOT INSTALLED / ✗ FAIL ║
|
|
║ ├─ curl prod URL: ✓ PASS (200 OK) / ⚠ UNREACHABLE ║
|
|
║ └─ deploy workflow: {file or "none detected"} ║
|
|
║ STAGING DETECTION ║
|
|
║ ├─ Staging URL: {url or "not configured"} ║
|
|
║ ├─ Staging workflow: {file or "not found"} ║
|
|
║ └─ Preview deploys: {detected or "not detected"} ║
|
|
║ WHAT WILL HAPPEN ║
|
|
║ 1. Wait for all CI on this head (gstack-ci-gate) ║
|
|
║ 2. Readiness checks and explicit merge approval ║
|
|
║ 3. Merge PR via {merge method} ║
|
|
║ 4. {Wait for deploy workflow / Wait 60s / Skip} ║
|
|
║ 5. {Run canary verification / Skip (no URL)} ║
|
|
║ MERGE METHOD: {squash/merge/rebase} (from repo settings) ║
|
|
║ MERGE QUEUE: {detected / not detected} ║
|
|
╚══════════════════════════════════════════════════════════╝
|
|
```
|
|
|
|
**Validation failures are WARNINGs, not BLOCKERs** (except `gh auth status` which already
|
|
failed at Step 1). If `curl` fails, note "I couldn't reach that URL — might be a network
|
|
issue, VPN requirement, or incorrect address. Health verification is unavailable."
|
|
If platform CLI is not installed, note "The {platform} CLI isn't installed on this machine.
|
|
Platform status is unavailable. HTTP checks can show reachability, not a deployed
|
|
revision; I'll need the configured trigger and its deployment evidence."
|
|
|
|
### 1.5c: Staging detection
|
|
|
|
Check for staging environments in this order:
|
|
|
|
1. **CLAUDE.md persisted config:** Check for a staging URL in the Deploy Configuration section:
|
|
```bash
|
|
grep -i "staging" CLAUDE.md 2>/dev/null | head -3
|
|
```
|
|
|
|
2. **GitHub Actions staging workflow:** Check for workflow files with "staging" in the name or content:
|
|
```bash
|
|
for f in $(find .github/workflows -maxdepth 1 \( -name '*.yml' -o -name '*.yaml' \) 2>/dev/null); do
|
|
[ -f "$f" ] && grep -qiE "staging" "$f" 2>/dev/null && echo "STAGING_WORKFLOW:$f"
|
|
done
|
|
```
|
|
|
|
3. **Vercel/Netlify preview deploys:** Check PR status checks for preview URLs:
|
|
```bash
|
|
gh pr checks "$PR_NUMBER" --repo "$REPO" --json name,state,bucket,link
|
|
```
|
|
Look for check names containing "vercel", "netlify", or "preview" and inspect the
|
|
link for a preview URL. A check-details link is not necessarily the preview itself.
|
|
|
|
Record candidates, not proof that this revision is deployed. Step 3.5 refreshes
|
|
deployment facts on every run, and handles any true staging-first request before merge.
|
|
|
|
### 1.5d: Readiness preview
|
|
|
|
Tell the user: "Before I merge any PR, I run a series of readiness checks — code reviews, tests, documentation, PR accuracy. Let me show you what that looks like for this project."
|
|
|
|
Preview the readiness checks that will run at Step 3.5 (without re-running tests):
|
|
|
|
```bash
|
|
~/.claude/skills/gstack/bin/gstack-review-read 2>/dev/null
|
|
```
|
|
|
|
Show a summary of review status: which reviews have been run, how stale they are.
|
|
Also check if CHANGELOG.md and VERSION have been updated.
|
|
|
|
Explain in plain English: "When I merge, I'll check: has the code been reviewed recently? Do the tests pass? Is the CHANGELOG updated? Is the PR description accurate? If anything looks off, I'll flag it before merging."
|
|
|
|
### 1.5e: Dry-run confirmation
|
|
|
|
Tell the user: "That's everything I detected. Take a look at the table above — does this match how your project actually deploys?"
|
|
|
|
Present the full dry-run results to the user via AskUserQuestion:
|
|
|
|
- **Re-ground:** "First deploy dry-run for [project] on branch [branch]. Above is what I detected about your deploy infrastructure. Nothing has been merged or deployed yet — this is just my understanding of your setup."
|
|
- Show the infrastructure validation table from 1.5b above.
|
|
- List any warnings from command validation, with plain-English explanations.
|
|
- If staging was detected: "I found {url/workflow}. A staging URL does not prove production is held. Before merge I'll check the triggers; afterward I can verify an existing staging deployment, but production may already be live."
|
|
- If no staging was detected: "I didn't find staging. I'll identify what merge triggers before asking you to approve it."
|
|
- **RECOMMENDATION:** Choose A if all validations passed. Choose B if there are issues to fix. Choose C to run /setup-deploy for a more thorough configuration.
|
|
- A) That's right — this is how my project deploys. Let's go. (Completeness: 10/10)
|
|
- B) Something's off — let me tell you what's wrong (Completeness: 10/10)
|
|
- C) I want to configure this more carefully first (runs /setup-deploy) (Completeness: 10/10)
|
|
|
|
**If A:** Say "Setup confirmed. I'll save its fingerprint, skip unchanged dry runs,
|
|
and still refresh deployment facts before each merge approval."
|
|
|
|
Save the deploy config fingerprint so we can detect future changes:
|
|
```bash
|
|
GSTACK_STATE_ROOT=$(~/.claude/skills/gstack/bin/gstack-paths --get GSTACK_STATE_ROOT); : "${GSTACK_STATE_ROOT:?gstack-paths failed; reinstall with ./setup or /gstack-upgrade}"
|
|
{{SLUG_EVAL}}
|
|
mkdir -p "$GSTACK_STATE_ROOT"/projects/$SLUG
|
|
CURRENT_HASH=$(sed -n '/## Deploy Configuration/,/^## /p' CLAUDE.md 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
|
|
WORKFLOW_HASH=$(find .github/workflows -maxdepth 1 \( -name '*deploy*' -o -name '*cd*' \) 2>/dev/null | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
|
|
echo "${CURRENT_HASH}-${WORKFLOW_HASH}" > "$GSTACK_STATE_ROOT"/projects/$SLUG/land-deploy-confirmed
|
|
```
|
|
Continue to Step 2.
|
|
|
|
**If B:** **STOP.** "Tell me what's different about your setup and I'll adjust. You can also run `/setup-deploy` to walk through the full configuration."
|
|
|
|
**If C:** **STOP.** "Running `/setup-deploy` will walk through your deploy platform, production URL, and health checks in detail. It saves everything to CLAUDE.md so I'll know exactly what to do next time. Run `/land-and-deploy` again when that's done."
|
|
|
|
---
|