/** * Public types for Franklin's skills layer. * * A "skill" is an Anthropic-spec SKILL.md file: YAML frontmatter + a markdown * body that becomes the prompt-rewrite for a slash command. See * docs/plans/2026-04-29-franklin-skills-mvp-design.md. */ export type SkillSource = 'bundled' | 'user' | 'project'; export interface ParsedSkill { /** Kebab-case skill identifier; matches the parent directory name. */ name: string; /** Short description shown in /help and franklin skills list. */ description: string; /** Raw markdown body (not yet variable-substituted). */ body: string; /** Anthropic spec: hint shown after the slash command. */ argumentHint?: string; /** Anthropic spec: when true, the model must not auto-invoke this skill. */ disableModelInvocation?: boolean; /** Franklin extension: hard cap (USD) for the turn this skill kicks off. */ budgetCapUsd?: number; /** Franklin extension: append a paid-call receipt under the agent reply. */ costReceipt?: boolean; /** Trigger phrases that should auto-invoke this skill when matched. */ triggers?: string[]; } export type ParseResult = { skill: ParsedSkill; warnings: string[]; } | { error: string; }; export interface LoadedSkill { skill: ParsedSkill; source: SkillSource; /** Absolute path to the SKILL.md file. */ path: string; /** Non-fatal warnings raised while loading this skill. */ warnings: string[]; } export interface LoadError { /** Absolute path to the file that failed. */ path: string; error: string; } export interface LoadResult { skills: LoadedSkill[]; errors: LoadError[]; }