
Git Weekly Report Cn
- 28 installs
- 16 repo stars
- Updated July 13, 2026
- yangsonhung/awesome-agent-skills
Helps with ai & agent building tasks.
About
git-weekly-report-cn is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- git-weekly-report-cn
- AI & Agent Building
- AI-coding skill
Git Weekly Report Cn by the numbers
- 28 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #9,505 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 1, 2026 (Skillselion catalog sync)
npx skills add https://github.com/yangsonhung/awesome-agent-skills --skill git-weekly-report-cnAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 28 |
|---|---|
| repo stars | ★ 16 |
| Last updated | July 13, 2026 |
| Repository | yangsonhung/awesome-agent-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
Git 周/日报生成
提取 Git 提交日志并生成结构化周报或日报。
何时使用
当用户有以下需求时使用本技能:
- 从 Git 提交记录生成周报或日报
- 总结昨天或今天的 Git 活动
- 汇总一个或多个仓库的近期 Git 活动
- 回顾某个时间段内完成的工作
- 将提交历史整理为分类报告
- 从提交记录准备每日站会汇总
不要使用
以下场景不应使用本技能:
- 对特定变更的代码审查(请使用 code-reviewer)
- 查看单条提交的详细信息
- 提取日志以外的 Git 操作(分支、合并等)
- 与 Git 无关的报告生成
使用说明
1. 确定日期范围和报告类型:
- 日报:用户说"昨天"、"今天"、"日报"时 — 默认
--since为昨天,--until为今天 - 周报:用户说"这周"、"本周"、"周报"时 — 默认
--since为本周一,--until为今天 - 其他情况:默认最近 7 天。接受用户自定义。
2. 确定作者过滤。如用户指定则使用,默认:全部作者。 3. 确定仓库路径。默认:当前工作目录。如用户提及多个项目,收集所有路径。 4. 运行脚本:
python3 scripts/git_weekly_report.py --since <YYYY-MM-DD> --until <YYYY-MM-DD> [--author <名称>] [--repo <路径1> <路径2> ...]5. 读取 JSON 输出。脚本按仓库分组提供结构化提交数据。 6. 使用 weekly-report-format.md 作为分类指南,按类型归类提交。 7. 使用 weekly-report-template.md 作为输出结构生成最终周报。 8. "下周计划"和"风险阻塞"板块:需向用户确认是否有内容补充,这些信息无法从 Git 日志推导。日报默认不含这些板块,除非用户要求。 9. 呈现最终 Markdown 周报。如用户需要,保存到文件。
脚本使用
# 默认:最近 7 天,当前目录
python3 scripts/git_weekly_report.py
# 指定日期范围
python3 scripts/git_weekly_report.py --since 2026-04-21 --until 2026-04-28
# 指定作者
python3 scripts/git_weekly_report.py --since 2026-04-21 --author "Yang"
# 多个仓库
python3 scripts/git_weekly_report.py --since 2026-04-21 --repo /path/to/project-a /path/to/project-b
# 保存输出到文件
python3 scripts/git_weekly_report.py --since 2026-04-21 --output /tmp/weekly.json
# 包含 merge 提交
python3 scripts/git_weekly_report.py --since 2026-04-21 --mergesJSON 输出结构
脚本输出 JSON,结构如下:
date_range:{ since, until }— 查询的日期范围author_filter: 字符串或 null — 应用的作者过滤repositories:{ path, name, commit_count, commits }数组total_commits: 所有仓库的提交总数
每条提交包含:hash、short_hash、author、date、subject、body、refs。
周报生成
当单个仓库的提交数超过 50 条时,按类别汇总而非逐条列出。始终保留 short_hash 以便追溯。
"进行中的工作"板块,留意以下信号:WIP、TODO、临时方案、未合并的功能分支。
"重要事项"板块,识别:breaking change、安全修复、重大功能上线、涉及关键路径的提交。
周报
周期: {since} - {until} 姓名: {author}
---
本周完成工作
{项目名称}
新增功能
- {commit subject} ({short_hash})
问题修复
- {commit subject} ({short_hash})
代码重构
- {commit subject} ({short_hash})
文档更新
- {commit subject} ({short_hash})
日常维护
- {commit subject} ({short_hash})
---
进行中的工作
- {工作描述}
---
重要事项
- {重要变更或成果}
---
下周计划
- {计划内容 — 需向用户确认}
---
风险与阻塞
- {风险描述 — 需向用户确认}
周报分类指南
Conventional Commit 映射
将提交前缀映射到周报分类:
| 前缀 | 分类 |
|---|---|
feat: | 新增功能 |
fix: | 问题修复 |
refactor: | 代码重构 |
docs: | 文档更新 |
chore: | 日常维护 |
test: | 测试相关 |
perf: | 性能优化 |
style: | 代码风格 |
ci: | CI/CD |
build: | 构建系统 |
非 Conventional Commit
当提交缺少 conventional 前缀时,从关键词推断分类:
- 新增功能: add, implement, create, introduce, support, enable, 新增, 实现
- 问题修复: fix, resolve, repair, patch, workaround, hotfix, 修复, 解决
- 代码重构: refactor, restructure, reorganize, simplify, clean up, migrate, 重构, 迁移
- 文档更新: docs, readme, guide, comment, document, 文档
- 日常维护: update, upgrade, bump, deps, dependency, config, chore, 更新, 升级
- 测试相关: test, spec, coverage, verify, assert, 测试
- 性能优化: optimize, speed, fast, slow, latency, memory, 优化
分组策略
1. 先按项目(仓库名)分组 2. 项目内按分类分组 3. 分类内按时间排序(最新在前) 4. 合并相似提交(如多条 "docs(readme)" 提交 → 一条加数量标注)
进行中工作识别信号
识别可能仍在进行中的工作:
- 主题包含:WIP, TODO, draft, partial, temp, workaround, 临时, 待办
- 正文包含:"still need to", "remaining", "follow-up", "next step", "还需要", "后续"
- 尚未合并到主分支的功能分支
重要事项识别信号
识别值得特别标注的提交:
- 主题包含:breaking, BREAKING, security, critical, important, milestone, 重要, 关键
- 正文包含:"breaking change", "security fix", "migration required", "破坏性变更", "安全修复"
- 大范围变更(单条提交修改文件数 > 10)
- 实现重大功能的首条提交
#!/usr/bin/env python3
"""Extract git commit logs as structured JSON for weekly report generation."""
import argparse
import json
import os
import subprocess
import sys
from datetime import date, timedelta
MAX_BODY_LENGTH = 500
def run_git_log(repo_path, since, until, author=None, no_merges=True):
"""Run git log in a repo and return parsed commit entries."""
cmd = ["git", "-C", repo_path, "log", "--all"]
if no_merges:
cmd.append("--no-merges")
cmd.append(f"--since={since}")
cmd.append(f"--until={until} 23:59:59")
if author:
cmd.append(f"--author={author}")
# %x00 = NUL (record separator), %x01 = SOH (field separator)
cmd.append("--format=%H%x01%h%x01%an%x01%aI%x01%s%x01%b%x01%D%x00")
try:
result = subprocess.run(
cmd, capture_output=True, text=True, encoding="utf-8", errors="replace"
)
except FileNotFoundError:
print("Error: git not found on PATH", file=sys.stderr)
sys.exit(1)
if result.returncode != 0:
print(f"Warning: git log failed for {repo_path}: {result.stderr.strip()}", file=sys.stderr)
return []
commits = []
for record in result.stdout.split("\x00"):
record = record.strip()
if not record:
continue
parts = record.split("\x01")
if len(parts) < 7:
print(f"Warning: skipping malformed record: {record[:80]}", file=sys.stderr)
continue
body = parts[5].strip()
if len(body) > MAX_BODY_LENGTH:
body = body[:MAX_BODY_LENGTH] + "..."
commits.append({
"hash": parts[0],
"short_hash": parts[1],
"author": parts[2],
"date": parts[3],
"subject": parts[4],
"body": body,
"refs": parts[6],
})
return commits
def is_git_repo(path):
"""Check if a path is a git repository."""
try:
result = subprocess.run(
["git", "-C", path, "rev-parse", "--git-dir"],
capture_output=True, text=True, encoding="utf-8", errors="replace"
)
return result.returncode == 0
except FileNotFoundError:
return False
def main():
parser = argparse.ArgumentParser(
description="Extract git commit logs as structured JSON for weekly reports"
)
parser.add_argument(
"--since",
default=None,
help="Start date (YYYY-MM-DD), default: 7 days ago",
)
parser.add_argument(
"--until",
default=None,
help="End date (YYYY-MM-DD), default: today",
)
parser.add_argument(
"--author",
default=None,
help="Filter commits by author (substring match)",
)
parser.add_argument(
"--repo",
nargs="+",
default=None,
help="One or more git repository paths (default: current directory)",
)
parser.add_argument(
"--output",
default=None,
help="Output file path (default: stdout)",
)
parser.add_argument(
"--no-merges",
action="store_true",
default=True,
help="Exclude merge commits (default: True)",
)
parser.add_argument(
"--merges",
action="store_true",
default=False,
help="Include merge commits",
)
args = parser.parse_args()
today = date.today()
since = args.since or (today - timedelta(days=7)).isoformat()
until = args.until or today.isoformat()
no_merges = not args.merges
repos = args.repo or [os.getcwd()]
output = {
"date_range": {"since": since, "until": until},
"author_filter": args.author,
"repositories": [],
"total_commits": 0,
}
for repo_path in repos:
repo_path = os.path.abspath(repo_path)
if not is_git_repo(repo_path):
print(f"Warning: {repo_path} is not a git repository, skipping", file=sys.stderr)
continue
repo_name = os.path.basename(repo_path)
commits = run_git_log(repo_path, since, until, args.author, no_merges)
output["repositories"].append({
"path": repo_path,
"name": repo_name,
"commit_count": len(commits),
"commits": commits,
})
output["total_commits"] += len(commits)
json_str = json.dumps(output, ensure_ascii=False, indent=2)
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(json_str)
else:
print(json_str)
if __name__ == "__main__":
main()