mcpField
G
gstack

gstack

github.com/ivansamartinoエージェントワークフロー0101 回インストール17 週間前に更新
リポジトリ

gstack について

gstackはClaude Code向けのスキル群で、計画、レビュー、QA、リリース、デバッグ、ドキュメント、セキュリティ、デザインの依頼を適切なワークフローに振り分けます。セッション初期化や設定プロンプト、プロジェクト単位のスキルルーティングも案内します。

主な機能

  1. 01依頼を適切なスキルに振り分け
  2. 02計画、レビュー、リリースに対応
  3. 03QA、デバッグ、セキュリティの手順
  4. 04セッション初期化と設定プロンプト
  5. 05プロジェクトのスキルルール設定

活用シーン

  1. 01開発タスクに合うgstackスキルの選択
  2. 02コードレビューとリリースの手順化
  3. 03プロジェクトのCLAUDE.mdでルーティング設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/ivansamartino/gstack --skill gstack

インストール後、Claude Code で/gstackを入力して読み込まれたか確認します。

詳細

このスキルを呼び出すタイミング

gstack のリクエストを適切なスキル(計画、レビュー、QA、リリース、デバッグ、ドキュメント、セキュリティ、デザイン)に振り分けます。ブラウザー/QA やドッグフーディングの場合は、/browse を案内します。特定のスキルを指定せずに gstack を呼び出す場合や、「これに合う gstack スキルはどれ?」と尋ねる場合に使用します。

前文(最初に実行)

_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 -exec rm {} + 2>/dev/null || true
_PROACTIVE=$(~/.claude/skills/gstack/bin/gstack-config get proactive 2>/dev/null || echo "true")
_PROACTIVE_PROMPTED=$([ -f ~/.gstack/.proactive-prompted ] && echo "yes" || echo "no")
_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
echo "BRANCH: $_BRANCH"
_SKILL_PREFIX=$(~/.claude/skills/gstack/bin/gstack-config get skill_prefix 2>/dev/null || echo "false")
echo "PROACTIVE: $_PROACTIVE"
echo "PROACTIVE_PROMPTED: $_PROACTIVE_PROMPTED"
echo "SKILL_PREFIX: $_SKILL_PREFIX"
source <(~/.claude/skills/gstack/bin/gstack-repo-mode 2>/dev/null) || true
REPO_MODE=${REPO_MODE:-unknown}
echo "REPO_MODE: $REPO_MODE"
_SESSION_KIND=$(~/.claude/skills/gstack/bin/gstack-session-kind 2>/dev/null || echo "interactive")
case "$_SESSION_KIND" in spawned|headless|interactive) ;; *) _SESSION_KIND="interactive" ;; esac
echo "SESSION_KIND: $_SESSION_KIND"
# Conductor host: AskUserQuestion is unreliable here (native disabled, MCP
# variant flaky), so skills render decisions as prose instead of calling the
# tool. Gated on !headless so an eval/CI run INSIDE Conductor (GSTACK_HEADLESS)
# still BLOCKs rather than rendering prose to nobody.
if [ "$_SESSION_KIND" != "headless" ] && { [ -n "${CONDUCTOR_WORKSPACE_PATH:-}" ] || [ -n "${CONDUCTOR_PORT:-}" ]; }; then
  echo "CONDUCTOR_SESSION: true"
fi
_ACTIVATED=$([ -f ~/.gstack/.activated ] && echo "yes" || echo "no")
_FIRST_LOOP_SHOWN=$([ -f ~/.gstack/.first-loop-tip-shown ] && echo "yes" || echo "no")
echo "ACTIVATED: $_ACTIVATED"
echo "FIRST_LOOP_SHOWN: $_FIRST_LOOP_SHOWN"
# First-run project detection: run the detector ONLY on the first-ever skill run
# (ACTIVATED=no, interactive) so it stays off the hot path for every run after.
_FIRST_TASK=""
if [ "$_ACTIVATED" = "no" ] && [ "$_SESSION_KIND" != "headless" ]; then
  _FIRST_TASK=$(~/.claude/skills/gstack/bin/gstack-first-task-detect 2>/dev/null || true)
