feat: add project usage analytics with ECharts

This commit is contained in:
shiyue
2026-08-04 00:49:52 +08:00
parent 58d5f816c2
commit c61b7434d2
39 changed files with 5040 additions and 283 deletions

View File

@@ -123,14 +123,23 @@ async function main() {
assert.strictEqual(result.overview.mcpCalls, 2);
assert.strictEqual(result.overview.mcpFailures, 1, 'done=true 的失败调用仍应计入失败');
assert.strictEqual(result.overview.skillMentions, 1);
assert.strictEqual(result.overview.projects, 1);
assert.strictEqual(result.overview.projectSessions, 1);
assert.strictEqual(result.overview.unassignedProjectSessions, 0);
assert.strictEqual(result.mcpStatus.completed, 1);
assert.strictEqual(result.mcpStatus.failed, 1);
assert.strictEqual(result.mcpTools[0].server, 'ccweb');
assert.strictEqual(result.mcpTools[0].calls, 1, '同调用数时应按工具名稳定排序');
assert.strictEqual(result.mcpTools[0].detailCallsReturned, 1);
assert.strictEqual(result.skills[0].name, 'openai-docs');
assert.strictEqual(result.projects[0].name, 'usage-project');
assert.strictEqual(result.projects[0].sessions, 1);
assert.strictEqual(result.projects[0].messages, 2);
assert.strictEqual(result.projects[0].mcpCalls, 2);
assert.strictEqual(result.recentSessions[0].projectName, 'usage-project');
assert.strictEqual(result.mcpRecentCalls[0].timestamp, '2026-07-28T02:00:00.000Z');
assert(result.trend.find((row) => row.date === '2026-07-28')?.mcpCalls === 2);
assert(result.trend.find((row) => row.date === '2026-07-28')?.projects === 1);
const serialized = JSON.stringify(result);
assert(!serialized.includes('secret-body'));
assert(!serialized.includes('secret-result'));
@@ -145,6 +154,7 @@ async function main() {
timeZone: 'UTC',
mcpToolLimit: 1,
skillLimit: 1,
projectLimit: 1,
mcpDetailLimit: 1,
});
assert.strictEqual(limited.coverage.distinctMcpTools, 2);
@@ -154,6 +164,9 @@ async function main() {
assert.strictEqual(limited.mcpTools[0].detailCallsReturned, 1);
assert.strictEqual(limited.coverage.distinctSkills, 1);
assert.strictEqual(limited.coverage.returnedSkills, 1);
assert.strictEqual(limited.coverage.distinctProjects, 1);
assert.strictEqual(limited.coverage.returnedProjects, 1);
assert.strictEqual(limited.projects.length, 1);
fixture.messages.push({ role: 'user', content: '增量消息', timestamp: '2026-07-30T04:00:00.000Z' });
writeSession(sessionsDir, fixture);