ai-dev-analytics 1.0.0-beta.11

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 (118) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +422 -0
  3. package/README.zh-CN.md +422 -0
  4. package/dist/cli/commands/dashboard.d.ts +2 -0
  5. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  6. package/dist/cli/commands/dashboard.js +70 -0
  7. package/dist/cli/commands/dashboard.js.map +1 -0
  8. package/dist/cli/commands/init.d.ts +2 -0
  9. package/dist/cli/commands/init.d.ts.map +1 -0
  10. package/dist/cli/commands/init.js +367 -0
  11. package/dist/cli/commands/init.js.map +1 -0
  12. package/dist/cli/commands/log.d.ts +2 -0
  13. package/dist/cli/commands/log.d.ts.map +1 -0
  14. package/dist/cli/commands/log.js +438 -0
  15. package/dist/cli/commands/log.js.map +1 -0
  16. package/dist/cli/commands/migrate.d.ts +2 -0
  17. package/dist/cli/commands/migrate.d.ts.map +1 -0
  18. package/dist/cli/commands/migrate.js +300 -0
  19. package/dist/cli/commands/migrate.js.map +1 -0
  20. package/dist/cli/commands/reindex.d.ts +10 -0
  21. package/dist/cli/commands/reindex.d.ts.map +1 -0
  22. package/dist/cli/commands/reindex.js +94 -0
  23. package/dist/cli/commands/reindex.js.map +1 -0
  24. package/dist/cli/commands/report.d.ts +2 -0
  25. package/dist/cli/commands/report.d.ts.map +1 -0
  26. package/dist/cli/commands/report.js +219 -0
  27. package/dist/cli/commands/report.js.map +1 -0
  28. package/dist/cli/commands/rules.d.ts +2 -0
  29. package/dist/cli/commands/rules.d.ts.map +1 -0
  30. package/dist/cli/commands/rules.js +143 -0
  31. package/dist/cli/commands/rules.js.map +1 -0
  32. package/dist/cli/commands/start.d.ts +2 -0
  33. package/dist/cli/commands/start.d.ts.map +1 -0
  34. package/dist/cli/commands/start.js +173 -0
  35. package/dist/cli/commands/start.js.map +1 -0
  36. package/dist/cli/commands/status.d.ts +2 -0
  37. package/dist/cli/commands/status.d.ts.map +1 -0
  38. package/dist/cli/commands/status.js +74 -0
  39. package/dist/cli/commands/status.js.map +1 -0
  40. package/dist/cli/commands/update.d.ts +2 -0
  41. package/dist/cli/commands/update.d.ts.map +1 -0
  42. package/dist/cli/commands/update.js +146 -0
  43. package/dist/cli/commands/update.js.map +1 -0
  44. package/dist/cli/index.d.ts +3 -0
  45. package/dist/cli/index.d.ts.map +1 -0
  46. package/dist/cli/index.js +85 -0
  47. package/dist/cli/index.js.map +1 -0
  48. package/dist/mcp/server.d.ts +10 -0
  49. package/dist/mcp/server.d.ts.map +1 -0
  50. package/dist/mcp/server.js +704 -0
  51. package/dist/mcp/server.js.map +1 -0
  52. package/dist/schemas/run-json.d.ts +258 -0
  53. package/dist/schemas/run-json.d.ts.map +1 -0
  54. package/dist/schemas/run-json.js +22 -0
  55. package/dist/schemas/run-json.js.map +1 -0
  56. package/dist/server/api.d.ts +30 -0
  57. package/dist/server/api.d.ts.map +1 -0
  58. package/dist/server/api.js +239 -0
  59. package/dist/server/api.js.map +1 -0
  60. package/dist/server/index.d.ts +2 -0
  61. package/dist/server/index.d.ts.map +1 -0
  62. package/dist/server/index.js +228 -0
  63. package/dist/server/index.js.map +1 -0
  64. package/dist/utils/display.d.ts +12 -0
  65. package/dist/utils/display.d.ts.map +1 -0
  66. package/dist/utils/display.js +52 -0
  67. package/dist/utils/display.js.map +1 -0
  68. package/dist/utils/fs.d.ts +9 -0
  69. package/dist/utils/fs.d.ts.map +1 -0
  70. package/dist/utils/fs.js +43 -0
  71. package/dist/utils/fs.js.map +1 -0
  72. package/dist/utils/git.d.ts +4 -0
  73. package/dist/utils/git.d.ts.map +1 -0
  74. package/dist/utils/git.js +18 -0
  75. package/dist/utils/git.js.map +1 -0
  76. package/dist/utils/guide.d.ts +18 -0
  77. package/dist/utils/guide.d.ts.map +1 -0
  78. package/dist/utils/guide.js +172 -0
  79. package/dist/utils/guide.js.map +1 -0
  80. package/dist/utils/paths.d.ts +25 -0
  81. package/dist/utils/paths.d.ts.map +1 -0
  82. package/dist/utils/paths.js +45 -0
  83. package/dist/utils/paths.js.map +1 -0
  84. package/dist/utils/rules.d.ts +44 -0
  85. package/dist/utils/rules.d.ts.map +1 -0
  86. package/dist/utils/rules.js +208 -0
  87. package/dist/utils/rules.js.map +1 -0
  88. package/dist/utils/run-data.d.ts +37 -0
  89. package/dist/utils/run-data.d.ts.map +1 -0
  90. package/dist/utils/run-data.js +389 -0
  91. package/dist/utils/run-data.js.map +1 -0
  92. package/dist/utils/tokens.d.ts +26 -0
  93. package/dist/utils/tokens.d.ts.map +1 -0
  94. package/dist/utils/tokens.js +173 -0
  95. package/dist/utils/tokens.js.map +1 -0
  96. package/package.json +49 -0
  97. package/src/assets/skills/audit.md +98 -0
  98. package/src/assets/skills/bug-fixer.md +48 -0
  99. package/src/assets/skills/code-generator.md +82 -0
  100. package/src/assets/skills/commit-code.md +67 -0
  101. package/src/assets/skills/dashboard-generator.md +65 -0
  102. package/src/assets/skills/dev-flower.md +85 -0
  103. package/src/assets/skills/deviation-recorder.md +82 -0
  104. package/src/assets/skills/docx-to-markdown.md +69 -0
  105. package/src/assets/skills/mcp-reviewer.md +43 -0
  106. package/src/assets/skills/requirement-analyzer.md +103 -0
  107. package/src/assets/skills/rules-evolver.md +47 -0
  108. package/src/assets/skills/self-reviewer.md +53 -0
  109. package/src/assets/skills/task-splitter.md +58 -0
  110. package/src/assets/skills/workflow-orchestrator.md +209 -0
  111. package/src/assets/templates/demo-run.json +910 -0
  112. package/src/assets/templates/run.json +63 -0
  113. package/src/dashboard/assets/index-C-E7m3g4.css +1 -0
  114. package/src/dashboard/assets/index-CsU3dyCj.js +111 -0
  115. package/src/dashboard/demo/overview.json +71 -0
  116. package/src/dashboard/demo/run.json +2667 -0
  117. package/src/dashboard/demo/runs.json +19 -0
  118. package/src/dashboard/index.html +13 -0