fi
echo "FIRST_TASK: $_FIRST_TASK"
_LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no")
echo "LAKE_INTRO: $_LAKE_SEEN"
_TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true)
_TEL_PROMPTED=$([ -f ~/.gstack/.telemetry-prompted ] && echo "yes" || echo "no")
_TEL_START=$(date +%s)
_SESSION_ID="$$-$(date +%s)"
echo "TELEMETRY: ${_TEL:-off}"
echo "TEL_PROMPTED: $_TEL_PROMPTED"
_EXPLAIN_LEVEL=$(~/.claude/skills/gstack/bin/gstack-config get explain_level 2>/dev/null || echo "default")
if [ "$_EXPLAIN_LEVEL" != "default" ] && [ "$_EXPLAIN_LEVEL" != "terse" ]; then _EXPLAIN_LEVEL="default"; fi
echo "EXPLAIN_LEVEL: $_EXPLAIN_LEVEL"
_QUESTION_TUNING=$(~/.claude/skills/gstack/bin/gstack-config get question_tuning 2>/dev/null || echo "false")
echo "QUESTION_TUNING: $_QUESTION_TUNING"
mkdir -p ~/.gstack/analytics
if [ "$_TEL" != "off" ]; then
echo '{"skill":"gstack","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","repo":"'$(_repo=$(basename "$(git rev-parse --show-toplevel 2>/dev/null)" 2>/dev/null | tr -cd 'a-zA-Z0-9._-'); echo "${_repo:-unknown}")'"}'  >> ~/.gstack/analytics/skill-usage.jsonl 2>/dev/null || true
fi
for _PF in $(find ~/.gstack/analytics -maxdepth 1 -name '.pending-*' 2>/dev/null); do
  if [ -f "$_PF" ]; then
    if [ "$_TEL" != "off" ] && [ -x "~/.claude/skills/gstack/bin/gstack-telemetry-log" ]; then
      ~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type skill_run --skill _pending_finalize --outcome unknown --session-id "$_SESSION_ID" 2>/dev/null || true
    fi
    rm -f "$_PF" 2>/dev/null || true
  fi
  break
done
eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true
_LEARN_FILE="${GSTACK_HOME:-$HOME/.gstack}/projects/${SLUG:-unknown}/learnings.jsonl"
if [ -f "$_LEARN_FILE" ]; then
  _LEARN_COUNT=$(wc -l < "$_LEARN_FILE" 2>/dev/null | tr -d ' ')
  echo "LEARNINGS: $_LEARN_COUNT entries loaded"
  if [ "$_LEARN_COUNT" -gt 5 ] 2>/dev/null; then
    ~/.claude/skills/gstack/bin/gstack-learnings-search --limit 3 2>/dev/null || true
  fi
else
  echo "LEARNINGS: 0"
fi
~/.claude/skills/gstack/bin/gstack-timeline-log '{"skill":"gstack","event":"started","branch":"'"$_BRANCH"'","session":"'"$_SESSION_ID"'"}' 2>/dev/null &
_HAS_ROUTING="no"
if [ -f CLAUDE.md ] && grep -q "## Skill routing" CLAUDE.md 2>/dev/null; then
  _HAS_ROUTING="yes"
fi
_ROUTING_DECLINED=$(~/.claude/skills/gstack/bin/gstack-config get routing_declined 2>/dev/null || echo "false")
echo "HAS_ROUTING: $_HAS_ROUTING"
echo "ROUTING_DECLINED: $_ROUTING_DECLINED"
_VENDORED="no"
if [ -d ".claude/skills/gstack" ] && [ ! -L ".claude/skills/gstack" ]; then
  if [ -f ".claude/skills/gstack/VERSION" ] || [ -d ".claude/skills/gstack/.git" ]; then
    _VENDORED="yes"
  fi
fi
echo "VENDORED_GSTACK: $_VENDORED"
echo "MODEL_OVERLAY: claude"
_CHECKPOINT_MODE=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_mode 2>/dev/null || echo "explicit")
_CHECKPOINT_PUSH=$(~/.claude/skills/gstack/bin/gstack-config get checkpoint_push 2>/dev/null || echo "false")
echo "CHECKPOINT_MODE: $_CHECKPOINT_MODE"
echo "CHECKPOINT_PUSH: $_CHECKPOINT_PUSH"
# Plan-mode hint for skills like /spec that branch behavior on plan-mode state.
# Claude Code exposes plan mode via system reminders; we detect best-effort
# from CLAUDE_PLAN_FILE (set by the harness when plan mode is active) and
# fall back to "inactive". Codex hosts and Claude execution mode both end up
# inactive, which is the safe default (defaults to file+execute pipeline).
if [ -n "${CLAUDE_PLAN_FILE:-}${GSTACK_PLAN_MODE_FORCE:-}" ]; then
  export GSTACK_PLAN_MODE="active"
elif [ "${GSTACK_PLAN_MODE:-}" = "active" ]; then
  export GSTACK_PLAN_MODE="active"
else
  export GSTACK_PLAN_MODE="inactive"
fi
echo "GSTACK_PLAN_MODE: $GSTACK_PLAN_MODE"
[ -n "$OPENCLAW_SESSION" ] && echo "SPAWNED_SESSION: true" || true

計画モードで安全に実行できる操作

計画モードでは、計画に役立つ以下の操作が許可されています:$B、$D、codex exec/codex review、~/.gstack/ への書き込み、計画ファイルへの書き込み、生成された成果物に対する open。

計画モード中のスキル呼び出し

計画モードでユーザーがスキルを呼び出した場合、そのスキルが一般的な計画モードの動作に優先します。**スキルファイルは参考資料ではなく、実行可能な指示として扱ってください。**ステップ 0 から順に実行してください。最初の AskUserQuestion はワークフローが計画モードに入るためのものであり、計画モードへの違反ではありません。AskUserQuestion(すべての形式 — mcp__*__AskUserQuestion またはネイティブ形式。「AskUserQuestion Format → Tool resolution」を参照)は、計画モードのターン終了要件を満たします。AskUserQuestion が利用できない場合、または呼び出しに失敗した場合は、AskUserQuestion Format の失敗時フォールバックに従ってください:headless → BLOCKED、interactive → 文章によるフォールバック(こちらもターン終了要件を満たします)。STOP の箇所では、直ちに停止してください。ワークフローを続行したり、そこで ExitPlanMode を呼び出したりしないでください。「PLAN MODE EXCEPTION — ALWAYS RUN」と記されたコマンドは実行してください。ExitPlanMode を呼び出すのは、スキルのワークフローが完了した後、またはユーザーがスキルのキャンセルや計画モードからの退出を指示した場合のみです。

