| 171 | // ── Skill manifest resolution ────────────────────────────────────────────── |
| 172 | |
| 173 | function resolveSkillFile(args: CliArgs): string | null { |
| 174 | if (args.skillFile) { |
| 175 | return resolve(args.skillFile); |
| 176 | } |
| 177 | if (!args.skill) return null; |
| 178 | // Look in common gstack skill locations |
| 179 | const candidates = [ |
| 180 | join(HOME, ".claude", "skills", args.skill, "SKILL.md"), |
| 181 | join(HOME, ".claude", "skills", "gstack", args.skill, "SKILL.md"), |
| 182 | join(process.cwd(), ".claude", "skills", args.skill, "SKILL.md"), |
| 183 | join(process.cwd(), args.skill, "SKILL.md"), |
| 184 | ]; |
| 185 | for (const c of candidates) { |
| 186 | if (existsSync(c)) return c; |
| 187 | } |
| 188 | return null; |
| 189 | } |
| 190 | |
| 191 | // ── Dispatchers ──────────────────────────────────────────────────────────── |
| 192 | |