@aksp/opencrew 1.0.1 → 1.2.0
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 +54 -0
- package/README.md +21 -5
- package/package.json +3 -3
- package/src/cli.js +34 -3
- package/src/commands/init.js +5 -0
- package/src/commands/update.js +21 -3
- package/src/lib/fsx.js +15 -0
- package/templates/.mcp.json +1 -1
- package/templates/AGENTS.md +32 -4
- package/templates/_opencrew/.opencrew-version +1 -1
- package/templates/_opencrew/_memory/preferences.md +1 -0
- package/templates/_opencrew/core/prompts/build.prompt.md +40 -1
- package/templates/_opencrew/core/prompts/repair.prompt.md +119 -0
- package/templates/_opencrew/core/runner.pipeline.md +29 -14
- package/templates/_opencrew/core/skills.engine.md +33 -9
- package/templates/skills/README.md +22 -0
- package/templates/skills/catalog.json +61 -0
- package/templates/skills/instagram-publisher/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,60 @@
|
|
|
3
3
|
All notable changes to opencrew are documented here.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/).
|
|
5
5
|
|
|
6
|
+
## [1.2.0] — 2026-08-02
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
- **Crews created without agent names**: some crews rendered their agents' functions
|
|
10
|
+
(e.g. "Pesquisador") but not their persona names (e.g. "Pedro Pesquisa"). Root cause:
|
|
11
|
+
`build.prompt.md` never specified the `crew-party.csv` schema, so the manifest could be
|
|
12
|
+
generated without a `displayName` column — the exact column the Pipeline Runner reads to
|
|
13
|
+
render agent names — even though the correct two-word names were present in each
|
|
14
|
+
`.agent.md`. Build now documents the full CSV schema (header + example) and enforces it
|
|
15
|
+
with a new blocking **Gate 0b: Crew-Party Manifest** that checks `displayName` exists and
|
|
16
|
+
matches each agent's `.agent.md` `name:`.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- **`/opencrew repair <crew>`**: repairs an already-created crew whose manifest is missing
|
|
20
|
+
agent names. It rebuilds `crew-party.csv` from the persona names already stored in each
|
|
21
|
+
`.agent.md` (no re-generation of agents, research, or pipeline). New prompt at
|
|
22
|
+
`_opencrew/core/prompts/repair.prompt.md`, routed via `AGENTS.md`.
|
|
23
|
+
|
|
24
|
+
### Migration
|
|
25
|
+
- To fix an existing crew that shows functions but no names:
|
|
26
|
+
1. `npx @aksp/opencrew update` — refreshes the framework and installs the repair command.
|
|
27
|
+
2. `/opencrew repair <crew>` — rewrites the crew's manifest with the correct names.
|
|
28
|
+
`update` intentionally never touches `crews/`, so the repair step is required in addition
|
|
29
|
+
to updating.
|
|
30
|
+
|
|
31
|
+
## [1.1.0] — 2026-08-01
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
- **Skill catalog URLs**: `/opencrew install` now fetches skills from the correct fork
|
|
35
|
+
(`alberthpalhares/opencrew/templates/skills/`) instead of the upstream OpenSquad repo.
|
|
36
|
+
- **Publish workflow**: restored `push: tags` as the sole trigger — the actual release
|
|
37
|
+
flow is `npm version` + `git push --tags`, not GitHub Releases. Documented in
|
|
38
|
+
`CONTRIBUTING.md`.
|
|
39
|
+
- **Cross-platform test script**: replaced shell glob (`tests/*.test.js`) with an
|
|
40
|
+
explicit file list so `npm test` works on Windows PowerShell + Node 20.
|
|
41
|
+
- **CI matrix**: test suite now runs on Ubuntu and Windows on every push/PR.
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
- **Test suite**: 30 tests (`node:test`) covering `fsx.js`, init, update, IDE bridge
|
|
45
|
+
validation, and documentation contracts.
|
|
46
|
+
- **CI version-sync check**: `scripts/check-version-sync.js` fails the build if
|
|
47
|
+
`.opencrew-version` drifts from `package.json`.
|
|
48
|
+
- **Playwright plugin warning**: `init` now warns Claude Code users to disable the
|
|
49
|
+
native Playwright extension (opencrew ships its own via `.mcp.json`).
|
|
50
|
+
|
|
51
|
+
### Changed
|
|
52
|
+
- **Dashboard opt-in**: Pipeline Runner `state.json` writes are now gated on
|
|
53
|
+
`Dashboard: enabled` in `preferences.md` (default: disabled). Removed the
|
|
54
|
+
unconditional 10-second sleep at the end of every pipeline run.
|
|
55
|
+
- **Smaller fixes**: removed `AskUserQuestion` references from IDE-neutral files,
|
|
56
|
+
corrected `update.js` comment about overwrite behavior, pinned `@playwright/mcp`
|
|
57
|
+
version, removed stale root `skills/` directory (drifted duplicate of
|
|
58
|
+
`templates/skills/`).
|
|
59
|
+
|
|
6
60
|
## [1.0.1] — 2026-08-01
|
|
7
61
|
|
|
8
62
|
### Changed
|
package/README.md
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# OpenCrew
|
|
2
|
+
|
|
3
|
+
[](https://github.com/alberthpalhares/opencrew/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/@aksp/opencrew)
|
|
5
|
+
[](LICENSE)
|
|
2
6
|
|
|
3
7
|
**Crie equipes de agentes de IA que trabalham juntos — direto na sua IDE.**
|
|
4
8
|
|
|
@@ -6,7 +10,7 @@
|
|
|
6
10
|
> you don't read Portuguese, use your browser's translator (e.g. Google Translate) or ask
|
|
7
11
|
> an AI assistant to translate this page.
|
|
8
12
|
|
|
9
|
-
|
|
13
|
+
OpenCrew é um framework de orquestração multi-agente. Descreva o que você precisa em
|
|
10
14
|
linguagem natural e ele monta um time de agentes especializados que rodam como um pipeline
|
|
11
15
|
automatizado, com pontos de aprovação humana. Funciona no Claude Code, Cursor, Codex,
|
|
12
16
|
Gemini CLI, OpenCode, Antigravity e mais.
|
|
@@ -15,7 +19,7 @@ Gemini CLI, OpenCode, Antigravity e mais.
|
|
|
15
19
|
> O [OpenSquad](https://github.com/renatoasse/opensquad) foi criado por
|
|
16
20
|
> [Renato Asse](https://github.com/renatoasse) ([Comunidade Sem Codar](https://semcodar.com.br)).
|
|
17
21
|
> Eu ([aksp](https://www.npmjs.com/~aksp)) uso o OpenSquad no dia a dia e quis melhorar
|
|
18
|
-
> algumas coisas para o meu próprio fluxo de trabalho — o `
|
|
22
|
+
> algumas coisas para o meu próprio fluxo de trabalho — o `OpenCrew` é essa versão
|
|
19
23
|
> reformulada, compartilhada caso ajude outras pessoas também. Todo o crédito pela ideia e
|
|
20
24
|
> pelo framework original é do Renato Asse. Veja [Origem e créditos](#origem-e-créditos)
|
|
21
25
|
> abaixo. Licenciado sob MIT, assim como o original.
|
|
@@ -41,7 +45,7 @@ extra ou chave de API é necessária para começar.
|
|
|
41
45
|
|
|
42
46
|
Algumas **skills opcionais** dependem de serviços externos — por exemplo, publicar no
|
|
43
47
|
Instagram, gerar imagens com IA, fazer web scraping (Apify) ou enviar e-mails (Resend). Você
|
|
44
|
-
não precisa se preocupar com isso antes de começar: se, ao montar uma crew, o
|
|
48
|
+
não precisa se preocupar com isso antes de começar: se, ao montar uma crew, o OpenCrew
|
|
45
49
|
identificar que ela precisa de uma dessas skills, ele pede a chave direto na conversa
|
|
46
50
|
(explicando o que é e onde consegui-la) e salva tudo por conta própria. Não é preciso abrir
|
|
47
51
|
nem editar nenhum arquivo manualmente.
|
|
@@ -88,6 +92,18 @@ Cada integração é só um ponteiro enxuto para a fonte única de verdade, o **
|
|
|
88
92
|
- **Skills Engine** carrega integrações (scraping, design, publicação, e-mail…) sob demanda,
|
|
89
93
|
usando um esquema em duas camadas para manter o consumo de tokens baixo.
|
|
90
94
|
|
|
95
|
+
## Dashboard (opcional)
|
|
96
|
+
|
|
97
|
+
O opencrew inclui um dashboard visual auto-contido — `dashboard/index.html`, um arquivo
|
|
98
|
+
HTML único sem dependências que mostra a execução de uma crew como um escritório virtual
|
|
99
|
+
animado (com agentes trabalhando em suas mesas, handoffs entre etapas, e indicador de
|
|
100
|
+
progresso).
|
|
101
|
+
|
|
102
|
+
Ele é **desligado por padrão** — o Pipeline Runner não escreve `state.json` a menos que
|
|
103
|
+
você ligue o recurso (`Dashboard: enabled` em `_opencrew/_memory/preferences.md`, via
|
|
104
|
+
`/opencrew settings`). Inclui modo demo embutido para visualização sem precisar rodar uma
|
|
105
|
+
crew real.
|
|
106
|
+
|
|
91
107
|
## Comandos (dentro da sua IDE)
|
|
92
108
|
|
|
93
109
|
| Comando | O que faz |
|
|
@@ -106,7 +122,7 @@ vivem as instruções do sistema; os arquivos por IDE são gerados a partir de `
|
|
|
106
122
|
|
|
107
123
|
## Origem e créditos
|
|
108
124
|
|
|
109
|
-
`
|
|
125
|
+
`OpenCrew` é uma **distribuição reformulada do [OpenSquad](https://github.com/renatoasse/opensquad)**,
|
|
110
126
|
o framework de orquestração multi-agente criado e mantido por
|
|
111
127
|
**[Renato Asse](https://github.com/renatoasse)**, fundador da
|
|
112
128
|
[Comunidade Sem Codar](https://semcodar.com.br). O projeto original, seu conceito, o modelo
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aksp/opencrew",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
],
|
|
20
20
|
"scripts": {
|
|
21
21
|
"start": "node bin/opencrew.js",
|
|
22
|
-
"test": "node --test tests
|
|
23
|
-
"version": "node -e \"require('fs').writeFileSync('templates/_opencrew/.opencrew-version', require('./package.json').version + '\\n')\""
|
|
22
|
+
"test": "node --test tests/cli.test.js tests/docs.test.js tests/fsx.test.js tests/ides.test.js tests/init.test.js tests/update.test.js",
|
|
23
|
+
"version": "node -e \"require('fs').writeFileSync('templates/_opencrew/.opencrew-version', require('./package.json').version + '\\n')\" && git add templates/_opencrew/.opencrew-version"
|
|
24
24
|
},
|
|
25
25
|
"keywords": [
|
|
26
26
|
"ai-agents",
|
package/src/cli.js
CHANGED
|
@@ -3,7 +3,7 @@ import { packageJsonPath } from './lib/paths.js';
|
|
|
3
3
|
import { allIdeIds } from './lib/ides.js';
|
|
4
4
|
import { init } from './commands/init.js';
|
|
5
5
|
import { update } from './commands/update.js';
|
|
6
|
-
import { c, log, err } from './lib/ui.js';
|
|
6
|
+
import { c, log, err, warn, info } from './lib/ui.js';
|
|
7
7
|
|
|
8
8
|
function parseArgs(argv) {
|
|
9
9
|
const opts = { _: [] };
|
|
@@ -36,18 +36,49 @@ ${c.bold('Options for init')}
|
|
|
36
36
|
--all Configure every supported IDE
|
|
37
37
|
--yes Non-interactive; accept defaults
|
|
38
38
|
|
|
39
|
+
${c.bold('Options for update')}
|
|
40
|
+
--check Dry-run: report whether an update is available without making changes
|
|
41
|
+
|
|
39
42
|
${c.bold('Examples')}
|
|
40
43
|
npx @aksp/opencrew init
|
|
41
44
|
npx @aksp/opencrew init --ide=claude-code,codex
|
|
42
45
|
npx @aksp/opencrew init --all
|
|
43
46
|
npx @aksp/opencrew update
|
|
47
|
+
npx @aksp/opencrew update --check
|
|
44
48
|
`);
|
|
45
49
|
}
|
|
46
50
|
|
|
47
51
|
export async function run(argv) {
|
|
48
52
|
const opts = parseArgs(argv);
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
|
|
54
|
+
let version = 'unknown';
|
|
55
|
+
let engines = {};
|
|
56
|
+
try {
|
|
57
|
+
const pkg = await readJson(packageJsonPath);
|
|
58
|
+
version = pkg.version;
|
|
59
|
+
engines = pkg.engines || {};
|
|
60
|
+
} catch {
|
|
61
|
+
err('Could not read package.json. The installation may be corrupted.');
|
|
62
|
+
info('Try reinstalling: npm install @aksp/opencrew');
|
|
63
|
+
process.exitCode = 1;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Validate Node version against engines.node requirement.
|
|
68
|
+
if (engines.node) {
|
|
69
|
+
const min = engines.node.replace(/[^0-9.]/g, '');
|
|
70
|
+
if (min) {
|
|
71
|
+
const major = Number(min.split('.')[0]);
|
|
72
|
+
const current = Number(process.versions.node.split('.')[0]);
|
|
73
|
+
if (current < major) {
|
|
74
|
+
warn(`opencrew requires Node.js ${engines.node}. You have v${process.versions.node}.`);
|
|
75
|
+
info(`Upgrade Node or use a compatible version.`);
|
|
76
|
+
process.exitCode = 1;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
51
82
|
const cmd = opts._[0] || (opts.help ? 'help' : 'init');
|
|
52
83
|
|
|
53
84
|
switch (cmd) {
|
package/src/commands/init.js
CHANGED
|
@@ -75,6 +75,11 @@ export async function init(opts = {}) {
|
|
|
75
75
|
ok(`${ide.label} → ${ide.files.map((f) => f.path).join(', ')}`);
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
+
if (ids.includes('claude-code')) {
|
|
79
|
+
warn(`opencrew ships its own Playwright MCP server (.mcp.json) — disable Claude Code's`);
|
|
80
|
+
warn(`native Playwright plugin/extension to avoid the two conflicting.`);
|
|
81
|
+
}
|
|
82
|
+
|
|
78
83
|
// 4. Version stamp.
|
|
79
84
|
await fs.writeFile(path.join(target, '_opencrew', '.opencrew-version'), version + '\n');
|
|
80
85
|
|
package/src/commands/update.js
CHANGED
|
@@ -6,7 +6,11 @@ import { c, log, info, ok, warn, step } from '../lib/ui.js';
|
|
|
6
6
|
|
|
7
7
|
// Update refreshes ONLY the framework. It never touches:
|
|
8
8
|
// crews/, _opencrew/_memory/, _opencrew/_browser_profile/, .env, IDE bridges.
|
|
9
|
-
|
|
9
|
+
// Note: catalog skills (skills/<name>/ that ship with the package) ARE fully
|
|
10
|
+
// overwritten below — user edits to a catalog skill's own files are not preserved.
|
|
11
|
+
// Only skill directories that don't exist in the package's templates/skills/ at all
|
|
12
|
+
// (i.e. custom/user-authored skills) are left untouched.
|
|
13
|
+
export async function update(opts = {}) {
|
|
10
14
|
const target = process.cwd();
|
|
11
15
|
const pkg = await readJson(packageJsonPath);
|
|
12
16
|
const version = pkg.version;
|
|
@@ -25,6 +29,17 @@ export async function update() {
|
|
|
25
29
|
log(`\n${c.bold(c.cyan('opencrew update'))}`);
|
|
26
30
|
log(c.dim(`Installed: ${current} → Package: ${version}\n`));
|
|
27
31
|
|
|
32
|
+
if (opts.check) {
|
|
33
|
+
if (current === version) {
|
|
34
|
+
ok(`Up to date (v${version}).`);
|
|
35
|
+
} else {
|
|
36
|
+
info(`Update available: v${current} → v${version}.`);
|
|
37
|
+
info(`Run ${c.cyan('npx @aksp/opencrew update')} to apply.`);
|
|
38
|
+
process.exitCode = 1;
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
28
43
|
if (current === version) {
|
|
29
44
|
ok('Already up to date. Refreshing framework files anyway.');
|
|
30
45
|
}
|
|
@@ -38,8 +53,11 @@ export async function update() {
|
|
|
38
53
|
});
|
|
39
54
|
ok(`_opencrew/core refreshed (${n} files)`);
|
|
40
55
|
|
|
41
|
-
// Refresh catalog skills
|
|
42
|
-
//
|
|
56
|
+
// Refresh catalog skills: every skill shipped in templates/skills/ is fully
|
|
57
|
+
// overwritten (edits to a catalog skill's files do not survive an update).
|
|
58
|
+
// Skill directories that only exist in the user's project — i.e. not part of
|
|
59
|
+
// the catalog — are never touched, since copyDir only visits paths that exist
|
|
60
|
+
// in the source (templates/skills/).
|
|
43
61
|
step('Refreshing catalog skills');
|
|
44
62
|
let s = 0;
|
|
45
63
|
await copyDir(path.join(templatesDir, 'skills'), path.join(target, 'skills'), {
|
package/src/lib/fsx.js
CHANGED
|
@@ -50,6 +50,21 @@ export async function writeFileSafe(p, content, { overwrite = true } = {}) {
|
|
|
50
50
|
return true;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Remove a directory and all its contents.
|
|
55
|
+
* Does nothing silently if the path does not exist.
|
|
56
|
+
* @param {string} p Directory path to remove.
|
|
57
|
+
* @returns {Promise<boolean>} true if something was deleted, false if it didn't exist.
|
|
58
|
+
*/
|
|
59
|
+
export async function deleteDir(p) {
|
|
60
|
+
try {
|
|
61
|
+
await fs.rm(p, { recursive: true, force: true });
|
|
62
|
+
return true;
|
|
63
|
+
} catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
53
68
|
export async function readJson(p) {
|
|
54
69
|
return JSON.parse(await fs.readFile(p, 'utf8'));
|
|
55
70
|
}
|
package/templates/.mcp.json
CHANGED
package/templates/AGENTS.md
CHANGED
|
@@ -31,7 +31,7 @@ If `company.md` is empty or contains `<!-- NOT CONFIGURED -->`:
|
|
|
31
31
|
|
|
32
32
|
## Main Menu
|
|
33
33
|
|
|
34
|
-
When the user types `/opencrew` or asks for the menu, present an interactive selector
|
|
34
|
+
When the user types `/opencrew` or asks for the menu, present an interactive selector with these options (max 4 per question). Use your IDE's native interactive-choice mechanism if it has one (e.g. Claude Code's `AskUserQuestion`); otherwise present the options as a numbered list and ask the user to reply with a number:
|
|
35
35
|
|
|
36
36
|
**Primary menu (first question):**
|
|
37
37
|
- **Create a new crew** — Describe what you need and I'll build a crew for you
|
|
@@ -39,7 +39,7 @@ When the user types `/opencrew` or asks for the menu, present an interactive sel
|
|
|
39
39
|
- **My crews** — View, edit, or delete your crews
|
|
40
40
|
- **More options** — Skills, company profile, settings, and help
|
|
41
41
|
|
|
42
|
-
If the user selects "More options", present a second
|
|
42
|
+
If the user selects "More options", present a second selector the same way:
|
|
43
43
|
- **Skills** — Browse, install, create, and manage skills for your crews
|
|
44
44
|
- **Company profile** — View or update your company information
|
|
45
45
|
- **Settings & Help** — Language, preferences, configuration, and help
|
|
@@ -56,6 +56,7 @@ Parse user input and route to the appropriate action:
|
|
|
56
56
|
| `/opencrew list` | List all crews in `crews/` directory |
|
|
57
57
|
| `/opencrew run <name>` | Load Pipeline Runner → Execute crew |
|
|
58
58
|
| `/opencrew edit <name> <changes>` | Load Architect → Edit Crew flow |
|
|
59
|
+
| `/opencrew repair <name>` | Load `_opencrew/core/prompts/repair.prompt.md` → fix agent names / rebuild crew-party.csv manifest |
|
|
59
60
|
| `/opencrew skills` | Load Skills Engine → Show skills menu |
|
|
60
61
|
| `/opencrew install <name>` | Install a skill from the catalog |
|
|
61
62
|
| `/opencrew uninstall <name>` | Remove an installed skill |
|
|
@@ -84,8 +85,28 @@ When running a crew:
|
|
|
84
85
|
3. For each agent in the party CSV, also read their full `.agent.md` file from agents/ directory
|
|
85
86
|
4. Load company context from `_opencrew/_memory/company.md`
|
|
86
87
|
5. Load crew memory from `crews/{name}/_memory/memories.md`
|
|
87
|
-
6.
|
|
88
|
-
7.
|
|
88
|
+
6. Load user preferences from `_opencrew/_memory/preferences.md` (used to check the Dashboard toggle — see below)
|
|
89
|
+
7. Read the pipeline runner instructions from `_opencrew/core/runner.pipeline.md`
|
|
90
|
+
8. Execute the pipeline step by step following runner instructions
|
|
91
|
+
|
|
92
|
+
## Dashboard (Optional)
|
|
93
|
+
|
|
94
|
+
opencrew ships an optional visual dashboard — a self-contained HTML file
|
|
95
|
+
(`dashboard/index.html`) that shows a crew run in progress as an animated
|
|
96
|
+
virtual office. It is **disabled by default** and most installs never use it,
|
|
97
|
+
so the Pipeline Runner does not write `state.json` unless the user has turned
|
|
98
|
+
it on.
|
|
99
|
+
|
|
100
|
+
- To use: open `dashboard/index.html` in a browser and point it at the
|
|
101
|
+
`crews/{name}/state.json` written during a run.
|
|
102
|
+
- Toggle: `Dashboard: enabled` (or `disabled`) in `_opencrew/_memory/preferences.md`,
|
|
103
|
+
editable via `/opencrew settings`.
|
|
104
|
+
- When disabled (default): the runner never creates, writes, or deletes `state.json`.
|
|
105
|
+
- When enabled: the runner writes `crews/{name}/state.json` before each step and at
|
|
106
|
+
every handoff, exactly as described in `_opencrew/core/runner.pipeline.md`.
|
|
107
|
+
- The dashboard auto-polls `state.json` every 1.5 seconds when in live mode;
|
|
108
|
+
it also includes a built-in demo mode so you can see what it looks like
|
|
109
|
+
without running a real crew.
|
|
89
110
|
|
|
90
111
|
## Language Handling
|
|
91
112
|
|
|
@@ -93,6 +114,13 @@ When running a crew:
|
|
|
93
114
|
- All user-facing output should be in the user's preferred language
|
|
94
115
|
- Internal file names and code remain in English
|
|
95
116
|
- Agent personas communicate in the user's language
|
|
117
|
+
- **Exception — crew memory scaffolding stays in PT-BR regardless of Output Language.**
|
|
118
|
+
The section headers in `crews/{name}/_memory/memories.md` (e.g. `## Estilo de Escrita`)
|
|
119
|
+
and the table columns in `crews/{name}/_memory/runs.md` (e.g. `Data | Run ID | Tema`) are
|
|
120
|
+
fixed structural labels, not generated prose — see `_opencrew/core/runner.pipeline.md`.
|
|
121
|
+
opencrew's primary supported audience is PT-BR (see README), so these are intentionally
|
|
122
|
+
not localized per-user. Only the *content* written into those sections follows the
|
|
123
|
+
user's Output Language.
|
|
96
124
|
|
|
97
125
|
## Critical Rules
|
|
98
126
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
1.0
|
|
1
|
+
1.2.0
|
|
@@ -92,7 +92,28 @@ Generate these files. Use the Write tool for all file creation — never use Bas
|
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
2. **`crews/{code}/crew-party.csv`** — Agent manifest
|
|
95
|
-
-
|
|
95
|
+
- The header row MUST be EXACTLY these columns, in this order:
|
|
96
|
+
```
|
|
97
|
+
id,displayName,title,icon,path,execution
|
|
98
|
+
```
|
|
99
|
+
- One row per agent. Example:
|
|
100
|
+
```
|
|
101
|
+
id,displayName,title,icon,path,execution
|
|
102
|
+
researcher,"Pedro Pesquisa","Pesquisador de Tendências",🔎,./agents/researcher.agent.md,subagent
|
|
103
|
+
copywriter,"Guilherme Gancho","Redator Copywriter",✍️,./agents/copywriter.agent.md,inline
|
|
104
|
+
```
|
|
105
|
+
- **`displayName` is REQUIRED and MUST be byte-for-byte identical to the agent's
|
|
106
|
+
`name:` frontmatter field in its `.agent.md`** (the mandatory two-word "FirstName
|
|
107
|
+
LastName" persona name). The Pipeline Runner reads `displayName` — NOT `title` — to
|
|
108
|
+
render the agent's name in `state.json`, in "🤖 {name} is working…" announcements, and
|
|
109
|
+
in the dashboard. If `displayName` is missing, empty, or set to the role/title instead
|
|
110
|
+
of the persona name, the crew renders with functions but no names.
|
|
111
|
+
- `id` = the `path` basename with `./agents/` and `.agent.md` stripped
|
|
112
|
+
(e.g. `./agents/researcher.agent.md` → `researcher`).
|
|
113
|
+
- `title` = the agent's `title:` frontmatter (the role/function label). This is a
|
|
114
|
+
SEPARATE column from `displayName` — never merge or swap them.
|
|
115
|
+
- `path` column uses `.agent.md` extension (e.g., `./agents/researcher.agent.md`).
|
|
116
|
+
- Quote any field containing a space or comma with double quotes (as shown above).
|
|
96
117
|
|
|
97
118
|
3. **Agent files** — one per agent: `crews/{code}/agents/{agent-id}.agent.md`
|
|
98
119
|
- For ALL agents that include `tasks:` in their frontmatter, ALSO generate the task files:
|
|
@@ -426,6 +447,23 @@ For EACH agent in `design.yaml`, verify:
|
|
|
426
447
|
|
|
427
448
|
If ANY agent has a single-word name (missing last name), this is a critical bug. Fix it by generating an alliterative last name that references the agent's role, then update the name in `design.yaml` and all generated files.
|
|
428
449
|
|
|
450
|
+
### Gate 0b: Crew-Party Manifest (BLOCKING)
|
|
451
|
+
|
|
452
|
+
Read `crews/{code}/crew-party.csv` and verify:
|
|
453
|
+
- [ ] The header row contains a `displayName` column (not just `title`/`role`/`name`)
|
|
454
|
+
- [ ] For EACH agent row: `displayName` is non-empty and has EXACTLY two words
|
|
455
|
+
- [ ] For EACH agent row: `displayName` matches, byte-for-byte, the `name:` frontmatter
|
|
456
|
+
of the `.agent.md` file referenced by that row's `path` column
|
|
457
|
+
|
|
458
|
+
This gate exists because the Pipeline Runner renders agent identity from the CSV's
|
|
459
|
+
`displayName` column. An agent can have a correct two-word `name:` in its `.agent.md`
|
|
460
|
+
(passing Gate 0) yet still render as "function without a name" if the CSV omits
|
|
461
|
+
`displayName` or fills it with the role/title. That is the exact failure this gate catches.
|
|
462
|
+
|
|
463
|
+
If ANY check fails: rewrite `crew-party.csv` using the canonical header
|
|
464
|
+
(`id,displayName,title,icon,path,execution`), pulling `displayName` from each agent's
|
|
465
|
+
`.agent.md` `name:` field and `title` from its `title:` field. Re-validate. Max 2 fix attempts.
|
|
466
|
+
|
|
429
467
|
### Gate 1: Agent Completeness (BLOCKING)
|
|
430
468
|
|
|
431
469
|
For EACH `.agent.md` file, verify:
|
|
@@ -504,6 +542,7 @@ If any check fails: warn in the summary but don't block.
|
|
|
504
542
|
Additional programmatic checks — read the filesystem to verify:
|
|
505
543
|
- [ ] `crew.yaml` exists and is valid YAML
|
|
506
544
|
- [ ] All `.agent.md` files listed in `crew-party.csv` exist
|
|
545
|
+
- [ ] `crew-party.csv` has a `displayName` column, populated for every row and matching each agent's `.agent.md` `name:` field
|
|
507
546
|
- [ ] All task files referenced in agent frontmatter exist
|
|
508
547
|
- [ ] All step files referenced in `pipeline.yaml` exist
|
|
509
548
|
- [ ] Skills listed in `crew.yaml` are installed in `skills/`
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Repair — Fix Crew Agent Names / Manifest
|
|
2
|
+
|
|
3
|
+
You are the opencrew Repair agent. Your job is to fix an **already-created** crew whose
|
|
4
|
+
agents show their function/role but not their persona names (e.g. the dashboard and the
|
|
5
|
+
Pipeline Runner announce "Pesquisador" instead of "Pedro Pesquisa").
|
|
6
|
+
|
|
7
|
+
This is a known defect in crews built by older versions: the `crew-party.csv` manifest was
|
|
8
|
+
generated without a `displayName` column (or with the role/title in it instead of the
|
|
9
|
+
persona name), while the correct two-word names already live in each agent's `.agent.md`
|
|
10
|
+
`name:` frontmatter. This repair is **deterministic** — you pull names from the `.agent.md`
|
|
11
|
+
files and rewrite the manifest. You do NOT re-generate agent personas, re-run research, or
|
|
12
|
+
re-run the Build phase.
|
|
13
|
+
|
|
14
|
+
## Scope
|
|
15
|
+
|
|
16
|
+
You may ONLY touch files under `crews/{code}/`:
|
|
17
|
+
- `crews/{code}/crew-party.csv`
|
|
18
|
+
- `crews/{code}/agents/*.agent.md` (only in the fallback case — see Step 4)
|
|
19
|
+
- `crews/{code}/state.json` (only if it exists)
|
|
20
|
+
|
|
21
|
+
Never modify `_opencrew/`, `templates/`, or any other crew. Use the Write tool for all file
|
|
22
|
+
writes (never Bash `mkdir`).
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Step 1: Identify the crew
|
|
27
|
+
|
|
28
|
+
- If the user passed a crew code (`/opencrew repair <name>`), use it.
|
|
29
|
+
- Otherwise, list the directories under `crews/` and ask which crew to repair.
|
|
30
|
+
- If exactly 1 crew exists, offer it plus a "Cancel" option.
|
|
31
|
+
- If 0 crews exist, tell the user there is nothing to repair and stop.
|
|
32
|
+
|
|
33
|
+
Verify `crews/{code}/crew.yaml` and `crews/{code}/agents/` exist. If not, report and stop.
|
|
34
|
+
|
|
35
|
+
## Step 2: Read the source of truth (the agent files)
|
|
36
|
+
|
|
37
|
+
For EACH `crews/{code}/agents/*.agent.md`, read the YAML frontmatter and extract:
|
|
38
|
+
- `id` (or derive it from the filename: `researcher.agent.md` → `researcher`)
|
|
39
|
+
- `name` — the persona name (expected: two words, "FirstName LastName")
|
|
40
|
+
- `title` — the role/function label
|
|
41
|
+
- `icon` — the emoji
|
|
42
|
+
- `execution` — `inline` or `subagent`
|
|
43
|
+
|
|
44
|
+
Also read the current `crews/{code}/crew-party.csv` (if present) to preserve any
|
|
45
|
+
`execution`/`title` values that are correct there but missing from a `.agent.md`.
|
|
46
|
+
|
|
47
|
+
## Step 3: Rebuild `crew-party.csv`
|
|
48
|
+
|
|
49
|
+
Write `crews/{code}/crew-party.csv` with the canonical header and one row per agent:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
id,displayName,title,icon,path,execution
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
- `displayName` = the agent's `name:` from its `.agent.md` (the two-word persona name).
|
|
56
|
+
- `title` = the agent's `title:`.
|
|
57
|
+
- `icon` = the agent's `icon:`.
|
|
58
|
+
- `path` = `./agents/{id}.agent.md`.
|
|
59
|
+
- `execution` = the agent's `execution:` (default `inline` if absent).
|
|
60
|
+
- Quote any field containing a space or comma with double quotes.
|
|
61
|
+
- Preserve the original agent order (match the previous CSV order if it existed).
|
|
62
|
+
|
|
63
|
+
## Step 4: Fallback — agent whose `.agent.md` name is itself broken
|
|
64
|
+
|
|
65
|
+
If an agent's `.agent.md` `name:` is empty or has only ONE word, the persona name never
|
|
66
|
+
existed and must be generated now, following the **Agent Naming Convention** from
|
|
67
|
+
`_opencrew/core/prompts/design.prompt.md`:
|
|
68
|
+
|
|
69
|
+
1. Read the user's Output Language from `_opencrew/_memory/preferences.md`.
|
|
70
|
+
2. Generate a two-word name: "FirstName LastName" — both words start with the SAME letter
|
|
71
|
+
(alliteration); the first name is common in the user's language; the last name is a
|
|
72
|
+
playful reference to the agent's function (from its `title:`). Each agent in the crew
|
|
73
|
+
must use a DIFFERENT initial letter.
|
|
74
|
+
3. Update BOTH the `.agent.md` `name:` frontmatter AND the `# {Name}` heading in that file.
|
|
75
|
+
4. Use the new name as the `displayName` in the rebuilt CSV.
|
|
76
|
+
|
|
77
|
+
Only do this for agents that are actually broken. Agents that already have a valid two-word
|
|
78
|
+
`name:` are left untouched (only the CSV is rewritten to carry it).
|
|
79
|
+
|
|
80
|
+
## Step 5: Refresh `state.json` (only if it exists)
|
|
81
|
+
|
|
82
|
+
If `crews/{code}/state.json` exists, update each agent entry's `name` field to the repaired
|
|
83
|
+
`displayName`. Do not change any other field. If the file does not exist, skip — the
|
|
84
|
+
Pipeline Runner recreates it from the CSV on the next run.
|
|
85
|
+
|
|
86
|
+
## Step 6: Report
|
|
87
|
+
|
|
88
|
+
Present a summary table of what changed:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
Crew "{name}" repaired.
|
|
92
|
+
|
|
93
|
+
| Agent id | Before | After | Source |
|
|
94
|
+
|-------------|---------------|------------------|---------------|
|
|
95
|
+
| researcher | (role only) | 🔎 Pedro Pesquisa | .agent.md |
|
|
96
|
+
| copywriter | Guilherme | ✍️ Guilherme Gancho | generated |
|
|
97
|
+
|
|
98
|
+
crew-party.csv: rewritten with displayName column
|
|
99
|
+
state.json: {updated | not present}
|
|
100
|
+
|
|
101
|
+
Run it: /opencrew run {code}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
If nothing was broken (CSV already had a valid `displayName` for every agent), say so
|
|
105
|
+
plainly instead of inventing changes: "This crew's manifest is already correct — no repair
|
|
106
|
+
needed."
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Rules
|
|
111
|
+
|
|
112
|
+
- **DO** pull names from `.agent.md` `name:` — that is the source of truth.
|
|
113
|
+
- **DO** rewrite the whole `crew-party.csv` with the canonical header.
|
|
114
|
+
- **DO** limit persona generation to agents whose own `.agent.md` name is missing/one-word.
|
|
115
|
+
- **DO NOT** re-run Discovery, Design, Build, research, or investigations.
|
|
116
|
+
- **DO NOT** modify agent personas, principles, or any section other than the `name:` line
|
|
117
|
+
and `# {Name}` heading (and only in the fallback case).
|
|
118
|
+
- **DO NOT** touch any file outside `crews/{code}/`.
|
|
119
|
+
- **DO NOT** fabricate a summary — report only what you actually changed.
|
|
@@ -14,6 +14,21 @@ Before starting execution:
|
|
|
14
14
|
- The crew's `crew-party.csv` (all agent personas)
|
|
15
15
|
- Company context from `_opencrew/_memory/company.md`
|
|
16
16
|
- Crew memory from `crews/{name}/_memory/memories.md`
|
|
17
|
+
- User preferences from `_opencrew/_memory/preferences.md`
|
|
18
|
+
|
|
19
|
+
1a. **Check the Dashboard toggle** — the visual dashboard (`state.json` writes) is an
|
|
20
|
+
optional, opt-in feature that most installs never use (it requires running the
|
|
21
|
+
separate dashboard app from source — see README). Scan the already-loaded
|
|
22
|
+
`preferences.md` for a `Dashboard:` field:
|
|
23
|
+
- If it reads `Dashboard: enabled` → set `dashboard_enabled = true` for this run.
|
|
24
|
+
- Otherwise (`disabled`, missing, or preferences.md not configured yet) →
|
|
25
|
+
set `dashboard_enabled = false`. This is the default.
|
|
26
|
+
Store `dashboard_enabled` in working memory for the rest of this run. Every
|
|
27
|
+
`state.json` read/write instruction in this document is conditional on it —
|
|
28
|
+
when `false`, skip ALL of them; never create, update, or delete
|
|
29
|
+
`crews/{name}/state.json`.
|
|
30
|
+
|
|
31
|
+
> **Note on language**: the section headers below (`## Estilo de Escrita`, `## Design Visual`, etc.) and the `runs.md` table columns (`Data | Run ID | Tema | ...`) are fixed PT-BR structural labels, not translated per Output Language — opencrew's primary supported audience is PT-BR (see AGENTS.md → Language Handling). Only the *content* written under these headers follows the user's preferred language.
|
|
17
32
|
|
|
18
33
|
1b. **Memory format migration** — After loading `memories.md`, check whether it uses the new format by scanning for the `## Estilo de Escrita` section header:
|
|
19
34
|
```bash
|
|
@@ -76,8 +91,8 @@ Before starting execution:
|
|
|
76
91
|
- If it does (sub-second collision), append `-2`, `-3`, etc. until the folder does not exist
|
|
77
92
|
- Create the folder using Bash: `mkdir -p crews/{name}/output/{run_id}`
|
|
78
93
|
- Store `run_id` in working memory for this run — it will be used for ALL output paths
|
|
79
|
-
6. **Initialize state.json
|
|
80
|
-
- **IMPORTANT**:
|
|
94
|
+
6. **Initialize state.json** (only if `dashboard_enabled` — see step 1a; otherwise skip this entire step, including all sub-steps below):
|
|
95
|
+
- **IMPORTANT**: When enabled, write to `crews/{name}/state.json` before every step and after every handoff, as described throughout this document. When `dashboard_enabled` is false, never create, write, or delete this file.
|
|
81
96
|
- Create `state.json` from scratch:
|
|
82
97
|
a. Read `crews/{name}/crew-party.csv` — for each agent row (skip header), extract:
|
|
83
98
|
- `id`: take the `path` column, strip `./agents/` prefix and `.agent.md` suffix
|
|
@@ -270,7 +285,7 @@ Apply this transformation consistently for every write in this step.
|
|
|
270
285
|
|
|
271
286
|
### For each pipeline step:
|
|
272
287
|
|
|
273
|
-
0. **Update dashboard**
|
|
288
|
+
0. **Update dashboard** (only if `dashboard_enabled`; otherwise skip to step 1). Write `crews/{name}/state.json` using the Write tool. Use this content:
|
|
274
289
|
```json
|
|
275
290
|
{
|
|
276
291
|
"crew": "{crew code from crew.yaml}",
|
|
@@ -458,7 +473,8 @@ When a step has `on_reject: {step-id}`:
|
|
|
458
473
|
|
|
459
474
|
### Dashboard Handoff (between steps)
|
|
460
475
|
|
|
461
|
-
|
|
476
|
+
Only if `dashboard_enabled` (otherwise skip this entire section). After a step
|
|
477
|
+
completes output and there IS a next step:
|
|
462
478
|
|
|
463
479
|
1. **Write delivering state** — Write `crews/{name}/state.json` with:
|
|
464
480
|
- Current step's agent: `"status": "delivering"`
|
|
@@ -489,13 +505,13 @@ After a step completes output and there IS a next step (MANDATORY):
|
|
|
489
505
|
For reference, the complete execution order for each pipeline step is:
|
|
490
506
|
|
|
491
507
|
```
|
|
492
|
-
0. Dashboard update (state.json)
|
|
508
|
+
0. Dashboard update (state.json) — only if dashboard_enabled
|
|
493
509
|
1. Pre-Step Input Validation (bash gate)
|
|
494
510
|
2. Read step file
|
|
495
511
|
3. Check execution mode and execute (subagent / inline / checkpoint)
|
|
496
512
|
4. Post-Step Output Validation (bash gate)
|
|
497
513
|
5. Veto Condition Enforcement
|
|
498
|
-
6. Dashboard Handoff (to next step)
|
|
514
|
+
6. Dashboard Handoff (to next step) — only if dashboard_enabled
|
|
499
515
|
```
|
|
500
516
|
|
|
501
517
|
Steps 1 and 4 are binary bash gates. If either fails, the pipeline does NOT advance — the user is consulted.
|
|
@@ -504,7 +520,7 @@ Steps 1 and 4 are binary bash gates. If either fails, the pipeline does NOT adva
|
|
|
504
520
|
|
|
505
521
|
1. Save final output to `crews/{name}/output/{run_id}/{filename}.md`
|
|
506
522
|
(The run folder was created during initialization — no separate date subfolder needed)
|
|
507
|
-
1b. **Update dashboard**
|
|
523
|
+
1b. **Update dashboard** (only if `dashboard_enabled`; otherwise skip to step 2 below). Write `crews/{name}/state.json` with:
|
|
508
524
|
- `"status": "completed"`
|
|
509
525
|
- All agents: `"status": "done"`
|
|
510
526
|
- `"updatedAt"`: now
|
|
@@ -512,7 +528,7 @@ Steps 1 and 4 are binary bash gates. If either fails, the pipeline does NOT adva
|
|
|
512
528
|
- `"startedAt"`: preserve from existing `state.json`
|
|
513
529
|
- Keep existing `"handoff"` object
|
|
514
530
|
|
|
515
|
-
### Post-Completion Cleanup
|
|
531
|
+
### Post-Completion Cleanup (only if `dashboard_enabled`)
|
|
516
532
|
|
|
517
533
|
After writing the final "completed" state to `crews/{name}/state.json`:
|
|
518
534
|
|
|
@@ -521,13 +537,12 @@ After writing the final "completed" state to `crews/{name}/state.json`:
|
|
|
521
537
|
```bash
|
|
522
538
|
cp crews/{name}/state.json crews/{name}/output/{run_id}/state.json
|
|
523
539
|
```
|
|
524
|
-
3.
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
```
|
|
540
|
+
3. Leave the working copy of `crews/{name}/state.json` in place — do not delete it and
|
|
541
|
+
do not add an artificial delay. A dashboard watching the file already sees the
|
|
542
|
+
"completed" status the moment it's written; the next run's initialization (step 6)
|
|
543
|
+
overwrites this file from scratch. There is nothing to clean up.
|
|
529
544
|
|
|
530
|
-
This archives the run state for the `runs` command while keeping
|
|
545
|
+
This archives the run state for the `runs` command while keeping crew history available.
|
|
531
546
|
|
|
532
547
|
2. **Update crew memory** — write to BOTH files (runs after Post-Completion Cleanup above):
|
|
533
548
|
|
|
@@ -12,9 +12,19 @@ You are the Skills Engine. Your job is to manage skill integrations for opencrew
|
|
|
12
12
|
## File Locations
|
|
13
13
|
|
|
14
14
|
- **Installed skills**: `skills/` — each skill in its own subdirectory with SKILL.md
|
|
15
|
-
- **Skill catalog**: `
|
|
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`
|
|
16
18
|
- **Skill format reference**: `skills/opencrew-skill-creator/references/skill-format.md`
|
|
17
19
|
|
|
20
|
+
### Catalog URL Resolution
|
|
21
|
+
|
|
22
|
+
When fetching skill files from the catalog, resolve the base URL in this order:
|
|
23
|
+
1. Read `skills/catalog.json` (installed locally during init/update) → use its `baseUrl` field
|
|
24
|
+
2. If not available, default to:
|
|
25
|
+
`https://raw.githubusercontent.com/alberthpalhares/opencrew/main/templates/skills`
|
|
26
|
+
3. Append `/<name>/SKILL.md` (or other file paths) to the base URL
|
|
27
|
+
|
|
18
28
|
## How Skills Are Detected
|
|
19
29
|
|
|
20
30
|
A skill is installed if and only if `skills/<name>/SKILL.md` exists.
|
|
@@ -96,9 +106,18 @@ For the full SKILL.md specification, see `skills/opencrew-skill-creator/referenc
|
|
|
96
106
|
|
|
97
107
|
1. User provides a skill name (or selects from the catalog).
|
|
98
108
|
|
|
99
|
-
2. **
|
|
109
|
+
2. **Resolve the catalog base URL** (see Catalog URL Resolution above).
|
|
110
|
+
|
|
111
|
+
3. **Validate minimum version** (if catalog.json available):
|
|
112
|
+
- Check `catalog.json` → `skills.<name>.minVersion`
|
|
113
|
+
- Compare against the installed opencrew version (from `_opencrew/.opencrew-version`)
|
|
114
|
+
- If installed version < minVersion → **ERROR**: "Skill '{name}' requires opencrew
|
|
115
|
+
v{minVersion} or newer. You have v{installed}. Run `npx @aksp/opencrew update`
|
|
116
|
+
to upgrade."
|
|
117
|
+
|
|
118
|
+
4. **Fetch SKILL.md from catalog**:
|
|
100
119
|
```
|
|
101
|
-
|
|
120
|
+
{baseUrl}/<name>/SKILL.md
|
|
102
121
|
```
|
|
103
122
|
- If fetch fails (404 or network error) → **ERROR**: "Skill '<name>' not found in the skills catalog."
|
|
104
123
|
- Do NOT proceed if the SKILL.md cannot be fetched.
|
|
@@ -112,7 +131,7 @@ For the full SKILL.md specification, see `skills/opencrew-skill-creator/referenc
|
|
|
112
131
|
|
|
113
132
|
5. **Fetch additional files** (if the skill requires them):
|
|
114
133
|
- If the SKILL.md frontmatter has `script.path` → fetch the script file from:
|
|
115
|
-
`
|
|
134
|
+
`{baseUrl}/<name>/{script.path}`
|
|
116
135
|
Create subdirectories (e.g., `scripts/`) as needed.
|
|
117
136
|
- If the skill has a `references/` directory mentioned → fetch those files too.
|
|
118
137
|
- If the skill has an `assets/` directory mentioned → fetch those files too.
|
|
@@ -345,11 +364,16 @@ When the Architect reaches Phase 3.5 during crew creation:
|
|
|
345
364
|
to get name, description, type, and categories.
|
|
346
365
|
|
|
347
366
|
2. **Fetch the catalog index**:
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
367
|
+
a. First, try to read `skills/catalog.json` (installed locally). If it exists:
|
|
368
|
+
- Parse the JSON and extract the `skills` map and `baseUrl`
|
|
369
|
+
- Use this for discovery (skip the network fetch below)
|
|
370
|
+
b. If `skills/catalog.json` does NOT exist (pre-v1.1 install), fall back to fetching
|
|
371
|
+
the catalog README from GitHub:
|
|
372
|
+
```
|
|
373
|
+
https://raw.githubusercontent.com/alberthpalhares/opencrew/main/templates/skills/README.md
|
|
374
|
+
```
|
|
375
|
+
Parse the markdown table to extract skill names, types, and descriptions.
|
|
376
|
+
c. If both fail → proceed with only installed skills (do not block crew creation).
|
|
353
377
|
|
|
354
378
|
3. **Analyze crew requirements**:
|
|
355
379
|
From the discovery phase answers (Phase 1), identify what the crew needs:
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Catálogo de Skills — opencrew
|
|
2
|
+
|
|
3
|
+
Este é o índice de skills disponíveis no catálogo oficial do opencrew. O Skills Engine
|
|
4
|
+
(`_opencrew/core/skills.engine.md`) lê este arquivo durante a descoberta de skills (Operação 7)
|
|
5
|
+
e busca `SKILL.md` de cada uma via `https://raw.githubusercontent.com/alberthpalhares/opencrew/main/templates/skills/<name>/SKILL.md`
|
|
6
|
+
para instalação (Operação 2).
|
|
7
|
+
|
|
8
|
+
| Skill | Tipo | Descrição |
|
|
9
|
+
|-------|------|-----------|
|
|
10
|
+
| `apify` | mcp | Plataforma de web scraping e automação. Extrai dados de qualquer site usando Actors prontos da Apify Store. |
|
|
11
|
+
| `blotato` | mcp | Publicação e agendamento em redes sociais (Instagram, LinkedIn, Twitter/X, TikTok, YouTube). |
|
|
12
|
+
| `canva` | mcp | Cria, busca, preenche e exporta designs do Canva (autenticação via OAuth). |
|
|
13
|
+
| `image-ai-generator` | script | Gera imagens via API do OpenRouter (modo teste barato + modo produção de alta qualidade). |
|
|
14
|
+
| `image-creator` | mcp | Renderiza HTML/CSS em imagens pixel-perfect via Playwright. Motor genérico para qualquer formato visual. |
|
|
15
|
+
| `image-fetcher` | hybrid | Obtém assets visuais de múltiplas fontes: busca na web, screenshots via Playwright, arquivos do usuário. |
|
|
16
|
+
| `instagram-publisher` | script | Publica carrosséis do Instagram a partir de imagens locais via imgBB + Graph API. |
|
|
17
|
+
| `opencrew-best-practice-creator` | prompt | Guia a criação e manutenção de arquivos de best-practice na biblioteca do opencrew. |
|
|
18
|
+
| `opencrew-skill-creator` | prompt | Cria, edita e avalia (evals/benchmark) skills do opencrew de qualquer tipo. |
|
|
19
|
+
| `resend` | mcp | Envio de emails pelo servidor MCP oficial da Resend (individual, lote, anexos, agendamento). |
|
|
20
|
+
| `template-designer` | prompt | Seleção de template visual para agentes de design — gera variações, renderiza e salva a identidade aprovada. |
|
|
21
|
+
|
|
22
|
+
Para instalar qualquer uma delas dentro da sua IDE: `/opencrew install <nome>`.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1",
|
|
3
|
+
"baseUrl": "https://raw.githubusercontent.com/alberthpalhares/opencrew/main/templates/skills",
|
|
4
|
+
"skills": {
|
|
5
|
+
"apify": {
|
|
6
|
+
"type": "mcp",
|
|
7
|
+
"description": "Plataforma de web scraping e automação. Extrai dados de qualquer site usando Actors prontos da Apify Store.",
|
|
8
|
+
"minVersion": "1.0.0"
|
|
9
|
+
},
|
|
10
|
+
"blotato": {
|
|
11
|
+
"type": "mcp",
|
|
12
|
+
"description": "Publicação e agendamento em redes sociais (Instagram, LinkedIn, Twitter/X, TikTok, YouTube).",
|
|
13
|
+
"minVersion": "1.0.0"
|
|
14
|
+
},
|
|
15
|
+
"canva": {
|
|
16
|
+
"type": "mcp",
|
|
17
|
+
"description": "Cria, busca, preenche e exporta designs do Canva (autenticação via OAuth).",
|
|
18
|
+
"minVersion": "1.0.0"
|
|
19
|
+
},
|
|
20
|
+
"image-ai-generator": {
|
|
21
|
+
"type": "script",
|
|
22
|
+
"description": "Gera imagens via API do OpenRouter (modo teste barato + modo produção de alta qualidade).",
|
|
23
|
+
"minVersion": "1.0.0"
|
|
24
|
+
},
|
|
25
|
+
"image-creator": {
|
|
26
|
+
"type": "mcp",
|
|
27
|
+
"description": "Renderiza HTML/CSS em imagens pixel-perfect via Playwright. Motor genérico para qualquer formato visual.",
|
|
28
|
+
"minVersion": "1.0.0"
|
|
29
|
+
},
|
|
30
|
+
"image-fetcher": {
|
|
31
|
+
"type": "hybrid",
|
|
32
|
+
"description": "Obtém assets visuais de múltiplas fontes: busca na web, screenshots via Playwright, arquivos do usuário.",
|
|
33
|
+
"minVersion": "1.0.0"
|
|
34
|
+
},
|
|
35
|
+
"instagram-publisher": {
|
|
36
|
+
"type": "script",
|
|
37
|
+
"description": "Publica carrosséis do Instagram a partir de imagens locais via imgBB + Graph API.",
|
|
38
|
+
"minVersion": "1.0.0"
|
|
39
|
+
},
|
|
40
|
+
"opencrew-best-practice-creator": {
|
|
41
|
+
"type": "prompt",
|
|
42
|
+
"description": "Guia a criação e manutenção de arquivos de best-practice na biblioteca do opencrew.",
|
|
43
|
+
"minVersion": "1.0.0"
|
|
44
|
+
},
|
|
45
|
+
"opencrew-skill-creator": {
|
|
46
|
+
"type": "prompt",
|
|
47
|
+
"description": "Cria, edita e avalia (evals/benchmark) skills do opencrew de qualquer tipo.",
|
|
48
|
+
"minVersion": "1.0.0"
|
|
49
|
+
},
|
|
50
|
+
"resend": {
|
|
51
|
+
"type": "mcp",
|
|
52
|
+
"description": "Envio de emails pelo servidor MCP oficial da Resend (individual, lote, anexos, agendamento).",
|
|
53
|
+
"minVersion": "1.0.0"
|
|
54
|
+
},
|
|
55
|
+
"template-designer": {
|
|
56
|
+
"type": "prompt",
|
|
57
|
+
"description": "Seleção de template visual para agentes de design — gera variações, renderiza e salva a identidade aprovada.",
|
|
58
|
+
"minVersion": "1.0.0"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -41,7 +41,7 @@ Use the Instagram Publisher when you need to publish carousel posts directly to
|
|
|
41
41
|
|
|
42
42
|
1. List JPEG files in `crews/{crew}/output/images/` sorted by name.
|
|
43
43
|
If no files found: stop and ask the user to add images before continuing.
|
|
44
|
-
2. Present the image list to the user
|
|
44
|
+
2. Present the image list to the user to confirm order (use your IDE's native interactive-choice mechanism if it has one; otherwise a numbered list).
|
|
45
45
|
3. Extract the caption from the content draft:
|
|
46
46
|
- Use the hook slide text + CTA slide text
|
|
47
47
|
- Max 2200 characters (Instagram limit)
|