@hanfour.huang/caliber 0.1.2

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 (55) hide show
  1. package/README.md +667 -0
  2. package/dist/analyzers/section.d.ts +9 -0
  3. package/dist/analyzers/section.d.ts.map +1 -0
  4. package/dist/analyzers/section.js +503 -0
  5. package/dist/analyzers/section.js.map +1 -0
  6. package/dist/analyzers/usage.d.ts +3 -0
  7. package/dist/analyzers/usage.d.ts.map +1 -0
  8. package/dist/analyzers/usage.js +141 -0
  9. package/dist/analyzers/usage.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +295 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/config.d.ts +19 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +156 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/data-quality.d.ts +3 -0
  19. package/dist/data-quality.d.ts.map +1 -0
  20. package/dist/data-quality.js +54 -0
  21. package/dist/data-quality.js.map +1 -0
  22. package/dist/extractors/claude-code.d.ts +6 -0
  23. package/dist/extractors/claude-code.d.ts.map +1 -0
  24. package/dist/extractors/claude-code.js +216 -0
  25. package/dist/extractors/claude-code.js.map +1 -0
  26. package/dist/extractors/codex.d.ts +5 -0
  27. package/dist/extractors/codex.d.ts.map +1 -0
  28. package/dist/extractors/codex.js +184 -0
  29. package/dist/extractors/codex.js.map +1 -0
  30. package/dist/i18n.d.ts +53 -0
  31. package/dist/i18n.d.ts.map +1 -0
  32. package/dist/i18n.js +163 -0
  33. package/dist/i18n.js.map +1 -0
  34. package/dist/period.d.ts +5 -0
  35. package/dist/period.d.ts.map +1 -0
  36. package/dist/period.js +25 -0
  37. package/dist/period.js.map +1 -0
  38. package/dist/reporters/report.d.ts +7 -0
  39. package/dist/reporters/report.d.ts.map +1 -0
  40. package/dist/reporters/report.js +440 -0
  41. package/dist/reporters/report.js.map +1 -0
  42. package/dist/standard.d.ts +5 -0
  43. package/dist/standard.d.ts.map +1 -0
  44. package/dist/standard.js +98 -0
  45. package/dist/standard.js.map +1 -0
  46. package/dist/types.d.ts +216 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +3 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/utils.d.ts +3 -0
  51. package/dist/utils.d.ts.map +1 -0
  52. package/dist/utils.js +17 -0
  53. package/dist/utils.js.map +1 -0
  54. package/package.json +59 -0
  55. package/templates/eval-standard.json +174 -0
