estela 0.1.38 → 0.1.40

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.
Files changed (84) hide show
  1. package/README.md +70 -0
  2. package/dist/cli-badge.test.d.ts +2 -0
  3. package/dist/cli-badge.test.d.ts.map +1 -0
  4. package/dist/cli-badge.test.js +118 -0
  5. package/dist/cli-badge.test.js.map +1 -0
  6. package/dist/cli-quota.test.d.ts +2 -0
  7. package/dist/cli-quota.test.d.ts.map +1 -0
  8. package/dist/cli-quota.test.js +216 -0
  9. package/dist/cli-quota.test.js.map +1 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +268 -0
  12. package/dist/cli.js.map +1 -1
  13. package/dist/db/store.d.ts +10 -1
  14. package/dist/db/store.d.ts.map +1 -1
  15. package/dist/db/store.js +29 -0
  16. package/dist/db/store.js.map +1 -1
  17. package/dist/demo.d.ts.map +1 -1
  18. package/dist/demo.js +53 -0
  19. package/dist/demo.js.map +1 -1
  20. package/dist/export/badge.d.ts +26 -0
  21. package/dist/export/badge.d.ts.map +1 -0
  22. package/dist/export/badge.js +37 -0
  23. package/dist/export/badge.js.map +1 -0
  24. package/dist/export/badge.test.d.ts +2 -0
  25. package/dist/export/badge.test.d.ts.map +1 -0
  26. package/dist/export/badge.test.js +32 -0
  27. package/dist/export/badge.test.js.map +1 -0
  28. package/dist/export/idioma.test.js +6 -2
  29. package/dist/export/idioma.test.js.map +1 -1
  30. package/dist/export/panel.d.ts +7 -0
  31. package/dist/export/panel.d.ts.map +1 -1
  32. package/dist/export/panel.js +25 -6
  33. package/dist/export/panel.js.map +1 -1
  34. package/dist/export/panel.test.js +17 -4
  35. package/dist/export/panel.test.js.map +1 -1
  36. package/dist/export/pixelfont.d.ts +17 -0
  37. package/dist/export/pixelfont.d.ts.map +1 -0
  38. package/dist/export/pixelfont.js +157 -0
  39. package/dist/export/pixelfont.js.map +1 -0
  40. package/dist/export/png.d.ts +12 -0
  41. package/dist/export/png.d.ts.map +1 -0
  42. package/dist/export/png.js +85 -0
  43. package/dist/export/png.js.map +1 -0
  44. package/dist/export/receipt.d.ts +58 -0
  45. package/dist/export/receipt.d.ts.map +1 -0
  46. package/dist/export/receipt.js +216 -0
  47. package/dist/export/receipt.js.map +1 -0
  48. package/dist/export/receipt.test.d.ts +2 -0
  49. package/dist/export/receipt.test.d.ts.map +1 -0
  50. package/dist/export/receipt.test.js +207 -0
  51. package/dist/export/receipt.test.js.map +1 -0
  52. package/dist/i18n/en.d.ts.map +1 -1
  53. package/dist/i18n/en.js +54 -1
  54. package/dist/i18n/en.js.map +1 -1
  55. package/dist/metrics/quota.d.ts +186 -0
  56. package/dist/metrics/quota.d.ts.map +1 -0
  57. package/dist/metrics/quota.js +245 -0
  58. package/dist/metrics/quota.js.map +1 -0
  59. package/dist/metrics/quota.test.d.ts +2 -0
  60. package/dist/metrics/quota.test.d.ts.map +1 -0
  61. package/dist/metrics/quota.test.js +262 -0
  62. package/dist/metrics/quota.test.js.map +1 -0
  63. package/dist/publish.d.ts +2 -0
  64. package/dist/publish.d.ts.map +1 -1
  65. package/dist/publish.js +3 -1
  66. package/dist/publish.js.map +1 -1
  67. package/dist/quota.d.ts +18 -0
  68. package/dist/quota.d.ts.map +1 -0
  69. package/dist/quota.js +85 -0
  70. package/dist/quota.js.map +1 -0
  71. package/dist/server.d.ts.map +1 -1
  72. package/dist/server.js +8 -0
  73. package/dist/server.js.map +1 -1
  74. package/dist/server.test.js +37 -0
  75. package/dist/server.test.js.map +1 -1
  76. package/node_modules/@estela/shared/dist/money.d.ts +6 -0
  77. package/node_modules/@estela/shared/dist/money.d.ts.map +1 -1
  78. package/node_modules/@estela/shared/dist/money.js +11 -0
  79. package/node_modules/@estela/shared/dist/money.js.map +1 -1
  80. package/package.json +1 -1
  81. package/web/app.css +36 -0
  82. package/web/app.js +61 -1
  83. package/web/i18n.js +28 -0
  84. package/web/index.html +4 -1