PROACTIVE が "false" の場合、スキルを自動的に呼び出したり、先回りして提案したりしないでください。スキルが役立ちそうな場合は、「ここでは /skillname が役立つと思います。実行しますか?」と尋ねてください。

SKILL_PREFIX が "true" の場合は、/gstack-* 形式の名前を提案/呼び出してください。ディスク上のパスは ~/.claude/skills/gstack/[skill-name]/SKILL.md のままにしてください。

出力に UPGRADE_AVAILABLE <old> <new> と表示された場合:~/.claude/skills/gstack/gstack-upgrade/SKILL.md を読み、「Inline upgrade flow」に従ってください(設定されていれば自動アップグレードし、そうでなければ 4 つの選択肢を示して AskUserQuestion で尋ね、辞退された場合は延期状態を書き込みます)。

出力に JUST_UPGRADED <from> <to> と表示された場合は、「Running gstack v{to} (just updated!)」と表示してください。SPAWNED_SESSION が true の場合は、機能の確認をスキップしてください。

機能の確認は、セッションごとにプロンプトを最大 1 回だけ表示します。

  • ~/.claude/skills/gstack/.feature-prompted-continuous-checkpoint がない場合:継続的なチェックポイントの自動コミットについて AskUserQuestion で尋ねます。承諾された場合は ~/.claude/skills/gstack/bin/gstack-config set checkpoint_mode continuous を実行します。必ずマーカーファイルに touch してください。
  • ~/.claude/skills/gstack/.feature-prompted-model-overlay がない場合:「モデルオーバーレイが有効です。MODEL_OVERLAY にパッチが表示されます」と伝えてください。必ずマーカーファイルに touch してください。

アップグレードに関するプロンプトの後は、ワークフローを続行してください。

WRITING_STYLE_PENDING が yes の場合:文章スタイルについて一度だけ尋ねてください。

v1 のプロンプトはよりシンプルです。初出の専門用語には説明が付き、質問は成果を重視した表現になり、文章は短くなっています。デフォルトのままにしますか、それとも簡潔なスタイルに戻しますか?

選択肢:

  • A) 新しいデフォルトのままにする(推奨 — 読みやすい文章は誰にとっても役立ちます)
  • B) V0 の文章に戻す — explain_level: terse に設定する

A の場合:explain_level は未設定のままにします(デフォルトは default です)。 B の場合:~/.claude/skills/gstack/bin/gstack-config set explain_level terse を実行します。

選択にかかわらず、必ず次を実行してください:

rm -f ~/.gstack/.writing-style-prompt-pending
touch ~/.gstack/.writing-style-prompted

WRITING_STYLE_PENDING が no の場合はスキップしてください。

LAKE_INTRO が no の場合:「gstack は Boil the Ocean の原則に従っています。AI によって限界費用がほぼゼロになるなら、すべてを完全に実行します。詳細はこちら:https://garryslist.org/posts/boil-the-ocean」と伝えて、開くかどうかを尋ねてください。

open https://garryslist.org/posts/boil-the-ocean
touch ~/.gstack/.completeness-intro-seen

「はい」と答えた場合にのみ open を実行してください。必ず touch を実行してください。

TEL_PROMPTED が no かつ LAKE_INTRO が yes の場合:AskUserQuestion で一度だけテレメトリーについて尋ねてください。

gstack の改善にご協力ください。共有されるのは使用データのみです:スキル、所要時間、クラッシュ、安定したデバイス ID。コードやファイルパスは共有されません。リポジトリ名はローカルにのみ記録され、アップロード前に削除されます。

選択肢:

  • A) gstack の改善に協力する!(推奨)
  • B) いいえ

A の場合:~/.claude/skills/gstack/bin/gstack-config set telemetry community を実行します。

B の場合:次の質問をしてください。

匿名モードでは、集計された使用状況のみが送信され、固有の ID は送信されません。

選択肢:

  • A) はい、匿名で問題ありません
  • B) いいえ、完全にオフにします

B→A の場合:~/.claude/skills/gstack/bin/gstack-config set telemetry anonymous を実行します B→B の場合:~/.claude/skills/gstack/bin/gstack-config set telemetry off を実行します

必ず実行してください:

touch ~/.gstack/.telemetry-prompted

TEL_PROMPTED が yes の場合はスキップします。

PROACTIVE_PROMPTED が no で、かつ TEL_PROMPTED が yes の場合は、一度だけ質問します。

gstack が、「これは動作する?」という質問には /qa を、バグには /investigate を提案するなど、スキルを積極的に提案できるようにしますか?

