Reference

Harness

Harness definition fields and the five built-in harnesses.

A harness is one agent: its id, the directories it reads, and any extra files it needs. Editors can use the schema at https://tuvren.github.io/skillprism/schema/v1/harness.json. Unknown fields are rejected.

Built-in ids are claude, codex, opencode, factory, and pi. Files harnesses/*.yaml and harnesses/*.yml load as user harnesses and replace a built-in with the same id. init harness writes that file. The steps are in Add a custom harness.

claude-code selects claude and droid selects factory. An exact registered id wins: a user harness whose id is claude-code or droid is that harness, and the built-in alias is not applied.

Output directories for the built-ins are in Directories and state.

id

Typestring
Requiredyes

Harness identifier. build uses it as the dist/<id>/ directory name.

name

Typestring
Requiredyes

Display name. The template sees it as harness.name.

version

Typestring or null
Requiredno

Definition version. Any string. When set, the template sees it as harness.version.

capabilities

Typeobject
Requiredyes

supports_subagent is required. The other fields are optional.

FieldTypeDefaultMeaning
supports_subagentboolean—Subagent support. Capability name: subagent.
requires_sidecarbooleanfalseSidecar support flag. Capability name: sidecar.
requires_manifestbooleanfalseManifest support flag. Capability name: manifest.
name_max_lengthinteger ≥ 064Maximum skill-name length for this harness.
description_max_lengthinteger ≥ 01024Maximum description length for this harness.
supports_allowed_toolsbooleanfalseallowed-tools. Capability names: allowed-tools, allowed_tools.
supports_disable_model_invocationbooleanfalsedisable-model-invocation. Capability names: disable-model-invocation, disable_model_invocation.
supports_user_invocable_flagbooleanfalseuser-invocable. Capability names: user-invocable, user_invocable.

A required-capabilities entry that matches none of those names is unsatisfied. The pair is skipped and the rest of the project still resolves. An unknown harness id in skillprism.yaml aborts resolution.

Length checks use Unicode scalar values. A name or description over the spec caps (64 and 1024) and within the harness cap is a warning. Over the harness cap is an error.

Built-in values:

IdNameSubagentSidecarManifestAllowed toolsDisable model invocationUser-invocableName maxDescription max
claudeClaude Codetruefalsetruetruetruetrue641536
codexCodex CLItruetruetruefalsefalsefalse100500
opencodeOpenCodetruefalsefalsefalsefalsefalse641024
factoryFactorytruefalsefalsefalsetruetrue641024
piPifalsetruefalsefalsetruefalse641024

paths

Typeobject
Requiredyes
FieldTypeRequiredMeaning
project_scope_pathstringyesProject skill directory, relative to the project root.
user_scope_pathstringyesUser skill directory. Joined to $HOME, except opencode, which is joined to $XDG_CONFIG_HOME or $HOME/.config.
skill_filenamestringyesRendered skill filename. Built-ins use SKILL.md.
manifest_scope_pathstring or nullnoManifest directory. Omitted when the harness has no manifest.
manifest_filenamestring or nullnoManifest filename.

build writes the skill file to dist/<id>/<skill-name>/<skill_filename>. It does not insert project_scope_path into that path. A manifest is dist/<id>/<manifest_scope_path>/<manifest_filename>. Live installs use project_scope_path and user_scope_path. A scope path, sidecar filename, or sidecar output_dir that is absolute or contains .. is rejected.

Built-in skill filenames are SKILL.md. Manifest paths:

Idmanifest_scope_pathmanifest_filename
claude.claudeplugin.json
codex.agentsmarketplace.json
opencode——
factory——
pi——

macros

Typeobject
Requiredno
Default{}

Each key is available as harness.<key>. The value is a string, or an object whose required field is content (a string). Other keys on that object are ignored.

A skill overrides.<id>.macros entry replaces the same name for that skill only. See Templates.

Every built-in defines subagent_guide. claude also defines hints.

sidecars

Typearray
Requiredno
Default[]

Each item is rendered next to the skill file.

FieldTypeRequiredMeaning
filenamestringyesOutput filename.
templatestringyesTemplate for that sidecar file.
output_dirstring or nullnoSubdirectory of the skill output directory.

The built-in definitions ship no sidecar templates. codex and pi set requires_sidecar to true, so a skill that requires sidecar resolves for those two ids.

manifest

Typeobject
Requiredno

Top-level field. It is not an item of sidecars. It has one field, template (string, required when manifest is set). build fills that template once per skill, checks that each result is JSON, and writes one JSON array of those objects. Invalid JSON is an error and no output is written.

claude and codex set requires_manifest to true and define a manifest.template. Their templates also emit skill_ref.

Manifests

The template below has no format key.

manifest:
  template: |
    {
      "name": {{ skill_name | tojson }},
      "description": {{ skill_description | tojson }}
    }
paths:
  manifest_scope_path: .my-agent
  manifest_filename: index.json

skill_ref_pattern

Typestring or null
Requiredno

Pattern passed to skill_ref. {name} is replaced with the argument. Every built-in sets /{name}. When the field is omitted, skill_ref uses /{name}. The template sees the raw pattern as harness.skill_ref_pattern when the field is set.