From f6299c4d678001501ef1ae56cf9a79f89c89d344 Mon Sep 17 00:00:00 2001 From: jkrperson Date: Sat, 25 Apr 2026 02:53:59 +0800 Subject: [PATCH] feat(installer): clearer wizard labels for install vs team mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "Add to this project (team mode)" implied team mode replaces the global install when it actually stacks on top of it. Relabels the wizard so the relationship is explicit: - "Install gstack on this machine" (was "Install globally (on this machine)") - "Enable team mode for this repo" (was "Add to this project (team mode)") with hint: "global install + commits team-sync config to this repo so teammates auto-update" Pre-select intro note now says upfront that there are two install modes and that team mode is a superset of the machine install. Required/optional tier hints now say what each actually does (PreToolUse hook block vs CLAUDE.md nudge) instead of vague "block sessions" / "nudge teammates". No behavior changes — labels and hint text only. 77 tests still pass. --- installer/src/wizard.ts | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/installer/src/wizard.ts b/installer/src/wizard.ts index 7e6cb28c9..a4f884ad1 100644 --- a/installer/src/wizard.ts +++ b/installer/src/wizard.ts @@ -23,11 +23,18 @@ export async function runWizard(): Promise { if (!alreadyInstalled) { p.note( "gstack turns Claude Code into a virtual engineering team.\n" + - "CEO review, eng manager, designer, QA, release engineer — all /commands.", + "CEO review, eng manager, designer, QA, release engineer — all /commands.\n\n" + + "Two install modes:\n" + + " • Machine install — just for you, manual upgrades\n" + + " • Team mode — machine install + repo config so teammates auto-update", "about", ); } else { - p.note(`Already installed at ${paths.gstackDir}.`, "detected"); + p.note( + `Already installed at ${paths.gstackDir}.\n\n` + + "Team mode adds auto-update + repo-level config on top of this install.", + "detected", + ); } type Mode = "install" | "init" | "uninstall" | "doctor"; @@ -36,13 +43,15 @@ export async function runWizard(): Promise { options: [ { value: "install", - label: alreadyInstalled ? "Update global install" : "Install globally (on this machine)", - hint: "~/.claude/skills/gstack", + label: alreadyInstalled ? "Update global install" : "Install gstack on this machine", + hint: "installs to ~/.claude/skills/gstack — just you, manual upgrades", }, { value: "init", - label: "Add to this project (team mode)", - hint: inRepo ? "teammates auto-update on session start" : "must be inside a git repo", + label: "Enable team mode for this repo", + hint: inRepo + ? "global install + commits team-sync config to this repo so teammates auto-update" + : "must be inside a git repo", }, { value: "uninstall", label: "Uninstall", hint: "remove gstack" }, { value: "doctor", label: "Doctor", hint: "diagnose install issues" }, @@ -130,12 +139,12 @@ export async function runWizard(): Promise { { value: "required", label: "Required", - hint: "block sessions without gstack", + hint: "PreToolUse hook blocks Claude Code work until teammate runs gstack install", }, { value: "optional", label: "Optional", - hint: "nudge teammates, don't block", + hint: "CLAUDE.md nudge only — teammate can ignore", }, ], initialValue: "required",