npm.io
0.2.0 • Published yesterday

vite-plugin-skills

Licence
MIT
Version
0.2.0
Deps
4
Size
85 kB
Vulns
0
Weekly
0
Stars
1

vite-plugin-agent-skills

Vite plugin for importing Markdown and Agent Skills from static import attributes.

Requirements

  • Vite ^8.0.0
  • Node >=24.10.0

Install

bun add -D vite-plugin-agent-skills
import { agentSkills } from "vite-plugin-agent-skills";

export default {
  plugins: [agentSkills()],
};

Usage

Import plain Markdown as a string:

import instructions from "./prompts/editor.md" with { type: "markdown" };

Import an Agent Skill from its canonical SKILL.md file:

import reviewSkill from "./skills/review/SKILL.md" with { type: "skill" };

reviewSkill.name;
reviewSkill.description;
reviewSkill.body;
reviewSkill.resources;
reviewSkill.fingerprint;

Skill imports export a serializable AgentSkill:

interface AgentSkill {
  id: string;
  fingerprint: string;
  name: string;
  description: string;
  body: string;
  allowedTools?: string;
  compatibility?: string;
  license?: string;
  metadata?: Record<string, unknown>;
  resources: AgentSkillResource[];
}

Use skill.transform when an app or runtime wants a different export shape:

agentSkills({
  skill: {
    transform: {
      importFrom: "/src/skill-transform.ts",
      importName: "toPromptSkill",
    },
  },
});

The generated module imports toPromptSkill, passes it the generated AgentSkill, and exports the return value.

export function toPromptSkill(skill: AgentSkill) {
  return {
    name: skill.name,
    prompt: skill.body,
    resources: skill.resources,
  };
}

Add the package root types to TypeScript projects that import Markdown modules:

{
  "compilerOptions": {
    "types": ["vite/client", "vite-plugin-agent-skills"]
  }
}

The shipped module declarations type *.md imports as string and */SKILL.md imports as AgentSkill. Projects using skill.transform can add a project-local module declaration when they want the transformed export type.

Config

interface AgentSkillsPluginOptions {
  markdown?:
    | boolean
    | {
        attribute?: string;
        rejectSkillMarkdown?: boolean;
      };
  skill?:
    | boolean
    | {
        attribute?: string;
        transform?: {
          importFrom: string;
          importName?: string;
        };
        validate?: "strict" | "warn";
        resources?: {
          gitignore?: boolean;
          rejectSecrets?: boolean;
          rejectSymlinks?: boolean;
          largeFile?: {
            bytes?: number;
            action?: "warn" | "error" | "ignore";
          };
        };
      };
}

Skill resources respect .gitignore by default. Secret-looking files and symlinks are rejected separately so credentials are not bundled just because a project forgot to ignore them.

validate controls how SKILL.md name errors (length, casing, matching the directory name) are reported: "strict" (default) fails the build, "warn" logs and includes the skill anyway. Structural frontmatter errors (missing YAML, invalid YAML, missing required fields) always fail the build regardless of validate.

Examples

The repo includes a Vite app in examples/basic that imports both plain Markdown and a SKILL.md file.

Acknowledgements

This plugin is heavily inspired by Flue and its approach to Vite-powered agent development.

Development

bun install
bun run build
bun run typecheck
bun run test
bun run lint
bun run format:check

Keywords