Manifest Schema - alexherrero/crickets GitHub Wiki
You configure crickets primitives and plugins with YAML manifests. You use two layers. The per-primitive frontmatter describes the primitive. You place this atop each SKILL.md / hook.md / agent .md / …. The per-group group.yaml describes the plugin. The scripts/lint_src.py script validates both layers. You run this script in CI + check-all.sh. You can find the source of truth at src/SCHEMA.md.
You use these fields in the primitive frontmatter atop a manifest file:
| Field | Required | Type | Allowed values / shape |
|---|---|---|---|
name |
yes | string | matches the primitive's dir/file name |
description |
yes | string | non-empty; one or two sentences |
kind |
yes | enum |
skill · agent · hook · command · mcp-server · status-line · output-style · workflow · rule · snippet · settings-fragment
|
supported_hosts |
yes | list | non-empty subset of [claude-code, antigravity]
|
version |
no | string | semver MAJOR.MINOR.PATCH (optional -prerelease) |
The primitive's group is the folder it lives in. You do not use a group: field.
crickets primitives are operator-scoped rather than project-scoped: a plugin installs once for the machine and travels with you. There is no per-primitive placement field — an install_scope key survived here as inert metadata from the v2 manifest schema until it was retired, and nothing ever read it.
You place one group.yaml in each src/<group>/. This file describes the plugin. The group slug is the folder name. You never write it as a field.
| Field | Required | Type | Meaning |
|---|---|---|---|
name · description
|
yes | string | marketplace display |
category |
no | string | marketplace category (default Coding) |
standalone |
yes | bool | independently installable |
requires |
no | list | groups this plugin hard-depends on (each an existing src/<slug>/) |
capabilities |
no | list | named capabilities other plugins' enhances can target |
enhances |
no | list | groups this plugin softly augments when both are installed — a slug, or {group, capability?, effect}
|
renamed_from |
no | list | Prior slugs this group was known as, oldest-first, excluding the current name — e.g. wiki declares renamed_from: [wiki-maintenance] (live since v0.9.0). Claude-Code-only: the generator emits the chain as consecutive-pair entries in a top-level renames map in dist/claude-code/.claude-plugin/marketplace.json (Claude Code v2.1.193+), so an install that predates the rename resolves natively instead of plugin-not-found; no Antigravity equivalent (named skip — no marketplace-schema field exists there). |
Invariant (lint-enforced): standalone: true ⟺ requires: []. You create an integrated plugin when it requires another. You create a standalone plugin when it requires nothing. The enhances field is orthogonal. It acts as a soft augmentation. A standalone plugin may still enhance a target.
# src/code-review/group.yaml
name: Code Review
requires: []
standalone: true
enhances:
- group: development-lifecycle
capability: review
effect: "/review dispatches the adversarial reviewers"You can read Plugin anatomy to learn how you compose these into a plugin.
You place a skill at skills/<name>/SKILL.md. You use <kind>/<name>.<ext> for other kinds. You can read Per-host paths for details.
---
name: pii-scrubber
description: Scan the current git diff for personal information before commit or push.
kind: skill
supported_hosts: [claude-code, antigravity]
version: 0.1.0
---
<skill body — operational instructions for the agent>The generator finds a primitive by walking a group's <kind>/ subdir. It looks for a manifest file:
| Kind | Discovered at |
|---|---|
skill |
skills/<name>/SKILL.md |
agent |
agents/<name>.md |
command |
commands/<name>.md |
hook |
hooks/<name>/hook.md |
snippet |
snippets/<name>.md |
output-style |
output-styles/<name>.md |
rule |
rules/<name>.md |
The other enum values (mcp-server, status-line, workflow, settings-fragment) are valid kinds. They have no discovery path or instance yet. A group's scripts/ dir is a group asset. It is not a kind. The generator copies it verbatim to <plugin>/scripts/. You reference it as ${CLAUDE_PLUGIN_ROOT}/scripts/<name> on Claude Code. You reference it as the relative scripts/<name> on Antigravity. Antigravity runs from inside the plugin dir.
The scripts/lint_src.py script asserts these rules:
-
group.yaml— You must providename/description/standalone. Thestandalonefield must be a bool. Therequiresfield must be a list of existing group slugs. You must maintain the invariantstandalone ⟺ requires:[]. Thecapabilitiesfield must be a list. Eachenhancestarget must exist. The target cannot be the group itself. The target cannot be inrequires. You must declare any namedcapabilityon the target. -
Primitive frontmatter — You must provide
name/description/kind/supported_hosts. Thesupported_hostsfield must be a non-empty subset of[claude-code, antigravity].
python3 scripts/lint_src.py- Plugin anatomy — You learn what a plugin is + its overall structure.
-
Customization types — You learn what each
kindmeans. - Per-host paths — You learn where each kind lands, per host.
-
Host adapters — You learn how the
renamesmap this field feeds differs, host by host. -
Modify a plugin — You learn how to edit
src/, regenerate, and dogfood. -
src/SCHEMA.md— You can read the source schema this mirrors.