@@ -0,0 +1,389 @@
1
+ /**
2
+ * Shared run.json read/write logic.
3
+ *
4
+ * Used by both CLI (log.ts) and MCP Server (server.ts).
5
+ * Single source of truth for data manipulation.
6
+ */
7
+ import { resolve } from 'node:path';
8
+ import { getBranchName, getDevName, isGitRepo } from './git.js';
9
+ import { runDir, branchDir, configPath, aidevosDir } from './paths.js';
10
+ import { ensureDir, fileExists, readJson, writeJson, writeText } from './fs.js';
11
+ import { ensureGuide, syncGuideReference } from './guide.js';
12
+ // ─── Helpers ─────────────────────────────────────────────
13
+ export function now() {
14
+ return new Date().toISOString();
15
+ }
16
+ export function nextId(arr, prefix) {
17
+ const nums = arr
18
+ .map((item) => {
19
+ const id = item.taskId || item.bugId || item.deviationId || item.reviewId || item.ruleId || '';
20
+ const match = id.match(new RegExp(`^${prefix}-(\\d+)$`));
21
+ return match ? parseInt(match[1]) : 0;
22
+ })
23
+ .filter((n) => n > 0);
24
+ const max = nums.length > 0 ? Math.max(...nums) : 0;
25
+ const pad = prefix === 'RULE' ? 3 : 2;
26
+ return `${prefix}-${String(max + 1).padStart(pad, '0')}`;
27
+ }
28
+ export function addEvent(data, type, eventData) {
29
+ data.events.push({ type, time: now(), data: eventData });
30
+ }
31
+ export function addTimeline(data, type, title) {
32
+ data.timeline.push({ type, title, timestamp: now() });
33
+ }
34
+ // ─── Config ──────────────────────────────────────────────
35
+ export function loadConfig(projectRoot) {
36
+ try {
37
+ const cfgPath = configPath(projectRoot);
38
+ if (fileExists(cfgPath))
39
+ return readJson(cfgPath);
40
+ }
41
+ catch { /* ignore */ }
42
+ return {};
43
+ }
44
+ // ─── Metrics Recalculation ───────────────────────────────
45
+ export function recalcMetrics(data, projectRoot) {
46
+ const s = data.summary;
47
+ const m = data.metrics;
48
+ const totalTasks = s.totalTasks || 0;
49
+ const reviewCount = s.reviewCount || 0;
50
+ m.aiDeviationRate = totalTasks > 0 ? Math.round((s.deviationCount || 0) / totalTasks * 100 * 100) / 100 : 0;
51
+ m.bugRate = totalTasks > 0 ? Math.round((s.bugCount || 0) / totalTasks * 100 * 100) / 100 : 0;
52
+ m.reviewPassRate = reviewCount > 0 ? Math.round((s.reviewPassCount || 0) / reviewCount * 100 * 100) / 100 : 0;
53
+ m.rulesSedimentedCount = s.rulesSedimented || 0;
54
+ const totalLines = (s.linesAdded || 0) + (s.linesRemoved || 0);
55
+ m.averageLinesPerTask = totalTasks > 0 ? Math.round(totalLines / totalTasks) : 0;
56
+ if (data.meta?.startTime) {
57
+ const elapsed = (Date.now() - new Date(data.meta.startTime).getTime()) / 1000;
58
+ m.totalDevelopmentTimeSeconds = Math.round(elapsed);
59
+ const hours = elapsed / 3600;
60
+ m.developmentVelocity = hours > 0 ? Math.round((s.completedTasks || 0) / hours * 100) / 100 : 0;
61
+ }
62
+ // Node time breakdown
63
+ // Normalize Chinese stage names to English keys for consistent display
64
+ const stageNormalize = {
65
+ '代码生成': 'Code Generation',
66
+ '需求分析': 'Requirement Analysis',
67
+ '任务拆分': 'Task Split',
68
+ '自检审查': 'Self Review',
69
+ '质量自检': 'Self Review',
70
+ '偏差修复': 'Deviation Fix',
71
+ '缺陷修复': 'Bug Fix',
72
+ 'Bug 修复': 'Bug Fix',
73
+ 'bug修复': 'Bug Fix',
74
+ '需求接入': 'Requirement Ingestion',
75
+ '构建验证': 'Build Verification',
76
+ };
77
+ const nodeTimes = {};
78
+ for (const w of data.workflow) {
79
+ if (w.startTime && w.endTime) {
80
+ const sec = (new Date(w.endTime).getTime() - new Date(w.startTime).getTime()) / 1000;
81
+ const stage = stageNormalize[w.stage] || w.stage;
82
+ if (sec > 0)
83
+ nodeTimes[stage] = (nodeTimes[stage] || 0) + sec;
84
+ }
85
+ }
86
+ let codeGenTotal = 0;
87
+ for (const t of data.tasks) {
88
+ if (t.startedAt && t.completedAt) {
89
+ const sec = (new Date(t.completedAt).getTime() - new Date(t.startedAt).getTime()) / 1000;
90
+ if (sec > 0)
91
+ codeGenTotal += sec;
92
+ }
93
+ }
94
+ if (codeGenTotal > 0)
95
+ nodeTimes['Code Generation'] = codeGenTotal;
96
+ let bugFixTotal = 0;
97
+ for (const b of data.bugs) {
98
+ if (b.reportedAt && b.fixedAt) {
99
+ const sec = (new Date(b.fixedAt).getTime() - new Date(b.reportedAt).getTime()) / 1000;
100
+ if (sec > 0)
101
+ bugFixTotal += sec;
102
+ }
103
+ }
104
+ if (bugFixTotal > 0)
105
+ nodeTimes['Bug Fix'] = bugFixTotal;
106
+ let devFixTotal = 0;
107
+ for (const d of data.deviations) {
108
+ if (d.detectedAt && d.fixedAt) {
109
+ const sec = (new Date(d.fixedAt).getTime() - new Date(d.detectedAt).getTime()) / 1000;
110
+ if (sec > 0)
111
+ devFixTotal += sec;
112
+ }
113
+ }
114
+ if (devFixTotal > 0)
115
+ nodeTimes['Deviation Fix'] = devFixTotal;
116
+ m.nodeTimeBreakdown = nodeTimes;
117
+ m.actualWorkSeconds = Math.round(Object.values(nodeTimes).reduce((a, b) => a + b, 0));
118
+ // Efficiency multiplier
119
+ const actualHours = (m.actualWorkSeconds || 0) / 3600;
120
+ if (data.cost?.estimatedManualHours && actualHours > 0) {
121
+ m.efficiencyMultiplier = Math.round(data.cost.estimatedManualHours / actualHours * 10) / 10;
122
+ }
123
+ // ROI calculation
124
+ const config = projectRoot ? loadConfig(projectRoot) : {};
125
+ const hourlyRate = config.hourlyRate || 0;
126
+ const totalTokens = data.cost?.totalTokens || 0;
127
+ const estimatedManualHours = data.cost?.estimatedManualHours || 0;
128
+ const detail = data.cost?.tokenDetail;
129
+ // Calculate tokenCost: prefer tokenDetail with real pricing, fallback to config flat rate
130
+ if (detail && (detail.inputTokens || detail.outputTokens || detail.cacheCreationTokens || detail.cacheReadTokens)) {
131
+ // Claude pricing (per 1M tokens): input $3, output $15, cache creation $3.75, cache read $0.30
132
+ const inputCost = (detail.inputTokens || 0) / 1_000_000 * 3;
133
+ const outputCost = (detail.outputTokens || 0) / 1_000_000 * 15;
134
+ const cacheCreateCost = (detail.cacheCreationTokens || 0) / 1_000_000 * 3.75;
135
+ const cacheReadCost = (detail.cacheReadTokens || 0) / 1_000_000 * 0.30;
136
+ m.tokenCost = Math.round((inputCost + outputCost + cacheCreateCost + cacheReadCost) * 100) / 100;
137
+ }
138
+ else if (totalTokens > 0 && config.tokenPricePer1M) {
139
+ m.tokenCost = Math.round(totalTokens / 1_000_000 * config.tokenPricePer1M * 100) / 100;
140
+ }
141
+ // hoursSaved: human hours that AI replaced (= estimatedManualHours)
142
+ if (estimatedManualHours > 0) {
143
+ m.hoursSaved = estimatedManualHours;
144
+ }
145
+ // moneySaved: manual labor cost - AI token cost
146
+ if (estimatedManualHours > 0 && hourlyRate > 0) {
147
+ const manualCost = estimatedManualHours * hourlyRate;
148
+ m.moneySaved = Math.round((manualCost - (m.tokenCost || 0)) * 100) / 100;
149
+ }
150
+ // ROI: cost savings relative to AI cost
151
+ if (m.moneySaved != null && m.tokenCost && m.tokenCost > 0) {
152
+ m.roi = Math.round(m.moneySaved / m.tokenCost * 100 * 100) / 100;
153
+ }
154
+ }
155
+ // ─── Requirement Sync ────────────────────────────────────
156
+ export function updateRequirement(data, projectRoot) {
157
+ try {
158
+ const branch = data.meta?.branch;
159
+ if (!branch)
160
+ return;
161
+ const reqPath = resolve(branchDir(projectRoot, branch), 'requirement.json');
162
+ const bDir = branchDir(projectRoot, branch);
163
+ ensureDir(bDir);
164
+ let req;
165
+ if (fileExists(reqPath)) {
166
+ req = readJson(reqPath);
167
+ }
168
+ else {
169
+ req = {
170
+ branch, title: '', summary: '', prdPhases: [], modules: [], highlights: [], developers: [],
171
+ totals: { tasks: 0, completedTasks: 0, bugs: 0, deviations: 0, linesAdded: 0, linesRemoved: 0, totalTokens: 0 },
172
+ createdAt: now(), updatedAt: '',
173
+ };
174
+ }
175
+ const devName = data.meta?.developer || '';
176
+ if (!devName)
177
+ return;
178
+ const s = data.summary || {};
179
+ const m = data.metrics || {};
180
+ const reviewCount = s.reviewCount || 0;
181
+ const reviewPassCount = s.reviewPassCount || 0;
182
+ const devSummary = {
183
+ name: devName,
184
+ modules: req.modules.filter(mod => mod.assignee === devName).map(mod => mod.name),
185
+ tasks: s.totalTasks || 0,
186
+ completedTasks: s.completedTasks || 0,
187
+ bugs: s.bugCount || 0,
188
+ deviations: s.deviationCount || 0,
189
+ linesAdded: s.linesAdded || 0,
190
+ linesRemoved: s.linesRemoved || 0,
191
+ firstPassRate: reviewCount > 0 ? Math.round(reviewPassCount / reviewCount * 100) / 100 : 0,
192
+ actualWorkSeconds: m.actualWorkSeconds || 0,
193
+ totalTokens: data.cost?.totalTokens || 0,
194
+ };
195
+ const idx = req.developers.findIndex(d => d.name === devName);
196
+ if (idx >= 0)
197
+ req.developers[idx] = devSummary;
198
+ else
199
+ req.developers.push(devSummary);
200
+ req.totals = {
201
+ tasks: req.developers.reduce((a, d) => a + d.tasks, 0),
202
+ completedTasks: req.developers.reduce((a, d) => a + d.completedTasks, 0),
203
+ bugs: req.developers.reduce((a, d) => a + d.bugs, 0),
204
+ deviations: req.developers.reduce((a, d) => a + d.deviations, 0),
205
+ linesAdded: req.developers.reduce((a, d) => a + d.linesAdded, 0),
206
+ linesRemoved: req.developers.reduce((a, d) => a + d.linesRemoved, 0),
207
+ totalTokens: req.developers.reduce((a, d) => a + d.totalTokens, 0),
208
+ };
209
+ if (data.highlights?.length) {
210
+ const existing = new Set(req.highlights.map((h) => h.content));
211
+ for (const h of data.highlights) {
212
+ if (!existing.has(h.content)) {
213
+ req.highlights.push(h);
214
+ existing.add(h.content);
215
+ }
216
+ }
217
+ }
218
+ if (!req.title && data.meta?.branch) {
219
+ req.title = data.meta.branch;
220
+ }
221
+ req.updatedAt = now();
222
+ writeJson(reqPath, req);
223
+ }
224
+ catch {
225
+ // Non-critical: don't block run.json writes
226
+ }
227
+ }
228
+ // ─── Save (recalc + persist + sync) ─────────────────────
229
+ export function saveRunData(path, data, projectRoot) {
230
+ data.context.lastUpdated = now();
231
+ recalcMetrics(data, projectRoot);
232
+ writeJson(path, data);
233
+ updateRequirement(data, projectRoot);
234
+ }
235
+ // ─── Load / Normalize ────────────────────────────────────
236
+ export function normalizeRunData(data) {
237
+ for (const key of ['tasks', 'bugs', 'deviations', 'reviews', 'rules', 'files', 'timeline', 'events', 'workflow', 'highlights']) {
238
+ if (!Array.isArray(data[key]))
239
+ data[key] = [];
240
+ }
241
+ if (!data.summary)
242
+ data.summary = {};
243
+ if (!data.meta)
244
+ data.meta = {};
245
+ if (!data.context)
246
+ data.context = {};
247
+ if (!data.metrics)
248
+ data.metrics = {};
249
+ if (!data.cost)
250
+ data.cost = {};
251
+ return data;
252
+ }
253
+ /**
254
+ * Load existing run.json for current git branch/dev.
255
+ * Returns null if not found.
256
+ */
257
+ export function loadRunJson(projectRoot) {
258
+ if (!fileExists(configPath(projectRoot)))
259
+ return null;
260
+ if (!isGitRepo())
261
+ return null;
262
+ const branch = getBranchName();
263
+ const dev = getDevName();
264
+ const dir = runDir(projectRoot, branch, dev);
265
+ const p = resolve(dir, 'run.json');
266
+ if (!fileExists(p))
267
+ return null;
268
+ const data = normalizeRunData(readJson(p));
269
+ return { path: p, data };
270
+ }
271
+ /**
272
+ * Create initial RunData structure.
273
+ */
274
+ export function createInitialRunData(branch, dev, config) {
275
+ const ts = now();
276
+ return {
277
+ meta: {
278
+ schemaVersion: '2.0',
279
+ runId: branch,
280
+ project: config.project || '',
281
+ developer: dev,
282
+ branch,
283
+ aiModel: config.aiModel || '',
284
+ aiTool: config.aiTool || '',
285
+ startTime: ts,
286
+ endTime: undefined,
287
+ status: 'running',
288
+ prdPhases: [],
289
+ },
290
+ summary: {
291
+ totalTasks: 0,
292
+ completedTasks: 0,
293
+ bugCount: 0,
294
+ deviationCount: 0,
295
+ reviewCount: 0,
296
+ reviewPassCount: 0,
297
+ reviewFailCount: 0,
298
+ rulesSedimented: 0,
299
+ prdPhaseCount: 0,
300
+ filesChanged: 0,
301
+ linesAdded: 0,
302
+ linesRemoved: 0,
303
+ },
304
+ workflow: [],
305
+ tasks: [],
306
+ bugs: [],
307
+ deviations: [],
308
+ reviews: [],
309
+ files: [],
310
+ metrics: {},
311
+ timeline: [],
312
+ events: [],
313
+ rules: [],
314
+ context: {
315
+ currentPrdPhase: undefined,
316
+ currentTaskId: undefined,
317
+ currentStage: undefined,
318
+ lastUpdated: ts,
319
+ },
320
+ cost: {
321
+ totalTokens: 0,
322
+ estimatedManualHours: 0,
323
+ actualHours: 0,
324
+ tokenBreakdown: [],
325
+ },
326
+ highlights: [],
327
+ };
328
+ }
329
+ let _guideSynced = false;
330
+ /**
331
+ * Ensure run.json exists (lazy init).
332
+ * Creates .aidevos/, config.json, run.json, branch-level files if missing.
333
+ */
334
+ export function ensureRunJson(projectRoot) {
335
+ if (!isGitRepo()) {
336
+ throw new Error('Not a git repository. AIDevOS requires git.');
337
+ }
338
+ // Ensure .aidevos/config.json exists
339
+ const dir = aidevosDir(projectRoot);
340
+ if (!fileExists(resolve(dir, 'config.json'))) {
341
+ ensureDir(dir);
342
+ ensureDir(resolve(dir, 'rules'));
343
+ ensureDir(resolve(dir, 'runs'));
344
+ writeJson(resolve(dir, 'config.json'), {
345
+ schemaVersion: '1.0',
346
+ aiTool: 'mcp',
347
+ project: resolve(projectRoot).split('/').pop() || 'unknown',
348
+ });
349
+ }
350
+ // Ensure AIDA guide exists and is referenced by AI tool instruction files (once per session)
351
+ if (!_guideSynced) {
352
+ ensureGuide(projectRoot);
353
+ syncGuideReference(projectRoot);
354
+ _guideSynced = true;
355
+ }
356
+ const branch = getBranchName();
357
+ const dev = getDevName();
358
+ const devDir = runDir(projectRoot, branch, dev);
359
+ const runJsonPath = resolve(devDir, 'run.json');
360
+ if (fileExists(runJsonPath)) {
361
+ const data = normalizeRunData(readJson(runJsonPath));
362
+ return { path: runJsonPath, data };
363
+ }
364
+ // Lazy create
365
+ const config = loadConfig(projectRoot);
366
+ const bDir = branchDir(projectRoot, branch);
367
+ ensureDir(bDir);
368
+ ensureDir(devDir);
369
+ const runData = createInitialRunData(branch, dev, config);
370
+ writeJson(runJsonPath, runData);
371
+ // Create shared branch-level files
372
+ const prdPath = resolve(bDir, 'prd.md');
373
+ if (!fileExists(prdPath))
374
+ writeText(prdPath, '# PRD\n\nPlace your product requirements here.\n');
375
+ const analysisPath = resolve(bDir, 'analysis.md');
376
+ if (!fileExists(analysisPath))
377
+ writeText(analysisPath, '');
378
+ const reqPath = resolve(bDir, 'requirement.json');
379
+ if (!fileExists(reqPath)) {
380
+ const ts = now();
381
+ writeJson(reqPath, {
382
+ branch, title: '', summary: '', prdPhases: [], modules: [], highlights: [], developers: [],
383
+ totals: { tasks: 0, completedTasks: 0, bugs: 0, deviations: 0, linesAdded: 0, linesRemoved: 0, totalTokens: 0 },
384
+ createdAt: ts, updatedAt: ts,
385
+ });
386
+ }
387
+ return { path: runJsonPath, data: runData };
388
+ }
389
+ //# sourceMappingURL=run-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-data.js","sourceRoot":"","sources":["../../src/utils/run-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Token usage collection from AI tool session files.
3
+ *
4
+ * Currently supports: Claude Code
5
+ * Data source: ~/.claude/projects/{project-hash}/{session}.jsonl
6
+ */
7
+ export interface TokenUsage {
8
+ inputTokens: number;
9
+ outputTokens: number;
10
+ cacheCreationTokens: number;
11
+ cacheReadTokens: number;
12
+ totalTokens: number;
13
+ }
14
+ /**
15
+ * Collect token usage from Claude Code for the current project.
16
+ *
17
+ * @param projectRoot - Project root directory
18
+ * @param sinceTimestamp - Only count tokens after this ISO timestamp
19
+ * @returns Token usage, or null if Claude Code data not found
20
+ */
21
+ export declare function collectClaudeTokens(projectRoot: string, sinceTimestamp?: string): TokenUsage | null;
22
+ /**
23
+ * Collect token usage between two timestamps (for a specific task).
24
+ */
25
+ export declare function collectClaudeTokensBetween(projectRoot: string, startTime: string, endTime: string): TokenUsage | null;
26
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAsGD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,MAAM,GACtB,UAAU,GAAG,IAAI,CAQnB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,UAAU,GAAG,IAAI,CAuDnB"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Token usage collection from AI tool session files.
3
+ *
4
+ * Currently supports: Claude Code
5
+ * Data source: ~/.claude/projects/{project-hash}/{session}.jsonl
6
+ */
7
+ import { resolve } from 'node:path';
8
+ import { homedir } from 'node:os';
9
+ import { readFileSync, readdirSync, statSync, existsSync } from 'node:fs';
10
+ /**
11
+ * Convert a project root path to Claude Code's project directory name.
12
+ * /Users/foo/my-project → -Users-foo-my-project
13
+ */
14
+ function projectPathToClaudeDir(projectRoot) {
15
+ return projectRoot.replace(/\//g, '-');
16
+ }
17
+ /**
18
+ * Find the Claude Code project session directory.
19
+ */
20
+ function getClaudeProjectDir(projectRoot) {
21
+ const claudeDir = resolve(homedir(), '.claude', 'projects');
22
+ if (!existsSync(claudeDir))
23
+ return null;
24
+ const dirName = projectPathToClaudeDir(projectRoot);
25
+ const fullPath = resolve(claudeDir, dirName);
26
+ if (!existsSync(fullPath))
27
+ return null;
28
+ return fullPath;
29
+ }
30
+ /**
31
+ * Find the most recently modified .jsonl session file in a Claude project dir.
32
+ */
33
+ function findLatestSessionFile(projectDir) {
34
+ const files = readdirSync(projectDir)
35
+ .filter(f => f.endsWith('.jsonl'))
36
+ .map(f => ({
37
+ name: f,
38
+ path: resolve(projectDir, f),
39
+ mtime: statSync(resolve(projectDir, f)).mtimeMs,
40
+ }))
41
+ .sort((a, b) => b.mtime - a.mtime);
42
+ return files.length > 0 ? files[0].path : null;
43
+ }
44
+ /**
45
+ * Parse token usage from a Claude Code session .jsonl file.
46
+ *
47
+ * @param sessionFile - Path to the .jsonl file
48
+ * @param sinceTimestamp - Only count messages after this ISO timestamp (optional)
49
+ * @returns Accumulated token usage
50
+ */
51
+ function parseSessionTokens(sessionFile, sinceTimestamp) {
52
+ const usage = {
53
+ inputTokens: 0,
54
+ outputTokens: 0,
55
+ cacheCreationTokens: 0,
56
+ cacheReadTokens: 0,
57
+ totalTokens: 0,
58
+ };
59
+ const sinceMs = sinceTimestamp ? new Date(sinceTimestamp).getTime() : 0;
60
+ // Read file in chunks from the end if we have a timestamp filter
61
+ // For simplicity, read the whole file (session files are typically < 50MB)
62
+ let content;
63
+ try {
64
+ content = readFileSync(sessionFile, 'utf-8');
65
+ }
66
+ catch {
67
+ return usage;
68
+ }
69
+ const lines = content.split('\n');
70
+ for (const line of lines) {
71
+ if (!line.trim())
72
+ continue;
73
+ let entry;
74
+ try {
75
+ entry = JSON.parse(line);
76
+ }
77
+ catch {
78
+ continue;
79
+ }
80
+ // Only process assistant messages (they contain usage data)
81
+ if (entry.type !== 'assistant')
82
+ continue;
83
+ // Filter by timestamp if specified
84
+ if (sinceMs > 0 && entry.timestamp) {
85
+ const msgMs = new Date(entry.timestamp).getTime();
86
+ if (msgMs < sinceMs)
87
+ continue;
88
+ }
89
+ const msgUsage = entry.message?.usage;
90
+ if (!msgUsage)
91
+ continue;
92
+ usage.inputTokens += msgUsage.input_tokens || 0;
93
+ usage.outputTokens += msgUsage.output_tokens || 0;
94
+ usage.cacheCreationTokens += msgUsage.cache_creation_input_tokens || 0;
95
+ usage.cacheReadTokens += msgUsage.cache_read_input_tokens || 0;
96
+ }
97
+ usage.totalTokens = usage.inputTokens + usage.outputTokens
98
+ + usage.cacheCreationTokens + usage.cacheReadTokens;
99
+ return usage;
100
+ }
101
+ /**
102
+ * Collect token usage from Claude Code for the current project.
103
+ *
104
+ * @param projectRoot - Project root directory
105
+ * @param sinceTimestamp - Only count tokens after this ISO timestamp
106
+ * @returns Token usage, or null if Claude Code data not found
107
+ */
108
+ export function collectClaudeTokens(projectRoot, sinceTimestamp) {
109
+ const projectDir = getClaudeProjectDir(projectRoot);
110
+ if (!projectDir)
111
+ return null;
112
+ const sessionFile = findLatestSessionFile(projectDir);
113
+ if (!sessionFile)
114
+ return null;
115
+ return parseSessionTokens(sessionFile, sinceTimestamp);
116
+ }
117
+ /**
118
+ * Collect token usage between two timestamps (for a specific task).
119
+ */
120
+ export function collectClaudeTokensBetween(projectRoot, startTime, endTime) {
121
+ const projectDir = getClaudeProjectDir(projectRoot);
122
+ if (!projectDir)
123
+ return null;
124
+ const sessionFile = findLatestSessionFile(projectDir);
125
+ if (!sessionFile)
126
+ return null;
127
+ const startMs = new Date(startTime).getTime();
128
+ const endMs = new Date(endTime).getTime();
129
+ const usage = {
130
+ inputTokens: 0,
131
+ outputTokens: 0,
132
+ cacheCreationTokens: 0,
133
+ cacheReadTokens: 0,
134
+ totalTokens: 0,
135
+ };
136
+ let content;
137
+ try {
138
+ content = readFileSync(sessionFile, 'utf-8');
139
+ }
140
+ catch {
141
+ return null;
142
+ }
143
+ const lines = content.split('\n');
144
+ for (const line of lines) {
145
+ if (!line.trim())
146
+ continue;
147
+ let entry;
148
+ try {
149
+ entry = JSON.parse(line);
150
+ }
151
+ catch {
152
+ continue;
153
+ }
154
+ if (entry.type !== 'assistant')
155
+ continue;
156
+ if (!entry.timestamp)
157
+ continue;
158
+ const msgMs = new Date(entry.timestamp).getTime();
159
+ if (msgMs < startMs || msgMs > endMs)
160
+ continue;
161
+ const msgUsage = entry.message?.usage;
162
+ if (!msgUsage)
163
+ continue;
164
+ usage.inputTokens += msgUsage.input_tokens || 0;
165
+ usage.outputTokens += msgUsage.output_tokens || 0;
166
+ usage.cacheCreationTokens += msgUsage.cache_creation_input_tokens || 0;
167
+ usage.cacheReadTokens += msgUsage.cache_read_input_tokens || 0;
168
+ }
169
+ usage.totalTokens = usage.inputTokens + usage.outputTokens
170
+ + usage.cacheCreationTokens + usage.cacheReadTokens;
171
+ return usage;
172
+ }
173
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"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"}