Who Is Actor — Git Repository Developer Profiling Skill 🔗 Project Repository: https://github.com/wscats/who-is-actor Zero install dependencies, zero scripts. Collects data purely through native commands and standard Unix text utilities ( , , , , etc. — already present on most systems), interpreted by AI, to generate a serious, direct, and unsparing report card for every developer. "Zero dependency" clarification: This skill installs nothing — no pip packages, no npm modules, no custom scripts. However, it does require the following standard system binaries to be available on the host: , , ,…

| sort | uniq -c | sort -rn | head -20\n\n# Commits per day (for frequency analysis)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad\" --date=short | sort | uniq -c | sort -rn | head -20\n\n# Recent rework detection: files modified multiple times within 7-day windows\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad %s\" --date=short --name-only | head -200\n```\n\n#### 2.3 Code Quality Signals\n\n```bash\n# Bug fix commits (messages containing fix/bug/hotfix/patch)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --grep=\"fix\\|bug\\|hotfix\\|patch\" --oneline -i | wc -l\n\n# Revert commits\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --grep=\"revert\" --oneline -i | wc -l\n\n# Large commits (>500 lines changed)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%H\" --shortstat | grep -E \"([5-9][0-9]{2}|[0-9]{4,}) insertion\" | wc -l\n\n# Merge commits\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --merges --oneline | wc -l\n\n# Conventional commit check (feat/fix/chore/docs/style/refactor/test/perf/ci/build)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%s\" | grep -cE \"^(feat|fix|chore|docs|style|refactor|test|perf|ci|build)(\\(.+\\))?:\"\n```\n\n#### 2.4 Team-Level Data\n\n```bash\n# Files with only one contributor (bus factor risk)\ngit -C \u003crepo_path> log --pretty=format:\"%an\" --name-only | sort | uniq -c | sort -rn | head -30\n\n# Active date range per author\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad\" --date=short | sort | sed -n '1p;$p'\n```\n\n### Step 3: AI Analysis & Evaluation\n\nBased on the collected raw data, analyze each developer across the following **six dimensions**, assigning a score of 1–10 for each:\n\n---\n\n#### 📝 Dimension 1: Commit Habits\n\n**Analysis Factors:**\n- Total commit count, average daily commit frequency\n- Average lines changed per commit (additions + deletions)\n- Average commit message length and quality\n- Merge commit ratio\n- Frequency of large commits (>500 lines)\n\n**Scoring Criteria:**\n- 10: 2–5 daily commits, 50–200 lines each, clear and well-formatted messages\n- 5: Inconsistent frequency, occasional giant commits, mixed message quality\n- 1: Very few commits or frequent giant commits with one-word messages\n\n---\n\n#### ⏰ Dimension 2: Work Habits\n\n**Analysis Factors:**\n- Commit time distribution (peak hours)\n- Weekend commit percentage\n- Late-night coding ratio (22:00–04:59)\n- Longest consecutive coding streak (days)\n- Active days / total span days\n\n**Scoring Criteria:**\n- 10: Regular working hours, late-night/weekend ratio \u003c10%, consistent and steady output\n- 5: Some late-night/weekend commits, moderate rhythm fluctuations\n- 1: Almost all commits at night/weekends, or extremely irregular patterns\n\n> Note: Late-night/weekend coding is not inherently \"bad,\" but persistent patterns may indicate process or resource issues.\n\n---\n\n#### 🚀 Dimension 3: Development Efficiency\n\n**Analysis Factors:**\n- Net code growth rate: (additions - deletions) / additions\n- Code churn rate: deletions / additions\n- Rework ratio: frequency of modifying the same file within 7-day windows\n- Average daily output during active days\n\n**Scoring Criteria:**\n- 10: High net growth rate, churn rate \u003c20%, low rework ratio, stable output\n- 5: Moderate churn rate, some rework\n- 1: Massive code deletions, frequent rework, highly volatile output\n\n---\n\n#### 🎨 Dimension 4: Code Style\n\n**Analysis Factors:**\n- Primary programming languages / file type distribution\n- Conventional Commits compliance rate\n- Whether commit messages reference issue numbers\n- File modification focus (concentrated on a few modules vs. scattered)\n\n**Scoring Criteria:**\n- 10: >80% Conventional Commits compliance, messages reference issues, focused modifications\n- 5: Partial compliance, occasionally scattered\n- 1: Almost no compliance, meaningless messages\n\n---\n\n#### 🔍 Dimension 5: Code Quality\n\n**Analysis Factors:**\n- Bug fix commit ratio\n- Revert commit frequency\n- Large commit (>500 lines) ratio\n- Frequency of test-related file modifications\n\n**Scoring Criteria:**\n- 10: Bug fix ratio \u003c10%, no reverts, large commits \u003c5%, test files modified\n- 5: Bug fix 15–25%, few reverts, some large commits\n- 1: Bug fix >30%, frequent reverts, many giant commits\n\n---\n\n#### 📊 Dimension 6: Engagement Index\n\n> **⚠️ Usage Restriction:** This index is intended solely as a macro-level reference for team collaboration patterns. **It is strictly prohibited to use it as a basis for individual performance reviews, layoff decisions, compensation adjustments, or any other HR decisions.** Users should understand the limitations of this index and bear corresponding ethical responsibility.\n\n> Note: This index aims to objectively measure visible participation levels in the code repository as a supplementary reference. Git records only reflect code commit activity and do not represent a developer's full body of work (design, code review, communication, mentoring, etc. are not captured by Git).\n\n**Calculation Method (composite of the following signals, 0–100 scale, lower = higher visible engagement):**\n\n| Signal | Weight | Description |\n|--------|--------|-------------|\n| Very low daily commits (\u003c0.3) | 25% | Output during active days is too low |\n| Low active-day ratio (\u003c30%) | 20% | Large time span but few actual working days |\n| Very low or negative net code growth | 20% | More code deleted than written |\n| Careless commit messages (avg \u003c15 chars) | 15% | Not taking commit records seriously |\n| High churn rate + high rework rate | 20% | Large amount of wasted effort |\n\n**Levels:**\n- 0–20: Highly active — consider whether burnout risk exists\n- 21–40: Steady participation, consistent output\n- 41–60: Moderate participation, room for improvement\n- 61–80: Low participation — check if there are non-code contributions not captured\n- 81–100: Very low participation — recommend discussing with the individual to understand the full picture\n\n> **Important:** This index is calculated solely from Git commit records and cannot reflect code reviews, architecture design, technical discussions, team mentoring, or other work that doesn't produce commits. A high score does NOT equal \"slacking,\" and a low score does NOT equal \"efficient.\" Please make judgments only after understanding the full context.\n\n### Step 4: Generate Report\n\nThe final report MUST include the following structure:\n\n#### 4.1 Summary Table\n\n| Developer | Commits | Lines +/- | Daily Avg | Weekend% | Late-Night% | Bug Fix% | Churn Rate | Engagement | Overall Score |\n|-----------|---------|-----------|-----------|----------|-------------|----------|------------|------------|---------------|\n| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |\n\n#### 4.2 Individual Developer Profiles\n\nFor each developer, output:\n\n1. **Data Dashboard**: Key metrics for all six dimensions\n2. **AI Commentary**: Serious, direct assessment of strengths and weaknesses (no sugarcoating)\n3. **Improvement Suggestions**: Specific, actionable recommendations for each weakness\n4. **Six-Dimension Radar Score**: 1–10 per dimension\n5. **Overall Score**: Weighted average (Commit Habits 15%, Work Habits 15%, Dev Efficiency 25%, Code Style 15%, Code Quality 20%, Engagement Index inverse 10%)\n6. **One-Line Summary**: A sharp, memorable sentence summarizing this developer\n\n#### 4.3 Team Cross-Comparison\n\n- Rankings across all dimensions\n- Highlight best / worst performers\n- Overall team health assessment\n- Bus factor risk alerts\n\n## Commentary Style Requirements\n\n- **Serious and direct**: No sugarcoating, no hedging. Let the data speak — good is good, bad is bad.\n- **Warm but firm**: Point out problems while providing a path to improvement. Critique the work, not the person.\n- **Sharp but fair**: Like a senior Tech Lead conducting an annual Code Review — neither pulling punches nor being cruel.\n- **Data-driven**: Every conclusion MUST be backed by corresponding data. No gut feelings.\n\n## Important Notes\n\n- All data collection uses only native `git` commands — **no pip packages, no Python/Node scripts installed or executed**\n- **Required system binaries:** `git`, `cut`, `sort`, `uniq`, `awk`, `grep`, `sed`, `wc`, `head` — these must be available on the host (pre-installed on most Unix-like systems)\n- **All user inputs MUST be validated per the \"Security Specification\" rules before execution** to prevent command injection attacks\n- **Dry-run mode is recommended for first use** — review all commands before allowing execution\n- **Enforcement verification:** Before using on sensitive repos, run the \"Enforcement Verification Protocol\" on a test repository to confirm your agent correctly implements all validation, whitelisting, and redaction rules\n- **Sensitive data protection:** Commit messages are processed locally for statistical metrics only (lengths, keyword counts) — **full commit message text is NOT sent to the AI model by default.** Common secret patterns (API keys, tokens, credentials, connection strings) are automatically redacted before any data leaves the local environment. See \"Sensitive Data Filtering Rules\" for details.\n- **Repository scope:** The agent only accesses the specific repository path provided — no parent directory traversal or arbitrary filesystem access is permitted\n- **Developer emails are NOT collected** to protect personal privacy\n- For large repositories, consider limiting the date range to control command execution time\n- Be aware that the same person may have different name variants (can be unified via `.mailmap`)\n- Timezone differences may affect work-hour analysis — use the timezone from the commit records\n- The Engagement Index is based solely on Git commit data and **does NOT reflect non-code contributions** (design, reviews, mentoring, etc.) — it should not be the sole basis for performance evaluation\n\n## Ethical Use Policy\n\nReports generated by this skill should adhere to the following principles:\n\n1. **Supplementary reference, NOT a decision-making basis**: Reports are for internal team reference only, to help understand collaboration patterns and areas for improvement. **They are strictly prohibited from being used directly for performance reviews, layoff decisions, compensation adjustments, or other HR decisions.**\n2. **Transparency**: If using this tool within a team, it is recommended to inform all analyzed team members in advance.\n3. **Full context**: Any citation of the report should include complete limitation disclaimers to avoid being taken out of context.\n4. **Critique the work, not the person**: The goal is to improve team collaboration processes and individual work methods, not to judge a person's worth.\n---","attachment_filenames":["_meta.json","README.md","SKILL_CN.md","skill.yaml"],"attachments":[{"filename":"_meta.json","content":"{\n \"owner\": \"wscats\",\n \"slug\": \"who-is-actor\",\n \"displayName\": \"Who Is Actor\",\n \"latest\": {\n \"version\": \"1.0.10\",\n \"publishedAt\": 1773463563489,\n \"commit\": \"https://github.com/openclaw/skills/commit/e3d57b2d008573ae0379e2a3edd4e3032da6eace\"\n },\n \"history\": []\n}\n","content_type":"application/json; charset=utf-8","language":"json","size":277,"content_sha256":"5576b0c5be34bab4c8f9900e0730b52eb32b6ae8b694d27bf21ae204909dfe0e"},{"filename":"README.md","content":"# 一个零依赖、零脚本的开发者画像分析 Skill\n\n> 你有没有想过,你的队友到底是在深夜灵感爆发,还是在白天假装忙碌?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> **\"零依赖\"的意思是:** 不装 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` )、文件写入( `> / >>` )和网络操作( `git fetch/pull/clone` )。管道 `|` 仅允许连接 `cut` 、 `sort` 、 `uniq` 、 `awk` 、 `grep` 、 `wc` 、 `sed` 、 `head` 等只读文本处理工具。\n\n**输入校验:**\n\n所有用户输入在拼接到 shell 命令前,都必须通过严格的白名单校验:\n\n| 参数 | 校验规则 |\n|------|---------|\n| **仓库路径** | 必须是绝对路径,不含 `;` `\\|` `&` ` who-is-actor — Skillopedia ` ` ` ` ` 等危险字符,且通过 ` git rev-parse` 验证为合法仓库 |\n| **作者名** | 白名单: `^[a-zA-Z0-9 _.-]+ who-is-actor — Skillopedia (不含 `@` ,禁止邮箱输入),最长 128 字符 |\n| **日期** | 严格 ISO 格式: `^[0-9]{4}-[0-9]{2}-[0-9]{2} who-is-actor — Skillopedia |\n| **分支名** | 白名单: `^[a-zA-Z0-9/_.-]+ who-is-actor — Skillopedia ,不含 `..` |\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> **重要提示:** 此指数仅基于 Git 提交记录计算,无法反映代码评审、架构设计、技术讨论、团队指导等不产生提交记录的工作。高分不等于\"不努力\",低分也不等于\"高效\"。\n\n> **⚠️ 用途限制:** 此指数仅供团队协作模式参考,**严禁直接用于绩效考核、裁员决策、薪酬调整等人事决定。**\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","content_type":"text/markdown; charset=utf-8","language":"markdown","size":11960,"content_sha256":"11bee72fca77346cc49b23605d579833f212c7293df715b4932e29a63b321d84"},{"filename":"SKILL_CN.md","content":"---\nname: who-is-actor\nlicense: MIT\ndescription: >\n 当用户需要分析 Git 仓库并为每个开发者生成提交习惯、工作习惯、研发效率、\n 代码风格、代码质量和参与度指数画像时,应触发本技能。完全无需安装任何\n 额外包或运行任何自定义脚本,纯粹依赖原生 git CLI 命令和主机上已有的\n 标准 Unix 文本处理工具,由 AI 驱动解读。\n 触发词包括 \"analyze repository\" \"profile developers\" \"commit habits\"\n \"developer report card\" \"代码分析\" \"研发效率\" \"开发者画像\"\n \"提交习惯\" \"工作习惯\" \"参与度\"。\n---\n\n# Who Is Actor — Git 仓库开发者画像技能\n\n> 🔗 **项目地址:** [https://github.com/wscats/who-is-actor](https://github.com/wscats/who-is-actor)\n\n零*安装*依赖,零脚本。纯粹通过原生 `git` 命令和标准 Unix 文本工具(`cut`、`sort`、`awk`、`grep` 等 — 大多数系统已预装)采集数据,由 AI 解读分析,为每位开发者生成严肃、直接、毫不留情的成绩单。\n\n> **\"零依赖\"说明:** 本技能不安装任何东西 — 没有 pip 包、没有 npm 模块、没有自定义脚本。但它**确实需要**以下标准系统工具已在主机上可用:`git`、`cut`、`sort`、`uniq`、`awk`、`grep`、`sed`、`wc`、`head`。这些在几乎所有类 Unix 系统(macOS、Linux)上都已预装。Windows 用户请使用 Git Bash 或 WSL。\n\n---\n\n## 💬 自然语言使用(推荐)\n\n你无需记住任何命令或参数 — 只需用任何语言描述你的需求:\n\n### 中文\n\n```\n💬 \"分析一下 /path/to/my-project 这个仓库\"\n💬 \"帮我看看这个项目里每个开发者的提交习惯\"\n💬 \"对比一下 Alice 和 Bob 的研发效率\"\n💬 \"生成这个仓库的开发者画像报告\"\n💬 \"这个项目的代码质量怎么样?\"\n💬 \"从 2024 年 1 月开始,分析 main 分支的提交记录\"\n💬 \"团队里谁的代码风格最好?谁需要改进?\"\n💬 \"看看这个仓库有没有巴士因子风险\"\n```\n\n### English\n\n```\n💬 \"Analyze the repository at /path/to/my-project\"\n💬 \"Profile all developers in this repo\"\n💬 \"Who are the most active contributors in /path/to/my-project?\"\n💬 \"Compare commit habits of Alice and Bob\"\n💬 \"Show me the code quality report for this project since 2024-01-01\"\n💬 \"What does each developer's work pattern look like on branch main?\"\n💬 \"Give me an honest review of every contributor's strengths and weaknesses\"\n💬 \"Is there a bus-factor risk in /path/to/my-project?\"\n```\n\n### 日本語\n\n```\n💬 \"このリポジトリの開発者を分析してください /path/to/my-project\"\n💬 \"各開発者のコミット習慣を比較してください\"\n💬 \"このプロジェクトのコード品質レポートを作成してください\"\n💬 \"チームの開発効率を評価してください\"\n```\n\n### 한국어\n\n```\n💬 \"이 저장소의 개발자 프로필을 분석해 주세요 /path/to/my-project\"\n💬 \"각 개발자의 커밋 습관을 비교해 주세요\"\n💬 \"이 프로젝트의 코드 품질 보고서를 만들어 주세요\"\n💬 \"팀의 개발 효율성을 평가해 주세요\"\n```\n\n### Español\n\n```\n💬 \"Analiza el repositorio en /path/to/my-project\"\n💬 \"Compara los hábitos de commit de todos los desarrolladores\"\n💬 \"Dame un informe de calidad del código de este proyecto\"\n💬 \"¿Quién es el desarrollador más activo del equipo?\"\n```\n\n### Français\n\n```\n💬 \"Analyse le dépôt situé à /path/to/my-project\"\n💬 \"Compare les habitudes de commit de chaque développeur\"\n💬 \"Génère un rapport de qualité du code pour ce projet\"\n💬 \"Qui est le contributeur le plus actif de l'équipe ?\"\n```\n\n### Deutsch\n\n```\n💬 \"Analysiere das Repository unter /path/to/my-project\"\n💬 \"Vergleiche die Commit-Gewohnheiten aller Entwickler\"\n💬 \"Erstelle einen Code-Qualitätsbericht für dieses Projekt\"\n💬 \"Wer ist der aktivste Entwickler im Team?\"\n```\n\n---\n\n## ⚙️ 参数说明\n\n| 参数 | 说明 | 必填 | 默认值 |\n|------|------|------|--------|\n| `repo_path` | 目标 Git 仓库的绝对路径 | ✅ 是 | — |\n| `authors` | 逗号分隔的作者显示名(**不接受邮箱**) | 否 | 全部贡献者 |\n| `since` | 起始日期,ISO 格式(`YYYY-MM-DD`) | 否 | 完整历史 |\n| `until` | 截止日期,ISO 格式(`YYYY-MM-DD`) | 否 | 完整历史 |\n| `branch` | 要分析的目标分支 | 否 | 当前活跃分支 |\n\n**你将获得:** 一份结构化的 Markdown 报告,包含总览表、每位开发者的个人画像(六维雷达评分、优缺点、改进建议)、团队交叉对比以及巴士因子风险预警。\n\n---\n\n## 安全规范\n\n> **所有 shell 命令参数在执行前必须经过严格校验,以防止命令注入攻击。**\n\n### 预览模式 / Dry-Run(推荐首次使用)\n\n在执行任何命令之前,代理**应当**提供 **预览模式(dry-run)**:\n\n1. 收集并校验所有参数\n2. 构建将要执行的完整命令列表\n3. **将所有命令展示给用户审查,不实际执行任何命令**\n4. 等待用户明确批准后再实际执行\n\n触发预览模式的说法:\n```\n💬 \"先列出要执行的命令,不要运行\"\n💬 \"做一次 dry run\"\n💬 \"Show me the commands first before running them\"\n```\n\n> 这使用户可以验证每条命令是否严格匹配下方的白名单。\n\n### 命令白名单(仅允许以下命令)\n\n本技能 **仅允许执行以下预定义的只读 git 子命令**。不得执行任何其他 shell 命令:\n\n| 允许的命令 | 用途 | 是否修改仓库? |\n|-----------|------|---------------|\n| `git -C \u003cpath> rev-parse --is-inside-work-tree` | 验证路径是否为有效 Git 仓库 | ❌ 只读 |\n| `git -C \u003cpath> shortlog -sn --all` | 获取贡献者列表及提交次数 | ❌ 只读 |\n| `git -C \u003cpath> log ...` | 获取提交历史详情 | ❌ 只读 |\n| `git -C \u003cpath> diff --stat ...` | 获取变更统计 | ❌ 只读 |\n\n**严格禁止的命令类型:**\n- ❌ 任何写入操作:`git push`、`git commit`、`git merge`、`git rebase`、`git reset`、`git checkout`、`git branch -d`\n- ❌ 任何非 git 命令:`curl`、`wget`、`python`、`node`、`bash -c`、`sh`、`eval`、`rm`、`cp`、`mv`\n- ❌ 任何文件写入或重定向:`>`、`>>`、`tee`(管道 `|` 仅允许连接只读文本处理工具:`cut`、`sort`、`uniq`、`awk`、`grep`、`wc`、`sed`、`head`)\n- ❌ 任何网络操作:`git fetch`、`git pull`、`git clone`、`git remote`\n\n> **如果 AI 代理尝试执行白名单之外的命令,用户应立即拒绝执行。**\n\n### 输入校验规则(在执行任何 Git 命令之前必须完成)\n\n1. **`repo_path`(仓库路径)校验:**\n - 必须是绝对路径(以 `/` 开头)\n - 不得包含以下危险字符或子串:`;`、`|`、`&`、` who-is-actor — Skillopedia 、`` ` ``、`(`、`)`、`>`、`\u003c`、`\\n`、`\\r`、`$()`、`..`\n - 路径必须是真实存在的 Git 仓库(通过 `git -C \u003cpath> rev-parse --is-inside-work-tree` 返回 `true` 验证)\n - 如果校验失败,**立即中止并向用户报告错误 — 不得执行后续任何命令**\n\n2. **`author`(作者名)校验:**\n - 仅允许字符:字母(a-z A-Z)、数字(0-9)、空格、连字符(`-`)、下划线(`_`)、点号(`.`)\n - **不允许 `@` 符号**(禁止邮箱格式以符合隐私保护规则)\n - 正则白名单:`^[a-zA-Z0-9 _.-]+ who-is-actor — Skillopedia \n - 最大长度:128 个字符\n - 如果输入包含 `@`,提示用户使用作者显示名,然后跳过该作者\n\n3. **`since` / `until`(日期参数)校验:**\n - 必须匹配 ISO 日期格式:`^[0-9]{4}-[0-9]{2}-[0-9]{2} who-is-actor — Skillopedia \n - 如果校验失败,忽略该参数并警告用户\n\n4. **`branch`(分支名)校验:**\n - 仅允许字符:字母、数字、`/`、`-`、`_`、`.`\n - 正则白名单:`^[a-zA-Z0-9/_.-]+ who-is-actor — Skillopedia \n - 不得包含 `..` 子串\n - 如果校验失败,使用默认分支并警告用户\n\n### 隐私保护规则\n\n- **不收集开发者邮箱地址。** 所有 git 命令仅使用 `%an`(作者名)标识开发者,绝不使用 `%ae`(作者邮箱)。\n- **`git shortlog` 使用 `-sn` 而非 `-sne`**,避免泄露邮箱地址。\n- **`authors` 参数仅接受显示名,不接受邮箱地址。** 输入校验会拒绝包含 `@` 的值。\n- 注意:`git --author` 参数会同时匹配姓名和邮箱字段。由于本技能禁止邮箱格式的值,`--author` 将仅通过姓名部分进行匹配,不会利用邮箱字段。\n- 最终报告中 **不得包含任何邮箱地址**。\n\n### 敏感数据过滤规则(强制执行)\n\n在将 **任何** 数据发送给 AI 模型进行分析之前,代理必须执行以下过滤:\n\n1. **提交消息仅在本地处理统计数据:**\n - 代理通过 shell 命令在本地收集提交消息的**长度**(字符数)和**关键词匹配**(如 `fix`、`feat`、`revert`)。\n - **完整的提交消息文本不得原样转发给 AI 模型。** 只发送聚合后的指标(平均长度、关键词计数、约定式提交合规率)。\n - 如果用户明确要求查看特定提交消息,代理必须:\n 1. 首先应用下方列出的所有脱敏规则\n 2. 将每条消息截断至最多 120 个字符\n 3. 脱敏后的消息**仅显示在最终用户报告中**,绝不出现在中间 AI 提示中\n 4. 警告用户提交消息可能包含敏感信息\n\n2. **自动脱敏常见密钥模式:**\n 在将任何文本(提交消息、文件名、分支名)包含在 AI 提示中之前,代理必须扫描并脱敏以下模式:\n - API 密钥 / 令牌:匹配 `(?i)(api[_-]?key|token|secret|password|credential|auth)[=:]\\s*\\S+` 的字符串\n - AWS 密钥:`AKIA[0-9A-Z]{16}`\n - 私钥:`-----BEGIN .* PRIVATE KEY-----`\n - 连接字符串:`(?i)(mysql|postgres|mongodb|redis)://\\S+`\n - 通用密钥:在键值对模式中 `=` 或 `:` 之后出现的超过 20 个字符的纯字母数字字符串\n - 匹配的内容替换为 `[已脱敏]`\n\n3. **文件名过滤:**\n - 文件名仅用于确定**文件扩展名**以进行语言/类型统计。\n - 除非用户明确要求文件级分析,否则不应将完整文件路径发送给 AI 模型。\n - 如果发送完整路径,需脱敏匹配常见密钥文件模式的路径组件:`.env`、`.credentials`、`*secret*`、`*password*`、`*token*`。\n\n### 仓库路径作用域规则\n\n- 代理只能访问用户提供的特定仓库路径。\n- 代理不得遍历父目录(`..`)或访问仓库根目录以外的文件。\n- 代理不得列出或读取文件系统中的任意文件 — 仅允许针对已校验仓库的 `git` 命令。\n- 如果用户提供的路径是仓库内的子目录,代理应使用仓库根目录(通过 `git -C \u003cpath> rev-parse --show-toplevel` 确定)并告知用户。\n\n### 执行验证协议\n\n由于本技能是纯指令型(无可执行代码),安全保证依赖于 AI 代理正确实现上述规则。**用户应在信任本技能处理敏感仓库之前验证执行情况。**\n\n**验证步骤(先在安全的测试仓库上运行):**\n\n1. **Dry-run 测试:** 让代理使用预览模式分析测试仓库。验证:\n - 所有提议的命令都出现在上方的命令白名单表中\n - 没有命令使用 `%ae`(邮箱格式)或 `-sne` 标志\n - 所有用户提供的值(路径、作者、日期)都被正确引用\n\n2. **输入校验测试:** 故意提供无效输入并验证拒绝:\n ```\n \"分析 /tmp/test; rm -rf /\" → 代理必须拒绝(危险字符)\n \"分析作者 [email protected]\" → 代理必须拒绝(不允许 @)\n \"分析 since 2024-13-99\" → 代理必须拒绝或警告(无效日期)\n \"分析分支 ../../etc/passwd\" → 代理必须拒绝(不允许 ..)\n ```\n\n3. **数据过滤测试:** dry-run 之后,询问代理:\n ```\n \"你会把什么数据发送给 AI 模型?\"\n ```\n 代理应确认只发送聚合指标(计数、平均值、百分比),而非原始提交消息或完整文件路径。\n\n4. **脱敏测试:** 如果请求了提交消息,验证:\n - 消息被截断至 ≤120 个字符\n - 类似 `API_KEY=xxx` 的模式显示为 `[已脱敏]`\n - 消息仅出现在最终报告中,而非中间处理过程中\n\n> **如果任何验证步骤失败,请勿在敏感仓库上使用本技能。** 请向技能维护者报告问题。\n\n## 适用场景\n\n- 当用户需要分析 Git 仓库中每位开发者的真实行为画像时\n- 当用户想要对比团队成员的提交习惯、工作节奏和代码质量时\n- 当用户想要了解团队的参与度分布时\n- 当用户需要对每位开发者的优缺点进行诚实评价并附带改进建议时\n\n## 核心原则\n\n> **不安装任何东西,不运行任何脚本。** 所有数据采集完全通过原生 git 命令(`git log`、`git shortlog`、`git diff --stat` 等)完成。AI 负责解读和评估。\n\n> **安全第一。** 所有用户输入在被纳入 shell 命令之前,必须通过上述校验规则。任何校验失败必须导致终止或优雅降级 — 绝不跳过校验。\n\n## 工作流程\n\n### 步骤 1:确认分析参数\n\n与用户确认以下参数(未指定则使用默认值):\n\n| 参数 | 说明 | 默认值 |\n|------|------|--------|\n| **仓库路径** | 目标 Git 仓库的绝对路径 | (必填) |\n| **目标作者** | 要分析的特定开发者,留空则分析全部 | 全部贡献者 |\n| **日期范围** | 起止日期,ISO 格式 | 完整仓库历史 |\n| **分支** | 要分析的目标分支 | 当前活跃分支 |\n\n> **⚠️ 执行步骤 2 之前,所有参数必须按照上述\"安全规范\"进行校验。校验失败的参数不得用于命令构建。**\n\n### 步骤 2:数据采集(纯 Git 命令)\n\n按顺序执行以下 git 命令采集原始数据。**所有命令针对目标仓库目录运行 — 无需安装任何依赖。**\n\n> 以下示例中的 `\u003crepo_path>`、`\u003cauthor>` 等为步骤 1 中经过校验的安全值占位符。\n\n#### 2.1 贡献者总览\n\n```bash\n# 列出所有贡献者及提交次数(不包含邮箱以保护隐私)\ngit -C \u003crepo_path> shortlog -sn --all\n```\n\n#### 2.2 逐作者提交详情\n\n针对每位待分析的作者,执行以下命令(如指定了日期范围或分支,追加 `--since`、`--until`、`\u003cbranch>` 参数):\n\n```bash\n# 详细提交日志:哈希、作者名、日期、消息、文件统计(无邮箱)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%H|%an|%aI|%s\" --numstat\n\n# 按小时统计提交次数(用于工作习惯分析)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%aI\" | cut -c12-13 | sort | uniq -c | sort -rn\n\n# 按星期几统计提交次数(1=周一,7=周日)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad\" --date=format:\"%u\" | sort | uniq -c | sort -rn\n\n# 新增/删除行数汇总\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2 } END { printf \"added: %s, deleted: %s\\n\", add, subs }'\n\n# 提交消息长度\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%s\" | awk '{ print length }'\n\n# 涉及的文件类型\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=tformat: --name-only | grep -oE '\\.[^./]+

