From ef436aae625f64cb34c574bc388f16e7a1405079 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 1 Jun 2026 09:52:39 -0400 Subject: [PATCH] fix(#492): manifest effort.agent_overrides and effort.default now fall back correctly Steps 2 and 4 of resolveEffortInternal now include an else branch that consults CANONICAL_CONFIG_DEFAULTS.effort when effortCfg is null, mirroring the existing Step 3 manifest-fallback pattern for routing_tier_defaults. Co-authored-by: Claude Sonnet 4.6 --- .changeset/plucky-yaks-forage.md | 5 ++ get-shit-done/bin/lib/core.cjs | 9 ++++ .../bug-492-effort-manifest-fallback.test.cjs | 50 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 .changeset/plucky-yaks-forage.md create mode 100644 tests/bug-492-effort-manifest-fallback.test.cjs diff --git a/.changeset/plucky-yaks-forage.md b/.changeset/plucky-yaks-forage.md new file mode 100644 index 000000000..7ebdfafbe --- /dev/null +++ b/.changeset/plucky-yaks-forage.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 577 +--- +effort.agent_overrides and effort.default in config-defaults.manifest.json now fall back correctly when no project-level effort config exists diff --git a/get-shit-done/bin/lib/core.cjs b/get-shit-done/bin/lib/core.cjs index 3fec86289..49bc5781c 100644 --- a/get-shit-done/bin/lib/core.cjs +++ b/get-shit-done/bin/lib/core.cjs @@ -1855,6 +1855,12 @@ function resolveEffortInternal(cwd, agentType, opts) { const v = ao[agentType]; if (typeof v === 'string' && EFFORT_SET.has(v)) return v; } + } else { + const mao = CANONICAL_CONFIG_DEFAULTS.effort && CANONICAL_CONFIG_DEFAULTS.effort.agent_overrides; + if (mao && typeof mao === 'object' && !Array.isArray(mao)) { + const v = mao[agentType]; + if (typeof v === 'string' && EFFORT_SET.has(v)) return v; + } } // Step 3: routing_tier_defaults by agent's default tier. @@ -1886,6 +1892,9 @@ function resolveEffortInternal(cwd, agentType, opts) { if (effortCfg) { const d = effortCfg.default; if (typeof d === 'string' && EFFORT_SET.has(d)) return d; + } else { + const d = CANONICAL_CONFIG_DEFAULTS.effort && CANONICAL_CONFIG_DEFAULTS.effort.default; + if (typeof d === 'string' && EFFORT_SET.has(d)) return d; } // Step 5: hardcoded default diff --git a/tests/bug-492-effort-manifest-fallback.test.cjs b/tests/bug-492-effort-manifest-fallback.test.cjs new file mode 100644 index 000000000..d5dde8945 --- /dev/null +++ b/tests/bug-492-effort-manifest-fallback.test.cjs @@ -0,0 +1,50 @@ +'use strict'; + +process.env.GSD_TEST_MODE = "1"; + +const { describe, test, beforeEach, afterEach } = require("node:test"); +const assert = require("node:assert/strict"); +const path = require("path"); +const { createTempProject, cleanup } = require("./helpers.cjs"); +const { resolveEffortInternal, CONFIG_DEFAULTS } = require("../get-shit-done/bin/lib/core.cjs"); +const { CONFIG_DEFAULTS: CANONICAL_CONFIG_DEFAULTS } = require("../get-shit-done/bin/lib/configuration.cjs"); + +describe("#492 manifest effort fallback", () => { + let tmpDir; + beforeEach(() => { tmpDir = createTempProject(); }); + afterEach(() => { cleanup(tmpDir); }); + + test("routing_tier_defaults manifest fallback still works", () => { + assert.strictEqual(resolveEffortInternal(tmpDir, "gsd-planner"), "xhigh"); + }); + + test("manifest effort.agent_overrides wins over routing_tier_defaults when no project config", () => { + const original = CANONICAL_CONFIG_DEFAULTS.effort.agent_overrides; + try { + CANONICAL_CONFIG_DEFAULTS.effort.agent_overrides = { "gsd-planner": "max" }; + assert.strictEqual(resolveEffortInternal(tmpDir, "gsd-planner"), "max"); + } finally { + CANONICAL_CONFIG_DEFAULTS.effort.agent_overrides = original; + } + }); + + test("manifest effort.default consulted for unknown agent with no project config", () => { + const original = CANONICAL_CONFIG_DEFAULTS.effort.default; + try { + CANONICAL_CONFIG_DEFAULTS.effort.default = "max"; + assert.strictEqual(resolveEffortInternal(tmpDir, "fictional-agent-xyz-492"), "max"); + } finally { + CANONICAL_CONFIG_DEFAULTS.effort.default = original; + } + }); + + test("manifest agent_overrides takes precedence over manifest routing_tier_defaults", () => { + const originalAgentOverrides = CANONICAL_CONFIG_DEFAULTS.effort.agent_overrides; + try { + CANONICAL_CONFIG_DEFAULTS.effort.agent_overrides = { "gsd-planner": "minimal" }; + assert.strictEqual(resolveEffortInternal(tmpDir, "gsd-planner"), "minimal"); + } finally { + CANONICAL_CONFIG_DEFAULTS.effort.agent_overrides = originalAgentOverrides; + } + }); +});