diff --git a/src/config/unified-config-loader.ts b/src/config/unified-config-loader.ts index 69260584..cc8e0381 100644 --- a/src/config/unified-config-loader.ts +++ b/src/config/unified-config-loader.ts @@ -260,20 +260,22 @@ function normalizeContinuityInheritanceMap(value: unknown): Record): ContinuityConfig | undefined { - const continuityMap = normalizeContinuityInheritanceMap(partial.continuity?.inherit_from_account); - if (continuityMap) { - return { inherit_from_account: continuityMap }; - } - const legacyMap = normalizeContinuityInheritanceMap( (partial as Partial & { continuity_inherit_from_account?: unknown }) .continuity_inherit_from_account ); - if (legacyMap) { - return { inherit_from_account: legacyMap }; + const continuityMap = normalizeContinuityInheritanceMap(partial.continuity?.inherit_from_account); + + if (!legacyMap && !continuityMap) { + return undefined; } - return undefined; + return { + inherit_from_account: { + ...(legacyMap ?? {}), + ...(continuityMap ?? {}), + }, + }; } /** diff --git a/tests/unit/unified-config.test.ts b/tests/unit/unified-config.test.ts index 2b9d9c1e..6572a0df 100644 --- a/tests/unit/unified-config.test.ts +++ b/tests/unit/unified-config.test.ts @@ -226,4 +226,43 @@ describe('continuity-inheritance-config', () => { fs.rmSync(tempHome, { recursive: true, force: true }); } }); + + it('merges continuity.inherit_from_account with legacy continuity_inherit_from_account', () => { + const originalCcsHome = process.env.CCS_HOME; + const tempHome = fs.mkdtempSync(path.join(os.tmpdir(), 'ccs-continuity-merge-home-')); + const ccsDir = path.join(tempHome, '.ccs'); + fs.mkdirSync(ccsDir, { recursive: true }); + + fs.writeFileSync( + path.join(ccsDir, 'config.yaml'), + [ + 'version: 8', + 'continuity:', + ' inherit_from_account:', + ' glm: team-a', + ' copilot: work', + 'continuity_inherit_from_account:', + ' glm: legacy', + ' km: account-kimi', + '', + ].join('\n') + ); + + process.env.CCS_HOME = tempHome; + try { + const config = loadOrCreateUnifiedConfig(); + expect(config.continuity?.inherit_from_account).toEqual({ + glm: 'team-a', + copilot: 'work', + km: 'account-kimi', + }); + } finally { + if (originalCcsHome === undefined) { + delete process.env.CCS_HOME; + } else { + process.env.CCS_HOME = originalCcsHome; + } + fs.rmSync(tempHome, { recursive: true, force: true }); + } + }); });