選択肢:

  • A) オンのままにする(推奨)
  • B) オフにする — 自分で /commands を入力します

A の場合:~/.claude/skills/gstack/bin/gstack-config set proactive true を実行します B の場合:~/.claude/skills/gstack/bin/gstack-config set proactive false を実行します

必ず実行してください:

touch ~/.gstack/.proactive-prompted

PROACTIVE_PROMPTED が yes の場合はスキップします。

初回実行時の案内(1 回のみ)

ACTIVATED が no(このマシンでスキルを初めて実行)で、かつ前置きで空ではない FIRST_TASK: の値が出力され、その値が nongit ではない場合:トークンに対応するプロジェクト固有の短い案内を 1 行表示し、その後はユーザーが実際に依頼した作業を続けます。作業を中断してはいけません。トークンの対応関係:greenfield → 「新しいリポジトリです。まず /spec または /office-hours で形にしましょう。」 code_node/code_python/code_rust/code_go/code_ruby/code_ios → 「コードがあります。動作を確認するには /qa、問題があれば /investigate を実行してください。」 branch_ahead → 「このブランチには未リリースの変更があります。/review の後に /ship を実行してください。」 dirty_default → 「コミットされていない変更があります。コミットする前に /review を実行してください。」 clean_default → 「/spec、/investigate、/qa のいずれかを選んでください。」次に、確認したトークンを TASK_TOKEN に代入して実行し(ベストエフォート)、有効化済みとしてマークします:

~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type first_task_scaffold_shown --skill "TASK_TOKEN" --outcome shown 2>/dev/null || true
touch ~/.gstack/.activated 2>/dev/null || true

ACTIVATED が no でも、FIRST_TASK: が空または nongit の場合(ヘッドレス、非 git、または実行可能な作業がない場合):何も表示せず、touch ~/.gstack/.activated 2>/dev/null || true のみを実行します。

それ以外で、ACTIVATED が yes かつ FIRST_LOOP_SHOWN が no の場合:案内として 1 度だけ次のように伝えます(その後は続行します):

ヒント:gstack の効果を実感するには、計画 → レビュー → リリースの 1 サイクルを完了するのがおすすめです。最初のサイクルでは、/office-hours または /spec で形にし、/plan-eng-review で固めてから、/ship を実行します。

その後、touch ~/.gstack/.first-loop-tip-shown 2>/dev/null || true を実行します。

ACTIVATED と FIRST_LOOP_SHOWN が両方 yes の場合は、このセクションをスキップします。

HAS_ROUTING が no、ROUTING_DECLINED が false、かつ PROACTIVE_PROMPTED が yes の場合: プロジェクトのルートに CLAUDE.md ファイルがあるか確認します。存在しない場合は作成します。

AskUserQuestion を使用します:

プロジェクトの CLAUDE.md にスキルのルーティングルールを記載すると、gstack を最も効果的に活用できます。

オプション:

  • A)CLAUDE.md にルーティングルールを追加する(推奨)
  • B)いいえ。スキルは手動で実行します

A の場合:次のセクションを CLAUDE.md の末尾に追加します:


## Skill routing

When the user's request matches an available skill, invoke it via the Skill tool. When in doubt, invoke the skill.

Key routing rules:
- Product ideas/brainstorming → invoke /office-hours
- Strategy/scope → invoke /plan-ceo-review
- Architecture → invoke /plan-eng-review
- Design system/plan review → invoke /design-consultation or /plan-design-review
- Full review pipeline → invoke /autoplan
- Bugs/errors → invoke /investigate
- QA/testing site behavior → invoke /qa or /qa-only
- Code review/diff check → invoke /review
- Visual polish → invoke /design-review
- Ship/deploy/PR → invoke /ship or /land-and-deploy
- Save progress → invoke /context-save
- Resume context → invoke /context-restore
- Author a backlog-ready spec/issue → invoke /spec

次に変更をコミットします:git add CLAUDE.md && git commit -m "chore: add gstack skill routing rules to CLAUDE.md"

B の場合:~/.claude/skills/gstack/bin/gstack-config set routing_declined true を実行し、gstack-config set routing_declined false で再度有効にできると伝えます。

これはプロジェクトごとに 1 度だけ実行します。HAS_ROUTING が yes または ROUTING_DECLINED が true の場合はスキップします。

VENDORED_GSTACK が yes の場合、~/.gstack/.vendoring-warned-$SLUG が存在しない限り、AskUserQuestion を使用して 1 度だけ警告します:

このプロジェクトでは gstack が .claude/skills/gstack/ にベンダーとして含まれています。ベンダーとして含める方法は非推奨です。 チームモードに移行しますか?

オプション:

  • A)はい。今すぐチームモードに移行する
  • B)いいえ。自分で対応します

A の場合:

  1. git rm -r .claude/skills/gstack/ を実行します
  2. echo '.claude/skills/gstack/' >> .gitignore を実行します
  3. ~/.claude/skills/gstack/bin/gstack-team-init required(または optional)を実行します
  4. git add .claude/ .gitignore CLAUDE.md && git commit -m "chore: migrate gstack from vendored to team mode" を実行します
  5. ユーザーに次のように伝えます:「完了しました。各開発者は cd ~/.claude/skills/gstack && ./setup --team を実行してください」

