Skip to main content

browse

Enables fast web browsing and interaction with web pages via a headless Chromium daemon for efficient data extraction and testing.

Install this skill

or
0/100

Security score

The browse skill was audited on May 10, 2026 and we found 98 security issues across 4 threat categories, including 1 high-severity. Review the findings below before installing.

Categories Tested

Security Issues

low line 28

Command substitution pattern

SourceSKILL.md
26
27```bash
28_UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true)
29[ -n "$_UPD" ] && echo "$_UPD" || true
30mkdir -p ~/.gstack/sessions
low line 32

Command substitution pattern

SourceSKILL.md
30mkdir -p ~/.gstack/sessions
31touch ~/.gstack/sessions/"$PPID"
32_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
33find ~/.gstack/sessions -mmin +120 -type f -exec rm {} + 2>/dev/null || true
34_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
low line 34

Command substitution pattern

SourceSKILL.md
32_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
33find ~/.gstack/sessions -mmin +120 -type f -exec rm {} + 2>/dev/null || true
34_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
35_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no")
36_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
low line 35

Command substitution pattern

SourceSKILL.md
33find ~/.gstack/sessions -mmin +120 -type f -exec rm {} + 2>/dev/null || true
34_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
35_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no")
36_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
37echo "BRANCH: $_BRANCH"
low line 36

Command substitution pattern

SourceSKILL.md
34_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
35_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no")
36_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
37echo "BRANCH: $_BRANCH"
38_SKILL_PREFIX=$(~/.claude/skills/gstack/bin/gstack-config get skill_prefix 2>/dev/null || echo "false")
low line 38

Command substitution pattern

SourceSKILL.md
36_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
37echo "BRANCH: $_BRANCH"
38_SKILL_PREFIX=$(~/.claude/skills/gstack/bin/gstack-config get skill_prefix 2>/dev/null || echo "false")
39echo "PROACTIVE: $_PROACTIVE"
40echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED"
low line 45

Command substitution pattern

SourceSKILL.md
43REPO_MODE=${REPO_MODE:-unknown}
44echo "REPO_MODE: $REPO_MODE"
45_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no")
46echo "LAKE_INTRO: $_LAKE_SEEN"
47_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true)
low line 47

Command substitution pattern

SourceSKILL.md
45_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no")
46echo "LAKE_INTRO: $_LAKE_SEEN"
47_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true)
48_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no")
49_TEL_START=$(date +%s)
low line 48

Command substitution pattern

SourceSKILL.md
46echo "LAKE_INTRO: $_LAKE_SEEN"
47_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true)
48_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no")
49_TEL_START=$(date +%s)
50_SESSION_ID="$$-$(date +%s)"
low line 53

Command substitution pattern

SourceSKILL.md
51echo "TELEMETRY: ${_TEL:-off}"
52echo "TEL_PROMPTED: $_TEL_PROMPTED"
53_EXPLAIN_LEVEL=$(~/.claude/skills/gstack/bin/gstack-config get explain_level 2>/dev/null || echo "default")
54if [ "$_EXPLAIN_LEVEL" != "default" ] && [ "$_EXPLAIN_LEVEL" != "terse" ]; then _EXPLAIN_LEVEL="default"; fi
55echo "EXPLAIN_LEVEL: $_EXPLAIN_LEVEL"
low line 56

Command substitution pattern

SourceSKILL.md
54if [ "$_EXPLAIN_LEVEL" != "default" ] && [ "$_EXPLAIN_LEVEL" != "terse" ]; then _EXPLAIN_LEVEL="default"; fi
55echo "EXPLAIN_LEVEL: $_EXPLAIN_LEVEL"
56_QUESTION_TUNING=$(~/.claude/skills/gstack/bin/gstack-config get question_tuning 2>/dev/null || echo "false")
57echo "QUESTION_TUNING: $_QUESTION_TUNING"
58mkdir -p ~/.gstack/analytics
low line 60

Command substitution pattern

SourceSKILL.md
58mkdir -p ~/.gstack/analytics
59if [ "$_TEL" != "off" ]; then
60echo '{"skill":"browse","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
61fi
62for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do
low line 62

Command substitution pattern

SourceSKILL.md
60echo '{"skill":"browse","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
61fi
62for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do
63 if [ -f "$_PF" ]; then
64 if [ "$_TEL" != "off" ] && [ -x "~/.claude/skills/gstack/bin/gstack-telemetry-log" ]; then
low line 71

Command substitution pattern

SourceSKILL.md
69 break
70done
71eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true
72_LEARN_FILE="${GSTACK_HOME:-$HOME/.gstack}/projects/${SLUG:-unknown}/learnings.jsonl"
73if [ -f "$_LEARN_FILE" ]; then
low line 74

Command substitution pattern

SourceSKILL.md
72_LEARN_FILE="${GSTACK_HOME:-$HOME/.gstack}/projects/${SLUG:-unknown}/learnings.jsonl"
73if [ -f "$_LEARN_FILE" ]; then
74 _LEARN_COUNT=$(wc -l < "$_LEARN_FILE" 2>/dev/null | tr -d ' ')
75 echo "LEARNINGS: $_LEARN_COUNT entries loaded"
76 if [ "$_LEARN_COUNT" -gt 5 ] 2>/dev/null; then
low line 87

Command substitution pattern

SourceSKILL.md
85 _HAS_ROUTING="yes"
86fi
87_ROUTING_DECLINED=$(~/.claude/skills/gstack/bin/gstack-config get routing_declined 2>/dev/null || echo "false")
88echo "HAS_ROUTING: $_HAS_ROUTING"
89echo "ROUTING_DECLINED: $_ROUTING_DECLINED"
low line 98

Command substitution pattern

SourceSKILL.md
96echo "VENDORED_GSTACK: $_VENDORED"
97echo "MODEL_OVERLAY: claude"
98_CHECKPOINT_MODE=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_mode 2>/dev/null || echo "explicit")
99_CHECKPOINT_PUSH=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_push 2>/dev/null || echo "false")
100echo "CHECKPOINT_MODE: $_CHECKPOINT_MODE"
low line 99

Command substitution pattern

SourceSKILL.md
97echo "MODEL_OVERLAY: claude"
98_CHECKPOINT_MODE=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_mode 2>/dev/null || echo "explicit")
99_CHECKPOINT_PUSH=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_push 2>/dev/null || echo "false")
100echo "CHECKPOINT_MODE: $_CHECKPOINT_MODE"
101echo "CHECKPOINT_PUSH: $_CHECKPOINT_PUSH"
low line 261

Command substitution pattern

SourceSKILL.md
259Always run (regardless of choice):
260```bash
261eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true
262touch ~/.gstack/.vendoring-warned-${SLUG:-unknown}
263```
low line 296

Command substitution pattern

SourceSKILL.md
294_GBRAIN_CONFIG="$HOME/.gbrain/config.json"
295if [ -f "$_GBRAIN_CONFIG" ] && command -v gbrain >/dev/null 2>&1; then
296 _GBRAIN_VERSION_OK=$(gbrain --version 2>/dev/null | grep -c '^gbrain ' || echo 0)
297 if [ "$_GBRAIN_VERSION_OK" -gt 0 ] 2>/dev/null; then
298 _GBRAIN_PIN_PATH=""
low line 299

Command substitution pattern

SourceSKILL.md
297 if [ "$_GBRAIN_VERSION_OK" -gt 0 ] 2>/dev/null; then
298 _GBRAIN_PIN_PATH=""
299 _REPO_TOP=$(git rev-parse --show-toplevel 2>/dev/null || echo "")
300 if [ -n "$_REPO_TOP" ] && [ -f "$_REPO_TOP/.gbrain-source" ]; then
301 _GBRAIN_PIN_PATH="$_REPO_TOP/.gbrain-source"
low line 316

Command substitution pattern

SourceSKILL.md
314fi
315
316_BRAIN_SYNC_MODE=$("$_BRAIN_CONFIG_BIN" get artifacts_sync_mode 2>/dev/null || echo off)
317
318# Detect remote-MCP mode (Path 4 of /setup-gbrain). Local artifacts sync is
low line 324

Command substitution pattern

SourceSKILL.md
322_GBRAIN_MCP_MODE="none"
323if command -v jq >/dev/null 2>&1 && [ -f "$HOME/.claude.json" ]; then
324 _GBRAIN_MCP_TYPE=$(jq -r '.mcpServers.gbrain.type // .mcpServers.gbrain.transport // empty' "$HOME/.claude.json" 2>/dev/null)
325 case "$_GBRAIN_MCP_TYPE" in
326 url|http|sse) _GBRAIN_MCP_MODE="remote-http" ;;
low line 332

Command substitution pattern

SourceSKILL.md
330
331if [ -f "$_BRAIN_REMOTE_FILE" ] && [ ! -d "$_GSTACK_HOME/.git" ] && [ "$_BRAIN_SYNC_MODE" = "off" ]; then
332 _BRAIN_NEW_URL=$(head -1 "$_BRAIN_REMOTE_FILE" 2>/dev/null | tr -d '[:space:]')
333 if [ -n "$_BRAIN_NEW_URL" ]; then
334 echo "ARTIFACTS_SYNC: artifacts repo detected: $_BRAIN_NEW_URL"
low line 344

Command substitution pattern

SourceSKILL.md
342 _BRAIN_DO_PULL=1
343 if [ -f "$_BRAIN_LAST_PULL_FILE" ]; then
344 _BRAIN_LAST=$(cat "$_BRAIN_LAST_PULL_FILE" 2>/dev/null || echo 0)
345 _BRAIN_AGE=$(( _BRAIN_NOW - _BRAIN_LAST ))
346 [ "$_BRAIN_AGE" -lt 86400 ] && _BRAIN_DO_PULL=0
low line 345

Command substitution pattern

SourceSKILL.md
343 if [ -f "$_BRAIN_LAST_PULL_FILE" ]; then
344 _BRAIN_LAST=$(cat "$_BRAIN_LAST_PULL_FILE" 2>/dev/null || echo 0)
345 _BRAIN_AGE=$(( _BRAIN_NOW - _BRAIN_LAST ))
346 [ "$_BRAIN_AGE" -lt 86400 ] && _BRAIN_DO_PULL=0
347 fi
low line 349

Command substitution pattern

SourceSKILL.md
347 fi
348 if [ "$_BRAIN_DO_PULL" = "1" ]; then
349 ( cd "$_GSTACK_HOME" && git fetch origin >/dev/null 2>&1 && git merge --ff-only "origin/$(git rev-parse --abbrev-ref HEAD)" >/dev/null 2>&1 ) || true
350 echo "$_BRAIN_NOW" > "$_BRAIN_LAST_PULL_FILE"
351 fi
low line 358

Command substitution pattern

SourceSKILL.md
356 # Remote-MCP mode: local artifacts sync is a no-op (brain admin's server
357 # pulls from GitHub/GitLab). Show the user this is by design, not broken.
358 _GBRAIN_HOST=$(jq -r '.mcpServers.gbrain.url // empty' "$HOME/.claude.json" 2>/dev/null | sed -E 's|^https?://([^/:]+).*|\1|')
359 echo "ARTIFACTS_SYNC: remote-mode (managed by brain server ${_GBRAIN_HOST:-remote})"
360elif [ -d "$_GSTACK_HOME/.git" ] && [ "$_BRAIN_SYNC_MODE" != "off" ]; then
low line 362

Command substitution pattern

SourceSKILL.md
360elif [ -d "$_GSTACK_HOME/.git" ] && [ "$_BRAIN_SYNC_MODE" != "off" ]; then
361 _BRAIN_QUEUE_DEPTH=0
362 [ -f "$_GSTACK_HOME/.brain-queue.jsonl" ] && _BRAIN_QUEUE_DEPTH=$(wc -l < "$_GSTACK_HOME/.brain-queue.jsonl" | tr -d ' ')
363 _BRAIN_LAST_PUSH="never"
364 [ -f "$_GSTACK_HOME/.brain-last-push" ] && _BRAIN_LAST_PUSH=$(cat "$_GSTACK_HOME/.brain-last-push" 2>/dev/null || echo never)
low line 364

Command substitution pattern

SourceSKILL.md
362 [ -f "$_GSTACK_HOME/.brain-queue.jsonl" ] && _BRAIN_QUEUE_DEPTH=$(wc -l < "$_GSTACK_HOME/.brain-queue.jsonl" | tr -d ' ')
363 _BRAIN_LAST_PUSH="never"
364 [ -f "$_GSTACK_HOME/.brain-last-push" ] && _BRAIN_LAST_PUSH=$(cat "$_GSTACK_HOME/.brain-last-push" 2>/dev/null || echo never)
365 echo "ARTIFACTS_SYNC: mode=$_BRAIN_SYNC_MODE | last_push=$_BRAIN_LAST_PUSH | queue=$_BRAIN_QUEUE_DEPTH"
366else
low line 457

Command substitution pattern

SourceSKILL.md
455```bash
456_TEL_END=$(date +%s)
457_TEL_DUR=$(( _TEL_END - _TEL_START ))
458rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true
459# Session timeline: record skill completion (local-only, never sent anywhere)
low line 460

