<!-- Generated by scripts/gen-docs.ts from the TSDoc in src/. Do not edit by hand. -->

# `skills`

Source: [`src/skills.ts`](https://github.com/AI-for-dev/combo/blob/main/src/skills.ts)

The skills an agent may load, and where they are looked up.

A skill is **named in a definition, never inherited from the machine**:
`skills:` is an allowlist exactly like `tools:`, so what an agent can do
stays readable in its own file. Only the *lookup* reaches outside, nearest
first: the skill shipped beside the definition, then the repository's, then
the user's. Whoever is closest to the work wins the name.

pi does the rest: the system prompt carries a name, a description and a path,
and the model opens `SKILL.md` itself with `read`. That is why a declared
skill the model cannot reach is a configuration error rather than a silence
at runtime: a flow's validation reports it, and spawn throws it.

## `resolveSkills`

*function*

```typescript
export function resolveSkills(agent: Agent, cwd: string, tools: readonly string[]): Skill[] { /* … */ }
```

Resolves what an agent's `skills:` names, in the order it named them.

Throws rather than dropping one: a missing skill is a typo in a definition,
and finding out through prose that quietly lacks a step costs more than
failing at spawn. A TypeScript workflow has no validation before it runs, so
this is where it finds out; a flow found out before its first spawn.

## `SkillDir`

*type*

```typescript
export type SkillDir = {
	/** Absolute path of the directory. It legitimately may not exist. */
	dir: string;
	/** Where a skill found here came from: `"agent"`, `"project"` or `"user"`. */
	source: string;
};
```

A directory to search, and the label pi records for what it finds there.
