Merge pull request #1253 from gsd-build/fix/commit-docs-gitignore-autodetect-1250

fix(core): auto-detect commit_docs from gitignore in loadConfig
This commit is contained in:
Tom Boucher
2026-03-20 11:02:51 -04:00
committed by GitHub
2 changed files with 74 additions and 2 deletions

View File

@@ -10,7 +10,7 @@ const assert = require('node:assert');
const fs = require('fs');
const path = require('path');
const os = require('os');
const { createTempProject, cleanup } = require('./helpers.cjs');
const { createTempProject, createTempGitProject, cleanup } = require('./helpers.cjs');
const {
loadConfig,
@@ -126,6 +126,70 @@ describe('loadConfig', () => {
});
});
// ─── loadConfig commit_docs gitignore auto-detection (#1250) ──────────────────
describe('loadConfig commit_docs gitignore auto-detection (#1250)', () => {
let tmpDir;
beforeEach(() => {
tmpDir = createTempGitProject();
});
afterEach(() => {
cleanup(tmpDir);
});
function writeConfig(obj) {
fs.writeFileSync(
path.join(tmpDir, '.planning', 'config.json'),
JSON.stringify(obj, null, 2)
);
}
test('commit_docs defaults to false when .planning/ is gitignored and no explicit config', () => {
fs.writeFileSync(path.join(tmpDir, '.gitignore'), '.planning/\n');
// No commit_docs in config — should auto-detect
writeConfig({ model_profile: 'balanced' });
const config = loadConfig(tmpDir);
assert.strictEqual(config.commit_docs, false,
'commit_docs should be false when .planning/ is gitignored and not explicitly set');
});
test('commit_docs defaults to true when .planning/ is NOT gitignored and no explicit config', () => {
// No .gitignore, no commit_docs in config
writeConfig({ model_profile: 'balanced' });
const config = loadConfig(tmpDir);
assert.strictEqual(config.commit_docs, true,
'commit_docs should default to true when .planning/ is not gitignored');
});
test('explicit commit_docs: false is respected even when .planning/ is not gitignored', () => {
writeConfig({ commit_docs: false });
const config = loadConfig(tmpDir);
assert.strictEqual(config.commit_docs, false);
});
test('explicit commit_docs: true is respected even when .planning/ is gitignored', () => {
fs.writeFileSync(path.join(tmpDir, '.gitignore'), '.planning/\n');
writeConfig({ commit_docs: true });
const config = loadConfig(tmpDir);
assert.strictEqual(config.commit_docs, true,
'explicit commit_docs: true should override gitignore auto-detection');
});
test('commit_docs auto-detect works with no config.json', () => {
// Remove config.json so loadConfig uses defaults
try { fs.unlinkSync(path.join(tmpDir, '.planning', 'config.json')); } catch {}
fs.writeFileSync(path.join(tmpDir, '.gitignore'), '.planning/\n');
const config = loadConfig(tmpDir);
// When config.json is missing, loadConfig catches and returns defaults.
// The gitignore check happens inside the try block, so with no config.json
// the catch returns defaults (commit_docs: true). This is acceptable since
// a project without config.json hasn't been initialized by GSD yet.
assert.strictEqual(typeof config.commit_docs, 'boolean');
});
});
// ─── resolveModelInternal ──────────────────────────────────────────────────────
describe('resolveModelInternal', () => {