Skills
The skills command group lets you discover and use Hutly Skills — reusable capability bundles that Sammy and the agents route to. A skill is one of two shapes: a capability-only skill (an instruction set in Markdown, optionally shipping backing files as assets) that you load to read, or a workflow-backed skill that wraps a deployed workflow and can be executed with structured arguments.
A typical authoring flow is: skills new to scaffold a directory, edit content.md, skills validate to check it, then skills deploy to publish it. A typical consumer flow is: skills list to find a skill, skills describe for its metadata, and skills load (capability skills) or skills execute (workflow skills) to use it.
All skills subcommands operate against the organization resolved from your configuration (HUTLY_ORG_ID / .hutlyrc.yaml) and authenticate with your HUTLY_API_KEY. Discovery spans your org-owned skills plus the public catalog; your key’s role within the organization governs what you can deploy and execute.
Output is JSON by default. The --json flag is accepted everywhere as a no-op for compatibility, and --pretty pretty-prints the JSON.
The SKILL.yaml directory format
A skill lives in a directory containing a SKILL.yaml manifest plus its backing files. The manifest references those files through the same !include / !org_map / !var directives used by workflow YAML, so content is kept in a separate Markdown file and the workflow (if any) in its own YAML.
my-skill/
SKILL.yaml # manifest
content.md # the instruction body (via !include content.md)
workflow.yaml # optional backing workflow (referenced by the `workflow` field)
assets/ # optional backing files bundled when assets: trueA scaffolded SKILL.yaml looks like:
name: my-skill
description: TODO — describe when Sammy should use this skill. Lead with the trigger phrase.
skillId: !org_map {}
category: my-category
visibility: private
content: !include content.md
tags:
- my-skill
# Present only with --with-assets:
assets: true
requiredTools:
- toolCode: code-interpreter
configuration: {}| Field | Notes |
|---|---|
name |
Required. The human-readable skill name (also the lookup key for deploys). |
description |
Required. Routing-critical — lead with the trigger phrasing Sammy should match. |
skillId |
!org_map {} placeholder; populated and persisted on first deploy. |
category |
Optional grouping label. |
visibility |
private (default) or public. |
internal |
true marks a platform-internal skill (hidden from normal discovery). |
content |
!include content.md — the Markdown instruction body. |
workflow |
Optional relative path to a workflow YAML; presence makes the skill executable. |
requiredTools |
Tools the skill needs at runtime (toolCode + configuration). |
requiredCredentials |
Credentials the skill expects to be available. |
tags |
Tag list used for filtering and routing. |
assets |
true to bundle the directory’s backing files for skills load to materialise. |
skills
skills new
Scaffolds a new skill directory with SKILL.yaml + content.md under <outDir>/<name>/.
hutly skills new my-skill
hutly skills new my-skill --category research --tags pdf,extract --public
hutly skills new my-skill --with-assets| Option | Description |
|---|---|
--with-assets |
Include assets: true and the code-interpreter required tool |
--category <category> |
Set the category field |
--tags <a,b,c> |
Comma-separated tag list (default: [<name>]) |
--public |
Set visibility: public (default: private) |
--internal |
Set internal: true (default: false) |
--out <dir> |
Output directory (default: ./skills) |
--pretty |
Pretty-print JSON output |
skills list
Lists skills available to the org (org-owned + public). With -q, search defaults to semantic (embedding) matching so natural-language queries resolve hyphenated names (e.g. "web artifacts builder" finds web-artifacts-builder). Page through with --cursor when totalRows exceeds the page.
hutly skills list
hutly skills list -q "extract data from a pdf"
hutly skills list -q pdf --keyword
hutly skills list --include-internal
hutly skills list --cursor 20| Option | Description |
|---|---|
-q, --query <q> |
Search query. Semantic by default; pass --keyword for ILIKE substring matching |
--keyword |
Substring matching for -q — whitespace-separated tokens must all appear in the name or description |
--include-internal |
Include platform-internal skills (forces keyword mode) |
-l, --limit <n> |
Max results (default: 20) |
-c, --cursor <n> |
Pagination cursor |
--pretty |
Pretty-print JSON |
Each row carries an executable flag (true when the skill has a backing workflow).
skills describe
Shows a skill’s metadata by ID — no content body. Use load to read the body.
hutly skills describe <skillId> --pretty| Option | Description |
|---|---|
--pretty |
Pretty-print JSON |
skills load
Loads a capability skill: prints its content and, if it ships assets, materialises them into ./skills/<name>/. Accepts a skill UUID or name — name lookup resolves across own-org + public skills, falling back to an exact-match semantic search. Asset downloads are cached against a local sha and skipped on a match unless --force is passed.
hutly skills load pdf-extract
hutly skills load <skillId> --no-assets
hutly skills load pdf-extract --out ./my-skills/pdf --force| Option | Description |
|---|---|
--out <path> |
Override the asset output dir (default: ./skills/<name>/) |
--force |
Re-download assets even if the local sha matches |
--no-assets |
Skip asset materialisation; print content only |
--conversation-id <id> |
Persist the load to the conversation so the skill stays active across turns (defaults to HUTLY_CONVERSATION_ID; omit both to load without persisting) |
--pretty |
Pretty-print JSON |
skills execute
Executes a workflow-backed skill. Capability-only skills (no backing workflow) cannot be executed — load them to read their content instead. --args is a required JSON object matching the skill’s input schema (the backing workflow’s trigger schema).
hutly skills execute <skillId> --args '{"documentUrl":"https://…/lease.pdf"}'| Option | Description |
|---|---|
--args <json> |
Required. JSON object matching the skill’s input schema |
--pretty |
Pretty-print JSON |
skills deploy
Deploys a skill from a SKILL.yaml directory. Processes !include / !org_map / !var directives, validates tags and assets, deploys the backing workflow (if a workflow field is present), creates or updates the skill, and bundles + uploads declared assets. Lookup is by name, pinned to your own org’s private skills so a deploy never overwrites a same-named public skill seeded by another org. On success the resolved skillId is written back into SKILL.yaml — commit it.
hutly skills deploy ./skills/my-skill
hutly skills deploy ./skills/my-skill --dry-run
hutly skills deploy ./skills/my-skill --publish
hutly skills deploy ./skills/my-skill --var env=staging| Option | Description |
|---|---|
--publish |
Publish the backing workflow after deployment |
--dry-run |
Show what would be deployed without deploying |
--force-new |
Always create a new skill (ignore an existing skillId) |
-v, --var <key=value> |
Set a variable value (repeatable) for !var resolution |
skills validate
Validates a skill (SKILL.yaml + tag/asset checks + the backing workflow) without deploying. Accepts a skill directory, a direct SKILL.yaml path, or a container directory like skills/ to validate every skill underneath it.
hutly skills validate ./skills/my-skill
hutly skills validate ./skills/my-skill/SKILL.yaml
hutly skills validate ./skills --no-warnings| Option | Description |
|---|---|
--no-warnings |
Hide warnings (show errors only) |
-v, --var <key=value> |
Set a variable value (repeatable) for !var resolution |
Top-level aliases
The following top-level commands mirror the skills subcommands.
deploy-skill
Alias for skills deploy. Deploys a skill from a SKILL.yaml directory; emits a deprecation notice steering you to skills deploy. Options match skills deploy (--publish, --dry-run, --force-new, -v, --var).
hutly deploy-skill ./skills/my-skill --publishvalidate-skill
Alias for skills validate. Validates a skill, a SKILL.yaml file, or a container directory without deploying. Options match skills validate (--no-warnings, -v, --var).
hutly validate-skill ./skillstrack-skill
Fetches a deployed skill by ID and reconstructs a local SKILL.yaml directory — writing SKILL.yaml, content.md, and workflow.yaml when the skill has a backing workflow. Use it to pull an existing skill into source control. The output directory defaults to a slugified ./<skill-name>/.
hutly track-skill <skillId>
hutly track-skill <skillId> --output ./skills/my-skill| Option | Description |
|---|---|
-o, --output <dir> |
Output directory (defaults to ./<skill-name>/) |