Yeachan-Heo/oh-my-codex · error · Error
mission-dir does not exist: ${missionDir}
Error message
mission-dir does not exist: ${missionDir} What it means
loadAutoresearchMissionContract resolves the mission-dir argument and immediately throws if existsSync fails — the directory must already exist on disk before the contract can be loaded. The resolved absolute path is included in the message.
Source
Thrown at src/autoresearch/contracts.ts:215
const result = parsed as Record<string, unknown>;
if (typeof result.pass !== 'boolean') {
throw contractError('Evaluator output must include boolean pass.');
}
if (result.score !== undefined && typeof result.score !== 'number') {
throw contractError('Evaluator output score must be numeric when provided.');
}
return {
pass: result.pass,
...(result.score === undefined ? {} : { score: result.score }),
};
}
export async function loadAutoresearchMissionContract(missionDirArg: string): Promise<AutoresearchMissionContract> {
const missionDir = resolve(missionDirArg);
if (!existsSync(missionDir)) {
throw contractError(`mission-dir does not exist: ${missionDir}`);
}
const repoRoot = readGit(missionDir, ['rev-parse', '--show-toplevel']);
ensurePathInside(repoRoot, missionDir);
const missionFile = join(missionDir, 'mission.md');
const sandboxFile = join(missionDir, 'sandbox.md');
if (!existsSync(missionFile)) {
throw contractError(`mission.md is required inside mission-dir: ${missionFile}`);
}
if (!existsSync(sandboxFile)) {
throw contractError(`sandbox.md is required inside mission-dir: ${sandboxFile}`);
}
const missionContent = await readFile(missionFile, 'utf-8');
const sandboxContent = await readFile(sandboxFile, 'utf-8');
const sandbox = parseSandboxContract(sandboxContent);
const missionRelativeDir = relative(repoRoot, missionDir) || basename(missionDir);View on GitHub (pinned to 3ad79a8a6f)
Solutions
- Check the path for typos and pass the correct absolute path.
- If using a relative path, confirm the process cwd or resolve it yourself before calling.
- Create/clone the mission directory (and commit it) if it should exist; verify in CI checkout steps.
Example fix
// before
const contract = await loadAutoresearchMissionContract('missions/m1-typo');
// after
const missionDir = resolve('missions/m1');
if (!existsSync(missionDir)) throw new Error(`setup missing: ${missionDir}`);
const contract = await loadAutoresearchMissionContract(missionDir); Defensive patterns
Strategy: validation
Validate before calling
import { existsSync } from 'node:fs';
import { resolve } from 'node:path';
const missionDir = resolve(missionDirArg);
if (!existsSync(missionDir)) {
throw new Error(`Mission dir missing: ${missionDir} — create or fix the path`);
}
const contract = await loadAutoresearchMissionContract(missionDir); Try / catch
try {
await loadAutoresearchMissionContract(dir);
} catch (err) {
if ((err as Error).message.includes('mission-dir does not exist')) {
// prompt the user for the correct path or create/clone the mission
}
throw err;
} Prevention
- Resolve mission-dir to an absolute path before calling.
- Validate user-supplied paths with existsSync and give an early, clearer error.
- In CI, verify the mission dir is checked out before the run.
When it happens
Trigger: Passing a relative or absolute mission-dir path that does not exist: typos, wrong working directory for relative paths, or the directory not yet created/synced.
Common situations: CLI --mission-dir typos; running from a different cwd so a relative path resolves elsewhere; directories not yet mounted in containers or not checked out in CI.
Related errors
- scale_down_cleanup_debt_path_missing_parent:${path}
- mission-dir must be inside a git repository.
- mission.md is required inside mission-dir: ${missionFile}
- sandbox.md is required inside mission-dir: ${sandboxFile}
- autoresearch_candidate_missing:${candidateFile}
AI-assisted analysis of Yeachan-Heo/oh-my-codex@3ad79a8a6f (2026-08-27).
Data as JSON: /api/errors/f6054e1bf091ceaf.
Report an issue: GitHub.