{"record":{"id":"0b1687a44ed6bfea","repo":"heygen-com/hyperframes","slug":"no-skills-manifest-found-at-source","errorCode":null,"errorMessage":"No skills manifest found at: ${source}","messagePattern":"No skills manifest found at: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/cli/src/utils/skillsManifest.ts","lineNumber":681,"sourceCode":"      \"git\",\n      [\"ls-remote\", `https://github.com/${repoSlug}.git`, \"refs/heads/main\"],\n      { timeout: FETCH_TIMEOUT_MS, env: { ...process.env, GIT_TERMINAL_PROMPT: \"0\" } },\n    );\n    const sha = stdout.split(/\\s+/)[0]?.trim() ?? \"\";\n    return /^[0-9a-f]{40}$/.test(sha) ? sha : null;\n  } catch {\n    return null;\n  }\n}\n\n/** Read a manifest from a local path — a manifest file or a repo root. */\nfunction resolveLocalManifest(source: string): SkillsManifest {\n  const direct = source.endsWith(\".json\") ? source : join(source, MANIFEST_FILE);\n  if (existsSync(direct)) return JSON.parse(readFileSync(direct, \"utf8\")) as SkillsManifest;\n  // Fall back to computing from a skills/ tree on disk.\n  const skillsRoot = source.endsWith(\"skills\") ? source : join(source, \"skills\");\n  if (existsSync(skillsRoot)) return buildManifest(skillsRoot, { source: skillsRoot });\n  throw new Error(`No skills manifest found at: ${source}`);\n}\n\n/**\n * Fetch the manifest from GitHub. A full URL is fetched directly; an\n * `owner/repo` slug (or the default repo) is SHA-pinned via `git ls-remote` to\n * dodge raw-CDN lag, falling back to the branch URL when git is unavailable.\n */\nasync function fetchRemoteManifest(source?: string): Promise<SkillsManifest> {\n  if (source?.startsWith(\"http\")) return fetchManifest(source);\n\n  const repoSlug = source ?? DEFAULT_REPO_SLUG;\n  const sha = await remoteHeadSha(repoSlug);\n  if (sha) {\n    try {\n      return await fetchManifest(\n        `https://raw.githubusercontent.com/${repoSlug}/${sha}/${MANIFEST_FILE}`,\n      );\n    } catch {","sourceCodeStart":663,"sourceCodeEnd":699,"githubUrl":"https://github.com/heygen-com/hyperframes/blob/c2996c8626135db5253519359d8a063d3bafad8d/packages/cli/src/utils/skillsManifest.ts#L663-L699","documentation":"Thrown by resolveLocalManifest when neither a manifest JSON file nor a skills/ directory can be found at the given local path. The function first checks for a direct .json file (or <source>/skills-manifest.json), then falls back to computing a manifest from a skills/ subdirectory. If neither exists, this error fires.","triggerScenarios":"Passing a local directory path to a skills command (--source ./my-repo) where that directory has no skills-manifest.json and no skills/ subdirectory; passing a .json path that doesn't exist on disk.","commonSituations":"Pointing --source at the wrong directory (e.g. a subpackage instead of repo root); the manifest file was deleted or not generated yet; typo in the path; using a relative path from the wrong working directory.","solutions":["Verify the path exists and contains either a skills-manifest.json or a skills/ directory.","If pointing at a repo checkout, use the repo root, not a subdirectory.","Run npx hyperframes skills update from the project root to regenerate the manifest from the skills/ tree.","Use an absolute path to avoid working-directory ambiguity."],"exampleFix":"// before: hyperframes skills diff --source ./packages/cli\n// after:  hyperframes skills diff --source /abs/path/to/repo-root","handlingStrategy":"validation","validationCode":"import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nfunction validateLocalManifestSource(source: string): string | null {\n  if (source.endsWith(\".json\") && existsSync(source)) return source;\n  if (existsSync(join(source, \"skills-manifest.json\"))) return join(source, \"skills-manifest.json\");\n  if (existsSync(join(source, \"skills\"))) return join(source, \"skills\");\n  return null;\n}","typeGuard":null,"tryCatchPattern":"try {\n  const manifest = resolveLocalManifest(source);\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith(\"No skills manifest found\")) {\n    console.error(`${err.message}. Ensure the path has skills-manifest.json or a skills/ directory.`);\n    process.exit(1);\n  }\n  throw err;\n}","preventionTips":["Use absolute paths for --source to avoid working-directory ambiguity.","Verify the target directory has either skills-manifest.json or a skills/ subdirectory before running.","Point at the repo root, not a subdirectory, when using a repo checkout."],"tags":["skills","manifest","filesystem","path"],"backgroundTag":null,"analyzedSha":"c2996c8626135db5253519359d8a063d3bafad8d","analyzedAt":"2026-08-12T22:18:56.877Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}