AI 工具开发实战(6):开发一个 AI 周报自动生成器——读 Git 日志,生成周报

每周写周报是程序员的固定动作。这个工具自动读取 Git 提交记录,调用 AI 生成一份结构化的周报。

工具做什么

运行 aicr report --since "7 days ago"
  ↓
1. 读取 Git log(最近 7 天的提交)
2. 按日期和文件分组统计
3. 调用 AI 生成周报
4. 输出 Markdown 格式周报

项目结构

aiweekly/
├── aiweekly.py          # CLI 主程序
├── gitlog.py            # Git 日志解析
├── reporter.py          # AI 周报生成
├── requirements.txt
└── .env

Git 日志解析

# gitlog.py
import subprocess
from datetime import datetime, timedelta
from collections import defaultdict

def get_git_log(since="7 days ago", author=None, repo_path="."):
    """获取 Git 提交记录。"""
    cmd = [
        "git", "-C", repo_path, "log",
        f"--since={since}",
        "--pretty=format:%h|%an|%ad|%s",
        "--date=short",
        "--name-only",
    ]
    if author:
        cmd.append(f"--author={author}")

    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        return []

    commits = []
    lines = result.stdout.strip().split("\n")
    i = 0
    while i = 4:
            commit = {
                "hash": parts[0],
                "author": parts[1],
                "date": parts[2],
                "message": parts[3],
                "files": [],
            }
            i += 1
            while i  1:
                stats["by_file"][parts[0]] += 1
            else:
                stats["by_file"][f] += 1

    return stats

AI 周报生成

# reporter.py
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()

client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com/v1",
)

WEEKLY_PROMPT = """你是一个技术周报撰写助手。根据以下 Git 提交记录生成一份周报。

要求:
1. 用 Markdown 格式
2. 包含以下章节:
   - 📊 本周概况(提交数、影响的模块)
   - 🔧 主要工作(按模块分类,总结每类改动)
   - 🐛 问题修复(如果有 bug fix 类提交)
   - ✨ 新增功能(如果有 feature 类提交)
   - 📝 下周计划(根据当前进展合理推测)
3. 语言简洁专业,避免冗长

提交记录:
{commit_log}

统计信息:
- 总提交数:{total}
- 提交者:{authors}
- 涉及模块:{modules}
"""


def generate_weekly_report(commits, stats):
    """生成周报。"""
    commit_log = "\n".join(
        f"[{c['date']}] {c['author']}: {c['message']}"
        for c in commits[:100]  # 限制最多 100 条
    )

    authors = ", ".join(
        f"{k}({v}次)" for k, v in
        sorted(stats["by_author"].items(), key=lambda x: -x[1])
    )
    modules = ", ".join(
        f"{k}({v})" for k, v in
        sorted(stats["by_file"].items(), key=lambda x: -x[1])[:10]
    )

    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[{
            "role": "system",
            "content": WEEKLY_PROMPT.format(
                commit_log=commit_log,
                total=stats["total_commits"],
                authors=authors,
                modules=modules,
            ),
        }],
        temperature=0.3,
        max_tokens=2048,
    )
    return response.choices[0].message.content

CLI 主程序

#!/usr/bin/env python3
# aiweekly.py
import click
from gitlog import get_git_log, analyze_commits
from reporter import generate_weekly_report


@click.group()
def cli():
    """aiweekly - AI 周报生成器"""
    pass


@cli.command()
@click.option("--since", "-s", default="7 days ago", help="起始时间")
@click.option("--author", "-a", default=None, help="按作者筛选")
@click.option("--output", "-o", default=None, help="输出文件(默认打印到终端)")
@click.option("--path", "-p", default=".", help="Git 仓库路径")
def report(since, author, output, path):
    """生成周报。"""
    click.echo(f"📊 正在分析 {since} 以来的提交记录...")

    commits = get_git_log(since=since, author=author, repo_path=path)
    if not commits:
        click.echo("❌ 没有找到提交记录")
        return

    stats = analyze_commits(commits)
    click.echo(f"✅ 找到 {stats['total_commits']} 条提交记录")

    click.echo("🤖 AI 正在生成周报...")
    report = generate_weekly_report(commits, stats)

    if output:
        with open(output, "w", encoding="utf-8") as f:
            f.write(report)
        click.echo(f"✅ 周报已保存到 {output}")
    else:
        click.echo("\n" + report)


@cli.command()
@click.option("--since", "-s", default="7 days ago")
@click.option("--path", "-p", default=".")
def stats(since, path):
    """查看提交统计(不生成周报)。"""
    commits = get_git_log(since=since, repo_path=path)
    if not commits:
        click.echo("❌ 没有提交记录")
        return

    s = analyze_commits(commits)
    click.echo(f"📊 {since} 以来的统计:")
    click.echo(f"  总提交:{s['total_commits']}")
    click.echo(f"  提交者:{dict(s['by_author'])}")
    click.echo(f"  提交日期:{dict(sorted(s['by_date'].items()))}")


if __name__ == "__main__":
    cli()

使用方式

# 生成本周周报
aiweekly report --since "7 days ago"

# 📊 正在分析 7 days ago 以来的提交记录...
# ✅ 找到 23 条提交记录
# 🤖 AI 正在生成周报...
#
# ## 📊 本周概况
# 本周共完成 23 次提交,涉及 api、models、frontend 等 8 个模块...
#
# ## 🔧 主要工作
# ### API 层(8 次提交)
# - 新增用户认证中间件
# - 优化知识库查询接口性能
# ...

# 保存到文件
aiweekly report -o weekly_report.md

# 查看统计
aiweekly stats
# 📊 7 days ago 以来的统计:
#   总提交:23
#   提交者:{'张三': 15, '李四': 8}

成本

一次周报生成约 2000-5000 token,费用约 ¥0.01-0.02。

总结

AI 周报生成器的核心:
1. 用 git log 获取原始数据
2. 统计分类(按日期、作者、模块)
3. 把数据喂给 AI → 生成结构化周报

比手工写省 90% 的时间,比模板填空效果好。


本文是 《AI 开发者工具链实战》 系列的第 6 篇。
本文由 Zyentor(智元界)原创发布