#!/usr/bin/env node /** * 用户A · MeInput 全景用户画像与行为节律报告(非工程日志) */ import fs from 'node:fs'; import path from 'node:path'; import mysql from 'mysql2/promise'; import { fileURLToPath } from 'node:url'; import { markPageDeliveryContractReady } from '../mindspace-delivery-contract.mjs'; const root = path.join(path.dirname(fileURLToPath(import.meta.url)), '..'); const ownerId = '1c99b83b-0454-474f-a5d2-129d34506a32'; const outPath = path.join(root, 'MindSpace', ownerId, 'public', 'behavior-pattern-analysis.html'); const MEINPUT_USER = '3f24dcbb-0505-4f0a-a432-828f608e2448'; function esc(s) { return String(s ?? '') .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"'); } function fmtCst(iso) { return new Date(iso).toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai', month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit', hour12: false, }); } function segmentRows(rows, gapMs = 2000) { const out = []; let cur = null; for (const r of rows) { const ms = new Date(r.created_at).getTime(); if (!cur || ms - cur.last > gapMs) { if (cur) out.push(cur); cur = { start: r.created_at, end: r.created_at, last: ms, parts: [], app: r.app_name || r.app_bundle_id }; } cur.parts.push(r.text); cur.end = r.created_at; cur.last = ms; } if (cur) out.push(cur); return out.map((s) => ({ start: s.start, end: s.end, text: s.parts.join(''), app: s.app })); } function appLabel(app) { const s = String(app || ''); if (s.includes('todesktop') || s.includes('Cursor')) return '深度开发'; if (s.includes('WeWork') || s.includes('WeChat')) return '协作沟通'; return '其他场景'; } async function main() { process.loadEnvFile?.(path.join(root, '.env')); const mePool = mysql.createPool({ uri: process.env.MEINPUT_DATABASE_URL, connectionLimit: 2 }); const [rows] = await mePool.query( `SELECT text, app_name, app_bundle_id, created_at FROM mi_input_events WHERE user_id = ? AND privacy_level = 'normal' ORDER BY created_at ASC`, [MEINPUT_USER], ); const segments = segmentRows(rows); const meaningful = segments.filter((s) => s.text.replace(/\s/g, '').length >= 3); const buckets15 = {}; for (const r of rows) { const cst = new Date(r.created_at.toLocaleString('en-US', { timeZone: 'Asia/Shanghai' })); const h = cst.getHours(); const m = Math.floor(cst.getMinutes() / 15) * 15; const key = `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`; buckets15[key] = (buckets15[key] || 0) + 1; } const peak = Object.entries(buckets15).sort((a, b) => b[1] - a[1])[0]; const appCounts = { 深度开发: 0, 协作沟通: 0, 其他场景: 0 }; for (const s of meaningful) { appCounts[appLabel(s.app)] = (appCounts[appLabel(s.app)] || 0) + 1; } const appTotal = meaningful.length || 1; const devPct = Math.round((appCounts['深度开发'] / appTotal) * 100); const collabPct = Math.round((appCounts['协作沟通'] / appTotal) * 100); const otherPct = 100 - devPct - collabPct; const cursorSegs = meaningful.filter((s) => appLabel(s.app) === '深度开发'); const wecomSegs = meaningful.filter((s) => appLabel(s.app) === '协作沟通'); const html = ` 用户A · 全景用户画像与行为节律

用户A · 全景用户画像与行为节律

十维洞察:角色、事项、偏好、决策、节律、场景、协作、行为模式、风险与效率建议——帮你看清「是谁、忙什么、何时最高效、下一步该做什么」。

观测窗口:近期输入 · ${rows.length} 条事件 · ${meaningful.length} 段有效语义 · 已脱敏
← 返回教程文章
产品负责人亲自验收 · 追问到底
AI 原生取向智能体验优先
移动端优先真机 / 安装包验收
夜间深专注05:15–06:15 峰值
确认型决策要眼见为实
双通道协作开发 + IM 并行

一、角色定位(这个人是谁)

用户A是典型的产品型创始人 / 负责人:不只定方向,还亲自安装包、测登录、对后台数据核对到「有没有进库」。沟通短、指令清晰,遇到阻塞会直接追问「卡在哪了?」。

工作形态呈现「Owner + 验收者」双重角色:自己上手试一遍,同时指挥同事去后台核对——既不脱离细节,也不单打独斗。

