Soubi

Project Structure

Learn the files Soubi discovers and what each path becomes in a target harness.

Soubi builds a portable plugin from ordinary files in one directory. Add only the capabilities the plugin needs.

Start with one file

An instructions file is enough to build a plugin:

my-plugin/
└── AGENTS.md

When plugin.config.ts is absent, Soubi uses the directory name as the plugin ID.

Add capabilities by path

A typical plugin grows into this layout:

my-plugin/
├── plugin.config.ts
├── AGENTS.md
├── skills/
│   └── review/
│       ├── SKILL.md
│       └── rubric.md
├── commands/
│   └── commit.ts
├── agents/
│   └── reviewer.ts
├── hooks/
│   └── pre-tool-use.ts
├── tools.ts
├── mcp.ts
└── assets/
    └── policy.json
PathPurpose
plugin.config.tsPlugin identity, target defaults, MCP servers, and packaged files
AGENTS.md, CLAUDE.md, GEMINI.md, or instructions.mdAlways-on plugin instructions; use one canonical file
skills/<name>/SKILL.mdLoadable procedure with adjacent supporting files
commands/<name>.tsUser-invoked command or prompt
agents/<name>.tsSpecialist agent definition
agents/<name>.mdSpecialist agent authored as Markdown and frontmatter
hooks/<name>.tsLifecycle event handler
tools.tsExecutable tools exposed through native plugin APIs or generated MCP
mcp.tsStdio and HTTP MCP server definitions
assets/Plugin-wide files copied into generated artifacts

Let filenames supply names

The filename or directory usually supplies the model-facing name. For example:

commands/release-notes.ts  →  release-notes
agents/security-reviewer.ts  →  security-reviewer
skills/diff-review/SKILL.md  →  diff-review

Set an explicit name only when the portable name should differ from the path.

TypeScript module rules

plugin.config.ts, commands, agents, hooks, tools.ts, and mcp.ts are loaded as modules. Default-export the relevant define* result. Soubi also accepts .tsx, .mts, .js, and .mjs.

On this page