diff --git a/packages/shared/src/skills.ts b/packages/shared/src/skills.ts index 540b92eba5..08be3205ae 100644 --- a/packages/shared/src/skills.ts +++ b/packages/shared/src/skills.ts @@ -11,6 +11,12 @@ export interface SkillInfo { editable: boolean; /** Size of SKILL.md in bytes (context-cost signal). */ skillMdBytes: number; + /** + * Frontmatter `disable-model-invocation: true`: the agent never invokes the + * skill on its own — only an explicit user invocation (slash command or + * composer skill tag) runs it. + */ + disableModelInvocation?: boolean; } export interface SkillFileEntry { @@ -44,13 +50,18 @@ export interface ExportedSkill { * sandbox, so it must not drift between hosts. */ export function serializeSkillMarkdown( - meta: { name: string; description: string }, + meta: { + name: string; + description: string; + disableModelInvocation?: boolean; + }, body: string, ): string { const frontmatter = [ "---", `name: ${serializeSkillScalar(meta.name)}`, `description: ${serializeSkillScalar(meta.description)}`, + ...(meta.disableModelInvocation ? ["disable-model-invocation: true"] : []), "---", ].join("\n"); diff --git a/packages/ui/src/features/skills/SkillCard.tsx b/packages/ui/src/features/skills/SkillCard.tsx index 5f896404a9..f3cd49f79f 100644 --- a/packages/ui/src/features/skills/SkillCard.tsx +++ b/packages/ui/src/features/skills/SkillCard.tsx @@ -92,6 +92,13 @@ export function SkillCard({ {skill.repoName} )} + {skill.disableModelInvocation && ( + + + Manual + + + )} } /> diff --git a/packages/ui/src/features/skills/SkillDetailPanel.tsx b/packages/ui/src/features/skills/SkillDetailPanel.tsx index 6be4fd58e3..0011942ee8 100644 --- a/packages/ui/src/features/skills/SkillDetailPanel.tsx +++ b/packages/ui/src/features/skills/SkillDetailPanel.tsx @@ -3,6 +3,7 @@ import { DownloadSimple, FilePlus, Folder, + HandTap, LockSimple, PencilSimple, Trash, @@ -287,6 +288,14 @@ export function SkillDetailPanel({ Read-only )} + {skill.disableModelInvocation && ( + + + + Manual-only + + + )} {skill.source === "codex" && (