@eximia-ventures/claude-code-toolkit 3.0.1 → 3.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/package.json +1 -1
- package/src/index.js +2 -7
- package/src/installer.js +101 -100
- package/src/modules/index.js +9 -2
- package/src/modules/meter.js +33 -0
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -17,15 +17,10 @@ program
|
|
|
17
17
|
program
|
|
18
18
|
.command('install', { isDefault: true })
|
|
19
19
|
.description('Instala o toolkit (wizard interativo)')
|
|
20
|
-
.
|
|
21
|
-
.option('--handoff-only', 'Instala apenas o session handoff')
|
|
22
|
-
.option('--no-aios', 'Pula a configuração do AIOS')
|
|
23
|
-
.option('--currency <symbol>', 'Símbolo da moeda (ex: R$, $, €)')
|
|
24
|
-
.option('--currency-rate <rate>', 'Taxa de conversão USD→moeda', parseFloat)
|
|
25
|
-
.action(async (options) => {
|
|
20
|
+
.action(async () => {
|
|
26
21
|
logger.banner(pkg.version);
|
|
27
22
|
try {
|
|
28
|
-
await runInstaller(
|
|
23
|
+
await runInstaller();
|
|
29
24
|
} catch (err) {
|
|
30
25
|
if (err.name === 'ExitPromptError' || err.message?.includes('prompt')) {
|
|
31
26
|
logger.blank();
|
package/src/installer.js
CHANGED
|
@@ -16,127 +16,120 @@ const CURRENCY_PRESETS = [
|
|
|
16
16
|
{ name: 'Personalizada — Definir símbolo e taxa', value: null }
|
|
17
17
|
];
|
|
18
18
|
|
|
19
|
-
async function runInstaller(
|
|
19
|
+
async function runInstaller() {
|
|
20
20
|
let selectedModules;
|
|
21
21
|
let currencyConfig;
|
|
22
22
|
let aiosOptions = {};
|
|
23
23
|
|
|
24
|
-
// ---
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
24
|
+
// --- Step 1: Module selection (tudo desmarcado) ---
|
|
25
|
+
const { selected } = await inquirer.prompt([
|
|
26
|
+
{
|
|
27
|
+
type: 'checkbox',
|
|
28
|
+
name: 'selected',
|
|
29
|
+
message: 'Selecione o que deseja instalar:',
|
|
30
|
+
choices: [
|
|
31
|
+
{
|
|
32
|
+
name: `${modules.statusline.name} — ${modules.statusline.description}`,
|
|
33
|
+
value: 'statusline',
|
|
34
|
+
checked: false
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: `${modules.handoff.name} — ${modules.handoff.description}`,
|
|
38
|
+
value: 'handoff',
|
|
39
|
+
checked: false
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: `${modules.meter.name} — ${modules.meter.description}`,
|
|
43
|
+
value: 'meter',
|
|
44
|
+
checked: false
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
]);
|
|
49
|
+
selectedModules = selected;
|
|
50
|
+
|
|
51
|
+
// --- Step 2: Currency config (if statusline selected) ---
|
|
52
|
+
if (selectedModules.includes('statusline')) {
|
|
53
|
+
logger.section('Configuração da Statusline');
|
|
54
|
+
|
|
55
|
+
const { currencyPreset } = await inquirer.prompt([
|
|
38
56
|
{
|
|
39
|
-
type: '
|
|
40
|
-
name: '
|
|
41
|
-
message: '
|
|
42
|
-
choices:
|
|
43
|
-
{
|
|
44
|
-
name: `${modules.statusline.name} — ${modules.statusline.description}`,
|
|
45
|
-
value: 'statusline',
|
|
46
|
-
checked: true
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
name: `${modules.handoff.name} — ${modules.handoff.description}`,
|
|
50
|
-
value: 'handoff',
|
|
51
|
-
checked: true
|
|
52
|
-
}
|
|
53
|
-
]
|
|
57
|
+
type: 'list',
|
|
58
|
+
name: 'currencyPreset',
|
|
59
|
+
message: 'Moeda para exibição de custo:',
|
|
60
|
+
choices: CURRENCY_PRESETS
|
|
54
61
|
}
|
|
55
62
|
]);
|
|
56
|
-
selectedModules = selected;
|
|
57
|
-
|
|
58
|
-
if (selectedModules.length === 0) {
|
|
59
|
-
logger.warn('Nenhum módulo selecionado. Saindo.');
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Step 2: Currency config (if statusline selected)
|
|
64
|
-
if (selectedModules.includes('statusline')) {
|
|
65
|
-
logger.section('Configuração da Statusline');
|
|
66
63
|
|
|
67
|
-
|
|
64
|
+
if (currencyPreset === null) {
|
|
65
|
+
const custom = await inquirer.prompt([
|
|
68
66
|
{
|
|
69
|
-
type: '
|
|
70
|
-
name: '
|
|
71
|
-
message: '
|
|
72
|
-
|
|
67
|
+
type: 'input',
|
|
68
|
+
name: 'symbol',
|
|
69
|
+
message: 'Símbolo da moeda:',
|
|
70
|
+
default: '$'
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
type: 'number',
|
|
74
|
+
name: 'rate',
|
|
75
|
+
message: 'Taxa de conversão USD→moeda:',
|
|
76
|
+
default: 1
|
|
73
77
|
}
|
|
74
78
|
]);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
{
|
|
79
|
-
type: 'input',
|
|
80
|
-
name: 'symbol',
|
|
81
|
-
message: 'Símbolo da moeda:',
|
|
82
|
-
default: '$'
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
type: 'number',
|
|
86
|
-
name: 'rate',
|
|
87
|
-
message: 'Taxa de conversão USD→moeda:',
|
|
88
|
-
default: 1
|
|
89
|
-
}
|
|
90
|
-
]);
|
|
91
|
-
currencyConfig = custom;
|
|
92
|
-
} else {
|
|
93
|
-
currencyConfig = currencyPreset;
|
|
94
|
-
}
|
|
79
|
+
currencyConfig = custom;
|
|
80
|
+
} else {
|
|
81
|
+
currencyConfig = currencyPreset;
|
|
95
82
|
}
|
|
83
|
+
}
|
|
96
84
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
logger.section('AIOS Framework');
|
|
85
|
+
// --- Step 3: AIOS (sempre wizard) ---
|
|
86
|
+
logger.section('AIOS Framework');
|
|
100
87
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
88
|
+
const { useAios } = await inquirer.prompt([
|
|
89
|
+
{
|
|
90
|
+
type: 'confirm',
|
|
91
|
+
name: 'useAios',
|
|
92
|
+
message: 'Vai utilizar o AIOS?',
|
|
93
|
+
default: false
|
|
94
|
+
}
|
|
95
|
+
]);
|
|
109
96
|
|
|
110
|
-
|
|
111
|
-
|
|
97
|
+
if (useAios) {
|
|
98
|
+
const { aiosChoices } = await inquirer.prompt([
|
|
99
|
+
{
|
|
100
|
+
type: 'checkbox',
|
|
101
|
+
name: 'aiosChoices',
|
|
102
|
+
message: 'Selecione as opções AIOS:',
|
|
103
|
+
choices: [
|
|
104
|
+
{
|
|
105
|
+
name: 'Instalar/Atualizar AIOS Core',
|
|
106
|
+
value: 'core',
|
|
107
|
+
checked: false
|
|
108
|
+
},
|
|
112
109
|
{
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
choices: [
|
|
117
|
-
{
|
|
118
|
-
name: 'Instalar/Atualizar AIOS Core',
|
|
119
|
-
value: 'core',
|
|
120
|
-
checked: true
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
name: 'Instalar Skill /aios-integrate (integrar e gerenciar artefatos)',
|
|
124
|
-
value: 'skill',
|
|
125
|
-
checked: true
|
|
126
|
-
}
|
|
127
|
-
]
|
|
110
|
+
name: 'Instalar Skill /aios-integrate (integrar e gerenciar artefatos)',
|
|
111
|
+
value: 'skill',
|
|
112
|
+
checked: false
|
|
128
113
|
}
|
|
129
|
-
]
|
|
130
|
-
|
|
131
|
-
selectedModules.push('aios');
|
|
132
|
-
aiosOptions = {
|
|
133
|
-
installAiosCore: aiosChoices.includes('core'),
|
|
134
|
-
installAiosSkill: aiosChoices.includes('skill')
|
|
135
|
-
};
|
|
114
|
+
]
|
|
136
115
|
}
|
|
116
|
+
]);
|
|
117
|
+
|
|
118
|
+
if (aiosChoices.length > 0) {
|
|
119
|
+
selectedModules.push('aios');
|
|
120
|
+
aiosOptions = {
|
|
121
|
+
installAiosCore: aiosChoices.includes('core'),
|
|
122
|
+
installAiosSkill: aiosChoices.includes('skill')
|
|
123
|
+
};
|
|
137
124
|
}
|
|
138
125
|
}
|
|
139
126
|
|
|
127
|
+
// --- Validate selection ---
|
|
128
|
+
if (selectedModules.length === 0) {
|
|
129
|
+
logger.warn('Nenhum módulo selecionado. Saindo.');
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
140
133
|
// --- Execute installation ---
|
|
141
134
|
logger.section('Instalando...');
|
|
142
135
|
|
|
@@ -166,6 +159,14 @@ async function runInstaller(cliOptions = {}) {
|
|
|
166
159
|
}
|
|
167
160
|
}
|
|
168
161
|
|
|
162
|
+
// Install meter
|
|
163
|
+
if (selectedModules.includes('meter')) {
|
|
164
|
+
const result = await modules.meter.module.install();
|
|
165
|
+
if (result.installed) {
|
|
166
|
+
manifest.files.push(...modules.meter.module.getManifestEntries());
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
169
170
|
// Install AIOS
|
|
170
171
|
if (selectedModules.includes('aios')) {
|
|
171
172
|
const result = await modules.aios.module.install(aiosOptions);
|
package/src/modules/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
const statusline = require('./statusline');
|
|
4
4
|
const handoff = require('./handoff');
|
|
5
|
+
const meter = require('./meter');
|
|
5
6
|
const aios = require('./aios');
|
|
6
7
|
|
|
7
8
|
const modules = {
|
|
@@ -9,13 +10,19 @@ const modules = {
|
|
|
9
10
|
name: 'Statusline',
|
|
10
11
|
description: 'Barra de status: modelo, contexto %, custo, tempo, git',
|
|
11
12
|
module: statusline,
|
|
12
|
-
default:
|
|
13
|
+
default: false
|
|
13
14
|
},
|
|
14
15
|
handoff: {
|
|
15
16
|
name: 'Session Handoff',
|
|
16
17
|
description: 'Continuidade de sessão (via claude-code-handoff)',
|
|
17
18
|
module: handoff,
|
|
18
|
-
default:
|
|
19
|
+
default: false
|
|
20
|
+
},
|
|
21
|
+
meter: {
|
|
22
|
+
name: 'eximia-meter',
|
|
23
|
+
description: 'Monitor de consumo de tokens (menu bar macOS)',
|
|
24
|
+
module: meter,
|
|
25
|
+
default: false
|
|
19
26
|
},
|
|
20
27
|
aios: {
|
|
21
28
|
name: 'AIOS Framework',
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { execSync } = require('child_process');
|
|
4
|
+
const logger = require('../utils/logger');
|
|
5
|
+
|
|
6
|
+
async function install() {
|
|
7
|
+
logger.section('eximia-meter');
|
|
8
|
+
|
|
9
|
+
try {
|
|
10
|
+
logger.dim('Executando eximia-meter...');
|
|
11
|
+
execSync('npx eximia-meter@latest', {
|
|
12
|
+
stdio: 'inherit',
|
|
13
|
+
timeout: 180000
|
|
14
|
+
});
|
|
15
|
+
logger.success('eximia-meter instalado');
|
|
16
|
+
return { installed: true };
|
|
17
|
+
} catch (err) {
|
|
18
|
+
logger.warn(`eximia-meter falhou: ${err.message}`);
|
|
19
|
+
logger.dim('Você pode instalar manualmente depois: npx eximia-meter');
|
|
20
|
+
return { installed: false, error: err.message };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function uninstall() {
|
|
25
|
+
logger.dim('eximia-meter é um app standalone — remova manualmente se necessário.');
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getManifestEntries() {
|
|
30
|
+
return ['eximia-meter'];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports = { install, uninstall, getManifestEntries };
|