Command substitution pattern

SourceSKILL.md
458rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true
459# Session timeline: record skill completion (local-only, never sent anywhere)
460~/.claude/skills/gstack/bin/gstack-timeline-log '{"skill":"SKILL_NAME","event":"completed","branch":"'$(git branch --show-current 2>/dev/null || echo unknown)'","outcome":"OUTCOME","duration_s":"'"$_TEL_DUR"'","session":"'"$_SESSION_ID"'"}' 2>/dev/null || true
461# Local analytics (gated on telemetry setting)
462if [ "$_TEL" != "off" ]; then
low line 463

Command substitution pattern

SourceSKILL.md
461# Local analytics (gated on telemetry setting)
462if [ "$_TEL" != "off" ]; then
463echo '{"skill":"SKILL_NAME","duration_s":"'"$_TEL_DUR"'","outcome":"OUTCOME","browse":"USED_BROWSE","session":"'"$_SESSION_ID"'","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
464fi
465# Remote telemetry (opt-in, requires binary)
low line 489

Command substitution pattern

SourceSKILL.md
487
488```bash
489_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
490B=""
491[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
low line 510

Command substitution pattern

SourceSKILL.md
508 tmpfile=$(mktemp)
509 curl -fsSL "https://bun.sh/install" -o "$tmpfile"
510 actual_sha=$(shasum -a 256 "$tmpfile" | awk '{print $1}')
511 if [ "$actual_sha" != "$BUN_INSTALL_SHA" ]; then
512 echo "ERROR: bun install script checksum mismatch" >&2
medium line 509

Curl to non-GitHub URL

SourceSKILL.md
507 BUN_INSTALL_SHA="bab8acfb046aac8c72407bdcce903957665d655d7acaa3e11c7c4616beae68dd"
508 tmpfile=$(mktemp)
509 curl -fsSL "https://bun.sh/install" -o "$tmpfile"
510 actual_sha=$(shasum -a 256 "$tmpfile" | awk '{print $1}')
511 if [ "$actual_sha" != "$BUN_INSTALL_SHA" ]; then
low line 28

Access to home directory dotfiles

SourceSKILL.md
26
27```bash
28_UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true)
29[ -n "$_UPD" ] && echo "$_UPD" || true
30mkdir -p ~/.gstack/sessions
low line 30

