@open-agent-toolkit/cli 0.1.23 → 0.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/create-agnostic-skill/SKILL.md +10 -7
- package/assets/skills/create-agnostic-skill/references/docs/skills-guide.md +598 -0
- package/assets/skills/create-agnostic-skill/references/skill-template.md +2 -2
- package/assets/skills/oat-wrap-up/SKILL.md +1 -1
- package/assets/skills/oat-wrap-up/references/automation-recipes.md +1 -1
- package/dist/commands/local/expand.d.ts.map +1 -1
- package/dist/commands/local/expand.js +50 -8
- package/package.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-agnostic-skill
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.4.0
|
|
4
4
|
description: Use when adding a reusable workflow skill for AI coding agents. Scaffolds a new .agents/skills skill using the Agent Skills open standard.
|
|
5
5
|
argument-hint: '[skill-name]'
|
|
6
6
|
disable-model-invocation: true
|
|
@@ -12,7 +12,7 @@ user-invocable: true
|
|
|
12
12
|
|
|
13
13
|
Create a new skill for AI coding agents using the [Agent Skills open standard](https://agentskills.io). Skills live in `.agents/skills/` (canonical source) and work across Claude Code, Cursor, Codex CLI, Gemini CLI, GitHub Copilot, and 20+ other compatible agents.
|
|
14
14
|
|
|
15
|
-
For deep-dive research on cross-provider compatibility, frontmatter behavior, and distribution patterns, see
|
|
15
|
+
For deep-dive research on cross-provider compatibility, frontmatter behavior, and distribution patterns, see `references/docs/skills-guide.md` (bundled with this skill).
|
|
16
16
|
|
|
17
17
|
## When to Use
|
|
18
18
|
|
|
@@ -362,9 +362,12 @@ For multi-step skills, print brief progress updates so the user knows what's hap
|
|
|
362
362
|
|
|
363
363
|
### Shared References
|
|
364
364
|
|
|
365
|
-
- If multiple skills need the same reference document, place it in `.agents/docs/` (not duplicated per skill)
|
|
366
365
|
- Skill-specific references go in the skill's own `references/` directory
|
|
367
|
-
-
|
|
366
|
+
- Keep a shared doc's canonical copy in `.agents/docs/` — edit it in one place, don't fork copies per skill
|
|
367
|
+
- If a **distributed** skill needs that shared doc at invocation time, vendor it into the skill's `references/docs/` as a symlink to the canonical file:
|
|
368
|
+
`ln -s ../../../../docs/my-guide.md references/docs/my-guide.md`
|
|
369
|
+
The build (`bundle-assets.sh`, which copies with `cp -RL`) materializes the symlink into a real file, so the doc travels with the skill and the reference resolves wherever the skill is installed.
|
|
370
|
+
- Reference the **bundled** path from SKILL.md (`references/docs/my-guide.md`), not repo-root `.agents/docs/`. A bare `.agents/docs/...` reference only resolves inside this monorepo and dangles once the skill is installed in another repo.
|
|
368
371
|
|
|
369
372
|
### Frontmatter Reference
|
|
370
373
|
|
|
@@ -384,7 +387,7 @@ Legend: ✅ supported | ⚠️ provider-specific | 💤 ignored | ❓ unknown
|
|
|
384
387
|
| `context` / `agent` | ❌ | ✅ | ❌ | 💤 | ❓ |
|
|
385
388
|
| `hooks` | ❌ | ✅ | ❌ | 💤 | ❓ |
|
|
386
389
|
|
|
387
|
-
**Key takeaway:** `name` + `description` are the only truly portable interface. Codex ignores unknown keys (safe to include Claude fields), so layer tool-specific fields on top of a portable baseline. For the full matrix, see
|
|
390
|
+
**Key takeaway:** `name` + `description` are the only truly portable interface. Codex ignores unknown keys (safe to include Claude fields), so layer tool-specific fields on top of a portable baseline. For the full matrix, see `references/docs/skills-guide.md` (bundled with this skill).
|
|
388
391
|
|
|
389
392
|
### Detail Level
|
|
390
393
|
|
|
@@ -426,8 +429,8 @@ I need a skill for running database migrations
|
|
|
426
429
|
- [Gemini CLI Skills](https://geminicli.com/docs/cli/skills/) — Gemini-specific features
|
|
427
430
|
- [npx skills CLI](https://github.com/vercel-labs/skills) — installing remote/community skills
|
|
428
431
|
- [Skills best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices) — authoring guidance
|
|
429
|
-
-
|
|
430
|
-
- `.agents/docs/reference-architecture.md` —
|
|
432
|
+
- `references/docs/skills-guide.md` — bundled deep-dive: compatibility matrix, resolved questions, patterns
|
|
433
|
+
- `.agents/docs/reference-architecture.md` — where skills/agents/docs live and why (OAT monorepo only; not bundled)
|
|
431
434
|
|
|
432
435
|
## Troubleshooting
|
|
433
436
|
|
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
# Skills Research Reference
|
|
2
|
+
|
|
3
|
+
Agent Skills ecosystem research and notes across providers.
|
|
4
|
+
|
|
5
|
+
_Last updated: February 2026_
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## The Agent Skills Standard
|
|
10
|
+
|
|
11
|
+
### Overview
|
|
12
|
+
|
|
13
|
+
Agent Skills is an open standard originally developed by Anthropic, released in late 2025, and now adopted by 27+ agent tools. The standard defines a portable format for packaging agent capabilities as directories containing a `SKILL.md` file with YAML frontmatter, plus optional `scripts/`, `references/`, and `assets/` directories.
|
|
14
|
+
|
|
15
|
+
**Spec:** https://agentskills.io/specification
|
|
16
|
+
**GitHub:** https://github.com/agentskills/agentskills
|
|
17
|
+
|
|
18
|
+
### Core Concepts
|
|
19
|
+
|
|
20
|
+
**A skill is a directory** with at minimum a `SKILL.md` file:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
my-skill/
|
|
24
|
+
├── SKILL.md # Required
|
|
25
|
+
├── scripts/ # Optional — executable code
|
|
26
|
+
├── references/ # Optional — documentation loaded on demand
|
|
27
|
+
└── assets/ # Optional — templates, binaries
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Progressive disclosure** is the core design principle:
|
|
31
|
+
|
|
32
|
+
1. **Metadata (always loaded):** `name` and `description` from YAML frontmatter — agents pre-load this at startup to decide relevance
|
|
33
|
+
2. **Instructions (loaded on activation):** Full SKILL.md Markdown body — loaded when the agent determines the skill is relevant to the current task
|
|
34
|
+
3. **Resources (loaded on demand):** Files in `scripts/`, `references/`, `assets/` — loaded only when SKILL.md references them via relative paths
|
|
35
|
+
|
|
36
|
+
### SKILL.md Frontmatter
|
|
37
|
+
|
|
38
|
+
**Required fields:**
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
---
|
|
42
|
+
name: skill-name # Max 64 chars, lowercase letters/numbers/hyphens, no leading/trailing hyphen
|
|
43
|
+
description: | # Max 1024 chars, non-empty
|
|
44
|
+
What this skill does and when to use it.
|
|
45
|
+
---
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Optional fields (spec-level):**
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
---
|
|
52
|
+
name: skill-name
|
|
53
|
+
description: What it does
|
|
54
|
+
license: MIT # License name or reference to bundled file
|
|
55
|
+
compatibility:
|
|
56
|
+
| # Max 500 chars — intended product, system packages, network needs
|
|
57
|
+
Requires Node.js 18+
|
|
58
|
+
allowed-tools: Read Grep Glob # Space-delimited tool list (experimental)
|
|
59
|
+
metadata: # Arbitrary key-value pairs
|
|
60
|
+
author: my-org
|
|
61
|
+
version: '1.0'
|
|
62
|
+
---
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Spec Constraints
|
|
66
|
+
|
|
67
|
+
- SKILL.md should be **under 500 lines / ~5,000 tokens**
|
|
68
|
+
- Use **relative paths** from skill root: `See [guide](references/REFERENCE.md)`
|
|
69
|
+
- Keep file references **one level deep** from SKILL.md
|
|
70
|
+
- Scripts should be **self-contained** or clearly document dependencies
|
|
71
|
+
- Scripts should handle edge cases gracefully and write status to stderr, output to stdout
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Cross-Provider Safe Defaults
|
|
76
|
+
|
|
77
|
+
If you want a skill to work across Claude Code, Cursor, Codex CLI, and Gemini CLI with minimal surprises:
|
|
78
|
+
|
|
79
|
+
1. Follow the Agent Skills spec folder layout and constraints
|
|
80
|
+
2. Keep frontmatter minimal and conservative:
|
|
81
|
+
- `name`: lowercase letters + numbers + hyphens, max 64 chars, must match folder name, no leading/trailing hyphen
|
|
82
|
+
- `description`: **single line**, ≤ 500 chars (Codex enforces this), describes _when to use_ + _what_
|
|
83
|
+
3. Put detailed instructions in the Markdown body (and/or `references/`), not in `description`
|
|
84
|
+
4. Treat extra frontmatter keys as **best-effort extensions**:
|
|
85
|
+
- Claude Code supports many optional frontmatter keys
|
|
86
|
+
- Codex CLI explicitly **ignores unknown keys** (safe to include, won't break, won't be used)
|
|
87
|
+
- Cursor + Gemini support a subset; some keys are undocumented
|
|
88
|
+
|
|
89
|
+
### Cross-Provider Safe Template
|
|
90
|
+
|
|
91
|
+
```markdown
|
|
92
|
+
---
|
|
93
|
+
name: my-skill
|
|
94
|
+
description: Use when [triggering condition]. [What it does as disambiguation keywords] (<= 500 chars).
|
|
95
|
+
license: Apache-2.0
|
|
96
|
+
compatibility: Requires git and jq; intended for CLI-based coding agents.
|
|
97
|
+
metadata:
|
|
98
|
+
author: my-org
|
|
99
|
+
version: '1.0'
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
# My Skill
|
|
103
|
+
|
|
104
|
+
## When to use
|
|
105
|
+
|
|
106
|
+
- ...
|
|
107
|
+
|
|
108
|
+
## Instructions
|
|
109
|
+
|
|
110
|
+
- ...
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Provider-specific fields can be layered on top but should be treated as non-portable:
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
# Claude/Cursor extension fields (non-standard)
|
|
117
|
+
# disable-model-invocation: true
|
|
118
|
+
#
|
|
119
|
+
# Claude-only fields
|
|
120
|
+
# user-invocable: true
|
|
121
|
+
# argument-hint: "[arg]"
|
|
122
|
+
# allowed-tools: Read, Grep, Bash(git:*), Write
|
|
123
|
+
# context: fork
|
|
124
|
+
# agent: explore
|
|
125
|
+
# hooks: { ... }
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Frontmatter Compatibility Matrix
|
|
131
|
+
|
|
132
|
+
Legend: ✅ documented support | ⚠️ provider-specific semantics | 💤 ignored (documented) | ❓ not documented / unknown
|
|
133
|
+
|
|
134
|
+
| Field | Agent Skills Spec | Cursor | Claude Code | Codex CLI | Copilot | Gemini CLI |
|
|
135
|
+
| ------------------------------ | ----------------- | ----------- | --------------- | --------------- | ------------------- | ------------- |
|
|
136
|
+
| `name` | ✅ required | ✅ required | ✅ optional¹ | ✅ required | ✅ required | ✅ documented |
|
|
137
|
+
| `description` | ✅ required | ✅ required | ✅ recommended² | ✅ required | ✅ required | ✅ documented |
|
|
138
|
+
| `license` | ✅ optional | ✅ optional | ❓ | 💤 ignored | ⚠️ may be required³ | ❓ |
|
|
139
|
+
| `compatibility` | ✅ optional | ✅ optional | ❓ | 💤 ignored | ❓ | ❓ |
|
|
140
|
+
| `metadata` | ✅ optional | ✅ optional | ❓ | 💤 ignored | ❓ | ❓ |
|
|
141
|
+
| `allowed-tools` | ⚠️ experimental | ❓ | ✅ | 💤 ignored | ❓ | ❓ |
|
|
142
|
+
| `disable-model-invocation` | ❌ | ✅ | ✅ | 💤 ignored | ❓ | ❓ |
|
|
143
|
+
| `user-invocable` | ❌ | ❓ | ✅ | 💤 ignored | ❌ | ❓ |
|
|
144
|
+
| `argument-hint` | ❌ | ❓ | ✅ | 💤 ignored | ❌ | ❓ |
|
|
145
|
+
| `model` | ❌ | ❓ | ✅ | 💤 ignored | ❌ | ❓ |
|
|
146
|
+
| `context` / `agent` (subagent) | ❌ | ❓ | ✅ | 💤 ignored | ❌ | ❓ |
|
|
147
|
+
| `hooks` (skill-scoped) | ❌ | ❓ | ✅ | 💤 ignored | ❌ | ❓ |
|
|
148
|
+
| `short-description` | ❌ | ❓ | ❓ | ⚠️ example-only | ❓ | ❓ |
|
|
149
|
+
|
|
150
|
+
¹ Claude Code uses directory name if `name` omitted
|
|
151
|
+
² Claude Code uses first paragraph of body if `description` omitted
|
|
152
|
+
³ Copilot may require `license` in practice (see https://github.com/github/copilot-cli/issues/894)
|
|
153
|
+
|
|
154
|
+
**Key takeaway:** Codex's "ignores extra keys" means you can include Claude/Cursor-only fields without breaking Codex, but you cannot depend on them affecting Codex behavior. `name` + `description` are the only truly portable interface.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Tool-Specific Implementations
|
|
159
|
+
|
|
160
|
+
### Claude Code
|
|
161
|
+
|
|
162
|
+
**Docs:** https://code.claude.com/docs/en/skills
|
|
163
|
+
|
|
164
|
+
**Skill locations (by precedence):**
|
|
165
|
+
|
|
166
|
+
1. Enterprise-managed skills
|
|
167
|
+
2. Personal: `~/.claude/skills/<skill-name>/SKILL.md`
|
|
168
|
+
3. Project: `.claude/skills/<skill-name>/SKILL.md`
|
|
169
|
+
4. Plugin skills: bundled with installed plugins (namespaced as `plugin-name:skill-name`)
|
|
170
|
+
|
|
171
|
+
**Claude Code-specific features:**
|
|
172
|
+
|
|
173
|
+
- `allowed-tools`: Restricts tools the agent can use without asking permission when skill is active. **Only meaningful in Claude Code.**
|
|
174
|
+
- `context: fork`: Runs the skill in a forked subagent context (separate context window). **Only supported in Claude Code.**
|
|
175
|
+
- `agent`: Specifies which subagent type to use when `context: fork` is set.
|
|
176
|
+
- `hooks`: Scoped hooks tied to skill lifecycle.
|
|
177
|
+
- `user-invocable: false`: Hides from `/` menu but Claude can still auto-invoke. Useful for "background knowledge" skills.
|
|
178
|
+
- `argument-hint`: Shown during autocomplete to indicate expected args.
|
|
179
|
+
- `skills` field in subagent frontmatter: Auto-loads specified skills into subagent context.
|
|
180
|
+
- **Skills subsume legacy commands:** A file at `.claude/commands/review.md` and a skill at `.claude/skills/review/SKILL.md` both create `/review`. Skills take precedence.
|
|
181
|
+
|
|
182
|
+
**Invocation:**
|
|
183
|
+
|
|
184
|
+
- Default: Model-invoked (Claude autonomously decides based on task + description)
|
|
185
|
+
- `disable-model-invocation: true`: User must explicitly invoke via `/` command
|
|
186
|
+
- Can also be referenced directly in prompts
|
|
187
|
+
|
|
188
|
+
**Collision behavior:** Enterprise > personal > project. Plugin skills are namespaced (`plugin-name:skill-name`) and won't collide with non-plugin skills. If a skill and a legacy slash command share the same name, the skill takes precedence.
|
|
189
|
+
|
|
190
|
+
### Cursor
|
|
191
|
+
|
|
192
|
+
**Docs:** https://cursor.com/docs/context/skills
|
|
193
|
+
|
|
194
|
+
**Skill locations:**
|
|
195
|
+
|
|
196
|
+
- Project:
|
|
197
|
+
- `.cursor/skills/<skill-name>/SKILL.md`
|
|
198
|
+
- `.claude/skills/<skill-name>/SKILL.md` (**Claude compatibility**)
|
|
199
|
+
- `.codex/skills/<skill-name>/SKILL.md` (**Codex compatibility**)
|
|
200
|
+
- Personal:
|
|
201
|
+
- `~/.cursor/skills/<skill-name>/SKILL.md`
|
|
202
|
+
- `~/.claude/skills/<skill-name>/SKILL.md` (**Claude compatibility**)
|
|
203
|
+
- `~/.codex/skills/<skill-name>/SKILL.md` (**Codex compatibility**)
|
|
204
|
+
|
|
205
|
+
**Notable:** Cursor explicitly reads from `.claude/skills/` and `.codex/skills/` for cross-tool compatibility. This means skills authored in `.claude/skills/` are automatically available in Cursor without symlinking.
|
|
206
|
+
|
|
207
|
+
**Documented frontmatter fields:**
|
|
208
|
+
|
|
209
|
+
- `name` (required; must match parent folder)
|
|
210
|
+
- `description` (required)
|
|
211
|
+
- `license`, `compatibility`, `metadata` (optional, per spec)
|
|
212
|
+
- `disable-model-invocation` (optional; makes skill slash-command-only)
|
|
213
|
+
|
|
214
|
+
**Invocation:** Default is "agent decides" — skills are auto-applied when relevant. `disable-model-invocation: true` restricts to explicit invocation only.
|
|
215
|
+
|
|
216
|
+
**Collision behavior:** Not clearly documented; needs empirical validation.
|
|
217
|
+
|
|
218
|
+
### Codex CLI (OpenAI)
|
|
219
|
+
|
|
220
|
+
**Docs:** https://developers.openai.com/codex/skills
|
|
221
|
+
|
|
222
|
+
**Skill locations (by precedence, high → low):**
|
|
223
|
+
|
|
224
|
+
1. `$CWD/.agents/skills` (repo — working directory)
|
|
225
|
+
2. `$CWD/../.agents/skills` (repo — parent folder)
|
|
226
|
+
3. `$REPO_ROOT/.agents/skills` (repo — root)
|
|
227
|
+
4. `$HOME/.agents/skills` (user)
|
|
228
|
+
5. `/etc/codex/skills` (admin)
|
|
229
|
+
6. Bundled system skills
|
|
230
|
+
|
|
231
|
+
> **Note (Feb 2026):** Codex has migrated from `.codex/skills` to `.agents/skills` at all repo and user scopes.
|
|
232
|
+
|
|
233
|
+
**Codex-specific behaviors:**
|
|
234
|
+
|
|
235
|
+
- **Uses `.agents/skills/` natively at all scopes** — Codex scans `.agents/skills/` from CWD up to repo root, plus `$HOME/.agents/skills` for user-level
|
|
236
|
+
- **Ignores unknown frontmatter keys** — you can include Claude/Cursor-specific fields without breaking Codex, but they won't affect behavior
|
|
237
|
+
- **Does NOT deduplicate** same-named skills — multiple can appear in selectors
|
|
238
|
+
- `name`: ≤ 100 chars, **single line** (spec says 64; use 64 for max portability)
|
|
239
|
+
- `description`: ≤ 500 chars, **single line** (spec says 1024; use 500 for max portability)
|
|
240
|
+
- Markdown body stays on disk and **is not injected unless explicitly invoked**
|
|
241
|
+
- Built-in `$skill-creator` and `$skill-installer` skills
|
|
242
|
+
- `/skills` slash command or `$` prefix for explicit invocation
|
|
243
|
+
|
|
244
|
+
**Invocation:** Both explicit (`$skill-name` or `/skills` selector) and implicit (model decides based on description). The body is only loaded on invocation, not at startup.
|
|
245
|
+
|
|
246
|
+
### Gemini CLI
|
|
247
|
+
|
|
248
|
+
**Docs:** https://geminicli.com/docs/cli/skills/
|
|
249
|
+
|
|
250
|
+
**Skill locations:**
|
|
251
|
+
|
|
252
|
+
- Workspace:
|
|
253
|
+
- `.gemini/skills/<skill-name>/SKILL.md`
|
|
254
|
+
- `.agents/skills/<skill-name>/SKILL.md` (**tool-agnostic alias**)
|
|
255
|
+
- User:
|
|
256
|
+
- `~/.gemini/skills/<skill-name>/SKILL.md`
|
|
257
|
+
- `~/.agents/skills/<skill-name>/SKILL.md` (**tool-agnostic alias**)
|
|
258
|
+
- Extension skills (bundled in installed extensions)
|
|
259
|
+
|
|
260
|
+
**Notable:** Gemini reads from `.agents/skills/` natively at both workspace and user scopes, making it zero-sync like Codex for projects that use the canonical `.agents/skills/` layout.
|
|
261
|
+
|
|
262
|
+
**Gemini-specific behaviors:**
|
|
263
|
+
|
|
264
|
+
- Uses **explicit user consent** on activation — shows a confirmation prompt with directory path
|
|
265
|
+
- On approval: SKILL.md body + folder structure are added to conversation history, and the directory is added to allowed file paths
|
|
266
|
+
- Only `name` and `description` are documented as supported frontmatter; other spec fields (license, compatibility, etc.) are untested
|
|
267
|
+
|
|
268
|
+
**Collision behavior:** Workspace > User > Extension.
|
|
269
|
+
|
|
270
|
+
### GitHub Copilot
|
|
271
|
+
|
|
272
|
+
**Docs:** https://code.visualstudio.com/docs/copilot/customization/agent-skills
|
|
273
|
+
|
|
274
|
+
**Skill locations:**
|
|
275
|
+
|
|
276
|
+
- Project:
|
|
277
|
+
- `.github/skills/<skill-name>/SKILL.md`
|
|
278
|
+
- `.claude/skills/<skill-name>/SKILL.md` (**Claude compatibility**)
|
|
279
|
+
- Personal:
|
|
280
|
+
- `~/.copilot/skills/<skill-name>/SKILL.md` (Copilot coding agent and GitHub Copilot CLI only)
|
|
281
|
+
- `~/.claude/skills/<skill-name>/SKILL.md` (**Claude compatibility**; Copilot coding agent and GitHub Copilot CLI only)
|
|
282
|
+
|
|
283
|
+
**Notable:** Like Cursor, Copilot reads from `.claude/skills/` for cross-tool compatibility at both project and personal scopes. Organization-level and enterprise-level skill support is coming soon.
|
|
284
|
+
|
|
285
|
+
**Notes:** The `license` field may be required in practice even though the spec marks it optional (see https://github.com/github/copilot-cli/issues/894).
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## Skill Name Collision Behavior
|
|
290
|
+
|
|
291
|
+
When multiple skills share the same name, providers differ:
|
|
292
|
+
|
|
293
|
+
| Provider | Collision Behavior |
|
|
294
|
+
| -------------- | ------------------------------------------------------------------------------------ |
|
|
295
|
+
| Claude Code | Enterprise > personal > project; plugin skills namespaced (`plugin-name:skill-name`) |
|
|
296
|
+
| Cursor | Not clearly documented; validate empirically |
|
|
297
|
+
| Codex CLI | Does **not** deduplicate — multiple same-named skills can appear in selectors |
|
|
298
|
+
| GitHub Copilot | Not clearly documented; org/enterprise skills coming soon |
|
|
299
|
+
| Gemini CLI | Workspace > User > Extension |
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Invocation Controls
|
|
304
|
+
|
|
305
|
+
### Who Can Invoke?
|
|
306
|
+
|
|
307
|
+
| Control | Spec | Cursor | Claude Code | Codex | Copilot | Gemini |
|
|
308
|
+
| -------------------------- | ------- | -------------------------------- | -------------------------------- | ------------------------ | ------- | -------------------- |
|
|
309
|
+
| Agent auto-invokes | Default | Default | Default | Implicit | Default | Via `activate_skill` |
|
|
310
|
+
| User explicit only | ❌ | `disable-model-invocation: true` | `disable-model-invocation: true` | Explicit `$` / `/skills` | ❓ | Confirmation prompt |
|
|
311
|
+
| Hide from user, agent-only | ❌ | ❓ | `user-invocable: false` | ❌ | ❌ | ❌ |
|
|
312
|
+
|
|
313
|
+
**Guidance for workflow-heavy skills:** Default to `disable-model-invocation: true` for skills that edit files, run commands, or have side effects — prevents accidental triggers.
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## Distribution & Package Management
|
|
318
|
+
|
|
319
|
+
### `npx skills` CLI (Vercel)
|
|
320
|
+
|
|
321
|
+
**Repo:** https://github.com/vercel-labs/skills
|
|
322
|
+
**Directory:** https://skills.sh
|
|
323
|
+
|
|
324
|
+
Installs skills from GitHub repos, local paths, or GitLab URLs to any supported agent's native location.
|
|
325
|
+
|
|
326
|
+
**Installation methods:**
|
|
327
|
+
|
|
328
|
+
- **Symlink (recommended):** Single canonical copy, symlinked to each agent's path
|
|
329
|
+
- **Copy:** Independent copies for each agent (when symlinks aren't supported)
|
|
330
|
+
|
|
331
|
+
**Scopes:**
|
|
332
|
+
|
|
333
|
+
- Project (default): `./<agent>/skills/`
|
|
334
|
+
- Global (`-g`): `~/<agent>/skills/`
|
|
335
|
+
|
|
336
|
+
**Discovery paths searched** (when discovering skills in a repo):
|
|
337
|
+
`.agents/skills/`, `.claude/skills/`, `.codex/skills/`, `.cursor/skills/`, `.gemini/skills/`, `.github/skills/`, and 20+ more tool-specific paths. Falls back to recursive search if nothing found.
|
|
338
|
+
|
|
339
|
+
### Symlink Approach (Recommended)
|
|
340
|
+
|
|
341
|
+
Author skills in `.agents/skills/` (canonical) and distribute to provider-specific directories:
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
# Claude Code + Cursor (Cursor reads .claude/skills/ natively)
|
|
345
|
+
ln -s ../../.agents/skills/my-skill .claude/skills/my-skill
|
|
346
|
+
|
|
347
|
+
# GitHub Copilot
|
|
348
|
+
ln -s ../../.agents/skills/my-skill .github/skills/my-skill
|
|
349
|
+
|
|
350
|
+
# Codex reads .agents/skills/ natively at project level — no symlink needed
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
For automated distribution, use **OAT sync** (for local/internal skills) or **`npx skills add`** (for remote/community skills):
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
# OAT sync — manages local canonical → provider distribution with manifest tracking
|
|
357
|
+
oat sync --scope all
|
|
358
|
+
|
|
359
|
+
# npx skills — installs remote skills from GitHub or skills.sh
|
|
360
|
+
npx skills add github-user/skill-repo -a claude-code -a github-copilot
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**Result: one canonical source, two symlinks, four tools.**
|
|
364
|
+
|
|
365
|
+
**Note:** Cursor already reads `.claude/skills/` natively, so the Claude Code symlink covers both. Codex reads `.agents/skills/` at project level (per Vercel skills docs), eliminating its symlink entirely.
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## Cross-Tool Compatibility (npx skills Matrix)
|
|
370
|
+
|
|
371
|
+
From the `npx skills` CLI compatibility matrix:
|
|
372
|
+
|
|
373
|
+
| Feature | Claude Code | Codex | Cursor | Copilot | Gemini CLI | Amp | Roo | OpenCode | Cline |
|
|
374
|
+
| --------------- | ----------- | ----- | ------ | ------- | ---------- | --- | --- | -------- | ----- |
|
|
375
|
+
| Basic skills | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
376
|
+
| `allowed-tools` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
377
|
+
| `context: fork` | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
|
|
378
|
+
| Hooks | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
|
379
|
+
|
|
380
|
+
Source: https://github.com/vercel-labs/skills#compatibility
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## Proposed Spec Extensions
|
|
385
|
+
|
|
386
|
+
### `prerequisite-skills` / `related-skills` (Issue #90)
|
|
387
|
+
|
|
388
|
+
**URL:** https://github.com/agentskills/agentskills/issues/90
|
|
389
|
+
|
|
390
|
+
Would let skills declare dependencies on other skills. Relevant for skill chains where one skill should run before another.
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## Best Practices (Distilled)
|
|
395
|
+
|
|
396
|
+
### Description Field
|
|
397
|
+
|
|
398
|
+
The `description` is your **primary routing mechanism** — it is "for routing, not reading" (Builder.io). Google's Antigravity docs call it "the most important field" and describe it as a "trigger phrase." The agentskills.io spec's own example is simply `description: When to use this skill`.
|
|
399
|
+
|
|
400
|
+
At startup, agents load _only_ `name` + `description` across potentially 100+ skills, then semantic-match against the user's prompt. The body of SKILL.md already covers "what it does" once loaded. **The description's job is to win the routing decision.**
|
|
401
|
+
|
|
402
|
+
**Lead with "when", include "what" as disambiguation keywords:**
|
|
403
|
+
|
|
404
|
+
1. **Lead with triggering conditions**: "Use when…" / "Run this when…" / "Triggers when…"
|
|
405
|
+
2. **Include keywords for disambiguation**: nouns + verbs that differentiate from similar skills
|
|
406
|
+
3. **Keep it single-line**: Codex enforces single-line ≤ 500 chars
|
|
407
|
+
4. **Don't summarize the workflow**: providers route on description without reading the body
|
|
408
|
+
|
|
409
|
+
Examples:
|
|
410
|
+
|
|
411
|
+
- Bad: "Reviews code by checking spec compliance, then code quality, then creates PR"
|
|
412
|
+
- Bad: "Analyzes and audits AGENTS.md files for correctness and completeness"
|
|
413
|
+
- Good: "Use when you need to ensure AGENTS.md files accurately reflect the codebase. Validates commands, checks for stale paths, and identifies gaps."
|
|
414
|
+
- Good: "Use when reviewing code or checking PRs. Systematic quality and security analysis."
|
|
415
|
+
|
|
416
|
+
### Authoring
|
|
417
|
+
|
|
418
|
+
1. **Write for progressive disclosure** — short keyword-rich description, main instructions in body, bulk reference in `references/`
|
|
419
|
+
2. **Prefer deterministic scripts** — put correctness-critical logic in `scripts/`, not freeform agent reasoning
|
|
420
|
+
3. **Idempotence and resume safety** — read project state from disk, don't start over unless asked, use state files as source of truth
|
|
421
|
+
4. **Keep SKILL.md under 500 lines** — move reference material to separate files
|
|
422
|
+
5. **File references one level deep** — no deeply nested chains
|
|
423
|
+
6. **Use relative paths** from skill root
|
|
424
|
+
|
|
425
|
+
### Script Requirements
|
|
426
|
+
|
|
427
|
+
- Use `#!/bin/bash` shebang
|
|
428
|
+
- Use `set -e` for fail-fast behavior
|
|
429
|
+
- Write status messages to stderr: `echo "Message" >&2`
|
|
430
|
+
- Write machine-readable output (JSON) to stdout
|
|
431
|
+
- Include cleanup trap for temp files
|
|
432
|
+
|
|
433
|
+
### Naming
|
|
434
|
+
|
|
435
|
+
- Skill directory: kebab-case (`agents-md-audit`)
|
|
436
|
+
- `SKILL.md`: Always uppercase, always this exact filename
|
|
437
|
+
- Scripts: kebab-case.sh (`validate-commands.sh`)
|
|
438
|
+
- Name field: max 64 chars (use 64 for portability, even though Codex allows 100)
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## Resolved Research Questions
|
|
443
|
+
|
|
444
|
+
### Q: How does `context: fork` interact with subagent `skills` field in Claude Code?
|
|
445
|
+
|
|
446
|
+
**Answer:** They serve different purposes and interact at different levels:
|
|
447
|
+
|
|
448
|
+
- **`context: fork` on a skill** causes the skill to run in an isolated sub-agent context with its own conversation history. You can specify `agent: Explore` (or any built-in/custom agent) to control the sub-agent type. The skill content becomes the task prompt injected into the forked context. Results are summarized and returned to the main conversation.
|
|
449
|
+
- **`skills` field on a subagent** pre-loads specified skills into the subagent's context, making them available for the subagent to invoke during its work.
|
|
450
|
+
- **Key difference (from Claude docs):** "With skills in a subagent, the subagent controls the system prompt and loads skill content. With `context: fork` in a skill, the skill content is injected into the agent you specify."
|
|
451
|
+
- **Known bug (Issue #17283):** As of January 2026, when a skill is invoked via the Skill tool programmatically, `context: fork` and `agent:` frontmatter fields may be ignored — the skill runs in the main conversation context instead. Workaround: restructure skills as custom agents if isolation is required.
|
|
452
|
+
|
|
453
|
+
**Source:** https://code.claude.com/docs/en/sub-agents, https://github.com/anthropics/claude-code/issues/17283
|
|
454
|
+
|
|
455
|
+
### Q: Can Codex's hierarchical skill scoping be leveraged for monorepo patterns?
|
|
456
|
+
|
|
457
|
+
**Answer:** Yes. Codex walks the directory tree from CWD up to repo root and loads skills from `.agents/skills/` at each level. The skill table shows explicit scoping:
|
|
458
|
+
|
|
459
|
+
| Scope | Location | Monorepo Use |
|
|
460
|
+
| --------- | --------------------------- | --------------------------------------------------------------- |
|
|
461
|
+
| CWD | `$CWD/.agents/skills` | Skills specific to a microservice or module |
|
|
462
|
+
| Parent | `$CWD/../.agents/skills` | Skills for a shared area in a parent folder |
|
|
463
|
+
| Repo Root | `$REPO_ROOT/.agents/skills` | Organization-wide skills; can be overridden by subfolder skills |
|
|
464
|
+
|
|
465
|
+
Same-named skills at a more specific scope overwrite those from a less specific scope. This mirrors the AGENTS.md "nearest file wins" pattern and is well-suited for monorepos where packages need different conventions.
|
|
466
|
+
|
|
467
|
+
**Source:** https://developers.openai.com/codex/skills, https://developers.openai.com/codex/config-advanced/, https://github.com/vercel-labs/skills
|
|
468
|
+
|
|
469
|
+
### Q: What's the practical token cost of skills via progressive disclosure vs. same content in AGENTS.md?
|
|
470
|
+
|
|
471
|
+
**Answer:** Significant savings. The architecture is:
|
|
472
|
+
|
|
473
|
+
1. **Discovery (always loaded):** Only `name` + `description` — approximately 50-100 tokens per skill. With 20 skills, that's ~1,000-2,000 tokens in the system prompt.
|
|
474
|
+
2. **Activation (on demand):** Full SKILL.md body loaded only when relevant. If a skill's body is 2,000 tokens but only needed for 20% of tasks, the expected cost per session is ~400 tokens vs. 2,000 if it were always in AGENTS.md.
|
|
475
|
+
3. **Resources (on demand):** Files in `references/`, `scripts/`, `assets/` are loaded only when SKILL.md explicitly references them. Scripts execute and return only their output — the script code itself never enters context.
|
|
476
|
+
|
|
477
|
+
**Key insight:** AGENTS.md content is loaded into every conversation. Skill content is loaded only when matched. For guidance that's needed in <50% of sessions, skills are significantly cheaper. For guidance needed in every session (project overview, build commands), AGENTS.md is appropriate.
|
|
478
|
+
|
|
479
|
+
**Source:** https://code.claude.com/docs/en/skills, https://leehanchung.github.io/blogs/2025/10/26/claude-skills-deep-dive/
|
|
480
|
+
|
|
481
|
+
### Q: How do skills interact with MCP tools in practice?
|
|
482
|
+
|
|
483
|
+
**Answer:** Skills and MCP tools are complementary but operate at different layers:
|
|
484
|
+
|
|
485
|
+
- **Skills** are instructions (what to do, how to do it). They modify Claude's prompt context.
|
|
486
|
+
- **MCP tools** are capabilities (access to external systems). They provide tools Claude can call.
|
|
487
|
+
- **`allowed-tools`** in skill frontmatter can reference MCP tools, granting them without per-use approval when the skill is active.
|
|
488
|
+
- **Limitation:** MCP tools are NOT available in background subagents. If a skill uses `context: fork` and runs in the background, MCP tools won't be accessible.
|
|
489
|
+
- **Pattern:** A skill can instruct Claude to use specific MCP tools as part of its workflow (e.g., "use the github MCP server to fetch PR details"). The skill provides the methodology; MCP provides the tooling.
|
|
490
|
+
|
|
491
|
+
MCP server schemas do load at startup and consume context whether used or not — this is a known overhead. Dynamic `list_changed` notifications (Claude Code 2.1+) help by allowing MCP servers to update available tools mid-session.
|
|
492
|
+
|
|
493
|
+
**Source:** https://code.claude.com/docs/en/skills, https://paddo.dev/blog/claude-code-21-pain-points-addressed/
|
|
494
|
+
|
|
495
|
+
### Q: Will `prerequisite-skills` make it into the spec? Timeline?
|
|
496
|
+
|
|
497
|
+
**Answer:** Unclear. Issue #90 was opened January 16, 2026 and remains open. It proposes two optional fields:
|
|
498
|
+
|
|
499
|
+
- `prerequisite-skills`: Skills that should ideally run before this skill
|
|
500
|
+
- `related-skills`: Complementary skills that work well together
|
|
501
|
+
|
|
502
|
+
The proposal has community interest but no official timeline or maintainer response indicating it's being worked on.
|
|
503
|
+
|
|
504
|
+
**Workaround:** Reference prerequisite skills in the SKILL.md body instructions (e.g., "Before running this skill, invoke the agents-md-audit skill first"). This works across all providers since it's just instruction text.
|
|
505
|
+
|
|
506
|
+
**Source:** https://github.com/agentskills/agentskills/issues/90
|
|
507
|
+
|
|
508
|
+
### Q: Is there an emerging standard for skill testing/validation?
|
|
509
|
+
|
|
510
|
+
**Answer:** Fragmented but growing:
|
|
511
|
+
|
|
512
|
+
- **agentskills/skills-ref** (official): Basic spec-level validation (frontmatter format, naming constraints)
|
|
513
|
+
- **Empirical testing** (recommended): The Claude docs recommend a "Claude A / Claude B" testing pattern — use one Claude instance (A) to author/refine the skill, and another instance (B) to test it with real tasks. Observe B's behavior and bring insights back to A.
|
|
514
|
+
- **Manual smoke tests** remain the standard practice: discovery (does it show up?), manual invocation (does it load?), auto-invocation (triggers correctly/not too often?), resume safety (interrupt + rerun)
|
|
515
|
+
- **No formal testing framework** exists for skills across providers. Each provider has different discovery and invocation mechanics that need individual validation.
|
|
516
|
+
|
|
517
|
+
**Source:** https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices, https://github.com/agentskills/agentskills/tree/main/skills-ref
|
|
518
|
+
|
|
519
|
+
### Q: Cursor reads `.claude/skills/` natively — does this make `.agents/skills/` + symlinks unnecessary?
|
|
520
|
+
|
|
521
|
+
**Answer:** No. While Cursor reading `.claude/skills/` is convenient, it only covers two of four required tools:
|
|
522
|
+
|
|
523
|
+
| Tool | Native Path | Reads `.claude/skills/`? | Reads `.agents/skills/`? |
|
|
524
|
+
| -------------- | ----------------- | ------------------------ | ------------------------ |
|
|
525
|
+
| Claude Code | `.claude/skills/` | ✅ (native) | ❌ |
|
|
526
|
+
| Cursor | `.cursor/skills/` | ✅ (cross-compat) | ❌ |
|
|
527
|
+
| Codex CLI | `.agents/skills/` | ❌ | ✅ (native) |
|
|
528
|
+
| GitHub Copilot | `.github/skills/` | ✅ (cross-compat) | ❌ |
|
|
529
|
+
| Gemini CLI | `.gemini/skills/` | ❌ | ✅ (native alias) |
|
|
530
|
+
|
|
531
|
+
**Recommended approach:** Author skills in `.agents/skills/` (tool-agnostic canonical source), then symlink only where needed:
|
|
532
|
+
|
|
533
|
+
```bash
|
|
534
|
+
# Two symlinks needed:
|
|
535
|
+
ln -s ../../.agents/skills/my-skill .claude/skills/my-skill # Claude Code + Cursor + Copilot
|
|
536
|
+
ln -s ../../.agents/skills/my-skill .github/skills/my-skill # GitHub Copilot (native path)
|
|
537
|
+
# Codex reads .agents/skills/ natively — no symlink needed
|
|
538
|
+
# Gemini reads .agents/skills/ natively — no symlink needed
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
**One canonical source, two symlinks, five tools.** (Copilot reads `.claude/skills/` cross-compat, so the `.github/skills` symlink is optional but recommended for explicitness.)
|
|
542
|
+
|
|
543
|
+
**Note (updated Feb 2026):** Codex now reads `.agents/skills/` natively at both project level (`$CWD/.agents/skills` up to `$REPO_ROOT/.agents/skills`) and user level (`$HOME/.agents/skills`). Gemini CLI also reads `.agents/skills/` natively at both workspace and user scopes. No symlinks needed for Codex or Gemini at any scope.
|
|
544
|
+
|
|
545
|
+
**Source:** https://cursor.com/docs/context/skills, https://code.visualstudio.com/docs/copilot/customization/agent-skills, https://developers.openai.com/codex/skills, https://github.com/vercel-labs/skills
|
|
546
|
+
|
|
547
|
+
### Q: How does Claude Code's skill description character budget interact with many installed skills?
|
|
548
|
+
|
|
549
|
+
**Answer:** This is a real constraint with specific numbers:
|
|
550
|
+
|
|
551
|
+
- **Budget:** ~16,000 characters (scales dynamically at 2% of context window, fallback 16,000 chars)
|
|
552
|
+
- **Per-skill overhead:** ~109 characters of XML structure + description length
|
|
553
|
+
- **At 63 skills:** One user reported only 42 of 63 skills were visible (33% hidden)
|
|
554
|
+
- **No warning by default** — skills silently disappear. Run `/context` to check for a warning about excluded skills.
|
|
555
|
+
- **Override:** Set `SLASH_COMMAND_TOOL_CHAR_BUDGET` environment variable to increase the limit.
|
|
556
|
+
|
|
557
|
+
**Practical guidelines for description length based on skill count:**
|
|
558
|
+
|
|
559
|
+
- 60+ skills: Keep descriptions ≤ 130 characters
|
|
560
|
+
- 40-60 skills: Keep descriptions ≤ 150 characters
|
|
561
|
+
- <40 skills: Standard ≤ 500 character limit is fine
|
|
562
|
+
|
|
563
|
+
**Front-load trigger keywords in the first 50 characters** since truncation may occur.
|
|
564
|
+
|
|
565
|
+
**Source:** https://github.com/anthropics/claude-code/issues/13099, https://code.claude.com/docs/en/skills
|
|
566
|
+
|
|
567
|
+
### Q: Does Cursor actually support `allowed-tools` or just not error on it?
|
|
568
|
+
|
|
569
|
+
**Answer:** Uncertain. The `npx skills` compatibility matrix marks `allowed-tools` as ✅ for Cursor, but Cursor's own documentation does not explicitly document the field. Their docs only list `name`, `description`, `license`, `compatibility`, `metadata`, and `disable-model-invocation` as supported frontmatter.
|
|
570
|
+
|
|
571
|
+
The safe assumption: Cursor likely doesn't error on `allowed-tools` (similar to Codex's "ignore unknown keys" behavior), but whether it actually restricts tool access based on the field is unconfirmed. Treat `allowed-tools` as **Claude Code-specific for enforcement** and include it as a documentation signal for other tools.
|
|
572
|
+
|
|
573
|
+
**Source:** https://cursor.com/docs/context/skills, https://github.com/vercel-labs/skills#compatibility
|
|
574
|
+
|
|
575
|
+
### Q: How should skills collect missing required arguments across Codex and Claude?
|
|
576
|
+
|
|
577
|
+
**Answer:** Treat this as a two-layer pattern: frontmatter hinting for discovery, then provider-native interaction at runtime.
|
|
578
|
+
|
|
579
|
+
- **Layer 1 (discovery UX):** Use `argument-hint` when a provider supports it (for slash/autocomplete discoverability), but do not treat it as input collection. Codex ignores unknown frontmatter keys, so `argument-hint` is non-functional there.
|
|
580
|
+
- **Layer 2 (runtime clarification):** Use the provider's native user-question mechanism when available:
|
|
581
|
+
- **Claude Agent SDK:** Handle `AskUserQuestion` in `canUseTool`. If you restrict tools with a `tools` array, include `AskUserQuestion` explicitly. Parse `questions[]` (`question`, `header`, `options`, `multiSelect`) and return `answers` mapped by question text.
|
|
582
|
+
- **Codex:** Use `request_user_input` when the runtime exposes it. As of PR #12735 (Feb 25, 2026), Codex app-server behavior was expanded so Default mode can use `request_user_input`, with guidance to prefer assumptions first and ask only when unavoidable; rollout can still be mode/config dependent in host environments.
|
|
583
|
+
- **Portable fallback:** If no native question tool is available in the active provider/mode, ask directly in plain text, wait for confirmation, then continue.
|
|
584
|
+
- **Execution transparency:** After answers are gathered, print a short resolved-options summary before running side effects (for example: chosen mode, scope, and any defaults applied).
|
|
585
|
+
|
|
586
|
+
**Practical guidance for OAT skills:** Use `argument-hint` to advertise expected args, but always implement a runtime clarification path that is provider-aware (`AskUserQuestion`/`request_user_input` when present if required arguments cannot be parsed from user skill call, direct question otherwise).
|
|
587
|
+
|
|
588
|
+
**Source:** https://github.com/openai/codex/pull/12735, https://platform.claude.com/docs/en/agent-sdk/user-input, https://www.neonwatty.com/posts/interview-skills-claude-code/
|
|
589
|
+
|
|
590
|
+
---
|
|
591
|
+
|
|
592
|
+
## Remaining Open Questions
|
|
593
|
+
|
|
594
|
+
- [ ] How does the skills/commands/subagents convergence play out? (Vivek Haldar's analysis suggests they're merging into a single primitive with `context: main|fork`)
|
|
595
|
+
- [ ] What's the right skill count ceiling for a shared library before description budget becomes a real constraint?
|
|
596
|
+
- [ ] How do managed/enterprise skill deployment mechanisms differ across providers?
|
|
597
|
+
- [ ] Will the Agent Skills spec add a formal testing/validation framework?
|
|
598
|
+
- [ ] Does Codex read `.agents/skills/` at user level (`~/.agents/skills/`) or only project level?
|
|
@@ -208,7 +208,7 @@ Successful completion means:
|
|
|
208
208
|
- At 60+ skills, descriptions may be silently truncated
|
|
209
209
|
- Keep descriptions concise; the body handles detail
|
|
210
210
|
|
|
211
|
-
**Shared references:** If
|
|
211
|
+
**Shared references:** Keep a shared doc's canonical copy in `.agents/docs/` (edit it in one place). If a distributed skill needs it at invocation time, vendor it into `references/docs/` as a symlink to the canonical file (`ln -s ../../../../docs/my-guide.md references/docs/my-guide.md`); the build materializes the symlink so the doc travels with the skill. Reference the bundled `references/docs/...` path — a bare `.agents/docs/...` reference dangles once the skill is installed in another repo.
|
|
212
212
|
|
|
213
|
-
For the full compatibility matrix and resolved research questions, see
|
|
213
|
+
For the full compatibility matrix and resolved research questions, see `references/docs/skills-guide.md`.
|
|
214
214
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-wrap-up
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.2
|
|
4
4
|
description: Use when preparing a shipping digest or weekly/biweekly wrap-up summarizing OAT projects and merged PRs over a time window. Reads local summary files and GitHub PR metadata; writes a version-controlled markdown report.
|
|
5
5
|
argument-hint: '[--since YYYY-MM-DD] [--until YYYY-MM-DD] [--past-week|--past-2-weeks|--past-month] [--output <path>] [--dry-run]'
|
|
6
6
|
disable-model-invocation: false
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Automation Recipes
|
|
2
2
|
|
|
3
|
-
The `oat-wrap-up` skill is manual and model-invocable by design. OAT itself does not ship a scheduler (
|
|
3
|
+
The `oat-wrap-up` skill is manual and model-invocable by design. OAT itself does not ship a scheduler (scheduling is intentionally out of scope for OAT). To run the skill on a recurring cadence, configure your host agent or an external cron to invoke it. Three patterns are documented below.
|
|
4
4
|
|
|
5
5
|
## Pattern 1 — Claude Code `CronCreate` trigger
|
|
6
6
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../../src/commands/local/expand.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../../src/commands/local/expand.ts"],"names":[],"mappings":"AAqHA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
|
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
import { readdir } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
const GLOB_CHARS = /[*?[]/;
|
|
4
|
+
const PRUNED_CANDIDATE_DIRECTORIES = new Set([
|
|
5
|
+
'.cache',
|
|
6
|
+
'.git',
|
|
7
|
+
'.gradle',
|
|
8
|
+
'.next',
|
|
9
|
+
'.nuxt',
|
|
10
|
+
'.output',
|
|
11
|
+
'.parcel-cache',
|
|
12
|
+
'.pnpm-store',
|
|
13
|
+
'.pytest_cache',
|
|
14
|
+
'.ruff_cache',
|
|
15
|
+
'.turbo',
|
|
16
|
+
'.venv',
|
|
17
|
+
'.vite',
|
|
18
|
+
'.worktrees',
|
|
19
|
+
'.yarn',
|
|
20
|
+
'__pycache__',
|
|
21
|
+
'build',
|
|
22
|
+
'coverage',
|
|
23
|
+
'dist',
|
|
24
|
+
'node_modules',
|
|
25
|
+
'out',
|
|
26
|
+
'target',
|
|
27
|
+
'tmp',
|
|
28
|
+
]);
|
|
4
29
|
function normalizePattern(path) {
|
|
5
30
|
return path.replaceAll('\\', '/').replace(/^\.\//, '').replace(/\/+$/, '');
|
|
6
31
|
}
|
|
@@ -40,15 +65,30 @@ function globToRegExp(pattern) {
|
|
|
40
65
|
regex += '$';
|
|
41
66
|
return new RegExp(regex);
|
|
42
67
|
}
|
|
68
|
+
function isOatStatePath(path) {
|
|
69
|
+
return path === '.oat' || path.startsWith('.oat/');
|
|
70
|
+
}
|
|
71
|
+
function shouldPruneCandidateDirectory(path, name) {
|
|
72
|
+
return !isOatStatePath(path) && PRUNED_CANDIDATE_DIRECTORIES.has(name);
|
|
73
|
+
}
|
|
43
74
|
async function collectRelativePaths(root, current = '') {
|
|
44
|
-
const dirPath = current === '' ? root : join(root, current);
|
|
45
|
-
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
46
75
|
const paths = [];
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
76
|
+
const pendingDirectories = [current];
|
|
77
|
+
while (pendingDirectories.length > 0) {
|
|
78
|
+
const directory = pendingDirectories.pop();
|
|
79
|
+
const dirPath = directory === '' ? root : join(root, directory);
|
|
80
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
81
|
+
for (const entry of entries) {
|
|
82
|
+
const relativePath = directory === '' ? entry.name : `${directory}/${entry.name}`;
|
|
83
|
+
const shouldPrune = entry.isDirectory() &&
|
|
84
|
+
shouldPruneCandidateDirectory(relativePath, entry.name);
|
|
85
|
+
if (shouldPrune) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
paths.push(relativePath);
|
|
89
|
+
if (entry.isDirectory()) {
|
|
90
|
+
pendingDirectories.push(relativePath);
|
|
91
|
+
}
|
|
52
92
|
}
|
|
53
93
|
}
|
|
54
94
|
return paths;
|
|
@@ -76,7 +116,9 @@ export async function expandLocalPaths(root, localPaths) {
|
|
|
76
116
|
missingGlobs.push(localPath);
|
|
77
117
|
}
|
|
78
118
|
else {
|
|
79
|
-
|
|
119
|
+
for (const match of matches.sort()) {
|
|
120
|
+
resolved.push(match);
|
|
121
|
+
}
|
|
80
122
|
}
|
|
81
123
|
}
|
|
82
124
|
return { resolved, missingGlobs };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-agent-toolkit/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.25",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Open Agent Toolkit CLI",
|
|
6
6
|
"homepage": "https://github.com/voxmedia/open-agent-toolkit/tree/main/packages/cli",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"ora": "^9.0.0",
|
|
35
35
|
"yaml": "2.8.2",
|
|
36
36
|
"zod": "^3.25.76",
|
|
37
|
-
"@open-agent-toolkit/control-plane": "0.1.
|
|
37
|
+
"@open-agent-toolkit/control-plane": "0.1.25"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^22.10.0",
|