{"record":{"id":"274ab9a8b0d891f7","repo":"heygen-com/hyperframes","slug":"unknown-skill-s-unknown-join-available","errorCode":null,"errorMessage":"Unknown skill(s): ${unknown.join(\", \")}. Available: ${[...manifestNames].sort().join(\", \")}","messagePattern":"Unknown skill\\(s\\): (.+?)\\. Available: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/cli/src/commands/skills.ts","lineNumber":362,"sourceCode":"          \"Canonical skills manifest was malformed — falling back to presence-only mode (an upstream/CDN issue, not your network).\",\n        ),\n      );\n    }\n    check = null; // manifest unreachable (offline / rate-limited) — presence mode below\n  }\n  if (!check) return updateSkillsOffline(requested, { strict, cwd: opts.cwd });\n\n  // \"removed\" entries are lock-attributed leftovers, not manifest skills —\n  // they are `skills update`'s prune concern, never an update target.\n  const manifestSkills = check.skills.filter((s) => s.status !== \"removed\");\n  const manifestNames = new Set(manifestSkills.map((s) => s.name));\n\n  const unknown = requested.filter((name) => !manifestNames.has(name));\n  if (unknown.length) {\n    const message =\n      `Unknown skill(s): ${unknown.join(\", \")}. ` +\n      `Available: ${[...manifestNames].sort().join(\", \")}`;\n    if (strict) throw new Error(message);\n    clack.log.warn(c.warn(message));\n  }\n\n  const targets = manifestSkills.filter(\n    (s) =>\n      requested.includes(s.name) ||\n      isCoreSkill(s.name) ||\n      (opts.refreshInstalled === true && s.status !== \"missing\"),\n  );\n  const toInstall = targets.filter((s) => s.status === \"missing\" || s.status === \"outdated\");\n  const result: UpdateSkillsResult = {\n    targets: targets.map((s) => s.name),\n    installed: toInstall.map((s) => s.name),\n    current: targets.filter((s) => s.status === \"current\").map((s) => s.name),\n    unknown,\n    presenceOnly: false,\n  };\n","sourceCodeStart":344,"sourceCodeEnd":380,"githubUrl":"https://github.com/heygen-com/hyperframes/blob/c2996c8626135db5253519359d8a063d3bafad8d/packages/cli/src/commands/skills.ts#L344-L380","documentation":"Thrown (or warned) by updateSkills in strict mode when one or more requested skill names are absent from the fetched manifest. 'removed' entries are filtered out first since they are lock-attributed leftovers, not installable skills. The error lists both the unknown names and the full sorted available set so the user can correct the request.","triggerScenarios":"updateSkills resolves `check` (a manifest), builds manifestNames from skills with status !== 'removed', then filters `requested` against it. Any unmatched name sets `unknown.length > 0`; in strict mode the message is thrown at skills.ts:362.","commonSituations":"A typo in the skill name; referencing a skill that was renamed/removed in a newer manifest; using a stale locally-cached manifest; an agent passing a guessed skill slug; referring to a skill that only exists in a different source repo.","solutions":["Re-read the 'Available:' list in the error and copy the exact skill name","Refresh the manifest: `npx hyperframes skills update` (online) then retry","Check the catalog/docs for renames if you upgraded recently","Pass skill names as plain slugs without flags/special chars"],"exampleFix":"// before\nhyperframes skills update product-video\n// after\nhyperframes skills update product-launch-video","handlingStrategy":"validation","validationCode":"async function knownSkills(): Promise<Set<string>> {\n  const check = await checkSkills(/* cwd */);\n  return new Set(check.skills.filter((s) => s.status !== \"removed\").map((s) => s.name));\n}\nconst ok = (await knownSkills()).has(requestedName);","typeGuard":null,"tryCatchPattern":"try {\n  await updateSkills([name], { strict: true });\n} catch (e) {\n  if (e.message.startsWith(\"Unknown skill(s):\")) {\n    // parse 'Available:' list, correct name, retry\n  }\n  throw e;\n}","preventionTips":["Refresh the manifest before relying on skill names","Copy skill names verbatim from the catalog/docs","Treat any 'Unknown skill' in CI as a rename/removal signal"],"tags":["skills","manifest","cli-input","argument-validation"],"backgroundTag":null,"analyzedSha":"c2996c8626135db5253519359d8a063d3bafad8d","analyzedAt":"2026-08-12T22:18:56.877Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}