diff --git a/get-shit-done/bin/lib/init.cjs b/get-shit-done/bin/lib/init.cjs index 0f50fe57c..20a58dfa5 100644 --- a/get-shit-done/bin/lib/init.cjs +++ b/get-shit-done/bin/lib/init.cjs @@ -1470,6 +1470,24 @@ function buildAgentSkillsBlock(config, agentType, projectRoot) { for (const skillPath of skillPaths) { if (typeof skillPath !== 'string') continue; + // Support global: prefix for skills installed at ~/.claude/skills/ (#1992) + if (skillPath.startsWith('global:')) { + const skillName = skillPath.slice(7); + // Sanitize: skill name must be alphanumeric, hyphens, or underscores only + if (!/^[a-zA-Z0-9_-]+$/.test(skillName)) { + process.stderr.write(`[agent-skills] WARNING: Invalid global skill name "${skillName}" — skipping\n`); + continue; + } + const globalSkillDir = path.join(require('os').homedir(), '.claude', 'skills', skillName); + const globalSkillMd = path.join(globalSkillDir, 'SKILL.md'); + if (!fs.existsSync(globalSkillMd)) { + process.stderr.write(`[agent-skills] WARNING: Global skill not found at "~/.claude/skills/${skillName}/SKILL.md" — skipping\n`); + continue; + } + validPaths.push({ ref: `${globalSkillDir}/SKILL.md`, display: `~/.claude/skills/${skillName}` }); + continue; + } + // Validate path safety — must resolve within project root const pathCheck = validatePath(skillPath, projectRoot); if (!pathCheck.safe) { @@ -1484,12 +1502,12 @@ function buildAgentSkillsBlock(config, agentType, projectRoot) { continue; } - validPaths.push(skillPath); + validPaths.push({ ref: `${skillPath}/SKILL.md`, display: skillPath }); } if (validPaths.length === 0) return ''; - const lines = validPaths.map(p => `- @${p}/SKILL.md`).join('\n'); + const lines = validPaths.map(p => `- @${p.ref}`).join('\n'); return `\nRead these user-configured skills:\n${lines}\n`; }