mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-01 19:25:10 +02:00
dc5e0538e5
* refactor: extract gen-skill-docs into modular resolver architecture Break the 3000-line monolith into 10 domain modules under scripts/resolvers/: types, constants, preamble, utility, browse, design, testing, review, codex-helpers, and index. Each module owns one domain of template generation. The preamble module introduces a 4-tier composition system (T1-T4) so skills only pay for the preamble sections they actually need, reducing token usage for lightweight skills by ~40%. Adds a token budget dashboard that prints after every generation run showing per-skill and total token counts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: tiered preamble — skills only pay for what they use Tag all 23 templates with preamble-tier (T1-T4). Lightweight skills like /browse and /benchmark get a minimal preamble (~40% fewer tokens), while review skills get the full stack. Regenerate all SKILL.md files. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: migrate eval storage to project-scoped paths Move eval results and E2E run artifacts from ~/.gstack-dev/evals/ to ~/.gstack/projects/$SLUG/evals/ so each project's eval history lives alongside its other gstack data. Falls back to legacy path if slug detection fails. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: sync package.json version with VERSION after merge Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add WorktreeManager for isolated test environments Reusable platform module (lib/worktree.ts) that creates git worktrees for test isolation and harvests useful changes as patches. Includes SHA-256 dedup, original SHA tracking for committed change detection, and automatic gitignored artifact copying (.agents/, browse/dist/). 12 unit tests covering lifecycle, harvest, dedup, and error handling. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: integrate worktree isolation into E2E test infrastructure Add createTestWorktree(), harvestAndCleanup(), and describeWithWorktree() helpers to e2e-helpers.ts. Add harvest field to EvalTestEntry for eval-store integration. Register lib/worktree.ts as a global touchfile. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: run Gemini and Codex E2E tests in worktrees Switch both test suites from cwd: ROOT to worktree isolation. Gemini (--yolo) no longer pollutes the working tree. Codex (read-only) gets worktree for consistency. Useful changes are harvested as patches for cherry-picking. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: skip symlinks in copyDirSync to prevent infinite recursion Adversarial review caught that .claude/skills/gstack may be a symlink back to the repo root, causing copyDirSync to recurse infinitely when copying gitignored artifacts into worktrees. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: bump version and changelog (v0.11.12.0) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: relax session-awareness assertion to accept structured options The LLM consistently presents well-formatted A/B choices with pros/cons but doesn't always use the exact string "RECOMMENDATION". Accept case-insensitive "recommend", "option a", "which do you want", or "which approach" as equivalent signals of a structured recommendation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
222 lines
7.5 KiB
Cheetah
222 lines
7.5 KiB
Cheetah
---
|
|
name: setup-deploy
|
|
preamble-tier: 2
|
|
version: 1.0.0
|
|
description: |
|
|
Configure deployment settings for /land-and-deploy. Detects your deploy
|
|
platform (Fly.io, Render, Vercel, Netlify, Heroku, GitHub Actions, custom),
|
|
production URL, health check endpoints, and deploy status commands. Writes
|
|
the configuration to CLAUDE.md so all future deploys are automatic.
|
|
Use when: "setup deploy", "configure deployment", "set up land-and-deploy",
|
|
"how do I deploy with gstack", "add deploy config".
|
|
allowed-tools:
|
|
- Bash
|
|
- Read
|
|
- Write
|
|
- Edit
|
|
- Glob
|
|
- Grep
|
|
- AskUserQuestion
|
|
---
|
|
|
|
{{PREAMBLE}}
|
|
|
|
# /setup-deploy — Configure Deployment for gstack
|
|
|
|
You are helping the user configure their deployment so `/land-and-deploy` works
|
|
automatically. Your job is to detect the deploy platform, production URL, health
|
|
checks, and deploy status commands — then persist everything to CLAUDE.md.
|
|
|
|
After this runs once, `/land-and-deploy` reads CLAUDE.md and skips detection entirely.
|
|
|
|
## User-invocable
|
|
When the user types `/setup-deploy`, run this skill.
|
|
|
|
## Instructions
|
|
|
|
### Step 1: Check existing configuration
|
|
|
|
```bash
|
|
grep -A 20 "## Deploy Configuration" CLAUDE.md 2>/dev/null || echo "NO_CONFIG"
|
|
```
|
|
|
|
If configuration already exists, show it and ask:
|
|
|
|
- **Context:** Deploy configuration already exists in CLAUDE.md.
|
|
- **RECOMMENDATION:** Choose A to update if your setup changed.
|
|
- A) Reconfigure from scratch (overwrite existing)
|
|
- B) Edit specific fields (show current config, let me change one thing)
|
|
- C) Done — configuration looks correct
|
|
|
|
If the user picks C, stop.
|
|
|
|
### Step 2: Detect platform
|
|
|
|
Run the platform detection from the deploy bootstrap:
|
|
|
|
```bash
|
|
# Platform config files
|
|
[ -f fly.toml ] && echo "PLATFORM:fly" && cat fly.toml
|
|
[ -f render.yaml ] && echo "PLATFORM:render" && cat render.yaml
|
|
[ -f vercel.json ] || [ -d .vercel ] && echo "PLATFORM:vercel"
|
|
[ -f netlify.toml ] && echo "PLATFORM:netlify" && cat netlify.toml
|
|
[ -f Procfile ] && echo "PLATFORM:heroku"
|
|
[ -f railway.json ] || [ -f railway.toml ] && echo "PLATFORM:railway"
|
|
|
|
# GitHub Actions deploy workflows
|
|
for f in .github/workflows/*.yml .github/workflows/*.yaml; do
|
|
[ -f "$f" ] && grep -qiE "deploy|release|production|staging|cd" "$f" 2>/dev/null && echo "DEPLOY_WORKFLOW:$f"
|
|
done
|
|
|
|
# Project type
|
|
[ -f package.json ] && grep -q '"bin"' package.json 2>/dev/null && echo "PROJECT_TYPE:cli"
|
|
ls *.gemspec 2>/dev/null && echo "PROJECT_TYPE:library"
|
|
```
|
|
|
|
### Step 3: Platform-specific setup
|
|
|
|
Based on what was detected, guide the user through platform-specific configuration.
|
|
|
|
#### Fly.io
|
|
|
|
If `fly.toml` detected:
|
|
|
|
1. Extract app name: `grep -m1 "^app" fly.toml | sed 's/app = "\(.*\)"/\1/'`
|
|
2. Check if `fly` CLI is installed: `which fly 2>/dev/null`
|
|
3. If installed, verify: `fly status --app {app} 2>/dev/null`
|
|
4. Infer URL: `https://{app}.fly.dev`
|
|
5. Set deploy status command: `fly status --app {app}`
|
|
6. Set health check: `https://{app}.fly.dev` (or `/health` if the app has one)
|
|
|
|
Ask the user to confirm the production URL. Some Fly apps use custom domains.
|
|
|
|
#### Render
|
|
|
|
If `render.yaml` detected:
|
|
|
|
1. Extract service name and type from render.yaml
|
|
2. Check for Render API key: `echo $RENDER_API_KEY | head -c 4` (don't expose the full key)
|
|
3. Infer URL: `https://{service-name}.onrender.com`
|
|
4. Render deploys automatically on push to the connected branch — no deploy workflow needed
|
|
5. Set health check: the inferred URL
|
|
|
|
Ask the user to confirm. Render uses auto-deploy from the connected git branch — after
|
|
merge to main, Render picks it up automatically. The "deploy wait" in /land-and-deploy
|
|
should poll the Render URL until it responds with the new version.
|
|
|
|
#### Vercel
|
|
|
|
If vercel.json or .vercel detected:
|
|
|
|
1. Check for `vercel` CLI: `which vercel 2>/dev/null`
|
|
2. If installed: `vercel ls --prod 2>/dev/null | head -3`
|
|
3. Vercel deploys automatically on push — preview on PR, production on merge to main
|
|
4. Set health check: the production URL from vercel project settings
|
|
|
|
#### Netlify
|
|
|
|
If netlify.toml detected:
|
|
|
|
1. Extract site info from netlify.toml
|
|
2. Netlify deploys automatically on push
|
|
3. Set health check: the production URL
|
|
|
|
#### GitHub Actions only
|
|
|
|
If deploy workflows detected but no platform config:
|
|
|
|
1. Read the workflow file to understand what it does
|
|
2. Extract the deploy target (if mentioned)
|
|
3. Ask the user for the production URL
|
|
|
|
#### Custom / Manual
|
|
|
|
If nothing detected:
|
|
|
|
Use AskUserQuestion to gather the information:
|
|
|
|
1. **How are deploys triggered?**
|
|
- A) Automatically on push to main (Fly, Render, Vercel, Netlify, etc.)
|
|
- B) Via GitHub Actions workflow
|
|
- C) Via a deploy script or CLI command (describe it)
|
|
- D) Manually (SSH, dashboard, etc.)
|
|
- E) This project doesn't deploy (library, CLI, tool)
|
|
|
|
2. **What's the production URL?** (Free text — the URL where the app runs)
|
|
|
|
3. **How can gstack check if a deploy succeeded?**
|
|
- A) HTTP health check at a specific URL (e.g., /health, /api/status)
|
|
- B) CLI command (e.g., `fly status`, `kubectl rollout status`)
|
|
- C) Check the GitHub Actions workflow status
|
|
- D) No automated way — just check the URL loads
|
|
|
|
4. **Any pre-merge or post-merge hooks?**
|
|
- Commands to run before merging (e.g., `bun run build`)
|
|
- Commands to run after merge but before deploy verification
|
|
|
|
### Step 4: Write configuration
|
|
|
|
Read CLAUDE.md (or create it). Find and replace the `## Deploy Configuration` section
|
|
if it exists, or append it at the end.
|
|
|
|
```markdown
|
|
## Deploy Configuration (configured by /setup-deploy)
|
|
- Platform: {platform}
|
|
- Production URL: {url}
|
|
- Deploy workflow: {workflow file or "auto-deploy on push"}
|
|
- Deploy status command: {command or "HTTP health check"}
|
|
- Merge method: {squash/merge/rebase}
|
|
- Project type: {web app / API / CLI / library}
|
|
- Post-deploy health check: {health check URL or command}
|
|
|
|
### Custom deploy hooks
|
|
- Pre-merge: {command or "none"}
|
|
- Deploy trigger: {command or "automatic on push to main"}
|
|
- Deploy status: {command or "poll production URL"}
|
|
- Health check: {URL or command}
|
|
```
|
|
|
|
### Step 5: Verify
|
|
|
|
After writing, verify the configuration works:
|
|
|
|
1. If a health check URL was configured, try it:
|
|
```bash
|
|
curl -sf "{health-check-url}" -o /dev/null -w "%{http_code}" 2>/dev/null || echo "UNREACHABLE"
|
|
```
|
|
|
|
2. If a deploy status command was configured, try it:
|
|
```bash
|
|
{deploy-status-command} 2>/dev/null | head -5 || echo "COMMAND_FAILED"
|
|
```
|
|
|
|
Report results. If anything failed, note it but don't block — the config is still
|
|
useful even if the health check is temporarily unreachable.
|
|
|
|
### Step 6: Summary
|
|
|
|
```
|
|
DEPLOY CONFIGURATION — COMPLETE
|
|
════════════════════════════════
|
|
Platform: {platform}
|
|
URL: {url}
|
|
Health check: {health check}
|
|
Status cmd: {status command}
|
|
Merge method: {merge method}
|
|
|
|
Saved to CLAUDE.md. /land-and-deploy will use these settings automatically.
|
|
|
|
Next steps:
|
|
- Run /land-and-deploy to merge and deploy your current PR
|
|
- Edit the "## Deploy Configuration" section in CLAUDE.md to change settings
|
|
- Run /setup-deploy again to reconfigure
|
|
```
|
|
|
|
## Important Rules
|
|
|
|
- **Never expose secrets.** Don't print full API keys, tokens, or passwords.
|
|
- **Confirm with the user.** Always show the detected config and ask for confirmation before writing.
|
|
- **CLAUDE.md is the source of truth.** All configuration lives there — not in a separate config file.
|
|
- **Idempotent.** Running /setup-deploy multiple times overwrites the previous config cleanly.
|
|
- **Platform CLIs are optional.** If `fly` or `vercel` CLI isn't installed, fall back to URL-based health checks.
|