{"record":{"id":"1540c1045fb5b236","repo":"nexu-io/open-design","slug":"no-project-matches-arg","errorCode":null,"errorMessage":"no project matches \"${arg}\"","messagePattern":"no project matches \"(.+?)\"","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"apps/daemon/src/mcp.ts","lineNumber":3000,"sourceCode":"  if (idMatch) return { id: idMatch.id, name: idMatch.name, source: 'id' as const };\n\n  const exact = list.filter((p) => String(p.name || '').toLowerCase() === lower);\n  if (exact.length === 1) { const p = exact[0]!; return { id: p.id, name: p.name, source: 'exact' as const }; }\n\n  const slugged = list.filter((p) => norm(p.name) === target);\n  if (slugged.length === 1) { const p = slugged[0]!; return { id: p.id, name: p.name, source: 'slug' as const }; }\n\n  const subs = list.filter((p) =>\n    String(p.name || '').toLowerCase().includes(lower),\n  );\n  if (subs.length === 1) { const p = subs[0]!; return { id: p.id, name: p.name, source: 'substring' as const }; }\n  if (subs.length > 1) {\n    const opts = subs.map((p) => `${p.name} (${p.id})`).join(', ');\n    throw new Error(\n      `multiple projects match \"${arg}\": ${opts}. Pass the UUID instead.`,\n    );\n  }\n  throw new Error(`no project matches \"${arg}\"`);\n}\n\nasync function getJson<T>(url: string, headers?: Record<string, string>): Promise<T> {\n  const resp = await fetch(url, headers ? { headers } : undefined);\n  if (!resp.ok) {\n    const body = await safeText(resp);\n    throw new Error(`daemon ${resp.status} on ${url}: ${body || resp.statusText}`);\n  }\n  return (await resp.json()) as T;\n}\n\nasync function getFile(\n  baseUrl: string,\n  project: string,\n  relPath: string,\n  active: ActiveContext | null,\n  resolved?: ResolvedProject | null,\n  offset = 0,","sourceCodeStart":2982,"sourceCodeEnd":3018,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/apps/daemon/src/mcp.ts#L2982-L3018","documentation":"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.","triggerScenarios":"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.","commonSituations":"Renamed projects breaking hardcoded references; env drift between dev/staging daemons; trailing whitespace in the arg; the project lives under a different namespace.","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."],"exampleFix":"// before\nrunStart({ project: \"mydeck\" })  // real name is \"my-deck\"\n// after\nrunStart({ project: \"my-deck\" })","handlingStrategy":"validation","validationCode":"const exists = list.some(p => p.id === project || p.name.toLowerCase() === project.toLowerCase());\nif (!exists) throw new Error(`project \"${project}\" not found; available: ${list.map(p => p.name).join(', ')}`);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["List projects and copy the exact name/UUID before referencing.","Trim whitespace and check case before resolving.","Update references after renames."],"tags":["mcp","project-resolution","not-found"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}