estela 0.3.4 → 0.4.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/README.md +97 -0
- package/dist/billing/assign.d.ts +11 -1
- package/dist/billing/assign.js +59 -1
- package/dist/billing/sessionize.d.ts +6 -0
- package/dist/billing/sessionize.js +24 -5
- package/dist/cli.js +1084 -8
- package/dist/db/schema.js +91 -0
- package/dist/db/store.d.ts +28 -0
- package/dist/db/store.js +120 -1
- package/dist/delivery/clients.d.ts +52 -0
- package/dist/delivery/clients.js +94 -0
- package/dist/delivery/github.d.ts +21 -0
- package/dist/delivery/github.js +123 -0
- package/dist/delivery/report.d.ts +55 -0
- package/dist/delivery/report.js +124 -0
- package/dist/delivery/source.d.ts +68 -0
- package/dist/delivery/source.js +3 -0
- package/dist/export/csv.d.ts +14 -0
- package/dist/export/csv.js +78 -0
- package/dist/export/finance.d.ts +79 -0
- package/dist/export/finance.js +208 -0
- package/dist/i18n/en.js +166 -0
- package/dist/metrics/spend.d.ts +83 -0
- package/dist/metrics/spend.js +167 -0
- package/dist/metrics/undelivered.d.ts +104 -0
- package/dist/metrics/undelivered.js +199 -0
- package/dist/server.js +1 -0
- package/dist/watchers/git.d.ts +40 -0
- package/dist/watchers/git.js +87 -0
- package/node_modules/@estela/shared/dist/money.d.ts +2 -0
- package/node_modules/@estela/shared/dist/money.d.ts.map +1 -1
- package/node_modules/@estela/shared/dist/money.js +7 -7
- package/node_modules/@estela/shared/dist/money.js.map +1 -1
- package/node_modules/@estela/shared/dist/types.d.ts +2 -0
- package/node_modules/@estela/shared/dist/types.d.ts.map +1 -1
- package/node_modules/@estela/shared/dist/workitems.d.ts +10 -0
- package/node_modules/@estela/shared/dist/workitems.d.ts.map +1 -1
- package/node_modules/@estela/shared/dist/workitems.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BASE_BRANCHES = void 0;
|
|
4
|
+
exports.undeliveredSpend = undeliveredSpend;
|
|
5
|
+
exports.shareOf = shareOf;
|
|
6
|
+
const shared_1 = require("@estela/shared");
|
|
7
|
+
const amortize_js_1 = require("../billing/amortize.js");
|
|
8
|
+
const spend_js_1 = require("./spend.js");
|
|
9
|
+
/** El mismo hueco que separa bloques de trabajo (ver sessionize). */
|
|
10
|
+
const GAP_MS = 30 * 60_000;
|
|
11
|
+
const DAY_MS = 86_400_000;
|
|
12
|
+
const UNPRICED_AGENTS = new Set(["copilot"]);
|
|
13
|
+
/** Ramas donde se integra: trabajar directamente en ellas ya es entregar. */
|
|
14
|
+
exports.BASE_BRANCHES = new Set(["main", "master", "develop", "trunk"]);
|
|
15
|
+
function undeliveredSpend(input) {
|
|
16
|
+
const byProject = new Map();
|
|
17
|
+
for (const t of input.turns) {
|
|
18
|
+
const list = byProject.get(t.projectId) ?? [];
|
|
19
|
+
list.push(t);
|
|
20
|
+
byProject.set(t.projectId, list);
|
|
21
|
+
}
|
|
22
|
+
const reports = [];
|
|
23
|
+
for (const [projectId, turns] of byProject) {
|
|
24
|
+
const report = projectReport(projectId, turns, input);
|
|
25
|
+
if (report.total.consumption.microUsd > 0 || report.unpricedAgents)
|
|
26
|
+
reports.push(report);
|
|
27
|
+
}
|
|
28
|
+
return reports.sort((a, b) => a.projectId.localeCompare(b.projectId));
|
|
29
|
+
}
|
|
30
|
+
function projectReport(projectId, all, input) {
|
|
31
|
+
const inPeriod = (d) => {
|
|
32
|
+
const day = (0, shared_1.localDate)(d);
|
|
33
|
+
return (!input.from || day >= input.from) && (!input.to || day <= input.to);
|
|
34
|
+
};
|
|
35
|
+
const spend = new SpendAcc(input);
|
|
36
|
+
// Ratos de cada chat: mismo session_id y repo, cortados por pausas largas.
|
|
37
|
+
const sittings = [];
|
|
38
|
+
const bySession = new Map();
|
|
39
|
+
for (const t of all) {
|
|
40
|
+
const key = `${t.sessionId}\0${t.root}`;
|
|
41
|
+
const list = bySession.get(key) ?? [];
|
|
42
|
+
list.push(t);
|
|
43
|
+
bySession.set(key, list);
|
|
44
|
+
}
|
|
45
|
+
for (const list of bySession.values()) {
|
|
46
|
+
list.sort((a, b) => a.at.getTime() - b.at.getTime());
|
|
47
|
+
let current = [];
|
|
48
|
+
for (const t of list) {
|
|
49
|
+
const last = current[current.length - 1];
|
|
50
|
+
if (last && t.at.getTime() - last.at.getTime() > GAP_MS) {
|
|
51
|
+
sittings.push({ turns: current, root: last.root });
|
|
52
|
+
current = [];
|
|
53
|
+
}
|
|
54
|
+
current.push(t);
|
|
55
|
+
}
|
|
56
|
+
if (current.length)
|
|
57
|
+
sittings.push({ turns: current, root: current[0].root });
|
|
58
|
+
}
|
|
59
|
+
// El primer commit tuyo de cada repo: antes de él, no hay con qué comparar.
|
|
60
|
+
const firstCommit = new Map();
|
|
61
|
+
for (const c of input.commits) {
|
|
62
|
+
firstCommit.set(c.root, Math.min(firstCommit.get(c.root) ?? Infinity, c.at.getTime()));
|
|
63
|
+
}
|
|
64
|
+
const total = spend.empty();
|
|
65
|
+
const unverifiable = spend.empty();
|
|
66
|
+
let unverifiableCount = 0;
|
|
67
|
+
const noCommit = spend.empty();
|
|
68
|
+
const later = spend.empty();
|
|
69
|
+
let noCommitCount = 0;
|
|
70
|
+
let laterCount = 0;
|
|
71
|
+
const counted = new Set();
|
|
72
|
+
for (const s of sittings) {
|
|
73
|
+
const first = s.turns[0];
|
|
74
|
+
if (!inPeriod(first.at))
|
|
75
|
+
continue;
|
|
76
|
+
for (const t of s.turns)
|
|
77
|
+
spend.add(total, t);
|
|
78
|
+
const start = first.at.getTime();
|
|
79
|
+
const end = s.turns[s.turns.length - 1].at.getTime();
|
|
80
|
+
const committed = input.commits.some((c) => c.root === s.root && c.at.getTime() >= start && c.at.getTime() <= end + GAP_MS);
|
|
81
|
+
if (committed)
|
|
82
|
+
continue;
|
|
83
|
+
if (start < (firstCommit.get(s.root) ?? Infinity)) {
|
|
84
|
+
unverifiableCount++;
|
|
85
|
+
for (const t of s.turns) {
|
|
86
|
+
spend.add(unverifiable, t);
|
|
87
|
+
counted.add(t);
|
|
88
|
+
}
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
noCommitCount++;
|
|
92
|
+
for (const t of s.turns) {
|
|
93
|
+
spend.add(noCommit, t);
|
|
94
|
+
counted.add(t);
|
|
95
|
+
}
|
|
96
|
+
const branches = new Set(s.turns.map((t) => t.branch).filter((b) => !!b));
|
|
97
|
+
const afterwards = input.commits.some((c) => c.root === s.root && c.branch !== null
|
|
98
|
+
&& branches.has(c.branch) && c.at.getTime() > end && c.at.getTime() <= end + input.staleDays * DAY_MS);
|
|
99
|
+
if (afterwards) {
|
|
100
|
+
laterCount++;
|
|
101
|
+
for (const t of s.turns)
|
|
102
|
+
spend.add(later, t);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Ramas: el coste que no está ya en una sesión sin commit.
|
|
106
|
+
const lastActivity = new Map();
|
|
107
|
+
const touch = (root, branch, at) => {
|
|
108
|
+
const k = `${root}\0${branch}`;
|
|
109
|
+
lastActivity.set(k, Math.max(lastActivity.get(k) ?? 0, at.getTime()));
|
|
110
|
+
};
|
|
111
|
+
for (const t of all)
|
|
112
|
+
if (t.branch)
|
|
113
|
+
touch(t.root, t.branch, t.at);
|
|
114
|
+
const roots = new Set(all.map((t) => t.root));
|
|
115
|
+
for (const c of input.commits)
|
|
116
|
+
if (c.branch && roots.has(c.root))
|
|
117
|
+
touch(c.root, c.branch, c.at);
|
|
118
|
+
const lines = new Map();
|
|
119
|
+
for (const s of sittings) {
|
|
120
|
+
if (!inPeriod(s.turns[0].at))
|
|
121
|
+
continue;
|
|
122
|
+
for (const t of s.turns) {
|
|
123
|
+
if (counted.has(t) || !t.branch || t.branch === "HEAD" || exports.BASE_BRANCHES.has(t.branch))
|
|
124
|
+
continue;
|
|
125
|
+
const k = `${t.root}\0${t.branch}`;
|
|
126
|
+
let line = lines.get(k);
|
|
127
|
+
if (!line) {
|
|
128
|
+
line = { branch: t.branch, root: t.root, acc: spend.empty() };
|
|
129
|
+
lines.set(k, line);
|
|
130
|
+
}
|
|
131
|
+
spend.add(line.acc, t);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const unmergedAcc = spend.empty();
|
|
135
|
+
const unmergedLines = [];
|
|
136
|
+
const notCounted = [];
|
|
137
|
+
for (const [k, { branch, root, acc }] of lines) {
|
|
138
|
+
const facts = input.branchFacts(root, branch);
|
|
139
|
+
if (facts.merged)
|
|
140
|
+
continue;
|
|
141
|
+
const idleDays = Math.floor((input.now.getTime() - (lastActivity.get(k) ?? 0)) / DAY_MS);
|
|
142
|
+
const state = facts.exists !== true ? "unknown" : idleDays >= input.staleDays ? "unmerged" : "open";
|
|
143
|
+
const line = { branch, state, idleDays, ...spend.finish(acc) };
|
|
144
|
+
if (state === "unmerged") {
|
|
145
|
+
unmergedLines.push(line);
|
|
146
|
+
spend.merge(unmergedAcc, acc);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
notCounted.push(line);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const byCost = (a, b) => b.consumption.microUsd - a.consumption.microUsd;
|
|
153
|
+
const undelivered = spend.empty();
|
|
154
|
+
spend.merge(undelivered, noCommit);
|
|
155
|
+
spend.merge(undelivered, unmergedAcc);
|
|
156
|
+
return {
|
|
157
|
+
projectId,
|
|
158
|
+
total: spend.finish(total),
|
|
159
|
+
unverifiable: { ...spend.finish(unverifiable), count: unverifiableCount },
|
|
160
|
+
sessionsWithoutCommit: {
|
|
161
|
+
...spend.finish(noCommit), count: noCommitCount,
|
|
162
|
+
laterCommitted: { ...spend.finish(later), count: laterCount },
|
|
163
|
+
},
|
|
164
|
+
unmerged: { ...spend.finish(unmergedAcc), branches: unmergedLines.sort(byCost) },
|
|
165
|
+
notCounted: notCounted.sort(byCost),
|
|
166
|
+
undelivered: spend.finish(undelivered),
|
|
167
|
+
unpricedAgents: total.unpriced,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/** Suma coste por mes, para repartir la cuota igual que `ai-cost`. */
|
|
171
|
+
class SpendAcc {
|
|
172
|
+
input;
|
|
173
|
+
constructor(input) {
|
|
174
|
+
this.input = input;
|
|
175
|
+
}
|
|
176
|
+
empty() { return { microUsd: 0, byMonth: new Map(), unpriced: false }; }
|
|
177
|
+
add(acc, t) {
|
|
178
|
+
acc.microUsd += t.microUsd;
|
|
179
|
+
const month = (0, amortize_js_1.monthOf)(t.at);
|
|
180
|
+
acc.byMonth.set(month, (acc.byMonth.get(month) ?? 0) + t.microUsd);
|
|
181
|
+
if (UNPRICED_AGENTS.has(t.agent))
|
|
182
|
+
acc.unpriced = true;
|
|
183
|
+
}
|
|
184
|
+
merge(into, from) {
|
|
185
|
+
into.microUsd += from.microUsd;
|
|
186
|
+
for (const [m, v] of from.byMonth)
|
|
187
|
+
into.byMonth.set(m, (into.byMonth.get(m) ?? 0) + v);
|
|
188
|
+
into.unpriced ||= from.unpriced;
|
|
189
|
+
}
|
|
190
|
+
finish(acc) {
|
|
191
|
+
const { real, partial } = (0, spend_js_1.realFromMonths)(acc.byMonth, this.input.subscriptions, (month) => this.input.monthTotals.get(month)?.microUsd ?? 0);
|
|
192
|
+
return { consumption: { microUsd: acc.microUsd }, real, realPartial: partial };
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** El porcentaje de una parte sobre el total, en tanto por ciento. `null` sin total. */
|
|
196
|
+
function shareOf(part, total) {
|
|
197
|
+
return total.consumption.microUsd === 0 ? null : (part.consumption.microUsd / total.consumption.microUsd) * 100;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=undelivered.js.map
|
package/dist/server.js
CHANGED
|
@@ -129,6 +129,7 @@ async function importOnce(dbPath) {
|
|
|
129
129
|
if (!root)
|
|
130
130
|
continue;
|
|
131
131
|
store.saveCommits(db, await (0, git_js_1.readCommits)(root, {}));
|
|
132
|
+
store.saveMerges(db, await (0, git_js_1.readMerges)(root, {}));
|
|
132
133
|
}
|
|
133
134
|
// Todo lo conocido, no solo lo leído ahora (ver knownTurns), y los correos
|
|
134
135
|
// de todos esos repos: sin ellos, un día antiguo perdería sus commits.
|
package/dist/watchers/git.d.ts
CHANGED
|
@@ -4,6 +4,41 @@ export declare function readCommits(repoPath: string, options?: {
|
|
|
4
4
|
authorEmail?: string;
|
|
5
5
|
authorEmails?: readonly string[];
|
|
6
6
|
}): Promise<CommitRecord[]>;
|
|
7
|
+
/** Un commit de merge: qué rama se integró y, si lo dice, con qué PR. */
|
|
8
|
+
export interface MergeRecord {
|
|
9
|
+
readonly repoPath: string;
|
|
10
|
+
readonly hash: string;
|
|
11
|
+
readonly at: Date;
|
|
12
|
+
readonly sourceBranch: string | null;
|
|
13
|
+
/** `github:12` o `gitlab:45`. `null` en un merge local sin PR. */
|
|
14
|
+
readonly ref: string | null;
|
|
15
|
+
readonly subject: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Commits de merge de todas las ramas.
|
|
19
|
+
*
|
|
20
|
+
* Es lo único en git que une una rama con su PR sin preguntar a GitHub: el
|
|
21
|
+
* mensaje lo escribe la plataforma con un formato fijo. Un squash no deja
|
|
22
|
+
* merge (solo "Título (#12)" en la rama principal), así que de él no se sabe
|
|
23
|
+
* qué rama fue.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readMerges(repoPath: string, options?: {
|
|
26
|
+
since?: Date;
|
|
27
|
+
}): Promise<MergeRecord[]>;
|
|
28
|
+
/**
|
|
29
|
+
* La rama y el PR de un mensaje de merge, con los formatos que escriben las
|
|
30
|
+
* plataformas y git:
|
|
31
|
+
*
|
|
32
|
+
* Merge pull request #12 from ana/feat/login (GitHub)
|
|
33
|
+
* Merge branch 'feat/login' into 'main' + "See merge request grupo/app!45" (GitLab)
|
|
34
|
+
* Merge branch 'feat/login' [into main] (git, sin PR)
|
|
35
|
+
*
|
|
36
|
+
* Cualquier otro mensaje (alguien lo reescribió) no se adivina.
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseMergeMessage(subject: string, body?: string): {
|
|
39
|
+
sourceBranch: string | null;
|
|
40
|
+
ref: string | null;
|
|
41
|
+
};
|
|
7
42
|
/**
|
|
8
43
|
* Raíz del repositorio.
|
|
9
44
|
*
|
|
@@ -32,6 +67,11 @@ export declare function rootCommitFingerprint(path: string): Promise<string | nu
|
|
|
32
67
|
* otros en `develop`— y equivocarse la marcaría todo como abierto.
|
|
33
68
|
*/
|
|
34
69
|
export declare function mergedBranches(path: string): Promise<Set<string>>;
|
|
70
|
+
/**
|
|
71
|
+
* Ramas que existen hoy, locales y remotas, sin el prefijo del remoto. `null`
|
|
72
|
+
* si el repositorio no se puede leer (se borró o se movió): entonces no se sabe.
|
|
73
|
+
*/
|
|
74
|
+
export declare function branchNames(path: string): Promise<Set<string> | null>;
|
|
35
75
|
/** Rama donde el equipo integra. `develop` gana a `main` si existe. */
|
|
36
76
|
export declare function integrationBranch(root: string): Promise<string | null>;
|
|
37
77
|
/** Rama activa del repositorio. Ya no se usa para etiquetar commits. */
|
package/dist/watchers/git.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.readCommits = readCommits;
|
|
4
|
+
exports.readMerges = readMerges;
|
|
5
|
+
exports.parseMergeMessage = parseMergeMessage;
|
|
4
6
|
exports.repoRoot = repoRoot;
|
|
5
7
|
exports.rootCommitFingerprint = rootCommitFingerprint;
|
|
6
8
|
exports.mergedBranches = mergedBranches;
|
|
9
|
+
exports.branchNames = branchNames;
|
|
7
10
|
exports.integrationBranch = integrationBranch;
|
|
8
11
|
exports.currentBranch = currentBranch;
|
|
9
12
|
exports.repoAuthors = repoAuthors;
|
|
@@ -102,6 +105,68 @@ async function readCommits(repoPath, options = {}) {
|
|
|
102
105
|
}
|
|
103
106
|
return commits;
|
|
104
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Commits de merge de todas las ramas.
|
|
110
|
+
*
|
|
111
|
+
* Es lo único en git que une una rama con su PR sin preguntar a GitHub: el
|
|
112
|
+
* mensaje lo escribe la plataforma con un formato fijo. Un squash no deja
|
|
113
|
+
* merge (solo "Título (#12)" en la rama principal), así que de él no se sabe
|
|
114
|
+
* qué rama fue.
|
|
115
|
+
*/
|
|
116
|
+
async function readMerges(repoPath, options = {}) {
|
|
117
|
+
const root = await repoRoot(repoPath);
|
|
118
|
+
if (!root)
|
|
119
|
+
return [];
|
|
120
|
+
const format = RECORD + ["%H", "%aI", "%s", "%b"].join(SEP);
|
|
121
|
+
const args = ["log", "--all", "--merges", `--pretty=format:${format}`];
|
|
122
|
+
if (options.since)
|
|
123
|
+
args.push(`--since=${options.since.toISOString()}`);
|
|
124
|
+
let stdout;
|
|
125
|
+
try {
|
|
126
|
+
({ stdout } = await run("git", args, { cwd: root, maxBuffer: 64 * 1024 * 1024 }));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
const merges = [];
|
|
132
|
+
for (const chunk of stdout.split(RECORD)) {
|
|
133
|
+
const [hash, iso, subject = "", body = ""] = chunk.split(SEP);
|
|
134
|
+
if (!hash || !iso)
|
|
135
|
+
continue;
|
|
136
|
+
const at = new Date(iso);
|
|
137
|
+
if (Number.isNaN(at.getTime()))
|
|
138
|
+
continue;
|
|
139
|
+
const { sourceBranch, ref } = parseMergeMessage(subject.trim(), body);
|
|
140
|
+
merges.push({ repoPath: root, hash: hash.trim(), at, sourceBranch, ref, subject: subject.trim() });
|
|
141
|
+
}
|
|
142
|
+
return merges;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* La rama y el PR de un mensaje de merge, con los formatos que escriben las
|
|
146
|
+
* plataformas y git:
|
|
147
|
+
*
|
|
148
|
+
* Merge pull request #12 from ana/feat/login (GitHub)
|
|
149
|
+
* Merge branch 'feat/login' into 'main' + "See merge request grupo/app!45" (GitLab)
|
|
150
|
+
* Merge branch 'feat/login' [into main] (git, sin PR)
|
|
151
|
+
*
|
|
152
|
+
* Cualquier otro mensaje (alguien lo reescribió) no se adivina.
|
|
153
|
+
*/
|
|
154
|
+
function parseMergeMessage(subject, body = "") {
|
|
155
|
+
const github = /^Merge pull request #(\d+) from (\S+)/.exec(subject);
|
|
156
|
+
if (github) {
|
|
157
|
+
// "from <dueño>/<rama>": la rama puede llevar barras, el dueño no.
|
|
158
|
+
const from = github[2];
|
|
159
|
+
const slash = from.indexOf("/");
|
|
160
|
+
return { sourceBranch: slash === -1 ? from : from.slice(slash + 1), ref: `github:${github[1]}` };
|
|
161
|
+
}
|
|
162
|
+
const branch = /^Merge (?:remote-tracking )?branch '([^']+)'/.exec(subject);
|
|
163
|
+
if (branch) {
|
|
164
|
+
const gitlab = /See merge request \S*!(\d+)/.exec(body);
|
|
165
|
+
const name = branch[1].replace(/^origin\//, "");
|
|
166
|
+
return { sourceBranch: name, ref: gitlab ? `gitlab:${gitlab[1]}` : null };
|
|
167
|
+
}
|
|
168
|
+
return { sourceBranch: null, ref: null };
|
|
169
|
+
}
|
|
105
170
|
/**
|
|
106
171
|
* Raíz del repositorio.
|
|
107
172
|
*
|
|
@@ -174,6 +239,28 @@ async function mergedBranches(path) {
|
|
|
174
239
|
}
|
|
175
240
|
return merged;
|
|
176
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Ramas que existen hoy, locales y remotas, sin el prefijo del remoto. `null`
|
|
244
|
+
* si el repositorio no se puede leer (se borró o se movió): entonces no se sabe.
|
|
245
|
+
*/
|
|
246
|
+
async function branchNames(path) {
|
|
247
|
+
const root = await repoRoot(path);
|
|
248
|
+
if (!root)
|
|
249
|
+
return null;
|
|
250
|
+
try {
|
|
251
|
+
const { stdout } = await run("git", ["for-each-ref", "--format=%(refname)", "refs/heads", "refs/remotes"], { cwd: root });
|
|
252
|
+
const names = new Set();
|
|
253
|
+
for (const line of stdout.split("\n")) {
|
|
254
|
+
const name = line.trim().replace(/^refs\/(heads|remotes\/[^/]+)\//, "");
|
|
255
|
+
if (name && name !== "HEAD")
|
|
256
|
+
names.add(name);
|
|
257
|
+
}
|
|
258
|
+
return names;
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
177
264
|
/** Rama donde el equipo integra. `develop` gana a `main` si existe. */
|
|
178
265
|
async function integrationBranch(root) {
|
|
179
266
|
for (const candidate of ["develop", "main", "master"]) {
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
* perdería entero.
|
|
12
12
|
*/
|
|
13
13
|
export type Currency = "EUR" | "USD" | "GBP" | "MXN" | "COP" | "ARS" | "CLP" | "PEN" | "BRL";
|
|
14
|
+
/** Decimales de la unidad menor por moneda (ISO 4217). */
|
|
15
|
+
export declare const MINOR_UNIT_DIGITS: Record<Currency, number>;
|
|
14
16
|
/** Importe facturable. `amount` son unidades menores enteras de `currency`. */
|
|
15
17
|
export interface Money {
|
|
16
18
|
readonly amount: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAE7F,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAEtD,CAAC;AAEF,+EAA+E;AAC/E,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,6EAA6E;AAC7E,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,YAAY,EAAE,MAAwB,CAAC;AAEpD,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAK/D;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAenE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,CAGlD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAS3E;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE1D;AAQD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAQ3E;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAEhF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,GAAG,KAAK,CAGxE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAI9E;AAaD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAiC;AAErF,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,SAAqB,GAAG,MAAM,CAQzE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAIjD;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAG5C;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQtD"}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* perdería entero.
|
|
13
13
|
*/
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.ZERO_AI_COST = void 0;
|
|
15
|
+
exports.ZERO_AI_COST = exports.MINOR_UNIT_DIGITS = void 0;
|
|
16
16
|
exports.money = money;
|
|
17
17
|
exports.parseMoney = parseMoney;
|
|
18
18
|
exports.addMoney = addMoney;
|
|
@@ -30,7 +30,7 @@ exports.formatAiCost = formatAiCost;
|
|
|
30
30
|
exports.localDate = localDate;
|
|
31
31
|
exports.formatDuration = formatDuration;
|
|
32
32
|
/** Decimales de la unidad menor por moneda (ISO 4217). */
|
|
33
|
-
|
|
33
|
+
exports.MINOR_UNIT_DIGITS = {
|
|
34
34
|
EUR: 2, USD: 2, GBP: 2, MXN: 2, COP: 2, ARS: 2, CLP: 0, PEN: 2, BRL: 2,
|
|
35
35
|
};
|
|
36
36
|
exports.ZERO_AI_COST = { microUsd: 0 };
|
|
@@ -46,7 +46,7 @@ function parseMoney(input, currency) {
|
|
|
46
46
|
if (!/^-?\d+(\.\d+)?$/.test(trimmed)) {
|
|
47
47
|
throw new TypeError(`Importe no reconocido: "${input}"`);
|
|
48
48
|
}
|
|
49
|
-
const digits = MINOR_UNIT_DIGITS[currency];
|
|
49
|
+
const digits = exports.MINOR_UNIT_DIGITS[currency];
|
|
50
50
|
const [whole = "0", frac = ""] = trimmed.split(".");
|
|
51
51
|
const negative = whole.startsWith("-");
|
|
52
52
|
const wholeDigits = negative ? whole.slice(1) : whole;
|
|
@@ -96,8 +96,8 @@ function convertMoney(from, to, rate) {
|
|
|
96
96
|
if (!(rate > 0) || !Number.isFinite(rate)) {
|
|
97
97
|
throw new TypeError(`Tipo de cambio inválido: ${rate}`);
|
|
98
98
|
}
|
|
99
|
-
const fromDigits = MINOR_UNIT_DIGITS[from.currency];
|
|
100
|
-
const toDigits = MINOR_UNIT_DIGITS[to];
|
|
99
|
+
const fromDigits = exports.MINOR_UNIT_DIGITS[from.currency];
|
|
100
|
+
const toDigits = exports.MINOR_UNIT_DIGITS[to];
|
|
101
101
|
const major = from.amount / 10 ** fromDigits;
|
|
102
102
|
return { amount: Math.round(major * rate * 10 ** toDigits), currency: to };
|
|
103
103
|
}
|
|
@@ -138,7 +138,7 @@ const SYMBOLS = {
|
|
|
138
138
|
let defaultMoneyLocale = "es-EC";
|
|
139
139
|
function setMoneyLocale(locale) { defaultMoneyLocale = locale; }
|
|
140
140
|
function formatMoney(m, locale = defaultMoneyLocale) {
|
|
141
|
-
const digits = MINOR_UNIT_DIGITS[m.currency];
|
|
141
|
+
const digits = exports.MINOR_UNIT_DIGITS[m.currency];
|
|
142
142
|
const value = (m.amount / 10 ** digits).toLocaleString(locale, {
|
|
143
143
|
minimumFractionDigits: digits,
|
|
144
144
|
maximumFractionDigits: digits,
|
|
@@ -152,7 +152,7 @@ function formatMoney(m, locale = defaultMoneyLocale) {
|
|
|
152
152
|
* ticket), donde los céntimos solo estorban.
|
|
153
153
|
*/
|
|
154
154
|
function formatMoneyWhole(m) {
|
|
155
|
-
const value = Math.round(m.amount / 10 ** MINOR_UNIT_DIGITS[m.currency]).toLocaleString("en-US");
|
|
155
|
+
const value = Math.round(m.amount / 10 ** exports.MINOR_UNIT_DIGITS[m.currency]).toLocaleString("en-US");
|
|
156
156
|
const symbol = SYMBOLS[m.currency];
|
|
157
157
|
return symbol ? `${symbol}${value}` : `${value} ${m.currency}`;
|
|
158
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"money.js","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAsBH,sBAKC;AAGD,gCAeC;AAED,4BAGC;AAED,4BASC;AAED,8BAEC;AAED,8BAEC;AAiBD,oCAQC;AAGD,sCAEC;AASD,wCAGC;AAMD,oCAIC;AAaD,wCAAqF;AAErF,kCAQC;AAOD,4CAIC;AAGD,oCAIC;AAYD,8BAGC;AAED,wCAQC;AAvLD,0DAA0D;
|
|
1
|
+
{"version":3,"file":"money.js","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"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"}
|
|
@@ -286,6 +286,8 @@ export interface TimeEntry {
|
|
|
286
286
|
* base siempre viene, aunque sea vacío.
|
|
287
287
|
*/
|
|
288
288
|
readonly workItems?: readonly string[];
|
|
289
|
+
/** Si los tickets se pusieron a mano (`estela entry link`). Solo al leer de la base. */
|
|
290
|
+
readonly workItemsManual?: boolean;
|
|
289
291
|
}
|
|
290
292
|
export interface InvoiceLine {
|
|
291
293
|
readonly description: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,16 @@ export interface WorkItemTracker {
|
|
|
21
21
|
* nada que no empiece así se confunde con un ticket.
|
|
22
22
|
*/
|
|
23
23
|
readonly prefixes: readonly string[];
|
|
24
|
+
/**
|
|
25
|
+
* La etiqueta que marca lo planificado (`estela delivery`). Sin ella, el
|
|
26
|
+
* informe solo enseña lo entregado.
|
|
27
|
+
*/
|
|
28
|
+
readonly planLabel?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Prefijo de las etiquetas que dicen qué cliente pidió algo (`cliente:acme`).
|
|
31
|
+
* Sin configurar se usa `cliente:`.
|
|
32
|
+
*/
|
|
33
|
+
readonly clientLabel?: string;
|
|
24
34
|
}
|
|
25
35
|
/**
|
|
26
36
|
* Claves normalizadas (`jira:PROJ-12`, `azure:1234`, `github:12`), primero las
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workitems.d.ts","sourceRoot":"","sources":["../src/workitems.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnE,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAA0C,CAAC;AAE/F,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"workitems.d.ts","sourceRoot":"","sources":["../src/workitems.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnE,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAA0C,CAAC;AAE/F,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAWD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,GAC/B,MAAM,EAAE,CAqBV;AA0CD,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAGlE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAS3F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workitems.js","sourceRoot":"","sources":["../src/workitems.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;
|
|
1
|
+
{"version":3,"file":"workitems.js","sourceRoot":"","sources":["../src/workitems.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "estela",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Time tracking you never fill in: rebuilds your billable hours from Claude Code, Codex and GitHub Copilot sessions and your Git history, and splits what the AI cost per project.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"time-tracking",
|