Access to home directory dotfiles

SourceSKILL.md
28_UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true)
29[ -n "$_UPD" ] && echo "$_UPD" || true
30mkdir -p ~/.gstack/sessions
31touch ~/.gstack/sessions/"$PPID"
32_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
low line 31

Access to home directory dotfiles

SourceSKILL.md
29[ -n "$_UPD" ] && echo "$_UPD" || true
30mkdir -p ~/.gstack/sessions
31touch ~/.gstack/sessions/"$PPID"
32_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
33find ~/.gstack/sessions -mmin +120 -type f -exec rm {} + 2>/dev/null || true
low line 32

Access to home directory dotfiles

SourceSKILL.md
30mkdir -p ~/.gstack/sessions
31touch ~/.gstack/sessions/"$PPID"
32_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
33find ~/.gstack/sessions -mmin +120 -type f -exec rm {} + 2>/dev/null || true
34_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
low line 33

Access to home directory dotfiles

SourceSKILL.md
31touch ~/.gstack/sessions/"$PPID"
32_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
33find ~/.gstack/sessions -mmin +120 -type f -exec rm {} + 2>/dev/null || true
34_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
35_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no")
low line 34

Access to home directory dotfiles

SourceSKILL.md
32_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
33find ~/.gstack/sessions -mmin +120 -type f -exec rm {} + 2>/dev/null || true
34_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
35_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no")
36_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
low line 35

