maestro-skills 0.1.1 → 0.1.2
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/README.md +11 -291
- package/{packages/maestro-skills/bin → bin}/cli.js +2 -2
- package/{packages/rodovalhofs-maestro/lib → lib}/paths.js +25 -4
- package/{packages/maestro-skills/lib → lib}/run-manifest.js +10 -2
- package/lib/setup.js +130 -0
- package/package.json +48 -35
- package/.github/workflows/ci.yml +0 -26
- package/.github/workflows/publish-npm.yml +0 -30
- package/CONTRIBUTING.md +0 -31
- package/LICENSE +0 -21
- package/SECURITY.md +0 -33
- package/docs/github-workflow.md +0 -96
- package/docs/maestro-skills-cli.md +0 -113
- package/packages/maestro-skills/README.md +0 -37
- package/packages/maestro-skills/lib/paths.js +0 -42
- package/packages/maestro-skills/lib/setup.js +0 -115
- package/packages/maestro-skills/package.json +0 -47
- package/packages/maestro-skills/test/agents.test.js +0 -17
- package/packages/rodovalhofs-maestro/agents.json +0 -36
- package/packages/rodovalhofs-maestro/bin/cli.js +0 -10
- package/packages/rodovalhofs-maestro/lib/detect-agents.js +0 -28
- package/packages/rodovalhofs-maestro/lib/install.js +0 -58
- package/packages/rodovalhofs-maestro/lib/remove.js +0 -71
- package/packages/rodovalhofs-maestro/lib/run-manifest.js +0 -92
- package/packages/rodovalhofs-maestro/lib/setup.js +0 -115
- package/packages/rodovalhofs-maestro/package.json +0 -33
- package/scripts/sync-skill-to-cli.mjs +0 -75
- package/scripts/sync-templates.ps1 +0 -22
- package/templates/.github/ISSUE_TEMPLATE/bug_report.yml +0 -34
- package/templates/.github/ISSUE_TEMPLATE/chore.yml +0 -17
- package/templates/.github/ISSUE_TEMPLATE/config.yml +0 -1
- package/templates/.github/ISSUE_TEMPLATE/feature_request.yml +0 -27
- package/templates/.github/workflows/ci-failure-to-issue.yml +0 -47
- package/templates/.github/workflows/ci.yml +0 -27
- package/templates/CONTRIBUTING.md +0 -22
- package/templates/labels.json +0 -12
- package/templates/pull_request_template.md +0 -18
- package/tests/fixtures/sample-manifest.json +0 -76
- package/tests/test_concept_gaps.py +0 -63
- package/tests/test_maestro_paths.py +0 -29
- package/tests/test_search_routing.py +0 -161
- /package/{packages/maestro-skills/agents.json → agents.json} +0 -0
- /package/{packages/maestro-skills/lib → lib}/detect-agents.js +0 -0
- /package/{packages/maestro-skills/lib → lib}/install.js +0 -0
- /package/{packages/maestro-skills/lib → lib}/remove.js +0 -0
- /package/{skills/maestro → skill}/SKILL.md +0 -0
- /package/{skills/maestro → skill}/maestro-exclude.example.txt +0 -0
- /package/{skills/maestro → skill}/scripts/bm25.py +0 -0
- /package/{skills/maestro → skill}/scripts/build_manifest.py +0 -0
- /package/{skills/maestro → skill}/scripts/concept_gaps.py +0 -0
- /package/{skills/maestro → skill}/scripts/domains.py +0 -0
- /package/{skills/maestro → skill}/scripts/intents.py +0 -0
- /package/{skills/maestro → skill}/scripts/maestro_paths.py +0 -0
- /package/{skills/maestro → skill}/scripts/route_tasks.py +0 -0
- /package/{skills/maestro → skill}/scripts/routing.py +0 -0
- /package/{skills/maestro → skill}/scripts/search_skills.py +0 -0
- /package/{skills/maestro → skill}/scripts/synonyms.py +0 -0
package/README.md
CHANGED
|
@@ -1,300 +1,20 @@
|
|
|
1
|
-
#
|
|
1
|
+
# maestro-skills
|
|
2
2
|
|
|
3
|
-
[
|
|
4
|
-
[](LICENSE)
|
|
5
|
-
|
|
6
|
-
**Maestro** é um meta-orquestrador de skills para agentes de IA (Cursor, Claude Code, Codex e outros). Você descreve a tarefa; ele descobre quais skills locais usar, monta um **grafo de dependências editável**, pede sua confirmação e só então dispara subagentes com os `SKILL.md` certos.
|
|
7
|
-
|
|
8
|
-
Se faltar skill no ecossistema (ex.: `skeleton-loader`), o Maestro abre o ramo **Discover** via [find-skills](https://skills.sh/) (`npx skills find`), instala, regenera o índice e roteia de novo.
|
|
9
|
-
|
|
10
|
-
> Motor **local e rápido** (BM25 + manifest JSON) — sem re-scan do filesystem a cada busca.
|
|
11
|
-
> Inspirado em ideias de [task-skill-router](https://github.com/wcqxgjy6d8-pixel/task-skill-router).
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## O que o Maestro faz (e o que não faz)
|
|
16
|
-
|
|
17
|
-
| Faz | Não faz |
|
|
18
|
-
|-----|---------|
|
|
19
|
-
| Analisa seu prompt e busca skills **já instaladas** | Implementar código por conta própria |
|
|
20
|
-
| Monta um grafo de nós (pesquisa → implementação → CI…) | Spawnar subagentes sem você confirmar o grafo |
|
|
21
|
-
| Detecta **lacunas de conceito** (`skeleton-loader`, libs citadas no prompt) | Substituir o agente principal do Cursor |
|
|
22
|
-
| Sugere instalar skills via `npx skills find` quando necessário | Enviar dados para servidores externos |
|
|
23
|
-
| Roteia com prioridade **P0–P3** (auto-load vs recomendar) | Ignorar tarefas de alto risco (deploy, secrets) sem confirmação |
|
|
24
|
-
|
|
25
|
-
### Em uma frase
|
|
26
|
-
|
|
27
|
-
O Maestro responde: *“Para esta tarefa, quais skills devo usar, em que ordem, e preciso instalar algo novo?”*
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## Fluxo completo
|
|
32
|
-
|
|
33
|
-
```text
|
|
34
|
-
Seu prompt
|
|
35
|
-
│
|
|
36
|
-
▼
|
|
37
|
-
build_manifest.py ← índice local (~/.maestro/skills-manifest.json)
|
|
38
|
-
│
|
|
39
|
-
▼
|
|
40
|
-
search_skills.py ← BM25 + intents + sinônimos + concept gaps
|
|
41
|
-
│
|
|
42
|
-
├─ match forte, sem lacunas
|
|
43
|
-
│ └─► Grafo único → você confirma → subagentes executam
|
|
44
|
-
│
|
|
45
|
-
└─ discover.triggered
|
|
46
|
-
│
|
|
47
|
-
▼
|
|
48
|
-
npx skills find ← pré-busca no ecossistema (skills.sh)
|
|
49
|
-
│
|
|
50
|
-
▼
|
|
51
|
-
Grafo 1 (Discover + fallback local) → você: ok
|
|
52
|
-
│
|
|
53
|
-
▼
|
|
54
|
-
find-skills install + build_manifest.py
|
|
55
|
-
│
|
|
56
|
-
▼
|
|
57
|
-
Grafo 2 (execução) → você: ok
|
|
58
|
-
│
|
|
59
|
-
▼
|
|
60
|
-
subagentes com SKILL.md explícito → síntese final
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Quando o ramo Discover abre
|
|
64
|
-
|
|
65
|
-
| Sinal | Exemplo |
|
|
66
|
-
|-------|---------|
|
|
67
|
-
| `weak_match` | Nenhuma skill local confiável para o prompt |
|
|
68
|
-
| `concept_gap` | *“colocar skeleton-loader na UI”* — termo sem skill local |
|
|
69
|
-
| `force_discover` | *“find a skill for changelog”*, `npx skills find` |
|
|
70
|
-
| `single_local_skill` | Só um candidato local e score baixo |
|
|
71
|
-
|
|
72
|
-
Máximo de **2** gaps por prompt; extras viram nota no grafo para você editar.
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## Instalação
|
|
77
|
-
|
|
78
|
-
### Opção A — `npx maestro-skills setup` (recomendado)
|
|
79
|
-
|
|
80
|
-
Setup interativo — escolha agentes e escopo (global ou projeto).
|
|
81
|
-
|
|
82
|
-
**Se `npx maestro-skills` retornar 404**, o pacote ainda não está no npm registry — use o GitHub (funciona agora):
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
npx github:rodovalhofs/maestro maestro-skills setup
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
**Após publicação no npm** (v0.1.1+):
|
|
3
|
+
CLI de instalação interativa do [Maestro](https://github.com/rodovalhofs/maestro).
|
|
89
4
|
|
|
90
5
|
```bash
|
|
91
6
|
npx maestro-skills setup
|
|
92
7
|
```
|
|
93
8
|
|
|
94
|
-
|
|
95
|
-
|--------|-------|------|
|
|
96
|
-
| Cursor | `~/.cursor/skills/maestro` | `--cursor` |
|
|
97
|
-
| Claude Code | `~/.claude/skills/maestro` | `--claude` |
|
|
98
|
-
| Codex | `~/.codex/skills/maestro` | `--codex` |
|
|
99
|
-
| Universal | `~/.agents/skills/maestro` | `--universal` |
|
|
100
|
-
|
|
101
|
-
Exemplos:
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
npx maestro-skills setup --codex --cursor -y # Codex + Cursor, sem prompts
|
|
105
|
-
npx maestro-skills setup --project # só o repo atual
|
|
106
|
-
npx @rodovalhofs/maestro setup # fallback (bin curto)
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
Documentação completa: [docs/maestro-skills-cli.md](docs/maestro-skills-cli.md)
|
|
110
|
-
|
|
111
|
-
### Opção B — `npx skills add` (catálogo skills.sh)
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
npx skills add rodovalhofs/maestro --skill maestro -g -a cursor -a codex -y
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### Opção C — Git clone (manual)
|
|
118
|
-
|
|
119
|
-
```powershell
|
|
120
|
-
# Windows
|
|
121
|
-
git clone https://github.com/rodovalhofs/maestro.git
|
|
122
|
-
Copy-Item -Recurse -Force maestro\skills\maestro $env:USERPROFILE\.cursor\skills\maestro
|
|
123
|
-
# ou: $env:USERPROFILE\.codex\skills\maestro
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
```bash
|
|
127
|
-
# macOS / Linux
|
|
128
|
-
git clone https://github.com/rodovalhofs/maestro.git
|
|
129
|
-
cp -r maestro/skills/maestro ~/.cursor/skills/maestro
|
|
130
|
-
# ou: ~/.codex/skills/maestro
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### Pós-instalação (obrigatório)
|
|
134
|
-
|
|
135
|
-
Indexe suas skills locais (todos os agentes):
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
# Windows
|
|
139
|
-
py -3 %USERPROFILE%\.cursor\skills\maestro\scripts\build_manifest.py --project-root .
|
|
140
|
-
|
|
141
|
-
# macOS / Linux
|
|
142
|
-
python3 ~/.cursor/skills/maestro/scripts/build_manifest.py --project-root .
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
Manifest gerado em `~/.maestro/skills-manifest.json`.
|
|
146
|
-
|
|
147
|
-
### Opcional — excluir skills da busca
|
|
148
|
-
|
|
149
|
-
```bash
|
|
150
|
-
cp ~/.cursor/skills/maestro/maestro-exclude.example.txt ~/.cursor/maestro-exclude.txt
|
|
151
|
-
# edite o arquivo e regenere o manifest
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
## Pré-requisitos
|
|
157
|
-
|
|
158
|
-
| Ferramenta | Obrigatório | Uso |
|
|
159
|
-
|------------|-------------|-----|
|
|
160
|
-
| **Cursor** | Sim | Agent skills em `~/.cursor/skills` e/ou `~/.agents/skills` |
|
|
161
|
-
| **Python 3.12+** | Sim | Scripts de busca e manifest (mesma versão do CI) |
|
|
162
|
-
| **Node.js** | Para Discover | `npx skills find` / `npx skills add` no ramo find-skills |
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## Uso no Cursor
|
|
167
|
-
|
|
168
|
-
Invoque com **`$maestro`** ou **`/maestro`** + sua tarefa:
|
|
169
|
-
|
|
170
|
-
```text
|
|
171
|
-
$maestro criar dashboard de vendas com React e gráficos
|
|
172
|
-
$maestro vamos colocar skeleton-loader na tela de produtos
|
|
173
|
-
$maestro corrigir CI quebrado no PR #42
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
O agente segue o `SKILL.md` do Maestro: busca → grafo editável → confirmação → execução.
|
|
177
|
-
|
|
178
|
-
### Ferramentas CLI (uso direto ou debug)
|
|
179
|
-
|
|
180
|
-
**1. Regenerar manifest**
|
|
181
|
-
|
|
182
|
-
```bash
|
|
183
|
-
py -3 ~/.cursor/skills/maestro/scripts/build_manifest.py --project-root /caminho/do/projeto
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
**2. Buscar skills para um prompt**
|
|
187
|
-
|
|
188
|
-
```bash
|
|
189
|
-
py -3 ~/.cursor/skills/maestro/scripts/search_skills.py "criar dashboard react" --json
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
Campos úteis no JSON:
|
|
193
|
-
|
|
194
|
-
| Campo | Significado |
|
|
195
|
-
|-------|-------------|
|
|
196
|
-
| `results` | Skills locais ranqueadas (score, confidence, path) |
|
|
197
|
-
| `routing` | `P0`–`P3` e decisão (`auto-load`, `recommend`, `bypass`) |
|
|
198
|
-
| `discover` | `triggered`, `reasons`, `gaps`, `queries`, `local_fallback` |
|
|
199
|
-
| `weak_match` | Match local fraco — pode pedir domínio ou Discover |
|
|
200
|
-
|
|
201
|
-
**3. Rotear sub-tarefas (grafo decomposto)**
|
|
202
|
-
|
|
203
|
-
```bash
|
|
204
|
-
printf '%s\n' "design UI" "fix CI" | py -3 ~/.cursor/skills/maestro/scripts/route_tasks.py --json
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
**Domínios** (`--domain`): `web`, `data-viz`, `analytics`, `design`, `creative`, `devops-git`, `video-media`, `integrations`, `security`, `meta`, `general`.
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
## Exemplos de comportamento
|
|
212
|
-
|
|
213
|
-
### Tarefa com skill local clara
|
|
214
|
-
|
|
215
|
-
```text
|
|
216
|
-
Prompt: corrigir CI quebrado no PR
|
|
217
|
-
→ discover.triggered: false
|
|
218
|
-
→ top: gh-fix-ci, github
|
|
219
|
-
→ Grafo: 1 nó → você confirma → subagente executa
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### Conceito sem skill local
|
|
223
|
-
|
|
224
|
-
```text
|
|
225
|
-
Prompt: vamos colocar skeleton-loader na UI
|
|
226
|
-
→ discover.triggered: true (concept_gap: skeleton-loader)
|
|
227
|
-
→ npx skills find "skeleton-loader ui web"
|
|
228
|
-
→ Grafo 1 com Discover → install → Grafo 2 → implementação
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
### Descoberta explícita
|
|
232
|
-
|
|
233
|
-
```text
|
|
234
|
-
Prompt: find a skill for changelog
|
|
235
|
-
→ discover.triggered: true (force_discover)
|
|
236
|
-
→ find-skills busca no skills.sh
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
---
|
|
240
|
-
|
|
241
|
-
## O que há neste repositório
|
|
242
|
-
|
|
243
|
-
| Pasta | Conteúdo |
|
|
244
|
-
|-------|----------|
|
|
245
|
-
| `skills/maestro/` | Skill Cursor + scripts Python (`search_skills`, `concept_gaps`, …) |
|
|
246
|
-
| `tests/` | 18+ testes do motor de busca |
|
|
247
|
-
| `docs/` | Fluxo GitHub genérico (Issues + PR + CI) |
|
|
248
|
-
| `templates/` | Issue templates, PR template e workflows para copiar em outros projetos |
|
|
249
|
-
|
|
250
|
-
```text
|
|
251
|
-
maestro/
|
|
252
|
-
├── .github/workflows/ci.yml
|
|
253
|
-
├── skills/maestro/
|
|
254
|
-
│ ├── SKILL.md ← regras do orquestrador
|
|
255
|
-
│ ├── maestro-exclude.example.txt
|
|
256
|
-
│ └── scripts/
|
|
257
|
-
│ ├── build_manifest.py
|
|
258
|
-
│ ├── search_skills.py
|
|
259
|
-
│ ├── concept_gaps.py
|
|
260
|
-
│ ├── route_tasks.py
|
|
261
|
-
│ └── …
|
|
262
|
-
├── tests/
|
|
263
|
-
├── docs/github-workflow.md
|
|
264
|
-
└── templates/
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
## Testes
|
|
270
|
-
|
|
271
|
-
```bash
|
|
272
|
-
py -3 -m unittest discover -s tests -v
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
---
|
|
276
|
-
|
|
277
|
-
## Templates GitHub
|
|
278
|
-
|
|
279
|
-
Copie workflows e templates de Issue/PR para outro repositório:
|
|
280
|
-
|
|
281
|
-
```powershell
|
|
282
|
-
# Atenção: sobrescreve .github/ no destino
|
|
283
|
-
.\scripts\sync-templates.ps1 -TargetRepo "C:\caminho\do\seu\projeto"
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
Detalhes: [docs/github-workflow.md](docs/github-workflow.md)
|
|
287
|
-
|
|
288
|
-
---
|
|
289
|
-
|
|
290
|
-
## Contribuir
|
|
291
|
-
|
|
292
|
-
Veja [CONTRIBUTING.md](CONTRIBUTING.md). Issues e PRs são bem-vindos.
|
|
293
|
-
|
|
294
|
-
## Segurança
|
|
9
|
+
[](https://www.npmjs.com/package/maestro-skills)
|
|
295
10
|
|
|
296
|
-
|
|
11
|
+
## Agentes
|
|
297
12
|
|
|
298
|
-
|
|
13
|
+
| Agente | Flag |
|
|
14
|
+
|--------|------|
|
|
15
|
+
| Cursor | `--cursor` |
|
|
16
|
+
| Claude Code | `--claude` |
|
|
17
|
+
| Codex | `--codex` |
|
|
18
|
+
| Universal | `--universal` |
|
|
299
19
|
|
|
300
|
-
[
|
|
20
|
+
Docs: [maestro-skills-cli.md](../../docs/maestro-skills-cli.md)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { runRemove } from "../lib/remove.js";
|
|
4
4
|
import { runSetup } from "../lib/setup.js";
|
|
@@ -8,7 +8,7 @@ const program = new Command();
|
|
|
8
8
|
program
|
|
9
9
|
.name("maestro-skills")
|
|
10
10
|
.description("Install and configure the Maestro skill orchestrator for multiple AI agents")
|
|
11
|
-
.version("0.1.
|
|
11
|
+
.version("0.1.2");
|
|
12
12
|
|
|
13
13
|
program
|
|
14
14
|
.command("setup")
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
|
-
import { dirname, join } from "node:path";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
|
|
6
6
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
const PACKAGE_ROOT =
|
|
7
|
+
const PACKAGE_ROOT = resolve(__dirname, "..");
|
|
8
8
|
|
|
9
9
|
export function getMaestroHome() {
|
|
10
10
|
return process.env.MAESTRO_HOME || join(homedir(), ".maestro");
|
|
@@ -33,8 +33,29 @@ export function resolveSkillsDir(agent, { project = false, cwd = process.cwd() }
|
|
|
33
33
|
return join(base, rel);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
/** Resolve bundled skill folder (works for npm pack and monorepo-root publish). */
|
|
36
37
|
export function skillSourceDir() {
|
|
37
|
-
|
|
38
|
+
const candidates = [];
|
|
39
|
+
|
|
40
|
+
let dir = PACKAGE_ROOT;
|
|
41
|
+
for (let i = 0; i < 5; i++) {
|
|
42
|
+
candidates.push(
|
|
43
|
+
join(dir, "skill"),
|
|
44
|
+
join(dir, "skills", "maestro"),
|
|
45
|
+
);
|
|
46
|
+
dir = resolve(dir, "..");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
for (const candidate of candidates) {
|
|
50
|
+
if (existsSync(join(candidate, "SKILL.md"))) {
|
|
51
|
+
return candidate;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
throw new Error(
|
|
56
|
+
`Skill source not found (expected SKILL.md under ${join(PACKAGE_ROOT, "skill")}). ` +
|
|
57
|
+
"Reinstall with: npx maestro-skills@latest setup",
|
|
58
|
+
);
|
|
38
59
|
}
|
|
39
60
|
|
|
40
61
|
export function bundledBuildManifest() {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
3
4
|
import { bundledBuildManifest, getMaestroPaths } from "./paths.js";
|
|
4
5
|
|
|
5
6
|
function pythonCommand() {
|
|
@@ -14,8 +15,15 @@ function pythonCommand() {
|
|
|
14
15
|
return null;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
|
-
export function runBuildManifest({
|
|
18
|
-
|
|
18
|
+
export function runBuildManifest({
|
|
19
|
+
projectRoot = process.cwd(),
|
|
20
|
+
quiet = false,
|
|
21
|
+
installedSkillPath = null,
|
|
22
|
+
} = {}) {
|
|
23
|
+
let script = bundledBuildManifest();
|
|
24
|
+
if (!existsSync(script) && installedSkillPath) {
|
|
25
|
+
script = join(installedSkillPath, "scripts", "build_manifest.py");
|
|
26
|
+
}
|
|
19
27
|
if (!existsSync(script)) {
|
|
20
28
|
return { ok: false, error: `build_manifest.py not found at ${script}` };
|
|
21
29
|
}
|
package/lib/setup.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { detectAgents, filterAgentsByFlags } from "./detect-agents.js";
|
|
3
|
+
import {
|
|
4
|
+
copySkillTo,
|
|
5
|
+
migrateLegacyFiles,
|
|
6
|
+
saveSetupConfig,
|
|
7
|
+
} from "./install.js";
|
|
8
|
+
import { getMaestroPaths } from "./paths.js";
|
|
9
|
+
import { registerOnSkillsSh, runBuildManifest } from "./run-manifest.js";
|
|
10
|
+
|
|
11
|
+
export async function runSetup(options) {
|
|
12
|
+
const project = Boolean(options.project);
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
|
|
15
|
+
p.intro(project ? "Maestro setup (this project)" : "Maestro setup (global)");
|
|
16
|
+
|
|
17
|
+
let agents = detectAgents({ project, cwd });
|
|
18
|
+
agents = filterAgentsByFlags(agents, options);
|
|
19
|
+
|
|
20
|
+
if (!options.cursor && !options.claude && !options.codex && !options.universal && !options.yes) {
|
|
21
|
+
p.note(
|
|
22
|
+
"↑↓ navegar · Espaço selecionar/desmarcar · Enter confirmar",
|
|
23
|
+
"Atalhos do teclado",
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const selected = await p.multiselect({
|
|
27
|
+
message: "Which agents should receive the Maestro skill?",
|
|
28
|
+
options: agents.map((a) => ({
|
|
29
|
+
value: a.id,
|
|
30
|
+
label: a.label,
|
|
31
|
+
hint: a.detected ? `${a.skillsPath} (detected)` : a.skillsPath,
|
|
32
|
+
})),
|
|
33
|
+
required: true,
|
|
34
|
+
initialValues: [],
|
|
35
|
+
});
|
|
36
|
+
if (p.isCancel(selected)) {
|
|
37
|
+
p.cancel("Setup cancelled.");
|
|
38
|
+
process.exit(0);
|
|
39
|
+
}
|
|
40
|
+
agents = agents.filter((a) => selected.includes(a.id));
|
|
41
|
+
} else if (options.cursor || options.claude || options.codex || options.universal) {
|
|
42
|
+
agents = filterAgentsByFlags(agents, options);
|
|
43
|
+
} else if (options.yes) {
|
|
44
|
+
agents = agents.filter((a) => a.detected);
|
|
45
|
+
if (!agents.length) agents = detectAgents({ project, cwd });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (!agents.length) {
|
|
49
|
+
p.cancel("No agents selected.");
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
let registerSkillsSh = false;
|
|
54
|
+
if (!options.yes && !options.noSkillsRegistry) {
|
|
55
|
+
const reg = await p.confirm({
|
|
56
|
+
message: "Register install on skills.sh via npx skills add? (optional telemetry)",
|
|
57
|
+
initialValue: false,
|
|
58
|
+
});
|
|
59
|
+
if (p.isCancel(reg)) {
|
|
60
|
+
p.cancel("Setup cancelled.");
|
|
61
|
+
process.exit(0);
|
|
62
|
+
}
|
|
63
|
+
registerSkillsSh = Boolean(reg);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const spinner = p.spinner();
|
|
67
|
+
const installed = [];
|
|
68
|
+
|
|
69
|
+
for (const agent of agents) {
|
|
70
|
+
spinner.start(`Installing Maestro for ${agent.label}…`);
|
|
71
|
+
try {
|
|
72
|
+
const dest = copySkillTo(agent.skillsPath);
|
|
73
|
+
installed.push({ id: agent.id, label: agent.label, path: dest });
|
|
74
|
+
spinner.stop(`Installed → ${dest}`);
|
|
75
|
+
} catch (err) {
|
|
76
|
+
spinner.stop(`Failed for ${agent.label}`);
|
|
77
|
+
p.log.error(String(err.message || err));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!installed.length) {
|
|
82
|
+
p.cancel("Setup failed — Maestro skill was not installed for any agent.");
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const migrated = migrateLegacyFiles();
|
|
87
|
+
if (migrated.length) {
|
|
88
|
+
p.log.info(`Migrated legacy files: ${migrated.join(", ")}`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
spinner.start("Building skills manifest…");
|
|
92
|
+
const manifestResult = runBuildManifest({
|
|
93
|
+
projectRoot: cwd,
|
|
94
|
+
quiet: true,
|
|
95
|
+
installedSkillPath: installed[0]?.path,
|
|
96
|
+
});
|
|
97
|
+
if (manifestResult.ok) {
|
|
98
|
+
spinner.stop(manifestResult.message);
|
|
99
|
+
} else {
|
|
100
|
+
spinner.stop("Manifest build failed");
|
|
101
|
+
p.log.warn(manifestResult.error);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (registerSkillsSh) {
|
|
105
|
+
spinner.start("Registering on skills.sh…");
|
|
106
|
+
const reg = await registerOnSkillsSh(agents, { yes: options.yes });
|
|
107
|
+
if (reg.ok && !reg.skipped) spinner.stop("Registered on skills.sh");
|
|
108
|
+
else if (!reg.ok) {
|
|
109
|
+
spinner.stop("skills.sh registration skipped");
|
|
110
|
+
p.log.warn(reg.error);
|
|
111
|
+
} else spinner.stop("No skills CLI agents selected");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const paths = getMaestroPaths();
|
|
115
|
+
saveSetupConfig({
|
|
116
|
+
version: 1,
|
|
117
|
+
installedAt: new Date().toISOString(),
|
|
118
|
+
scope: project ? "project" : "global",
|
|
119
|
+
projectRoot: project ? cwd : null,
|
|
120
|
+
agents: installed,
|
|
121
|
+
maestroHome: paths.home,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
p.note(
|
|
125
|
+
installed.map((i) => `${i.label}\n ${i.path}`).join("\n\n"),
|
|
126
|
+
"Installed paths",
|
|
127
|
+
);
|
|
128
|
+
p.outro("Maestro setup complete. Invoke with $maestro or /maestro in your agent.");
|
|
129
|
+
}
|
|
130
|
+
|
package/package.json
CHANGED
|
@@ -1,35 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "maestro-skills",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Interactive setup for the Maestro skill orchestrator (multi-agent)",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"author": "Yuri Rodovalho",
|
|
7
|
-
"repository": {
|
|
8
|
-
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/rodovalhofs/maestro.git"
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "maestro-skills",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Interactive setup for the Maestro skill orchestrator (multi-agent)",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Yuri Rodovalho",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/rodovalhofs/maestro.git",
|
|
10
|
+
"directory": "packages/maestro-skills"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/rodovalhofs/maestro#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/rodovalhofs/maestro/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"maestro",
|
|
18
|
+
"cursor",
|
|
19
|
+
"claude",
|
|
20
|
+
"codex",
|
|
21
|
+
"agent-skills",
|
|
22
|
+
"skills",
|
|
23
|
+
"orchestrator"
|
|
24
|
+
],
|
|
25
|
+
"type": "module",
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
},
|
|
29
|
+
"bin": {
|
|
30
|
+
"maestro-skills": "./bin/cli.js"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"bin",
|
|
34
|
+
"lib",
|
|
35
|
+
"skill",
|
|
36
|
+
"agents.json",
|
|
37
|
+
"README.md"
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"prepack": "node ../../scripts/sync-skill-to-cli.mjs",
|
|
41
|
+
"prepublishOnly": "node -e \"const fs=require('fs'); if(!fs.existsSync('skill/SKILL.md')){console.error('Missing skill/ — run sync-skill-to-cli'); process.exit(1)}\"",
|
|
42
|
+
"test": "node --test test/"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@clack/prompts": "^0.10.1",
|
|
46
|
+
"commander": "^13.1.0"
|
|
47
|
+
}
|
|
48
|
+
}
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [main]
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
test:
|
|
11
|
-
name: Testes maestro
|
|
12
|
-
runs-on: ubuntu-latest
|
|
13
|
-
steps:
|
|
14
|
-
- uses: actions/checkout@v4
|
|
15
|
-
- uses: actions/setup-python@v5
|
|
16
|
-
with:
|
|
17
|
-
python-version: "3.12"
|
|
18
|
-
- uses: actions/setup-node@v4
|
|
19
|
-
with:
|
|
20
|
-
node-version: "20"
|
|
21
|
-
- run: node scripts/sync-skill-to-cli.mjs
|
|
22
|
-
- run: python -m unittest discover -s tests -v
|
|
23
|
-
- run: npm install
|
|
24
|
-
working-directory: packages/maestro-skills
|
|
25
|
-
- run: npm test
|
|
26
|
-
working-directory: packages/maestro-skills
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
name: Publish npm
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
release:
|
|
5
|
-
types: [published]
|
|
6
|
-
workflow_dispatch:
|
|
7
|
-
|
|
8
|
-
jobs:
|
|
9
|
-
publish:
|
|
10
|
-
runs-on: ubuntu-latest
|
|
11
|
-
permissions:
|
|
12
|
-
contents: read
|
|
13
|
-
id-token: write
|
|
14
|
-
steps:
|
|
15
|
-
- uses: actions/checkout@v4
|
|
16
|
-
- uses: actions/setup-node@v4
|
|
17
|
-
with:
|
|
18
|
-
node-version: "20"
|
|
19
|
-
registry-url: "https://registry.npmjs.org"
|
|
20
|
-
- run: node scripts/sync-skill-to-cli.mjs
|
|
21
|
-
- run: npm ci
|
|
22
|
-
working-directory: packages/maestro-skills
|
|
23
|
-
- run: npm publish --access public
|
|
24
|
-
working-directory: packages/maestro-skills
|
|
25
|
-
env:
|
|
26
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
27
|
-
- run: npm publish --access public
|
|
28
|
-
working-directory: packages/rodovalhofs-maestro
|
|
29
|
-
env:
|
|
30
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|