@aksp/opencrew 1.0.1 → 1.1.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 +29 -0
- package/README.md +16 -0
- package/package.json +2 -2
- 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 +31 -4
- package/templates/_opencrew/_memory/preferences.md +1 -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,35 @@
|
|
|
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.1.0] — 2026-08-01
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
- **Skill catalog URLs**: `/opencrew install` now fetches skills from the correct fork
|
|
10
|
+
(`alberthpalhares/opencrew/templates/skills/`) instead of the upstream OpenSquad repo.
|
|
11
|
+
- **Publish workflow**: restored `push: tags` as the sole trigger — the actual release
|
|
12
|
+
flow is `npm version` + `git push --tags`, not GitHub Releases. Documented in
|
|
13
|
+
`CONTRIBUTING.md`.
|
|
14
|
+
- **Cross-platform test script**: replaced shell glob (`tests/*.test.js`) with an
|
|
15
|
+
explicit file list so `npm test` works on Windows PowerShell + Node 20.
|
|
16
|
+
- **CI matrix**: test suite now runs on Ubuntu and Windows on every push/PR.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- **Test suite**: 30 tests (`node:test`) covering `fsx.js`, init, update, IDE bridge
|
|
20
|
+
validation, and documentation contracts.
|
|
21
|
+
- **CI version-sync check**: `scripts/check-version-sync.js` fails the build if
|
|
22
|
+
`.opencrew-version` drifts from `package.json`.
|
|
23
|
+
- **Playwright plugin warning**: `init` now warns Claude Code users to disable the
|
|
24
|
+
native Playwright extension (opencrew ships its own via `.mcp.json`).
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- **Dashboard opt-in**: Pipeline Runner `state.json` writes are now gated on
|
|
28
|
+
`Dashboard: enabled` in `preferences.md` (default: disabled). Removed the
|
|
29
|
+
unconditional 10-second sleep at the end of every pipeline run.
|
|
30
|
+
- **Smaller fixes**: removed `AskUserQuestion` references from IDE-neutral files,
|
|
31
|
+
corrected `update.js` comment about overwrite behavior, pinned `@playwright/mcp`
|
|
32
|
+
version, removed stale root `skills/` directory (drifted duplicate of
|
|
33
|
+
`templates/skills/`).
|
|
34
|
+
|
|
6
35
|
## [1.0.1] — 2026-08-01
|
|
7
36
|
|
|
8
37
|
### Changed
|
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# opencrew
|
|
2
2
|
|
|
3
|
+
[](https://github.com/alberthpalhares/opencrew/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/@aksp/opencrew)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
3
7
|
**Crie equipes de agentes de IA que trabalham juntos — direto na sua IDE.**
|
|
4
8
|
|
|
5
9
|
> 🇧🇷 This README is in Brazilian Portuguese (PT-BR), the project's primary audience. If
|
|
@@ -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 |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aksp/opencrew",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
],
|
|
20
20
|
"scripts": {
|
|
21
21
|
"start": "node bin/opencrew.js",
|
|
22
|
-
"test": "node --test tests
|
|
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
23
|
"version": "node -e \"require('fs').writeFileSync('templates/_opencrew/.opencrew-version', require('./package.json').version + '\\n')\""
|
|
24
24
|
},
|
|
25
25
|
"keywords": [
|
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
|
|
@@ -84,8 +84,28 @@ When running a crew:
|
|
|
84
84
|
3. For each agent in the party CSV, also read their full `.agent.md` file from agents/ directory
|
|
85
85
|
4. Load company context from `_opencrew/_memory/company.md`
|
|
86
86
|
5. Load crew memory from `crews/{name}/_memory/memories.md`
|
|
87
|
-
6.
|
|
88
|
-
7.
|
|
87
|
+
6. Load user preferences from `_opencrew/_memory/preferences.md` (used to check the Dashboard toggle — see below)
|
|
88
|
+
7. Read the pipeline runner instructions from `_opencrew/core/runner.pipeline.md`
|
|
89
|
+
8. Execute the pipeline step by step following runner instructions
|
|
90
|
+
|
|
91
|
+
## Dashboard (Optional)
|
|
92
|
+
|
|
93
|
+
opencrew ships an optional visual dashboard — a self-contained HTML file
|
|
94
|
+
(`dashboard/index.html`) that shows a crew run in progress as an animated
|
|
95
|
+
virtual office. It is **disabled by default** and most installs never use it,
|
|
96
|
+
so the Pipeline Runner does not write `state.json` unless the user has turned
|
|
97
|
+
it on.
|
|
98
|
+
|
|
99
|
+
- To use: open `dashboard/index.html` in a browser and point it at the
|
|
100
|
+
`crews/{name}/state.json` written during a run.
|
|
101
|
+
- Toggle: `Dashboard: enabled` (or `disabled`) in `_opencrew/_memory/preferences.md`,
|
|
102
|
+
editable via `/opencrew settings`.
|
|
103
|
+
- When disabled (default): the runner never creates, writes, or deletes `state.json`.
|
|
104
|
+
- When enabled: the runner writes `crews/{name}/state.json` before each step and at
|
|
105
|
+
every handoff, exactly as described in `_opencrew/core/runner.pipeline.md`.
|
|
106
|
+
- The dashboard auto-polls `state.json` every 1.5 seconds when in live mode;
|
|
107
|
+
it also includes a built-in demo mode so you can see what it looks like
|
|
108
|
+
without running a real crew.
|
|
89
109
|
|
|
90
110
|
## Language Handling
|
|
91
111
|
|
|
@@ -93,6 +113,13 @@ When running a crew:
|
|
|
93
113
|
- All user-facing output should be in the user's preferred language
|
|
94
114
|
- Internal file names and code remain in English
|
|
95
115
|
- Agent personas communicate in the user's language
|
|
116
|
+
- **Exception — crew memory scaffolding stays in PT-BR regardless of Output Language.**
|
|
117
|
+
The section headers in `crews/{name}/_memory/memories.md` (e.g. `## Estilo de Escrita`)
|
|
118
|
+
and the table columns in `crews/{name}/_memory/runs.md` (e.g. `Data | Run ID | Tema`) are
|
|
119
|
+
fixed structural labels, not generated prose — see `_opencrew/core/runner.pipeline.md`.
|
|
120
|
+
opencrew's primary supported audience is PT-BR (see README), so these are intentionally
|
|
121
|
+
not localized per-user. Only the *content* written into those sections follows the
|
|
122
|
+
user's Output Language.
|
|
96
123
|
|
|
97
124
|
## Critical Rules
|
|
98
125
|
|
|
@@ -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)
|