Access to home directory dotfiles

SourceSKILL.md
33find ~/.gstack/sessions -mmin +120 -type f -exec rm {} + 2>/dev/null || true
34_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
35_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no")
36_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
37echo "BRANCH: $_BRANCH"
low line 38

Access to home directory dotfiles

SourceSKILL.md
36_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
37echo "BRANCH: $_BRANCH"
38_SKILL_PREFIX=$(~/.claude/skills/gstack/bin/gstack-config get skill_prefix 2>/dev/null || echo "false")
39echo "PROACTIVE: $_PROACTIVE"
40echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED"
low line 42

Access to home directory dotfiles

SourceSKILL.md
40echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED"
41echo "SKILL_PREFIX: $_SKILL_PREFIX"
42source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true
43REPO_MODE=${REPO_MODE:-unknown}
44echo "REPO_MODE: $REPO_MODE"
low line 45

Access to home directory dotfiles

SourceSKILL.md
43REPO_MODE=${REPO_MODE:-unknown}
44echo "REPO_MODE: $REPO_MODE"
45_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no")
46echo "LAKE_INTRO: $_LAKE_SEEN"
47_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true)
low line 47

Access to home directory dotfiles

SourceSKILL.md
45_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no")
46echo "LAKE_INTRO: $_LAKE_SEEN"
47_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true)
48_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no")
49_TEL_START=$(date +%s)
low line 48

Access to home directory dotfiles

SourceSKILL.md
46echo "LAKE_INTRO: $_LAKE_SEEN"
47_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true)
48_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no")
49_TEL_START=$(date +%s)
50_SESSION_ID="$$-$(date +%s)"
low line 53

Access to home directory dotfiles