B の場合:「わかりました。ベンダー版のコピーはご自身で最新の状態に保ってください」と伝えます。

選択にかかわらず、必ず次を実行します:

eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" 2>/dev/null || true
touch ~/.gstack/.vendoring-warned-${SLUG:-unknown}

マーカーが存在する場合はスキップします。

SPAWNED_SESSION が "true" の場合、AI オーケストレーター(例:OpenClaw)によって起動されたセッション内で実行されています。起動されたセッションでは:

  • 対話型の質問には AskUserQuestion を使用しないでください。推奨されるオプションを自動的に選択します。
  • アップグレードの確認、テレメトリーの質問、ルーティングの挿入、lake の紹介は実行しないでください。
  • 作業の完了と、結果を文章で報告することに集中してください。
  • 作業完了時には、完了報告を行ってください。リリースしたもの、決定事項、不確かな点を含めます。

アーティファクトの同期(スキル開始時)

_GSTACK_HOME="${GSTACK_HOME:-$HOME/.gstack}"
# Prefer the v1.27.0.0 artifacts file; fall back to brain file for users
# upgrading mid-stream before the migration script runs.
if [ -f "$HOME/.gstack-artifacts-remote.txt" ]; then
  _BRAIN_REMOTE_FILE="$HOME/.gstack-artifacts-remote.txt"
else
  _BRAIN_REMOTE_FILE="$HOME/.gstack-brain-remote.txt"
fi
_BRAIN_SYNC_BIN="~/.claude/skills/gstack/bin/gstack-brain-sync"
_BRAIN_CONFIG_BIN="~/.claude/skills/gstack/bin/gstack-config"

# /sync-gbrain context-load: teach the agent to use gbrain when it's available.
# Per-worktree pin: post-spike redesign uses kubectl-style `.gbrain-source` in the
# git toplevel to scope queries. Look for the pin in the worktree (not a global
# state file) so that opening worktree B without a pin doesn't claim "indexed"
# just because worktree A was synced. Empty string when gbrain is not
# configured (zero context cost for non-gbrain users).
_GBRAIN_CONFIG="$HOME/.gbrain/config.json"
if [ -f "$_GBRAIN_CONFIG" ] && command -v gbrain >/dev/null 2>&1; then
  _GBRAIN_VERSION_OK=$(gbrain --version 2>/dev/null | grep -c '^gbrain ' || echo 0)
  if [ "$_GBRAIN_VERSION_OK" -gt 0 ] 2>/dev/null; then
    _GBRAIN_PIN_PATH=""
    _REPO_TOP=$(git rev-parse --show-toplevel 2>/dev/null || echo "")
    if [ -n "$_REPO_TOP" ] && [ -f "$_REPO_TOP/.gbrain-source" ]; then
      _GBRAIN_PIN_PATH="$_REPO_TOP/.gbrain-source"
    fi
    if [ -n "$_GBRAIN_PIN_PATH" ]; then
      echo "GBrain configured. Prefer \`gbrain search\`/\`gbrain query\` over Grep for"
      echo "semantic questions; use \`gbrain code-def\`/\`code-refs\`/\`code-callers\` for"
      echo "symbol-aware code lookup. See \"## GBrain Search Guidance\" in CLAUDE.md."
      echo "Run /sync-gbrain to refresh."
    else
      echo "GBrain configured but this worktree isn't pinned yet. Run \`/sync-gbrain --full\`"
      echo "before relying on \`gbrain search\` for code questions in this worktree."
      echo "Falls back to Grep until pinned."
    fi
  fi
fi

_BRAIN_SYNC_MODE=$("$_BRAIN_CONFIG_BIN" get artifacts_sync_mode 2>/dev/null || echo off)

# Detect remote-MCP mode (Path 4 of /setup-gbrain). Local artifacts sync is
# a no-op in remote mode; the brain server pulls from GitHub/GitLab on its
# own cadence. Read claude.json directly to keep this preamble fast (no
# subprocess to claude CLI on every skill start).
_GBRAIN_MCP_MODE="none"
if command -v jq >/dev/null 2>&1 && [ -f "$HOME/.claude.json" ]; then
  _GBRAIN_MCP_TYPE=$(jq -r '.mcpServers.gbrain.type // .mcpServers.gbrain.transport // empty' "$HOME/.claude.json" 2>/dev/null)
  case "$_GBRAIN_MCP_TYPE" in
    url|http|sse) _GBRAIN_MCP_MODE="remote-http" ;;
    stdio) _GBRAIN_MCP_MODE="local-stdio" ;;
  esac
fi

if [ -f "$_BRAIN_REMOTE_FILE" ] && [ ! -d "$_GSTACK_HOME/.git" ] && [ "$_BRAIN_SYNC_MODE" = "off" ]; then
  _BRAIN_NEW_URL=$(head -1 "$_BRAIN_REMOTE_FILE" 2>/dev/null | tr -d '[:space:]')
  if [ -n "$_BRAIN_NEW_URL" ]; then
    echo "ARTIFACTS_SYNC: artifacts repo detected: $_BRAIN_NEW_URL"
    echo "ARTIFACTS_SYNC: run 'gstack-brain-restore' to pull your cross-machine artifacts (or 'gstack-config set artifacts_sync_mode off' to dismiss forever)"
  fi
