gstack

gstack

熱門

gstack Skill 套件的分流路由器。(gstack)

12萬星標
1.8萬分支
更新於 2026/7/2
SKILL.md
唯讀
名稱
gstack
描述

gstack Skill 套件的分流路由器。(gstack)

版本
1.2.0

<!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->
<!-- Regenerate: bun run gen:skill-docs -->

何時呼叫此 Skill

將任何 gstack 請求指派至合適的 Skill(規劃、審查、QA、發布、除錯、文件、安全性、設計)。針對瀏覽器 / QA 與 Dogfooding 測試,它會指引你使用 /browse。當 guarantee 在未指定特定 Skill 的情況下呼叫 gstack,或是詢問「哪個 gstack Skill 適合這個任務?」時使用。

前置腳本(優先執行)

_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$Dcodex exec/codex review、寫入 ~/.gstack/、寫入計劃檔案,以及對生成的產物執行 open

在計劃模式下呼叫 Skill

若使用者在計劃模式下呼叫 Skill,該 Skill 的執行優先度高於一般計劃模式行為。請將 Skill 檔案視為可執行的指令,而非僅供參考的說明。 請從 Step 0 開始逐步執行;第一個 AskUserQuestion 代表工作流程進入計劃模式,並非違反規範。AskUserQuestion(任何變體 — mcp__*__AskUserQuestion 或原生形式;請參閱「AskUserQuestion Format → Tool resolution」)皆滿足計劃模式的回合結束要求。若 AskUserQuestion 無法使用或呼叫失敗,請遵循 AskUserQuestion Format 的備援機制:headless → BLOCKED;interactive → 散文備援(Prose fallback,同樣滿足回合結束要求)。到達 STOP 節點時,請立即停止,不要繼續執行工作流程或在該處呼叫 ExitPlanMode。標示為「PLAN MODE EXCEPTION — ALWAYS RUN」的命令仍須執行。僅在 Skill 工作流程完全結束,或使用者指示你取消 Skill/離開計劃模式時,才呼叫 ExitPlanMode。

PROACTIVE"false",請勿自動呼叫或主動推薦 Skill。若認為某個 Skill 有所幫助,請詢問:「我覺得 /skillname 對這個任務有幫助 — 需要我執行它嗎?」

SKILL_PREFIX"true",請推薦/呼叫 /gstack-* 格式的名稱。磁碟路徑則保持為 ~/.claude/skills/gstack/[skill-name]/SKILL.md

若輸出顯示 UPGRADE_AVAILABLE <old> <new>:閱讀 ~/.claude/skills/gstack/gstack-upgrade/SKILL.md 並遵循「內嵌升級流程」(若已設定則自動升級,否則透過 AskUserQuestion 提供 4 個選項,若拒絕則寫入延後狀態)。

若輸出顯示 JUST_UPGRADED <from> <to>:印出 "Running gstack v{to} (just updated!)"。若 SPAWNED_SESSION 為 true,則跳過新功能探索。

新功能探索(每次 Session 最多提示一次):

  • 缺少 ~/.claude/skills/gstack/.feature-prompted-continuous-checkpoint:透過 AskUserQuestion 詢問是否開啟 Continuous checkpoint 自動 Commit。若接受,執行 ~/.claude/skills/gstack/bin/gstack-config set checkpoint_mode continuous。無論如何皆需 touch 標記檔案。
  • 缺少 ~/.claude/skills/gstack/.feature-prompted-model-overlay:提示 "Model overlays are active. MODEL_OVERLAY shows the patch."。無論如何皆需 touch 標記檔案。

完成升級提示後,繼續執行工作流程。

WRITING_STYLE_PENDINGyes:詢問一次寫作風格偏好:

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_PENDINGno 則跳過。

LAKE_INTROno:提示 "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

僅在回答 yes 時執行 open。不論如何皆須執行 touch

TEL_PROMPTEDnoLAKE_INTROyes:透過 AskUserQuestion 詢問一次遙測權限:

協助讓 gstack 變得更好。僅分享使用數據:Skill、耗時、崩潰記錄、穩定裝置 ID。絕不包含程式碼或檔案路徑。儲存庫名稱僅在本地記錄,上傳前即會移除。

選項:

  • A) 協助讓 gstack 變得更好!(推薦)
  • B) 不用了,謝謝

若選擇 A:執行 ~/.claude/skills/gstack/bin/gstack-config set telemetry community

若選擇 B:追問以下問題:

匿名模式僅傳送彙整的使用數據,不會包含任何唯一識別碼。

選項:

  • 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_PROMPTEDyes 則跳過。

PROACTIVE_PROMPTEDnoTEL_PROMPTEDyes:詢問一次:

允許 gstack 主動推薦 Skill,例如針對「這能運作嗎?」推薦 /qa,或是針對 Bug 推薦 /investigate?

選項:

  • A) 保持開啟(推薦)
  • B) 關閉提示 — 我會自己輸入 / 指令

若選擇 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_PROMPTEDyes 則跳過。

初次執行指引(僅一次)

ACTIVATEDno(在此機器上首次執行 Skill)且前置腳本印出了非空且非 nongitFIRST_TASK: 值:顯示一行根據 Token 對應的短暫專案提示,然後繼續執行使用者實際要求的任務 — 切勿中斷使用者的任務。Token 對應表:greenfield → "全新專案 — 先使用 /spec/office-hours 來規劃構架。" code_node/code_python/code_rust/code_go/code_ruby/code_ios → "