@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eximia-ventures/claude-code-toolkit",
3
- "version": "3.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "Setup completo para Claude Code: statusline, session handoff, AIOS integration",
5
5
  "main": "src/index.js",
6
6
  "bin": {
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
- .option('--statusline-only', 'Instala apenas a statusline')
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(options);
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(cliOptions = {}) {
19
+ async function runInstaller() {
20
20
  let selectedModules;
21
21
  let currencyConfig;
22
22
  let aiosOptions = {};
23
23
 
24
- // --- Short-circuit for CLI flags ---
25
- if (cliOptions.statuslineOnly) {
26
- selectedModules = ['statusline'];
27
- currencyConfig = {
28
- symbol: cliOptions.currency || '$',
29
- rate: cliOptions.currencyRate || 1
30
- };
31
- } else if (cliOptions.handoffOnly) {
32
- selectedModules = ['handoff'];
33
- } else {
34
- // --- Interactive wizard ---
35
-
36
- // Step 1: Module selection
37
- const { selected } = await inquirer.prompt([
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: 'checkbox',
40
- name: 'selected',
41
- message: 'Selecione o que deseja instalar:',
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
- const { currencyPreset } = await inquirer.prompt([
64
+ if (currencyPreset === null) {
65
+ const custom = await inquirer.prompt([
68
66
  {
69
- type: 'list',
70
- name: 'currencyPreset',
71
- message: 'Moeda para exibição de custo:',
72
- choices: CURRENCY_PRESETS
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
- if (currencyPreset === null) {
77
- const custom = await inquirer.prompt([
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
- // Step 3: AIOS (opt-in)
98
- if (cliOptions.aios !== false) {
99
- logger.section('AIOS Framework');
85
+ // --- Step 3: AIOS (sempre wizard) ---
86
+ logger.section('AIOS Framework');
100
87
 
101
- const { useAios } = await inquirer.prompt([
102
- {
103
- type: 'confirm',
104
- name: 'useAios',
105
- message: 'Vai utilizar o AIOS?',
106
- default: false
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
- if (useAios) {
111
- const { aiosChoices } = await inquirer.prompt([
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
- type: 'checkbox',
114
- name: 'aiosChoices',
115
- message: 'Selecione as opções AIOS:',
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);
@@ -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: true
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: true
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 };