thedotmack/claude-mem · error · Error
Transcript watch config not found: ${resolvedPath}
Error message
Transcript watch config not found: ${resolvedPath} What it means
Thrown by loadTranscriptWatchConfig when the transcript watch config file does not exist at the resolved path (after ~ expansion). The loader refuses to proceed without a config file rather than silently using defaults, so transcript ingestion cannot start until a config is present.
Source
Thrown at src/services/transcripts/config.ts:67
...config,
watches,
},
removed: config.watches.length - watches.length,
};
}
export function expandHomePath(inputPath: string): string {
if (!inputPath) return inputPath;
if (inputPath.startsWith('~')) {
return join(homedir(), inputPath.slice(1));
}
return inputPath;
}
export function loadTranscriptWatchConfig(path = DEFAULT_CONFIG_PATH): TranscriptWatchConfig {
const resolvedPath = expandHomePath(path);
if (!existsSync(resolvedPath)) {
throw new Error(`Transcript watch config not found: ${resolvedPath}`);
}
const raw = readFileSync(resolvedPath, 'utf-8');
const parsed = JSON.parse(raw) as TranscriptWatchConfig;
if (!parsed.version || !parsed.watches) {
throw new Error(`Invalid transcript watch config: ${resolvedPath}`);
}
if (!parsed.stateFile) {
parsed.stateFile = DEFAULT_STATE_PATH;
}
return parsed;
}
export function writeSampleConfig(path = DEFAULT_CONFIG_PATH): void {
const resolvedPath = expandHomePath(path);
const dir = dirname(resolvedPath);
if (!existsSync(dir)) {
mkdirSync(dir, { recursive: true });
}View on GitHub (pinned to d768ba3643)
Solutions
- Generate the sample config by calling writeSampleConfig() (or the CLI equivalent) to create the file at the resolved path.
- Verify the resolved path printed in the message and ensure its parent directory exists and is writable.
- If using a custom path, confirm it is absolute or correctly ~-prefixed and points to an existing file.
- Re-run onboarding / setup which writes the default transcript watch config.
Example fix
// before: loadTranscriptWatchConfig() // file absent -> throws // after: if (!existsSync(resolved)) writeSampleConfig(); loadTranscriptWatchConfig();
Defensive patterns
Strategy: validation
Validate before calling
import { existsSync } from 'fs';
import { loadTranscriptWatchConfig, writeSampleConfig, expandHomePath, DEFAULT_CONFIG_PATH } from './config';
function loadOrInitConfig(path = DEFAULT_CONFIG_PATH) {
const resolved = expandHomePath(path);
if (!existsSync(resolved)) writeSampleConfig(resolved);
return loadTranscriptWatchConfig(resolved);
} Try / catch
try { config = loadTranscriptWatchConfig(path); }
catch (e) {
if (e instanceof Error && e.message.startsWith('Transcript watch config not found')) {
writeSampleConfig(path); // bootstrap then retry
config = loadTranscriptWatchConfig(path);
return;
}
throw e;
} Prevention
- Run the onboarding step that writes the sample config before starting the watcher.
- Store the config under a stable path (paths.transcriptsConfig()) and back it up.
- Check existsSync before loadTranscriptWatchConfig and auto-bootstrap if absent.
When it happens
Trigger: loadTranscriptWatchConfig(path) calls existsSync(resolvedPath) and it returns false. The default path comes from paths.transcriptsConfig(); a custom path may be passed. ~ is expanded via expandHomePath before the check.
Common situations: First run before onboarding has written the config, the config file deleted/moved, a custom path argument that points nowhere, or HOME not set so ~ expansion resolves oddly. Common right after install if the sample config bootstrap was skipped.
Related errors
- server startup configuration is invalid: - ${line}
- Mode file not found: ${modeId}.json (searched: ${this.modeDi
- Corrupt JSON in ${GEMINI_SETTINGS_PATH}, refusing to overwri
- Corrupt hooks.json at ${WINDSURF_HOOKS_JSON_PATH}, refusing
- SyncClient requires a non-empty hubUrl (CLAUDE_MEM_CLOUD_SYN
AI-assisted analysis of thedotmack/claude-mem@d768ba3643 (2026-08-12).
Data as JSON: /api/errors/7b1425e7fd97450b.
Report an issue: GitHub.