Manifest reference

Every field a package manifest can carry, per kind.

Generated from the code that implements this. If the schemas, the platform table or the routes change, this page changes with them — and the tests fail if it does not.

A manifest describes one version of one package. It is validated on upload by the same schema this page is generated from, so anything not listed here is rejected — every manifest type is strict, and an unknown key is an error rather than a silently ignored field.

Common fields

Carried by every kind.

FieldTypeRequiredRulesNotes
namestringyesmatches ^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$Package name without the scope. The scope is your username; SenClaw sets it, the manifest does not.
versionstringyesSemver. Required, unlike upstream plugin manifests — without an ordered immutable version you cannot pin, yank or diff.
descriptionstringyes1–1024 charsOne line, shown in the store listing and search results.
authorobjectnoWho wrote it. Distinct from the publisher, which is the signed-in account that ran publish.
author.namestringyes1–128 charsDisplay name.
author.emailstringnoemail formatOptional contact address. Published as-is, so use one you are happy to make public.
author.urlstringnouri formatHomepage for the author.
licensestringno≤ 64 charsSPDX identifier, e.g. MIT. Not validated against the SPDX list — a non-standard string is accepted and shown verbatim.
homepagestringnouri formatProject homepage.
repositorystringnouri formatSource repository. Shown on the package page so a reader can compare published bytes against source.
keywordsstring[]no≤ 16 items; each: ≤ 32 charsSearch terms.
categorystringno≤ 32 charsFree-text grouping, e.g. testing.
permissionsobjectnoWhat the package expects to touch. Optional, but omitting it is itself a signal — see the permissions reference.

The permissions object has its own reference: Permissions.

Kind-specific fields

Each kind adds one block, named after the kind.

skill

FieldTypeRequiredRulesNotes
kind"skill"yesDiscriminator. Fixed per manifest type and chosen by which upload form or CLI subcommand you use.
skillobjectnoSkill frontmatter, carried through verbatim. The registry does not interpret these; the agent does.
skill.whenToUsestringno≤ 1024 charsWhen the agent should reach for this skill. This is what drives skill selection, so it is the most load-bearing field here.
skill.allowedToolsstringno≤ 256 charsComma-separated tool allowlist.
skill.disallowedToolsstringno≤ 256 charsComma-separated tool denylist.
skill.modelstringno≤ 64 charsModel the skill expects, e.g. claude-opus-5.
skill.argumentHintstringno≤ 128 charsHint shown when the skill is invoked with arguments.
skill.userInvocablebooleannoWhether the skill can be invoked directly as /name.
skill.disableModelInvocationbooleannoWhether the model is prevented from invoking it on its own.

app

FieldTypeRequiredRulesNotes
kind"app"yesDiscriminator. Fixed per manifest type and chosen by which upload form or CLI subcommand you use.
appobjectyesApp metadata. Required — an app is defined by its artifact matrix.
app.updater"none" | "tauri" | "electron"nodefault "none"Which auto-update protocol the artifacts feed, and therefore what /updates serves for this package.
app.artifactsobject[]yes1–64 itemsThe platform matrix. One row per downloadable build.
app.artifacts[].platform"any" | "darwin-arm64" | "darwin-x64" | "win32-x64" | "win32-arm64" | "linux-x64" | "linux-arm64"yesNormalised as ${process.platform}-${process.arch}, so the CLI resolves a build with no guessing. Rust and Go triples are translated at publish time, never at install time.
app.artifacts[].libc"na" | "glibc" | "musl"nodefault "na"glibc or musl for Linux builds; na everywhere else. Never null — a nullable libc would let two otherwise-identical rows both exist.
app.artifacts[].format"tgz" | "zip" | "dmg" | "exe" | "msi" | "nsis" | "appimage" | "deb" | "rpm"yesInstaller or archive format.
app.artifacts[].channel"stable" | "beta" | "alpha"nodefault "stable"Release lane. latest is a dist-tag; this is separate from it.
app.artifacts[].filenamestringyes≤ 256 charsFilename as downloaded.
app.artifacts[].buildTriplestringno≤ 64 charsExact build triple (aarch64-apple-darwin), kept for provenance. Resolution uses platform, not this.

plugin

FieldTypeRequiredRulesNotes
kind"plugin"yesDiscriminator. Fixed per manifest type and chosen by which upload form or CLI subcommand you use.
pluginobjectnoPlugin metadata.
plugin.displayNamestringno≤ 128 charsHuman-readable name shown in the plugin list.
plugin.defaultEnabledbooleannoWhether the plugin is active as soon as it is installed.
plugin.componentsobjectnoWhat the plugin ships. Declared rather than counted so the package page can say "adds 3 agents and 6 workflows" before anything is downloaded.
plugin.components.skillsintegerno≥ 0Number of skills bundled.
plugin.components.commandsintegerno≥ 0Number of slash commands bundled.
plugin.components.agentsintegerno≥ 0Number of subagents bundled.
plugin.components.workflowsintegerno≥ 0Number of workflow scripts bundled.
plugin.components.hooksbooleannoWhether it installs hooks. Hooks run commands on your machine, so this is the row to read first.
plugin.components.mcpServersbooleannoWhether it configures MCP servers.
plugin.components.lspServersbooleannoWhether it configures LSP servers.
plugin.dependencies(string | object)[]no≤ 32 itemsOther packages it needs: either a bare name, or { name, version }.

workflow

FieldTypeRequiredRulesNotes
kind"workflow"yesDiscriminator. Fixed per manifest type and chosen by which upload form or CLI subcommand you use.
workflowobjectyesWorkflow metadata. Required — a workflow with no entry point is not installable.
workflow.entrystringnodefault "workflow.js"; ≤ 256 chars; matches \.js$Script inside the tarball. Must end in .js and must not traverse upward out of the workflows directory.
workflow.whenToUsestringno≤ 1024 charsMirrors the script's own meta.whenToUse, so SenClaw can show it without executing the script.
workflow.phasesobject[]no≤ 32 itemsMirrors meta.phases — the stages the workflow runs, for display only.
workflow.phases[].titlestringyes≤ 64 charsPhase name.
workflow.phases[].detailstringno≤ 256 charsOne line on what the phase does.

What the schema cannot express

Two rules are enforced on upload but cannot be represented as JSON Schema, so they do not appear as "Rules" above:

  • version must parse as semver. A version that does not is refused outright.
  • workflow.entry must not contain a .. segment. The consumer extracts this

path, and upward traversal would write outside the workflows directory.