Skip to content

Plugins Overview

Junior’s extension model is simple: keep runtime wiring stable, and add behavior through plugin manifests plus skills. You can do this locally in your app or ship plugins as npm packages.

A plugin bundles two things:

  • A manifest (plugin.yaml) that declares optional capabilities, optional config keys, and optional credential behavior.
  • Skills (SKILL.md) that consume those capabilities at runtime.

This keeps provider-specific behavior out of core runtime files.

For app-specific workflows, define plugins directly in your app:

app/plugins/<plugin-name>/
├── plugin.yaml
└── skills/
└── <skill-name>/
└── SKILL.md

Use this path when you want fast iteration inside a single app without publishing packages.

For reuse across apps or teams, package plugin manifests + skills as npm packages and install them next to @sentry/junior.

Terminal window
pnpm add @sentry/junior @sentry/junior-github @sentry/junior-sentry

Then register those package names in withJunior(...) so build-time tracing and runtime discovery use the same explicit package list:

next.config.mjs
import { withJunior } from "@sentry/junior/config";
export default withJunior({
pluginPackages: ["@sentry/junior-github", "@sentry/junior-sentry"]
});

If you publish your own package, include plugin.yaml and skills in package files so runtime discovery works.

Junior discovers both:

  • App-local skills in app/skills/<skill-name>/SKILL.md
  • Plugin-provided skills under each plugin’s skills/ root

Both follow the same SKILL.md contract, capability checks, and validation behavior.

Terminal window
pnpm skills:check