guanghulab/portrait/portrait-analyzer.js

84 lines
3.0 KiB
JavaScript
Raw Normal View History

const fs = require('fs');
const path = require('path');
function analyzeRhythm(syslogData) {
const { completed_items, total_items } = syslogData;
const ratio = completed_items / total_items;
if (ratio >= 0.9) return '快';
if (ratio >= 0.6) return '稳';
return '慢';
}
function analyzeFriction(syslogData) {
const frictionText = syslogData.friction_points || '';
if (frictionText.includes('无') || frictionText.length === 0) return '无';
if (frictionText.includes('小摩擦') || frictionText.length < 20) return '低';
if (frictionText.includes('报错') || frictionText.includes('卡住')) return '中';
if (frictionText.includes('阻塞') || frictionText.includes('无法')) return '高';
return '低';
}
function analyzeMood(syslogData) {
const feeling = syslogData.human_feeling || '';
const observation = syslogData.qiuqiu_observation || '';
if (feeling.includes('骄傲') || feeling.includes('开心') || feeling.includes('棒')) return '正向';
if (feeling.includes('累') || observation.includes('疲惫')) return '低落';
if (feeling.includes('还行') || feeling.length === 0) return '平稳';
return '平稳';
}
function analyzeGrowth(syslogData) {
const signals = [];
let count = 0;
if (syslogData.friction_points?.includes('自己修复')) {
signals.push('自主修复报错');
count++;
}
if (syslogData.code_lines > 100) {
signals.push('代码量增长');
count++;
}
if (syslogData.streak > 5) {
signals.push(`连胜${syslogData.streak}`);
count++;
}
if (syslogData.what_worked?.includes('自己')) {
signals.push('自主解决问题');
count++;
}
return { count, signals: signals.slice(0, 5) };
}
function analyzeWill(syslogData) {
const feeling = syslogData.human_feeling || '';
const status = syslogData.status || '';
if (feeling.includes('超级骄傲') || feeling.includes('兴奋')) return '强烈';
if (status === 'completed' && !feeling.includes('累')) return '正常';
if (feeling.includes('累') || feeling.includes('烦')) return '低落';
return '待观察';
}
function generateSnapshot(syslogData) {
return {
timestamp: new Date().toISOString(),
dev_id: syslogData.dev_id || 'DEV-004',
session_id: syslogData.session_id || 'UNKNOWN',
dev_name: syslogData.dev_name || '之之',
rhythm: analyzeRhythm(syslogData),
friction: analyzeFriction(syslogData),
mood: analyzeMood(syslogData),
growth: analyzeGrowth(syslogData),
will: analyzeWill(syslogData),
raw_stats: {
completed_items: syslogData.completed_items,
total_items: syslogData.total_items,
code_lines: syslogData.code_lines,
streak: syslogData.streak || 0
}
};
}
module.exports = {
analyzeRhythm, analyzeFriction, analyzeMood, analyzeGrowth, analyzeWill, generateSnapshot
};