mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-09 06:28:59 +02:00
feat(setup): persistent timeline Stop hook opt-out — timeline_stop_hook config gate (#2677)
--no-team is a one-shot teardown, so every later bare ./setup (including the ones /gstack-upgrade runs) re-registered the timeline Stop hook with no way to say 'never'. New gate mirrors the plan_tune_hooks pattern: flag (--timeline-stop-hook/--no-timeline-stop-hook) > env (GSTACK_TIMELINE_STOP_HOOK) > saved config (timeline_stop_hook) > default yes. An explicit flag persists to config so the decision survives upgrades; an explicit 'no' also removes a live registration (reconciliation), so the opt-out works against installs registered by an older setup. --no-team semantics unchanged (NO_TEAM_MODE is never initialized from config). Full gstack-config surface: DEFAULTS entry, header docs, list/defaults enumeration, warn-and-default validation. Fixes #2677 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
7ed5e87bba
commit
079b36c7f8
@@ -183,6 +183,7 @@ SKILL_PREFIX_FLAG=0
|
||||
TEAM_MODE=0
|
||||
NO_TEAM_MODE=0
|
||||
PLAN_TUNE_HOOKS_MODE="" # "" = resolve from env/config/prompt; "yes"/"no" = explicit
|
||||
TIMELINE_STOP_HOOK_MODE="" # "" = resolve from env/config; "yes"/"no" = explicit (#2677)
|
||||
MODEL_OVERRIDE=""
|
||||
MODEL_OVERRIDE_SET=0
|
||||
while [ $# -gt 0 ]; do
|
||||
@@ -199,6 +200,9 @@ while [ $# -gt 0 ]; do
|
||||
--plan-tune-hooks) PLAN_TUNE_HOOKS_MODE="yes"; shift ;;
|
||||
--no-plan-tune-hooks) PLAN_TUNE_HOOKS_MODE="no"; shift ;;
|
||||
--plan-tune-hooks=*) PLAN_TUNE_HOOKS_MODE="${1#--plan-tune-hooks=}"; shift ;;
|
||||
--timeline-stop-hook) TIMELINE_STOP_HOOK_MODE="yes"; shift ;;
|
||||
--no-timeline-stop-hook) TIMELINE_STOP_HOOK_MODE="no"; shift ;;
|
||||
--timeline-stop-hook=*) TIMELINE_STOP_HOOK_MODE="${1#--timeline-stop-hook=}"; shift ;;
|
||||
-q|--quiet) QUIET=1; shift ;;
|
||||
*) shift ;;
|
||||
esac
|
||||
@@ -2463,7 +2467,35 @@ TIMELINE_STOP_HOOK="$(_hook_command_path hosts/claude/hooks/timeline-stop-hook |
|
||||
if [ "$IS_WINDOWS" -eq 1 ] && [ -n "$TIMELINE_STOP_HOOK" ]; then
|
||||
TIMELINE_STOP_HOOK="bash $TIMELINE_STOP_HOOK"
|
||||
fi
|
||||
if [ "$NO_TEAM_MODE" -ne 1 ] && [ -x "$SETTINGS_HOOK" ] && [ -n "$TIMELINE_STOP_HOOK" ]; then
|
||||
# #2677: PERSISTENT gate, mirroring the plan_tune_hooks pattern. --no-team is
|
||||
# (and stays) a one-shot teardown — every later bare ./setup, including the
|
||||
# ones /gstack-upgrade runs, re-registered the hook with no way to say
|
||||
# "never". Resolution: flag > env (GSTACK_TIMELINE_STOP_HOOK) > saved config
|
||||
# (timeline_stop_hook) > default yes. An explicit FLAG persists to config so
|
||||
# the decision survives upgrades; env stays session-scoped. Do NOT initialize
|
||||
# NO_TEAM_MODE from config — that would silently change --no-team semantics.
|
||||
if [ -n "$TIMELINE_STOP_HOOK_MODE" ]; then
|
||||
TL_DECISION="$TIMELINE_STOP_HOOK_MODE"
|
||||
elif [ -n "${GSTACK_TIMELINE_STOP_HOOK:-}" ]; then
|
||||
TL_DECISION="${GSTACK_TIMELINE_STOP_HOOK}"
|
||||
else
|
||||
TL_DECISION="$("$GSTACK_CONFIG" get timeline_stop_hook 2>/dev/null || true)"
|
||||
fi
|
||||
TL_DECISION=$(printf '%s' "$TL_DECISION" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]')
|
||||
case "$TL_DECISION" in
|
||||
n|no|false|skip|off|0) TL_DECISION="no" ;;
|
||||
*) TL_DECISION="yes" ;;
|
||||
esac
|
||||
if [ -n "$TIMELINE_STOP_HOOK_MODE" ]; then
|
||||
"$GSTACK_CONFIG" set timeline_stop_hook "$TL_DECISION" >/dev/null 2>&1 || true
|
||||
fi
|
||||
if [ "$TL_DECISION" = "no" ] && [ -x "$SETTINGS_HOOK" ]; then
|
||||
# Reconciliation arm: an explicit "no" with a live registration removes it —
|
||||
# the opt-out works even when the hook was registered by an older setup.
|
||||
"$SETTINGS_HOOK" remove-source --source gstack-timeline-stop >/dev/null 2>&1 || true
|
||||
log " timeline Stop hook disabled (timeline_stop_hook=no) — any existing registration removed"
|
||||
fi
|
||||
if [ "$NO_TEAM_MODE" -ne 1 ] && [ "$TL_DECISION" != "no" ] && [ -x "$SETTINGS_HOOK" ] && [ -n "$TIMELINE_STOP_HOOK" ]; then
|
||||
if _TL_ENSURE_OUT=$("$SETTINGS_HOOK" ensure-event \
|
||||
--event Stop \
|
||||
--command "$TIMELINE_STOP_HOOK" \
|
||||
|
||||
Reference in New Issue
Block a user