SourceSKILL.md
51echo "TELEMETRY: ${_TEL:-off}"
52echo "TEL_PROMPTED: $_TEL_PROMPTED"
53_EXPLAIN_LEVEL=$(~/.claude/skills/gstack/bin/gstack-config get explain_level 2>/dev/null || echo "default")
54if [ "$_EXPLAIN_LEVEL" != "default" ] && [ "$_EXPLAIN_LEVEL" != "terse" ]; then _EXPLAIN_LEVEL="default"; fi
55echo "EXPLAIN_LEVEL: $_EXPLAIN_LEVEL"
low line 56

Access to home directory dotfiles

SourceSKILL.md
54if [ "$_EXPLAIN_LEVEL" != "default" ] && [ "$_EXPLAIN_LEVEL" != "terse" ]; then _EXPLAIN_LEVEL="default"; fi
55echo "EXPLAIN_LEVEL: $_EXPLAIN_LEVEL"
56_QUESTION_TUNING=$(~/.claude/skills/gstack/bin/gstack-config get question_tuning 2>/dev/null || echo "false")
57echo "QUESTION_TUNING: $_QUESTION_TUNING"
58mkdir -p ~/.gstack/analytics
low line 58

Access to home directory dotfiles

SourceSKILL.md
56_QUESTION_TUNING=$(~/.claude/skills/gstack/bin/gstack-config get question_tuning 2>/dev/null || echo "false")
57echo "QUESTION_TUNING: $_QUESTION_TUNING"
58mkdir -p ~/.gstack/analytics
59if [ "$_TEL" != "off" ]; then
60echo '{"skill":"browse","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
low line 60

Access to home directory dotfiles

SourceSKILL.md
58mkdir -p ~/.gstack/analytics
59if [ "$_TEL" != "off" ]; then
60echo '{"skill":"browse","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
61fi
62for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do
low line 62

Access to home directory dotfiles

SourceSKILL.md
60echo '{"skill":"browse","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null || echo "unknown")'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
61fi
62for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do
63 if [ -f "$_PF" ]; then
64 if [ "$_TEL" != "off" ] && [ -x "~/.claude/skills/gstack/bin/gstack-telemetry-log" ]; then
low line 64

Access to home directory dotfiles

SourceSKILL.md
62for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do
63 if [ -f "$_PF" ]; then
64 if [ "$_TEL" != "off" ] && [ -x "~/.claude/skills/gstack/bin/gstack-telemetry-log" ]; then
65 ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true
66 fi
low line 65

Access to home directory dotfiles

SourceSKILL.md
63 if [ -f "$_PF" ]; then
64 if [ "$_TEL" != "off" ] && [ -x "~/.claude/skills/gstack/bin/gstack-telemetry-log" ]; then
65 ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true
66 fi
67 rm -f "$_PF" 2>/dev/null || true
low line 71

Access to home directory dotfiles

SourceSKILL.md
69 break
70done
71eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true
72_LEARN_FILE="${GSTACK_HOME:-$HOME/.gstack}/projects/${SLUG:-unknown}/learnings.jsonl"
73if [ -f "$_LEARN_FILE" ]; then
low line 77

Access to home directory dotfiles

SourceSKILL.md
75 echo "LEARNINGS: $_LEARN_COUNT entries loaded"
76 if [ "$_LEARN_COUNT" -gt 5 ] 2>/dev/null; then
77 ~/.claude/skills/gstack/bin/gstack-learnings-search --limit 3 2>/dev/null || true
78 fi
79else
low line 82

Access to home directory dotfiles

SourceSKILL.md
80 echo "LEARNINGS: 0"
81fi
82~/.claude/skills/gstack/bin/gstack-timeline-log '{"skill":"browse","event":"started","branch":"'"$_BRANCH"'","session":"'"$_SESSION_ID"'"}' 2>/dev/null &
83_HAS_ROUTING="no"
84if [ -f CLAUDE.md ] && grep -q "## Skill routing" CLAUDE.md 2>/dev/null; then
low line 87

Access to home directory dotfiles

SourceSKILL.md
85 _HAS_ROUTING="yes"
86fi
87_ROUTING_DECLINED=$(~/.claude/skills/gstack/bin/gstack-config get routing_declined 2>/dev/null || echo "false")
88echo "HAS_ROUTING: $_HAS_ROUTING"
89echo "ROUTING_DECLINED: $_ROUTING_DECLINED"
low line 98

Access to home directory dotfiles

SourceSKILL.md
96echo "VENDORED_GSTACK: $_VENDORED"
97echo "MODEL_OVERLAY: claude"
98_CHECKPOINT_MODE=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_mode 2>/dev/null || echo "explicit")
99_CHECKPOINT_PUSH=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_push 2>/dev/null || echo "false")
100echo "CHECKPOINT_MODE: $_CHECKPOINT_MODE"
low line 99

Access to home directory dotfiles