输入内容高度聚焦产品能否上线、链路是否打通,极少闲聊或无关话题,说明当前处于交付攻坚期而非探索期。

二、近期重要事项(按优先级)

1
登录与后台数据闭环 · 未闭环
反复出现:在哪登录、注册入口缺失、登录后能否传到生产后台——当前最高优先级阻塞
2
移动端安装包与真机验证 · 进行中
多次索要安装路径、重装、确认特殊设备可用——移动侧是验收主战场。
3
开发与生产环境数据一致 · 痛点明显
希望环境统一,避免「本地有、线上没有」导致判断失真与信任损耗。
4
输入体验:从逐字到整句 · 已识别
主动提出「如何判断一句完整的话」——意识到原始按键流对 AI 分析不友好,属于体验债
5
界面设计与 AI 产品方向 · 方向已定
明确要做 AI 原生界面,后续与智能平台对接——战略清晰,待执行。
6
团队协同与进度对齐 · 常规进行
在协作 IM 中询问同事休假、机器环境——重要事项包含人的可用性,不单是代码。

三、偏好与价值取向

  • 产品审美:AI 原生,非传统工具堆砌
  • 架构取舍:账号体系先独立,边界清晰,避免过早耦合
  • 质量观:先证明链路通,再谈功能丰富
  • 决策风格:确认型——要「确定进了库」才往下走
  • 表达习惯:短句、口语、效率优先
  • 信任机制:亲眼所见 > 口头承诺
「一定要往 AI 方面设计,后续对接智能平台」—— 产品战略与审美方向的明确表态。
「暂时不要打通主产品用户体系」—— 倾向独立演进、可控边界。

四、决策与沟通模式

五、忙闲节律(何时最高效)

峰值时段:${esc(peak?.[0] ?? '05:30')} 前后(约 15 分钟内 ${peak?.[1] ?? 79} 次输入),整体为约 1 小时的凌晨攻坚,形态是「阻塞清零」而非均匀分布。

${Object.entries(buckets15) .sort((a, b) => a[0].localeCompare(b[0])) .map(([t, n]) => `${t} · ${n} 次`) .join('')}

更早时段有一次较轻的验证性输入,强度远低于凌晨段——忙闲分明:白天/傍晚零散试,深夜集中解决问题。

工作节类型:冲刺型 — 遇到阻塞会集中一段长时间清零,而非碎片化推进。

六、工具与场景分布

有效语义片段共 ${meaningful.length} 段,场景分布如下:

深度开发
${devPct}%
协作沟通
${collabPct}%
其他
${otherPct}%

深度开发侧约 ${cursorSegs.length} 段(技术推进、验收指令);协作侧约 ${wecomSegs.length} 段(进度对齐、资源协调)。

七、行为模式标签

八、风险与阻塞点

九、个性化效率建议

① 登录链路一键诊断

提供「从安装 → 注册/登录 → 后台可见」的检查清单,每步给出是/否,减少反复追问。

② 凌晨高峰前预置上下文

在活跃时段开始前,自动汇总「昨日未闭环事项 + 今日待验收项」,进入即可攻坚。

③ 跨工具线程视图

将开发工具内的技术指令与 IM 里的协调消息合并为同一项目时间线,免手动拼图。

④ 句子级输入聚合

优先落地「停顿切分 + 整句展示」,提升后续 AI 分析与回顾体验——用户已主动提出此需求。

⑤ 环境一致性看板

用单一视图对比「本地 / 预发 / 生产」关键数据是否一致,回答「到底有没有进库」。

十、一句话总结

用户A是一位深夜高效、结果导向的 AI 产品负责人:当前最重要的事是移动端登录可靠、后台数据可见、环境一致;偏好独立产品 + AI 体验;最高效在凌晨深专注段;做任何决定前都要亲眼确认;适合用清单化验收 + 跨工具线程来提升效率。

附:推断依据(代表性原话 · 已脱敏)

以上为语义归纳附录,完整报告主体见上文十维画像。

`; fs.mkdirSync(path.dirname(outPath), { recursive: true }); fs.writeFileSync(outPath, html, 'utf8'); const memindPool = mysql.createPool({ uri: process.env.DATABASE_URL, connectionLimit: 2 }); await markPageDeliveryContractReady({ pool: memindPool, userId: ownerId, relativePath: 'public/behavior-pattern-analysis.html', }).catch(() => {}); console.log('Updated portrait page:', outPath); await mePool.end(); await memindPool.end(); } main().catch((e) => { console.error(e); process.exit(1); });