mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-07 05:56:41 +02:00
c90feac2ca
Contributor mode: - Add "do not truncate" directive to template — agent was stopping after "My rating" without completing Steps/Raw output/What would make this a 10 sections - Restore assertions for Steps to reproduce and Date footer QA quick: - Make test server URL prominent: top of prompt, explicit "already running" and "do NOT discover ports" instructions - Bump session timeout 180s→240s and test timeout 240s→300s - Set B= at top of prompt (was buried in prose) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
154 lines
6.3 KiB
Markdown
154 lines
6.3 KiB
Markdown
---
|
|
name: setup-browser-cookies
|
|
version: 1.0.0
|
|
description: |
|
|
Import cookies from your real browser (Comet, Chrome, Arc, Brave, Edge) into the
|
|
headless browse session. Opens an interactive picker UI where you select which
|
|
cookie domains to import. Use before QA testing authenticated pages.
|
|
allowed-tools:
|
|
- Bash
|
|
- Read
|
|
- AskUserQuestion
|
|
---
|
|
<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
|
|
<!-- Regenerate: bun run gen:skill-docs -->
|
|
|
|
## Preamble (run first)
|
|
|
|
```bash
|
|
_UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true)
|
|
[ -n "$_UPD" ] && echo "$_UPD" || true
|
|
mkdir -p ~/.gstack/sessions
|
|
touch ~/.gstack/sessions/"$PPID"
|
|
_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
|
|
find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true
|
|
_CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true)
|
|
```
|
|
|
|
If output shows `UPGRADE_AVAILABLE <old> <new>`: read `~/.claude/skills/gstack/gstack-upgrade/SKILL.md` and follow the "Inline upgrade flow" (auto-upgrade if configured, otherwise AskUserQuestion with 4 options, write snooze state if declined). If `JUST_UPGRADED <from> <to>`: tell user "Running gstack v{to} (just updated!)" and continue.
|
|
|
|
## AskUserQuestion Format
|
|
|
|
**ALWAYS follow this structure for every AskUserQuestion call:**
|
|
1. Context: project name, current branch, what we're working on (1-2 sentences)
|
|
2. The specific question or decision point
|
|
3. `RECOMMENDATION: Choose [X] because [one-line reason]`
|
|
4. Lettered options: `A) ... B) ... C) ...`
|
|
|
|
If `_SESSIONS` is 3 or more: the user is juggling multiple gstack sessions and context-switching heavily. **ELI16 mode** — they may not remember what this conversation is about. Every AskUserQuestion MUST re-ground them: state the project, the branch, the current plan/task, then the specific problem, THEN the recommendation and options. Be extra clear and self-contained — assume they haven't looked at this window in 20 minutes.
|
|
|
|
Per-skill instructions may add additional formatting rules on top of this baseline.
|
|
|
|
## Contributor Mode
|
|
|
|
If `_CONTRIB` is `true`: you are in **contributor mode**. You're a gstack user who also helps make it better.
|
|
|
|
**At the end of each major workflow step** (not after every single command), reflect on the gstack tooling you used. Rate your experience 0 to 10. If it wasn't a 10, think about why. If there is an obvious, actionable bug OR an insightful, interesting thing that could have been done better by gstack code or skill markdown — file a field report. Maybe our contributor will help make us better!
|
|
|
|
**Calibration — this is the bar:** For example, `$B js "await fetch(...)"` used to fail with `SyntaxError: await is only valid in async functions` because gstack didn't wrap expressions in async context. Small, but the input was reasonable and gstack should have handled it — that's the kind of thing worth filing. Things less consequential than this, ignore.
|
|
|
|
**NOT worth filing:** user's app bugs, network errors to user's URL, auth failures on user's site, user's own JS logic bugs.
|
|
|
|
**To file:** write `~/.gstack/contributor-logs/{slug}.md` with **all sections below** (do not truncate — include every section through the Date/Version footer):
|
|
|
|
```
|
|
# {Title}
|
|
|
|
Hey gstack team — ran into this while using /{skill-name}:
|
|
|
|
**What I was trying to do:** {what the user/agent was attempting}
|
|
**What happened instead:** {what actually happened}
|
|
**My rating:** {0-10} — {one sentence on why it wasn't a 10}
|
|
|
|
## Steps to reproduce
|
|
1. {step}
|
|
|
|
## Raw output
|
|
```
|
|
{paste the actual error or unexpected output here}
|
|
```
|
|
|
|
## What would make this a 10
|
|
{one sentence: what gstack should have done differently}
|
|
|
|
**Date:** {YYYY-MM-DD} | **Version:** {gstack version} | **Skill:** /{skill}
|
|
```
|
|
|
|
Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}"
|
|
|
|
# Setup Browser Cookies
|
|
|
|
Import logged-in sessions from your real Chromium browser into the headless browse session.
|
|
|
|
## How it works
|
|
|
|
1. Find the browse binary
|
|
2. Run `cookie-import-browser` to detect installed browsers and open the picker UI
|
|
3. User selects which cookie domains to import in their browser
|
|
4. Cookies are decrypted and loaded into the Playwright session
|
|
|
|
## Steps
|
|
|
|
### 1. Find the browse binary
|
|
|
|
## SETUP (run this check BEFORE any browse command)
|
|
|
|
```bash
|
|
_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
B=""
|
|
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
|
|
[ -z "$B" ] && B=~/.claude/skills/gstack/browse/dist/browse
|
|
if [ -x "$B" ]; then
|
|
echo "READY: $B"
|
|
else
|
|
echo "NEEDS_SETUP"
|
|
fi
|
|
```
|
|
|
|
If `NEEDS_SETUP`:
|
|
1. Tell the user: "gstack browse needs a one-time build (~10 seconds). OK to proceed?" Then STOP and wait.
|
|
2. Run: `cd <SKILL_DIR> && ./setup`
|
|
3. If `bun` is not installed: `curl -fsSL https://bun.sh/install | bash`
|
|
|
|
### 2. Open the cookie picker
|
|
|
|
```bash
|
|
$B cookie-import-browser
|
|
```
|
|
|
|
This auto-detects installed Chromium browsers (Comet, Chrome, Arc, Brave, Edge) and opens
|
|
an interactive picker UI in your default browser where you can:
|
|
- Switch between installed browsers
|
|
- Search domains
|
|
- Click "+" to import a domain's cookies
|
|
- Click trash to remove imported cookies
|
|
|
|
Tell the user: **"Cookie picker opened — select the domains you want to import in your browser, then tell me when you're done."**
|
|
|
|
### 3. Direct import (alternative)
|
|
|
|
If the user specifies a domain directly (e.g., `/setup-browser-cookies github.com`), skip the UI:
|
|
|
|
```bash
|
|
$B cookie-import-browser comet --domain github.com
|
|
```
|
|
|
|
Replace `comet` with the appropriate browser if specified.
|
|
|
|
### 4. Verify
|
|
|
|
After the user confirms they're done:
|
|
|
|
```bash
|
|
$B cookies
|
|
```
|
|
|
|
Show the user a summary of imported cookies (domain counts).
|
|
|
|
## Notes
|
|
|
|
- First import per browser may trigger a macOS Keychain dialog — click "Allow" / "Always Allow"
|
|
- Cookie picker is served on the same port as the browse server (no extra process)
|
|
- Only domain names and cookie counts are shown in the UI — no cookie values are exposed
|
|
- The browse session persists cookies between commands, so imported cookies work immediately
|