@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,216 @@
1
+ export interface ClaudeCodeSession {
2
+ sessionId: string;
3
+ projectPath: string;
4
+ startTime: string;
5
+ durationMinutes: number;
6
+ userMessageCount: number;
7
+ assistantMessageCount: number;
8
+ toolCounts: Record<string, number>;
9
+ languages: Record<string, number>;
10
+ gitCommits: number;
11
+ inputTokens: number;
12
+ outputTokens: number;
13
+ firstPrompt: string;
14
+ userInterruptions: number;
15
+ toolErrors: number;
16
+ toolErrorCategories: Record<string, number>;
17
+ usesTaskAgent: boolean;
18
+ usesMcp: boolean;
19
+ linesAdded: number;
20
+ linesRemoved: number;
21
+ filesModified: number;
22
+ messageHours: number[];
23
+ }
24
+ export interface ClaudeCodeFacet {
25
+ sessionId: string;
26
+ underlyingGoal: string;
27
+ goalCategories: Record<string, number>;
28
+ outcome: string;
29
+ userSatisfactionCounts: Record<string, number>;
30
+ claudeHelpfulness: string;
31
+ sessionType: string;
32
+ frictionCounts: Record<string, number>;
33
+ frictionDetail: string;
34
+ primarySuccess: string;
35
+ briefSummary: string;
36
+ }
37
+ export interface ClaudeCodeCostRecord {
38
+ sessionId: string;
39
+ model: string;
40
+ totalCostUsd: number;
41
+ totalDurationMs: number;
42
+ messageCount: number;
43
+ }
44
+ export interface ClaudeCodeConversationSignal {
45
+ sessionId: string;
46
+ timestamp: string;
47
+ type: string;
48
+ content: string;
49
+ keywords: string[];
50
+ }
51
+ export interface CodexSession {
52
+ id: string;
53
+ createdAt: number;
54
+ updatedAt: number;
55
+ model: string;
56
+ modelProvider: string;
57
+ cwd: string;
58
+ title: string;
59
+ tokensUsed: number;
60
+ gitBranch: string | null;
61
+ gitOriginUrl: string | null;
62
+ firstUserMessage: string;
63
+ cliVersion: string;
64
+ }
65
+ export interface CodexConversationSignal {
66
+ sessionId: string;
67
+ timestamp: string;
68
+ type: string;
69
+ content: string;
70
+ keywords: string[];
71
+ }
72
+ export interface CodexUserMessage {
73
+ timestamp: string;
74
+ text: string;
75
+ }
76
+ export interface CodexSessionInsight {
77
+ sessionId: string;
78
+ userMessages: CodexUserMessage[];
79
+ toolCallCount: number;
80
+ toolCalls: Record<string, number>;
81
+ errorCount: number;
82
+ }
83
+ export interface UsageOverview {
84
+ claudeCode: {
85
+ totalSessions: number;
86
+ totalInputTokens: number;
87
+ totalOutputTokens: number;
88
+ totalCostUsd: number;
89
+ totalDurationMinutes: number;
90
+ activeDays: number;
91
+ models: Record<string, {
92
+ sessions: number;
93
+ tokens: number;
94
+ cost: number;
95
+ }>;
96
+ topProjects: Array<{
97
+ path: string;
98
+ sessions: number;
99
+ tokens: number;
100
+ }>;
101
+ toolUsage: Record<string, number>;
102
+ dailyActivity: Record<string, {
103
+ sessions: number;
104
+ tokens: number;
105
+ }>;
106
+ };
107
+ codex: {
108
+ totalSessions: number;
109
+ totalTokensUsed: number;
110
+ models: Record<string, {
111
+ sessions: number;
112
+ tokens: number;
113
+ }>;
114
+ activeDays: number;
115
+ dailyActivity: Record<string, {
116
+ sessions: number;
117
+ tokens: number;
118
+ }>;
119
+ };
120
+ period: {
121
+ since: string;
122
+ until: string;
123
+ };
124
+ }
125
+ export interface EvalSectionDef {
126
+ id: string;
127
+ name: string;
128
+ weight: string;
129
+ standard: {
130
+ score: number;
131
+ label: string;
132
+ criteria: string[];
133
+ };
134
+ superior: {
135
+ score: number;
136
+ label: string;
137
+ criteria: string[];
138
+ };
139
+ keywords: string[];
140
+ thresholds: Record<string, number>;
141
+ superiorRules?: {
142
+ mode?: "any" | "grouped";
143
+ strongThresholds?: string[];
144
+ supportThresholds?: string[];
145
+ minStrongMatched?: number;
146
+ minSupportMatched?: number;
147
+ };
148
+ }
149
+ export interface EvalStandard {
150
+ name: string;
151
+ description?: string;
152
+ sections: EvalSectionDef[];
153
+ noiseFilters?: {
154
+ prefixes?: string[];
155
+ templatePhrases?: string[];
156
+ minLength?: number;
157
+ };
158
+ }
159
+ export interface CliOptions {
160
+ since?: string;
161
+ until?: string;
162
+ format: "text" | "json" | "markdown" | "html";
163
+ output?: string;
164
+ standard?: string;
165
+ previous?: boolean;
166
+ engineer?: string;
167
+ department?: string;
168
+ }
169
+ export interface ReportMeta {
170
+ engineer?: string;
171
+ department?: string;
172
+ }
173
+ export interface DataQualityWarning {
174
+ source: string;
175
+ severity: "missing" | "partial" | "error";
176
+ message: string;
177
+ }
178
+ export interface EvalReport {
179
+ generatedAt: string;
180
+ period: {
181
+ since: string;
182
+ until: string;
183
+ };
184
+ standardName: string;
185
+ locale: "en" | "zh-TW";
186
+ meta?: ReportMeta;
187
+ usage: UsageOverview;
188
+ sections: EvalSectionResult[];
189
+ dataWarnings: DataQualityWarning[];
190
+ managementSummary: {
191
+ headline: string;
192
+ overallAssessment: string;
193
+ observations: string[];
194
+ recommendations: string[];
195
+ };
196
+ }
197
+ export interface EvalSectionResult {
198
+ id: string;
199
+ name: string;
200
+ weight: string;
201
+ score: number;
202
+ label: string;
203
+ reason: string;
204
+ metThresholds: string[];
205
+ usageEvidence: string[];
206
+ scoreEvidence: string[];
207
+ signals: Array<{
208
+ type: string;
209
+ description: string;
210
+ sessionId: string;
211
+ detail: string;
212
+ }>;
213
+ metrics: Record<string, number>;
214
+ summary: string;
215
+ }
216
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // ── Data source types ──
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,0BAA0B"}
@@ -0,0 +1,3 @@
1
+ import type { EvalStandard } from "./types.js";
2
+ export declare function buildNoiseFilter(standard: EvalStandard): (text: string) => boolean;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAalF"}
package/dist/utils.js ADDED
@@ -0,0 +1,17 @@
1
+ export function buildNoiseFilter(standard) {
2
+ const prefixes = standard.noiseFilters?.prefixes ?? [];
3
+ const phrases = standard.noiseFilters?.templatePhrases ?? [];
4
+ const minLen = standard.noiseFilters?.minLength ?? 20;
5
+ return (text) => {
6
+ const trimmed = text.trimStart();
7
+ if (prefixes.some((p) => trimmed.startsWith(p)))
8
+ return true;
9
+ const lower = trimmed.toLowerCase();
10
+ if (phrases.some((p) => lower.includes(p)))
11
+ return true;
12
+ if (trimmed.length < minLen)
13
+ return true;
14
+ return false;
15
+ };
16
+ }
17
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,QAAsB;IACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,QAAQ,IAAI,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,EAAE,eAAe,IAAI,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE,SAAS,IAAI,EAAE,CAAC;IAEtD,OAAO,CAAC,IAAY,EAAW,EAAE;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACxD,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM;YAAE,OAAO,IAAI,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@hanfour.huang/caliber",
3
+ "version": "0.1.2",
4
+ "description": "Caliber — AI Development Performance Evaluator. Analyze Claude Code & Codex usage for technical performance review.",
5
+ "type": "module",
6
+ "private": false,
7
+ "bin": { "caliber": "./dist/cli.js" },
8
+ "files": ["dist", "templates", "README.md"],
9
+ "repository": { "type": "git", "url": "git+https://github.com/hanfour/caliber.git" },
10
+ "homepage": "https://hanfour.github.io/caliber/",
11
+ "bugs": { "url": "https://github.com/hanfour/caliber/issues" },
12
+ "engines": { "node": ">=20", "pnpm": ">=9" },
13
+ "packageManager": "pnpm@9.15.0",
14
+ "publishConfig": { "access": "public" },
15
+ "scripts": {
16
+ "build": "rm -rf dist && tsc -p tsconfig.json",
17
+ "dev": "tsx src/cli.ts",
18
+ "start": "node dist/cli.js",
19
+ "pretest": "scripts/cleanup-testcontainers.sh",
20
+ "test": "pnpm build && vitest run",
21
+ "test:watch": "vitest",
22
+ "pretest:coverage": "scripts/cleanup-testcontainers.sh",
23
+ "test:coverage": "vitest run --config vitest.coverage.config.ts",
24
+ "prepublishOnly": "pnpm build && pnpm test",
25
+ "lint": "turbo run lint",
26
+ "typecheck": "turbo run typecheck",
27
+ "ws:build": "turbo run build",
28
+ "ws:test": "turbo run test",
29
+ "ws:dev": "turbo run dev --parallel",
30
+ "perf:gateway": "tsx scripts/perf-gateway.ts"
31
+ },
32
+ "keywords": ["claude-code", "codex", "ai", "evaluation", "performance"],
33
+ "license": "MIT",
34
+ "dependencies": {
35
+ "better-sqlite3": "^11.7.0",
36
+ "chalk": "^5.4.1",
37
+ "commander": "^13.1.0",
38
+ "dayjs": "^1.11.13"
39
+ },
40
+ "devDependencies": {
41
+ "@types/autocannon": "^7.12.7",
42
+ "@types/better-sqlite3": "^7.6.12",
43
+ "@types/node": "^22.10.0",
44
+ "@vitest/coverage-v8": "^4.1.4",
45
+ "autocannon": "^8.0.0",
46
+ "tsx": "^4.19.0",
47
+ "turbo": "^2.3.0",
48
+ "typescript": "^5.7.0",
49
+ "vitest": "^4.1.4"
50
+ },
51
+ "pnpm": {
52
+ "overrides": {
53
+ "fast-uri": ">=3.1.2",
54
+ "cookie": ">=0.7.0",
55
+ "uuid": ">=11.1.1",
56
+ "postcss": ">=8.5.10"
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,174 @@
1
+ {
2
+ "name": "OneAD R&D AI-Application Evaluation Standard",
3
+ "description": "研發團隊 AI 應用評核標準定義",
4
+ "sections": [
5
+ {
6
+ "id": "interaction",
7
+ "name": "AI Interaction & Decision / AI 交互與決策",
8
+ "weight": "20%",
9
+ "standard": {
10
+ "score": 100,
11
+ "label": "Standard / 標準",
12
+ "criteria": [
13
+ "Actively use AI for coding / 主動使用 AI 開發",
14
+ "Decision notes clearly describe the logic for choosing a specific AI suggestion / 決策筆記能清晰描述選擇邏輯"
15
+ ]
16
+ },
17
+ "superior": {
18
+ "score": 120,
19
+ "label": "Superior / 卓越",
20
+ "criteria": [
21
+ "Guide AI through multiple iterations (Option A -> B -> C) / 引導 AI 多次迭代",
22
+ "Identify optimal solution based on system constraints and future scalability / 基於系統限制與擴充性識別最優解"
23
+ ]
24
+ },
25
+ "keywords": [
26
+ "option",
27
+ "alternative",
28
+ "instead",
29
+ "compare",
30
+ "approach",
31
+ "let's try",
32
+ "try another",
33
+ "switch to",
34
+ "prefer",
35
+ "trade-off",
36
+ "pros and cons",
37
+ "better approach",
38
+ "refactor",
39
+ "iterate",
40
+ "方案",
41
+ "替代",
42
+ "改用",
43
+ "換一種",
44
+ "比較",
45
+ "取捨",
46
+ "迭代",
47
+ "重構",
48
+ "試試",
49
+ "另一個",
50
+ "優化"
51
+ ],
52
+ "thresholds": {
53
+ "iterativeRatio": 0.3,
54
+ "correctionCount": 5,
55
+ "keywordHits": 10,
56
+ "avgToolUses": 15
57
+ },
58
+ "superiorRules": {
59
+ "mode": "grouped",
60
+ "strongThresholds": [
61
+ "iterativeRatio",
62
+ "correctionCount",
63
+ "keywordHits"
64
+ ],
65
+ "supportThresholds": [
66
+ "avgToolUses"
67
+ ],
68
+ "minStrongMatched": 1,
69
+ "minSupportMatched": 0
70
+ }
71
+ },
72
+ {
73
+ "id": "riskControl",
74
+ "name": "AI Identification & Risk Control / AI 識別與風險控管",
75
+ "weight": "50%",
76
+ "standard": {
77
+ "score": 100,
78
+ "label": "Standard / 標準",
79
+ "criteria": [
80
+ "Catch common AI errors/hallucinations / 抓出常見 AI 錯誤與幻覺",
81
+ "Resulting code is stable and meets basic quality requirements / 代碼穩定符合基本品質要求"
82
+ ]
83
+ },
84
+ "superior": {
85
+ "score": 120,
86
+ "label": "Superior / 卓越",
87
+ "criteria": [
88
+ "Identify critical risks (Security, Performance, Memory leaks) / 識別關鍵風險(資安、效能、記憶體溢位)",
89
+ "Produce Technical SOP or Wiki for team knowledge sharing / 將修正轉化為團隊 SOP 或 Wiki"
90
+ ]
91
+ },
92
+ "keywords": [
93
+ "security",
94
+ "vulnerability",
95
+ "injection",
96
+ "xss",
97
+ "csrf",
98
+ "authentication",
99
+ "authorization",
100
+ "secret",
101
+ "credential",
102
+ "permission",
103
+ "sanitize",
104
+ "performance",
105
+ "bottleneck",
106
+ "memory leak",
107
+ "optimize",
108
+ "latency",
109
+ "cache invalidat",
110
+ "slow query",
111
+ "timeout",
112
+ "n+1",
113
+ "regression",
114
+ "race condition",
115
+ "deadlock",
116
+ "overflow",
117
+ "null pointer",
118
+ "security review",
119
+ "security audit",
120
+ "risk assessment",
121
+ "threat model",
122
+ "CVE",
123
+ "OWASP",
124
+ "penetration test",
125
+ "production incident",
126
+ "postmortem",
127
+ "安全",
128
+ "漏洞",
129
+ "注入",
130
+ "效能",
131
+ "瓶頸",
132
+ "記憶體洩漏",
133
+ "風險評估",
134
+ "安全審查"
135
+ ],
136
+ "thresholds": {
137
+ "securityCount": 3,
138
+ "performanceCount": 3,
139
+ "bugsCaught": 5,
140
+ "frictionSessions": 3,
141
+ "codexErrorSessions": 1
142
+ },
143
+ "superiorRules": {
144
+ "mode": "grouped",
145
+ "strongThresholds": [
146
+ "securityCount",
147
+ "performanceCount",
148
+ "bugsCaught"
149
+ ],
150
+ "supportThresholds": [
151
+ "frictionSessions",
152
+ "codexErrorSessions"
153
+ ],
154
+ "minStrongMatched": 1,
155
+ "minSupportMatched": 0
156
+ }
157
+ }
158
+ ],
159
+ "noiseFilters": {
160
+ "prefixes": [
161
+ "<task-notification>",
162
+ "<command-name>",
163
+ "<local-command-caveat>",
164
+ "<system-reminder>"
165
+ ],
166
+ "templatePhrases": [
167
+ "you are a senior code reviewer",
168
+ "you are a code reviewer",
169
+ "perform a deep, multi-dimensional analysis",
170
+ "review the provided pull request"
171
+ ],
172
+ "minLength": 20
173
+ }
174
+ }