tokalytics 2.0.6 → 2.0.8

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
@@ -39,7 +39,7 @@ npm run build # go build -o tokalytics main.go
39
39
  npm run start # compila e em seguida executa ./tokalytics
40
40
  ```
41
41
 
42
- Na primeira execução o app sobe o **servidor HTTP na porta `3456`** e o ícone na barra de menus. Use **«Abrir Dashboard»** no menu ou acesse [http://127.0.0.1:3456](http://127.0.0.1:3456).
42
+ Na primeira execução o app sobe o **servidor HTTP** (porta padrão `3456`; se estiver ocupada, usa a próxima livre) e o ícone na barra de menus. Use **«Abrir Dashboard»** no menu ou abra a URL mostrada no terminal.
43
43
 
44
44
  ### Instalação global pelo npm
45
45
 
@@ -47,12 +47,27 @@ Na primeira execução o app sobe o **servidor HTTP na porta `3456`** e o ícone
47
47
  npm install -g tokalytics
48
48
  ```
49
49
 
50
+ Em instalação **global**, o `postinstall` tenta **abrir o Tokalytics em segundo plano** (ícone na barra). Para instalar sem iniciar: `TOKALYTICS_NO_AUTOSTART=1 npm install -g tokalytics`.
51
+
50
52
  Instalação a partir do repositório (sempre o `postinstall` da branch atual):
51
53
 
52
54
  ```bash
53
55
  npm install -g "github:kaicmurilo/Tokalytics"
54
56
  ```
55
57
 
58
+ ### CLI: instância única e controle
59
+
60
+ O binário `tokalytics` evita subir uma **segunda** cópia: se já houver uma instância ouvindo nas portas usuais (`3456`–`3555`) e respondendo como Tokalytics, o comando apenas informa a URL e encerra.
61
+
62
+ | Flag | Efeito |
63
+ |------|--------|
64
+ | *(nenhuma)* ou `--start` | Inicia menu bar + dashboard se não houver instância; caso contrário, mensagem em stdout. |
65
+ | `--stop` | Encerra a instância em execução (HTTP local `POST /api/shutdown`, só loopback). |
66
+ | `--reload` | Dispara atualização de dados na instância ativa (`GET /api/refresh`). |
67
+ | `--version` / `-v` | Imprime a versão e sai. |
68
+
69
+ Estado auxiliar (PID/porta) fica em `~/.config/tokalytics/runstate.json` enquanto o app está rodando; é removido ao sair. Se a porta padrão `3456` estiver ocupada por outro programa, o Tokalytics tenta a próxima livre; use a URL indicada no log ou em **Settings** no dashboard.
70
+
56
71
  ## Dashboard
57
72
 
58
73
  Interface web em abas:
@@ -67,6 +82,10 @@ Interface web em abas:
67
82
 
68
83
  Há atalhos para **atualizar dados**, **compartilhar stats** (PNG) e **configurações** (cookies opcionais para APIs em nuvem).
69
84
 
85
+ ### Aviso de nova versão
86
+
87
+ Em builds com versão **semver** (releases; não `dev`), o dashboard consulta a última release no GitHub e, se houver versão mais nova, mostra um **painel lateral** com o comando `npm install -g tokalytics` (copiar com um clique) e link para a release. O aviso pode ser fechado e não reaparece para a mesma versão alvo até limpar o `localStorage` do site. A resposta do servidor é cacheada por cerca de **1 hora**; use `GITHUB_TOKEN` no ambiente se precisar de limite maior na API do GitHub.
88
+
70
89
  ## Licença
71
90
 
72
91
  MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokalytics",
3
- "version": "2.0.6",
3
+ "version": "2.0.8",
4
4
  "description": "Veja para onde vão seus tokens do Claude Code, Gemini CLI, Cursor e Codex. Reescrito em Go como Tokalytics.",
5
5
  "bin": {
6
6
  "tokalytics": "bin/run.js"
@@ -28,7 +28,7 @@
28
28
  "golang",
29
29
  "tokalytics"
30
30
  ],
31
- "author": "Aniket Parihar & Kaic Murilo",
31
+ "author": "Kaic Murilo",
32
32
  "license": "MIT",
33
33
  "repository": {
34
34
  "type": "git",
@@ -4,6 +4,7 @@
4
4
  const https = require('https');
5
5
  const fs = require('fs');
6
6
  const path = require('path');
7
+ const { spawn } = require('child_process');
7
8
 
8
9
  const pkgPath = path.join(__dirname, '..', 'package.json');
9
10
  const pkgVersion = (() => {
@@ -127,6 +128,26 @@ function assertReleasePayload(release) {
127
128
  }
128
129
  }
129
130
 
131
+ /** Só em `npm install -g` (npm_config_global). Ignora CI e TOKALYTICS_NO_AUTOSTART=1. */
132
+ function tryLaunchAfterGlobalInstall() {
133
+ if (process.env.CI === 'true') return false;
134
+ if (process.env.TOKALYTICS_NO_AUTOSTART === '1') return false;
135
+ const g = process.env.npm_config_global;
136
+ if (g !== 'true' && g !== '1') return false;
137
+ if (!fs.existsSync(BIN_PATH)) return false;
138
+ try {
139
+ const child = spawn(BIN_PATH, [], {
140
+ detached: true,
141
+ stdio: 'ignore',
142
+ windowsHide: true,
143
+ });
144
+ child.unref();
145
+ return true;
146
+ } catch {
147
+ return false;
148
+ }
149
+ }
150
+
130
151
  async function install() {
131
152
  console.log(`Tokalytics installer v${pkgVersion}: buscando última versão...`);
132
153
 
@@ -148,7 +169,13 @@ async function install() {
148
169
  fs.chmodSync(BIN_PATH, 0o755);
149
170
 
150
171
  console.log(`Tokalytics ${version} instalado com sucesso!`);
151
- console.log('Execute: tokalytics');
172
+ if (tryLaunchAfterGlobalInstall()) {
173
+ console.log(
174
+ 'Tokalytics iniciado em segundo plano (ícone na barra de menus / bandeja).'
175
+ );
176
+ } else {
177
+ console.log('Execute: tokalytics');
178
+ }
152
179
  }
153
180
 
154
181
  install().catch((err) => {