@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.
- package/README.md +667 -0
- package/dist/analyzers/section.d.ts +9 -0
- package/dist/analyzers/section.d.ts.map +1 -0
- package/dist/analyzers/section.js +503 -0
- package/dist/analyzers/section.js.map +1 -0
- package/dist/analyzers/usage.d.ts +3 -0
- package/dist/analyzers/usage.d.ts.map +1 -0
- package/dist/analyzers/usage.js +141 -0
- package/dist/analyzers/usage.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +295 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +156 -0
- package/dist/config.js.map +1 -0
- package/dist/data-quality.d.ts +3 -0
- package/dist/data-quality.d.ts.map +1 -0
- package/dist/data-quality.js +54 -0
- package/dist/data-quality.js.map +1 -0
- package/dist/extractors/claude-code.d.ts +6 -0
- package/dist/extractors/claude-code.d.ts.map +1 -0
- package/dist/extractors/claude-code.js +216 -0
- package/dist/extractors/claude-code.js.map +1 -0
- package/dist/extractors/codex.d.ts +5 -0
- package/dist/extractors/codex.d.ts.map +1 -0
- package/dist/extractors/codex.js +184 -0
- package/dist/extractors/codex.js.map +1 -0
- package/dist/i18n.d.ts +53 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +163 -0
- package/dist/i18n.js.map +1 -0
- package/dist/period.d.ts +5 -0
- package/dist/period.d.ts.map +1 -0
- package/dist/period.js +25 -0
- package/dist/period.js.map +1 -0
- package/dist/reporters/report.d.ts +7 -0
- package/dist/reporters/report.d.ts.map +1 -0
- package/dist/reporters/report.js +440 -0
- package/dist/reporters/report.js.map +1 -0
- package/dist/standard.d.ts +5 -0
- package/dist/standard.d.ts.map +1 -0
- package/dist/standard.js +98 -0
- package/dist/standard.js.map +1 -0
- package/dist/types.d.ts +216 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +17 -0
- package/dist/utils.js.map +1 -0
- package/package.json +59 -0
- 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("<", "<")
|
|
41
|
+
.replaceAll(">", ">")
|
|
42
|
+
.replaceAll('"', """)
|
|
43
|
+
.replaceAll("'", "'");
|
|
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"}
|
package/dist/standard.js
ADDED
|
@@ -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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"}
|