package/README.md CHANGED
@@ -51,6 +51,13 @@ What it doesn't do:
51
51
  with which model.
52
52
  - **It doesn't send anything anywhere.** The free plan is entirely local.
53
53
 
54
+ ### Already using ccusage?
55
+
56
+ Keep it. [ccusage](https://github.com/ryoppippi/ccusage) reads the same files
57
+ and tells you what the AI cost you; Estela tells you how many hours you worked
58
+ and what to bill the client. Both only read, so they run side by side.
59
+ [Side-by-side comparison](https://getestela.dev/en/vs/ccusage).
60
+
54
61
  ## Getting started
55
62
 
56
63
  You need **Node 22.5 or later** (for `node:sqlite`).
@@ -182,6 +189,35 @@ different machine, pass `--token` with the existing one, or your client ends up
182
189
  with a dead link. The Free plan allows one published dashboard at a time; Pro
183
190
  and Teams have no limit.
184
191
 
192
+ The dashboard's footer says "Hours filled in by Estela", linking to
193
+ getestela.dev. On Pro and Teams, `--no-credit` removes that line.
194
+
195
+ ## Showing what you built
196
+
197
+ A badge for your project's README, with its measured hours and what the AI
198
+ cost:
199
+
200
+ ```sh
201
+ estela badge # the project for the repo you're in
202
+ estela badge --project acme-web
203
+ ```
204
+
205
+ It prints a Markdown line with a static [shields.io](https://shields.io) image,
206
+ something like `Built in 42 h · $18 of AI`. Nothing is hosted and nothing is
207
+ looked up: the numbers are baked into the URL, so run it again to update them.
208
+ It only counts **measured** hours, never the ones estimated from commits.
209
+
210
+ And a receipt of your week (or of your whole history) as a PNG:
211
+
212
+ ```sh
213
+ estela receipt --week
214
+ ```
215
+
216
+ Measured versus estimated hours, the AI cost, what caching saved you, and the
217
+ most expensive project and branch. It's drawn on your machine and stays there.
218
+ Project and branch names are left out by default, because they're usually a
219
+ client's; add `--names` to include them.
220
+
185
221
  ## What the AI actually costs
186
222
 
187
223
  On a flat subscription, your real spend isn't the sum of the tokens: it's the
@@ -195,6 +231,30 @@ estela ai-cost
195
231
  Cache is counted separately because it's usually most of the bill — ignoring it
196
232
  underestimated spend fivefold.
197
233
 
234
+ ## Which project is eating your quota
235
+
236
+ On Claude Max/Pro or Codex with a subscription, the quota runs out before you
237
+ expect it and nothing tells you where it went. `estela quota` splits it by
238
+ project:
239
+
240
+ ```sh
241
+ estela quota # current 5-hour window and this week, per project
242
+ estela quota --json # the same, for scripts
243
+ ```
244
+
245
+ Tokens (input, output, cache read and cache write) per project, for the current
246
+ 5-hour window and for this week (Monday to today, in your time zone), plus this
247
+ week against the average of your previous 4 over the same stretch. Claude Code
248
+ and Codex are shown separately: they draw on different quotas. It's also a card
249
+ in the Summary tab of `estela web`, and it's free.
250
+
251
+ What it never does is tell you how much you have left: Anthropic and OpenAI
252
+ don't publish their plans' limits, so any "X tokens left" would be made up. The
253
+ 5-hour window is an estimate — how its start is rounded isn't public, and
254
+ anything you use on claude.ai or another machine counts too but isn't on this
255
+ one. Copilot is left out because it doesn't record reliable tokens. Everything
256
+ is calculated on your machine.
257
+
198
258
  ## Hours no import will infer
199
259
 
200
260
  Meetings, travel, research, and development without an agent that didn't leave
@@ -248,6 +308,16 @@ Node 22 and **zero runtime dependencies**, on purpose: nobody installs a program
248
308
  that reads their transcripts if they can't audit it, and an empty dependency
249
309
  list can be audited in an afternoon.
250
310
 
311
+ ## Contributing
312
+
313
+ Issues and pull requests are welcome, and the
314
+ [good first issues](https://github.com/jdleonruiz/estela-cli/labels/good%20first%20issue)
315
+ are a good place to start. One thing to know so nobody's put off: this
316
+ repository mirrors the open part of a larger repo where the paid service also
317
+ lives, which is why each commit here is a release. I review PRs here and apply
318
+ them to the main repo keeping you as the author, and the next release commit
319
+ credits you as co-author. PRs welcome — I merge them into the main repo.
320
+
251
321
  ## Open source, closed service
252
322
 
253
323
  Everything that installs on your machine is open source under the MIT license:
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli-badge.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-badge.test.d.ts","sourceRoot":"","sources":["../src/cli-badge.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const strict_1 = __importDefault(require("node:assert/strict"));
40
+ const node_child_process_1 = require("node:child_process");
41
+ const node_fs_1 = require("node:fs");
42
+ const node_os_1 = require("node:os");
43
+ const node_path_1 = require("node:path");
44
+ const node_test_1 = require("node:test");
45
+ const schema_js_1 = require("./db/schema.js");
46
+ const store = __importStar(require("./db/store.js"));
47
+ /**
48
+ * `estela badge`, ejecutando la CLI de verdad: lo que importa es la línea que
49
+ * alguien pega en su README, y que no cuente como medido lo que no lo es.
50
+ */
51
+ const BIN = (0, node_path_1.join)(__dirname, "bin.js");
52
+ function estela(db, ...args) {
53
+ const r = (0, node_child_process_1.spawnSync)(process.execPath, [BIN, ...args, "--db", db], {
54
+ encoding: "utf8",
55
+ env: { ...process.env, ESTELA_LANG: "es", NO_COLOR: "1" },
56
+ });
57
+ return { code: r.status, out: `${r.stdout}${r.stderr}` };
58
+ }
59
+ function bloque(id, source, hours, aiUsd) {
60
+ const startedAt = new Date("2026-08-10T10:00:00Z");
61
+ return {
62
+ id, projectId: "p", startedAt, endedAt: new Date(startedAt.getTime() + hours * 3600_000),
63
+ seconds: hours * 3600, description: "Trabajo", billable: true, invoiceId: null,
64
+ aiCost: { microUsd: aiUsd * 1_000_000 }, agentSeconds: source === "agent" ? hours * 3600 : 0,
65
+ commitHashes: [], agents: [], source, kind: "development", branch: "main",
66
+ };
67
+ }
68
+ function preparar(bloques, cuota) {
69
+ const path = (0, node_path_1.join)((0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "estela-badge-")), "estela.db");
70
+ const db = (0, schema_js_1.openDatabase)(path);
71
+ try {
72
+ store.upsertClient(db, { id: "c", name: "Interno", currency: "EUR" });
73
+ store.upsertProject(db, {
74
+ id: "p", clientId: "c", name: "Web", repoPaths: [],
75
+ billable: true, roundingMinutes: 0, aiCostPolicy: "absorbed", kind: "client",
76
+ });
77
+ for (const b of bloques)
78
+ store.saveTimeEntry(db, b);
79
+ if (cuota !== undefined) {
80
+ store.upsertSubscription(db, {
81
+ id: "max", name: "Claude Max", monthlyFee: { amount: cuota * 100, currency: "EUR" },
82
+ effectiveFrom: new Date("2026-01-01T00:00:00Z"), effectiveTo: null,
83
+ });
84
+ }
85
+ }
86
+ finally {
87
+ db.close();
88
+ }
89
+ return path;
90
+ }
91
+ (0, node_test_1.test)("badge: horas medidas y coste a tarifa API, sin contar lo estimado", () => {
92
+ const db = preparar([bloque("a", "agent", 42, 18.4), bloque("b", "commit", 5, 0)]);
93
+ const r = estela(db, "badge", "--project", "p");
94
+ strict_1.default.equal(r.code, 0, r.out);
95
+ strict_1.default.match(r.out, /^\[!\[Built in 42 h · \$18 of AI\]\(https:\/\/img\.shields\.io\/badge\/[^)]+\)\]\(https:\/\/getestela\.dev\/en\/\)$/m);
96
+ strict_1.default.match(r.out, /tarifa API/);
97
+ });
98
+ (0, node_test_1.test)("badge: con una cuota registrada, sale lo que se pagó de verdad", () => {
99
+ // Único proyecto con consumo ese mes: se lleva la cuota entera.
100
+ const db = preparar([bloque("a", "agent", 10, 50)], 100);
101
+ const r = estela(db, "badge", "--project", "p");
102
+ strict_1.default.equal(r.code, 0, r.out);
103
+ strict_1.default.match(r.out, /Built in 10 h · €100 of AI/);
104
+ strict_1.default.doesNotMatch(r.out, /tarifa API/);
105
+ });
106
+ (0, node_test_1.test)("badge: sin horas medidas no se inventa un badge", () => {
107
+ const db = preparar([bloque("b", "commit", 5, 0)]);
108
+ const r = estela(db, "badge", "--project", "p");
109
+ strict_1.default.notEqual(r.code, 0);
110
+ strict_1.default.match(r.out, /no tiene horas medidas/);
111
+ });
112
+ (0, node_test_1.test)("badge: un proyecto que no existe se dice así", () => {
113
+ const db = preparar([]);
114
+ const r = estela(db, "badge", "--project", "nada");
115
+ strict_1.default.notEqual(r.code, 0);
116
+ strict_1.default.match(r.out, /No existe el proyecto "nada"/);
117
+ });
118
+ //# sourceMappingURL=cli-badge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-badge.test.js","sourceRoot":"","sources":["../src/cli-badge.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli-quota.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-quota.test.d.ts","sourceRoot":"","sources":["../src/cli-quota.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const strict_1 = __importDefault(require("node:assert/strict"));
40
+ const node_child_process_1 = require("node:child_process");
41
+ const node_fs_1 = require("node:fs");
42
+ const node_os_1 = require("node:os");
43
+ const node_path_1 = require("node:path");
44
+ const node_test_1 = require("node:test");
45
+ const schema_js_1 = require("./db/schema.js");
46
+ const store = __importStar(require("./db/store.js"));
47
+ const quota_js_1 = require("./metrics/quota.js");
48
+ /**
49
+ * `estela quota`, ejecutando la CLI de verdad.
50
+ *
51
+ * Cada prueba corre con un HOME temporal: el refresco lee los transcripts de
52
+ * ~/.claude, y un test no puede ni leer los de quien lo ejecuta ni depender de
53
+ * que existan.
54
+ */
55
+ const BIN = (0, node_path_1.join)(__dirname, "bin.js");
56
+ function estela(home, lang, ...args) {
57
+ const r = (0, node_child_process_1.spawnSync)(process.execPath, [BIN, ...args], {
58
+ encoding: "utf8",
59
+ env: { ...process.env, HOME: home, USERPROFILE: home, ESTELA_LANG: lang, NO_COLOR: "1" },
60
+ });
61
+ return { code: r.status, out: r.stdout, err: r.stderr };
62
+ }
63
+ /**
64
+ * Datos fijos para la cuota, válidos a cualquier hora de cualquier día.
65
+ *
66
+ * No sirve la demo: pone las sesiones de Codex por la tarde, y un lunes por
67
+ * la mañana la semana aún no tiene ninguna — estos tests fallaban según el
68
+ * momento en que se ejecutaran. Aquí todo cae a mitad de camino entre el
69
+ * lunes a las 00:00 y ahora, que siempre es esta semana.
70
+ */
71
+ function sembrarCuota(dbPath) {
72
+ const ahora = new Date();
73
+ const lunes = (0, quota_js_1.weekStart)(ahora);
74
+ const enEstaSemana = new Date((lunes.getTime() + ahora.getTime()) / 2);
75
+ const haceSemanas = (n) => new Date(lunes.getTime() - n * 7 * 86_400_000 + 3600_000);
76
+ let n = 0;
77
+ const t = (agent, at, repo, cacheRead) => ({
78
+ agent, turnId: `q${n++}`, sessionId: "s", at, model: "m", repoPath: repo, branch: "main",
79
+ tokens: { input: 1, output: 10, cacheRead, cacheWrite5m: 0, cacheWrite1h: 0 }, producerVersion: null,
80
+ });
81
+ const db = (0, schema_js_1.openDatabase)(dbPath);
82
+ try {
83
+ store.upsertClient(db, { id: "c", name: "C", currency: "EUR" });
84
+ for (const id of ["web", "api"]) {
85
+ store.upsertProject(db, { id, clientId: "c", name: id, repoPaths: [`/repos/${id}`], billable: true,
86
+ roundingMinutes: 0, aiCostPolicy: "absorbed", kind: "client" });
87
+ }
88
+ store.saveTurns(db, [
89
+ // Claude Code: seis semanas de historial, así que compara.
90
+ t("claude-code", haceSemanas(6), "/repos/web", 100),
91
+ t("claude-code", enEstaSemana, "/repos/web", 3000),
92
+ t("claude-code", enEstaSemana, "/repos/api", 1000),
93
+ // Codex: empezó esta semana, así que no hay con qué comparar.
94
+ t("codex", enEstaSemana, "/repos/api", 500),
95
+ ]);
96
+ }
97
+ finally {
98
+ db.close();
99
+ }
100
+ }
101
+ function entorno() {
102
+ const home = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "estela-quota-"));
103
+ return { home, db: (0, node_path_1.join)(home, "estela.db") };
104
+ }
105
+ /** Un transcript de Claude Code con un turno de hace media hora, en `cwd`. */
106
+ function transcript(home, cwd, id, cacheRead) {
107
+ const dir = (0, node_path_1.join)(home, ".claude", "projects", "-proyecto");
108
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
109
+ const at = new Date(Date.now() - 30 * 60_000).toISOString();
110
+ const linea = JSON.stringify({
111
+ type: "assistant", timestamp: at, cwd, gitBranch: "main", version: "2.1.238", sessionId: "s1",
112
+ message: { id, model: "claude-sonnet-4-6",
113
+ usage: { input_tokens: 10, output_tokens: 100, cache_read_input_tokens: cacheRead,
114
+ cache_creation_input_tokens: 0 } },
115
+ });
116
+ // Dos veces la misma fila: Claude Code repite el turno en el transcript.
117
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dir, "sesion.jsonl"), `${linea}\n${linea}\n`);
118
+ }
119
+ (0, node_test_1.test)("sin nada guardado, lo dice y sugiere setup en vez de enseñar una tabla vacía", () => {
120
+ const { home, db } = entorno();
121
+ const r = estela(home, "es", "quota", "--db", db, "--no-refresh");
122
+ strict_1.default.equal(r.code, 0, r.err);
123
+ strict_1.default.match(r.out, /Sin turnos de agente guardados\. Empieza con: estela setup/);
124
+ strict_1.default.match(r.out, /no es el límite de tu plan/);
125
+ });
126
+ (0, node_test_1.test)("refresca los transcripts de esta semana antes de calcular, y un turno repetido cuenta una vez", () => {
127
+ const { home, db } = entorno();
128
+ transcript(home, "/repos/web", "msg_cuota_1", 5000);
129
+ const r = estela(home, "es", "quota", "--db", db, "--json");
130
+ strict_1.default.equal(r.code, 0, r.err);
131
+ const j = JSON.parse(r.out);
132
+ strict_1.default.equal(j.agents[0].agent, "claude-code");
133
+ // 10 + 100 + 5000, una sola vez aunque el transcript traiga la fila dos veces.
134
+ strict_1.default.equal(j.agents[0].week.total.total, 5110);
135
+ // Repetirlo no duplica: el turno ya está guardado.
136
+ const otra = JSON.parse(estela(home, "es", "quota", "--db", db, "--json").out);
137
+ strict_1.default.equal(otra.agents[0].week.total.total, 5110);
138
+ });
139
+ (0, node_test_1.test)("--no-refresh no lee transcripts: usa solo lo ya guardado", () => {
140
+ const { home, db } = entorno();
141
+ transcript(home, "/repos/web", "msg_cuota_2", 5000);
142
+ const r = estela(home, "es", "quota", "--db", db, "--no-refresh", "--json");
143
+ strict_1.default.equal(r.code, 0, r.err);
144
+ strict_1.default.deepEqual(JSON.parse(r.out).agents, []);
145
+ });
146
+ (0, node_test_1.test)("sobre la base de la demo nunca lee tus transcripts, aunque no se pase --no-refresh", () => {
147
+ // Mezclaría tu trabajo real con los datos inventados, justo lo que la demo
148
+ // promete no hacer.
149
+ const { home } = entorno();
150
+ const demo = (0, node_path_1.join)(home, "estela-demo.db");
151
+ (0, schema_js_1.openDatabase)(demo).close();
152
+ transcript(home, "/repos/web", "msg_real", 5000);
153
+ const r = estela(home, "es", "quota", "--db", demo, "--json");
154
+ strict_1.default.equal(r.code, 0, r.err);
155
+ const conn = (0, schema_js_1.openDatabase)(demo);
156
+ try {
157
+ strict_1.default.equal(store.firstTurnByAgent(conn).size, 0, "no se guardó ningún turno real en la demo");
158
+ }
159
+ finally {
160
+ conn.close();
161
+ }
162
+ });
163
+ (0, node_test_1.test)("--json es JSON y nada más: ni avisos ni cabeceras en la salida", () => {
164
+ const { home, db } = entorno();
165
+ sembrarCuota(db);
166
+ const r = estela(home, "es", "quota", "--db", db, "--no-refresh", "--json");
167
+ strict_1.default.equal(r.code, 0, r.err);
168
+ const j = JSON.parse(r.out);
169
+ strict_1.default.equal(j.windowIsEstimate, true);
170
+ strict_1.default.equal(j.windowHours, 5);
171
+ strict_1.default.deepEqual(j.agents.map((a) => a.agent), ["claude-code", "codex"]);
172
+ // Seis semanas de Claude Code y Codex recién empezado: uno compara, el otro no.
173
+ strict_1.default.equal(j.agents[0].comparison.status, "ok");
174
+ strict_1.default.equal(j.agents[1].comparison.status, "insufficient");
175
+ const shares = j.agents[0].week.projects.map((p) => p.share);
176
+ strict_1.default.ok(Math.abs(shares.reduce((s, x) => s + x, 0) - 1) < 0.001, "los porcentajes suman el 100 %");
177
+ });
178
+ (0, node_test_1.test)("la salida en texto, en los dos idiomas, sin promesas sobre lo que queda", () => {
179
+ const { home, db } = entorno();
180
+ sembrarCuota(db);
181
+ const es = estela(home, "es", "quota", "--db", db, "--no-refresh").out;
182
+ strict_1.default.match(es, /Claude Code — esta semana \(lun \d+ \w+ → hoy\)/);
183
+ strict_1.default.match(es, /Proyecto\s+Entrada\s+Salida\s+Lect\. caché\s+Escr\. caché\s+Total\s+%/);
184
+ strict_1.default.match(es, /Sin historial suficiente para comparar: hacen falta 4 semanas completas y hay \d\./);
185
+ strict_1.default.match(es, /La ventana de 5 h es una estimación/);
186
+ const en = estela(home, "en", "quota", "--db", db, "--no-refresh").out;
187
+ strict_1.default.match(en, /Claude Code — this week \(Mon \w+ \d+ → today\)/);
188
+ strict_1.default.match(en, /Project\s+Input\s+Output\s+Cache read\s+Cache write\s+Total\s+%/);
189
+ strict_1.default.match(en, /The 5-hour window is an estimate/);
190
+ // La regla que no se rompe: nada de "te quedan" ni de cuándo se acaba.
191
+ for (const out of [es, en]) {
192
+ strict_1.default.doesNotMatch(out, /te quedan|quedan \d|se te acaba|you have \d|left until|runs out/i);
193
+ }
194
+ });
195
+ (0, node_test_1.test)("Copilot queda fuera, y se dice en una línea", () => {
196
+ const { home, db } = entorno();
197
+ const conn = (0, schema_js_1.openDatabase)(db);
198
+ try {
199
+ store.saveTurns(conn, [{
200
+ agent: "copilot", turnId: "copilot:1:end", sessionId: "s", at: new Date(Date.now() - 60_000),
201
+ model: "gpt-4o", repoPath: "/repos/web", branch: null,
202
+ tokens: { input: 900, output: 100, cacheRead: 0, cacheWrite5m: 0, cacheWrite1h: 0 },
203
+ producerVersion: null,
204
+ }]);
205
+ }
206
+ finally {
207
+ conn.close();
208
+ }
209
+ const r = estela(home, "es", "quota", "--db", db, "--no-refresh");
210
+ strict_1.default.match(r.out, /Copilot no guarda tokens fiables y queda fuera de este cálculo\./);
211
+ strict_1.default.match(r.out, /Sin consumo de Claude Code ni Codex esta semana\./);
212
+ const j = JSON.parse(estela(home, "es", "quota", "--db", db, "--no-refresh", "--json").out);
213
+ strict_1.default.deepEqual(j.agents, []);
214
+ strict_1.default.deepEqual(j.excluded.map((e) => e.agent), ["copilot"]);
215
+ });
216
+ //# sourceMappingURL=cli-quota.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-quota.test.js","sourceRoot":"","sources":["../src/cli-quota.test.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAyCA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAu3DpD,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA6CA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAsoEpD,OAAO,EAAE,eAAe,EAAE,CAAC"}