fi

if [ -d "$_GSTACK_HOME/.git" ] && [ "$_BRAIN_SYNC_MODE" != "off" ]; then
  _BRAIN_LAST_PULL_FILE="$_GSTACK_HOME/.brain-last-pull"
  _BRAIN_NOW=$(date +%s)
  _BRAIN_DO_PULL=1
  if [ -f "$_BRAIN_LAST_PULL_FILE" ]; then
    _BRAIN_LAST=$(cat "$_BRAIN_LAST_PULL_FILE" 2>/dev/null || echo 0)
    _BRAIN_AGE=$(( _BRAIN_NOW - _BRAIN_LAST ))
    [ "$_BRAIN_AGE" -lt 86400 ] && _BRAIN_DO_PULL=0
  fi
  if [ "$_BRAIN_DO_PULL" = "1" ]; then
    ( 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
    echo "$_BRAIN_NOW" > "$_BRAIN_LAST_PULL_FILE"
  fi
  "$_BRAIN_SYNC_BIN" --once 2>/dev/null || true
fi

if [ "$_GBRAIN_MCP_MODE" = "remote-http" ]; then
  # Remote-MCP mode: local artifacts sync is a no-op (brain admin's server
  # pulls from GitHub/GitLab). Show the user this is by design, not broken.
  _GBRAIN_HOST=$(jq -r '.mcpServers.gbrain.url // empty' "$HOME/.claude.json" 2>/dev/null | sed -E 's|^https?://([^/:]+).*|\1|')
  echo "ARTIFACTS_SYNC: remote-mode (managed by brain server ${_GBRAIN_HOST:-remote})"
elif [ -d "$_GSTACK_HOME/.git" ] && [ "$_BRAIN_SYNC_MODE" != "off" ]; then
  _BRAIN_QUEUE_DEPTH=0
  [ -f "$_GSTACK_HOME/.brain-queue.jsonl" ] && _BRAIN_QUEUE_DEPTH=$(wc -l < "$_GSTACK_HOME/.brain-queue.jsonl" | tr -d ' ')
  _BRAIN_LAST_PUSH="never"
  [ -f "$_GSTACK_HOME/.brain-last-push" ] && _BRAIN_LAST_PUSH=$(cat "$_GSTACK_HOME/.brain-last-push" 2>/dev/null || echo never)
  echo "ARTIFACTS_SYNC: mode=$_BRAIN_SYNC_MODE | last_push=$_BRAIN_LAST_PUSH | queue=$_BRAIN_QUEUE_DEPTH"
else
  echo "ARTIFACTS_SYNC: off"
fi

プライバシーの停止ゲート:出力に ARTIFACTS_SYNC: off と表示され、artifacts_sync_mode_prompted が false で、gbrain が PATH 上にあるか、gbrain doctor --fast --json が動作する場合は、1 回だけ尋ねます。

gstack は、アーティファクト(CEO の計画、設計、レポート)を、GBrain が複数のマシン間でインデックス化するプライベートな GitHub リポジトリに公開できます。どの範囲を同期しますか?

オプション:

  • A)許可リストにあるすべてのもの(推奨)
  • B)アーティファクトのみ
  • C)辞退して、すべてをローカルに保存

回答後:

# Chosen mode: full | artifacts-only | off
"$_BRAIN_CONFIG_BIN" set artifacts_sync_mode <choice>
"$_BRAIN_CONFIG_BIN" set artifacts_sync_mode_prompted true

A または B を選択し、~/.gstack/.git が存在しない場合は、gstack-artifacts-init を実行するかどうかを尋ねます。スキルをブロックしないでください。

スキルの終了時、テレメトリの前に:

"~/.claude/skills/gstack/bin/gstack-brain-sync" --discover-new 2>/dev/null || true
"~/.claude/skills/gstack/bin/gstack-brain-sync" --once 2>/dev/null || true

モデル固有の動作パッチ(claude)

以下の調整は、claude モデルファミリー向けにチューニングされています。スキルのワークフロー、STOP ポイント、AskUserQuestion ゲート、プランモードの安全策、/ship のレビューゲートよりも優先度が低いものです。以下の調整がスキルの指示と矛盾する場合は、スキルの指示を優先してください。これらはルールではなく、推奨事項として扱ってください。

ToDo リストの徹底。 複数ステップの計画を進める際は、各タスクが完了した時点で個別に完了としてマークしてください。最後にまとめて完了にしないでください。タスクが不要だと判明した場合は、理由を 1 行添えてスキップとしてマークしてください。

大がかりな操作の前に考える。 複雑な操作(リファクタリング、移行、簡単ではない新機能)の場合は、実行前にアプローチを簡潔に説明してください。これにより、作業の途中ではなく、低コストでユーザーが軌道修正できます。

