@eximia-ventures/claude-code-toolkit 3.1.1 → 3.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/assets/skill/aios-integrate.md +84 -0
- package/package.json +1 -1
- package/src/commands/update.js +113 -0
- package/src/index.js +14 -0
|
@@ -83,6 +83,90 @@ Ao finalizar, mostre um relatório:
|
|
|
83
83
|
Manifest atualizado: agents.csv
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
+
#### Auto-Explain: Guia de Uso
|
|
87
|
+
|
|
88
|
+
Imediatamente após exibir o relatório de integração, gere automaticamente um **Guia de Uso** educativo do artefato integrado. O guia é obrigatório — não pergunte ao usuário se deseja; sempre gere.
|
|
89
|
+
|
|
90
|
+
**Regras gerais:**
|
|
91
|
+
1. Sempre em português
|
|
92
|
+
2. Tom educativo e acessível — como se estivesse ensinando alguém a usar pela primeira vez
|
|
93
|
+
3. Máximo ~40 linhas
|
|
94
|
+
4. Use APENAS dados reais extraídos do artefato — nunca invente comandos, campos ou comportamentos
|
|
95
|
+
5. Omita seções para as quais não há dados disponíveis no artefato
|
|
96
|
+
6. Use tabelas markdown para comandos e agents
|
|
97
|
+
|
|
98
|
+
**Para Agent** — gere as seguintes seções (quando os dados existirem):
|
|
99
|
+
|
|
100
|
+
| Seção | O que mostrar | Fonte dos dados |
|
|
101
|
+
|-------|---------------|-----------------|
|
|
102
|
+
| **O que é** | Descrição do papel do agent em 1-2 frases | `persona.role` + `agent.whenToUse` |
|
|
103
|
+
| **Como ativar** | Sintaxe de ativação (`@{id}`) e tom de interação | `agent.id`, `persona_profile.archetype`, `communication.tone` |
|
|
104
|
+
| **Comandos disponíveis** | Tabela com nome, descrição e exemplo de uso | `commands[]` filtrados por `visibility` = `quick` ou `key` |
|
|
105
|
+
| **Quando usar** | Situações práticas em que o agent é útil | `agent.whenToUse` ou inferido de `persona.role` |
|
|
106
|
+
| **Exemplo prático** | Um cenário realista de uso com saudação e primeiro comando | `greeting_levels.named` + primeiro comando disponível |
|
|
107
|
+
| **Dependências** | Contagem por categoria (tasks, templates, checklists) | `dependencies` (se existir) |
|
|
108
|
+
|
|
109
|
+
Formato de saída para Agent:
|
|
110
|
+
```markdown
|
|
111
|
+
## 📖 Guia de Uso: {agent-name}
|
|
112
|
+
|
|
113
|
+
### O que é
|
|
114
|
+
{descrição baseada em persona.role e whenToUse}
|
|
115
|
+
|
|
116
|
+
### Como ativar
|
|
117
|
+
Chame `@{id}` para ativar. {tom de interação baseado em archetype/tone}
|
|
118
|
+
|
|
119
|
+
### Comandos disponíveis
|
|
120
|
+
| Comando | Descrição |
|
|
121
|
+
|---------|-----------|
|
|
122
|
+
| `*{cmd}` | {descrição} |
|
|
123
|
+
|
|
124
|
+
### Quando usar
|
|
125
|
+
{situações práticas}
|
|
126
|
+
|
|
127
|
+
### Exemplo prático
|
|
128
|
+
> Usuário: @{id} olá
|
|
129
|
+
> Agent: {saudação named}
|
|
130
|
+
> Usuário: *{primeiro-comando}
|
|
131
|
+
|
|
132
|
+
### Dependências
|
|
133
|
+
{N} tasks, {N} templates, {N} checklists
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Para Squad** — gere as seguintes seções (quando os dados existirem):
|
|
137
|
+
|
|
138
|
+
| Seção | O que mostrar | Fonte dos dados |
|
|
139
|
+
|-------|---------------|-----------------|
|
|
140
|
+
| **O que é** | Descrição do squad em 1-2 frases | `description` do squad |
|
|
141
|
+
| **Agents incluídos** | Tabela com agent, papel e como ativar | `components.agents[]` |
|
|
142
|
+
| **Comandos disponíveis** | Tabela com comandos usando o prefixo do squad | `components.tasks[]` com `slashPrefix` |
|
|
143
|
+
| **Workflow típico** | Sequência de uso recomendada | Inferido de `components.workflows[]` ou composição dos agents |
|
|
144
|
+
| **Componentes** | Resumo quantitativo | Contagem de agents, tasks, workflows, templates |
|
|
145
|
+
|
|
146
|
+
Formato de saída para Squad:
|
|
147
|
+
```markdown
|
|
148
|
+
## 📖 Guia de Uso: {squad-name}
|
|
149
|
+
|
|
150
|
+
### O que é
|
|
151
|
+
{descrição do squad}
|
|
152
|
+
|
|
153
|
+
### Agents incluídos
|
|
154
|
+
| Agent | Papel | Ativação |
|
|
155
|
+
|-------|-------|----------|
|
|
156
|
+
| {name} | {role} | `@{id}` |
|
|
157
|
+
|
|
158
|
+
### Comandos disponíveis
|
|
159
|
+
| Comando | Descrição |
|
|
160
|
+
|---------|-----------|
|
|
161
|
+
| `/{prefix}-{task}` | {descrição} |
|
|
162
|
+
|
|
163
|
+
### Workflow típico
|
|
164
|
+
{sequência de uso recomendada}
|
|
165
|
+
|
|
166
|
+
### Componentes
|
|
167
|
+
{N} agents, {N} tasks, {N} workflows, {N} templates
|
|
168
|
+
```
|
|
169
|
+
|
|
86
170
|
---
|
|
87
171
|
|
|
88
172
|
### 3. Listar Artefatos Instalados
|
package/package.json
CHANGED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs-extra');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const logger = require('../utils/logger');
|
|
6
|
+
const { MANIFEST_PATH } = require('../installer');
|
|
7
|
+
const modules = require('../modules');
|
|
8
|
+
|
|
9
|
+
const VALID_MODULES = Object.keys(modules);
|
|
10
|
+
|
|
11
|
+
async function runUpdate(moduleName) {
|
|
12
|
+
logger.section('Atualização');
|
|
13
|
+
|
|
14
|
+
// Check manifest
|
|
15
|
+
if (!(await fs.pathExists(MANIFEST_PATH))) {
|
|
16
|
+
logger.warn('Nenhuma instalação encontrada (manifest ausente).');
|
|
17
|
+
logger.dim('Execute primeiro: npx @eximia-ventures/claude-code-toolkit');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const manifest = await fs.readJson(MANIFEST_PATH);
|
|
22
|
+
const installed = manifest.modules || [];
|
|
23
|
+
|
|
24
|
+
logger.info(`Instalação encontrada (v${manifest.version}, ${installed.length} módulos)`);
|
|
25
|
+
logger.dim(`Módulos: ${installed.join(', ')}`);
|
|
26
|
+
|
|
27
|
+
// Determine which modules to update
|
|
28
|
+
let toUpdate;
|
|
29
|
+
if (moduleName) {
|
|
30
|
+
if (!VALID_MODULES.includes(moduleName)) {
|
|
31
|
+
logger.error(`Módulo desconhecido: ${moduleName}`);
|
|
32
|
+
logger.dim(`Disponíveis: ${VALID_MODULES.join(', ')}`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (!installed.includes(moduleName)) {
|
|
36
|
+
logger.warn(`Módulo "${moduleName}" não está instalado.`);
|
|
37
|
+
logger.dim(`Instalados: ${installed.join(', ')}`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
toUpdate = [moduleName];
|
|
41
|
+
} else {
|
|
42
|
+
toUpdate = installed;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (toUpdate.length === 0) {
|
|
46
|
+
logger.warn('Nenhum módulo para atualizar.');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
let updated = 0;
|
|
51
|
+
let skipped = 0;
|
|
52
|
+
let failed = 0;
|
|
53
|
+
|
|
54
|
+
// Update each module
|
|
55
|
+
for (const mod of toUpdate) {
|
|
56
|
+
try {
|
|
57
|
+
const result = await updateModule(mod, manifest);
|
|
58
|
+
if (result === 'updated') updated++;
|
|
59
|
+
else skipped++;
|
|
60
|
+
} catch (err) {
|
|
61
|
+
logger.error(`Falha ao atualizar ${modules[mod].name}: ${err.message}`);
|
|
62
|
+
failed++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Update manifest metadata
|
|
67
|
+
manifest.version = require('../../package.json').version;
|
|
68
|
+
manifest.updatedAt = new Date().toISOString();
|
|
69
|
+
await fs.writeJson(MANIFEST_PATH, manifest, { spaces: 2 });
|
|
70
|
+
|
|
71
|
+
// Summary
|
|
72
|
+
logger.blank();
|
|
73
|
+
if (failed === 0) {
|
|
74
|
+
logger.success(`Atualização completa (${updated} atualizado(s), ${skipped} já em dia)`);
|
|
75
|
+
} else {
|
|
76
|
+
logger.warn(`${updated} atualizado(s), ${skipped} em dia, ${failed} com falha`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function updateModule(name, manifest) {
|
|
81
|
+
switch (name) {
|
|
82
|
+
case 'statusline': {
|
|
83
|
+
logger.section('Statusline');
|
|
84
|
+
const result = await modules.statusline.module.install({});
|
|
85
|
+
return result.installed ? 'updated' : 'skipped';
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
case 'handoff': {
|
|
89
|
+
const result = await modules.handoff.module.install();
|
|
90
|
+
return result.installed ? 'updated' : 'skipped';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
case 'meter': {
|
|
94
|
+
const result = await modules.meter.module.install();
|
|
95
|
+
return result.installed ? 'updated' : 'skipped';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
case 'aios': {
|
|
99
|
+
const opts = {
|
|
100
|
+
installAiosCore: manifest.aiosCore || false,
|
|
101
|
+
installAiosSkill: true
|
|
102
|
+
};
|
|
103
|
+
const result = await modules.aios.module.install(opts);
|
|
104
|
+
return 'updated';
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
default:
|
|
108
|
+
logger.dim(`Módulo sem rotina de update: ${name}`);
|
|
109
|
+
return 'skipped';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
module.exports = { runUpdate };
|
package/src/index.js
CHANGED
|
@@ -6,6 +6,7 @@ const logger = require('./utils/logger');
|
|
|
6
6
|
const { runInstaller } = require('./installer');
|
|
7
7
|
const { runUninstall } = require('./commands/uninstall');
|
|
8
8
|
const { runDoctor } = require('./commands/doctor');
|
|
9
|
+
const { runUpdate } = require('./commands/update');
|
|
9
10
|
|
|
10
11
|
const program = new Command();
|
|
11
12
|
|
|
@@ -46,6 +47,19 @@ program
|
|
|
46
47
|
}
|
|
47
48
|
});
|
|
48
49
|
|
|
50
|
+
program
|
|
51
|
+
.command('update [module]')
|
|
52
|
+
.description('Atualiza módulos instalados (todos ou um específico)')
|
|
53
|
+
.action(async (moduleName) => {
|
|
54
|
+
logger.banner(pkg.version);
|
|
55
|
+
try {
|
|
56
|
+
await runUpdate(moduleName);
|
|
57
|
+
} catch (err) {
|
|
58
|
+
logger.error(`Erro: ${err.message}`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
49
63
|
program
|
|
50
64
|
.command('doctor')
|
|
51
65
|
.description('Verifica integridade da instalação')
|