{"id":48446930,"url":"https://github.com/wscats/who-is-actor","last_synced_at":"2026-04-06T18:04:26.579Z","repository":{"id":344201458,"uuid":"1180912295","full_name":"Wscats/who-is-actor","owner":"Wscats","description":"把摸鱼的同事揪出来🤪","archived":false,"fork":false,"pushed_at":"2026-03-30T23:52:46.000Z","size":582,"stargazers_count":24,"open_issues_count":0,"forks_count":8,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-31T01:31:01.366Z","etag":null,"topics":["agent","claw","clawhub","llm","openclaw","skills"],"latest_commit_sha":null,"homepage":"https://clawhub.ai/Wscats/who-is-actor","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Wscats.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-13T14:45:36.000Z","updated_at":"2026-03-30T11:06:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Wscats/who-is-actor","commit_stats":null,"previous_names":["wscats/who-is-actor"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Wscats/who-is-actor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wscats%2Fwho-is-actor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wscats%2Fwho-is-actor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wscats%2Fwho-is-actor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wscats%2Fwho-is-actor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Wscats","download_url":"https://codeload.github.com/Wscats/who-is-actor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wscats%2Fwho-is-actor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31483394,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","claw","clawhub","llm","openclaw","skills"],"created_at":"2026-04-06T18:04:02.164Z","updated_at":"2026-04-06T18:04:26.565Z","avatar_url":"https://github.com/Wscats.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# 一个零依赖、零脚本的开发者画像分析 Skill\n\n\u003e 你有没有想过，你的队友到底是在深夜灵感爆发，还是在白天假装忙碌？Git 记录里，藏着每个人的真实画像。\n\n## 怎么用？\n\n作为 Skill 插件，直接在对话中触发：\n\n```\n\"分析一下这个仓库每个人的研发效率\"\n\"帮我看看团队成员的工作习惯\"\n\"对比一下 Alice 和 Bob 的代码质量\"\n\"看看团队的参与度\"\n```\n\n支持的参数：\n\n| 参数 | 说明 | 默认值 |\n|------|------|--------|\n| `repo_path` | 仓库绝对路径 | **必填** |\n| `authors` | 指定分析的作者列表 | 全部贡献者 |\n| `since` | 开始日期（ISO 格式） | 仓库全部历史 |\n| `until` | 结束日期（ISO 格式） | 仓库全部历史 |\n| `branch` | 目标分支 | 当前活跃分支 |\n\n![](./image1.png)\n![](./image2.png)\n\n## 一切的起源：能不能不装东西？\n\n市面上的 Git 分析工具，要么让你装 Python 包，要么让你跑 Node 脚本，要么直接甩一个 Docker 镜像。我只是想看看谁在划水，结果光配环境就花了半小时。\n\n我心想：Git 本身就是最好的数据库啊。 `git log` 里有提交时间、作者、改动行数、文件列表、commit message……这些数据足够画出一个人的完整工作画像了。为什么非要装额外的东西？\n\n于是 who-is-actor 诞生了 —— 一个**零依赖、零脚本**的 Git 仓库开发者画像分析 Skill。它只用原生 `git` 命令和标准系统工具（`cut`、`sort`、`awk`、`grep` 等 —— 大多数系统已预装）采集数据（所有输入经过严格校验，不采集邮箱），然后交给 AI 来解读，生成一份毫不留情的六维度体检报告。\n\n\u003e **\"零依赖\"的意思是：** 不装 pip 包、不装 npm 模块、不跑自定义脚本。但它**需要**这些标准系统工具已在你的机器上：`git`、`cut`、`sort`、`uniq`、`awk`、`grep`、`sed`、`wc`、`head`（macOS / Linux 默认自带，Windows 请用 Git Bash 或 WSL）。\n\n## 它能看到什么？\n\n六个维度，把一个开发者扒得底朝天：\n\n| 维度 | 它在看什么 |\n|------|-----------|\n| 📝 **提交习惯** | 你一天提交几次？每次改多少行？commit message 是认真写的还是随便糊的？ |\n| ⏰ **工作习惯** | 你是早起鸟还是夜猫子？周末在不在偷偷加班？最长连续写了几天代码？ |\n| 🚀 **研发效率** | 你写的代码有多少后来又被删了？是不是在同一个文件上反复改来改去？ |\n| 🎨 **代码风格** | commit message 有没有遵循 Conventional Commits？有没有关联 Issue？ |\n| 🔍 **代码质量** | 修 bug 的提交占了多大比例？有没有动不动就甩一个巨型提交上来？ |\n| 📊 **参与度指数** | 综合以上五项，衡量在 Git 上可见的活跃参与程度（0-100）。 |\n\n## 扒出来的「真实画像」\n\n我用它分析了团队仓库，看到了一些很真实的画面：\n\n### 🌙 深夜战士\n\n```\nPeak Hour:        23:00\nWeekend Ratio:    78.6%\nLate Night Ratio: 57.1%\nChurn Rate:       43.7%\n```\n\n这位老兄几乎只在深夜和周末提交代码。你以为他在偷懒？不，他可能只是把白天留给了会议，然后在万籁俱寂的时候才能安静地写代码。\n\n但数据也暴露了一些问题：代码流失率 43.7%，意味着写下的代码有近一半后来又被删了。深夜写代码容易\"先写再想\"—— 写完不满意，推倒重来。这不一定是坏事，但如果长期如此，也许该看看白天的时间去哪了。\n\n### 📦 项目奠基人\n\n```\nTotal Lines Added:  84,224\nLarge Commit Ratio: 50.0%\nOwnership Ratio:    100.0%\nChurn Rate:         0.0%\n```\n\n单次提交平均两万行？别慌，这是做项目初始化和架构搭建的人。他拥有仓库中 100% 的文件所有权，写下的每一行代码都还活着。搞基建的人就是这样，一砖一瓦都是实打实的。\n\n### ⚡ 精准狙击手\n\n```\nWeekend Ratio:  66.7%\nChurn Rate:     3.8%\nRework Ratio:   7.7%\n```\n\n三分之二的提交在周末，但代码流失率只有 3.8%。这是一个想清楚再动手的人 —— 每次提交都目标明确，几乎不做无用功。如果深夜战士是\"先开枪再瞄准\"，这位就是\"瞄准了才开枪\"。\n\n### 👻 神秘闪现者\n\n```\nTotal Commits:  1\nActive Span:    1 day\n```\n\n只出现过一次，留下一个提交就消失了。但别小看这一个 commit —— 也许是修了一个关键 bug，也许是补上了一段缺失的文档。每个 commit 背后都是一个真实的人，在某个时刻打开了编辑器，读懂了代码，然后伸出了手。\n\n## 核心设计：零依赖怎么做到的？\n\n### 架构\n\n整个分析流程像一条极简流水线：\n\n```\n用户触发 → 确认参数 → 原生 git 命令采集数据 → AI 六维度分析 → 生成报告\n```\n\n没有 Python，没有 Node，没有 pip install，没有 npm install。所有数据采集仅靠这些命令：\n\n```bash\n# 贡献者概览（不采集邮箱）\ngit shortlog -sn --all\n\n# 提交时间分布（分析工作习惯）\ngit log --author=\"xxx\" --pretty=format:\"%aI\" | cut -c12-13 | sort | uniq -c\n\n# 增删行统计（分析研发效率）\ngit log --author=\"xxx\" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2 } END { printf \"added: %s, deleted: %s\\n\", add, subs }'\n\n# Bug Fix 检测（分析代码质量）\ngit log --author=\"xxx\" --grep=\"fix\\|bug\\|hotfix\" --oneline -i | wc -l\n\n# Conventional Commits 检测（分析代码风格）\ngit log --author=\"xxx\" --pretty=format:\"%s\" | grep -cE \"^(feat|fix|chore|docs|style|refactor|test|perf|ci|build)(\\(.+\\))?:\"\n```\n\nAI 拿到这些原始数据后，负责解读、计算指标、打分、生成点评。\n\n### 安全设计\n\n**命令白名单机制：** 本 Skill 仅允许执行预定义的 git 只读命令（ `git log` 、 `git shortlog` 、 `git diff --stat` 、 `git rev-parse` ），严禁任何写入操作（ `git push/commit/merge` ）、非 git 命令（ `curl/python/node` ）、文件写入（ `\u003e / \u003e\u003e` ）和网络操作（ `git fetch/pull/clone` ）。管道 `|` 仅允许连接 `cut` 、 `sort` 、 `uniq` 、 `awk` 、 `grep` 、 `wc` 、 `sed` 、 `head` 等只读文本处理工具。\n\n**输入校验：**\n\n所有用户输入在拼接到 shell 命令前，都必须通过严格的白名单校验：\n\n| 参数 | 校验规则 |\n|------|---------|\n| **仓库路径** | 必须是绝对路径，不含 `;`  `\\|`  `\u0026`  `$` ` ` ` ` ` 等危险字符，且通过 ` git rev-parse` 验证为合法仓库 |\n| **作者名** | 白名单： `^[a-zA-Z0-9 _.-]+$` （不含 `@` ，禁止邮箱输入），最长 128 字符 |\n| **日期** | 严格 ISO 格式： `^[0-9]{4}-[0-9]{2}-[0-9]{2}$` |\n| **分支名** | 白名单： `^[a-zA-Z0-9/_.-]+$` ，不含 `..` |\n\n校验失败的参数会被拒绝或降级处理，**绝不会未经验证直接执行**。\n\n**预览模式（Dry-Run）：** 首次使用时推荐说\"先列出要执行的命令，不要运行\"，代理会展示所有将要执行的命令供你审查，确认无误后再实际执行。\n\n**敏感数据保护：** 提交消息默认仅在本地进行统计处理（长度计算、关键词匹配），**完整的提交消息文本不会发送给 AI 模型**，只发送聚合后的指标。此外，所有文本在离开本地环境前会自动脱敏以下模式：API 密钥、令牌、AWS 密钥、私钥、数据库连接字符串等。详见 SKILL.md 中的\"Sensitive Data Filtering Rules\"。\n\n**仓库作用域限制：** 代理仅访问用户提供的特定仓库路径，不会遍历父目录或访问仓库以外的文件系统。\n\n**执行验证协议：** 由于本技能是纯指令型（无可执行代码），安全规则依赖代理正确执行。首次使用前，建议在测试仓库上运行验证：1) 使用 dry-run 确认所有命令在白名单内；2) 故意输入无效值（含 `;` 的路径、含 `@` 的作者名）验证拒绝行为；3) 确认代理只发送聚合指标而非原始提交消息。详见 SKILL.md 中的\"Enforcement Verification Protocol\"。\n\n此外，本工具**不采集开发者邮箱**，所有 git 命令仅使用作者名（ `%an` ）标识开发者。\n\n### 参与度指数怎么算的？\n\n综合五个信号，加权计算出 0-100 分（越低代表 Git 上可见的参与度越高）：\n\n| 信号 | 权重 | 逻辑 |\n|------|------|------|\n| 日均提交极低（\u003c0.3） | 25% | 活跃天数内产出过低 |\n| 活跃天数占比低（\u003c30%） | 20% | 时间跨度大但实际干活天数少 |\n| 代码净增长极低或为负 | 20% | 写的还没删的多 |\n| Commit message 敷衍（平均\u003c15字符） | 15% | 不认真对待提交记录 |\n| 高流失率 + 高返工率 | 20% | 大量无效劳动 |\n\n等级对照表：\n\n| 分数 | 等级 | 建议 |\n|------|------|------|\n| 0-20 | 🏆 高度活跃 | 建议关注是否过劳 |\n| 21-40 | 💪 稳定参与 | 持续输出，继续保持 |\n| 41-60 | 😐 中等参与 | 有提升空间 |\n| 61-80 | 🤔 低参与度 | 建议了解是否有非代码贡献未被记录 |\n| 81-100 | ❓ 极低参与度 | 建议与当事人沟通了解全貌 |\n\n\u003e **重要提示：** 此指数仅基于 Git 提交记录计算，无法反映代码评审、架构设计、技术讨论、团队指导等不产生提交记录的工作。高分不等于\"不努力\"，低分也不等于\"高效\"。\n\n\u003e **⚠️ 用途限制：** 此指数仅供团队协作模式参考，**严禁直接用于绩效考核、裁员决策、薪酬调整等人事决定。**\n\n### 综合评分的加权公式\n\n```\n综合评分 = 提交习惯 × 15% + 工作习惯 × 15% + 研发效率 × 25%\n         + 代码风格 × 15% + 代码质量 × 20% + (100 - 参与度指数) / 10 × 10%\n```\n\n研发效率权重最高（25%），因为写出有效代码才是硬道理。代码质量其次（20%），因为写得快但 bug 多等于白写。\n\n## 生成的报告长什么样？\n\n### 总览表\n\n| 开发者 | 提交数 | 增/删行数 | 日均提交 | 周末% | 深夜% | Bug Fix% | 流失率 | 参与度 | 综合评分 |\n|--------|--------|-----------|----------|-------|-------|----------|--------|---------|----------|\n| Alice | 142 | +8, 230 / -2, 103 | 2.1 | 12.0% | 8.5% | 7.0% | 25.6% | 22 | 8.1 |\n| Bob | 67 | +15, 440 / -890 | 0.8 | 55.2% | 42.0% | 3.0% | 5.8% | 45 | 6.3 |\n| Carol | 4 | +84, 224 / -0 | 2.0 | 25.0% | 0.0% | 0.0% | 0.0% | 38 | 7.0 |\n\n### 每个人的画像\n\n每位开发者会拿到：\n1. **数据仪表盘** — 六维度关键指标一目了然\n2. **AI 点评** — 严肃、直接，好就是好，差就是差\n3. **改进建议** — 针对缺点给出具体可执行的建议\n4. **六维雷达评分** — 各维度 1-10 分\n5. **一句话总结** — 一句犀利的话概括此人\n\n## 写在最后：数据不是审判\n\n必须坦诚地说：**这个工具不是用来搞绩效考核的。**\n\n那个凌晨三点提交代码的同事，也许比任何人都更热爱这个项目；那个 commit message 只写 \"fix\" 的人，也许正在争分夺秒地修复一个线上事故；那个只贡献了一个提交的人，也许是花了整整一周才理解了代码才敢动手。\n\n参与度指数高分的人，可能只是在做那些 Git 记录不了的事 —— 设计方案、技术评审、帮新人答疑、在白板前画了一下午的架构图。\n\n写这个工具的初心，是想透过冰冷的 Git 记录，看到背后一个个**真实的、有温度的人**。看到他们的工作节奏，理解他们的习惯，在必要时帮助他们 —— 比如发现某人连续深夜加班，也许该找他聊聊是不是遇到了什么困难。\n\n代码会说话，但只有用心听，才能听到正确的答案。\n\n---\n\n*技术栈：原生 Git + AI —— 就这么简单*\n\n*开源协议：MIT —— 拿去用，拿去看看你的团队*\n\n*⚠️ 参与度指数仅基于 Git 提交数据，不反映非代码贡献，请勿作为绩效考核的唯一依据*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwscats%2Fwho-is-actor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwscats%2Fwho-is-actor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwscats%2Fwho-is-actor/lists"}