SourceSKILL.md
97echo "MODEL_OVERLAY: claude"
98_CHECKPOINT_MODE=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_mode 2>/dev/null || echo "explicit")
99_CHECKPOINT_PUSH=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_push 2>/dev/null || echo "false")
100echo "CHECKPOINT_MODE: $_CHECKPOINT_MODE"
101echo "CHECKPOINT_PUSH: $_CHECKPOINT_PUSH"
medium line 107

Access to home directory dotfiles

SourceSKILL.md
105## Plan Mode Safe Operations
106
107In plan mode, allowed because they inform the plan: `$B`, `$D`, `codex exec`/`codex review`, writes to `~/.gstack/`, writes to the plan file, and `open` for generated artifacts.
108
109## Skill Invocation During Plan Mode
medium line 115

Access to home directory dotfiles

SourceSKILL.md
113If `PROACTIVE` is `"false"`, do not auto-invoke or proactively suggest skills. If a skill seems useful, ask: "I think /skillname might help here — want me to run it?"
114
115If `SKILL_PREFIX` is `"true"`, suggest/invoke `/gstack-*` names. Disk paths stay `~/.claude/skills/gstack/[skill-name]/SKILL.md`.
116
117If 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).
medium line 117

Access to home directory dotfiles

SourceSKILL.md
115If `SKILL_PREFIX` is `"true"`, suggest/invoke `/gstack-*` names. Disk paths stay `~/.claude/skills/gstack/[skill-name]/SKILL.md`.
116
117If 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).
118
119If output shows `JUST_UPGRADED <from> <to>`: print "Running gstack v{to} (just updated!)". If `SPAWNED_SESSION` is true, skip feature discovery.
medium line 122

Access to home directory dotfiles

SourceSKILL.md
120
121Feature discovery, max one prompt per session:
122- Missing `~/.claude/skills/gstack/.feature-prompted-continuous-checkpoint`: AskUserQuestion for Continuous checkpoint auto-commits. If accepted, run `~/.claude/skills/gstack/bin/gstack-config set checkpoint_mode continuous`. Always touch marker.
123- Missing `~/.claude/skills/gstack/.feature-prompted-model-overlay`: inform "Model overlays are active. MODEL_OVERLAY shows the patch." Always touch marker.
124
medium line 123

Access to home directory dotfiles

SourceSKILL.md
121Feature discovery, max one prompt per session:
122- Missing `~/.claude/skills/gstack/.feature-prompted-continuous-checkpoint`: AskUserQuestion for Continuous checkpoint auto-commits. If accepted, run `~/.claude/skills/gstack/bin/gstack-config set checkpoint_mode continuous`. Always touch marker.
123- Missing `~/.claude/skills/gstack/.feature-prompted-model-overlay`: inform "Model overlays are active. MODEL_OVERLAY shows the patch." Always touch marker.
124
125After upgrade prompts, continue workflow.
medium line 136

Access to home directory dotfiles

SourceSKILL.md
134
135If A: leave `explain_level` unset (defaults to `default`).
136If B: run `~/.claude/skills/gstack/bin/gstack-config set explain_level terse`.
137
138Always run (regardless of choice):
low line 140

Access to home directory dotfiles

SourceSKILL.md
138Always run (regardless of choice):
139```bash
140rm -f ~/.gstack/.writing-style-prompt-pending
141touch ~/.gstack/.writing-style-prompted
142```
low line 141

Access to home directory dotfiles

SourceSKILL.md
139```bash
140rm -f ~/.gstack/.writing-style-prompt-pending
141touch ~/.gstack/.writing-style-prompted
142```
143
low line 150

Access to home directory dotfiles

SourceSKILL.md
148```bash
149open https://garryslist.org/posts/boil-the-ocean
150touch ~/.gstack/.completeness-intro-seen
151```
152
medium line 163

Access to home directory dotfiles

SourceSKILL.md
161- B) No thanks
162
163If A: run `~/.claude/skills/gstack/bin/gstack-config set telemetry community`
164
165If B: ask follow-up:
medium line 173

Access to home directory dotfiles

SourceSKILL.md
171- B) No thanks, fully off
172
173If B→A: run `~/.claude/skills/gstack/bin/gstack-config set telemetry anonymous`
174If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off`
175
medium line 174

Access to home directory dotfiles

SourceSKILL.md
172
173If B→A: run `~/.claude/skills/gstack/bin/gstack-config set telemetry anonymous`
174If B→B: run `~/.claude/skills/gstack/bin/gstack-config set telemetry off`
175
176Always run:
low line 178

Access to home directory dotfiles

SourceSKILL.md
176Always run:
177```bash
178touch ~/.gstack/.telemetry-prompted
179```
180
medium line 191

Access to home directory dotfiles

SourceSKILL.md
189- B) Turn it off — I'll type /commands myself
190
191If A: run `~/.claude/skills/gstack/bin/gstack-config set proactive true`
192If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false`
193
medium line 192

