From 85f844b3c90a28729107a39ab08d8415b3041891 Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Sat, 4 Apr 2026 21:00:34 -0700 Subject: [PATCH] feat: add --team, --no-team, -q flags to setup --team enables auto_upgrade and registers SessionStart hook via gstack-settings-hook. --no-team reverses it. -q/--quiet suppresses all informational output (for hook-triggered setup runs). --local now prints a deprecation warning. Replaces ~20 echo calls with log() helper for quiet mode support. Part of team-install-mode feature (credit: Jared Friedman). Co-Authored-By: Claude Opus 4.6 (1M context) --- setup | 81 ++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/setup b/setup index 7e74c64f..a81f6b00 100755 --- a/setup +++ b/setup @@ -27,11 +27,17 @@ case "$(uname -s)" in MINGW*|MSYS*|CYGWIN*|Windows_NT) IS_WINDOWS=1 ;; esac +# ─── Quiet mode helper ──────────────────────────────────────── +QUIET=0 +log() { [ "$QUIET" -eq 0 ] && echo "$@" || true; } + # ─── Parse flags ────────────────────────────────────────────── HOST="claude" LOCAL_INSTALL=0 SKILL_PREFIX=1 SKILL_PREFIX_FLAG=0 +TEAM_MODE=0 +NO_TEAM_MODE=0 while [ $# -gt 0 ]; do case "$1" in --host) [ -z "$2" ] && echo "Missing value for --host (expected claude, codex, kiro, or auto)" >&2 && exit 1; HOST="$2"; shift 2 ;; @@ -39,6 +45,9 @@ while [ $# -gt 0 ]; do --local) LOCAL_INSTALL=1; shift ;; --prefix) SKILL_PREFIX=1; SKILL_PREFIX_FLAG=1; shift ;; --no-prefix) SKILL_PREFIX=0; SKILL_PREFIX_FLAG=1; shift ;; + --team) TEAM_MODE=1; shift ;; + --no-team) NO_TEAM_MODE=1; shift ;; + -q|--quiet) QUIET=1; shift ;; *) shift ;; esac done @@ -59,8 +68,10 @@ if [ "$SKILL_PREFIX_FLAG" -eq 0 ]; then elif [ "$_saved_prefix" = "false" ]; then SKILL_PREFIX=0 else - # No saved preference — prompt interactively (or default flat for non-TTY) - if [ -t 0 ]; then + # No saved preference — prompt interactively (or default flat for non-TTY/quiet) + if [ "$QUIET" -eq 1 ]; then + SKILL_PREFIX=0 + elif [ -t 0 ]; then echo "" echo "Skill naming: how should gstack skills appear?" echo "" @@ -87,8 +98,10 @@ else "$GSTACK_CONFIG" set skill_prefix "$([ "$SKILL_PREFIX" -eq 1 ] && echo true || echo false)" 2>/dev/null || true fi -# --local: install to .claude/skills/ in the current working directory +# --local: install to .claude/skills/ in the current working directory (deprecated) if [ "$LOCAL_INSTALL" -eq 1 ]; then + echo "Warning: --local is deprecated. Use global install + --team instead." >&2 + echo " See: https://github.com/garrytan/gstack#team-mode" >&2 if [ "$HOST" = "codex" ]; then echo "Error: --local is only supported for Claude Code (not Codex)." >&2 exit 1 @@ -138,7 +151,7 @@ migrate_direct_codex_install() { exit 1 fi - echo "Migrating direct Codex install to $migrated_dir to avoid duplicate skill discovery..." + log "Migrating direct Codex install to $migrated_dir to avoid duplicate skill discovery..." mv "$gstack_dir" "$migrated_dir" SOURCE_GSTACK_DIR="$migrated_dir" INSTALL_GSTACK_DIR="$migrated_dir" @@ -179,7 +192,7 @@ elif [ -f "$SOURCE_GSTACK_DIR/bun.lock" ] && [ "$SOURCE_GSTACK_DIR/bun.lock" -nt fi if [ "$NEEDS_BUILD" -eq 1 ]; then - echo "Building browse binary..." + log "Building browse binary..." ( cd "$SOURCE_GSTACK_DIR" bun install @@ -205,7 +218,7 @@ AGENTS_DIR="$SOURCE_GSTACK_DIR/.agents/skills" NEEDS_AGENTS_GEN=1 if [ "$NEEDS_AGENTS_GEN" -eq 1 ] && [ "$NEEDS_BUILD" -eq 0 ]; then - echo "Generating .agents/ skill docs..." + log "Generating .agents/ skill docs..." ( cd "$SOURCE_GSTACK_DIR" bun install --frozen-lockfile 2>/dev/null || bun install @@ -215,7 +228,7 @@ fi # 1c. Generate .factory/ Factory Droid skill docs if [ "$INSTALL_FACTORY" -eq 1 ] && [ "$NEEDS_BUILD" -eq 0 ]; then - echo "Generating .factory/ skill docs..." + log "Generating .factory/ skill docs..." ( cd "$SOURCE_GSTACK_DIR" bun install --frozen-lockfile 2>/dev/null || bun install @@ -604,16 +617,16 @@ if [ "$INSTALL_CLAUDE" -eq 1 ]; then ln -snf "gstack/open-gstack-browser" "$_OGB_LINK" fi if [ "$LOCAL_INSTALL" -eq 1 ]; then - echo "gstack ready (project-local)." - echo " skills: $INSTALL_SKILLS_DIR" + log "gstack ready (project-local)." + log " skills: $INSTALL_SKILLS_DIR" else - echo "gstack ready (claude)." + log "gstack ready (claude)." fi - echo " browse: $BROWSE_BIN" + log " browse: $BROWSE_BIN" else - echo "gstack ready (claude)." - echo " browse: $BROWSE_BIN" - echo " (skipped skill symlinks — not inside .claude/skills/)" + log "gstack ready (claude)." + log " browse: $BROWSE_BIN" + log " (skipped skill symlinks — not inside .claude/skills/)" fi fi @@ -633,9 +646,9 @@ if [ "$INSTALL_CODEX" -eq 1 ]; then # Install generated Codex-format skills (not Claude source dirs) link_codex_skill_dirs "$SOURCE_GSTACK_DIR" "$CODEX_SKILLS" - echo "gstack ready (codex)." - echo " browse: $BROWSE_BIN" - echo " codex skills: $CODEX_SKILLS" + log "gstack ready (codex)." + log " browse: $BROWSE_BIN" + log " codex skills: $CODEX_SKILLS" fi # 6. Install for Kiro CLI (copy from .agents/skills, rewrite paths) @@ -740,7 +753,39 @@ fi # 9. First-time welcome + legacy cleanup if [ ! -f "$HOME/.gstack/.welcome-seen" ]; then - echo " Welcome! Run /gstack-upgrade anytime to stay current." + log " Welcome! Run /gstack-upgrade anytime to stay current." touch "$HOME/.gstack/.welcome-seen" fi rm -f /tmp/gstack-latest-version + +# 10. Team mode: register/unregister SessionStart hook +SETTINGS_HOOK="$SOURCE_GSTACK_DIR/bin/gstack-settings-hook" +HOOK_CMD="$SOURCE_GSTACK_DIR/bin/gstack-session-update" + +if [ "$TEAM_MODE" -eq 1 ]; then + "$GSTACK_CONFIG" set auto_upgrade true 2>/dev/null || true + + # Register SessionStart hook in Claude Code settings + if [ -x "$SETTINGS_HOOK" ]; then + "$SETTINGS_HOOK" add "$HOOK_CMD" 2>/dev/null || true + fi + + log "" + log "Team mode enabled: gstack will auto-update at the start of each Claude Code session." + log " Hook: $HOOK_CMD" + log " To disable: ./setup --no-team" + log "" + log "Bootstrap your repo:" + log " cd && $SOURCE_GSTACK_DIR/bin/gstack-team-init required" +fi + +if [ "$NO_TEAM_MODE" -eq 1 ]; then + "$GSTACK_CONFIG" set auto_upgrade false 2>/dev/null || true + + # Remove SessionStart hook from Claude Code settings + if [ -x "$SETTINGS_HOOK" ]; then + "$SETTINGS_HOOK" remove "$HOOK_CMD" 2>/dev/null || true + fi + + log "Team mode disabled: auto-update hook removed." +fi