mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-02 11:45:20 +02:00
b805aa0113
* feat: add Confusion Protocol to preamble resolver Injects a high-stakes ambiguity gate at preamble tier >= 2 so all workflow skills get it. Fires when Claude encounters architectural decisions, data model changes, destructive operations, or contradictory requirements. Does NOT fire on routine coding. Addresses Karpathy failure mode #1 (wrong assumptions) with an inline STOP gate instead of relying on workflow skill invocation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add Hermes and GBrain host configs Hermes: tool rewrites for terminal/read_file/patch/delegate_task, paths to ~/.hermes/skills/gstack, AGENTS.md config file. GBrain: coding skills become brain-aware when GBrain mod is installed. Same tool rewrites as OpenClaw (agents spawn Claude Code via ACP). GBRAIN_CONTEXT_LOAD and GBRAIN_SAVE_RESULTS NOT suppressed on gbrain host, enabling brain-first lookup and save-to-brain behavior. Both registered in hosts/index.ts with setup script redirect messages. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: GBrain resolver — brain-first lookup and save-to-brain New scripts/resolvers/gbrain.ts with two resolver functions: - GBRAIN_CONTEXT_LOAD: search brain for context before skill starts - GBRAIN_SAVE_RESULTS: save skill output to brain after completion Placeholders added to 4 thinking skill templates (office-hours, investigate, plan-ceo-review, retro). Resolves to empty string on all hosts except gbrain via suppressedResolvers. GBRAIN suppression added to all 9 non-gbrain host configs. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: wire slop:diff into /review as advisory diagnostic Adds Step 3.5 to the review template: runs bun run slop:diff against the base branch to catch AI code quality issues (empty catches, redundant return await, overcomplicated abstractions). Advisory only, never blocking. Skips silently if slop-scan is not installed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add Karpathy compatibility note to README Positions gstack as the workflow enforcement layer for Karpathy-style CLAUDE.md rules (17K stars). Links to forrestchang/andrej-karpathy-skills. Maps each Karpathy failure mode to the gstack skill that addresses it. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: improve native OpenClaw thinking skills office-hours: add design doc path visibility message after writing ceo-review: add HARD GATE reminder at review section transitions retro: add non-git context support (check memory for meeting notes) Mirrors template improvements to hand-crafted native skills. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: update tests and golden fixtures for new hosts - Host count: 8 → 10 (hermes, gbrain) - OpenClaw adapter test: expects undefined (dead code removed) - Golden ship fixtures: updated with Confusion Protocol + vendoring Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: regenerate all SKILL.md files Regenerated from templates after Confusion Protocol, GBrain resolver placeholders, slop:diff in review, HARD GATE reminders, investigation learnings, design doc visibility, and retro non-git context changes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: update project documentation for v0.18.0.0 - CHANGELOG: add v0.18.0.0 entry (Confusion Protocol, Hermes, GBrain, slop in review, Karpathy note, skill improvements) - CLAUDE.md: add hermes.ts and gbrain.ts to hosts listing - README.md: update agent count 8→10, add Hermes + GBrain to table - VERSION: bump to 0.18.0.0 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: sync package.json version to 0.18.0.0 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: extract Step 0 from review SKILL.md in E2E test The review-base-branch E2E test was copying the full 1493-line review/SKILL.md into the test fixture. The agent spent 8+ turns reading it in chunks, leaving only 7 turns for actual work, causing error_max_turns on every attempt. Now extracts only Step 0 (base branch detection, ~50 lines) which is all the test actually needs. Follows the CLAUDE.md rule: "NEVER copy a full SKILL.md file into an E2E test fixture." Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: update GBrain and Hermes host configs for v0.10.0 integration GBrain: add 'triggers' to keepFields so generated skills pass checkResolvable() validation. Add version compat comment. Hermes: un-suppress GBRAIN_CONTEXT_LOAD and GBRAIN_SAVE_RESULTS. The resolvers handle GBrain-not-installed gracefully, so Hermes agents with GBrain as a mod get brain features automatically. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: GBrain resolver DX improvements and preamble health check Resolver changes: - gbrain query → gbrain search (fast keyword search, not expensive hybrid) - Add keyword extraction guidance for agents - Show explicit gbrain put_page syntax with --title, --tags, heredoc - Add entity enrichment with false-positive filter - Name throttle error patterns (exit code 1, stderr keywords) - Add data-research routing for investigate skill - Expand skillSaveMap from 4 to 8 entries - Add brain operation telemetry summary Preamble changes: - Add gbrain doctor --fast --json health check for gbrain/hermes hosts - Parse check failures/warnings count - Show failing check details when score < 50 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: preserve keepFields in allowlist frontmatter mode The allowlist mode hard-coded name + description reconstruction but never iterated keepFields for additional fields. Adding 'triggers' to keepFields was a no-op because the field was silently stripped. Now iterates keepFields and preserves any field beyond name/description from the source template frontmatter, including YAML arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add triggers to all 38 skill templates Multi-word, skill-specific trigger keywords for GBrain's RESOLVER.md router. Each skill gets 3-6 triggers derived from its "Use when asked to..." description text. Avoids single generic words that would collide across skills (e.g., "debug this" not "debug"). These are distinct from voice-triggers (speech-to-text aliases) and serve GBrain's checkResolvable() validation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: regenerate all SKILL.md files and update golden fixtures Regenerated from updated templates (triggers, brain placeholders, resolver DX improvements, preamble health check). Golden fixtures updated to match. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: settings-hook remove exits 1 when nothing to remove gstack-settings-hook remove was exiting 0 when settings.json didn't exist, causing gstack-uninstall to report "SessionStart hook" as removed on clean systems where nothing was installed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: update project documentation for GBrain v0.10.0 integration ARCHITECTURE.md: added GBRAIN_CONTEXT_LOAD and GBRAIN_SAVE_RESULTS to resolver table. CHANGELOG.md: expanded v0.18.0.0 entry with GBrain v0.10.0 integration details (triggers, expanded brain-awareness, DX improvements, Hermes brain support), updated date. CLAUDE.md: added gbrain to resolvers/ directory comment. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: routing E2E stops writing to user's ~/.claude/skills/ installSkills() was copying SKILL.md files to both project-level (.claude/skills/ in tmpDir) and user-level (~/.claude/skills/). Writing to the user's real install fails when symlinks point to different worktrees or dangling targets (ENOENT on copyFileSync). Now installs to project-level only. The test already sets cwd to the tmpDir, so project-level discovery works. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: scale Gemini E2E back to smoke test Gemini CLI gets lost in worktrees on complex tasks (review times out at 600s, discover-skill hits exit 124). Nobody uses Gemini for gstack skill execution. Replace the two failing tests (gemini-discover-skill and gemini-review-findings) with a single smoke test that verifies Gemini can start and read the README. 90s timeout, no skill invocation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
268 lines
8.3 KiB
Cheetah
268 lines
8.3 KiB
Cheetah
---
|
|
name: pair-agent
|
|
version: 0.1.0
|
|
description: |
|
|
Pair a remote AI agent with your browser. One command generates a setup key and
|
|
prints instructions the other agent can follow to connect. Works with OpenClaw,
|
|
Hermes, Codex, Cursor, or any agent that can make HTTP requests. The remote agent
|
|
gets its own tab with scoped access (read+write by default, admin on request).
|
|
Use when asked to "pair agent", "connect agent", "share browser", "remote browser",
|
|
"let another agent use my browser", or "give browser access". (gstack)
|
|
voice-triggers:
|
|
- "pair agent"
|
|
- "connect agent"
|
|
- "share my browser"
|
|
- "remote browser access"
|
|
triggers:
|
|
- pair with agent
|
|
- connect remote agent
|
|
- share my browser
|
|
allowed-tools:
|
|
- Bash
|
|
- Read
|
|
- AskUserQuestion
|
|
|
|
---
|
|
|
|
{{PREAMBLE}}
|
|
|
|
# /pair-agent — Share Your Browser With Another AI Agent
|
|
|
|
You're sitting in Claude Code with a browser running. You also have another AI agent
|
|
open (OpenClaw, Hermes, Codex, Cursor, whatever). You want that other agent to be
|
|
able to browse the web using YOUR browser. This skill makes that happen.
|
|
|
|
## How it works
|
|
|
|
Your gstack browser runs a local HTTP server. This skill creates a one-time setup key,
|
|
prints a block of instructions, and you paste those instructions into the other agent.
|
|
The other agent exchanges the key for a session token, creates its own tab, and starts
|
|
browsing. Each agent gets its own tab. They can't mess with each other's tabs.
|
|
|
|
The setup key expires in 5 minutes and can only be used once. If it leaks, it's dead
|
|
before anyone can abuse it. The session token lasts 24 hours.
|
|
|
|
**Same machine:** If the other agent is on the same machine (like OpenClaw running
|
|
locally), you can skip the copy-paste ceremony and write the credentials directly to
|
|
the agent's config directory.
|
|
|
|
**Remote:** If the other agent is on a different machine, you need an ngrok tunnel.
|
|
The skill will tell you if one is needed and how to set it up.
|
|
|
|
{{BROWSE_SETUP}}
|
|
|
|
## Step 1: Check prerequisites
|
|
|
|
```bash
|
|
$B status 2>/dev/null
|
|
```
|
|
|
|
If the browse server is not running, start it:
|
|
|
|
```bash
|
|
$B goto about:blank
|
|
```
|
|
|
|
This ensures the server is up and healthy before pairing.
|
|
|
|
## Step 2: Ask what they want
|
|
|
|
Use AskUserQuestion:
|
|
|
|
> Which agent do you want to pair with your browser? This determines the
|
|
> instructions format and where credentials get written.
|
|
|
|
Options:
|
|
- A) OpenClaw (local or remote)
|
|
- B) Codex / OpenAI Agents (local)
|
|
- C) Cursor (local)
|
|
- D) Another Claude Code session (local or remote)
|
|
- E) Something else (generic HTTP instructions — use this for Hermes)
|
|
|
|
Based on the answer, set `TARGET_HOST`:
|
|
- A → `openclaw`
|
|
- B → `codex`
|
|
- C → `cursor`
|
|
- D → `claude`
|
|
- E → generic (no host-specific config)
|
|
|
|
## Step 3: Local or remote?
|
|
|
|
Use AskUserQuestion:
|
|
|
|
> Is the other agent running on this same machine, or on a different machine/server?
|
|
>
|
|
> **Same machine** skips the copy-paste ceremony. Credentials are written directly to
|
|
> the agent's config directory. No tunnel needed.
|
|
>
|
|
> **Different machine** generates a setup key and instruction block. If ngrok is
|
|
> installed, the tunnel starts automatically. If not, I'll walk you through setup.
|
|
>
|
|
> RECOMMENDATION: Choose A if the agent is local. It's instant, no copy-paste needed.
|
|
|
|
Options:
|
|
- A) Same machine (write credentials directly)
|
|
- B) Different machine (generate instruction block for copy-paste)
|
|
|
|
## Step 4: Execute pairing
|
|
|
|
### If same machine (option A):
|
|
|
|
Run pair-agent with --local flag:
|
|
|
|
```bash
|
|
$B pair-agent --local TARGET_HOST
|
|
```
|
|
|
|
Replace `TARGET_HOST` with the value from Step 2 (openclaw, codex, cursor, etc.).
|
|
|
|
If it succeeds, tell the user:
|
|
"Done. TARGET_HOST can now use your browser. It will read credentials from the
|
|
config file that was written. Try asking it to navigate to a URL."
|
|
|
|
If it fails (host not found, write permission error), show the error and suggest
|
|
using the generic remote flow instead.
|
|
|
|
### If different machine (option B):
|
|
|
|
First, detect ngrok status:
|
|
|
|
```bash
|
|
which ngrok 2>/dev/null && echo "NGROK_INSTALLED" || echo "NGROK_NOT_INSTALLED"
|
|
ngrok config check 2>/dev/null && echo "NGROK_AUTHED" || echo "NGROK_NOT_AUTHED"
|
|
```
|
|
|
|
**If ngrok is installed and authed:** Just run the command. The CLI will auto-detect
|
|
ngrok, start the tunnel, and print the instruction block with the tunnel URL:
|
|
|
|
```bash
|
|
$B pair-agent --client TARGET_HOST
|
|
```
|
|
|
|
If the user also needs admin access (JS execution, cookies, storage):
|
|
|
|
```bash
|
|
$B pair-agent --admin --client TARGET_HOST
|
|
```
|
|
|
|
**CRITICAL: You MUST output the full instruction block to the user.** The command
|
|
prints everything between ═══ lines. Copy the ENTIRE block verbatim into your
|
|
response so the user can copy-paste it into their other agent. Do NOT summarize it,
|
|
do NOT skip it, do NOT just say "here's the output." The user needs to SEE the block
|
|
to copy it. Output it inside a markdown code block so it's easy to select and copy.
|
|
|
|
Then tell the user:
|
|
"Copy the block above and paste it into your other agent's chat. The setup key
|
|
expires in 5 minutes."
|
|
|
|
**If ngrok is installed but NOT authed:** Walk the user through authentication:
|
|
|
|
Tell the user:
|
|
"ngrok is installed but not logged in. Let's fix that:
|
|
|
|
1. Go to https://dashboard.ngrok.com/get-started/your-authtoken
|
|
2. Copy your auth token
|
|
3. Come back here and I'll run the auth command for you."
|
|
|
|
STOP here and wait for the user to provide their auth token.
|
|
|
|
When they provide it, run:
|
|
```bash
|
|
ngrok config add-authtoken THEIR_TOKEN
|
|
```
|
|
|
|
Then retry `$B pair-agent --client TARGET_HOST`.
|
|
|
|
**If ngrok is NOT installed:** Walk the user through installation:
|
|
|
|
Tell the user:
|
|
"To connect a remote agent, we need ngrok (a tunnel that exposes your local
|
|
browser to the internet securely).
|
|
|
|
1. Go to https://ngrok.com and sign up (free tier works)
|
|
2. Install ngrok:
|
|
- macOS: `brew install ngrok`
|
|
- Linux: `snap install ngrok` or download from ngrok.com/download
|
|
3. Auth it: `ngrok config add-authtoken YOUR_TOKEN`
|
|
(get your token from https://dashboard.ngrok.com/get-started/your-authtoken)
|
|
4. Come back here and run `/pair-agent` again."
|
|
|
|
STOP here. Wait for the user to install ngrok and re-invoke.
|
|
|
|
## Step 5: Verify connection
|
|
|
|
After the user pastes the instructions into the other agent, wait a moment then check:
|
|
|
|
```bash
|
|
$B status
|
|
```
|
|
|
|
Look for the connected agent in the status output. If it appears, tell the user:
|
|
"The remote agent is connected and has its own tab. You'll see its activity in the
|
|
side panel if you have GStack Browser open."
|
|
|
|
## What the remote agent can do
|
|
|
|
With default (read+write) access:
|
|
- Navigate to URLs, click elements, fill forms, take screenshots
|
|
- Read page content (text, HTML, snapshot)
|
|
- Create new tabs (each agent gets its own)
|
|
- Cannot execute arbitrary JavaScript, read cookies, or access storage
|
|
|
|
With admin access (--admin flag):
|
|
- Everything above, plus JS execution, cookie access, storage access
|
|
- Use sparingly. Only for agents you fully trust.
|
|
|
|
## Troubleshooting
|
|
|
|
**"Tab not owned by your agent"** — The remote agent tried to interact with a tab
|
|
it didn't create. Tell it to run `newtab` first to get its own tab.
|
|
|
|
**"Domain not allowed"** — The token has domain restrictions. Re-pair with broader
|
|
domain access or no domain restrictions.
|
|
|
|
**"Rate limit exceeded"** — The agent is sending > 10 requests/second. It should
|
|
wait for the Retry-After header and slow down.
|
|
|
|
**"Token expired"** — The 24-hour session expired. Run `/pair-agent` again to
|
|
generate a new setup key.
|
|
|
|
**Agent can't reach the server** — If remote, check the ngrok tunnel is running
|
|
(`$B status`). If local, check the browse server is running.
|
|
|
|
## Platform-specific notes
|
|
|
|
### OpenClaw / AlphaClaw
|
|
|
|
OpenClaw agents use the `exec` tool instead of `Bash`. The instruction block uses
|
|
`exec curl` syntax which OpenClaw understands natively. When using `--local openclaw`,
|
|
credentials are written to `~/.openclaw/skills/gstack/browse-remote.json`.
|
|
|
|
|
|
### Codex
|
|
|
|
Codex agents can execute shell commands via `codex exec`. The instruction block's
|
|
curl commands work directly. When using `--local codex`, credentials are written
|
|
to `~/.codex/skills/gstack/browse-remote.json`.
|
|
|
|
### Cursor
|
|
|
|
Cursor's AI can run terminal commands. The instruction block works as-is.
|
|
When using `--local cursor`, credentials are written to
|
|
`~/.cursor/skills/gstack/browse-remote.json`.
|
|
|
|
## Revoking access
|
|
|
|
To disconnect a specific agent:
|
|
|
|
```bash
|
|
$B tunnel revoke AGENT_NAME
|
|
```
|
|
|
|
To disconnect all agents and rotate the root token:
|
|
|
|
```bash
|
|
# This invalidates ALL scoped tokens immediately
|
|
$B tunnel rotate
|
|
```
|