Access to home directory dotfiles

SourceSKILL.md
190
191If A: run `~/.claude/skills/gstack/bin/gstack-config set proactive true`
192If B: run `~/.claude/skills/gstack/bin/gstack-config set proactive false`
193
194Always run:
low line 196

Access to home directory dotfiles

SourceSKILL.md
194Always run:
195```bash
196touch ~/.gstack/.proactive-prompted
197```
198
medium line 237

Access to home directory dotfiles

SourceSKILL.md
235Then commit the change: `git add CLAUDE.md && git commit -m "chore: add gstack skill routing rules to CLAUDE.md"`
236
237If B: run `~/.claude/skills/gstack/bin/gstack-config set routing_declined true` and say they can re-enable with `gstack-config set routing_declined false`.
238
239This only happens once per project. Skip if `HAS_ROUTING` is `yes` or `ROUTING_DECLINED` is `true`.
medium line 241

Access to home directory dotfiles

SourceSKILL.md
239This only happens once per project. Skip if `HAS_ROUTING` is `yes` or `ROUTING_DECLINED` is `true`.
240
241If `VENDORED_GSTACK` is `yes`, warn once via AskUserQuestion unless `~/.gstack/.vendoring-warned-$SLUG` exists:
242
243> This project has gstack vendored in `.claude/skills/gstack/`. Vendoring is deprecated.
medium line 253

Access to home directory dotfiles

SourceSKILL.md
2511. Run `git rm -r .claude/skills/gstack/`
2522. Run `echo '.claude/skills/gstack/' >> .gitignore`
2533. Run `~/.claude/skills/gstack/bin/gstack-team-init required` (or `optional`)
2544. Run `git add .claude/ .gitignore CLAUDE.md && git commit -m "chore: migrate gstack from vendored to team mode"`
2555. Tell the user: "Done. Each developer now runs: `cd ~/.claude/skills/gstack && ./setup --team`"
medium line 255

Access to home directory dotfiles

SourceSKILL.md
2533. Run `~/.claude/skills/gstack/bin/gstack-team-init required` (or `optional`)
2544. Run `git add .claude/ .gitignore CLAUDE.md && git commit -m "chore: migrate gstack from vendored to team mode"`
2555. Tell the user: "Done. Each developer now runs: `cd ~/.claude/skills/gstack && ./setup --team`"
256
257If B: say "OK, you're on your own to keep the vendored copy up to date."
low line 261

Access to home directory dotfiles

SourceSKILL.md
259Always run (regardless of choice):
260```bash
261eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true
262touch ~/.gstack/.vendoring-warned-${SLUG:-unknown}
263```
low line 262

Access to home directory dotfiles

SourceSKILL.md
260```bash
261eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true
262touch ~/.gstack/.vendoring-warned-${SLUG:-unknown}
263```
264
low line 285

Access to home directory dotfiles

SourceSKILL.md
283 _BRAIN_REMOTE_FILE="$HOME/.gstack-brain-remote.txt"
284fi
285_BRAIN_SYNC_BIN="~/.claude/skills/gstack/bin/gstack-brain-sync"
286_BRAIN_CONFIG_BIN="~/.claude/skills/gstack/bin/gstack-config"
287
low line 286

Access to home directory dotfiles

SourceSKILL.md
284fi
285_BRAIN_SYNC_BIN="~/.claude/skills/gstack/bin/gstack-brain-sync"
286_BRAIN_CONFIG_BIN="~/.claude/skills/gstack/bin/gstack-config"
287
288# /sync-gbrain context-load: teach the agent to use gbrain when it's available.
medium line 390

Access to home directory dotfiles

