From c9fe4cc42499af768d8b1f99ee63acc9e424af0a Mon Sep 17 00:00:00 2001 From: Joshua Gilbert <54961107+Joshua-Gilbert@users.noreply.github.com> Date: Fri, 14 Aug 2026 11:56:04 -0700 Subject: [PATCH] fix(server): the mode schema advertises the real board vocabulary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The create_task and set_task_mode descriptions listed four modes — code / advanced / ask / orchestrator — of the board's eight, so an agent reading the schema had no way to learn it can ask for plan, review, refactor, or devsecops. The half it did list is also the half Bob 2.0 no longer runs under those names: code, advanced and orchestrator all remap to agent at dispatch. List all eight, mark which are read-only, and state the two things a caller cannot infer from the slug alone: that the 1.x trio runs as agent on 2.0, and that review/refactor/devsecops resolve only where the workspace carries .bob/custom_modes.yaml (elsewhere they now downgrade with a warning rather than hang). Point at predict_mode for the routing preview instead of restating the keyword table. lhm.plugin.json carries the same two strings verbatim — it is the marketplace listing's copy of this schema — so it moves with them. --- lhm.plugin.json | 4 ++-- src/server.ts | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lhm.plugin.json b/lhm.plugin.json index 4b1fdb2..9d4440a 100644 --- a/lhm.plugin.json +++ b/lhm.plugin.json @@ -53,7 +53,7 @@ }, "mode": { "type": "string", - "description": "Bob mode to run this task in: 'code' | 'advanced' (adds MCP/Browser) | 'ask' (read-only) | 'orchestrator', or a custom mode slug. Omit to let the dispatcher auto-route from the task content." + "description": "Bob mode to run this task in: 'code' (default) | 'advanced' (adds MCP/Browser) | 'orchestrator' | 'ask' | 'plan' | 'review' | 'refactor' | 'devsecops', or a custom slug. 'ask'/'plan'/'review' are read-only. On Bob 2.0 'code'/'advanced'/'orchestrator' all run as 'agent', and 'review'/'refactor'/'devsecops' come from the workspace's .bob/custom_modes.yaml — without it they run in a fallback mode and warn. Omit to auto-route from the task content (preview with predict_mode)." }, "depends_on": { "type": "array", @@ -470,7 +470,7 @@ }, "mode": { "type": "string", - "description": "Mode slug ('code' | 'advanced' | 'ask' | 'orchestrator' | custom), or '' to clear" + "description": "Mode slug ('code' | 'advanced' | 'orchestrator' | 'ask' | 'plan' | 'review' | 'refactor' | 'devsecops' | custom), or '' to clear and restore auto-routing" } }, "required": [ diff --git a/src/server.ts b/src/server.ts index f8f5a83..e2cd515 100644 --- a/src/server.ts +++ b/src/server.ts @@ -89,7 +89,7 @@ server.registerTool( .string() .optional() .describe( - "Bob mode to run this task in: 'code' | 'advanced' (adds MCP/Browser) | 'ask' (read-only) | 'orchestrator', or a custom mode slug. Omit to let the dispatcher auto-route from the task content.", + "Bob mode to run this task in: 'code' (default) | 'advanced' (adds MCP/Browser) | 'orchestrator' | 'ask' | 'plan' | 'review' | 'refactor' | 'devsecops', or a custom slug. 'ask'/'plan'/'review' are read-only. On Bob 2.0 'code'/'advanced'/'orchestrator' all run as 'agent', and 'review'/'refactor'/'devsecops' come from the workspace's .bob/custom_modes.yaml — without it they run in a fallback mode and warn. Omit to auto-route from the task content (preview with predict_mode).", ), depends_on: z .array(z.number().int()) @@ -513,7 +513,11 @@ server.registerTool( "Set or clear a task's Bob mode slug. Pass an empty string to clear it and let the dispatcher auto-route.", inputSchema: { id: z.number().int(), - mode: z.string().describe("Mode slug ('code' | 'advanced' | 'ask' | 'orchestrator' | custom), or '' to clear"), + mode: z + .string() + .describe( + "Mode slug ('code' | 'advanced' | 'orchestrator' | 'ask' | 'plan' | 'review' | 'refactor' | 'devsecops' | custom), or '' to clear and restore auto-routing", + ), }, }, async ({ id, mode }) => {