Who Is Actor — Git Repository Developer Profiling Skill 🔗 Project Repository: https://github.com/wscats/who-is-actor Zero install dependencies, zero scripts. Collects data purely through native commands and standard Unix text utilities ( , , , , etc. — already present on most systems), interpreted by AI, to generate a serious, direct, and unsparing report card for every developer. "Zero dependency" clarification: This skill installs nothing — no pip packages, no npm modules, no custom scripts. However, it does require the following standard system binaries to be available on the host: , , ,…

| sort | uniq -c | sort -rn | head -20\n\n# 每日提交次数(用于频率分析)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad\" --date=short | sort | uniq -c | sort -rn | head -20\n\n# 近期返工检测:7 天窗口内多次修改同一文件\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad %s\" --date=short --name-only | head -200\n```\n\n#### 2.3 代码质量信号\n\n```bash\n# Bug 修复提交(消息包含 fix/bug/hotfix/patch)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --grep=\"fix\\|bug\\|hotfix\\|patch\" --oneline -i | wc -l\n\n# Revert 提交\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --grep=\"revert\" --oneline -i | wc -l\n\n# 大提交(>500 行变更)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%H\" --shortstat | grep -E \"([5-9][0-9]{2}|[0-9]{4,}) insertion\" | wc -l\n\n# 合并提交\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --merges --oneline | wc -l\n\n# 约定式提交检查(feat/fix/chore/docs/style/refactor/test/perf/ci/build)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%s\" | grep -cE \"^(feat|fix|chore|docs|style|refactor|test|perf|ci|build)(\\(.+\\))?:\"\n```\n\n#### 2.4 团队级别数据\n\n```bash\n# 仅有一个贡献者的文件(巴士因子风险)\ngit -C \u003crepo_path> log --pretty=format:\"%an\" --name-only | sort | uniq -c | sort -rn | head -30\n\n# 每位作者的活跃日期范围\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad\" --date=short | sort | sed -n '1p;$p'\n```\n\n### 步骤 3:AI 分析与评估\n\n基于采集的原始数据,从以下 **六个维度** 分析每位开发者,每个维度评分 1-10:\n\n---\n\n#### 📝 维度一:提交习惯\n\n**分析因素:**\n- 总提交次数、日均提交频率\n- 每次提交的平均变更行数(增加 + 删除)\n- 提交消息平均长度和质量\n- 合并提交比例\n- 大提交(>500 行)频率\n\n**评分标准:**\n- 10:日均 2-5 次提交,每次 50-200 行,消息清晰且格式规范\n- 5:频率不稳定,偶尔有巨型提交,消息质量参差不齐\n- 1:提交极少或频繁巨型提交,消息只有一两个词\n\n---\n\n#### ⏰ 维度二:工作习惯\n\n**分析因素:**\n- 提交时间分布(高峰时段)\n- 周末提交占比\n- 深夜编码比例(22:00-04:59)\n- 最长连续编码天数\n- 活跃天数 / 总跨度天数\n\n**评分标准:**\n- 10:规律工作时间,深夜/周末比例 \u003c10%,持续稳定输出\n- 5:有一些深夜/周末提交,节奏波动适中\n- 1:几乎所有提交都在深夜/周末,或极度不规律\n\n> 注意:深夜/周末编码不一定是\"坏的\",但持续的模式可能表明流程或资源问题。\n\n---\n\n#### 🚀 维度三:研发效率\n\n**分析因素:**\n- 净代码增长率:(新增 - 删除) / 新增\n- 代码流失率:删除 / 新增\n- 返工率:7 天窗口内修改同一文件的频率\n- 活跃日的日均产出\n\n**评分标准:**\n- 10:高净增长率,流失率 \u003c20%,低返工率,稳定产出\n- 5:中等流失率,有一定返工\n- 1:大量代码删除,频繁返工,产出波动剧烈\n\n---\n\n#### 🎨 维度四:代码风格\n\n**分析因素:**\n- 主要编程语言 / 文件类型分布\n- 约定式提交(Conventional Commits)合规率\n- 提交消息是否引用 issue 编号\n- 文件修改集中度(集中在少数模块 vs. 分散)\n\n**评分标准:**\n- 10:>80% 约定式提交合规率,消息引用 issue,修改集中\n- 5:部分合规,偶尔分散\n- 1:几乎不合规,消息无意义\n\n---\n\n#### 🔍 维度五:代码质量\n\n**分析因素:**\n- Bug 修复提交比例\n- Revert 提交频率\n- 大提交(>500 行)比例\n- 测试相关文件修改频率\n\n**评分标准:**\n- 10:Bug 修复比例 \u003c10%,无 revert,大提交 \u003c5%,有修改测试文件\n- 5:Bug 修复 15-25%,少量 revert,有一些大提交\n- 1:Bug 修复 >30%,频繁 revert,大量巨型提交\n\n---\n\n#### 📊 维度六:参与度指数\n\n> **⚠️ 使用限制:** 本指数仅作为团队协作模式的宏观参考。**严禁将其作为个人绩效考核、裁员决策、薪酬调整或任何其他人事决策的依据。** 用户应理解该指数的局限性并承担相应的伦理责任。\n\n> 注意:该指数旨在客观衡量代码仓库中的可见参与度,作为补充参考。Git 记录仅反映代码提交活动,不代表开发者的全部工作(设计、代码评审、沟通、指导等不会被 Git 捕获)。\n\n**计算方法(以下信号的综合,0-100 分,分数越低 = 可见参与度越高):**\n\n| 信号 | 权重 | 说明 |\n|------|------|------|\n| 日均提交极低(\u003c0.3) | 25% | 活跃日的产出过低 |\n| 活跃日占比低(\u003c30%) | 20% | 时间跨度大但实际工作天数少 |\n| 净代码增长极低或为负 | 20% | 删除的代码比编写的更多 |\n| 提交消息草率(平均 \u003c15 字符) | 15% | 不认真对待提交记录 |\n| 高流失率 + 高返工率 | 20% | 大量无效劳动 |\n\n**等级:**\n- 0-20:高度活跃 — 考虑是否存在倦怠风险\n- 21-40:稳定参与,持续产出\n- 41-60:中等参与,有提升空间\n- 61-80:低参与度 — 检查是否有未被记录的非代码贡献\n- 81-100:极低参与度 — 建议与本人沟通了解全貌\n\n> **重要提示:** 该指数仅根据 Git 提交记录计算,无法反映代码评审、架构设计、技术讨论、团队指导等不产生提交的工作。高分不等于\"摸鱼\",低分不等于\"高效\"。请在了解完整背景后再做判断。\n\n### 步骤 4:生成报告\n\n最终报告必须包含以下结构:\n\n#### 4.1 总览表\n\n| 开发者 | 提交数 | 行数 +/- | 日均 | 周末% | 深夜% | Bug修复% | 流失率 | 参与度 | 综合评分 |\n|--------|--------|----------|------|-------|-------|----------|--------|--------|----------|\n| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |\n\n#### 4.2 个人开发者画像\n\n为每位开发者输出:\n\n1. **数据面板**:六个维度的关键指标\n2. **AI 点评**:严肃、直接地评估优缺点(不粉饰太平)\n3. **改进建议**:针对每个弱点给出具体、可操作的建议\n4. **六维雷达评分**:每个维度 1-10 分\n5. **综合评分**:加权平均(提交习惯 15%、工作习惯 15%、研发效率 25%、代码风格 15%、代码质量 20%、参与度指数反向 10%)\n6. **一句话总结**:一句犀利、令人印象深刻的话概括该开发者\n\n#### 4.3 团队交叉对比\n\n- 各维度排名\n- 突出最佳 / 最差表现者\n- 团队整体健康度评估\n- 巴士因子风险预警\n\n## 点评风格要求\n\n- **严肃直接**:不粉饰,不含糊。数据说话 — 好就是好,差就是差。\n- **温暖而坚定**:指出问题的同时提供改进路径。对事不对人。\n- **犀利但公平**:像一位资深技术负责人进行年度 Code Review — 既不手软也不刻薄。\n- **数据驱动**:每个结论都必须有相应数据支撑。不凭直觉。\n\n## 重要注意事项\n\n- 所有数据采集仅使用原生 `git` 命令 — **不安装或执行任何 pip 包、Python/Node 脚本**\n- **需要的系统工具:** `git`、`cut`、`sort`、`uniq`、`awk`、`grep`、`sed`、`wc`、`head` — 必须在主机上可用(大多数类 Unix 系统已预装)\n- **所有用户输入在执行前必须按照\"安全规范\"规则进行校验**,以防止命令注入攻击\n- **推荐首次使用时开启预览模式(dry-run)** — 在允许执行前审查所有命令\n- **执行验证:** 在敏感仓库上使用之前,请先在测试仓库上运行\"执行验证协议\",确认你的代理正确实现了所有校验、白名单和脱敏规则\n- **敏感数据保护:** 提交消息仅在本地处理统计指标(长度、关键词计数) — **默认情况下完整的提交消息文本不会发送给 AI 模型。** 常见密钥模式(API 密钥、令牌、凭据、连接字符串)会在数据离开本地环境前自动脱敏。详见\"敏感数据过滤规则\"。\n- **仓库作用域:** 代理仅访问用户提供的特定仓库路径 — 不允许父目录遍历或任意文件系统访问\n- **不收集开发者邮箱**以保护个人隐私\n- 对于大型仓库,建议限制日期范围以控制命令执行时间\n- 注意同一个人可能有不同的名称变体(可通过 `.mailmap` 统一)\n- 时区差异可能影响工作时间分析 — 使用提交记录中的时区\n- 参与度指数仅基于 Git 提交数据,**不反映非代码贡献**(设计、评审、指导等)— 不应作为绩效评估的唯一依据\n\n## 伦理使用政策\n\n本技能生成的报告应遵循以下原则:\n\n1. **补充参考,非决策依据**:报告仅供团队内部参考,帮助了解协作模式和改进方向。**严禁直接用于绩效考核、裁员决策、薪酬调整或其他人事决策。**\n2. **透明度**:如果在团队内使用此工具,建议提前告知所有被分析的团队成员。\n3. **完整上下文**:对报告的任何引用都应包含完整的局限性免责声明,避免断章取义。\n4. **对事不对人**:目标是改进团队协作流程和个人工作方法,而非评判一个人的价值。\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":24533,"content_sha256":"34d684ff8bc5bdfc38dc56af06c202391eb4477b3288c3e2ea869b677eafeb13"},{"filename":"skill.yaml","content":"name: who-is-actor\nversion: 1.0.9\ndescription: >\n A zero-*install*-dependency Git repository developer profiling skill.\n \"Zero dependency\" means no Python/Node packages, no pip/npm installs, and\n no custom scripts — however the skill DOES require standard system\n binaries already present on most Unix-like hosts (see required_binaries\n below for the full list: git, cut, sort, uniq, awk, grep, sed, wc, head).\n It uses only native git READ-ONLY commands to analyze commit history, then\n leverages AI to generate a data-driven developer portrait covering commit\n habits, work habits, development efficiency, code style, code quality,\n and an engagement index.\n Security: all user inputs validated against strict allowlists; only\n whitelisted git read-only subcommands are permitted; no write/network\n operations; no developer emails collected. A dry-run mode is available\n to preview all commands before execution. Commit messages are processed\n for statistical analysis only (length, keyword matching) — full message\n text is NOT forwarded to the AI model; only aggregated metrics are sent.\n The engagement index is explicitly scoped as a collaboration reference\n only, not for HR decisions.\n Privacy note: commit messages and filenames are read locally during data\n collection and may contain sensitive information — the skill enforces\n automatic redaction of common secret patterns before any data leaves the\n local environment. Run only on repositories you have permission to analyze.\nauthor: reky\nlicense: MIT\nacceptLicenseTerms: true\ntags:\n - code-analysis\n - git\n - developer-profiling\n - zero-dependency\n - commit-patterns\n - engagement-index\n\ndependencies:\n - git\n - cut\n - sort\n - uniq\n - awk\n - grep\n - sed\n - wc\n - head\n\nrequired_binaries:\n - name: git\n reason: Core dependency — all data collection uses native git read-only subcommands.\n - name: cut\n reason: Text processing — extracts fields from git output (e.g., hour from ISO timestamps).\n - name: sort\n reason: Text processing — sorts lines for frequency analysis.\n - name: uniq\n reason: Text processing — deduplicates sorted lines and counts occurrences.\n - name: awk\n reason: Text processing — aggregates numeric fields (lines added/deleted) and computes lengths.\n - name: grep\n reason: Text processing — filters lines by pattern (e.g., file extensions, bug-fix keywords).\n - name: sed\n reason: Text processing — extracts first/last lines for date range detection.\n - name: wc\n reason: Text processing — counts matching lines (e.g., number of bug-fix commits).\n - name: head\n reason: Text processing — limits output to top-N results.\n\nruntime: ai\nentry: SKILL.md\n\nparameters:\n - name: repo_path\n type: string\n description: >\n Absolute path to the Git repository to analyze.\n required: true\n\n - name: authors\n type: list\n description: >\n List of author display names to analyze (email addresses are NOT accepted — use the author's Git display name instead). If empty, analyze all contributors.\n default: []\n\n - name: since\n type: string\n description: >\n Start date for analysis (ISO format, e.g. '2024-01-01').\n default: \"\"\n\n - name: until\n type: string\n description: >\n End date for analysis (ISO format, e.g. '2024-12-31').\n default: \"\"\n\n - name: branch\n type: string\n description: >\n Branch to analyze. Defaults to the current active branch.\n default: \"\"\n\noutputs:\n - name: report\n type: string\n description: >\n The generated Markdown analysis report containing per-developer metrics,\n cross-comparison table, ratings, and personalized commentary.\n","content_type":"application/yaml; charset=utf-8","language":"yaml","size":3711,"content_sha256":"567c3a51e3d4211f5fcac0a81c3d7e4d4c05c7cb10a355fe3d4339032147dc32"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Who Is Actor — Git Repository Developer Profiling Skill","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"🔗 ","type":"text"},{"text":"Project Repository:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"https://github.com/wscats/who-is-actor","type":"text","marks":[{"type":"link","attrs":{"href":"https://github.com/wscats/who-is-actor","title":null}}]}]}]},{"type":"paragraph","content":[{"text":"Zero ","type":"text"},{"text":"install","type":"text","marks":[{"type":"em"}]},{"text":" dependencies, zero scripts. Collects data purely through native ","type":"text"},{"text":"git","type":"text","marks":[{"type":"code_inline"}]},{"text":" commands and standard Unix text utilities (","type":"text"},{"text":"cut","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"sort","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"awk","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"grep","type":"text","marks":[{"type":"code_inline"}]},{"text":", etc. — already present on most systems), interpreted by AI, to generate a serious, direct, and unsparing report card for every developer.","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Zero dependency\" clarification:","type":"text","marks":[{"type":"strong"}]},{"text":" This skill installs nothing — no pip packages, no npm modules, no custom scripts. However, it ","type":"text"},{"text":"does require","type":"text","marks":[{"type":"strong"}]},{"text":" the following standard system binaries to be available on the host: ","type":"text"},{"text":"git","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"cut","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"sort","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"uniq","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"awk","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"grep","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"sed","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"wc","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"head","type":"text","marks":[{"type":"code_inline"}]},{"text":". These are pre-installed on virtually all Unix-like systems (macOS, Linux). On Windows, use Git Bash or WSL.","type":"text"}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"💬 Natural Language (Recommended)","type":"text"}]},{"type":"paragraph","content":[{"text":"You don't need to memorize any commands or parameters — simply describe what you need in any language:","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"English","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"💬 \"Analyze the repository at /path/to/my-project\"\n💬 \"Profile all developers in this repo\"\n💬 \"Who are the most active contributors in /path/to/my-project?\"\n💬 \"Compare commit habits of Alice and Bob\"\n💬 \"Show me the code quality report for this project since 2024-01-01\"\n💬 \"What does each developer's work pattern look like on branch main?\"\n💬 \"Give me an honest review of every contributor's strengths and weaknesses\"\n💬 \"Is there a bus-factor risk in /path/to/my-project?\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"中文","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"💬 \"分析一下 /path/to/my-project 这个仓库\"\n💬 \"帮我看看这个项目里每个开发者的提交习惯\"\n💬 \"对比一下 Alice 和 Bob 的研发效率\"\n💬 \"生成这个仓库的开发者画像报告\"\n💬 \"这个项目的代码质量怎么样?\"\n💬 \"从 2024 年 1 月开始,分析 main 分支的提交记录\"\n💬 \"团队里谁的代码风格最好?谁需要改进?\"\n💬 \"看看这个仓库有没有巴士因子风险\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"日本語","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"💬 \"このリポジトリの開発者を分析してください /path/to/my-project\"\n💬 \"各開発者のコミット習慣を比較してください\"\n💬 \"このプロジェクトのコード品質レポートを作成してください\"\n💬 \"チームの開発効率を評価してください\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"한국어","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"💬 \"이 저장소의 개발자 프로필을 분석해 주세요 /path/to/my-project\"\n💬 \"각 개발자의 커밋 습관을 비교해 주세요\"\n💬 \"이 프로젝트의 코드 품질 보고서를 만들어 주세요\"\n💬 \"팀의 개발 효율성을 평가해 주세요\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Español","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"💬 \"Analiza el repositorio en /path/to/my-project\"\n💬 \"Compara los hábitos de commit de todos los desarrolladores\"\n💬 \"Dame un informe de calidad del código de este proyecto\"\n💬 \"¿Quién es el desarrollador más activo del equipo?\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Français","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"💬 \"Analyse le dépôt situé à /path/to/my-project\"\n💬 \"Compare les habitudes de commit de chaque développeur\"\n💬 \"Génère un rapport de qualité du code pour ce projet\"\n💬 \"Qui est le contributeur le plus actif de l'équipe ?\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Deutsch","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"💬 \"Analysiere das Repository unter /path/to/my-project\"\n💬 \"Vergleiche die Commit-Gewohnheiten aller Entwickler\"\n💬 \"Erstelle einen Code-Qualitätsbericht für dieses Projekt\"\n💬 \"Wer ist der aktivste Entwickler im Team?\"","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"⚙️ Parameters","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Parameter","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Required","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Default","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"repo_path","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Absolute path to the target Git repository","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ Yes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"—","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"authors","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Comma-separated display names (emails NOT accepted)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"All contributors","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"since","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Start date in ISO format (","type":"text"},{"text":"YYYY-MM-DD","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full history","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"until","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"End date in ISO format (","type":"text"},{"text":"YYYY-MM-DD","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full history","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"branch","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Target branch to analyze","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Active branch","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"What you get:","type":"text","marks":[{"type":"strong"}]},{"text":" A structured Markdown report with a summary table, per-developer profiles (six-dimension radar scores, strengths/weaknesses, improvement suggestions), team comparison, and bus-factor risk alerts.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Security Specification","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"All shell command parameters MUST be strictly validated before execution to prevent command injection attacks.","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Dry-Run Mode (Recommended for First Use)","type":"text"}]},{"type":"paragraph","content":[{"text":"Before executing any commands, the agent SHOULD offer a ","type":"text"},{"text":"dry-run mode","type":"text","marks":[{"type":"strong"}]},{"text":" that:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Collects and validates all parameters per the rules below","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Constructs the full list of shell commands that ","type":"text"},{"text":"would","type":"text","marks":[{"type":"em"}]},{"text":" be executed","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prints every command to the user for review WITHOUT executing any of them","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Waits for explicit user approval before proceeding to actual execution","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"To trigger dry-run mode, the user can say:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"💬 \"Show me the commands first before running them\"\n💬 \"Do a dry run on /path/to/repo\"\n💬 \"先列出要执行的命令,不要运行\"","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"This allows the user to verify that every command strictly matches the whitelist below.","type":"text"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Command Whitelist (Only These Commands Are Allowed)","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill ","type":"text"},{"text":"only permits the following predefined read-only git subcommands","type":"text","marks":[{"type":"strong"}]},{"text":". No other shell commands may be executed:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Allowed Command","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Purpose","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Modifies Repo?","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"git -C \u003cpath> rev-parse --is-inside-work-tree","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Verify the path is a valid Git repository","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"❌ Read-only","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"git -C \u003cpath> shortlog -sn --all","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Get contributor list and commit counts","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"❌ Read-only","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"git -C \u003cpath> log ...","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Get commit history details","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"❌ Read-only","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"git -C \u003cpath> diff --stat ...","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Get change statistics","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"❌ Read-only","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Strictly Prohibited Command Types:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ Any write operations: ","type":"text"},{"text":"git push","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git commit","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git merge","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git rebase","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git reset","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git checkout","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git branch -d","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ Any non-git commands: ","type":"text"},{"text":"curl","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"wget","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"python","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"node","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"bash -c","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"sh","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"eval","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"rm","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"cp","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"mv","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ Any file writes or redirections: ","type":"text"},{"text":">","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":">>","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"tee","type":"text","marks":[{"type":"code_inline"}]},{"text":" (pipe ","type":"text"},{"text":"|","type":"text","marks":[{"type":"code_inline"}]},{"text":" is only allowed to connect read-only text-processing tools: ","type":"text"},{"text":"cut","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"sort","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"uniq","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"awk","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"grep","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"wc","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"sed","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"head","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ Any network operations: ","type":"text"},{"text":"git fetch","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git pull","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git clone","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git remote","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"If the AI agent attempts to execute a command outside the whitelist, the user should immediately reject execution.","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Input Validation Rules (Must Be Completed Before Any Git Command)","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"repo_path","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" (Repository Path) Validation:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Must be an absolute path (starting with ","type":"text"},{"text":"/","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Must NOT contain any of these dangerous characters or substrings: ","type":"text"},{"text":";","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"|","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"&","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"$","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"`","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"(","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":")","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":">","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"\u003c","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"\\n","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"\\r","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"$()","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"..","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Path must be a real, existing Git repository (verified via ","type":"text"},{"text":"git -C \u003cpath> rev-parse --is-inside-work-tree","type":"text","marks":[{"type":"code_inline"}]},{"text":" returning ","type":"text"},{"text":"true","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If validation fails, ","type":"text"},{"text":"immediately abort and report the error to the user — no subsequent commands may be executed","type":"text","marks":[{"type":"strong"}]}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"author","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" (Author Name) Validation:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Only allowed characters: letters (a-z A-Z), digits (0-9), spaces, hyphens (","type":"text"},{"text":"-","type":"text","marks":[{"type":"code_inline"}]},{"text":"), underscores (","type":"text"},{"text":"_","type":"text","marks":[{"type":"code_inline"}]},{"text":"), dots (","type":"text"},{"text":".","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The ","type":"text","marks":[{"type":"strong"}]},{"text":"@","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" symbol is NOT allowed","type":"text","marks":[{"type":"strong"}]},{"text":" (email format is prohibited to align with privacy protection rules)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Regex whitelist: ","type":"text"},{"text":"^[a-zA-Z0-9 _.-]+$","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Maximum length: 128 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If input contains ","type":"text"},{"text":"@","type":"text","marks":[{"type":"code_inline"}]},{"text":", prompt the user to use the author's display name instead, then skip that author","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"since","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" / ","type":"text","marks":[{"type":"strong"}]},{"text":"until","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" (Date Parameters) Validation:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Must match ISO date format: ","type":"text"},{"text":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If validation fails, ignore the parameter and warn the user","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"branch","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" (Branch Name) Validation:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Only allowed characters: letters, digits, ","type":"text"},{"text":"/","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"-","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"_","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":".","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Regex whitelist: ","type":"text"},{"text":"^[a-zA-Z0-9/_.-]+$","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Must NOT contain the ","type":"text"},{"text":"..","type":"text","marks":[{"type":"code_inline"}]},{"text":" substring","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If validation fails, use the default branch and warn the user","type":"text"}]}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Privacy Protection Rules","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Developer email addresses are NOT collected.","type":"text","marks":[{"type":"strong"}]},{"text":" All git commands use only ","type":"text"},{"text":"%an","type":"text","marks":[{"type":"code_inline"}]},{"text":" (author name) to identify developers, never ","type":"text"},{"text":"%ae","type":"text","marks":[{"type":"code_inline"}]},{"text":" (author email).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"git shortlog","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" uses ","type":"text","marks":[{"type":"strong"}]},{"text":"-sn","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" instead of ","type":"text","marks":[{"type":"strong"}]},{"text":"-sne","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" to avoid leaking email addresses.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The ","type":"text","marks":[{"type":"strong"}]},{"text":"authors","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" parameter only accepts display names, NOT email addresses.","type":"text","marks":[{"type":"strong"}]},{"text":" Input validation rejects values containing ","type":"text"},{"text":"@","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Note: The ","type":"text"},{"text":"git --author","type":"text","marks":[{"type":"code_inline"}]},{"text":" parameter matches against both name and email fields. Since this skill prohibits email-format values, ","type":"text"},{"text":"--author","type":"text","marks":[{"type":"code_inline"}]},{"text":" will only match via the name portion and will not utilize the email field.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The final report MUST NOT contain any email addresses.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Sensitive Data Filtering Rules (Mandatory)","type":"text"}]},{"type":"paragraph","content":[{"text":"Before sending ","type":"text"},{"text":"any","type":"text","marks":[{"type":"strong"}]},{"text":" data to the AI model for analysis, the agent MUST apply the following filtering:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Commit messages are processed locally for statistics only:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The agent collects commit message ","type":"text"},{"text":"lengths","type":"text","marks":[{"type":"strong"}]},{"text":" (character counts) and ","type":"text"},{"text":"keyword matches","type":"text","marks":[{"type":"strong"}]},{"text":" (e.g., ","type":"text"},{"text":"fix","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"feat","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"revert","type":"text","marks":[{"type":"code_inline"}]},{"text":") locally via shell commands.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Full commit message text MUST NOT be forwarded verbatim to the AI model.","type":"text","marks":[{"type":"strong"}]},{"text":" Instead, send only aggregated metrics (average length, keyword counts, conventional commit compliance rate).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If the user explicitly requests to see specific commit messages, the agent MUST:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"First apply all redaction patterns listed below","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Truncate each message to a maximum of 120 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Display redacted messages ","type":"text"},{"text":"only in the final user-facing report","type":"text","marks":[{"type":"strong"}]},{"text":", never in intermediate AI prompts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Warn the user that commit messages may contain sensitive information","type":"text"}]}]}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Automatic redaction of secret patterns:","type":"text","marks":[{"type":"strong"}]},{"text":" Before any text (commit messages, filenames, branch names) is included in the AI prompt, the agent MUST scan for and redact the following patterns:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"API keys / tokens: strings matching ","type":"text"},{"text":"(?i)(api[_-]?key|token|secret|password|credential|auth)[=:]\\s*\\S+","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"AWS keys: ","type":"text"},{"text":"AKIA[0-9A-Z]{16}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Private keys: ","type":"text"},{"text":"-----BEGIN .* PRIVATE KEY-----","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Connection strings: ","type":"text"},{"text":"(?i)(mysql|postgres|mongodb|redis)://\\S+","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generic secrets: any string longer than 20 characters containing only alphanumeric characters that appears after ","type":"text"},{"text":"=","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":":","type":"text","marks":[{"type":"code_inline"}]},{"text":" in a key-value pattern","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Replace matched content with ","type":"text"},{"text":"[REDACTED]","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Filename filtering:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Filenames are collected only to determine ","type":"text"},{"text":"file extensions","type":"text","marks":[{"type":"strong"}]},{"text":" for language/type statistics.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Full file paths SHOULD NOT be sent to the AI model unless the user explicitly requests file-level analysis.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If full paths are sent, redact any path components that match common secret file patterns: ","type":"text"},{"text":".env","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":".credentials","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"*secret*","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"*password*","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"*token*","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Repository Path Scope Rules","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The agent MUST only access the specific repository path provided by the user.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The agent MUST NOT traverse parent directories (","type":"text"},{"text":"..","type":"text","marks":[{"type":"code_inline"}]},{"text":") or access files outside the repository root.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The agent MUST NOT list or read arbitrary files from the filesystem — only ","type":"text"},{"text":"git","type":"text","marks":[{"type":"code_inline"}]},{"text":" commands targeting the validated repository are permitted.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If the user provides a path to a subdirectory within a repository, the agent should use the repository root (as determined by ","type":"text"},{"text":"git -C \u003cpath> rev-parse --show-toplevel","type":"text","marks":[{"type":"code_inline"}]},{"text":") and inform the user.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Enforcement Verification Protocol","type":"text"}]},{"type":"paragraph","content":[{"text":"Because this is an instruction-only skill (no executable code), safety guarantees depend on the AI agent correctly implementing the rules above. ","type":"text"},{"text":"Users SHOULD verify enforcement before trusting the skill on sensitive repositories.","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Verification steps (run on a safe test repository first):","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Dry-run test:","type":"text","marks":[{"type":"strong"}]},{"text":" Ask the agent to analyze a test repo using dry-run mode. Verify that:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Every proposed command appears in the Command Whitelist table above","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No commands use ","type":"text"},{"text":"%ae","type":"text","marks":[{"type":"code_inline"}]},{"text":" (email format) or ","type":"text"},{"text":"-sne","type":"text","marks":[{"type":"code_inline"}]},{"text":" flags","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"All user-supplied values (path, author, dates) are properly quoted","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Input validation test:","type":"text","marks":[{"type":"strong"}]},{"text":" Deliberately provide invalid inputs and verify rejection:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"\"Analyze /tmp/test; rm -rf /\" -> agent MUST reject (dangerous characters)\n\"Profile author [email protected]\" -> agent MUST reject (@ not allowed)\n\"Analyze since 2024-13-99\" -> agent MUST reject or warn (invalid date)\n\"Analyze branch ../../etc/passwd\" -> agent MUST reject (.. not allowed)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Data filtering test:","type":"text","marks":[{"type":"strong"}]},{"text":" After a dry-run, ask the agent:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"\"What data will you send to the AI model?\"","type":"text"}]},{"type":"paragraph","content":[{"text":"The agent should confirm it sends only aggregated metrics (counts, averages, percentages), NOT raw commit messages or full file paths.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Redaction test:","type":"text","marks":[{"type":"strong"}]},{"text":" If commit messages are requested, verify that:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Messages are truncated to \u003c=120 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Patterns like ","type":"text"},{"text":"API_KEY=xxx","type":"text","marks":[{"type":"code_inline"}]},{"text":" appear as ","type":"text"},{"text":"[REDACTED]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Messages appear only in the final report, not in intermediate processing","type":"text"}]}]}]}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"If any verification step fails, do NOT use the skill on sensitive repositories.","type":"text","marks":[{"type":"strong"}]},{"text":" Report the failure to the skill maintainer.","type":"text"}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Use Cases","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"When users need to analyze each developer's real behavioral profile in a Git repository","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"When users want to compare team members' commit habits, work rhythms, and code quality","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"When users want to understand the team's engagement distribution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"When users need honest evaluations of each developer's strengths and weaknesses with improvement suggestions","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Core Principles","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Install nothing, run no scripts.","type":"text","marks":[{"type":"strong"}]},{"text":" All data collection is done exclusively through native git commands (","type":"text"},{"text":"git log","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git shortlog","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git diff --stat","type":"text","marks":[{"type":"code_inline"}]},{"text":", etc.). The AI is responsible for interpretation and evaluation.","type":"text"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Security first.","type":"text","marks":[{"type":"strong"}]},{"text":" All user inputs must pass the validation rules above before being incorporated into shell commands. Any validation failure must result in termination or graceful degradation — never skip validation.","type":"text"}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1: Confirm Analysis Parameters","type":"text"}]},{"type":"paragraph","content":[{"text":"Confirm the following with the user (use defaults if not specified):","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Parameter","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Default","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Repository Path","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Absolute path to the target Git repository","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"(Required)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Target Authors","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Specific developers to analyze; leave blank for all","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"All contributors","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Date Range","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Start/end dates in ISO format","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full repository history","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Branch","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Target branch for analysis","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Current active branch","type":"text"}]}]}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"⚠️ Before executing Step 2, ALL parameters MUST be validated according to the \"Security Specification\" above. Parameters that fail validation MUST NOT be used in command construction.","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2: Data Collection (Pure Git Commands)","type":"text"}]},{"type":"paragraph","content":[{"text":"Execute the following git commands in sequence to collect raw data. ","type":"text"},{"text":"All commands run against the target repository directory — no dependencies need to be installed.","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"In the examples below, ","type":"text"},{"text":"\u003crepo_path>","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"\u003cauthor>","type":"text","marks":[{"type":"code_inline"}]},{"text":", etc. are placeholders for validated safe values from Step 1.","type":"text"}]}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2.1 Contributor Overview","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# List all contributors with commit counts (no email to protect privacy)\ngit -C \u003crepo_path> shortlog -sn --all","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2.2 Per-Author Commit Details","type":"text"}]},{"type":"paragraph","content":[{"text":"For each author to be analyzed, execute the following commands (append ","type":"text"},{"text":"--since","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"--until","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"\u003cbranch>","type":"text","marks":[{"type":"code_inline"}]},{"text":" parameters if a date range or branch was specified):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Detailed commit log: hash, author name, date, message, file stats (no email)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%H|%an|%aI|%s\" --numstat\n\n# Commit count per hour of day (for work habit analysis)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%aI\" | cut -c12-13 | sort | uniq -c | sort -rn\n\n# Commit count per day of week (1=Mon, 7=Sun)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad\" --date=format:\"%u\" | sort | uniq -c | sort -rn\n\n# Lines added/deleted summary\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2 } END { printf \"added: %s, deleted: %s\\n\", add, subs }'\n\n# Commit message lengths\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%s\" | awk '{ print length }'\n\n# File types touched\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=tformat: --name-only | grep -oE '\\.[^./]+

