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.mdWhen 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| Path | Purpose |
|---|---|
plugin.config.ts | Plugin identity, target defaults, MCP servers, and packaged files |
AGENTS.md, CLAUDE.md, GEMINI.md, or instructions.md | Always-on plugin instructions; use one canonical file |
skills/<name>/SKILL.md | Loadable procedure with adjacent supporting files |
commands/<name>.ts | User-invoked command or prompt |
agents/<name>.ts | Specialist agent definition |
agents/<name>.md | Specialist agent authored as Markdown and frontmatter |
hooks/<name>.ts | Lifecycle event handler |
tools.ts | Executable tools exposed through native plugin APIs or generated MCP |
mcp.ts | Stdio 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-reviewSet 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.