From 9907df1db8150ea07eb7a735d44eb5a97a89717a Mon Sep 17 00:00:00 2001 From: Michel Tomas Date: Wed, 4 Feb 2026 02:09:54 +0100 Subject: [PATCH 1/3] fix: respect CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED setting The CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED setting was documented but never actually checked in code. The folder CLAUDE.md generation ran unconditionally whenever files were touched. Changes: - Add CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED to SettingsDefaults interface - Add default value 'false' to DEFAULTS object - Check setting in ResponseProcessor before calling updateFolderClaudeMdFiles Fixes the issue identified in issue-600-documentation-audit-features-not-implemented.md: "The setting CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED is never read." --- .../worker/agents/ResponseProcessor.ts | 36 +++++++++++-------- src/shared/SettingsDefaultsManager.ts | 2 ++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/services/worker/agents/ResponseProcessor.ts b/src/services/worker/agents/ResponseProcessor.ts index 78c7cf62..48cf0809 100644 --- a/src/services/worker/agents/ResponseProcessor.ts +++ b/src/services/worker/agents/ResponseProcessor.ts @@ -16,6 +16,8 @@ import { parseObservations, parseSummary, type ParsedObservation, type ParsedSum import { updateCursorContextForProject } from '../../integrations/CursorHooksInstaller.js'; import { updateFolderClaudeMdFiles } from '../../../utils/claude-md-utils.js'; import { getWorkerPort } from '../../../shared/worker-utils.js'; +import { SettingsDefaultsManager } from '../../../shared/SettingsDefaultsManager.js'; +import { USER_SETTINGS_PATH } from '../../../shared/paths.js'; import type { ActiveSession } from '../../worker-types.js'; import type { DatabaseManager } from '../DatabaseManager.js'; import type { SessionManager } from '../SessionManager.js'; @@ -215,21 +217,27 @@ async function syncAndBroadcastObservations( // Update folder CLAUDE.md files for touched folders (fire-and-forget) // This runs per-observation batch to ensure folders are updated as work happens - const allFilePaths: string[] = []; - for (const obs of observations) { - allFilePaths.push(...(obs.files_modified || [])); - allFilePaths.push(...(obs.files_read || [])); - } + // Only runs if CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED is true (default: false) + const settings = SettingsDefaultsManager.loadFromFile(USER_SETTINGS_PATH); + const folderClaudeMdEnabled = settings.CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED === 'true'; - if (allFilePaths.length > 0) { - updateFolderClaudeMdFiles( - allFilePaths, - session.project, - getWorkerPort(), - projectRoot - ).catch(error => { - logger.warn('FOLDER_INDEX', 'CLAUDE.md update failed (non-critical)', { project: session.project }, error as Error); - }); + if (folderClaudeMdEnabled) { + const allFilePaths: string[] = []; + for (const obs of observations) { + allFilePaths.push(...(obs.files_modified || [])); + allFilePaths.push(...(obs.files_read || [])); + } + + if (allFilePaths.length > 0) { + updateFolderClaudeMdFiles( + allFilePaths, + session.project, + getWorkerPort(), + projectRoot + ).catch(error => { + logger.warn('FOLDER_INDEX', 'CLAUDE.md update failed (non-critical)', { project: session.project }, error as Error); + }); + } } } diff --git a/src/shared/SettingsDefaultsManager.ts b/src/shared/SettingsDefaultsManager.ts index a5c8571e..b2c6b524 100644 --- a/src/shared/SettingsDefaultsManager.ts +++ b/src/shared/SettingsDefaultsManager.ts @@ -51,6 +51,7 @@ export interface SettingsDefaults { // Feature Toggles CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY: string; CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE: string; + CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED: string; } export class SettingsDefaultsManager { @@ -96,6 +97,7 @@ export class SettingsDefaultsManager { // Feature Toggles CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY: 'true', CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE: 'false', + CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED: 'false', }; /** From bb96092d74759539ccad54dac4303aba297b473d Mon Sep 17 00:00:00 2001 From: Michel Tomas Date: Wed, 4 Feb 2026 02:20:42 +0100 Subject: [PATCH 2/3] fix: add FOLDER_CLAUDEMD_ENABLED to settingKeys for API/UI access --- src/services/worker/http/routes/SettingsRoutes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/worker/http/routes/SettingsRoutes.ts b/src/services/worker/http/routes/SettingsRoutes.ts index 162a2b9e..0633e9f1 100644 --- a/src/services/worker/http/routes/SettingsRoutes.ts +++ b/src/services/worker/http/routes/SettingsRoutes.ts @@ -121,6 +121,7 @@ export class SettingsRoutes extends BaseRouteHandler { // Feature Toggles 'CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY', 'CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE', + 'CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED', ]; for (const key of settingKeys) { From b07130acc64c461dbcf60a2d7a500d72372cb20c Mon Sep 17 00:00:00 2001 From: Michel Tomas Date: Wed, 4 Feb 2026 15:14:06 +0100 Subject: [PATCH 3/3] fix: handle both boolean and string types for settings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JSON.parse preserves native types, so boolean true/false stay as booleans rather than strings. The previous check only handled string 'true', meaning users who set `"ENABLED": true` (boolean) wouldn't have the feature work. Now both `getBool()` helper and ResponseProcessor check handle: - String 'true' → enabled - Boolean true → enabled - Any other value → disabled Tested: Confirmed feature stays disabled with string "false" and no new CLAUDE.md files are created when accessing directories. --- src/services/worker/agents/ResponseProcessor.ts | 4 +++- src/shared/SettingsDefaultsManager.ts | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/services/worker/agents/ResponseProcessor.ts b/src/services/worker/agents/ResponseProcessor.ts index 48cf0809..c724fe06 100644 --- a/src/services/worker/agents/ResponseProcessor.ts +++ b/src/services/worker/agents/ResponseProcessor.ts @@ -219,7 +219,9 @@ async function syncAndBroadcastObservations( // This runs per-observation batch to ensure folders are updated as work happens // Only runs if CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED is true (default: false) const settings = SettingsDefaultsManager.loadFromFile(USER_SETTINGS_PATH); - const folderClaudeMdEnabled = settings.CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED === 'true'; + // Handle both string 'true' and boolean true from JSON settings + const settingValue = settings.CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED; + const folderClaudeMdEnabled = settingValue === 'true' || settingValue === true; if (folderClaudeMdEnabled) { const allFilePaths: string[] = []; diff --git a/src/shared/SettingsDefaultsManager.ts b/src/shared/SettingsDefaultsManager.ts index b2c6b524..5adc82dc 100644 --- a/src/shared/SettingsDefaultsManager.ts +++ b/src/shared/SettingsDefaultsManager.ts @@ -124,10 +124,11 @@ export class SettingsDefaultsManager { /** * Get a boolean default value + * Handles both string 'true' and boolean true from JSON */ static getBool(key: keyof SettingsDefaults): boolean { const value = this.get(key); - return value === 'true'; + return value === 'true' || value === true; } /**