jaas.demo.personal-notes, shipped as an example in the jaas-skills repo at examples/skills/personal-notes/. It’s small on purpose: a scratchpad skill that jots a note under a topic and can list what’s already there.
Only
manifest.yaml is strictly required on disk. schema.json, permissions.yaml, and dependencies.yaml each have an unambiguous empty default and are filled in automatically when absent — see Package layout. This example includes all five anyway, since a real skill almost always wants a real schema and a documented permission list.The file tree
manifest.yaml
The identity card — id, version, owner, entrypoint, and the runtime this skill targets.manifest.yaml
entrypoint: SKILL.md is the important line for this section — the manifest can name SKILL.md, prompt.md, executor.py, executor.js, or module.wasm as the entrypoint; whichever it names is packaged alongside the four documents below, but its contents are never validated as structured data, since the format is entirely runtime-family-dependent. A prompt runtime family (like this one) almost always uses SKILL.md.
SKILL.md
The entrypoint itself — the instructions an agent actually runs. Front-mattername/description are for documentation only; the manifest’s id/name are the authoritative identity, so the two are allowed to drift (though keeping them aligned avoids confusion).
SKILL.md
schema.json
The input/output contract, as two JSON Schema documents.schema.json
{ "inputs": { "type": "object", "properties": {} }, "outputs": { "type": "object", "properties": {} } } — this is also exactly what the registry fills in automatically when the file is absent.
permissions.yaml
A flat list of scopes this skill asks for. No fixed enum — free-form strings, scanned by the PERMISSIONS/SUPPLY_CHAIN guardrail categories, not validated against a schema (a typo likefs:writte is silently accepted as its own custom scope, not rejected).
permissions.yaml
dependencies.yaml
Empty here — this skill depends on nothing else.dependencies.yaml
Validating before you publish
Checklist
-
idfollowsvendor.domain.capability, globally unique -
versionis strict SemVer -
entrypointnames a file that actually exists in the package -
schema.jsonhas bothinputsandoutputsas top-level keys (if present at all) - Every
dependencies.yamlentry resolves and has no cycle - No hardcoded secrets, no
.env/config.secrets.json-style filenames - Archive under 50MB