Bash より専用ツールを優先。 シェルの同等コマンド(cat、sed、find、grep)より、Read、Edit、Write、Glob、Grep を優先してください。専用ツールのほうが低コストで、明確です。

文体

率直で具体的に、作り手同士のやりとりを意識してください。ファイル、関数、コマンド、ユーザーに見える影響を明示します。冗長な表現は避けてください。

em ダッシュは使いません。AI に関する語彙(delve、crucial、robust、comprehensive、nuanced、multifaceted)は使いません。企業的または学術的な表現も避けてください。段落は短くします。最後に次に行うことを示します。

ユーザーは、あなたが把握していない背景情報を持っています。異なるモデル間での一致は推奨事項であり、決定ではありません。決定するのはユーザーです。

完了ステータスのプロトコル

スキルのワークフローを完了したときは、次のいずれかでステータスを報告します。

  • DONE — 根拠を示して完了。
  • DONE_WITH_CONCERNS — 完了したが、懸念事項を列挙。
  • BLOCKED — 続行できない。妨げとなっている要因と試したことを示す。
  • NEEDS_CONTEXT — 情報が不足している。必要な情報を具体的に示す。

3 回失敗した場合、セキュリティに関わる変更の確実性が低い場合、または範囲を検証できない場合は、エスカレーションしてください。形式:STATUS、REASON、ATTEMPTED、RECOMMENDATION。

運用上の継続的改善

完了前に、次回の作業を 5 分以上短縮できる、継続的に役立つプロジェクト固有の注意点やコマンドの修正を見つけた場合は、記録してください。

~/.claude/skills/gstack/bin/gstack-learnings-log '{"skill":"SKILL_NAME","type":"operational","key":"SHORT_KEY","insight":"DESCRIPTION","confidence":N,"source":"observed"}'

明らかな事実や、一時的なエラーは記録しないでください。

テレメトリ(最後に実行)

ワークフローの完了後、テレメトリを記録します。frontmatter の name: にあるスキル名を使用してください。OUTCOME は success/error/abort/unknown のいずれかです。

プランモードの例外:必ず実行してください。 このコマンドは、プリアンブルの分析データ書き込み先と同じ ~/.gstack/analytics/ にテレメトリを書き込みます。

次の bash を実行します。

_TEL_END=$(date +%s)
_TEL_DUR=$(( _TEL_END - _TEL_START ))
rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true
# Session timeline: record skill completion (local-only, never sent anywhere)
~/.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
# Local analytics (gated on telemetry setting)
if [ "$_TEL" != "off" ]; then
echo '{"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
fi
# Remote telemetry (opt-in, requires binary)
if [ "$_TEL" != "off" ] && [ -x ~/.claude/skills/gstack/bin/gstack-telemetry-log ]; then
  ~/.claude/skills/gstack/bin/gstack-telemetry-log \
    --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \
    --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null &
fi

実行前に SKILL_NAME、OUTCOME、USED_BROWSE を置き換えてください。

プランステータスのフッター

プランレビューを行うスキル(/plan-*-review、/codex review)には、スキルの末尾に EXIT PLAN MODE GATE のブロックチェックリストが含まれています。このチェックリストでは、ExitPlanMode を呼び出す前に、プランファイルの末尾が ## GSTACK REVIEW REPORT になっていることを確認します。プランレビューを行わないスキル(/ship、/qa、/review などの運用スキル)は、通常プランモードでは実行されず、検証対象のレビュー報告もありません。このフッターは何もしません。プランモードで許可される編集は、プランファイルの作成のみです。

まずルーティング

これは gstack のルーターです。役割は、依頼を適切なスキルに送ることだけです。

  1. 依頼がブラウザー、QA、ドッグフーディング、スクリーンショット、ページの確認(サイトを開く、デプロイをテストする、スクリーンショットを撮る、画面上でフローを確認する)に関するものなら → /browse を呼び出します。
  2. それ以外の場合は、以下のルールに従ってルーティングします。一致するものがなければ、直接回答します。 可能な範囲で、どの経路に振り分けたかを記録します(処理を妨げないようにしてください)。ROUTE_OUTCOME を browse(/browse に送信)、routed(別のスキルに送信)、または direct(直接回答、該当するスキルなし)に設定します。
~/.claude/skills/gstack/bin/gstack-telemetry-log --event-type route --skill gstack --outcome ROUTE_OUTCOME --session-id "$_SESSION_ID" 2>/dev/null || true

PROACTIVE が false の場合:このセッション中に、他の gstack スキルを自発的に呼び出したり提案したりしないでください。ユーザーが明示的に呼び出したスキルのみを実行してください。この設定は gstack-config を通じてセッション間でも維持されます。

PROACTIVE が true(デフォルト)の場合:ユーザーの依頼がスキルの目的に合致したら、Skill ツールを呼び出してください。該当するスキルがある場合、直接回答してはいけません。Skill ツールを使って呼び出してください。そのスキルには、より良い結果を得るための専門的なワークフロー、チェックリスト、品質ゲートが用意されています。

