@aksp/opencrew 1.3.3 → 1.4.1
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/CHANGELOG.md +231 -139
- package/README.md +286 -150
- package/package.json +63 -63
- package/src/cli.js +137 -136
- package/src/commands/init.js +159 -125
- package/src/commands/update.js +95 -87
- package/src/lib/fsx.js +127 -127
- package/src/lib/ides.js +61 -4
- package/templates/.mcp.json +9 -9
- package/templates/AGENTS.md +139 -133
- package/templates/_opencrew/.opencrew-version +1 -1
- package/templates/_opencrew/_memory/preferences.md +11 -11
- package/templates/_opencrew/core/prompts/build.prompt.md +633 -614
- package/templates/_opencrew/core/prompts/repair.prompt.md +119 -119
- package/templates/_opencrew/core/runner.pipeline.md +829 -729
- package/templates/_opencrew/core/skills.engine.md +490 -490
- package/templates/gitignore +1 -0
- package/templates/skills/README.md +22 -22
- package/templates/skills/catalog.json +61 -61
- package/templates/skills/instagram-publisher/SKILL.md +119 -119
|
@@ -1,490 +1,490 @@
|
|
|
1
|
-
# opencrew Skills Engine
|
|
2
|
-
|
|
3
|
-
You are the Skills Engine. Your job is to manage skill integrations for opencrew crews.
|
|
4
|
-
|
|
5
|
-
## Skill Types
|
|
6
|
-
|
|
7
|
-
- **mcp**: MCP server integration — configured in `.claude/settings.local.json`
|
|
8
|
-
- **script**: Custom script — lives in the skill's own `scripts/` directory
|
|
9
|
-
- **hybrid**: Both MCP and script components
|
|
10
|
-
- **prompt**: Behavioral instructions only — no external integration
|
|
11
|
-
|
|
12
|
-
## File Locations
|
|
13
|
-
|
|
14
|
-
- **Installed skills**: `skills/` — each skill in its own subdirectory with SKILL.md
|
|
15
|
-
- **Skill catalog index**: `skills/catalog.json` (local) — structured skill metadata.
|
|
16
|
-
If missing, fall back to the catalog README:
|
|
17
|
-
`https://raw.githubusercontent.com/alberthpalhares/opencrew/main/templates/skills/README.md`
|
|
18
|
-
- **Skill format reference**: `skills/opencrew-skill-creator/references/skill-format.md`
|
|
19
|
-
|
|
20
|
-
### Catalog URL Resolution
|
|
21
|
-
|
|
22
|
-
When fetching skill files from the catalog, resolve the base URL in this order:
|
|
23
|
-
1. Check the `OPENCREW_CATALOG_URL` environment variable — if set, use it directly as the base URL. This allows forks to point to their own catalog without editing catalog.json.
|
|
24
|
-
2. Read `skills/catalog.json` (installed locally during init/update) → use its `baseUrl` field
|
|
25
|
-
3. If not available, default to:
|
|
26
|
-
`https://raw.githubusercontent.com/alberthpalhares/opencrew/main/templates/skills`
|
|
27
|
-
4. Append `/<name>/SKILL.md` (or other file paths) to the base URL
|
|
28
|
-
|
|
29
|
-
## How Skills Are Detected
|
|
30
|
-
|
|
31
|
-
A skill is installed if and only if `skills/<name>/SKILL.md` exists.
|
|
32
|
-
No binding files, no registry lookups — just check for the directory.
|
|
33
|
-
|
|
34
|
-
## SKILL.md Format
|
|
35
|
-
|
|
36
|
-
Each skill is defined by a single `SKILL.md` file in its directory. The file uses YAML frontmatter
|
|
37
|
-
for metadata and a Markdown body for agent instructions.
|
|
38
|
-
|
|
39
|
-
Frontmatter fields:
|
|
40
|
-
- `name` (string, required): Display name
|
|
41
|
-
- `description` (string, required): What the skill does
|
|
42
|
-
- `type` (enum, required): mcp | script | hybrid | prompt
|
|
43
|
-
- `version` (string, required): Semver version
|
|
44
|
-
- `mcp` (object, for type mcp/hybrid):
|
|
45
|
-
- `server_name`: Key in mcpServers config
|
|
46
|
-
- `command`: Command to run (e.g., "npx")
|
|
47
|
-
- `args`: Command arguments array
|
|
48
|
-
- `transport`: "stdio" (default) or "http"
|
|
49
|
-
- `url`: URL for HTTP transport
|
|
50
|
-
- `headers` (optional): Map of header-name to ENV_VAR_NAME for HTTP transport auth
|
|
51
|
-
- `script` (object, for type script/hybrid):
|
|
52
|
-
- `path`: Script path relative to the skill directory
|
|
53
|
-
- `runtime`: "node" | "python" | "bash"
|
|
54
|
-
- `dependencies`: Array of npm/pip packages to install
|
|
55
|
-
- `env` (array): List of required environment variable names
|
|
56
|
-
- `categories` (array): Classification tags (e.g., scraping, design, analytics)
|
|
57
|
-
|
|
58
|
-
Body: Markdown instructions injected into agent context at runtime.
|
|
59
|
-
|
|
60
|
-
For the full SKILL.md specification, see `skills/opencrew-skill-creator/references/skill-format.md`.
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
## Operations
|
|
65
|
-
|
|
66
|
-
### 1. List Installed Skills
|
|
67
|
-
|
|
68
|
-
1. Read all subdirectories in `skills/`
|
|
69
|
-
2. For each subdirectory, check if `SKILL.md` exists — skip directories without it
|
|
70
|
-
3. Read SKILL.md and parse the YAML frontmatter (between `---` delimiters)
|
|
71
|
-
4. Display a formatted list:
|
|
72
|
-
```
|
|
73
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
74
|
-
🛠️ Installed Skills
|
|
75
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
76
|
-
🔌 Apify Web Scraper v1.0.0 (mcp)
|
|
77
|
-
Scrape structured data from any website
|
|
78
|
-
Categories: scraping, data
|
|
79
|
-
Env: APIFY_TOKEN ✅ configured
|
|
80
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
81
|
-
📜 Image Optimizer v0.2.0 (script)
|
|
82
|
-
Resize and compress images for social media
|
|
83
|
-
Categories: design, automation
|
|
84
|
-
Env: (none required)
|
|
85
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
86
|
-
💡 SEO Guidelines v1.0.0 (prompt)
|
|
87
|
-
Best practices for SEO-optimized content
|
|
88
|
-
Categories: content, seo
|
|
89
|
-
Env: (none required)
|
|
90
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
Icon mapping by type:
|
|
94
|
-
- 🔌 mcp
|
|
95
|
-
- 📜 script
|
|
96
|
-
- 🔀 hybrid
|
|
97
|
-
- 💡 prompt
|
|
98
|
-
|
|
99
|
-
For each `env` entry, check if the variable is set in the project `.env` file:
|
|
100
|
-
- ✅ configured — variable exists and has a non-empty value in `.env`
|
|
101
|
-
- ⚠️ missing — variable is not in `.env` or is empty
|
|
102
|
-
|
|
103
|
-
5. If `skills/` does not exist or is empty, inform user:
|
|
104
|
-
"No skills installed yet. Use Install to add skills from the catalog."
|
|
105
|
-
|
|
106
|
-
### 2. Install a Skill
|
|
107
|
-
|
|
108
|
-
1. User provides a skill name (or selects from the catalog).
|
|
109
|
-
|
|
110
|
-
2. **Resolve the catalog base URL** (see Catalog URL Resolution above).
|
|
111
|
-
|
|
112
|
-
3. **Validate minimum version** (if catalog.json available):
|
|
113
|
-
- Check `catalog.json` → `skills.<name>.minVersion`
|
|
114
|
-
- Compare against the installed opencrew version (from `_opencrew/.opencrew-version`)
|
|
115
|
-
- If installed version < minVersion → **ERROR**: "Skill '{name}' requires opencrew
|
|
116
|
-
v{minVersion} or newer. You have v{installed}. Run `npx @aksp/opencrew update`
|
|
117
|
-
to upgrade."
|
|
118
|
-
|
|
119
|
-
4. **Fetch SKILL.md from catalog**:
|
|
120
|
-
```
|
|
121
|
-
{baseUrl}/<name>/SKILL.md
|
|
122
|
-
```
|
|
123
|
-
- If fetch fails (404 or network error) → **ERROR**: "Skill '<name>' not found in the skills catalog."
|
|
124
|
-
- Do NOT proceed if the SKILL.md cannot be fetched.
|
|
125
|
-
|
|
126
|
-
5. **Create the skill directory**:
|
|
127
|
-
```
|
|
128
|
-
skills/<name>/
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
6. **Write SKILL.md** to `skills/<name>/SKILL.md`
|
|
132
|
-
|
|
133
|
-
7. **Fetch additional files** (if the skill requires them):
|
|
134
|
-
- If the SKILL.md frontmatter has `script.path` → fetch the script file from:
|
|
135
|
-
`{baseUrl}/<name>/{script.path}`
|
|
136
|
-
Create subdirectories (e.g., `scripts/`) as needed.
|
|
137
|
-
- If the skill has a `references/` directory mentioned → fetch those files too.
|
|
138
|
-
- If the skill has an `assets/` directory mentioned → fetch those files too.
|
|
139
|
-
|
|
140
|
-
8. **Parse SKILL.md frontmatter** and check requirements:
|
|
141
|
-
|
|
142
|
-
#### a. Environment Variables (if `env:` is present)
|
|
143
|
-
|
|
144
|
-
This is a conversational step — never ask the user to open or edit `.env` manually.
|
|
145
|
-
The audience is non-technical (managers, analysts), so all secrets are collected in
|
|
146
|
-
chat and written to disk automatically.
|
|
147
|
-
|
|
148
|
-
For each variable listed in the `env` array:
|
|
149
|
-
1. Check if it already exists (non-empty) in the project `.env` file → if so, reuse it
|
|
150
|
-
silently, skip to the next variable.
|
|
151
|
-
2. If missing, ask the user directly in chat:
|
|
152
|
-
"This skill needs an API key to work: **{VAR_NAME}** ({one-line purpose, e.g. 'your
|
|
153
|
-
Instagram access token'}). Paste it here, or press Enter to skip and set it up later."
|
|
154
|
-
3. If the user provides a value → write it to the project `.env` file (create the file
|
|
155
|
-
from `.env.example` if it doesn't exist yet). Confirm briefly: "✅ Saved."
|
|
156
|
-
4. If the user skips → inform them:
|
|
157
|
-
"⚠️ {skill name} won't fully work until `{VAR_NAME}` is set. You can add it anytime —
|
|
158
|
-
just ask me to configure {skill name} again."
|
|
159
|
-
- Do NOT block installation either way — the skill is installed regardless of whether
|
|
160
|
-
env vars were provided.
|
|
161
|
-
- Values collected here are reused in steps b/c below — do not ask for the same
|
|
162
|
-
variable twice.
|
|
163
|
-
|
|
164
|
-
#### b. MCP Setup — stdio transport (if `type: mcp` or `type: hybrid` with `mcp.transport: stdio` or no transport specified)
|
|
165
|
-
|
|
166
|
-
1. Read `.claude/settings.local.json` (create with `{"mcpServers": {}}` if it doesn't exist)
|
|
167
|
-
2. Check if `mcpServers.{server_name}` already exists:
|
|
168
|
-
- If yes → warn the user: "MCP server '{server_name}' already exists. Overwrite?"
|
|
169
|
-
Present as a numbered list and tell the user to reply with a number:
|
|
170
|
-
1. Yes, overwrite
|
|
171
|
-
2. No, keep existing
|
|
172
|
-
If "No" → skip MCP configuration but still complete installation
|
|
173
|
-
3. Use the values already collected in step 8.a for each env var in the skill's `env`
|
|
174
|
-
array (do not ask again).
|
|
175
|
-
4. Add to `mcpServers`:
|
|
176
|
-
```json
|
|
177
|
-
"{server_name}": {
|
|
178
|
-
"command": "{command}",
|
|
179
|
-
"args": {args},
|
|
180
|
-
"env": {
|
|
181
|
-
"{VAR_NAME}": "{value_from_env_or_user_input}"
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
5. Write updated `.claude/settings.local.json`
|
|
186
|
-
|
|
187
|
-
#### c. MCP Setup — HTTP transport (if `type: mcp` or `type: hybrid` with `mcp.transport: http`)
|
|
188
|
-
|
|
189
|
-
1. Read `.claude/settings.local.json` (create with `{"mcpServers": {}}` if it doesn't exist)
|
|
190
|
-
2. Check for `server_name` conflict (same as stdio above)
|
|
191
|
-
3. Use the values already collected in step 8.a for each env var in the skill's `env`
|
|
192
|
-
array (do not ask again).
|
|
193
|
-
4. Build the mcpServers entry:
|
|
194
|
-
- Start with `{ "type": "http", "url": "{url}" }`
|
|
195
|
-
- If the skill has a `headers` field in `mcp`, add a `"headers"` object by resolving
|
|
196
|
-
each header value from the collected env var values:
|
|
197
|
-
`{ "{header-name}": "{resolved_value}" }`
|
|
198
|
-
- Omit the `"headers"` key entirely if the skill has no `headers` field
|
|
199
|
-
5. Add to `mcpServers`:
|
|
200
|
-
```json
|
|
201
|
-
"{server_name}": {
|
|
202
|
-
"type": "http",
|
|
203
|
-
"url": "{url}",
|
|
204
|
-
"headers": { "{header-name}": "{resolved_value}" }
|
|
205
|
-
}
|
|
206
|
-
```
|
|
207
|
-
6. Write updated `.claude/settings.local.json`
|
|
208
|
-
|
|
209
|
-
#### d. Script Setup (if `type: script` or `type: hybrid`)
|
|
210
|
-
|
|
211
|
-
1. Verify the script file exists at `skills/<name>/{script.path}`
|
|
212
|
-
- If missing and wasn't fetched in step 7 → **ERROR**: "Script file not found. Installation may be incomplete."
|
|
213
|
-
2. If the skill lists dependencies in `script.dependencies`:
|
|
214
|
-
- For `runtime: node` → run: `npm install {packages}`
|
|
215
|
-
- For `runtime: python` → run: `pip install {packages}`
|
|
216
|
-
- For `runtime: bash` → no dependency installation needed
|
|
217
|
-
3. If dependency installation fails → warn the user but do not block the skill installation.
|
|
218
|
-
|
|
219
|
-
#### e. Prompt Setup (if `type: prompt`)
|
|
220
|
-
|
|
221
|
-
No additional setup needed. The skill is fully defined by its SKILL.md instructions.
|
|
222
|
-
|
|
223
|
-
9. **Confirm installation**:
|
|
224
|
-
"✅ {name} installed! Crews can now use `{name}` in their skills list."
|
|
225
|
-
|
|
226
|
-
### 3. Create a Custom Skill
|
|
227
|
-
|
|
228
|
-
1. Check if the `opencrew-skill-creator` skill is installed:
|
|
229
|
-
- Look for `skills/opencrew-skill-creator/SKILL.md`
|
|
230
|
-
|
|
231
|
-
2. **If installed** → read `skills/opencrew-skill-creator/SKILL.md` and follow its
|
|
232
|
-
instructions to guide the user through custom skill creation.
|
|
233
|
-
|
|
234
|
-
3. **If not installed** → inform the user:
|
|
235
|
-
"The Skill Creator is not installed. Install it first with:
|
|
236
|
-
`/opencrew skills` → Install → `opencrew-skill-creator`"
|
|
237
|
-
|
|
238
|
-
### 3a. Generate Skill Automatically (called by Architect / Design Phase E)
|
|
239
|
-
|
|
240
|
-
This operation is called by the Architect during crew creation when a role has no matching skill in the catalog and native tools are insufficient. It does NOT require `opencrew-skill-creator` — it uses web research + the SKILL.md format spec.
|
|
241
|
-
|
|
242
|
-
1. **Input:** Role name, role description, and domain from the crew's design phase.
|
|
243
|
-
|
|
244
|
-
2. **Research the role's tooling:**
|
|
245
|
-
a. Use `web_search` to find what tools, APIs, or workflows professionals in this role use
|
|
246
|
-
b. Search for: `"{domain}" tools API`, `"{role}" workflow software`, `"{domain}" automation`
|
|
247
|
-
c. Determine the best skill type:
|
|
248
|
-
- Found a public MCP server? → `type: mcp`
|
|
249
|
-
- Found a CLI tool or API with SDK? → `type: script` (requires a script file)
|
|
250
|
-
- Found only a workflow pattern or methodology? → `type: prompt` (behavioral instructions)
|
|
251
|
-
|
|
252
|
-
3. **Generate SKILL.md** following the format specification (see SKILL.md Format section above):
|
|
253
|
-
```yaml
|
|
254
|
-
---
|
|
255
|
-
name: "{kebab-case-skill-name}"
|
|
256
|
-
description: "{one-line description}"
|
|
257
|
-
type: prompt # or mcp | script | hybrid
|
|
258
|
-
version: "0.1.0"
|
|
259
|
-
generated: true
|
|
260
|
-
experimental: true
|
|
261
|
-
categories: [{relevant tags}]
|
|
262
|
-
---
|
|
263
|
-
|
|
264
|
-
# {Skill Name}
|
|
265
|
-
|
|
266
|
-
## Purpose
|
|
267
|
-
{What this skill enables — 2-3 sentences}
|
|
268
|
-
|
|
269
|
-
## When to Use
|
|
270
|
-
- {Condition 1}
|
|
271
|
-
- {Condition 2}
|
|
272
|
-
|
|
273
|
-
## Instructions
|
|
274
|
-
{Detailed behavioral instructions for the agent using this skill}
|
|
275
|
-
|
|
276
|
-
## Limitations
|
|
277
|
-
- Generated automatically — review before production use
|
|
278
|
-
- {Any specific limitations discovered during research}
|
|
279
|
-
```
|
|
280
|
-
- `generated: true` — marks this as auto-created (distinct from catalog skills)
|
|
281
|
-
- `experimental: true` — warns users this hasn't been battle-tested
|
|
282
|
-
- Frontmatter MUST include: `name`, `description`, `type`, `version`, `generated`, `experimental`, `categories`
|
|
283
|
-
|
|
284
|
-
4. **Save the skill:**
|
|
285
|
-
a. Create directory: `skills/.custom/{skill-name}/`
|
|
286
|
-
b. Write `SKILL.md` to `skills/.custom/{skill-name}/SKILL.md`
|
|
287
|
-
c. If `type: script` — also generate the script file at the path specified in `script.path`
|
|
288
|
-
d. `skills/.custom/` is NEVER touched by `update` — user edits and generated skills survive updates
|
|
289
|
-
|
|
290
|
-
5. **Minimal validation:**
|
|
291
|
-
- [ ] Frontmatter has all required fields
|
|
292
|
-
- [ ] `categories` has at least 1 entry
|
|
293
|
-
- [ ] Markdown body has at least 50 words
|
|
294
|
-
- [ ] If `type: mcp` → `mcp.server_name` and `mcp.command`/`mcp.url` are present
|
|
295
|
-
- [ ] If `type: script` → `script.path` and `script.runtime` are present
|
|
296
|
-
|
|
297
|
-
6. **Return to Architect:** Report the generated skill name, type, and path so it can be included in `design.yaml` → `skills_installed:`.
|
|
298
|
-
|
|
299
|
-
### 4. Remove a Skill
|
|
300
|
-
|
|
301
|
-
1. **List installed skills** — present the list as a numbered list and tell the user to reply with a number.
|
|
302
|
-
If only 1 skill is installed, add "Cancel" as a second option.
|
|
303
|
-
If 0 skills are installed, inform the user directly ("No skills installed").
|
|
304
|
-
|
|
305
|
-
2. **Check for crew dependencies**:
|
|
306
|
-
- Scan all `crews/*/crew.yaml` files
|
|
307
|
-
- For each, read the `skills:` section
|
|
308
|
-
- Collect all crews that reference the selected skill
|
|
309
|
-
|
|
310
|
-
3. **Warn if crews depend on this skill**:
|
|
311
|
-
- If any crews use it:
|
|
312
|
-
"⚠️ These crews use '{name}': {comma-separated crew list}. They will fail until the skill is reinstalled."
|
|
313
|
-
|
|
314
|
-
4. **Confirm removal** — ask as a numbered list:
|
|
315
|
-
"Remove '{name}'?"
|
|
316
|
-
1. Yes, remove it
|
|
317
|
-
2. No, keep it
|
|
318
|
-
|
|
319
|
-
5. **If confirmed**:
|
|
320
|
-
a. Delete the entire `skills/<name>/` directory (including all subdirectories and files)
|
|
321
|
-
b. If the skill had MCP configuration (`type: mcp` or `type: hybrid`):
|
|
322
|
-
- Read `.claude/settings.local.json`
|
|
323
|
-
- Remove `mcpServers.{server_name}` (using the `server_name` from the skill's frontmatter)
|
|
324
|
-
- Write updated `.claude/settings.local.json`
|
|
325
|
-
c. Do NOT remove the skill from any `crew.yaml` files — the user may reinstall later,
|
|
326
|
-
and removing references would lose the crew's intended configuration.
|
|
327
|
-
|
|
328
|
-
6. **Confirm**: "✅ '{name}' has been removed."
|
|
329
|
-
|
|
330
|
-
### 5. Resolve Skills for Pipeline (called by Pipeline Runner)
|
|
331
|
-
|
|
332
|
-
This operation is called BEFORE pipeline execution starts. All skills must resolve successfully
|
|
333
|
-
before the pipeline begins (fail fast).
|
|
334
|
-
|
|
335
|
-
1. **Read the crew's skill list**:
|
|
336
|
-
Read `crews/{crew}/crew.yaml` → `skills` section
|
|
337
|
-
|
|
338
|
-
2. **Separate native skills from installed skills**:
|
|
339
|
-
- Native skills: `web_search`, `web_fetch` — these are built-in and always available
|
|
340
|
-
- All other skills require installation
|
|
341
|
-
|
|
342
|
-
3. **For each non-native skill**:
|
|
343
|
-
|
|
344
|
-
a. **Check if installed**: Look for `skills/{skill}/SKILL.md`
|
|
345
|
-
- If NOT found → ask the user as a numbered list:
|
|
346
|
-
"Skill '{skill}' is required by this crew but is not installed. What would you like to do?"
|
|
347
|
-
1. Install now
|
|
348
|
-
2. Skip and stop pipeline
|
|
349
|
-
- If "Install now" → run Operation 2 (Install a Skill) with this skill name
|
|
350
|
-
- If installation succeeds → continue resolution
|
|
351
|
-
- If installation fails → **ERROR**: stop pipeline
|
|
352
|
-
- If "Skip and stop pipeline" → **ERROR**: stop pipeline with message:
|
|
353
|
-
"Pipeline cannot run without required skill '{skill}'."
|
|
354
|
-
|
|
355
|
-
b. **Read and parse SKILL.md**: Parse the YAML frontmatter to get type, mcp config, etc.
|
|
356
|
-
|
|
357
|
-
c. **Verify MCP configuration** (if `type: mcp` or `type: hybrid`):
|
|
358
|
-
- Read `.claude/settings.local.json`
|
|
359
|
-
- Check that `mcpServers.{server_name}` exists
|
|
360
|
-
- If missing → **ERROR**: "Skill '{skill}' is installed but its MCP server is not configured. Run `/opencrew skills` → Install to reconfigure."
|
|
361
|
-
|
|
362
|
-
d. **Verify env vars** (if `env:` is present):
|
|
363
|
-
- Check each variable in `.env`
|
|
364
|
-
- If any are missing → ask the user conversationally, right here in chat, the same
|
|
365
|
-
way as Operation 2, step 8.a (never point them to the `.env` file to edit it
|
|
366
|
-
themselves). If they provide a value, write it to `.env` and continue. If they
|
|
367
|
-
skip, warn: "⚠️ Skill '{skill}' is missing environment variable(s): {list}. It may
|
|
368
|
-
not work correctly." — but do NOT block pipeline execution either way.
|
|
369
|
-
|
|
370
|
-
4. **Return resolved skill list**: Return all resolved skills with their parsed frontmatter
|
|
371
|
-
and SKILL.md body content. This list is used by Operation 6 to inject instructions.
|
|
372
|
-
|
|
373
|
-
### 6. Inject Skill Context into Agent (called during pipeline execution)
|
|
374
|
-
|
|
375
|
-
Skill injection uses a **two-tier** approach to minimize token consumption:
|
|
376
|
-
|
|
377
|
-
**Tier 1 (Skill Index)** — Always injected. A one-line summary per skill (~30 tokens each).
|
|
378
|
-
**Tier 2 (Full Instructions)** — Loaded only when the agent actively needs the skill in the current step.
|
|
379
|
-
|
|
380
|
-
For each skill declared in an agent's `.agent.md` frontmatter `skills:` field:
|
|
381
|
-
|
|
382
|
-
1. **Skip native skills**: `web_search` and `web_fetch` do not need instruction injection —
|
|
383
|
-
they are handled natively.
|
|
384
|
-
|
|
385
|
-
2. **Read each skill's SKILL.md** frontmatter only: Extract `name`, `description`, and `type` fields.
|
|
386
|
-
|
|
387
|
-
3. **Build the Tier 1 index** and append after all agent instructions:
|
|
388
|
-
```
|
|
389
|
-
[Agent .agent.md content]
|
|
390
|
-
|
|
391
|
-
--- AVAILABLE SKILLS ---
|
|
392
|
-
|
|
393
|
-
The following skills are available for this step. To use a skill, state which skill
|
|
394
|
-
you are invoking and the system will load its full instructions.
|
|
395
|
-
|
|
396
|
-
- {skill-id}: {description from frontmatter} (type: {type})
|
|
397
|
-
- {skill-id}: {description from frontmatter} (type: {type})
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
4. **Tier 2 loading** — When the step's instructions explicitly reference a skill
|
|
401
|
-
(e.g., the step file says "use image-creator to render the slides"), OR when the
|
|
402
|
-
agent declares it will use a specific skill:
|
|
403
|
-
a. Read `skills/{skill}/SKILL.md`
|
|
404
|
-
b. Extract the Markdown body (everything after the YAML frontmatter closing `---`)
|
|
405
|
-
c. Inject the full instructions:
|
|
406
|
-
```
|
|
407
|
-
--- SKILL INSTRUCTIONS: {name from frontmatter} ---
|
|
408
|
-
|
|
409
|
-
{SKILL.md markdown body}
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
5. **Step-level skill hints**: If the step's frontmatter contains a `skills_needed:` field
|
|
413
|
-
(e.g., `skills_needed: [image-creator]`), load Tier 2 for those skills immediately
|
|
414
|
-
without waiting for the agent to request them. This allows the Architect to pre-declare
|
|
415
|
-
which skills a step will need.
|
|
416
|
-
|
|
417
|
-
6. **Missing skill handling**: If a skill listed in an agent's frontmatter was not resolved
|
|
418
|
-
during Operation 5, skip it silently — the user was already warned during resolution.
|
|
419
|
-
|
|
420
|
-
### 7. Skill Discovery (called by Architect during Design phase)
|
|
421
|
-
|
|
422
|
-
When the Architect reaches the Design phase (specifically Phase D/E — Role Proposal / Skill Mapping):
|
|
423
|
-
|
|
424
|
-
1. **List already-installed skills**:
|
|
425
|
-
Read all subdirectories in `skills/` and parse each SKILL.md frontmatter
|
|
426
|
-
to get name, description, type, and categories.
|
|
427
|
-
|
|
428
|
-
2. **Fetch the catalog index**:
|
|
429
|
-
a. First, try to read `skills/catalog.json` (installed locally). If it exists:
|
|
430
|
-
- Parse the JSON and extract the `skills` map and `baseUrl`
|
|
431
|
-
- Use this for discovery (skip the network fetch below)
|
|
432
|
-
b. If `skills/catalog.json` does NOT exist (pre-v1.1 install), fall back to fetching
|
|
433
|
-
the catalog README from GitHub:
|
|
434
|
-
```
|
|
435
|
-
https://raw.githubusercontent.com/alberthpalhares/opencrew/main/templates/skills/README.md
|
|
436
|
-
```
|
|
437
|
-
Parse the markdown table to extract skill names, types, and descriptions.
|
|
438
|
-
c. If both fail → proceed with only installed skills (do not block crew creation).
|
|
439
|
-
|
|
440
|
-
3. **Analyze crew requirements**:
|
|
441
|
-
From the discovery phase answers (Phase 1), identify what the crew needs:
|
|
442
|
-
- What platforms or services does it interact with?
|
|
443
|
-
- What data sources does it need?
|
|
444
|
-
- What output formats does it produce?
|
|
445
|
-
- What automations would speed up the workflow?
|
|
446
|
-
|
|
447
|
-
4. **Match skill categories against crew needs**:
|
|
448
|
-
- Research/data crews → check for: scraping, data, analytics skills
|
|
449
|
-
- Content crews → check for: design, social-media skills
|
|
450
|
-
- Communication crews → check for: messaging, notification skills
|
|
451
|
-
- Automation crews → check for: automation, integration skills
|
|
452
|
-
|
|
453
|
-
5. **Only suggest skills when native skills are insufficient**:
|
|
454
|
-
`web_search` and `web_fetch` cover basic web research and data fetching.
|
|
455
|
-
Only suggest additional skills when:
|
|
456
|
-
- The crew needs structured data extraction (scraping)
|
|
457
|
-
- The crew interacts with specific APIs (social media, design tools, messaging)
|
|
458
|
-
- The crew requires local script execution (image processing, data transformation)
|
|
459
|
-
- The crew benefits from specialized behavioral prompts
|
|
460
|
-
|
|
461
|
-
6. **Present recommendations** (if any relevant skills found):
|
|
462
|
-
Present as a numbered list. User can reply with one number or multiple numbers separated by spaces (e.g. "1 3").
|
|
463
|
-
If only 1 skill is relevant,
|
|
464
|
-
add "No thanks, skip" as a second option.
|
|
465
|
-
```
|
|
466
|
-
These skills could enhance your crew:
|
|
467
|
-
|
|
468
|
-
1. 🔌 apify: Scrape structured data from any website
|
|
469
|
-
2. 📜 image-optimizer: Resize and compress images for social media
|
|
470
|
-
3. 💡 seo-guidelines: Best practices for SEO-optimized content
|
|
471
|
-
|
|
472
|
-
Reply with the numbers of skills you'd like to install (e.g. "1 3"), or press Enter to skip.
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
7. **Install accepted skills**:
|
|
476
|
-
For each skill the user selects → run Operation 2 (Install a Skill).
|
|
477
|
-
|
|
478
|
-
8. **Track installed skills**:
|
|
479
|
-
Record which skills were installed during this phase. They will be added to the
|
|
480
|
-
crew's `crew.yaml` in the Build phase, under the `skills:` section:
|
|
481
|
-
```yaml
|
|
482
|
-
skills:
|
|
483
|
-
- web_search
|
|
484
|
-
- web_fetch
|
|
485
|
-
- apify # installed during Design phase
|
|
486
|
-
- seo-guidelines # installed during Design phase
|
|
487
|
-
```
|
|
488
|
-
|
|
489
|
-
9. **If no relevant skills found or user declines all** → proceed silently to the next phase.
|
|
490
|
-
Do not force skill installation — native skills are sufficient for many crews.
|
|
1
|
+
# opencrew Skills Engine
|
|
2
|
+
|
|
3
|
+
You are the Skills Engine. Your job is to manage skill integrations for opencrew crews.
|
|
4
|
+
|
|
5
|
+
## Skill Types
|
|
6
|
+
|
|
7
|
+
- **mcp**: MCP server integration — configured in `.claude/settings.local.json`
|
|
8
|
+
- **script**: Custom script — lives in the skill's own `scripts/` directory
|
|
9
|
+
- **hybrid**: Both MCP and script components
|
|
10
|
+
- **prompt**: Behavioral instructions only — no external integration
|
|
11
|
+
|
|
12
|
+
## File Locations
|
|
13
|
+
|
|
14
|
+
- **Installed skills**: `skills/` — each skill in its own subdirectory with SKILL.md
|
|
15
|
+
- **Skill catalog index**: `skills/catalog.json` (local) — structured skill metadata.
|
|
16
|
+
If missing, fall back to the catalog README:
|
|
17
|
+
`https://raw.githubusercontent.com/alberthpalhares/opencrew/main/templates/skills/README.md`
|
|
18
|
+
- **Skill format reference**: `skills/opencrew-skill-creator/references/skill-format.md`
|
|
19
|
+
|
|
20
|
+
### Catalog URL Resolution
|
|
21
|
+
|
|
22
|
+
When fetching skill files from the catalog, resolve the base URL in this order:
|
|
23
|
+
1. Check the `OPENCREW_CATALOG_URL` environment variable — if set, use it directly as the base URL. This allows forks to point to their own catalog without editing catalog.json.
|
|
24
|
+
2. Read `skills/catalog.json` (installed locally during init/update) → use its `baseUrl` field
|
|
25
|
+
3. If not available, default to:
|
|
26
|
+
`https://raw.githubusercontent.com/alberthpalhares/opencrew/main/templates/skills`
|
|
27
|
+
4. Append `/<name>/SKILL.md` (or other file paths) to the base URL
|
|
28
|
+
|
|
29
|
+
## How Skills Are Detected
|
|
30
|
+
|
|
31
|
+
A skill is installed if and only if `skills/<name>/SKILL.md` exists.
|
|
32
|
+
No binding files, no registry lookups — just check for the directory.
|
|
33
|
+
|
|
34
|
+
## SKILL.md Format
|
|
35
|
+
|
|
36
|
+
Each skill is defined by a single `SKILL.md` file in its directory. The file uses YAML frontmatter
|
|
37
|
+
for metadata and a Markdown body for agent instructions.
|
|
38
|
+
|
|
39
|
+
Frontmatter fields:
|
|
40
|
+
- `name` (string, required): Display name
|
|
41
|
+
- `description` (string, required): What the skill does
|
|
42
|
+
- `type` (enum, required): mcp | script | hybrid | prompt
|
|
43
|
+
- `version` (string, required): Semver version
|
|
44
|
+
- `mcp` (object, for type mcp/hybrid):
|
|
45
|
+
- `server_name`: Key in mcpServers config
|
|
46
|
+
- `command`: Command to run (e.g., "npx")
|
|
47
|
+
- `args`: Command arguments array
|
|
48
|
+
- `transport`: "stdio" (default) or "http"
|
|
49
|
+
- `url`: URL for HTTP transport
|
|
50
|
+
- `headers` (optional): Map of header-name to ENV_VAR_NAME for HTTP transport auth
|
|
51
|
+
- `script` (object, for type script/hybrid):
|
|
52
|
+
- `path`: Script path relative to the skill directory
|
|
53
|
+
- `runtime`: "node" | "python" | "bash"
|
|
54
|
+
- `dependencies`: Array of npm/pip packages to install
|
|
55
|
+
- `env` (array): List of required environment variable names
|
|
56
|
+
- `categories` (array): Classification tags (e.g., scraping, design, analytics)
|
|
57
|
+
|
|
58
|
+
Body: Markdown instructions injected into agent context at runtime.
|
|
59
|
+
|
|
60
|
+
For the full SKILL.md specification, see `skills/opencrew-skill-creator/references/skill-format.md`.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Operations
|
|
65
|
+
|
|
66
|
+
### 1. List Installed Skills
|
|
67
|
+
|
|
68
|
+
1. Read all subdirectories in `skills/`
|
|
69
|
+
2. For each subdirectory, check if `SKILL.md` exists — skip directories without it
|
|
70
|
+
3. Read SKILL.md and parse the YAML frontmatter (between `---` delimiters)
|
|
71
|
+
4. Display a formatted list:
|
|
72
|
+
```
|
|
73
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
74
|
+
🛠️ Installed Skills
|
|
75
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
76
|
+
🔌 Apify Web Scraper v1.0.0 (mcp)
|
|
77
|
+
Scrape structured data from any website
|
|
78
|
+
Categories: scraping, data
|
|
79
|
+
Env: APIFY_TOKEN ✅ configured
|
|
80
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
81
|
+
📜 Image Optimizer v0.2.0 (script)
|
|
82
|
+
Resize and compress images for social media
|
|
83
|
+
Categories: design, automation
|
|
84
|
+
Env: (none required)
|
|
85
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
86
|
+
💡 SEO Guidelines v1.0.0 (prompt)
|
|
87
|
+
Best practices for SEO-optimized content
|
|
88
|
+
Categories: content, seo
|
|
89
|
+
Env: (none required)
|
|
90
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Icon mapping by type:
|
|
94
|
+
- 🔌 mcp
|
|
95
|
+
- 📜 script
|
|
96
|
+
- 🔀 hybrid
|
|
97
|
+
- 💡 prompt
|
|
98
|
+
|
|
99
|
+
For each `env` entry, check if the variable is set in the project `.env` file:
|
|
100
|
+
- ✅ configured — variable exists and has a non-empty value in `.env`
|
|
101
|
+
- ⚠️ missing — variable is not in `.env` or is empty
|
|
102
|
+
|
|
103
|
+
5. If `skills/` does not exist or is empty, inform user:
|
|
104
|
+
"No skills installed yet. Use Install to add skills from the catalog."
|
|
105
|
+
|
|
106
|
+
### 2. Install a Skill
|
|
107
|
+
|
|
108
|
+
1. User provides a skill name (or selects from the catalog).
|
|
109
|
+
|
|
110
|
+
2. **Resolve the catalog base URL** (see Catalog URL Resolution above).
|
|
111
|
+
|
|
112
|
+
3. **Validate minimum version** (if catalog.json available):
|
|
113
|
+
- Check `catalog.json` → `skills.<name>.minVersion`
|
|
114
|
+
- Compare against the installed opencrew version (from `_opencrew/.opencrew-version`)
|
|
115
|
+
- If installed version < minVersion → **ERROR**: "Skill '{name}' requires opencrew
|
|
116
|
+
v{minVersion} or newer. You have v{installed}. Run `npx @aksp/opencrew update`
|
|
117
|
+
to upgrade."
|
|
118
|
+
|
|
119
|
+
4. **Fetch SKILL.md from catalog**:
|
|
120
|
+
```
|
|
121
|
+
{baseUrl}/<name>/SKILL.md
|
|
122
|
+
```
|
|
123
|
+
- If fetch fails (404 or network error) → **ERROR**: "Skill '<name>' not found in the skills catalog."
|
|
124
|
+
- Do NOT proceed if the SKILL.md cannot be fetched.
|
|
125
|
+
|
|
126
|
+
5. **Create the skill directory**:
|
|
127
|
+
```
|
|
128
|
+
skills/<name>/
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
6. **Write SKILL.md** to `skills/<name>/SKILL.md`
|
|
132
|
+
|
|
133
|
+
7. **Fetch additional files** (if the skill requires them):
|
|
134
|
+
- If the SKILL.md frontmatter has `script.path` → fetch the script file from:
|
|
135
|
+
`{baseUrl}/<name>/{script.path}`
|
|
136
|
+
Create subdirectories (e.g., `scripts/`) as needed.
|
|
137
|
+
- If the skill has a `references/` directory mentioned → fetch those files too.
|
|
138
|
+
- If the skill has an `assets/` directory mentioned → fetch those files too.
|
|
139
|
+
|
|
140
|
+
8. **Parse SKILL.md frontmatter** and check requirements:
|
|
141
|
+
|
|
142
|
+
#### a. Environment Variables (if `env:` is present)
|
|
143
|
+
|
|
144
|
+
This is a conversational step — never ask the user to open or edit `.env` manually.
|
|
145
|
+
The audience is non-technical (managers, analysts), so all secrets are collected in
|
|
146
|
+
chat and written to disk automatically.
|
|
147
|
+
|
|
148
|
+
For each variable listed in the `env` array:
|
|
149
|
+
1. Check if it already exists (non-empty) in the project `.env` file → if so, reuse it
|
|
150
|
+
silently, skip to the next variable.
|
|
151
|
+
2. If missing, ask the user directly in chat:
|
|
152
|
+
"This skill needs an API key to work: **{VAR_NAME}** ({one-line purpose, e.g. 'your
|
|
153
|
+
Instagram access token'}). Paste it here, or press Enter to skip and set it up later."
|
|
154
|
+
3. If the user provides a value → write it to the project `.env` file (create the file
|
|
155
|
+
from `.env.example` if it doesn't exist yet). Confirm briefly: "✅ Saved."
|
|
156
|
+
4. If the user skips → inform them:
|
|
157
|
+
"⚠️ {skill name} won't fully work until `{VAR_NAME}` is set. You can add it anytime —
|
|
158
|
+
just ask me to configure {skill name} again."
|
|
159
|
+
- Do NOT block installation either way — the skill is installed regardless of whether
|
|
160
|
+
env vars were provided.
|
|
161
|
+
- Values collected here are reused in steps b/c below — do not ask for the same
|
|
162
|
+
variable twice.
|
|
163
|
+
|
|
164
|
+
#### b. MCP Setup — stdio transport (if `type: mcp` or `type: hybrid` with `mcp.transport: stdio` or no transport specified)
|
|
165
|
+
|
|
166
|
+
1. Read `.claude/settings.local.json` (create with `{"mcpServers": {}}` if it doesn't exist)
|
|
167
|
+
2. Check if `mcpServers.{server_name}` already exists:
|
|
168
|
+
- If yes → warn the user: "MCP server '{server_name}' already exists. Overwrite?"
|
|
169
|
+
Present as a numbered list and tell the user to reply with a number:
|
|
170
|
+
1. Yes, overwrite
|
|
171
|
+
2. No, keep existing
|
|
172
|
+
If "No" → skip MCP configuration but still complete installation
|
|
173
|
+
3. Use the values already collected in step 8.a for each env var in the skill's `env`
|
|
174
|
+
array (do not ask again).
|
|
175
|
+
4. Add to `mcpServers`:
|
|
176
|
+
```json
|
|
177
|
+
"{server_name}": {
|
|
178
|
+
"command": "{command}",
|
|
179
|
+
"args": {args},
|
|
180
|
+
"env": {
|
|
181
|
+
"{VAR_NAME}": "{value_from_env_or_user_input}"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
5. Write updated `.claude/settings.local.json`
|
|
186
|
+
|
|
187
|
+
#### c. MCP Setup — HTTP transport (if `type: mcp` or `type: hybrid` with `mcp.transport: http`)
|
|
188
|
+
|
|
189
|
+
1. Read `.claude/settings.local.json` (create with `{"mcpServers": {}}` if it doesn't exist)
|
|
190
|
+
2. Check for `server_name` conflict (same as stdio above)
|
|
191
|
+
3. Use the values already collected in step 8.a for each env var in the skill's `env`
|
|
192
|
+
array (do not ask again).
|
|
193
|
+
4. Build the mcpServers entry:
|
|
194
|
+
- Start with `{ "type": "http", "url": "{url}" }`
|
|
195
|
+
- If the skill has a `headers` field in `mcp`, add a `"headers"` object by resolving
|
|
196
|
+
each header value from the collected env var values:
|
|
197
|
+
`{ "{header-name}": "{resolved_value}" }`
|
|
198
|
+
- Omit the `"headers"` key entirely if the skill has no `headers` field
|
|
199
|
+
5. Add to `mcpServers`:
|
|
200
|
+
```json
|
|
201
|
+
"{server_name}": {
|
|
202
|
+
"type": "http",
|
|
203
|
+
"url": "{url}",
|
|
204
|
+
"headers": { "{header-name}": "{resolved_value}" }
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
6. Write updated `.claude/settings.local.json`
|
|
208
|
+
|
|
209
|
+
#### d. Script Setup (if `type: script` or `type: hybrid`)
|
|
210
|
+
|
|
211
|
+
1. Verify the script file exists at `skills/<name>/{script.path}`
|
|
212
|
+
- If missing and wasn't fetched in step 7 → **ERROR**: "Script file not found. Installation may be incomplete."
|
|
213
|
+
2. If the skill lists dependencies in `script.dependencies`:
|
|
214
|
+
- For `runtime: node` → run: `npm install {packages}`
|
|
215
|
+
- For `runtime: python` → run: `pip install {packages}`
|
|
216
|
+
- For `runtime: bash` → no dependency installation needed
|
|
217
|
+
3. If dependency installation fails → warn the user but do not block the skill installation.
|
|
218
|
+
|
|
219
|
+
#### e. Prompt Setup (if `type: prompt`)
|
|
220
|
+
|
|
221
|
+
No additional setup needed. The skill is fully defined by its SKILL.md instructions.
|
|
222
|
+
|
|
223
|
+
9. **Confirm installation**:
|
|
224
|
+
"✅ {name} installed! Crews can now use `{name}` in their skills list."
|
|
225
|
+
|
|
226
|
+
### 3. Create a Custom Skill
|
|
227
|
+
|
|
228
|
+
1. Check if the `opencrew-skill-creator` skill is installed:
|
|
229
|
+
- Look for `skills/opencrew-skill-creator/SKILL.md`
|
|
230
|
+
|
|
231
|
+
2. **If installed** → read `skills/opencrew-skill-creator/SKILL.md` and follow its
|
|
232
|
+
instructions to guide the user through custom skill creation.
|
|
233
|
+
|
|
234
|
+
3. **If not installed** → inform the user:
|
|
235
|
+
"The Skill Creator is not installed. Install it first with:
|
|
236
|
+
`/opencrew skills` → Install → `opencrew-skill-creator`"
|
|
237
|
+
|
|
238
|
+
### 3a. Generate Skill Automatically (called by Architect / Design Phase E)
|
|
239
|
+
|
|
240
|
+
This operation is called by the Architect during crew creation when a role has no matching skill in the catalog and native tools are insufficient. It does NOT require `opencrew-skill-creator` — it uses web research + the SKILL.md format spec.
|
|
241
|
+
|
|
242
|
+
1. **Input:** Role name, role description, and domain from the crew's design phase.
|
|
243
|
+
|
|
244
|
+
2. **Research the role's tooling:**
|
|
245
|
+
a. Use `web_search` to find what tools, APIs, or workflows professionals in this role use
|
|
246
|
+
b. Search for: `"{domain}" tools API`, `"{role}" workflow software`, `"{domain}" automation`
|
|
247
|
+
c. Determine the best skill type:
|
|
248
|
+
- Found a public MCP server? → `type: mcp`
|
|
249
|
+
- Found a CLI tool or API with SDK? → `type: script` (requires a script file)
|
|
250
|
+
- Found only a workflow pattern or methodology? → `type: prompt` (behavioral instructions)
|
|
251
|
+
|
|
252
|
+
3. **Generate SKILL.md** following the format specification (see SKILL.md Format section above):
|
|
253
|
+
```yaml
|
|
254
|
+
---
|
|
255
|
+
name: "{kebab-case-skill-name}"
|
|
256
|
+
description: "{one-line description}"
|
|
257
|
+
type: prompt # or mcp | script | hybrid
|
|
258
|
+
version: "0.1.0"
|
|
259
|
+
generated: true
|
|
260
|
+
experimental: true
|
|
261
|
+
categories: [{relevant tags}]
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
# {Skill Name}
|
|
265
|
+
|
|
266
|
+
## Purpose
|
|
267
|
+
{What this skill enables — 2-3 sentences}
|
|
268
|
+
|
|
269
|
+
## When to Use
|
|
270
|
+
- {Condition 1}
|
|
271
|
+
- {Condition 2}
|
|
272
|
+
|
|
273
|
+
## Instructions
|
|
274
|
+
{Detailed behavioral instructions for the agent using this skill}
|
|
275
|
+
|
|
276
|
+
## Limitations
|
|
277
|
+
- Generated automatically — review before production use
|
|
278
|
+
- {Any specific limitations discovered during research}
|
|
279
|
+
```
|
|
280
|
+
- `generated: true` — marks this as auto-created (distinct from catalog skills)
|
|
281
|
+
- `experimental: true` — warns users this hasn't been battle-tested
|
|
282
|
+
- Frontmatter MUST include: `name`, `description`, `type`, `version`, `generated`, `experimental`, `categories`
|
|
283
|
+
|
|
284
|
+
4. **Save the skill:**
|
|
285
|
+
a. Create directory: `skills/.custom/{skill-name}/`
|
|
286
|
+
b. Write `SKILL.md` to `skills/.custom/{skill-name}/SKILL.md`
|
|
287
|
+
c. If `type: script` — also generate the script file at the path specified in `script.path`
|
|
288
|
+
d. `skills/.custom/` is NEVER touched by `update` — user edits and generated skills survive updates
|
|
289
|
+
|
|
290
|
+
5. **Minimal validation:**
|
|
291
|
+
- [ ] Frontmatter has all required fields
|
|
292
|
+
- [ ] `categories` has at least 1 entry
|
|
293
|
+
- [ ] Markdown body has at least 50 words
|
|
294
|
+
- [ ] If `type: mcp` → `mcp.server_name` and `mcp.command`/`mcp.url` are present
|
|
295
|
+
- [ ] If `type: script` → `script.path` and `script.runtime` are present
|
|
296
|
+
|
|
297
|
+
6. **Return to Architect:** Report the generated skill name, type, and path so it can be included in `design.yaml` → `skills_installed:`.
|
|
298
|
+
|
|
299
|
+
### 4. Remove a Skill
|
|
300
|
+
|
|
301
|
+
1. **List installed skills** — present the list as a numbered list and tell the user to reply with a number.
|
|
302
|
+
If only 1 skill is installed, add "Cancel" as a second option.
|
|
303
|
+
If 0 skills are installed, inform the user directly ("No skills installed").
|
|
304
|
+
|
|
305
|
+
2. **Check for crew dependencies**:
|
|
306
|
+
- Scan all `crews/*/crew.yaml` files
|
|
307
|
+
- For each, read the `skills:` section
|
|
308
|
+
- Collect all crews that reference the selected skill
|
|
309
|
+
|
|
310
|
+
3. **Warn if crews depend on this skill**:
|
|
311
|
+
- If any crews use it:
|
|
312
|
+
"⚠️ These crews use '{name}': {comma-separated crew list}. They will fail until the skill is reinstalled."
|
|
313
|
+
|
|
314
|
+
4. **Confirm removal** — ask as a numbered list:
|
|
315
|
+
"Remove '{name}'?"
|
|
316
|
+
1. Yes, remove it
|
|
317
|
+
2. No, keep it
|
|
318
|
+
|
|
319
|
+
5. **If confirmed**:
|
|
320
|
+
a. Delete the entire `skills/<name>/` directory (including all subdirectories and files)
|
|
321
|
+
b. If the skill had MCP configuration (`type: mcp` or `type: hybrid`):
|
|
322
|
+
- Read `.claude/settings.local.json`
|
|
323
|
+
- Remove `mcpServers.{server_name}` (using the `server_name` from the skill's frontmatter)
|
|
324
|
+
- Write updated `.claude/settings.local.json`
|
|
325
|
+
c. Do NOT remove the skill from any `crew.yaml` files — the user may reinstall later,
|
|
326
|
+
and removing references would lose the crew's intended configuration.
|
|
327
|
+
|
|
328
|
+
6. **Confirm**: "✅ '{name}' has been removed."
|
|
329
|
+
|
|
330
|
+
### 5. Resolve Skills for Pipeline (called by Pipeline Runner)
|
|
331
|
+
|
|
332
|
+
This operation is called BEFORE pipeline execution starts. All skills must resolve successfully
|
|
333
|
+
before the pipeline begins (fail fast).
|
|
334
|
+
|
|
335
|
+
1. **Read the crew's skill list**:
|
|
336
|
+
Read `crews/{crew}/crew.yaml` → `skills` section
|
|
337
|
+
|
|
338
|
+
2. **Separate native skills from installed skills**:
|
|
339
|
+
- Native skills: `web_search`, `web_fetch` — these are built-in and always available
|
|
340
|
+
- All other skills require installation
|
|
341
|
+
|
|
342
|
+
3. **For each non-native skill**:
|
|
343
|
+
|
|
344
|
+
a. **Check if installed**: Look for `skills/{skill}/SKILL.md`
|
|
345
|
+
- If NOT found → ask the user as a numbered list:
|
|
346
|
+
"Skill '{skill}' is required by this crew but is not installed. What would you like to do?"
|
|
347
|
+
1. Install now
|
|
348
|
+
2. Skip and stop pipeline
|
|
349
|
+
- If "Install now" → run Operation 2 (Install a Skill) with this skill name
|
|
350
|
+
- If installation succeeds → continue resolution
|
|
351
|
+
- If installation fails → **ERROR**: stop pipeline
|
|
352
|
+
- If "Skip and stop pipeline" → **ERROR**: stop pipeline with message:
|
|
353
|
+
"Pipeline cannot run without required skill '{skill}'."
|
|
354
|
+
|
|
355
|
+
b. **Read and parse SKILL.md**: Parse the YAML frontmatter to get type, mcp config, etc.
|
|
356
|
+
|
|
357
|
+
c. **Verify MCP configuration** (if `type: mcp` or `type: hybrid`):
|
|
358
|
+
- Read `.claude/settings.local.json`
|
|
359
|
+
- Check that `mcpServers.{server_name}` exists
|
|
360
|
+
- If missing → **ERROR**: "Skill '{skill}' is installed but its MCP server is not configured. Run `/opencrew skills` → Install to reconfigure."
|
|
361
|
+
|
|
362
|
+
d. **Verify env vars** (if `env:` is present):
|
|
363
|
+
- Check each variable in `.env`
|
|
364
|
+
- If any are missing → ask the user conversationally, right here in chat, the same
|
|
365
|
+
way as Operation 2, step 8.a (never point them to the `.env` file to edit it
|
|
366
|
+
themselves). If they provide a value, write it to `.env` and continue. If they
|
|
367
|
+
skip, warn: "⚠️ Skill '{skill}' is missing environment variable(s): {list}. It may
|
|
368
|
+
not work correctly." — but do NOT block pipeline execution either way.
|
|
369
|
+
|
|
370
|
+
4. **Return resolved skill list**: Return all resolved skills with their parsed frontmatter
|
|
371
|
+
and SKILL.md body content. This list is used by Operation 6 to inject instructions.
|
|
372
|
+
|
|
373
|
+
### 6. Inject Skill Context into Agent (called during pipeline execution)
|
|
374
|
+
|
|
375
|
+
Skill injection uses a **two-tier** approach to minimize token consumption:
|
|
376
|
+
|
|
377
|
+
**Tier 1 (Skill Index)** — Always injected. A one-line summary per skill (~30 tokens each).
|
|
378
|
+
**Tier 2 (Full Instructions)** — Loaded only when the agent actively needs the skill in the current step.
|
|
379
|
+
|
|
380
|
+
For each skill declared in an agent's `.agent.md` frontmatter `skills:` field:
|
|
381
|
+
|
|
382
|
+
1. **Skip native skills**: `web_search` and `web_fetch` do not need instruction injection —
|
|
383
|
+
they are handled natively.
|
|
384
|
+
|
|
385
|
+
2. **Read each skill's SKILL.md** frontmatter only: Extract `name`, `description`, and `type` fields.
|
|
386
|
+
|
|
387
|
+
3. **Build the Tier 1 index** and append after all agent instructions:
|
|
388
|
+
```
|
|
389
|
+
[Agent .agent.md content]
|
|
390
|
+
|
|
391
|
+
--- AVAILABLE SKILLS ---
|
|
392
|
+
|
|
393
|
+
The following skills are available for this step. To use a skill, state which skill
|
|
394
|
+
you are invoking and the system will load its full instructions.
|
|
395
|
+
|
|
396
|
+
- {skill-id}: {description from frontmatter} (type: {type})
|
|
397
|
+
- {skill-id}: {description from frontmatter} (type: {type})
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
4. **Tier 2 loading** — When the step's instructions explicitly reference a skill
|
|
401
|
+
(e.g., the step file says "use image-creator to render the slides"), OR when the
|
|
402
|
+
agent declares it will use a specific skill:
|
|
403
|
+
a. Read `skills/{skill}/SKILL.md`
|
|
404
|
+
b. Extract the Markdown body (everything after the YAML frontmatter closing `---`)
|
|
405
|
+
c. Inject the full instructions:
|
|
406
|
+
```
|
|
407
|
+
--- SKILL INSTRUCTIONS: {name from frontmatter} ---
|
|
408
|
+
|
|
409
|
+
{SKILL.md markdown body}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
5. **Step-level skill hints**: If the step's frontmatter contains a `skills_needed:` field
|
|
413
|
+
(e.g., `skills_needed: [image-creator]`), load Tier 2 for those skills immediately
|
|
414
|
+
without waiting for the agent to request them. This allows the Architect to pre-declare
|
|
415
|
+
which skills a step will need.
|
|
416
|
+
|
|
417
|
+
6. **Missing skill handling**: If a skill listed in an agent's frontmatter was not resolved
|
|
418
|
+
during Operation 5, skip it silently — the user was already warned during resolution.
|
|
419
|
+
|
|
420
|
+
### 7. Skill Discovery (called by Architect during Design phase)
|
|
421
|
+
|
|
422
|
+
When the Architect reaches the Design phase (specifically Phase D/E — Role Proposal / Skill Mapping):
|
|
423
|
+
|
|
424
|
+
1. **List already-installed skills**:
|
|
425
|
+
Read all subdirectories in `skills/` and parse each SKILL.md frontmatter
|
|
426
|
+
to get name, description, type, and categories.
|
|
427
|
+
|
|
428
|
+
2. **Fetch the catalog index**:
|
|
429
|
+
a. First, try to read `skills/catalog.json` (installed locally). If it exists:
|
|
430
|
+
- Parse the JSON and extract the `skills` map and `baseUrl`
|
|
431
|
+
- Use this for discovery (skip the network fetch below)
|
|
432
|
+
b. If `skills/catalog.json` does NOT exist (pre-v1.1 install), fall back to fetching
|
|
433
|
+
the catalog README from GitHub:
|
|
434
|
+
```
|
|
435
|
+
https://raw.githubusercontent.com/alberthpalhares/opencrew/main/templates/skills/README.md
|
|
436
|
+
```
|
|
437
|
+
Parse the markdown table to extract skill names, types, and descriptions.
|
|
438
|
+
c. If both fail → proceed with only installed skills (do not block crew creation).
|
|
439
|
+
|
|
440
|
+
3. **Analyze crew requirements**:
|
|
441
|
+
From the discovery phase answers (Phase 1), identify what the crew needs:
|
|
442
|
+
- What platforms or services does it interact with?
|
|
443
|
+
- What data sources does it need?
|
|
444
|
+
- What output formats does it produce?
|
|
445
|
+
- What automations would speed up the workflow?
|
|
446
|
+
|
|
447
|
+
4. **Match skill categories against crew needs**:
|
|
448
|
+
- Research/data crews → check for: scraping, data, analytics skills
|
|
449
|
+
- Content crews → check for: design, social-media skills
|
|
450
|
+
- Communication crews → check for: messaging, notification skills
|
|
451
|
+
- Automation crews → check for: automation, integration skills
|
|
452
|
+
|
|
453
|
+
5. **Only suggest skills when native skills are insufficient**:
|
|
454
|
+
`web_search` and `web_fetch` cover basic web research and data fetching.
|
|
455
|
+
Only suggest additional skills when:
|
|
456
|
+
- The crew needs structured data extraction (scraping)
|
|
457
|
+
- The crew interacts with specific APIs (social media, design tools, messaging)
|
|
458
|
+
- The crew requires local script execution (image processing, data transformation)
|
|
459
|
+
- The crew benefits from specialized behavioral prompts
|
|
460
|
+
|
|
461
|
+
6. **Present recommendations** (if any relevant skills found):
|
|
462
|
+
Present as a numbered list. User can reply with one number or multiple numbers separated by spaces (e.g. "1 3").
|
|
463
|
+
If only 1 skill is relevant,
|
|
464
|
+
add "No thanks, skip" as a second option.
|
|
465
|
+
```
|
|
466
|
+
These skills could enhance your crew:
|
|
467
|
+
|
|
468
|
+
1. 🔌 apify: Scrape structured data from any website
|
|
469
|
+
2. 📜 image-optimizer: Resize and compress images for social media
|
|
470
|
+
3. 💡 seo-guidelines: Best practices for SEO-optimized content
|
|
471
|
+
|
|
472
|
+
Reply with the numbers of skills you'd like to install (e.g. "1 3"), or press Enter to skip.
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
7. **Install accepted skills**:
|
|
476
|
+
For each skill the user selects → run Operation 2 (Install a Skill).
|
|
477
|
+
|
|
478
|
+
8. **Track installed skills**:
|
|
479
|
+
Record which skills were installed during this phase. They will be added to the
|
|
480
|
+
crew's `crew.yaml` in the Build phase, under the `skills:` section:
|
|
481
|
+
```yaml
|
|
482
|
+
skills:
|
|
483
|
+
- web_search
|
|
484
|
+
- web_fetch
|
|
485
|
+
- apify # installed during Design phase
|
|
486
|
+
- seo-guidelines # installed during Design phase
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
9. **If no relevant skills found or user declines all** → proceed silently to the next phase.
|
|
490
|
+
Do not force skill installation — native skills are sufficient for many crews.
|