@eximia-ventures/claude-code-toolkit 4.0.0 → 5.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/README.md +216 -29
- package/assets/skill/aios-bootstrap.md +506 -0
- package/assets/skill/aios-epic.md +308 -0
- package/assets/skill/aios-help.md +507 -0
- package/assets/skill/aios-integrate.md +104 -0
- package/assets/skill/aios-publish.md +373 -0
- package/assets/skill/aios-qa.md +425 -0
- package/assets/skill/aios-story.md +398 -0
- package/package.json +1 -1
- package/src/commands/doctor.js +11 -8
- package/src/commands/update.js +1 -1
- package/src/installer.js +27 -20
- package/src/modules/aios.js +40 -21
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
# /aios-story — Operações de Story AIOS
|
|
2
|
+
|
|
3
|
+
Você é um assistente especializado em gerenciar o ciclo de vida de stories no AIOS Framework.
|
|
4
|
+
|
|
5
|
+
## Instruções
|
|
6
|
+
|
|
7
|
+
Quando o usuário executar `/aios-story`, apresente o menu principal:
|
|
8
|
+
|
|
9
|
+
### Menu Principal
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
📋 AIOS Story Manager
|
|
13
|
+
|
|
14
|
+
Escolha uma operação:
|
|
15
|
+
|
|
16
|
+
1. Criar nova story
|
|
17
|
+
2. Validar story
|
|
18
|
+
3. Desenvolver story
|
|
19
|
+
4. QA Gate
|
|
20
|
+
5. Ver status de uma story
|
|
21
|
+
6. Próxima ação (auto-detectar)
|
|
22
|
+
|
|
23
|
+
0. Sair
|
|
24
|
+
|
|
25
|
+
Digite o número da opção:
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Aguarde a resposta do usuário antes de prosseguir.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Opção 1: Criar Nova Story (@sm)
|
|
33
|
+
|
|
34
|
+
### Wizard de Criação
|
|
35
|
+
|
|
36
|
+
1. **Pergunte o contexto:**
|
|
37
|
+
```
|
|
38
|
+
📝 Criar Nova Story
|
|
39
|
+
|
|
40
|
+
Preciso de algumas informações:
|
|
41
|
+
|
|
42
|
+
1. Qual é o Epic ID ou caminho do PRD?
|
|
43
|
+
(ex: epic-001, docs/prd/meu-prd.md)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
2. **Busque stories existentes:**
|
|
47
|
+
- Procure em `docs/stories/` por stories já criadas para este epic
|
|
48
|
+
- Liste as existentes:
|
|
49
|
+
```
|
|
50
|
+
Stories existentes para este epic:
|
|
51
|
+
1. 1.1.story.md — Setup inicial (Done)
|
|
52
|
+
2. 1.2.story.md — Auth module (InProgress)
|
|
53
|
+
3. 1.3.story.md — API endpoints (Ready)
|
|
54
|
+
|
|
55
|
+
A próxima story será: 1.4.story.md
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
3. **Confirme antes de criar:**
|
|
59
|
+
```
|
|
60
|
+
Confirmar criação?
|
|
61
|
+
Epic: {epic-id}
|
|
62
|
+
Story: {next-number}
|
|
63
|
+
Base: PRD/Epic acima
|
|
64
|
+
|
|
65
|
+
(s/n)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
4. **Execute:**
|
|
69
|
+
- Ative o agent @sm
|
|
70
|
+
- Leia e siga a task `.aios-core/development/tasks/create-next-story.md`
|
|
71
|
+
- Execute conforme definido na task
|
|
72
|
+
|
|
73
|
+
5. **Relatório:**
|
|
74
|
+
```
|
|
75
|
+
✅ Story criada com sucesso!
|
|
76
|
+
|
|
77
|
+
Arquivo: docs/stories/{epicNum}.{storyNum}.story.md
|
|
78
|
+
Status: Draft
|
|
79
|
+
Próximo passo: Validar com /aios-story → opção 2
|
|
80
|
+
|
|
81
|
+
Deseja voltar ao menu principal? (s/n)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Opção 2: Validar Story (@po)
|
|
87
|
+
|
|
88
|
+
### Wizard de Validação
|
|
89
|
+
|
|
90
|
+
1. **Liste stories em Draft:**
|
|
91
|
+
```
|
|
92
|
+
📋 Stories disponíveis para validação (status: Draft):
|
|
93
|
+
|
|
94
|
+
1. 1.4.story.md — {título}
|
|
95
|
+
2. 2.1.story.md — {título}
|
|
96
|
+
|
|
97
|
+
Selecione o número da story (ou 0 para voltar):
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
2. **Se nenhuma story Draft encontrada:**
|
|
101
|
+
```
|
|
102
|
+
ℹ️ Nenhuma story com status Draft encontrada.
|
|
103
|
+
|
|
104
|
+
Dica: Use a opção 1 para criar uma nova story primeiro.
|
|
105
|
+
|
|
106
|
+
Voltando ao menu principal...
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
3. **Execute a validação:**
|
|
110
|
+
- Ative o agent @po
|
|
111
|
+
- Leia e siga a task `.aios-core/development/tasks/validate-next-story.md`
|
|
112
|
+
- Aplique o checklist de 10 pontos:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
🔍 Validação — Checklist 10 Pontos
|
|
116
|
+
|
|
117
|
+
1. ☐ Título claro e objetivo
|
|
118
|
+
2. ☐ Descrição completa (problema/necessidade)
|
|
119
|
+
3. ☐ Critérios de aceite testáveis (Given/When/Then)
|
|
120
|
+
4. ☐ Escopo bem definido (IN e OUT)
|
|
121
|
+
5. ☐ Dependências mapeadas
|
|
122
|
+
6. ☐ Estimativa de complexidade
|
|
123
|
+
7. ☐ Valor de negócio claro
|
|
124
|
+
8. ☐ Riscos documentados
|
|
125
|
+
9. ☐ Critérios de Done definidos
|
|
126
|
+
10. ☐ Alinhamento com PRD/Epic
|
|
127
|
+
|
|
128
|
+
Avaliando...
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
4. **Resultado:**
|
|
132
|
+
```
|
|
133
|
+
📊 Resultado da Validação
|
|
134
|
+
|
|
135
|
+
Story: {story-file}
|
|
136
|
+
Score: {N}/10
|
|
137
|
+
Veredicto: {GO ✅ | NO-GO ❌}
|
|
138
|
+
|
|
139
|
+
Detalhes:
|
|
140
|
+
✅ 1. Título claro e objetivo
|
|
141
|
+
✅ 2. Descrição completa
|
|
142
|
+
❌ 3. AC não testáveis — faltam Given/When/Then
|
|
143
|
+
...
|
|
144
|
+
|
|
145
|
+
{Se GO}: Status atualizado: Draft → Ready
|
|
146
|
+
{Se NO-GO}: Correções necessárias:
|
|
147
|
+
- Item 3: Reescrever AC no formato Given/When/Then
|
|
148
|
+
- Item 8: Adicionar seção de riscos
|
|
149
|
+
|
|
150
|
+
Deseja voltar ao menu principal? (s/n)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Opção 3: Desenvolver Story (@dev)
|
|
156
|
+
|
|
157
|
+
### Wizard de Desenvolvimento
|
|
158
|
+
|
|
159
|
+
1. **Liste stories Ready:**
|
|
160
|
+
```
|
|
161
|
+
🚀 Stories disponíveis para desenvolvimento (status: Ready):
|
|
162
|
+
|
|
163
|
+
1. 1.3.story.md — {título}
|
|
164
|
+
2. 1.4.story.md — {título}
|
|
165
|
+
|
|
166
|
+
Selecione o número da story (ou 0 para voltar):
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
2. **Selecione o modo de execução:**
|
|
170
|
+
```
|
|
171
|
+
⚙️ Modo de Execução
|
|
172
|
+
|
|
173
|
+
1. Interactive (default) — Confirmações em pontos-chave (5-10 prompts)
|
|
174
|
+
2. YOLO — Autônomo, decisões logadas (0-1 prompts)
|
|
175
|
+
3. Pre-Flight — Perguntas upfront, execução zero-ambiguidade (10-15 prompts)
|
|
176
|
+
|
|
177
|
+
Selecione o modo:
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
3. **Confirme:**
|
|
181
|
+
```
|
|
182
|
+
Confirmar desenvolvimento?
|
|
183
|
+
Story: {story-file}
|
|
184
|
+
Modo: {modo selecionado}
|
|
185
|
+
Agent: @dev
|
|
186
|
+
|
|
187
|
+
(s/n)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
4. **Execute:**
|
|
191
|
+
- Ative o agent @dev
|
|
192
|
+
- Leia e siga a task `.aios-core/development/tasks/dev-develop-story.md`
|
|
193
|
+
- Atualize status: Ready → InProgress
|
|
194
|
+
- Execute no modo selecionado
|
|
195
|
+
- Aplique CodeRabbit self-healing se configurado (max 2 iterações)
|
|
196
|
+
|
|
197
|
+
5. **Relatório:**
|
|
198
|
+
```
|
|
199
|
+
✅ Desenvolvimento concluído!
|
|
200
|
+
|
|
201
|
+
Story: {story-file}
|
|
202
|
+
Status: InProgress
|
|
203
|
+
Modo: {modo}
|
|
204
|
+
Arquivos modificados: {N}
|
|
205
|
+
CodeRabbit: {N} issues auto-corrigidas
|
|
206
|
+
|
|
207
|
+
Próximo passo: QA Gate com /aios-story → opção 4
|
|
208
|
+
|
|
209
|
+
Deseja voltar ao menu principal? (s/n)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Opção 4: QA Gate (@qa)
|
|
215
|
+
|
|
216
|
+
### Wizard de QA
|
|
217
|
+
|
|
218
|
+
1. **Liste stories InProgress:**
|
|
219
|
+
```
|
|
220
|
+
🔍 Stories disponíveis para QA (status: InProgress):
|
|
221
|
+
|
|
222
|
+
1. 1.3.story.md — {título}
|
|
223
|
+
|
|
224
|
+
Selecione o número da story (ou 0 para voltar):
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
2. **Execute o QA Gate:**
|
|
228
|
+
- Ative o agent @qa
|
|
229
|
+
- Leia e siga a task `.aios-core/development/tasks/qa-gate.md`
|
|
230
|
+
- Execute os 7 checks:
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
🏥 QA Gate — 7 Quality Checks
|
|
234
|
+
|
|
235
|
+
1. ☐ Code review (padrões, legibilidade, manutenibilidade)
|
|
236
|
+
2. ☐ Unit tests (cobertura adequada, todos passando)
|
|
237
|
+
3. ☐ Acceptance criteria (todos atendidos)
|
|
238
|
+
4. ☐ No regressions (funcionalidade existente preservada)
|
|
239
|
+
5. ☐ Performance (dentro dos limites aceitáveis)
|
|
240
|
+
6. ☐ Security (OWASP básico verificado)
|
|
241
|
+
7. ☐ Documentation (atualizada se necessário)
|
|
242
|
+
|
|
243
|
+
Executando verificações...
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
3. **Resultado:**
|
|
247
|
+
```
|
|
248
|
+
📊 Resultado do QA Gate
|
|
249
|
+
|
|
250
|
+
Story: {story-file}
|
|
251
|
+
Veredicto: {PASS ✅ | CONCERNS ⚠️ | FAIL ❌ | WAIVED 🟡}
|
|
252
|
+
|
|
253
|
+
Checks:
|
|
254
|
+
✅ 1. Code review — OK
|
|
255
|
+
✅ 2. Unit tests — 95% cobertura, todos passando
|
|
256
|
+
✅ 3. Acceptance criteria — 5/5 atendidos
|
|
257
|
+
✅ 4. No regressions — OK
|
|
258
|
+
⚠️ 5. Performance — query lenta detectada (não bloqueante)
|
|
259
|
+
✅ 6. Security — OWASP OK
|
|
260
|
+
✅ 7. Documentation — README atualizado
|
|
261
|
+
|
|
262
|
+
{Se PASS}: Status atualizado: InProgress → InReview → Done
|
|
263
|
+
{Se CONCERNS}: Aprovado com observações documentadas
|
|
264
|
+
{Se FAIL}: Retornar para @dev com feedback específico
|
|
265
|
+
{Se WAIVED}: Aprovado com waiver documentado
|
|
266
|
+
|
|
267
|
+
Issues encontradas: {N}
|
|
268
|
+
- [MEDIUM] Query N+1 em listUsers (documentado como tech debt)
|
|
269
|
+
|
|
270
|
+
Deseja voltar ao menu principal? (s/n)
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Opção 5: Ver Status de uma Story
|
|
276
|
+
|
|
277
|
+
### Wizard de Status
|
|
278
|
+
|
|
279
|
+
1. **Pergunte o caminho:**
|
|
280
|
+
```
|
|
281
|
+
📄 Ver Status da Story
|
|
282
|
+
|
|
283
|
+
Informe o caminho da story:
|
|
284
|
+
(ex: docs/stories/1.3.story.md)
|
|
285
|
+
|
|
286
|
+
Ou digite "listar" para ver todas as stories disponíveis.
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
2. **Se "listar":**
|
|
290
|
+
- Busque todos os arquivos `*.story.md` em `docs/stories/`
|
|
291
|
+
- Mostre lista numerada para seleção
|
|
292
|
+
|
|
293
|
+
3. **Leia e exiba o status:**
|
|
294
|
+
```
|
|
295
|
+
📊 Status da Story
|
|
296
|
+
|
|
297
|
+
Arquivo: {path}
|
|
298
|
+
Título: {título}
|
|
299
|
+
Status: {status} {emoji}
|
|
300
|
+
Epic: {epic-ref}
|
|
301
|
+
|
|
302
|
+
Acceptance Criteria:
|
|
303
|
+
✅ AC1 — {descrição}
|
|
304
|
+
☐ AC2 — {descrição}
|
|
305
|
+
☐ AC3 — {descrição}
|
|
306
|
+
|
|
307
|
+
Fase Atual: {fase no ciclo}
|
|
308
|
+
Próximo Passo: {ação sugerida}
|
|
309
|
+
|
|
310
|
+
Histórico:
|
|
311
|
+
- Draft (criado em {data})
|
|
312
|
+
- Ready (validado em {data})
|
|
313
|
+
- InProgress (desde {data})
|
|
314
|
+
|
|
315
|
+
Deseja voltar ao menu principal? (s/n)
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Opção 6: Próxima Ação (Auto-Detectar)
|
|
321
|
+
|
|
322
|
+
### Wizard de Auto-Detecção
|
|
323
|
+
|
|
324
|
+
1. **Busque a story ativa mais recente:**
|
|
325
|
+
- Procure stories com status InProgress, Ready, ou Draft (nessa ordem de prioridade)
|
|
326
|
+
- Se múltiplas, pegue a mais recente
|
|
327
|
+
|
|
328
|
+
2. **Analise e sugira:**
|
|
329
|
+
```
|
|
330
|
+
🎯 Próxima Ação Sugerida
|
|
331
|
+
|
|
332
|
+
Story detectada: {story-file}
|
|
333
|
+
Status atual: {status}
|
|
334
|
+
|
|
335
|
+
Sugestão: {ação baseada no status}
|
|
336
|
+
- Draft → "Validar esta story (opção 2)"
|
|
337
|
+
- Ready → "Iniciar desenvolvimento (opção 3)"
|
|
338
|
+
- InProgress → "Executar QA Gate (opção 4)"
|
|
339
|
+
- InReview → "Aguardando push pelo @devops"
|
|
340
|
+
- Done → "Criar próxima story (opção 1)"
|
|
341
|
+
|
|
342
|
+
Deseja executar a ação sugerida? (s/n)
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
3. **Se sim:** Execute a opção correspondente
|
|
346
|
+
4. **Se não:** Volte ao menu principal
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Regras Gerais
|
|
351
|
+
|
|
352
|
+
### Navegação
|
|
353
|
+
- Após cada operação, sempre pergunte se quer voltar ao menu principal
|
|
354
|
+
- "0" em qualquer menu volta ao menu anterior
|
|
355
|
+
- Nunca execute ações destrutivas sem confirmação
|
|
356
|
+
|
|
357
|
+
### Tasks AIOS
|
|
358
|
+
Todas as operações devem referenciar e seguir as tasks oficiais em `.aios-core/development/tasks/`:
|
|
359
|
+
- `create-next-story.md` — criação de story
|
|
360
|
+
- `validate-next-story.md` — validação com checklist 10 pontos
|
|
361
|
+
- `dev-develop-story.md` — desenvolvimento com modos
|
|
362
|
+
- `qa-gate.md` — QA gate com 7 checks
|
|
363
|
+
- `story-checkpoint.md` — checkpoint entre operações
|
|
364
|
+
- `next.md` — detecção de próxima ação
|
|
365
|
+
|
|
366
|
+
### Agents
|
|
367
|
+
Cada operação ativa o agent correto:
|
|
368
|
+
- Criar → @sm (Scrum Master)
|
|
369
|
+
- Validar → @po (Product Owner)
|
|
370
|
+
- Desenvolver → @dev (Developer)
|
|
371
|
+
- QA Gate → @qa (QA Engineer)
|
|
372
|
+
|
|
373
|
+
### Story Lifecycle
|
|
374
|
+
Respeite a progressão de status:
|
|
375
|
+
```
|
|
376
|
+
Draft → Ready → InProgress → InReview → Done
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
Nunca pule fases. Se uma story está em Draft, ela precisa ser validada antes de ser desenvolvida.
|
|
380
|
+
|
|
381
|
+
### Feedback Visual
|
|
382
|
+
- Use emojis consistentes para status: ✅ Done, 🚀 InProgress, 📋 Ready, 📝 Draft, ❌ Fail
|
|
383
|
+
- Mostre progresso durante operações longas
|
|
384
|
+
- Sempre exiba relatório ao final de cada operação
|
|
385
|
+
|
|
386
|
+
### Sugestões Contextuais
|
|
387
|
+
|
|
388
|
+
Ao final de cada operação, além de perguntar se quer voltar ao menu, sugira skills relacionadas:
|
|
389
|
+
|
|
390
|
+
| Após operação | Sugerir |
|
|
391
|
+
|---------------|---------|
|
|
392
|
+
| Criar story (opção 1) | "Dica: Use `/aios-story` opção 2 para validar a story criada" |
|
|
393
|
+
| Validar story GO (opção 2) | "Dica: Use `/aios-story` opção 3 para iniciar o desenvolvimento" |
|
|
394
|
+
| Validar story NO-GO (opção 2) | "Dica: Corrija os itens e execute `/aios-story` opção 2 novamente" |
|
|
395
|
+
| Desenvolver story (opção 3) | "Dica: Use `/aios-qa` opção 1 para um quick scan, ou `/aios-story` opção 4 para QA Gate formal" |
|
|
396
|
+
| QA Gate PASS (opção 4) | "Dica: Use `/aios-publish` opção 3 para pre-push quality gate" |
|
|
397
|
+
| QA Gate FAIL (opção 4) | "Dica: Use `/aios-qa` opção 3 (QA Loop) para iterar fix → re-review" |
|
|
398
|
+
| Perdido | "Dica: Use `/aios-help` para ver todos os comandos disponíveis" |
|
package/package.json
CHANGED
package/src/commands/doctor.js
CHANGED
|
@@ -123,14 +123,17 @@ async function runDoctor() {
|
|
|
123
123
|
check('AIOS Core instalado no projeto', true);
|
|
124
124
|
ok++;
|
|
125
125
|
|
|
126
|
-
// Check
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
126
|
+
// Check all AIOS skills
|
|
127
|
+
const { SKILLS } = require('../modules/aios');
|
|
128
|
+
for (const skill of SKILLS) {
|
|
129
|
+
const skillPath = path.join(process.cwd(), '.claude', 'commands', skill.src);
|
|
130
|
+
if (await fs.pathExists(skillPath)) {
|
|
131
|
+
check(`Skill ${skill.name} instalada`, true);
|
|
132
|
+
ok++;
|
|
133
|
+
} else {
|
|
134
|
+
check(`Skill ${skill.name} não encontrada`, false);
|
|
135
|
+
issues++;
|
|
136
|
+
}
|
|
134
137
|
}
|
|
135
138
|
} else {
|
|
136
139
|
logger.dim(' - AIOS Core não instalado (opcional)');
|
package/src/commands/update.js
CHANGED
|
@@ -98,7 +98,7 @@ async function updateModule(name, manifest) {
|
|
|
98
98
|
case 'aios': {
|
|
99
99
|
const opts = {
|
|
100
100
|
installAiosCore: manifest.aiosCore || false,
|
|
101
|
-
|
|
101
|
+
installAiosSkills: manifest.aiosSkills || require('../modules/aios').SKILLS.map(s => s.name)
|
|
102
102
|
};
|
|
103
103
|
const result = await modules.aios.module.install(opts);
|
|
104
104
|
return 'updated';
|
package/src/installer.js
CHANGED
|
@@ -95,31 +95,35 @@ async function runInstaller() {
|
|
|
95
95
|
]);
|
|
96
96
|
|
|
97
97
|
if (useAios) {
|
|
98
|
-
const {
|
|
98
|
+
const { SKILLS } = require('./modules/aios');
|
|
99
|
+
|
|
100
|
+
const { installCore } = await inquirer.prompt([
|
|
101
|
+
{
|
|
102
|
+
type: 'confirm',
|
|
103
|
+
name: 'installCore',
|
|
104
|
+
message: 'Instalar/Atualizar AIOS Core?',
|
|
105
|
+
default: false
|
|
106
|
+
}
|
|
107
|
+
]);
|
|
108
|
+
|
|
109
|
+
const { selectedSkills } = await inquirer.prompt([
|
|
99
110
|
{
|
|
100
111
|
type: 'checkbox',
|
|
101
|
-
name: '
|
|
102
|
-
message: 'Selecione as
|
|
103
|
-
choices:
|
|
104
|
-
{
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
name: 'Instalar Skill /aios-integrate (integrar e gerenciar artefatos)',
|
|
111
|
-
value: 'skill',
|
|
112
|
-
checked: false
|
|
113
|
-
}
|
|
114
|
-
]
|
|
112
|
+
name: 'selectedSkills',
|
|
113
|
+
message: 'Selecione as Skills AIOS:',
|
|
114
|
+
choices: SKILLS.map(s => ({
|
|
115
|
+
name: `${s.name.padEnd(18)} — ${s.desc}`,
|
|
116
|
+
value: s.name,
|
|
117
|
+
checked: false
|
|
118
|
+
}))
|
|
115
119
|
}
|
|
116
120
|
]);
|
|
117
121
|
|
|
118
|
-
if (
|
|
122
|
+
if (installCore || selectedSkills.length > 0) {
|
|
119
123
|
selectedModules.push('aios');
|
|
120
124
|
aiosOptions = {
|
|
121
|
-
installAiosCore:
|
|
122
|
-
|
|
125
|
+
installAiosCore: installCore,
|
|
126
|
+
installAiosSkills: selectedSkills
|
|
123
127
|
};
|
|
124
128
|
}
|
|
125
129
|
}
|
|
@@ -174,6 +178,9 @@ async function runInstaller() {
|
|
|
174
178
|
if (aiosOptions.installAiosCore && result.core?.installed) {
|
|
175
179
|
manifest.aiosCore = true;
|
|
176
180
|
}
|
|
181
|
+
if (aiosOptions.installAiosSkills) {
|
|
182
|
+
manifest.aiosSkills = aiosOptions.installAiosSkills;
|
|
183
|
+
}
|
|
177
184
|
}
|
|
178
185
|
|
|
179
186
|
// Save manifest
|
|
@@ -188,8 +195,8 @@ async function runInstaller() {
|
|
|
188
195
|
if (selectedModules.includes('statusline')) {
|
|
189
196
|
logger.info('Reinicie o Claude Code para ver a statusline.');
|
|
190
197
|
}
|
|
191
|
-
if (selectedModules.includes('aios') && aiosOptions.
|
|
192
|
-
logger.info(
|
|
198
|
+
if (selectedModules.includes('aios') && aiosOptions.installAiosSkills?.length > 0) {
|
|
199
|
+
logger.info(`Skills AIOS instaladas: ${aiosOptions.installAiosSkills.join(', ')}`);
|
|
193
200
|
}
|
|
194
201
|
logger.blank();
|
|
195
202
|
}
|
package/src/modules/aios.js
CHANGED
|
@@ -6,7 +6,15 @@ const fs = require('fs-extra');
|
|
|
6
6
|
const { installFile } = require('../utils/file-installer');
|
|
7
7
|
const logger = require('../utils/logger');
|
|
8
8
|
|
|
9
|
-
const
|
|
9
|
+
const SKILLS = [
|
|
10
|
+
{ src: 'aios-integrate.md', name: '/aios-integrate', desc: 'Gerenciar artefatos (agents/squads)' },
|
|
11
|
+
{ src: 'aios-story.md', name: '/aios-story', desc: 'Operações de story (criar, validar, desenvolver, QA)' },
|
|
12
|
+
{ src: 'aios-epic.md', name: '/aios-epic', desc: 'Gestão de epics (criar, executar, status)' },
|
|
13
|
+
{ src: 'aios-qa.md', name: '/aios-qa', desc: 'QA toolkit (scan, gate, loop, testes, security)' },
|
|
14
|
+
{ src: 'aios-publish.md', name: '/aios-publish', desc: 'Release management (version, changelog, publish)' },
|
|
15
|
+
{ src: 'aios-bootstrap.md', name: '/aios-bootstrap', desc: 'Setup de projeto (greenfield, brownfield, team, GitHub)' },
|
|
16
|
+
{ src: 'aios-help.md', name: '/aios-help', desc: 'Guia de comandos AIOS (reference, busca, workflows)' },
|
|
17
|
+
];
|
|
10
18
|
|
|
11
19
|
async function installCore({ targetDir } = {}) {
|
|
12
20
|
const cwd = targetDir || process.cwd();
|
|
@@ -27,25 +35,36 @@ async function installCore({ targetDir } = {}) {
|
|
|
27
35
|
}
|
|
28
36
|
}
|
|
29
37
|
|
|
30
|
-
async function
|
|
38
|
+
async function installSkills({ targetDir, skills } = {}) {
|
|
31
39
|
const cwd = targetDir || process.cwd();
|
|
32
40
|
const commandsDir = path.join(cwd, '.claude', 'commands');
|
|
33
|
-
const dest = path.join(commandsDir, 'aios-integrate.md');
|
|
34
|
-
|
|
35
41
|
await fs.ensureDir(commandsDir);
|
|
36
42
|
|
|
37
|
-
const
|
|
43
|
+
const skillsToInstall = skills
|
|
44
|
+
? SKILLS.filter(s => skills.includes(s.name))
|
|
45
|
+
: SKILLS;
|
|
46
|
+
|
|
47
|
+
const results = [];
|
|
48
|
+
|
|
49
|
+
for (const skill of skillsToInstall) {
|
|
50
|
+
const src = path.join(__dirname, '..', '..', 'assets', 'skill', skill.src);
|
|
51
|
+
const dest = path.join(commandsDir, skill.src);
|
|
52
|
+
|
|
53
|
+
const result = await installFile(src, dest);
|
|
54
|
+
|
|
55
|
+
if (result.action === 'installed') {
|
|
56
|
+
logger.success(`Skill ${skill.name} instalada`);
|
|
57
|
+
} else {
|
|
58
|
+
logger.success(`Skill ${skill.name} já atualizada`);
|
|
59
|
+
}
|
|
38
60
|
|
|
39
|
-
|
|
40
|
-
logger.success('Skill /aios-integrate instalada');
|
|
41
|
-
} else {
|
|
42
|
-
logger.success('Skill /aios-integrate já atualizada');
|
|
61
|
+
results.push({ skill: skill.name, path: dest, action: result.action });
|
|
43
62
|
}
|
|
44
63
|
|
|
45
|
-
return { installed: true,
|
|
64
|
+
return { installed: true, results };
|
|
46
65
|
}
|
|
47
66
|
|
|
48
|
-
async function install({ installAiosCore = true,
|
|
67
|
+
async function install({ installAiosCore = true, installAiosSkills, targetDir } = {}) {
|
|
49
68
|
logger.section('AIOS Framework');
|
|
50
69
|
|
|
51
70
|
const results = {};
|
|
@@ -54,8 +73,8 @@ async function install({ installAiosCore = true, installAiosSkill = true, target
|
|
|
54
73
|
results.core = await installCore({ targetDir });
|
|
55
74
|
}
|
|
56
75
|
|
|
57
|
-
if (
|
|
58
|
-
results.
|
|
76
|
+
if (installAiosSkills && installAiosSkills.length > 0) {
|
|
77
|
+
results.skills = await installSkills({ targetDir, skills: installAiosSkills });
|
|
59
78
|
}
|
|
60
79
|
|
|
61
80
|
return results;
|
|
@@ -65,10 +84,12 @@ async function uninstall({ targetDir } = {}) {
|
|
|
65
84
|
const cwd = targetDir || process.cwd();
|
|
66
85
|
const removed = [];
|
|
67
86
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
await fs.
|
|
71
|
-
|
|
87
|
+
for (const skill of SKILLS) {
|
|
88
|
+
const skillPath = path.join(cwd, '.claude', 'commands', skill.src);
|
|
89
|
+
if (await fs.pathExists(skillPath)) {
|
|
90
|
+
await fs.remove(skillPath);
|
|
91
|
+
removed.push(skillPath);
|
|
92
|
+
}
|
|
72
93
|
}
|
|
73
94
|
|
|
74
95
|
return removed;
|
|
@@ -76,9 +97,7 @@ async function uninstall({ targetDir } = {}) {
|
|
|
76
97
|
|
|
77
98
|
function getManifestEntries({ targetDir } = {}) {
|
|
78
99
|
const cwd = targetDir || process.cwd();
|
|
79
|
-
return
|
|
80
|
-
path.join(cwd, '.claude', 'commands', 'aios-integrate.md')
|
|
81
|
-
];
|
|
100
|
+
return SKILLS.map(s => path.join(cwd, '.claude', 'commands', s.src));
|
|
82
101
|
}
|
|
83
102
|
|
|
84
|
-
module.exports = { install, uninstall, getManifestEntries };
|
|
103
|
+
module.exports = { install, uninstall, getManifestEntries, SKILLS };
|