mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-01 19:25:10 +02:00
4ace0c2f6f
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
13 KiB
13 KiB
Changelog
0.3.6 — 2026-03-14
Added
- E2E observability — heartbeat file (
~/.gstack-dev/e2e-live.json), per-run log directory (~/.gstack-dev/e2e-runs/{runId}/), progress.log, per-test NDJSON transcripts, persistent failure transcripts. All I/O non-fatal. bun run eval:watch— live terminal dashboard reads heartbeat + partial eval file every 1s. Shows completed tests, current test with turn/tool info, stale detection (>10min),--tailfor progress.log.- Incremental eval saves —
savePartial()writes_partial-e2e.jsonafter each test completes. Crash-resilient: partial results survive killed runs. Never cleaned up. - Machine-readable diagnostics —
exit_reason,timeout_at_turn,last_tool_callfields in eval JSON. Enablesjqqueries for automated fix loops. - API connectivity pre-check — E2E suite throws immediately on ConnectionRefused before burning test budget.
is_errordetection —claude -pcan returnsubtype: "success"withis_error: trueon API failures. Now correctly classified aserror_api.- Stream-json NDJSON parser —
parseNDJSON()pure function for real-time E2E progress fromclaude -p --output-format stream-json --verbose. - Eval persistence — results saved to
~/.gstack-dev/evals/with auto-comparison against previous run. - Eval CLI tools —
eval:list,eval:compare,eval:summaryfor inspecting eval history. - All 9 skills converted to
.tmpltemplates — plan-ceo-review, plan-eng-review, retro, review, ship now use{{UPDATE_CHECK}}placeholder. Single source of truth for update check preamble. - 3-tier eval suite — Tier 1: static validation (free), Tier 2: E2E via
claude -p($3.85/run), Tier 3: LLM-as-judge ($0.15/run). Gated byEVALS=1. - Planted-bug outcome testing — eval fixtures with known bugs, LLM judge scores detection.
- 15 observability unit tests covering heartbeat schema, progress.log format, NDJSON naming, savePartial, finalize, watcher rendering, stale detection, non-fatal I/O.
- E2E tests for plan-ceo-review, plan-eng-review, retro skills.
- Update-check exit code regression tests.
test/helpers/skill-parser.ts—getRemoteSlug()for git remote detection.
Fixed
- Browse binary discovery broken for agents — replaced
find-browseindirection with explicitbrowse/dist/browsepath in SKILL.md setup blocks. - Update check exit code 1 misleading agents — added
|| trueto prevent non-zero exit when no update available. - browse/SKILL.md missing setup block — added
{{BROWSE_SETUP}}placeholder. - plan-ceo-review timeout — init git repo in test dir, skip codebase exploration, bump timeout to 420s.
- Planted-bug eval reliability — simplified prompts, lowered detection baselines, resilient to max_turns flakes.
Changed
- Template system expanded —
{{UPDATE_CHECK}}and{{BROWSE_SETUP}}placeholders ingen-skill-docs.ts. All browse-using skills generate from single source of truth. - Enriched 14 command descriptions with specific arg formats, valid values, error behavior, and return types.
- Setup block checks workspace-local path first (for development), falls back to global install.
- LLM eval judge upgraded from Haiku to Sonnet 4.6.
generateHelpText()auto-generated from COMMAND_DESCRIPTIONS (replaces hand-maintained help text).
0.3.3 — 2026-03-13
Added
- SKILL.md template system —
.tmplfiles with{{COMMAND_REFERENCE}}and{{SNAPSHOT_FLAGS}}placeholders, auto-generated from source code at build time. Structurally prevents command drift between docs and code. - Command registry (
browse/src/commands.ts) — single source of truth for all browse commands with categories and enriched descriptions. Zero side effects, safe to import from build scripts and tests. - Snapshot flags metadata (
SNAPSHOT_FLAGSarray inbrowse/src/snapshot.ts) — metadata-driven parser replaces hand-coded switch/case. Adding a flag in one place updates the parser, docs, and tests. - Tier 1 static validation — 43 tests: parses
$Bcommands from SKILL.md code blocks, validates against command registry and snapshot flag metadata - Tier 2 E2E tests via Agent SDK — spawns real Claude sessions, runs skills, scans for browse errors. Gated by
SKILL_E2E=1env var (~$0.50/run) - Tier 3 LLM-as-judge evals — Haiku scores generated docs on clarity/completeness/actionability (threshold ≥4/5), plus regression test vs hand-maintained baseline. Gated by
ANTHROPIC_API_KEY bun run skill:check— health dashboard showing all skills, command counts, validation status, template freshnessbun run dev:skill— watch mode that regenerates and validates SKILL.md on every template or source file change- CI workflow (
.github/workflows/skill-docs.yml) — runsgen:skill-docson push/PR, fails if generated output differs from committed files bun run gen:skill-docsscript for manual regenerationbun run test:evalfor LLM-as-judge evalstest/helpers/skill-parser.ts— extracts and validates$Bcommands from Markdowntest/helpers/session-runner.ts— Agent SDK wrapper with error pattern scanning and transcript saving- ARCHITECTURE.md — design decisions document covering daemon model, security, ref system, logging, crash recovery
- Conductor integration (
conductor.json) — lifecycle hooks for workspace setup/teardown .envpropagation —bin/dev-setupcopies.envfrom main worktree into Conductor workspaces automatically.env.exampletemplate for API key configuration
Changed
- Build now runs
gen:skill-docsbefore compiling binaries parseSnapshotArgsis metadata-driven (iteratesSNAPSHOT_FLAGSinstead of switch/case)server.tsimports command sets fromcommands.tsinstead of declaring inline- SKILL.md and browse/SKILL.md are now generated files (edit the
.tmplinstead)
0.3.2 — 2026-03-13
Fixed
- Cookie import picker now returns JSON instead of HTML —
jsonResponse()referencedurlout of scope, crashing every API call helpcommand routed correctly (was unreachable due to META_COMMANDS dispatch ordering)- Stale servers from global install no longer shadow local changes — removed legacy
~/.claude/skills/gstackfallback fromresolveServerScript() - Crash log path references updated from
/tmp/to.gstack/
Added
- Diff-aware QA mode —
/qaon a feature branch auto-analyzesgit diff, identifies affected pages/routes, detects the running app on localhost, and tests only what changed. No URL needed. - Project-local browse state — state file, logs, and all server state now live in
.gstack/inside the project root (detected viagit rev-parse --show-toplevel). No more/tmpstate files. - Shared config module (
browse/src/config.ts) — centralizes path resolution for CLI and server, eliminates duplicated port/state logic - Random port selection — server picks a random port 10000-60000 instead of scanning 9400-9409. No more CONDUCTOR_PORT magic offset. No more port collisions across workspaces.
- Binary version tracking — state file includes
binaryVersionSHA; CLI auto-restarts the server when the binary is rebuilt - Legacy /tmp cleanup — CLI scans for and removes old
/tmp/browse-server*.jsonfiles, verifying PID ownership before sending signals - Greptile integration —
/reviewand/shipfetch and triage Greptile bot comments;/retrotracks Greptile batting average across weeks - Local dev mode —
bin/dev-setupsymlinks skills from the repo for in-place development;bin/dev-teardownrestores global install helpcommand — agents can self-discover all commands and snapshot flags- Version-aware
find-browsewith META signal protocol — detects stale binaries and prompts agents to update browse/dist/find-browsecompiled binary with git SHA comparison against origin/main (4hr cached).versionfile written at build time for binary version tracking- Route-level tests for cookie picker (13 tests) and find-browse version check (10 tests)
- Config resolution tests (14 tests) covering git root detection, BROWSE_STATE_FILE override, ensureStateDir, readVersionHash, resolveServerScript, and version mismatch detection
- Browser interaction guidance in CLAUDE.md — prevents Claude from using mcp__claude-in-chrome__* tools
- CONTRIBUTING.md with quick start, dev mode explanation, and instructions for testing branches in other repos
Changed
- State file location:
.gstack/browse.json(was/tmp/browse-server.json) - Log files location:
.gstack/browse-{console,network,dialog}.log(was/tmp/browse-*.log) - Atomic state file writes:
.json.tmp→ rename (prevents partial reads) - CLI passes
BROWSE_STATE_FILEto spawned server (server derives all paths from it) - SKILL.md setup checks parse META signals and handle
META:UPDATE_AVAILABLE /qaSKILL.md now describes four modes (diff-aware, full, quick, regression) with diff-aware as the default on feature branchesjsonResponse/errorResponseuse options objects to prevent positional parameter confusion- Build script compiles both
browseandfind-browsebinaries, cleans up.bun-buildtemp files - README updated with Greptile setup instructions, diff-aware QA examples, and revised demo transcript
Removed
CONDUCTOR_PORTmagic offset (browse_port = CONDUCTOR_PORT - 45600)- Port scan range 9400-9409
- Legacy fallback to
~/.claude/skills/gstack/browse/src/server.ts DEVELOPING_GSTACK.md(renamed to CONTRIBUTING.md)
0.3.1 — 2026-03-12
Phase 3.5: Browser cookie import
cookie-import-browsercommand — decrypt and import cookies from real Chromium browsers (Comet, Chrome, Arc, Brave, Edge)- Interactive cookie picker web UI served from the browse server (dark theme, two-panel layout, domain search, import/remove)
- Direct CLI import with
--domainflag for non-interactive use /setup-browser-cookiesskill for Claude Code integration- macOS Keychain access with async 10s timeout (no event loop blocking)
- Per-browser AES key caching (one Keychain prompt per browser per session)
- DB lock fallback: copies locked cookie DB to /tmp for safe reads
- 18 unit tests with encrypted cookie fixtures
0.3.0 — 2026-03-12
Phase 3: /qa skill — systematic QA testing
- New
/qaskill with 6-phase workflow (Initialize, Authenticate, Orient, Explore, Document, Wrap up) - Three modes: full (systematic, 5-10 issues), quick (30-second smoke test), regression (compare against baseline)
- Issue taxonomy: 7 categories, 4 severity levels, per-page exploration checklist
- Structured report template with health score (0-100, weighted across 7 categories)
- Framework detection guidance for Next.js, Rails, WordPress, and SPAs
browse/bin/find-browse— DRY binary discovery usinggit rev-parse --show-toplevel
Phase 2: Enhanced browser
- Dialog handling: auto-accept/dismiss, dialog buffer, prompt text support
- File upload:
upload <sel> <file1> [file2...] - Element state checks:
is visible|hidden|enabled|disabled|checked|editable|focused <sel> - Annotated screenshots with ref labels overlaid (
snapshot -a) - Snapshot diffing against previous snapshot (
snapshot -D) - Cursor-interactive element scan for non-ARIA clickables (
snapshot -C) wait --networkidle/--load/--domcontentloadedflagsconsole --errorsfilter (error + warning only)cookie-import <json-file>with auto-fill domain from page URL- CircularBuffer O(1) ring buffer for console/network/dialog buffers
- Async buffer flush with Bun.write()
- Health check with page.evaluate + 2s timeout
- Playwright error wrapping — actionable messages for AI agents
- Context recreation preserves cookies/storage/URLs (useragent fix)
- SKILL.md rewritten as QA-oriented playbook with 10 workflow patterns
- 166 integration tests (was ~63)
0.0.2 — 2026-03-12
- Fix project-local
/browseinstalls — compiled binary now resolvesserver.tsfrom its own directory instead of assuming a global install exists setuprebuilds stale binaries (not just missing ones) and exits non-zero if the build fails- Fix
chaincommand swallowing real errors from write commands (e.g. navigation timeout reported as "Unknown meta command") - Fix unbounded restart loop in CLI when server crashes repeatedly on the same command
- Cap console/network buffers at 50k entries (ring buffer) instead of growing without bound
- Fix disk flush stopping silently after buffer hits the 50k cap
- Fix
ln -snfin setup to avoid creating nested symlinks on upgrade - Use
git fetch && git reset --hardinstead ofgit pullfor upgrades (handles force-pushes) - Simplify install: global-first with optional project copy (replaces submodule approach)
- Restructured README: hero, before/after, demo transcript, troubleshooting section
- Six skills (added
/retro)
0.0.1 — 2026-03-11
Initial release.
- Five skills:
/plan-ceo-review,/plan-eng-review,/review,/ship,/browse - Headless browser CLI with 40+ commands, ref-based interaction, persistent Chromium daemon
- One-command install as Claude Code skills (submodule or global clone)
setupscript for binary compilation and skill symlinking