diff --git a/src/services/worker/agents/ResponseProcessor.ts b/src/services/worker/agents/ResponseProcessor.ts index 78c7cf62..c724fe06 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,29 @@ 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); + // 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 (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/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) { diff --git a/src/shared/SettingsDefaultsManager.ts b/src/shared/SettingsDefaultsManager.ts index a5c8571e..5adc82dc 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', }; /** @@ -122,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; } /**