- Create comprehensive milestone documentation with sprint goals and timeline - Add 10 detailed GitHub Issues covering infrastructure, backend, frontend, and DevOps - Create automation scripts for milestone and issue creation - Include risk management, acceptance criteria, and project structure 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
299 lines
8.7 KiB
Bash
Executable File
299 lines
8.7 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# 使用 GitHub API 创建 MVP-Sprint-01 里程碑和 Issues
|
||
# 需要设置 GITHUB_TOKEN 环境变量
|
||
|
||
set -e
|
||
|
||
# 检查 GitHub token
|
||
if [ -z "$GITHUB_TOKEN" ]; then
|
||
echo "❌ 错误:请设置 GITHUB_TOKEN 环境变量"
|
||
echo "用法:export GITHUB_TOKEN=your_github_token"
|
||
echo "然后在 GitHub 创建 Personal Access Token: https://github.com/settings/tokens"
|
||
exit 1
|
||
fi
|
||
|
||
REPO="BrunoGao/template"
|
||
API_BASE="https://api.github.com/repos/$REPO"
|
||
MILESTONE_TITLE="MVP-Sprint-01"
|
||
DUE_DATE="2025-10-28T00:00:00Z"
|
||
|
||
echo "🚀 开始创建 MVP-Sprint-01 里程碑和相关 Issues..."
|
||
|
||
# 1. 创建里程碑
|
||
echo "📅 创建里程碑 $MILESTONE_TITLE..."
|
||
MILESTONE_RESPONSE=$(curl -s -X POST \
|
||
-H "Authorization: token $GITHUB_TOKEN" \
|
||
-H "Accept: application/vnd.github.v3+json" \
|
||
"$API_BASE/milestones" \
|
||
-d "{
|
||
\"title\": \"$MILESTONE_TITLE\",
|
||
\"description\": \"完成需求→匹配→合同业务闭环,实现最小可交付版本(2周冲刺)\",
|
||
\"due_on\": \"$DUE_DATE\",
|
||
\"state\": \"open\"
|
||
}")
|
||
|
||
MILESTONE_NUMBER=$(echo "$MILESTONE_RESPONSE" | jq -r '.number')
|
||
echo "✅ 里程碑创建成功,ID: $MILESTONE_NUMBER"
|
||
|
||
# 2. 创建 Issues
|
||
echo "📝 创建 10 个 Issues..."
|
||
|
||
create_issue() {
|
||
local title="$1"
|
||
local labels="$2"
|
||
local body="$3"
|
||
|
||
local response=$(curl -s -X POST \
|
||
-H "Authorization: token $GITHUB_TOKEN" \
|
||
-H "Accept: application/vnd.github.v3+json" \
|
||
"$API_BASE/issues" \
|
||
-d "{
|
||
\"title\": \"$title\",
|
||
\"body\": \"$body\",
|
||
\"labels\": [$(echo "$labels" | sed 's/, /","/g' | sed 's/^/"/' | sed 's/$/"/')],
|
||
\"milestone\": $MILESTONE_NUMBER
|
||
}")
|
||
|
||
local issue_number=$(echo "$response" | jq -r '.number')
|
||
echo "✅ Issue #$issue_number 创建成功: $title"
|
||
echo "$issue_number"
|
||
}
|
||
|
||
# Issue 数据
|
||
declare -a ISSUES=(
|
||
"🧱 Monorepo 基础架构初始化|area:infra,prio:P0|**模块路径**: \`/\`
|
||
|
||
**负责组**: 平台组
|
||
**预估工时**: 16h
|
||
|
||
## 子任务
|
||
- [ ] 初始化 monorepo 目录(platform、web、ops、ci、docs)
|
||
- [ ] 添加 .editorconfig、.gitattributes、.gitignore
|
||
- [ ] 初始化 pnpm workspace + maven multi-module
|
||
- [ ] 添加 CODEOWNERS、CONTRIBUTING.md、README.md
|
||
- [ ] 提交 ADR-001~005(架构、事件、租户、幂等、日志)
|
||
|
||
## 验收标准
|
||
- [ ] make up 一键启动本地开发环境成功
|
||
- [ ] CI lint + build + unit test 均通过
|
||
- [ ] README 描述仓库结构与启动命令清晰
|
||
|
||
## 模块路径
|
||
\`\`\`
|
||
/
|
||
├── platform/
|
||
│ ├── libs/
|
||
│ ├── services/
|
||
│ └── gateway/
|
||
├── web/
|
||
│ ├── admin/
|
||
│ └── bigscreen/
|
||
├── ops/
|
||
├── ci/
|
||
└── docs/
|
||
\`\`\`"
|
||
|
||
"🧩 DM8 数据访问层与 Flyway 初始化|area:backend,risk:dm8|**模块路径**: \`platform/libs/dm8-dal\`
|
||
|
||
**负责组**: 后端组
|
||
**预估工时**: 20h
|
||
|
||
## 子任务
|
||
- [ ] 定制 MyBatis-Plus 达梦方言与分页插件
|
||
- [ ] V1__baseline.sql(所有表)
|
||
- [ ] V1_1__index.sql(索引优化)
|
||
- [ ] 配置 Flyway 自动迁移与版本校验
|
||
- [ ] 添加审计字段与触发器(create/update/delete)
|
||
|
||
## 验收标准
|
||
- [ ] Flyway 能自动初始化 DM8 容器并迁移成功
|
||
- [ ] 插入/分页/更新功能正常
|
||
- [ ] 审计字段自动填充,DDL 符合规范
|
||
|
||
## 依赖
|
||
- [ ] DM8 数据库实例就绪"
|
||
|
||
"🧵 RabbitMQ 事件基础库 (AsyncAPI 对齐)|area:backend,prio:P0|**模块路径**: \`platform/libs/event-starter\`
|
||
|
||
**负责组**: 后端组
|
||
**预估工时**: 18h
|
||
|
||
## 子任务
|
||
- [ ] 实现 EventHeaders(ULID、tenantId、correlationId)
|
||
- [ ] 实现 Publisher + Subscriber 封装类
|
||
- [ ] 定义交换机命名规范(<domain>.events)
|
||
- [ ] 建立重试机制与 DLX(死信)队列策略
|
||
- [ ] 创建示例:DemandCreated 发布与消费
|
||
|
||
## 验收标准
|
||
- [ ] DemandCreated 事件从发布到消费成功
|
||
- [ ] 异常消息进入 DLX 队列
|
||
- [ ] AsyncAPI 校验无错误
|
||
|
||
## 关联文件
|
||
- [AsyncAPI 规范](../../docs/asyncapi.yaml)"
|
||
|
||
"🔐 网关 + Keycloak 多租户透传|area:infra,risk:security|**模块路径**: \`platform/gateway\`
|
||
|
||
**负责组**: 安全组
|
||
**预估工时**: 24h
|
||
|
||
## 子任务
|
||
- [ ] 集成 Keycloak (OIDC)
|
||
- [ ] JWT 校验与租户 tenantId header 注入
|
||
- [ ] 路由权限匹配 Roles
|
||
- [ ] 返回标准化错误体 (401/403/500)
|
||
|
||
## 验收标准
|
||
- [ ] 未登录 401、跨租户访问 403
|
||
- [ ] Token 中 tenantId 在网关透传正确
|
||
- [ ] OpenAPI UI 可访问所有授权 API
|
||
|
||
## 依赖
|
||
- [ ] Keycloak 服务器配置完成"
|
||
|
||
"⚙️ 需求/成果/合同核心服务(OpenAPI-first)|area:backend,prio:P0|**模块路径**: \`platform/services/{demand,achievement,contract}-service\`
|
||
|
||
**负责组**: 后端组
|
||
**预估工时**: 32h
|
||
|
||
## 子任务
|
||
- [ ] 根据 openapi.yaml 自动生成接口
|
||
- [ ] POST /demands 幂等键实现
|
||
- [ ] PUT /demands/{id} 乐观锁(If-Match)
|
||
- [ ] POST /contracts、POST /contracts/{id}/sign
|
||
- [ ] 添加 Pact Provider/Consumer 测试
|
||
|
||
## 验收标准
|
||
- [ ] CRUD 流程通过集成测试
|
||
- [ ] Pact 测试全部通过
|
||
- [ ] k6 冒烟(P95 < 3s)成功
|
||
|
||
## 关联文件
|
||
- [OpenAPI 规范](../../docs/openapi.yaml)"
|
||
|
||
"🧠 AI 匹配服务(FastAPI)|area:ai|**模块路径**: \`platform/ai/\`
|
||
|
||
**负责组**: AI组
|
||
**预估工时**: 24h
|
||
|
||
## 子任务
|
||
- [ ] 实现 POST /match 端点
|
||
- [ ] 构建余弦相似度计算
|
||
- [ ] 输出解释项(feature importance)
|
||
- [ ] 结果写回数据库并发 MatchingCompleted
|
||
|
||
## 验收标准
|
||
- [ ] 匹配请求响应正确
|
||
- [ ] AI 日志可观测
|
||
- [ ] Admin 前端能查看匹配结果和解释"
|
||
|
||
"🗂️ 文件与签署服务(MinIO + PDF 预览)|area:backend,prio:P1|**模块路径**: \`platform/services/file-service\`
|
||
|
||
**负责组**: 后端组
|
||
**预估工时**: 16h
|
||
|
||
## 子任务
|
||
- [ ] 集成 MinIO SDK
|
||
- [ ] 支持 tus 协议断点续传
|
||
- [ ] 文件元数据表 (AttachmentInfo)
|
||
- [ ] PDF.js 在线预览接口
|
||
|
||
## 验收标准
|
||
- [ ] 大文件(>100MB)上传成功
|
||
- [ ] 可续传、秒传、删除权限校验
|
||
- [ ] 签署 PDF 可预览访问
|
||
|
||
## 依赖
|
||
- [ ] MinIO 对象存储服务部署"
|
||
|
||
"🧭 Admin 前端(Vben)— 核心业务模块|area:frontend,prio:P0|**模块路径**: \`web/admin\`
|
||
|
||
**负责组**: 前端组
|
||
**预估工时**: 28h
|
||
|
||
## 子任务
|
||
- [ ] 集成 Keycloak 登录
|
||
- [ ] Axios 拦截器(traceId、tenantId、Idempotency-Key)
|
||
- [ ] 需求列表/详情/新建/编辑
|
||
- [ ] 匹配触发与结果表格(score/reasons)
|
||
- [ ] 合同新建/签署查看
|
||
|
||
## 验收标准
|
||
- [ ] 登录后菜单动态加载
|
||
- [ ] 全链路 CRUD→匹配→签署 流程跑通
|
||
- [ ] E2E 测试(Playwright)通过"
|
||
|
||
"📊 大屏(DataV + ECharts)|area:bigscreen,prio:P1|**模块路径**: \`web/bigscreen\`
|
||
|
||
**负责组**: 前端组
|
||
**预估工时**: 12h
|
||
|
||
## 子任务
|
||
- [ ] KPI 卡片:成果数、需求数、合同额、转化率
|
||
- [ ] 趋势折线 + 地域热力图
|
||
- [ ] 假数据 API /admin/metrics
|
||
|
||
## 验收标准
|
||
- [ ] 1080p/4K 自适应,帧率 > 60fps
|
||
- [ ] 指标卡片动态更新、颜色一致
|
||
- [ ] 与后端指标接口对接正确"
|
||
|
||
"🔍 可观测性 + CI/CD 流水线|area:infra,prio:P0|**模块路径**: \`ops/ + ci/\`
|
||
|
||
**负责组**: DevOps
|
||
**预估工时**: 20h
|
||
|
||
## 子任务
|
||
- [ ] 集成 OpenTelemetry (Java/Python Agent)
|
||
- [ ] Prometheus + Grafana + Loki + Jaeger
|
||
- [ ] GitHub Actions:构建 → 测试 → ZAP → k6 → 构建镜像 → ArgoCD
|
||
- [ ] Grafana 仪表板模板 + PrometheusRule 告警
|
||
|
||
## 验收标准
|
||
- [ ] 任意请求可在 Grafana 中追踪 trace/log
|
||
- [ ] 告警策略触发正确
|
||
- [ ] CI/CD 全链路成功
|
||
|
||
## 依赖
|
||
- [ ] 开发环境 Kubernetes 集群可用"
|
||
)
|
||
|
||
# 创建 Issues 并记录编号
|
||
ISSUE_NUMBERS=()
|
||
echo ""
|
||
for i in "${!ISSUES[@]}"; do
|
||
IFS='|' read -r TITLE LABELS BODY <<< "${ISSUES[$i]}"
|
||
echo "创建 Issue $((i+1))/10: $TITLE"
|
||
|
||
# 转义 body 中的特殊字符
|
||
BODY=$(echo "$BODY" | jq -Rs .)
|
||
|
||
ISSUE_NUMBER=$(create_issue "$TITLE" "$LABELS" "$BODY")
|
||
ISSUE_NUMBERS+=("$ISSUE_NUMBER")
|
||
done
|
||
|
||
echo ""
|
||
echo "🎉 MVP-Sprint-01 里程碑和 Issues 创建完成!"
|
||
echo ""
|
||
echo "📊 创建摘要:"
|
||
echo "- 仓库: $REPO"
|
||
echo "- 里程碑: $MILESTONE_TITLE (ID: $MILESTONE_NUMBER)"
|
||
echo "- 截止日期: $DUE_DATE"
|
||
echo "- Issues 数量: ${#ISSUE_NUMBERS[@]}"
|
||
echo "- 总工时: 210小时 (约 1.3 人月)"
|
||
echo ""
|
||
echo "📋 Issue 列表:"
|
||
for i in "${!ISSUE_NUMBERS[@]}"; do
|
||
IFS='|' read -r TITLE _ _ <<< "${ISSUES[$i]}"
|
||
echo " #${ISSUE_NUMBERS[$i]} $TITLE"
|
||
done
|
||
|
||
echo ""
|
||
echo "📂 相关文档:"
|
||
echo "- 里程碑文档: [docs/milestones/MVP-Sprint-01.md](docs/milestones/MVP-Sprint-01.md)"
|
||
echo "- OpenAPI 规范: [docs/openapi.yaml](docs/openapi.yaml)"
|
||
echo "- AsyncAPI 规范: [docs/asyncapi.yaml](docs/asyncapi.yaml)"
|
||
echo ""
|
||
echo "🔗 GitHub 地址: https://github.com/$REPO/milestone/$MILESTONE_NUMBER" |