@eximia-ventures/claude-code-toolkit 3.1.1 → 3.2.1

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 CHANGED
@@ -194,6 +194,42 @@ npx @eximia-ventures/claude-code-toolkit doctor
194
194
  ✓ Tudo OK! (10 verificações passaram)
195
195
  ```
196
196
 
197
+ ### `update [module]`
198
+
199
+ Atualiza os módulos já instalados sem passar pelo wizard. Lê o manifest, re-executa a instalação de cada módulo e usa hash comparison para pular arquivos que já estão em dia.
200
+
201
+ ```bash
202
+ # Atualizar tudo
203
+ npx @eximia-ventures/claude-code-toolkit update
204
+
205
+ # Atualizar apenas um módulo
206
+ npx @eximia-ventures/claude-code-toolkit update aios
207
+ npx @eximia-ventures/claude-code-toolkit update statusline
208
+ npx @eximia-ventures/claude-code-toolkit update handoff
209
+ npx @eximia-ventures/claude-code-toolkit update meter
210
+ ```
211
+
212
+ ```
213
+ ─── Atualização ───
214
+
215
+ ℹ Instalação encontrada (v3.2.0, 3 módulos)
216
+
217
+ ─── Statusline ───
218
+
219
+ ✓ Statusline já atualizada em ~/.claude/statusline.sh
220
+ ✓ settings.json atualizado com statusLine
221
+
222
+ ─── Session Handoff ───
223
+
224
+ ✓ claude-code-handoff instalado (7 commands, 2 hooks, 2 rules)
225
+
226
+ ─── AIOS Framework ───
227
+
228
+ ✓ Skill /aios-integrate já atualizada
229
+
230
+ ✓ Atualização completa (3 atualizado(s), 0 já em dia)
231
+ ```
232
+
197
233
  ### `uninstall`
198
234
 
199
235
  Remove tudo que foi instalado, baseado no manifest:
@@ -296,6 +332,7 @@ claude-code-toolkit/
296
332
  │ │ └── aios.js # npx aios-core + skill
297
333
  │ ├── commands/
298
334
  │ │ ├── uninstall.js # Remoção via manifest
335
+ │ │ ├── update.js # Atualização sem wizard
299
336
  │ │ └── doctor.js # 10 checks de integridade
300
337
  │ └── utils/
301
338
  │ ├── settings-merger.js # Deep-merge seguro (com backup)
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eximia-ventures/claude-code-toolkit",
3
- "version": "3.1.1",
3
+ "version": "3.2.1",
4
4
  "description": "Setup completo para Claude Code: statusline, session handoff, AIOS integration",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -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')