From 38a654d5e4677cfa7880de3ae013fc362497a5b4 Mon Sep 17 00:00:00 2001 From: Mikael Hugo Date: Sat, 9 May 2026 16:56:14 +0200 Subject: [PATCH] fix(ux): exit YOLO before Shift+Tab or /mode preset switch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ghost state bug: pressing Shift+Tab or /mode while YOLO was active left session.yolo=true and settingsManager bypass ON even though mode changed. - Shift+Tab handler calls s.toggleYolo() + settingsManager.toggleYOLO() before cycling to the next preset when YOLO is active - handleModeCommand does the same before applying a named preset This keeps yolo flag, status display ('SF — 🚀 YOLO'), and safe-git bypass in sync with the actual running mode at all times. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/resources/extensions/sf/commands/handlers/core.js | 7 +++++++ .../extensions/sf/steerable-autonomous-extension.js | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/resources/extensions/sf/commands/handlers/core.js b/src/resources/extensions/sf/commands/handlers/core.js index 2339b16cc..f5acdc19b 100644 --- a/src/resources/extensions/sf/commands/handlers/core.js +++ b/src/resources/extensions/sf/commands/handlers/core.js @@ -437,6 +437,13 @@ function handleModeCommand(args, ctx) { const name = parts[0].toLowerCase(); const preset = resolvePreset(name); if (preset) { + // If YOLO is active, exit it first so status and safe-git bypass are cleared + if (s.isYolo()) { + s.toggleYolo(); + if (ctx.settingsManager && ctx.settingsManager.toggleYOLO) { + ctx.settingsManager.toggleYOLO(); + } + } const prev = inferPresetName(s.getMode()) ?? s.getMode().workMode; s.setMode({ workMode: preset.workMode, diff --git a/src/resources/extensions/sf/steerable-autonomous-extension.js b/src/resources/extensions/sf/steerable-autonomous-extension.js index 084d06e64..c5ebce86e 100644 --- a/src/resources/extensions/sf/steerable-autonomous-extension.js +++ b/src/resources/extensions/sf/steerable-autonomous-extension.js @@ -49,6 +49,13 @@ export default function steerableAutonomousExtension(api) { // Outside autonomous: cycle through Ask → Plan → Build presets try { const s = getAutoSession(); + // If YOLO is active, exit it first so status and git bypass stay consistent + if (s.isYolo()) { + s.toggleYolo(); + if (ctx.settingsManager && ctx.settingsManager.toggleYOLO) { + ctx.settingsManager.toggleYOLO(); + } + } const current = inferPresetName(s.getMode()) ?? SF_MODE_PRESET_NAMES[0]; const idx = SF_MODE_PRESET_NAMES.indexOf(current); const nextName = SF_MODE_PRESET_NAMES[(idx + 1) % SF_MODE_PRESET_NAMES.length];