feat(i18n): add response_language config for cross-phase language consistency (#1412)

* feat(i18n): add response_language config for cross-phase language consistency

Adds `response_language` config key that propagates through all init
outputs via withProjectRoot(). Workflows read this field and instruct
agents to present user-facing questions in the configured language,
solving the problem of language preference resetting at phase boundaries.

Usage: gsd-tools config-set response_language "Portuguese"

Closes #1399

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* test(security): allowlist discuss-phase.md for size threshold

discuss-phase.md legitimately exceeds 50K chars due to power mode
and i18n directives — not prompt stuffing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Tibsfox
2026-04-04 04:49:10 -07:00
committed by GitHub
parent 9d626de5fa
commit dc2afa299b
10 changed files with 58 additions and 3 deletions

View File

@@ -99,6 +99,18 @@ describe('loadConfig', () => {
assert.strictEqual(config.model_overrides, null);
});
test('reads response_language when set', () => {
writeConfig({ response_language: 'Portuguese' });
const config = loadConfig(tmpDir);
assert.strictEqual(config.response_language, 'Portuguese');
});
test('returns response_language as null when not set', () => {
writeConfig({ model_profile: 'balanced' });
const config = loadConfig(tmpDir);
assert.strictEqual(config.response_language, null);
});
test('returns defaults when config.json contains invalid JSON', () => {
fs.writeFileSync(
path.join(tmpDir, '.planning', 'config.json'),