@@ -0,0 +1,440 @@
1
+ import chalk from "chalk";
2
+ import { localizeWarningLabel, t } from "../i18n.js";
3
+ function fmtNum(n, locale) {
4
+ return n.toLocaleString(locale === "zh-TW" ? "zh-TW" : "en-US");
5
+ }
6
+ function fmtCost(n) {
7
+ return `$${n.toFixed(4)}`;
8
+ }
9
+ function scoreColor(score, label) {
10
+ return score > 100
11
+ ? chalk.green.bold(`${score}% (${label})`)
12
+ : chalk.cyan.bold(`${score}% (${label})`);
13
+ }
14
+ function sectionHeader(title) {
15
+ const line = "━".repeat(60);
16
+ return `\n${chalk.bold(line)}\n${chalk.bold.white(title)}\n${chalk.bold(line)}`;
17
+ }
18
+ function formatSignalType(type) {
19
+ return type
20
+ .split("_")
21
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
22
+ .join(" ");
23
+ }
24
+ function truncate(str, maxLen) {
25
+ const clean = str.replace(/\n/g, " ").trim();
26
+ return clean.length > maxLen ? clean.slice(0, maxLen) + "..." : clean;
27
+ }
28
+ function groupSignals(signals) {
29
+ const groups = {};
30
+ for (const s of signals) {
31
+ const arr = groups[s.type] ?? [];
32
+ arr.push(s);
33
+ groups[s.type] = arr;
34
+ }
35
+ return groups;
36
+ }
37
+ function escapeHtml(value) {
38
+ return value
39
+ .replaceAll("&", "&")
40
+ .replaceAll("<", "&lt;")
41
+ .replaceAll(">", "&gt;")
42
+ .replaceAll('"', "&quot;")
43
+ .replaceAll("'", "&#39;");
44
+ }
45
+ export function renderTextReport(report, locale) {
46
+ const dict = t(locale);
47
+ const lines = [];
48
+ lines.push("");
49
+ lines.push(chalk.bold.yellow("═".repeat(60)));
50
+ lines.push(chalk.bold.yellow(` ${report.standardName}`));
51
+ lines.push(chalk.bold.yellow(` ${dict.reportTitle}`));
52
+ lines.push(chalk.bold.yellow("═".repeat(60)));
53
+ lines.push("");
54
+ lines.push(` ${chalk.dim(`${dict.period}:`)} ${report.period.since} ~ ${report.period.until}`);
55
+ lines.push(` ${chalk.dim(`${dict.generated}:`)} ${report.generatedAt}`);
56
+ if (report.meta?.engineer)
57
+ lines.push(` ${chalk.dim(`${dict.engineer}:`)} ${report.meta.engineer}`);
58
+ if (report.meta?.department)
59
+ lines.push(` ${chalk.dim(`${dict.department}:`)} ${report.meta.department}`);
60
+ if (report.dataWarnings.length > 0) {
61
+ lines.push("");
62
+ lines.push(` ${chalk.yellow.bold(`⚠ ${dict.dataWarnings}`)}`);
63
+ for (const w of report.dataWarnings) {
64
+ const icon = w.severity === "missing" ? chalk.red("✗") : chalk.yellow("△");
65
+ lines.push(` ${icon} [${localizeWarningLabel(locale, w)}] ${w.source}: ${w.message}`);
66
+ }
67
+ }
68
+ lines.push(sectionHeader(`1. ${dict.summaryTitle.toUpperCase()}`));
69
+ lines.push("");
70
+ lines.push(` ${chalk.bold(report.managementSummary.headline)}`);
71
+ lines.push(` ${chalk.dim(report.managementSummary.overallAssessment)}`);
72
+ lines.push("");
73
+ lines.push(` ${chalk.bold(dict.observations)}`);
74
+ for (const item of report.managementSummary.observations) {
75
+ lines.push(` ${chalk.dim("•")} ${item}`);
76
+ }
77
+ lines.push("");
78
+ lines.push(` ${chalk.bold(dict.recommendations)}`);
79
+ for (const item of report.managementSummary.recommendations) {
80
+ lines.push(` ${chalk.dim("•")} ${item}`);
81
+ }
82
+ lines.push(sectionHeader(`2. ${dict.usageTitle.toUpperCase()}`));
83
+ lines.push("");
84
+ const cc = report.usage.claudeCode;
85
+ lines.push(chalk.bold.blue(` ${dict.claudeLabel}`));
86
+ lines.push(` ${dict.sessions}: ${fmtNum(cc.totalSessions, locale)}`);
87
+ lines.push(` ${dict.tokens}: ${fmtNum(cc.totalInputTokens + cc.totalOutputTokens, locale)} (in: ${fmtNum(cc.totalInputTokens, locale)} / out: ${fmtNum(cc.totalOutputTokens, locale)})`);
88
+ if (cc.totalCostUsd > 0)
89
+ lines.push(` ${dict.estimatedCost}: ${fmtCost(cc.totalCostUsd)}`);
90
+ lines.push(` ${dict.duration}: ${fmtNum(cc.totalDurationMinutes, locale)} min`);
91
+ lines.push(` ${dict.activeDays}: ${cc.activeDays}`);
92
+ if (Object.keys(cc.models).length > 0) {
93
+ lines.push(` ${chalk.dim(`${dict.models}:`)}`);
94
+ for (const [model, data] of Object.entries(cc.models).sort(([, a], [, b]) => b.tokens - a.tokens)) {
95
+ lines.push(` ${model}: ${data.sessions} sessions, ${fmtNum(data.tokens, locale)} tokens, ${fmtCost(data.cost)}`);
96
+ }
97
+ }
98
+ if (cc.topProjects.length > 0) {
99
+ lines.push(` ${chalk.dim(`${dict.topProjects}:`)}`);
100
+ for (const p of cc.topProjects.slice(0, 5)) {
101
+ lines.push(` ${p.path}: ${p.sessions} sessions, ${fmtNum(p.tokens, locale)} tokens`);
102
+ }
103
+ }
104
+ if (Object.keys(cc.toolUsage).length > 0) {
105
+ lines.push(` ${chalk.dim(`${dict.topTools}:`)}`);
106
+ for (const [tool, count] of Object.entries(cc.toolUsage).sort(([, a], [, b]) => b - a).slice(0, 8)) {
107
+ lines.push(` ${tool}: ${fmtNum(count, locale)}`);
108
+ }
109
+ }
110
+ const cx = report.usage.codex;
111
+ lines.push("");
112
+ lines.push(chalk.bold.green(` ${dict.codexLabel}`));
113
+ if (cx.totalSessions === 0) {
114
+ lines.push(` ${chalk.dim(dict.noCodexSessions)}`);
115
+ }
116
+ else {
117
+ lines.push(` ${dict.sessions}: ${fmtNum(cx.totalSessions, locale)}`);
118
+ lines.push(` ${dict.tokens}: ${fmtNum(cx.totalTokensUsed, locale)}`);
119
+ lines.push(` ${dict.activeDays}: ${cx.activeDays}`);
120
+ if (Object.keys(cx.models).length > 0) {
121
+ lines.push(` ${chalk.dim(`${dict.models}:`)}`);
122
+ for (const [model, data] of Object.entries(cx.models).sort(([, a], [, b]) => b.tokens - a.tokens)) {
123
+ lines.push(` ${model}: ${data.sessions} sessions, ${fmtNum(data.tokens, locale)} tokens`);
124
+ }
125
+ }
126
+ }
127
+ lines.push(` ${chalk.dim(dict.scoringSourceNote)}`);
128
+ report.sections.forEach((sec, idx) => {
129
+ lines.push(sectionHeader(`${idx + 3}. ${sec.name.toUpperCase()}`));
130
+ lines.push("");
131
+ lines.push(` ${chalk.dim(sec.summary)}`);
132
+ lines.push("");
133
+ if (sec.usageEvidence.length > 0) {
134
+ lines.push(` ${chalk.bold(dict.usageEvidence)}`);
135
+ for (const item of sec.usageEvidence)
136
+ lines.push(` ${chalk.dim("•")} ${item}`);
137
+ lines.push("");
138
+ }
139
+ if (sec.scoreEvidence.length > 0) {
140
+ lines.push(` ${chalk.bold(dict.scoreEvidence)}`);
141
+ for (const item of sec.scoreEvidence)
142
+ lines.push(` ${chalk.dim("•")} ${item}`);
143
+ lines.push("");
144
+ }
145
+ const groups = groupSignals(sec.signals);
146
+ for (const [type, items] of Object.entries(groups)) {
147
+ if (type.startsWith("keyword_"))
148
+ continue;
149
+ lines.push(` ${chalk.bold(formatSignalType(type))} (${items.length})`);
150
+ for (const item of items.slice(0, 3)) {
151
+ lines.push(` ${chalk.dim("•")} ${item.description}`);
152
+ if (item.detail)
153
+ lines.push(` ${chalk.dim(truncate(item.detail, 120))}`);
154
+ }
155
+ if (items.length > 3)
156
+ lines.push(chalk.dim(` ... and ${items.length - 3} more`));
157
+ lines.push("");
158
+ }
159
+ });
160
+ const scoreIdx = report.sections.length + 3;
161
+ lines.push(sectionHeader(`${scoreIdx}. ${dict.scoreTitle.toUpperCase()}`));
162
+ lines.push("");
163
+ for (const sec of report.sections) {
164
+ lines.push(` ${chalk.bold(sec.name)} (Weight: ${sec.weight} in KPI)`);
165
+ lines.push(` Score: ${scoreColor(sec.score, sec.label)}`);
166
+ lines.push(` ${chalk.dim(sec.reason)}`);
167
+ lines.push("");
168
+ }
169
+ lines.push(chalk.bold.yellow("═".repeat(60)));
170
+ lines.push("");
171
+ return lines.join("\n");
172
+ }
173
+ export function renderJsonReport(report) {
174
+ return JSON.stringify(report, null, 2);
175
+ }
176
+ export function renderMarkdownReport(report, locale) {
177
+ const dict = t(locale);
178
+ const lines = [];
179
+ lines.push(`# ${report.standardName} — ${dict.reportTitle}`);
180
+ lines.push("");
181
+ lines.push(`**${dict.period}:** ${report.period.since} ~ ${report.period.until}`);
182
+ lines.push(`**${dict.generated}:** ${report.generatedAt}`);
183
+ if (report.meta?.engineer)
184
+ lines.push(`**${dict.engineer}:** ${report.meta.engineer}`);
185
+ if (report.meta?.department)
186
+ lines.push(`**${dict.department}:** ${report.meta.department}`);
187
+ lines.push("");
188
+ if (report.dataWarnings.length > 0) {
189
+ lines.push(`> **${dict.dataWarnings}**`);
190
+ for (const w of report.dataWarnings) {
191
+ lines.push(`> - [${localizeWarningLabel(locale, w)}] ${w.source}: ${w.message}`);
192
+ }
193
+ lines.push("");
194
+ }
195
+ lines.push(`## 1. ${dict.summaryTitle}`);
196
+ lines.push("");
197
+ lines.push(`**Headline:** ${report.managementSummary.headline}`);
198
+ lines.push("");
199
+ lines.push(report.managementSummary.overallAssessment);
200
+ lines.push("");
201
+ lines.push(`### ${dict.observations}`);
202
+ for (const item of report.managementSummary.observations)
203
+ lines.push(`- ${item}`);
204
+ lines.push("");
205
+ lines.push(`### ${dict.recommendations}`);
206
+ for (const item of report.managementSummary.recommendations)
207
+ lines.push(`- ${item}`);
208
+ lines.push("");
209
+ lines.push(`## 2. ${dict.usageTitle}`);
210
+ lines.push("");
211
+ lines.push(`### ${dict.claudeLabel}`);
212
+ lines.push("| Metric | Value |");
213
+ lines.push("|--------|-------|");
214
+ const cc = report.usage.claudeCode;
215
+ lines.push(`| ${dict.sessions} | ${fmtNum(cc.totalSessions, locale)} |`);
216
+ lines.push(`| ${dict.tokens} | ${fmtNum(cc.totalInputTokens + cc.totalOutputTokens, locale)} |`);
217
+ if (cc.totalCostUsd > 0)
218
+ lines.push(`| ${dict.estimatedCost} | ${fmtCost(cc.totalCostUsd)} |`);
219
+ lines.push(`| ${dict.duration} | ${fmtNum(cc.totalDurationMinutes, locale)} min |`);
220
+ lines.push(`| ${dict.activeDays} | ${cc.activeDays} |`);
221
+ lines.push("");
222
+ const cx = report.usage.codex;
223
+ lines.push(`### ${dict.codexLabel}`);
224
+ lines.push("| Metric | Value |");
225
+ lines.push("|--------|-------|");
226
+ lines.push(`| ${dict.sessions} | ${fmtNum(cx.totalSessions, locale)} |`);
227
+ lines.push(`| ${dict.tokens} | ${fmtNum(cx.totalTokensUsed, locale)} |`);
228
+ lines.push(`| ${dict.activeDays} | ${cx.activeDays} |`);
229
+ lines.push("");
230
+ lines.push(`_${dict.scoringSourceNote}_`);
231
+ lines.push("");
232
+ report.sections.forEach((sec, idx) => {
233
+ lines.push(`## ${idx + 3}. ${sec.name}`);
234
+ lines.push("");
235
+ lines.push(sec.summary);
236
+ lines.push("");
237
+ if (sec.usageEvidence.length > 0) {
238
+ lines.push(`### ${dict.usageEvidence}`);
239
+ for (const item of sec.usageEvidence)
240
+ lines.push(`- ${item}`);
241
+ lines.push("");
242
+ }
243
+ if (sec.scoreEvidence.length > 0) {
244
+ lines.push(`### ${dict.scoreEvidence}`);
245
+ for (const item of sec.scoreEvidence)
246
+ lines.push(`- ${item}`);
247
+ lines.push("");
248
+ }
249
+ for (const sig of sec.signals.filter((s) => !s.type.startsWith("keyword_")).slice(0, 10)) {
250
+ lines.push(`- **${formatSignalType(sig.type)}**: ${sig.description}`);
251
+ if (sig.detail)
252
+ lines.push(` > ${truncate(sig.detail, 150)}`);
253
+ }
254
+ lines.push("");
255
+ });
256
+ const scoreIdx = report.sections.length + 3;
257
+ lines.push(`## ${scoreIdx}. ${dict.scoreTitle}`);
258
+ lines.push("");
259
+ for (const sec of report.sections) {
260
+ lines.push(`### ${sec.name} (Weight: ${sec.weight} in KPI)`);
261
+ lines.push(`**Score: ${sec.score}%** (${sec.label})`);
262
+ lines.push("");
263
+ lines.push(sec.reason);
264
+ lines.push("");
265
+ }
266
+ return lines.join("\n");
267
+ }
268
+ function renderSectionCards(report) {
269
+ return report.sections
270
+ .map((sec) => {
271
+ const signals = sec.signals
272
+ .filter((sig) => !sig.type.startsWith("keyword_"))
273
+ .slice(0, 6)
274
+ .map((sig) => `<li><strong>${escapeHtml(formatSignalType(sig.type))}:</strong> ${escapeHtml(sig.description)}${sig.detail ? `<div class="signal-detail">${escapeHtml(truncate(sig.detail, 180))}</div>` : ""}</li>`)
275
+ .join("");
276
+ const usageEvidence = sec.usageEvidence
277
+ .map((item) => `<li>${escapeHtml(item)}</li>`)
278
+ .join("");
279
+ const scoreEvidence = sec.scoreEvidence
280
+ .map((item) => `<li>${escapeHtml(item)}</li>`)
281
+ .join("");
282
+ return `
283
+ <section class="section-card" id="section-${escapeHtml(sec.id)}">
284
+ <div class="section-head">
285
+ <div>
286
+ <h2>${escapeHtml(sec.name)}</h2>
287
+ <p class="section-summary">${escapeHtml(sec.summary)}</p>
288
+ </div>
289
+ <div class="score-pill ${sec.score > 100 ? "superior" : "standard"}">${sec.score}%</div>
290
+ </div>
291
+ <div class="section-grid">
292
+ <div class="evidence-card">
293
+ <h3>Usage Evidence</h3>
294
+ <ul>${usageEvidence || "<li>None</li>"}</ul>
295
+ </div>
296
+ <div class="evidence-card">
297
+ <h3>Score Evidence</h3>
298
+ <ul>${scoreEvidence || "<li>None</li>"}</ul>
299
+ </div>
300
+ </div>
301
+ <div class="reason-box">${escapeHtml(sec.reason)}</div>
302
+ <div class="signal-box">
303
+ <h3>Signals</h3>
304
+ <ul>${signals || "<li>None</li>"}</ul>
305
+ </div>
306
+ </section>
307
+ `;
308
+ })
309
+ .join("\n");
310
+ }
311
+ export function renderHtmlReport(report, locale) {
312
+ const dict = t(locale);
313
+ const cc = report.usage.claudeCode;
314
+ const cx = report.usage.codex;
315
+ const warnings = report.dataWarnings
316
+ .map((w) => `<li><strong>${escapeHtml(localizeWarningLabel(locale, w))}</strong> ${escapeHtml(w.source)}: ${escapeHtml(w.message)}</li>`)
317
+ .join("");
318
+ const observations = report.managementSummary.observations
319
+ .map((item) => `<li>${escapeHtml(item)}</li>`)
320
+ .join("");
321
+ const recommendations = report.managementSummary.recommendations
322
+ .map((item) => `<li>${escapeHtml(item)}</li>`)
323
+ .join("");
324
+ const sectionLinks = report.sections
325
+ .map((sec) => `<a href="#section-${escapeHtml(sec.id)}">${escapeHtml(sec.name)}</a>`)
326
+ .join("");
327
+ return `<!DOCTYPE html>
328
+ <html lang="${locale}">
329
+ <head>
330
+ <meta charset="UTF-8" />
331
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
332
+ <title>${escapeHtml(report.standardName)} - ${escapeHtml(dict.reportTitle)}</title>
333
+ <style>
334
+ * { box-sizing: border-box; }
335
+ body { margin: 0; font-family: "Inter", "Noto Sans TC", sans-serif; background: #f4f7fb; color: #1f2937; line-height: 1.6; }
336
+ .container { max-width: 1120px; margin: 0 auto; padding: 40px 20px 64px; }
337
+ .hero { background: linear-gradient(135deg, #ffffff 0%, #edf4ff 100%); border: 1px solid #dbe7f7; border-radius: 20px; padding: 28px; box-shadow: 0 18px 40px rgba(15, 23, 42, 0.08); }
338
+ .hero h1 { margin: 0 0 8px; font-size: 34px; color: #0f172a; }
339
+ .subtitle { color: #64748b; font-size: 15px; margin-bottom: 18px; }
340
+ .meta-grid, .stats-row, .section-grid, .usage-grid { display: grid; gap: 16px; }
341
+ .meta-grid { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
342
+ .meta-card, .stat-card, .content-card, .evidence-card, .usage-card, .section-card { background: #fff; border: 1px solid #e2e8f0; border-radius: 16px; }
343
+ .meta-card, .stat-card, .content-card, .evidence-card, .usage-card { padding: 18px; }
344
+ .meta-label, .stat-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; color: #94a3b8; }
345
+ .meta-value, .stat-value { margin-top: 6px; font-weight: 700; color: #0f172a; }
346
+ .nav-toc { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 20px; }
347
+ .nav-toc a { text-decoration: none; color: #1d4ed8; background: #dbeafe; padding: 8px 12px; border-radius: 999px; font-size: 13px; }
348
+ .stats-row, .usage-grid { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); margin-top: 24px; }
349
+ .stat-value { font-size: 28px; }
350
+ .content-grid { display: grid; gap: 20px; margin-top: 28px; }
351
+ .content-card h2, .usage-card h2, .section-card h2 { margin: 0 0 12px; font-size: 22px; color: #0f172a; }
352
+ .list { margin: 0; padding-left: 20px; }
353
+ .list li { margin-bottom: 8px; }
354
+ .warning-list li { color: #991b1b; }
355
+ .usage-grid { margin-top: 16px; }
356
+ .usage-card .mini { color: #64748b; font-size: 14px; margin-bottom: 12px; }
357
+ .mini-list { margin: 0; padding-left: 18px; font-size: 14px; }
358
+ .section-card { padding: 22px; margin-top: 20px; }
359
+ .section-head { display: flex; justify-content: space-between; gap: 16px; align-items: flex-start; }
360
+ .section-summary { margin: 8px 0 0; color: #64748b; }
361
+ .score-pill { min-width: 92px; text-align: center; border-radius: 999px; padding: 10px 14px; font-weight: 700; }
362
+ .score-pill.superior { background: #dcfce7; color: #166534; }
363
+ .score-pill.standard { background: #dbeafe; color: #1d4ed8; }
364
+ .section-grid { grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); margin-top: 16px; }
365
+ .reason-box { margin-top: 16px; background: #fff7ed; border: 1px solid #fdba74; border-radius: 12px; padding: 14px; color: #9a3412; }
366
+ .signal-box { margin-top: 16px; }
367
+ .signal-box ul { margin: 0; padding-left: 18px; }
368
+ .signal-detail { color: #64748b; font-size: 13px; margin-top: 4px; }
369
+ @media (max-width: 720px) { .container { padding: 20px 12px 40px; } .hero h1 { font-size: 28px; } .section-head { flex-direction: column; } }
370
+ </style>
371
+ </head>
372
+ <body>
373
+ <div class="container">
374
+ <section class="hero">
375
+ <h1>${escapeHtml(report.standardName)}</h1>
376
+ <div class="subtitle">${escapeHtml(dict.reportTitle)} | ${escapeHtml(report.period.since)} to ${escapeHtml(report.period.until)}</div>
377
+ <div class="meta-grid">
378
+ <div class="meta-card"><div class="meta-label">${escapeHtml(dict.period)}</div><div class="meta-value">${escapeHtml(report.period.since)} ~ ${escapeHtml(report.period.until)}</div></div>
379
+ <div class="meta-card"><div class="meta-label">${escapeHtml(dict.generated)}</div><div class="meta-value">${escapeHtml(report.generatedAt)}</div></div>
380
+ <div class="meta-card"><div class="meta-label">${escapeHtml(dict.engineer)}</div><div class="meta-value">${escapeHtml(report.meta?.engineer ?? "-")}</div></div>
381
+ <div class="meta-card"><div class="meta-label">${escapeHtml(dict.department)}</div><div class="meta-value">${escapeHtml(report.meta?.department ?? "-")}</div></div>
382
+ </div>
383
+ <nav class="nav-toc">
384
+ <a href="#summary">${escapeHtml(dict.summaryTitle)}</a>
385
+ <a href="#usage">${escapeHtml(dict.usageTitle)}</a>
386
+ ${sectionLinks}
387
+ </nav>
388
+ <div class="stats-row">
389
+ <div class="stat-card"><div class="stat-label">${escapeHtml(dict.sessions)}</div><div class="stat-value">${fmtNum(cc.totalSessions + cx.totalSessions, locale)}</div></div>
390
+ <div class="stat-card"><div class="stat-label">${escapeHtml(dict.tokens)}</div><div class="stat-value">${fmtNum(cc.totalInputTokens + cc.totalOutputTokens + cx.totalTokensUsed, locale)}</div></div>
391
+ <div class="stat-card"><div class="stat-label">${escapeHtml(dict.activeDays)}</div><div class="stat-value">${fmtNum(Math.max(cc.activeDays, cx.activeDays), locale)}</div></div>
392
+ <div class="stat-card"><div class="stat-label">${escapeHtml(dict.sections)}</div><div class="stat-value">${fmtNum(report.sections.length, locale)}</div></div>
393
+ </div>
394
+ </section>
395
+
396
+ <div class="content-grid">
397
+ <section class="content-card" id="summary">
398
+ <h2>${escapeHtml(dict.atAGlance)}</h2>
399
+ <p>${escapeHtml(report.managementSummary.headline)}</p>
400
+ <p>${escapeHtml(report.managementSummary.overallAssessment)}</p>
401
+ <h3>${escapeHtml(dict.observations)}</h3>
402
+ <ul class="list">${observations}</ul>
403
+ <h3>${escapeHtml(dict.recommendations)}</h3>
404
+ <ul class="list">${recommendations}</ul>
405
+ </section>
406
+
407
+ ${report.dataWarnings.length > 0
408
+ ? `<section class="content-card"><h2>${escapeHtml(dict.dataWarnings)}</h2><ul class="list warning-list">${warnings}</ul></section>`
409
+ : ""}
410
+
411
+ <section class="content-card" id="usage">
412
+ <h2>${escapeHtml(dict.usageStats)}</h2>
413
+ <p>${escapeHtml(dict.scoringSourceNote)}</p>
414
+ <div class="usage-grid">
415
+ <div class="usage-card">
416
+ <h2>${escapeHtml(dict.claudeLabel)}</h2>
417
+ <div class="mini">${fmtNum(cc.totalSessions, locale)} sessions • ${fmtNum(cc.totalInputTokens + cc.totalOutputTokens, locale)} tokens • ${fmtCost(cc.totalCostUsd)}</div>
418
+ <ul class="mini-list">
419
+ <li>${escapeHtml(dict.activeDays)}: ${cc.activeDays}</li>
420
+ <li>${escapeHtml(dict.duration)}: ${fmtNum(cc.totalDurationMinutes, locale)} min</li>
421
+ </ul>
422
+ </div>
423
+ <div class="usage-card">
424
+ <h2>${escapeHtml(dict.codexLabel)}</h2>
425
+ <div class="mini">${fmtNum(cx.totalSessions, locale)} sessions • ${fmtNum(cx.totalTokensUsed, locale)} tokens</div>
426
+ <ul class="mini-list">
427
+ <li>${escapeHtml(dict.activeDays)}: ${cx.activeDays}</li>
428
+ <li>${escapeHtml(dict.models)}: ${escapeHtml(Object.keys(cx.models).join(", ") || "-")}</li>
429
+ </ul>
430
+ </div>
431
+ </div>
432
+ </section>
433
+
434
+ ${renderSectionCards(report)}
435
+ </div>
436
+ </div>
437
+ </body>
438
+ </html>`;
439
+ }
440
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/reporters/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { EvalStandard } from "./types.js";
2
+ export declare function loadStandard(path?: string): EvalStandard;
3
+ export declare function getDefaultStandard(): EvalStandard;
4
+ export declare function getDefaultStandardTemplateText(): string;
5
+ //# sourceMappingURL=standard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard.d.ts","sourceRoot":"","sources":["../src/standard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAwG/C,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,CAexD;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD;AAED,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD"}
@@ -0,0 +1,98 @@
1
+ import { readFileSync } from "fs";
2
+ import { dirname, join } from "path";
3
+ import { fileURLToPath } from "url";
4
+ const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
5
+ const DEFAULT_STANDARD_PATH = join(MODULE_DIR, "..", "templates", "eval-standard.json");
6
+ let cachedDefaultTemplateText;
7
+ let cachedDefaultStandard;
8
+ function readDefaultStandardTemplateText() {
9
+ if (cachedDefaultTemplateText !== undefined)
10
+ return cachedDefaultTemplateText;
11
+ cachedDefaultTemplateText = readFileSync(DEFAULT_STANDARD_PATH, "utf-8");
12
+ return cachedDefaultTemplateText;
13
+ }
14
+ function normalizeStandard(raw, defaultNoiseFilters) {
15
+ if (!raw.name || !Array.isArray(raw.sections) || raw.sections.length === 0) {
16
+ throw new Error("Invalid standard: must have 'name' and at least one entry in 'sections'");
17
+ }
18
+ const warnings = [];
19
+ const sections = raw.sections.map((sec) => {
20
+ if (!sec.id || !sec.name || !sec.standard || !sec.superior) {
21
+ throw new Error(`Invalid section '${sec.id ?? "?"}': must have id, name, standard, superior`);
22
+ }
23
+ const thresholds = sec.thresholds ?? {};
24
+ const thresholdKeys = new Set(Object.keys(thresholds));
25
+ // Validate superiorRules references
26
+ if (sec.superiorRules) {
27
+ const allRefs = [
28
+ ...(sec.superiorRules.strongThresholds ?? []),
29
+ ...(sec.superiorRules.supportThresholds ?? []),
30
+ ];
31
+ for (const ref of allRefs) {
32
+ if (!thresholdKeys.has(ref)) {
33
+ warnings.push(`Section '${sec.id}': superiorRules references '${ref}' which is not defined in thresholds. ` +
34
+ `Available keys: [${[...thresholdKeys].join(", ")}]`);
35
+ }
36
+ }
37
+ }
38
+ return {
39
+ ...sec,
40
+ keywords: sec.keywords ?? [],
41
+ thresholds,
42
+ superiorRules: sec.superiorRules,
43
+ weight: sec.weight ?? "",
44
+ standard: {
45
+ ...sec.standard,
46
+ label: sec.standard.label ?? `${sec.standard.score}%`,
47
+ },
48
+ superior: {
49
+ ...sec.superior,
50
+ label: sec.superior.label ?? `${sec.superior.score}%`,
51
+ },
52
+ };
53
+ });
54
+ if (warnings.length > 0) {
55
+ for (const w of warnings) {
56
+ process.stderr.write(`[caliber] WARNING: ${w}\n`);
57
+ }
58
+ }
59
+ const noiseFilters = defaultNoiseFilters
60
+ ? { ...defaultNoiseFilters, ...raw.noiseFilters }
61
+ : raw.noiseFilters;
62
+ return {
63
+ name: raw.name,
64
+ description: raw.description,
65
+ sections,
66
+ noiseFilters,
67
+ };
68
+ }
69
+ function loadBundledDefaultStandard() {
70
+ if (cachedDefaultStandard)
71
+ return cachedDefaultStandard;
72
+ const raw = JSON.parse(readDefaultStandardTemplateText());
73
+ cachedDefaultStandard = normalizeStandard(raw);
74
+ return cachedDefaultStandard;
75
+ }
76
+ // ── Loader ──
77
+ export function loadStandard(path) {
78
+ const defaultStandard = loadBundledDefaultStandard();
79
+ if (!path)
80
+ return defaultStandard;
81
+ try {
82
+ const raw = JSON.parse(readFileSync(path, "utf-8"));
83
+ return normalizeStandard(raw, defaultStandard.noiseFilters);
84
+ }
85
+ catch (err) {
86
+ const msg = err instanceof Error ? err.message : String(err);
87
+ process.stderr.write(`Error loading standard from ${path}: ${msg}\n`);
88
+ process.stderr.write("Falling back to built-in default standard.\n");
89
+ return defaultStandard;
90
+ }
91
+ }
92
+ export function getDefaultStandard() {
93
+ return loadBundledDefaultStandard();
94
+ }
95
+ export function getDefaultStandardTemplateText() {
96
+ return readDefaultStandardTemplateText();
97
+ }
98
+ //# sourceMappingURL=standard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard.js","sourceRoot":"","sources":["../src/standard.ts"],"names":[],"mappings":"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"}