nexu-io/open-design · warning · Error
no project matches "${arg}"
Error message
no project matches "${arg}" What it means
Thrown by resolveProjectId when the supplied name/fragment matches no project via exact, slug, or substring comparison. This is the classic typo / stale-reference error.
Source
Thrown at apps/daemon/src/mcp.ts:3000
if (idMatch) return { id: idMatch.id, name: idMatch.name, source: 'id' as const };
const exact = list.filter((p) => String(p.name || '').toLowerCase() === lower);
if (exact.length === 1) { const p = exact[0]!; return { id: p.id, name: p.name, source: 'exact' as const }; }
const slugged = list.filter((p) => norm(p.name) === target);
if (slugged.length === 1) { const p = slugged[0]!; return { id: p.id, name: p.name, source: 'slug' as const }; }
const subs = list.filter((p) =>
String(p.name || '').toLowerCase().includes(lower),
);
if (subs.length === 1) { const p = subs[0]!; return { id: p.id, name: p.name, source: 'substring' as const }; }
if (subs.length > 1) {
const opts = subs.map((p) => `${p.name} (${p.id})`).join(', ');
throw new Error(
`multiple projects match "${arg}": ${opts}. Pass the UUID instead.`,
);
}
throw new Error(`no project matches "${arg}"`);
}
async function getJson<T>(url: string, headers?: Record<string, string>): Promise<T> {
const resp = await fetch(url, headers ? { headers } : undefined);
if (!resp.ok) {
const body = await safeText(resp);
throw new Error(`daemon ${resp.status} on ${url}: ${body || resp.statusText}`);
}
return (await resp.json()) as T;
}
async function getFile(
baseUrl: string,
project: string,
relPath: string,
active: ActiveContext | null,
resolved?: ResolvedProject | null,
offset = 0,View on GitHub (pinned to 5be4028344)
Solutions
- List projects via the project MCP tool and copy the exact name or UUID.
- Check for typos, trailing spaces, and case differences (comparison is case-insensitive but exact match must equal).
- Confirm the daemon/OD_DATA_DIR/namespace is the one holding the project.
- If the project was renamed, update the reference to the new name or its UUID.
Example fix
// before
runStart({ project: "mydeck" }) // real name is "my-deck"
// after
runStart({ project: "my-deck" }) Defensive patterns
Strategy: validation
Validate before calling
const exists = list.some(p => p.id === project || p.name.toLowerCase() === project.toLowerCase());
if (!exists) throw new Error(`project "${project}" not found; available: ${list.map(p => p.name).join(', ')}`); Prevention
- List projects and copy the exact name/UUID before referencing.
- Trim whitespace and check case before resolving.
- Update references after renames.
When it happens
Trigger: Typo in project name; referencing a project that was deleted or renamed; pointing at the wrong daemon/data root where the project does not exist; copy-paste of a name with extra whitespace or hidden characters.
Common situations: Renamed projects breaking hardcoded references; env drift between dev/staging daemons; trailing whitespace in the arg; the project lives under a different namespace.
Related errors
- project arg omitted and active context lookup failed: ${erro
- project arg omitted and Open Design has no active project. T
- project is required (string).
- no projects on this daemon
- multiple projects match "${arg}": ${opts}. Pass the UUID ins
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/1540c1045fb5b236.
Report an issue: GitHub.