Who Is Actor — Git Repository Developer Profiling Skill 🔗 Project Repository: https://github.com/wscats/who-is-actor Zero install dependencies, zero scripts. Collects data purely through native commands and standard Unix text utilities ( , , , , etc. — already present on most systems), interpreted by AI, to generate a serious, direct, and unsparing report card for every developer. "Zero dependency" clarification: This skill installs nothing — no pip packages, no npm modules, no custom scripts. However, it does require the following standard system binaries to be available on the host: , , ,…

| sort | uniq -c | sort -rn | head -20\n\n# Commits per day (for frequency analysis)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad\" --date=short | sort | uniq -c | sort -rn | head -20\n\n# Recent rework detection: files modified multiple times within 7-day windows\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad %s\" --date=short --name-only | head -200","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2.3 Code Quality Signals","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Bug fix commits (messages containing fix/bug/hotfix/patch)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --grep=\"fix\\|bug\\|hotfix\\|patch\" --oneline -i | wc -l\n\n# Revert commits\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --grep=\"revert\" --oneline -i | wc -l\n\n# Large commits (>500 lines changed)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%H\" --shortstat | grep -E \"([5-9][0-9]{2}|[0-9]{4,}) insertion\" | wc -l\n\n# Merge commits\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --merges --oneline | wc -l\n\n# Conventional commit check (feat/fix/chore/docs/style/refactor/test/perf/ci/build)\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%s\" | grep -cE \"^(feat|fix|chore|docs|style|refactor|test|perf|ci|build)(\\(.+\\))?:\"","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2.4 Team-Level Data","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Files with only one contributor (bus factor risk)\ngit -C \u003crepo_path> log --pretty=format:\"%an\" --name-only | sort | uniq -c | sort -rn | head -30\n\n# Active date range per author\ngit -C \u003crepo_path> log --author=\"\u003cauthor>\" --pretty=format:\"%ad\" --date=short | sort | sed -n '1p;$p'","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3: AI Analysis & Evaluation","type":"text"}]},{"type":"paragraph","content":[{"text":"Based on the collected raw data, analyze each developer across the following ","type":"text"},{"text":"six dimensions","type":"text","marks":[{"type":"strong"}]},{"text":", assigning a score of 1–10 for each:","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":4},"content":[{"text":"📝 Dimension 1: Commit Habits","type":"text"}]},{"type":"paragraph","content":[{"text":"Analysis Factors:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Total commit count, average daily commit frequency","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Average lines changed per commit (additions + deletions)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Average commit message length and quality","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Merge commit ratio","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Frequency of large commits (>500 lines)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Scoring Criteria:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"10: 2–5 daily commits, 50–200 lines each, clear and well-formatted messages","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"5: Inconsistent frequency, occasional giant commits, mixed message quality","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"1: Very few commits or frequent giant commits with one-word messages","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":4},"content":[{"text":"⏰ Dimension 2: Work Habits","type":"text"}]},{"type":"paragraph","content":[{"text":"Analysis Factors:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Commit time distribution (peak hours)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Weekend commit percentage","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Late-night coding ratio (22:00–04:59)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Longest consecutive coding streak (days)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Active days / total span days","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Scoring Criteria:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"10: Regular working hours, late-night/weekend ratio \u003c10%, consistent and steady output","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"5: Some late-night/weekend commits, moderate rhythm fluctuations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"1: Almost all commits at night/weekends, or extremely irregular patterns","type":"text"}]}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Note: Late-night/weekend coding is not inherently \"bad,\" but persistent patterns may indicate process or resource issues.","type":"text"}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":4},"content":[{"text":"🚀 Dimension 3: Development Efficiency","type":"text"}]},{"type":"paragraph","content":[{"text":"Analysis Factors:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Net code growth rate: (additions - deletions) / additions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Code churn rate: deletions / additions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rework ratio: frequency of modifying the same file within 7-day windows","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Average daily output during active days","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Scoring Criteria:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"10: High net growth rate, churn rate \u003c20%, low rework ratio, stable output","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"5: Moderate churn rate, some rework","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"1: Massive code deletions, frequent rework, highly volatile output","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":4},"content":[{"text":"🎨 Dimension 4: Code Style","type":"text"}]},{"type":"paragraph","content":[{"text":"Analysis Factors:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Primary programming languages / file type distribution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Conventional Commits compliance rate","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Whether commit messages reference issue numbers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"File modification focus (concentrated on a few modules vs. scattered)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Scoring Criteria:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"10: >80% Conventional Commits compliance, messages reference issues, focused modifications","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"5: Partial compliance, occasionally scattered","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"1: Almost no compliance, meaningless messages","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":4},"content":[{"text":"🔍 Dimension 5: Code Quality","type":"text"}]},{"type":"paragraph","content":[{"text":"Analysis Factors:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Bug fix commit ratio","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Revert commit frequency","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Large commit (>500 lines) ratio","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Frequency of test-related file modifications","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Scoring Criteria:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"10: Bug fix ratio \u003c10%, no reverts, large commits \u003c5%, test files modified","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"5: Bug fix 15–25%, few reverts, some large commits","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"1: Bug fix >30%, frequent reverts, many giant commits","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":4},"content":[{"text":"📊 Dimension 6: Engagement Index","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"⚠️ Usage Restriction:","type":"text","marks":[{"type":"strong"}]},{"text":" This index is intended solely as a macro-level reference for team collaboration patterns. ","type":"text"},{"text":"It is strictly prohibited to use it as a basis for individual performance reviews, layoff decisions, compensation adjustments, or any other HR decisions.","type":"text","marks":[{"type":"strong"}]},{"text":" Users should understand the limitations of this index and bear corresponding ethical responsibility.","type":"text"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Note: This index aims to objectively measure visible participation levels in the code repository as a supplementary reference. Git records only reflect code commit activity and do not represent a developer's full body of work (design, code review, communication, mentoring, etc. are not captured by Git).","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Calculation Method (composite of the following signals, 0–100 scale, lower = higher visible engagement):","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Signal","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Weight","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Very low daily commits (\u003c0.3)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"25%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Output during active days is too low","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Low active-day ratio (\u003c30%)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"20%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Large time span but few actual working days","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Very low or negative net code growth","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"20%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"More code deleted than written","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Careless commit messages (avg \u003c15 chars)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"15%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Not taking commit records seriously","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"High churn rate + high rework rate","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"20%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Large amount of wasted effort","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Levels:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"0–20: Highly active — consider whether burnout risk exists","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"21–40: Steady participation, consistent output","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"41–60: Moderate participation, room for improvement","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"61–80: Low participation — check if there are non-code contributions not captured","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"81–100: Very low participation — recommend discussing with the individual to understand the full picture","type":"text"}]}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Important:","type":"text","marks":[{"type":"strong"}]},{"text":" This index is calculated solely from Git commit records and cannot reflect code reviews, architecture design, technical discussions, team mentoring, or other work that doesn't produce commits. A high score does NOT equal \"slacking,\" and a low score does NOT equal \"efficient.\" Please make judgments only after understanding the full context.","type":"text"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 4: Generate Report","type":"text"}]},{"type":"paragraph","content":[{"text":"The final report MUST include the following structure:","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"4.1 Summary Table","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Developer","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Commits","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Lines +/-","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Daily Avg","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Weekend%","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Late-Night%","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bug Fix%","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Churn Rate","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Engagement","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Overall Score","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"...","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"...","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"...","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"...","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"...","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"...","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"...","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"...","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"...","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"...","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"4.2 Individual Developer Profiles","type":"text"}]},{"type":"paragraph","content":[{"text":"For each developer, output:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Data Dashboard","type":"text","marks":[{"type":"strong"}]},{"text":": Key metrics for all six dimensions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"AI Commentary","type":"text","marks":[{"type":"strong"}]},{"text":": Serious, direct assessment of strengths and weaknesses (no sugarcoating)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Improvement Suggestions","type":"text","marks":[{"type":"strong"}]},{"text":": Specific, actionable recommendations for each weakness","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Six-Dimension Radar Score","type":"text","marks":[{"type":"strong"}]},{"text":": 1–10 per dimension","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Overall Score","type":"text","marks":[{"type":"strong"}]},{"text":": Weighted average (Commit Habits 15%, Work Habits 15%, Dev Efficiency 25%, Code Style 15%, Code Quality 20%, Engagement Index inverse 10%)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"One-Line Summary","type":"text","marks":[{"type":"strong"}]},{"text":": A sharp, memorable sentence summarizing this developer","type":"text"}]}]}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"4.3 Team Cross-Comparison","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rankings across all dimensions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Highlight best / worst performers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Overall team health assessment","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Bus factor risk alerts","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Commentary Style Requirements","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Serious and direct","type":"text","marks":[{"type":"strong"}]},{"text":": No sugarcoating, no hedging. Let the data speak — good is good, bad is bad.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Warm but firm","type":"text","marks":[{"type":"strong"}]},{"text":": Point out problems while providing a path to improvement. Critique the work, not the person.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Sharp but fair","type":"text","marks":[{"type":"strong"}]},{"text":": Like a senior Tech Lead conducting an annual Code Review — neither pulling punches nor being cruel.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Data-driven","type":"text","marks":[{"type":"strong"}]},{"text":": Every conclusion MUST be backed by corresponding data. No gut feelings.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Important Notes","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"All data collection uses only native ","type":"text"},{"text":"git","type":"text","marks":[{"type":"code_inline"}]},{"text":" commands — ","type":"text"},{"text":"no pip packages, no Python/Node scripts installed or executed","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Required system binaries:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"git","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"cut","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"sort","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"uniq","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"awk","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"grep","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"sed","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"wc","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"head","type":"text","marks":[{"type":"code_inline"}]},{"text":" — these must be available on the host (pre-installed on most Unix-like systems)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"All user inputs MUST be validated per the \"Security Specification\" rules before execution","type":"text","marks":[{"type":"strong"}]},{"text":" to prevent command injection attacks","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Dry-run mode is recommended for first use","type":"text","marks":[{"type":"strong"}]},{"text":" — review all commands before allowing execution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Enforcement verification:","type":"text","marks":[{"type":"strong"}]},{"text":" Before using on sensitive repos, run the \"Enforcement Verification Protocol\" on a test repository to confirm your agent correctly implements all validation, whitelisting, and redaction rules","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Sensitive data protection:","type":"text","marks":[{"type":"strong"}]},{"text":" Commit messages are processed locally for statistical metrics only (lengths, keyword counts) — ","type":"text"},{"text":"full commit message text is NOT sent to the AI model by default.","type":"text","marks":[{"type":"strong"}]},{"text":" Common secret patterns (API keys, tokens, credentials, connection strings) are automatically redacted before any data leaves the local environment. See \"Sensitive Data Filtering Rules\" for details.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Repository scope:","type":"text","marks":[{"type":"strong"}]},{"text":" The agent only accesses the specific repository path provided — no parent directory traversal or arbitrary filesystem access is permitted","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Developer emails are NOT collected","type":"text","marks":[{"type":"strong"}]},{"text":" to protect personal privacy","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For large repositories, consider limiting the date range to control command execution time","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Be aware that the same person may have different name variants (can be unified via ","type":"text"},{"text":".mailmap","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Timezone differences may affect work-hour analysis — use the timezone from the commit records","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The Engagement Index is based solely on Git commit data and ","type":"text"},{"text":"does NOT reflect non-code contributions","type":"text","marks":[{"type":"strong"}]},{"text":" (design, reviews, mentoring, etc.) — it should not be the sole basis for performance evaluation","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Ethical Use Policy","type":"text"}]},{"type":"paragraph","content":[{"text":"Reports generated by this skill should adhere to the following principles:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Supplementary reference, NOT a decision-making basis","type":"text","marks":[{"type":"strong"}]},{"text":": Reports are for internal team reference only, to help understand collaboration patterns and areas for improvement. ","type":"text"},{"text":"They are strictly prohibited from being used directly for performance reviews, layoff decisions, compensation adjustments, or other HR decisions.","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Transparency","type":"text","marks":[{"type":"strong"}]},{"text":": If using this tool within a team, it is recommended to inform all analyzed team members in advance.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Full context","type":"text","marks":[{"type":"strong"}]},{"text":": Any citation of the report should include complete limitation disclaimers to avoid being taken out of context.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Critique the work, not the person","type":"text","marks":[{"type":"strong"}]},{"text":": The goal is to improve team collaboration processes and individual work methods, not to judge a person's worth.","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"who-is-actor","author":"@skillopedia","source":{"stars":2012,"repo_name":"openclaw-master-skills","origin_url":"https://github.com/leoyeai/openclaw-master-skills/blob/HEAD/skills/who-is-actor/SKILL.md","repo_owner":"leoyeai","body_sha256":"8907a78464a57548711de5419e475e1eddfe4a5b67b381b22ad4aa9fc52cb650","cluster_key":"c7439ea88e58b251403ae6caa5944840d1afbcf807bf53a4a31d0f00422fd666","clean_bundle":{"format":"clean-skill-bundle-v1","source":"leoyeai/openclaw-master-skills/skills/who-is-actor/SKILL.md","attachments":[{"id":"162cb809-2cd6-5339-a815-7167c7662a8b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/162cb809-2cd6-5339-a815-7167c7662a8b/attachment.md","path":"README.md","size":11960,"sha256":"11bee72fca77346cc49b23605d579833f212c7293df715b4932e29a63b321d84","contentType":"text/markdown; charset=utf-8"},{"id":"7ee2404b-42b6-528d-b8e3-ac2f86c6f6c6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7ee2404b-42b6-528d-b8e3-ac2f86c6f6c6/attachment.md","path":"SKILL_CN.md","size":24533,"sha256":"34d684ff8bc5bdfc38dc56af06c202391eb4477b3288c3e2ea869b677eafeb13","contentType":"text/markdown; charset=utf-8"},{"id":"db51755f-ab36-58f3-a55e-b96ac3bc023b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/db51755f-ab36-58f3-a55e-b96ac3bc023b/attachment.json","path":"_meta.json","size":277,"sha256":"5576b0c5be34bab4c8f9900e0730b52eb32b6ae8b694d27bf21ae204909dfe0e","contentType":"application/json; charset=utf-8"},{"id":"d53f3369-2285-5f6b-960b-4ea05c971f0a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d53f3369-2285-5f6b-960b-4ea05c971f0a/attachment.yaml","path":"skill.yaml","size":3711,"sha256":"567c3a51e3d4211f5fcac0a81c3d7e4d4c05c7cb10a355fe3d4339032147dc32","contentType":"application/yaml; charset=utf-8"}],"bundle_sha256":"9dc4a25370d43a3501824f9dddc88d6a8190cac54291cd8f0871ec03afe3fd09","attachment_count":4,"text_attachments":4,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/who-is-actor/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"software-engineering","category_label":"Engineering"},"exact_dupes_collapsed_into_this":0},"license":"MIT","version":"v1","category":"software-engineering","import_tag":"clean-skills-v1","description":"This skill should be used when the user wants to analyze a Git repository and profile each developer's commit habits, work habits, development efficiency, code style, code quality, and engagement index — all without installing any extra packages or running any custom scripts. It relies purely on native git CLI commands (and standard Unix text-processing utilities already present on the host) and AI-driven interpretation. Trigger phrases include \"analyze repository\" \"profile developers\" \"commit habits\" \"developer report card\" \"代码分析\" \"研发效率\" \"开发者画像\" \"提交习惯\" \"工作习惯\" \"参与度\".\n"}},"renderedAt":1782981437470}

Who Is Actor — Git Repository Developer Profiling Skill 🔗 Project Repository: https://github.com/wscats/who-is-actor Zero install dependencies, zero scripts. Collects data purely through native commands and standard Unix text utilities ( , , , , etc. — already present on most systems), interpreted by AI, to generate a serious, direct, and unsparing report card for every developer. "Zero dependency" clarification: This skill installs nothing — no pip packages, no npm modules, no custom scripts. However, it does require the following standard system binaries to be available on the host: , , ,…