SourceSKILL.md
388```
389
390If A/B and `~/.gstack/.git` is missing, ask whether to run `gstack-artifacts-init`. Do not block the skill.
391
392At skill END before telemetry:
low line 395

Access to home directory dotfiles

SourceSKILL.md
393
394```bash
395"~/.claude/skills/gstack/bin/gstack-brain-sync" --discover-new 2>/dev/null || true
396"~/.claude/skills/gstack/bin/gstack-brain-sync" --once 2>/dev/null || true
397```
low line 396

Access to home directory dotfiles

SourceSKILL.md
394```bash
395"~/.claude/skills/gstack/bin/gstack-brain-sync" --discover-new 2>/dev/null || true
396"~/.claude/skills/gstack/bin/gstack-brain-sync" --once 2>/dev/null || true
397```
398
low line 441

Access to home directory dotfiles

SourceSKILL.md
439
440```bash
441~/.claude/skills/gstack/bin/gstack-learnings-log '{"skill":"SKILL_NAME","type":"operational","key":"SHORT_KEY","insight":"DESCRIPTION","confidence":N,"source":"observed"}'
442```
443
medium line 451

Access to home directory dotfiles

SourceSKILL.md
449
450**PLAN MODE EXCEPTION — ALWAYS RUN:** This command writes telemetry to
451`~/.gstack/analytics/`, matching preamble analytics writes.
452
453Run this bash:
low line 458

Access to home directory dotfiles

SourceSKILL.md
456_TEL_END=$(date +%s)
457_TEL_DUR=$(( _TEL_END - _TEL_START ))
458rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true
459# Session timeline: record skill completion (local-only, never sent anywhere)
460~/.claude/skills/gstack/bin/gstack-timeline-log '{"skill":"SKILL_NAME","event":"completed","branch":"'$(git branch --show-current 2>/dev/null || echo unknown)'","outcome":"OUTCOME","duration_s":"'"$_TEL_DUR"'","session":"'"$_SESSION_ID"'"}' 2>/dev/null || true
low line 460

Access to home directory dotfiles

SourceSKILL.md
458rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true
459# Session timeline: record skill completion (local-only, never sent anywhere)
460~/.claude/skills/gstack/bin/gstack-timeline-log '{"skill":"SKILL_NAME","event":"completed","branch":"'$(git branch --show-current 2>/dev/null || echo unknown)'","outcome":"OUTCOME","duration_s":"'"$_TEL_DUR"'","session":"'"$_SESSION_ID"'"}' 2>/dev/null || true
461# Local analytics (gated on telemetry setting)
462if [ "$_TEL" != "off" ]; then
low line 463

Access to home directory dotfiles

SourceSKILL.md
461# Local analytics (gated on telemetry setting)
462if [ "$_TEL" != "off" ]; then
463echo '{"skill":"SKILL_NAME","duration_s":"'"$_TEL_DUR"'","outcome":"OUTCOME","browse":"USED_BROWSE","session":"'"$_SESSION_ID"'","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"}' >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
464fi
465# Remote telemetry (opt-in, requires binary)
low line 466

Access to home directory dotfiles

SourceSKILL.md
464fi
465# Remote telemetry (opt-in, requires binary)
466if [ "$_TEL" != "off" ] && [ -x ~/.claude/skills/gstack/bin/gstack-telemetry-log ]; then
467 ~/.claude/skills/gstack/bin/gstack-telemetry-log \
468 --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \
low line 467

Access to home directory dotfiles

SourceSKILL.md
465# Remote telemetry (opt-in, requires binary)
466if [ "$_TEL" != "off" ] && [ -x ~/.claude/skills/gstack/bin/gstack-telemetry-log ]; then
467 ~/.claude/skills/gstack/bin/gstack-telemetry-log \
468 --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \
469 --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null &
medium line 477

Access to home directory dotfiles

SourceSKILL.md
475## Plan Status Footer
476
477In plan mode before ExitPlanMode: if the plan file lacks `## GSTACK REVIEW REPORT`, run `~/.claude/skills/gstack/bin/gstack-review-read` and append the standard runs/status/findings table. With `NO_REVIEWS` or empty, append a 5-row placeholder with verdict "NO REVIEWS YET — run `/autoplan`". If a richer report exists, skip.
478
479PLAN MODE EXCEPTION — always allowed (it's the plan file).
medium line 720

Access to home directory dotfiles

SourceSKILL.md
718
719The snapshot is your primary tool for understanding and interacting with pages.
720`$B` is the browse binary (resolved from `$_ROOT/.claude/skills/gstack/browse/dist/browse` or `~/.claude/skills/gstack/browse/dist/browse`).
721
722**Syntax:** `$B snapshot [flags]`
high line 111

Urgency-based manipulation

SourceSKILL.md
109## Skill Invocation During Plan Mode
110
111If the user invokes a skill in plan mode, the skill takes precedence over generic plan mode behavior. **Treat the skill file as executable instructions, not reference.** Follow it step by step starting from Step 0; the first AskUserQuestion is the workflow entering plan mode, not a violation of it. AskUserQuestion (any variant — `mcp__*__AskUserQuestion` or native; see "AskUserQuestion Format → Tool resolution") satisfies plan mode's end-of-turn requirement. If no variant is callable, the skill is BLOCKED — stop and report `BLOCKED — AskUserQuestion unavailable` per the AskUserQuestion Format rule. At a STOP point, stop immediately. Do not continue the workflow or call ExitPlanMode there. Commands marked "PLAN MODE EXCEPTION — ALWAYS RUN" execute. Call ExitPlanMode only after the skill workflow completes, or if the user tells you to cancel the skill or leave plan mode.
112
113If `PROACTIVE` is `"false"`, do not auto-invoke or proactively suggest skills. If a skill seems useful, ask: "I think /skillname might help here — want me to run it?"
Scanned on May 10, 2026
View Security Dashboard
Installation guide →