Files
awoooi/docs/operations/WEEKLY_REPORT_SOP.md
OG T 7478dc0254 feat(phase6-9): Complete modular architecture and Agent Teams
Phase 6.4 - Modular Architecture:
- Add lewooogo-brain adapters for LLM providers
- Add lewooogo-data dual memory (Redis + PostgreSQL)
- Implement consensus engine for multi-agent decisions
- Add incident memory service for historical context

Phase 9 - Agent Teams (Claude Agent SDK):
- Add base agent class with Claude Sonnet 4 integration
- Implement action planner, blast radius, and security agents
- Add agent API endpoints and proposal workflow
- Integrate ADR-009 OpenClaw Agent Teams architecture

DevOps & CI/CD:
- Add GitHub Actions CI/CD workflows (ci.yaml, cd.yaml)
- Add pre-commit hooks and secrets baseline
- Add docker-compose for local development
- Update Kubernetes network policies

Frontend Improvements:
- Add auto-healing error boundary component
- Update i18n messages for agent features
- Enhance dual-state incident card with execution feedback

Documentation:
- Add 7 ADRs covering MCP, design system, architecture decisions
- Update ARCHITECTURE_MEMORY.md with modular design
- Add GLOBAL_RULES.md and SOUL.md for project identity

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-23 18:40:36 +08:00

10 KiB

AWOOOI 週報自動化機制

版本: v1.0 建立日期: 2026-03-20 負責人: CTO CEO 指示 #6: 增加每週工作週報機制


概述

系統自動將該週各單位所有處理的工作,依照報告格式發出到 Email。


週報生成流程

┌─────────────────────────────────────────────────────────┐
│ 每週五 17:00 觸發                                        │
└─────────────────────────────────────────────────────────┘
                        │
                        ▼
┌─────────────────────────────────────────────────────────┐
│ 1. 收集各單位工作記錄                                    │
│    - Git commits (by author)                            │
│    - 部署記錄                                            │
│    - 告警處理記錄                                        │
│    - 工單完成記錄                                        │
│    - 審批記錄                                            │
└─────────────────────────────────────────────────────────┘
                        │
                        ▼
┌─────────────────────────────────────────────────────────┐
│ 2. AI 生成摘要                                          │
│    - 按單位分組                                         │
│    - 提取關鍵成果                                        │
│    - 識別風險項目                                        │
└─────────────────────────────────────────────────────────┘
                        │
                        ▼
┌─────────────────────────────────────────────────────────┐
│ 3. 生成報告                                             │
│    - HTML 格式 (Email)                                  │
│    - Markdown 格式 (歸檔)                               │
└─────────────────────────────────────────────────────────┘
                        │
                        ▼
┌─────────────────────────────────────────────────────────┐
│ 4. 發送 Email                                           │
│    - 收件人: C-Level + 團隊成員                          │
│    - 抄送: CEO                                          │
└─────────────────────────────────────────────────────────┘

週報格式

Email 範本

