{"record":{"id":"71d23e1e7dba5df0","repo":"garrytan/gstack","slug":"skill-name-not-found","errorCode":null,"errorMessage":"Skill \"${name}\" not found.","messagePattern":"Skill \"(.+?)\" not found\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"browse/src/browser-skill-commands.ts","lineNumber":150,"sourceCode":"  let timeoutSeconds = DEFAULT_TIMEOUT_SECONDS;\n  for (let i = 0; i < args.length; i++) {\n    const a = args[i];\n    if (a.startsWith('--timeout=')) {\n      const n = parseInt(a.slice('--timeout='.length), 10);\n      if (!isNaN(n) && n > 0) timeoutSeconds = n;\n      continue;\n    }\n    passthrough.push(a);\n  }\n  return { passthrough, timeoutSeconds };\n}\n\nasync function handleRun(args: string[], ctx: SkillCommandContext): Promise<string> {\n  const name = args[0];\n  if (!name) throw new Error('Usage: $B skill run <name> [--arg k=v]... [--timeout=Ns]');\n  const tiers = ctx.tiers ?? defaultTierPaths();\n  const skill = readBrowserSkill(name, tiers);\n  if (!skill) throw new Error(`Skill \"${name}\" not found.`);\n\n  const { passthrough, timeoutSeconds } = parseSkillRunArgs(args.slice(1));\n  const result = await spawnSkill({\n    skill,\n    skillArgs: passthrough,\n    trusted: skill.frontmatter.trusted,\n    timeoutSeconds,\n    port: ctx.port,\n  });\n\n  if (result.exitCode !== 0 || result.timedOut || result.truncated) {\n    const summary = result.truncated\n      ? `truncated stdout at ${MAX_STDOUT_BYTES} bytes`\n      : result.timedOut\n        ? `timed out after ${timeoutSeconds}s`\n        : `exit ${result.exitCode}`;\n    const err = new Error(`Skill \"${name}\" failed: ${summary}\\n--- stderr ---\\n${result.stderr.slice(0, 4096)}`);\n    (err as any).exitCode = result.exitCode || 1;","sourceCodeStart":132,"sourceCodeEnd":168,"githubUrl":"https://github.com/garrytan/gstack/blob/94993f74012782fd94416dd44b8314f6363a13a4/browse/src/browser-skill-commands.ts#L132-L168","documentation":"Thrown by handleRun after readBrowserSkill returned null for the given name across all three tiers. Functionally identical to the show-path 'not found' error but with shorter wording (no 'in any tier' suffix). Same masking caveat applies: a malformed SKILL.md in every tier also resolves to null.","triggerScenarios":"handleRun with a name absent from project, global, and bundled tier directories; or present only as directories whose SKILL.md fails to parse (missing required `host` field). Distinguished from the spawn-time errors (script.ts missing, exit non-zero) by firing before spawnSkill is called.","commonSituations":"Name typo; skill tombstoned; running outside a git project so project tier is null; fresh install where the bundled skills dir resolved to the wrong path (detectBundledRoot fallback walked to the wrong parent); agent invoked run on a skill it just wrote via /skillify before commit completed.","solutions":["Run `$B skill list` and copy the exact name.","Verify the skill directory exists: `ls ~/.gstack/browser-skills/<name>/` and `ls <project>/.gstack/browser-skills/<name>/`.","Confirm SKILL.md is present and parses (has `name` and `host`).","Check for a tombstone under <tier>/.tombstones/ and restore it if unintentional."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import { readBrowserSkill, defaultTierPaths } from './browser-skills';\n\nfunction assertSkillReadable(name: string, tiers = defaultTierPaths()): void {\n  if (!readBrowserSkill(name, tiers)) {\n    const suggestion = listBrowserSkills(tiers).map(s => s.name).join(', ');\n    throw new Error(`Skill \"${name}\" not found. Known: ${suggestion || '(none)'}`);\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify the skill resolves before constructing run args.","Project tier is null outside a git repo — account for this in non-project contexts.","Tombstones hide skills from list/run; check <tier>/.tombstones/ for removals."],"tags":["skill-management","filesystem","gstack","browser-skills"],"backgroundTag":null,"analyzedSha":"94993f74012782fd94416dd44b8314f6363a13a4","analyzedAt":"2026-08-12T04:06:23.140Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}