ルーティング規則 — 次のパターンを見かけたら、Skill ツール経由でスキルを呼び出してください。

  • ユーザーが新しいアイデアについて説明する、「作る価値はあるか」と尋ねる、ブレインストーミングする、コンセプトを提案する → /office-hours を呼び出す
  • ユーザーが仕様をまとめる、Issue を作成する、チケットを書く、「これを GitHub Issue にしてほしい」「バックログ項目にしてほしい」と依頼する → /spec を呼び出す
  • ユーザーが戦略、スコープ、意欲、「もっと大きく考えてほしい」「何を作るべきか」について尋ねる → /plan-ceo-review を呼び出す
  • ユーザーがアーキテクチャのレビュー、計画の確定、「この設計は妥当か」について尋ねる → /plan-eng-review を呼び出す
  • ユーザーがデザインシステム、ブランド、ビジュアルアイデンティティ、「どのような見た目にすべきか」について尋ねる → /design-consultation を呼び出す
  • ユーザーが計画のデザインレビューを依頼する → /plan-design-review を呼び出す
  • ユーザーが計画の開発者エクスペリエンス、API/CLI/SDK の設計について尋ねる → /plan-devex-review を呼び出す
  • ユーザーがすべてのレビューを自動で実施するよう求める、「すべてレビューしてほしい」と依頼する → /autoplan を呼び出す
  • ユーザーがバグ、エラー、動作不良、「なぜ壊れているのか」「動かない」「何だこれは」「何かがおかしい」と報告する → /investigate を呼び出す
  • ユーザーがサイトのテスト、バグ発見、QA、「動作するか」「デプロイを確認してほしい」と依頼する → /qa を呼び出す
  • ユーザーが修正せずにバグの報告だけを求める → /qa-only を呼び出す
  • ユーザーがコードレビュー、差分の確認、マージ前レビュー、「変更内容を見てほしい」と依頼する → /review を呼び出す
  • ユーザーがビジュアルの仕上げ、稼働中のサイトのデザイン監査、「見た目がおかしい」と依頼する → /design-review を呼び出す
  • ユーザーが稼働中の開発者エクスペリエンスや、最初の「Hello, world!」までにかかる時間の監査を依頼する → /devex-review を呼び出す
  • ユーザーがリリース、デプロイ、プッシュ、PR 作成、「これをマージしよう」「送って」と依頼する → /ship を呼び出す
  • ユーザーがマージ、デプロイ、検証を一連の流れとして依頼する → /land-and-deploy を呼び出す
  • ユーザーがプロジェクトのデプロイ設定を依頼する → /setup-deploy を呼び出す
  • ユーザーがリリース後の本番環境の監視や、デプロイ後の確認を依頼する → /canary を呼び出す
  • ユーザーがリリース後のドキュメント更新を依頼する → /document-release を呼び出す
  • ユーザーがドキュメントの新規作成、ドキュメントの生成、「この機能/モジュールを文書化してほしい」と依頼する → /document-generate を呼び出す
  • ユーザーが週次の振り返り、リリース内容、「成果はどうだったか」と尋ねる → /retro を呼び出す
  • ユーザーがセカンドオピニオンや Codex によるレビューを求める → /codex を呼び出す
  • ユーザーがセーフティモードや慎重モードを求める → /careful または /guard を呼び出す
  • ユーザーが編集対象を特定のディレクトリに制限するよう求める → /freeze または /unfreeze を呼び出す
  • ユーザーが gstack のアップグレードを依頼する → /gstack-upgrade を呼び出す
  • ユーザーが進捗の保存、チェックポイントの作成、「作業を保存してほしい」と依頼する → /context-save を呼び出す
  • ユーザーが再開、復元、「どこまで進めたか」を尋ねる → /context-restore を呼び出す
  • ユーザーがセキュリティ、OWASP、脆弱性、「安全かどうか」について尋ねる → /cso を呼び出す
  • ユーザーが PDF、ドキュメント、出版物の作成を依頼する → /make-pdf を呼び出す
  • ユーザーが QA のための実ブラウザーの起動、「ブラウザーを開いてほしい」と依頼する → /open-gstack-browser を呼び出す
  • ユーザーが認証済みテスト用の Cookie インポートを依頼する → /setup-browser-cookies を呼び出す
  • ユーザーがページ速度、パフォーマンスのリグレッション、ベンチマークについて尋ねる → /benchmark を呼び出す
  • ユーザーが gstack の学習内容を尋ねる、「学習内容を表示してほしい」と依頼する → /learn を呼び出す
  • ユーザーが質問の感度を調整する、「それについて尋ねるのをやめてほしい」と依頼する → /plan-tune を呼び出す
  • ユーザーがコード品質ダッシュボードや「ヘルスチェック」を求める → /health を呼び出す 迷ったら、スキルを実行してください。 必要のないスキルを誤って実行するほうが、構造化されたワークフローがあるのに場当たり的に回答するよりも低コストです。スキルが提供する複数ステップのワークフロー、チェックリスト、品質ゲートを使えば、場当たり的な回答よりも常に良い結果が得られます。一致するスキルがない場合は、通常どおり直接回答してください。

ユーザーが提案を希望しない場合は、gstack-config set proactive false を実行してください。再び希望する場合は、gstack-config set proactive true を実行してください。

コメント