<!DOCTYPE html>
<html>
<head>
  <style>
    body { font-family: 'Inter', sans-serif; }
    .header { background: #0A0A0A; color: white; padding: 20px; }
    .section { margin: 20px 0; padding: 15px; background: #F5F5F5; }
    .metric { display: inline-block; margin: 10px; text-align: center; }
    .metric-value { font-size: 24px; font-weight: bold; }
    .status-success { color: #10B981; }
    .status-warning { color: #F59E0B; }
    .status-critical { color: #EF4444; }
  </style>
</head>
<body>
  <div class="header">
    <h1>AWOOOI 週報</h1>
    <p>{{week_start}} - {{week_end}}</p>
  </div>

  <div class="section">
    <h2>📊 本週摘要</h2>
    <div class="metric">
      <div class="metric-value">{{total_commits}}</div>
      <div>Commits</div>
    </div>
    <div class="metric">
      <div class="metric-value">{{total_deployments}}</div>
      <div>部署次數</div>
    </div>
    <div class="metric">
      <div class="metric-value">{{alerts_resolved}}</div>
      <div>告警處理</div>
    </div>
    <div class="metric">
      <div class="metric-value">{{tickets_closed}}</div>
      <div>工單完成</div>
    </div>
  </div>

  <div class="section">
    <h2>👥 各單位工作</h2>

    <h3>CTO 技術團隊</h3>
    <ul>
      {{#each cto_items}}
      <li>{{this}}</li>
      {{/each}}
    </ul>

    <h3>CIO 基建團隊</h3>
    <ul>
      {{#each cio_items}}
      <li>{{this}}</li>
      {{/each}}
    </ul>

    <h3>CPO 產品團隊</h3>
    <ul>
      {{#each cpo_items}}
      <li>{{this}}</li>
      {{/each}}
    </ul>

    <h3>CISO 安全團隊</h3>
    <ul>
      {{#each ciso_items}}
      <li>{{this}}</li>
      {{/each}}
    </ul>
  </div>

  <div class="section">
    <h2>⚠️ 風險與待辦</h2>
    <ul>
      {{#each risks}}
      <li class="status-{{this.severity}}">{{this.description}}</li>
      {{/each}}
    </ul>
  </div>

  <div class="section">
    <h2>📅 下週計畫</h2>
    <ul>
      {{#each next_week_plans}}
      <li>{{this}}</li>
      {{/each}}
    </ul>
  </div>

  <footer style="margin-top: 20px; color: #6B7280; font-size: 12px;">
    <p>此報告由 AWOOOI 系統自動生成</p>
    <p>生成時間: {{generated_at}}</p>
  </footer>
</body>
</html>

資料來源

Git Commits

# 取得本週 commits
async def get_weekly_commits(start_date: date, end_date: date) -> list[CommitSummary]:
    result = subprocess.run(
        [
            "git", "log",
            f"--since={start_date}",
            f"--until={end_date}",
            "--pretty=format:%H|%an|%ae|%s|%ai",
            "--no-merges"
        ],
        capture_output=True,
        text=True
    )

    commits = []
    for line in result.stdout.strip().split("\n"):
        hash, author, email, subject, date = line.split("|")
        commits.append(CommitSummary(
            hash=hash,
            author=author,
            email=email,
            subject=subject,
            date=date
        ))

    return commits

部署記錄

async def get_weekly_deployments(start_date: date, end_date: date) -> list[Deployment]:
    async with get_db() as db:
        return await db.execute(
            select(Deployment)
            .where(Deployment.created_at >= start_date)
            .where(Deployment.created_at < end_date)
            .order_by(Deployment.created_at.desc())
        ).scalars().all()

告警處理

async def get_weekly_alerts(start_date: date, end_date: date) -> AlertSummary:
    async with get_db() as db:
        total = await db.execute(
            select(func.count(Alert.id))
            .where(Alert.created_at >= start_date)
            .where(Alert.created_at < end_date)
        ).scalar()

        resolved = await db.execute(
            select(func.count(Alert.id))
            .where(Alert.resolved_at >= start_date)
            .where(Alert.resolved_at < end_date)
        ).scalar()

        return AlertSummary(total=total, resolved=resolved)

單位分組邏輯

根據 Git Author Email 分組

TEAM_MAPPING = {
    "cto": ["cto@wooo.work", "dev@wooo.work", "backend@wooo.work"],
    "cio": ["cio@wooo.work", "infra@wooo.work", "ops@wooo.work"],
    "cpo": ["cpo@wooo.work", "frontend@wooo.work", "design@wooo.work"],
    "ciso": ["ciso@wooo.work", "security@wooo.work"],
}

def get_team_by_email(email: str) -> str:
    for team, emails in TEAM_MAPPING.items():
        if email in emails:
            return team
    return "other"

根據工作類型分組

WORK_TYPE_MAPPING = {
    "cto": ["api", "backend", "database", "ai"],
    "cio": ["k8s", "nginx", "monitoring", "network"],
    "cpo": ["ui", "frontend", "design", "i18n"],
    "ciso": ["security", "rbac", "audit", "encryption"],
}

AI 摘要生成

async def generate_ai_summary(weekly_data: WeeklyData) -> str:
    prompt = f"""
    請根據以下本週工作資料,生成簡潔的週報摘要:

    ## Commits ({len(weekly_data.commits)} 筆)
    {[c.subject for c in weekly_data.commits[:20]]}

    ## 部署 ({len(weekly_data.deployments)} 次)
    {[d.description for d in weekly_data.deployments]}

    ## 告警處理
    - 總數: {weekly_data.alerts.total}
    - 已解決: {weekly_data.alerts.resolved}

    請用繁體中文,按 CTO/CIO/CPO/CISO 分組,每組列出 3-5 項關鍵工作。
    同時指出本週的風險項目和下週建議關注點。
    """

    return await ai_router.generate(prompt, system_user_id="weekly-report")

K8s CronJob 配置

# k8s/jobs/weekly-report-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: awoooi-weekly-report
  namespace: awoooi-prod
spec:
  schedule: "0 17 * * 5"  # 每週五 17:00
  timeZone: "Asia/Taipei"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: report-generator
              image: awoooi-api:latest
              command: ["python", "-m", "app.jobs.weekly_report"]
              env:
                - name: SMTP_HOST
                  valueFrom:
                    secretKeyRef:
                      name: awoooi-secrets
                      key: SMTP_HOST
                - name: SMTP_USER
                  valueFrom:
                    secretKeyRef:
                      name: awoooi-secrets
                      key: SMTP_USER
                - name: SMTP_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: awoooi-secrets
                      key: SMTP_PASSWORD
          restartPolicy: OnFailure

收件人配置

# 環境變數配置
WEEKLY_REPORT_RECIPIENTS:
  - ceo@wooo.work
  - cto@wooo.work
  - cio@wooo.work
  - cpo@wooo.work
  - ciso@wooo.work

WEEKLY_REPORT_CC:
  - all-team@wooo.work

報告歸檔

每週報告自動保存至:

docs/reports/weekly/
├── 2026-W12.md
├── 2026-W13.md
└── ...

變更記錄

日期 版本 變更 作者
2026-03-20 v1.0 初版建立 CTO

此文件由 CTO 維護,定義週報自動化機制的規範。