You are executing the `/gsd-set-profile` command. Switch the project's active model profile (simple/smart/genius) with optional model reuse. This command reads/writes: - `.planning/oc_config.json` — source of truth for profile state (profile_type, stage-to-model mapping) - `opencode.json` — agent model assignments (derived from profile; updated automatically by CLI) - `opencode.json` — external_directory permissions for reading GSD config folder (added automatically) Do NOT modify agent .md files. Profile switching only updates these two JSON files. ## Invocation 1. **Interactive wizard (no args):** `/gsd-set-profile` 2. **Direct switch (positional arg):** `/gsd-set-profile simple|smart|genius` ## Stage-to-Agent Mapping (11 agents) | Stage | Agents | |--------------|--------| | Planning | gsd-planner, gsd-plan-checker, gsd-phase-researcher, gsd-roadmapper, gsd-project-researcher, gsd-research-synthesizer, gsd-codebase-mapper | | Execution | gsd-executor, gsd-debugger | | Verification | gsd-verifier, gsd-integration-checker | ## Profile Types | Profile | Models | Stage assignment | |----------|--------|-----------------| | Simple | 1 | All stages use the same model | | Smart | 2 | Planning + Execution share one model; Verification uses a different model | | Genius | 3 | Each stage uses a different model | ## Output Format (reused throughout) When displaying profile state, always use this format: ``` Active profile: **{profile_name}** | Stage | Model | |--------------|-------| | Planning | {models.planning} | | Execution | {models.execution} | | Verification | {models.verification} | ``` ## Step 0: Ensure GSD config read permission Before any profile operations, ensure opencode.json has permission to read the GSD config folder: ```bash node ./.opencode/get-shit-done/bin/gsd-oc-tools.cjs allow-read-config --dry-run ``` Parse the response: - **`success: true` with `action: "permission_exists"`** — Permission already configured. Continue to Step 1. - **`success: true` with `action: "add_permission"`** — Permission would be added. Execute without `--dry-run`: Attempt to switch to the saved profile: ```bash node ./.opencode/get-shit-done/bin/gsd-oc-tools.cjs allow-read-config ``` - **`success: false`** — Handle error appropriately. This ensures gsd-opencode can access workflow files, templates, and configuration from `./.opencode/get-shit-done/`. ## Step 1: Load current profile Run `get-profile` to read the current state from `.planning/oc_config.json`: ```bash node ./.opencode/get-shit-done/bin/gsd-oc-tools.cjs get-profile ``` Parse the JSON response: - **`success: true`** — Extract `data` (keyed by profile name) containing `planning`, `execution`, `verification` model IDs. Display the profile using the Output Format. Continue to Step 2. - **`success: false` with `CONFIG_NOT_FOUND`** — No profile exists yet. Skip display, go directly to Step 2. ## Step 2: Determine target profile ### Path A — Positional argument provided If the user typed `/gsd-set-profile {type}` where `{type}` is one of `simple`, `smart`, `genius`: Attempt to switch to the saved profile: ```bash node ./.opencode/get-shit-done/bin/gsd-oc-tools.cjs set-profile {type} ``` - **`success: true`** — The profile already has saved model assignments. Display the updated configuration using the Output Format. Print: `Use /gsd-set-profile (without parameter) to change models assigned to stages.` **Stop.** - **`PROFILE_NOT_FOUND` error** — No saved models for this profile type. Fall through to Path B (interactive wizard) with the profile type pre-selected (skip the profile type picker, go straight to Step 3). ### Path B — No argument (interactive wizard) Prompt the user to choose a profile type using the question tool: ```json { "header": "Profile Type", "question": "Select a profile type for model configuration", "options": [ { "label": "Simple", "description": "1 model for all GSD stages (easiest setup)" }, { "label": "Smart", "description": "2 models: advanced for planning & execution, cheaper for verification" }, { "label": "Genius", "description": "3 models: different model for each stage" }, { "label": "Cancel", "description": "Exit without changes" } ] } ``` - If **Cancel** selected: print cancellation message and **stop**. - If invalid profile name was provided as positional arg: print `Unknown profile type '{name}'. Valid options: simple, smart, genius` and show this picker. ## Step 3: Model selection Based on the selected profile type, collect model choices. If a current profile exists from Step 1, offer to reuse its models where applicable. ### Simple (1 model) Ask the user (via question tool) if they want to keep the current model (only if one exists from Step 1). - **Yes:** Use existing model for all three stages. Go to Step 4. - **No** (or no current model exists): Load the `gsd-oc-select-model` skill. Select one model for "Simple Profile - All stages". Assign the selected model to `planning`, `execution`, and `verification`. ### Smart (2 models) Load the `gsd-oc-select-model` skill, then: 1. Select model for **"Smart Profile - Planning & Execution"** — assign to `planning` and `execution`. 2. Select model for **"Smart Profile - Verification"** — assign to `verification`. ### Genius (3 models) Load the `gsd-oc-select-model` skill, then: 1. Select model for **"Genius Profile - Planning"** — assign to `planning`. 2. Select model for **"Genius Profile - Execution"** — assign to `execution`. 3. Select model for **"Genius Profile - Verification"** — assign to `verification`. ## Step 4: Apply changes Using the collected values (`profile_name`, `model_for_planning_stage`, `model_for_execution_stage`, `model_for_verification_stage`), execute: ```bash node ./.opencode/get-shit-done/bin/gsd-oc-tools.cjs set-profile '{profile_name}:{"planning": "{model_for_planning_stage}", "execution": "{model_for_execution_stage}", "verification": "{model_for_verification_stage}"}' ``` Parse the response. On success, the CLI updates both `.planning/oc_config.json` and `opencode.json` (with automatic backup). ## Step 5: Confirm result Display the updated profile using the Output Format, prefixed with a checkmark: ``` Done! Updated {profile_name} profile: | Stage | Model | |--------------|-------| | Planning | {models.planning} | | Execution | {models.execution} | | Verification | {models.verification} | ``` We just updated the `./opencode.json` file. Apply the agent settings you need to **restart your opencode**. Note: GSD config read permission has been configured to allow access to `./.opencode/get-shit-done/`. - Use the question tool for ALL user input — never prompt via text. - Always display full model IDs (e.g., `bailian-coding-plan/qwen3-coder-plus`), never abbreviate. - All file reads/writes go through `gsd-oc-tools.cjs` — do not manually edit JSON files. - Backups are created automatically by the CLI when writing changes. - `.planning/oc_config.json` is the source of truth; `opencode.json` is always derived from it. - The `gsd-oc-select-model` skill handles paginated provider/model browsing — load it via the skill tool when model selection is needed.