From 4aea69e02cc31291fe6208bf1ee579a04b4e60e8 Mon Sep 17 00:00:00 2001 From: Rezolv Date: Sun, 15 Mar 2026 21:30:46 -0400 Subject: [PATCH] feat(do): add freeform text router command (#1067) * feat(do): add freeform text router command * test(do): update expected skill count from 36 to 37 --- commands/gsd/do.md | 30 +++++++++ get-shit-done/workflows/do.md | 104 ++++++++++++++++++++++++++++++++ get-shit-done/workflows/help.md | 14 +++++ tests/copilot-install.test.cjs | 4 +- 4 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 commands/gsd/do.md create mode 100644 get-shit-done/workflows/do.md diff --git a/commands/gsd/do.md b/commands/gsd/do.md new file mode 100644 index 000000000..69bebf573 --- /dev/null +++ b/commands/gsd/do.md @@ -0,0 +1,30 @@ +--- +name: gsd:do +description: Route freeform text to the right GSD command automatically +argument-hint: "" +allowed-tools: + - Read + - Bash + - AskUserQuestion +--- + +Analyze freeform natural language input and dispatch to the most appropriate GSD command. + +Acts as a smart dispatcher — never does the work itself. Matches intent to the best GSD command using routing rules, confirms the match, then hands off. + +Use when you know what you want but don't know which `/gsd:*` command to run. + + + +@~/.claude/get-shit-done/workflows/do.md +@~/.claude/get-shit-done/references/ui-brand.md + + + +$ARGUMENTS + + + +Execute the do workflow from @~/.claude/get-shit-done/workflows/do.md end-to-end. +Route user intent to the best GSD command and invoke it. + diff --git a/get-shit-done/workflows/do.md b/get-shit-done/workflows/do.md new file mode 100644 index 000000000..1e25d2ef1 --- /dev/null +++ b/get-shit-done/workflows/do.md @@ -0,0 +1,104 @@ + +Analyze freeform text from the user and route to the most appropriate GSD command. This is a dispatcher — it never does the work itself. Match user intent to the best command, confirm the routing, and hand off. + + + +Read all files referenced by the invoking prompt's execution_context before starting. + + + + + +**Check for input.** + +If `$ARGUMENTS` is empty, ask via AskUserQuestion: + +``` +What would you like to do? Describe the task, bug, or idea and I'll route it to the right GSD command. +``` + +Wait for response before continuing. + + + +**Check if project exists.** + +```bash +INIT=$(node "~/.claude/get-shit-done/bin/gsd-tools.cjs" state load 2>/dev/null) +``` + +Track whether `.planning/` exists — some routes require it, others don't. + + + +**Match intent to command.** + +Evaluate `$ARGUMENTS` against these routing rules. Apply the **first matching** rule: + +| If the text describes... | Route to | Why | +|--------------------------|----------|-----| +| Starting a new project, "set up", "initialize" | `/gsd:new-project` | Needs full project initialization | +| Mapping or analyzing an existing codebase | `/gsd:map-codebase` | Codebase discovery | +| A bug, error, crash, failure, or something broken | `/gsd:debug` | Needs systematic investigation | +| Exploring, researching, comparing, or "how does X work" | `/gsd:research-phase` | Domain research before planning | +| Discussing vision, "how should X look", brainstorming | `/gsd:discuss-phase` | Needs context gathering | +| A complex task: refactoring, migration, multi-file architecture, system redesign | `/gsd:add-phase` | Needs a full phase with plan/build cycle | +| Planning a specific phase or "plan phase N" | `/gsd:plan-phase` | Direct planning request | +| Executing a phase or "build phase N", "run phase N" | `/gsd:execute-phase` | Direct execution request | +| Running all remaining phases automatically | `/gsd:autonomous` | Full autonomous execution | +| A review or quality concern about existing work | `/gsd:verify-work` | Needs verification | +| Checking progress, status, "where am I" | `/gsd:progress` | Status check | +| Resuming work, "pick up where I left off" | `/gsd:resume-work` | Session restoration | +| A note, idea, or "remember to..." | `/gsd:add-todo` | Capture for later | +| Adding tests, "write tests", "test coverage" | `/gsd:add-tests` | Test generation | +| Completing a milestone, shipping, releasing | `/gsd:complete-milestone` | Milestone lifecycle | +| A specific, actionable, small task (add feature, fix typo, update config) | `/gsd:quick` | Self-contained, single executor | + +**Requires `.planning/` directory:** All routes except `/gsd:new-project`, `/gsd:map-codebase`, `/gsd:help`, and `/gsd:join-discord`. If the project doesn't exist and the route requires it, suggest `/gsd:new-project` first. + +**Ambiguity handling:** If the text could reasonably match multiple routes, ask the user via AskUserQuestion with the top 2-3 options. For example: + +``` +"Refactor the authentication system" could be: +1. /gsd:add-phase — Full planning cycle (recommended for multi-file refactors) +2. /gsd:quick — Quick execution (if scope is small and clear) + +Which approach fits better? +``` + + + +**Show the routing decision.** + +``` +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + GSD ► ROUTING +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +**Input:** {first 80 chars of $ARGUMENTS} +**Routing to:** {chosen command} +**Reason:** {one-line explanation} +``` + + + +**Invoke the chosen command.** + +Run the selected `/gsd:*` command, passing `$ARGUMENTS` as args. + +If the chosen command expects a phase number and one wasn't provided in the text, extract it from context or ask via AskUserQuestion. + +After invoking the command, stop. The dispatched command handles everything from here. + + + + + +- [ ] Input validated (not empty) +- [ ] Intent matched to exactly one GSD command +- [ ] Ambiguity resolved via user question (if needed) +- [ ] Project existence checked for routes that require it +- [ ] Routing decision displayed before dispatch +- [ ] Command invoked with appropriate arguments +- [ ] No work done directly — dispatcher only + diff --git a/get-shit-done/workflows/help.md b/get-shit-done/workflows/help.md index b31745efd..acbf7b1bb 100644 --- a/get-shit-done/workflows/help.md +++ b/get-shit-done/workflows/help.md @@ -116,6 +116,20 @@ Execute all plans in a phase. Usage: `/gsd:execute-phase 5` +### Smart Router + +**`/gsd:do `** +Route freeform text to the right GSD command automatically. + +- Analyzes natural language input to find the best matching GSD command +- Acts as a dispatcher — never does the work itself +- Resolves ambiguity by asking you to pick between top matches +- Use when you know what you want but don't know which `/gsd:*` command to run + +Usage: `/gsd:do fix the login button` +Usage: `/gsd:do refactor the auth system` +Usage: `/gsd:do I want to start a new milestone` + ### Quick Mode **`/gsd:quick [--full] [--discuss] [--research]`** diff --git a/tests/copilot-install.test.cjs b/tests/copilot-install.test.cjs index 92d56c344..0f7d50faf 100644 --- a/tests/copilot-install.test.cjs +++ b/tests/copilot-install.test.cjs @@ -626,7 +626,7 @@ describe('copyCommandsAsCopilotSkills', () => { // Count gsd-* directories — should be 31 const dirs = fs.readdirSync(tempDir, { withFileTypes: true }) .filter(e => e.isDirectory() && e.name.startsWith('gsd-')); - assert.strictEqual(dirs.length, 36, `expected 36 skill folders, got ${dirs.length}`); + assert.strictEqual(dirs.length, 37, `expected 37 skill folders, got ${dirs.length}`); } finally { fs.rmSync(tempDir, { recursive: true }); } @@ -1120,7 +1120,7 @@ const { execFileSync } = require('child_process'); const crypto = require('crypto'); const INSTALL_PATH = path.join(__dirname, '..', 'bin', 'install.js'); -const EXPECTED_SKILLS = 36; +const EXPECTED_SKILLS = 37; const EXPECTED_AGENTS = 15; function runCopilotInstall(cwd) {