(root: string, patternId: string)
| 92 | } |
| 93 | |
| 94 | export async function loadPatternDoc(root: string, patternId: string): Promise<string | null> { |
| 95 | try { |
| 96 | assertSafeSegment(patternId, 'patternId'); |
| 97 | } catch { |
| 98 | return null; |
| 99 | } |
| 100 | const allowed = await allowedPatternIds(root); |
| 101 | if (!allowed.has(patternId)) return null; |
| 102 | const filePath = path.join(root, 'patterns', `${patternId}.md`); |
| 103 | return readFileIfExists(filePath); |
| 104 | } |
| 105 | |
| 106 | export async function listSkills(root: string): Promise<SkillInfo[]> { |
| 107 | const skillDirs = [ |
no test coverage detected