Files
oh-my-pi/packages/coding-agent/src/capability/skill.ts
T
fabkho 6e49d33b71 fix: recognize disable-model-invocation from Agent Skills spec
The Agent Skills standard (agentskills.io/specification) uses
`disable-model-invocation: true` to hide skills from auto-discovery.
OMP only recognized `hide: true`. This patch treats both as equivalent,
improving compatibility with skills authored for Pi, Claude Code, and
other harnesses following the standard.

Changes:
- Check `disableModelInvocation` (camelCase after frontmatter parsing)
  in all 3 skill-loading paths
- Add `disableModelInvocation` to SkillFrontmatter type with JSDoc
- Add regression test for disable-model-invocation frontmatter
- Add changelog entry

Ref: https://agentskills.io/specification#frontmatter-required
2026-06-03 22:23:53 +02:00

64 lines
1.8 KiB
TypeScript

/**
* Skills Capability
*
* Skills provide specialized knowledge or workflows that extend agent capabilities.
*/
import { defineCapability } from ".";
import type { SourceMeta } from "./types";
/**
* Parsed frontmatter from a skill file.
*/
export interface SkillFrontmatter {
name?: string;
description?: string;
globs?: string[];
alwaysApply?: boolean;
/**
* When `true`, the skill is loaded and accessible via `skill://<name>` (and
* `/skill:<name>` slash commands), but is omitted from the rendered system
* prompt's skill listing. Use for skills the user opts into explicitly
* rather than ones the model should auto-discover.
*/
hide?: boolean;
/**
* Agent Skills standard equivalent of `hide`.
* When `true`, the skill is excluded from the system prompt listing.
* Normalized from kebab-case `disable-model-invocation` in YAML frontmatter.
* @see https://agentskills.io/specification
*/
disableModelInvocation?: boolean;
[key: string]: unknown;
}
/**
* A skill that provides specialized knowledge or workflows.
*/
export interface Skill {
/** Skill name (unique key, derived from filename or frontmatter) */
name: string;
/** Absolute path to skill file */
path: string;
/** Skill content (markdown) */
content: string;
/** Parsed frontmatter */
frontmatter?: SkillFrontmatter;
/** Source level */
level: "user" | "project";
/** Source metadata */
_source: SourceMeta;
}
export const skillCapability = defineCapability<Skill>({
id: "skills",
displayName: "Skills",
description: "Specialized knowledge and workflow files that extend agent capabilities",
key: skill => skill.name,
toExtensionId: skill => `skill:${skill.name}`,
validate: skill => {
if (!skill.name) return "Missing skill name";
if (!skill.path) return "Missing skill path";
return undefined;
},
});