commit
0f1dc42495
521
.claude/commands/gitea/API-QUICK-REFERENCE.md
Normal file
521
.claude/commands/gitea/API-QUICK-REFERENCE.md
Normal file
@ -0,0 +1,521 @@
|
|||||||
|
# Gitea API 快速参考
|
||||||
|
|
||||||
|
**文档版本**: 1.1 | **更新日期**: 2026-03-19 | **验证状态**: ✅ 100% 通过
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔑 快速配置
|
||||||
|
|
||||||
|
### 环境变量(.env)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 必需配置
|
||||||
|
GITEA_URL=http://192.168.2.200:3000 # Gitea 实例地址(HTTP/HTTPS 格式)
|
||||||
|
GITEA_TOKEN=your-api-token-here # 需要 write:user, write:repository, write:issue
|
||||||
|
GITEA_OWNER=your-username # 用户名或组织名
|
||||||
|
|
||||||
|
# 加载配置
|
||||||
|
export $(cat .env | grep -v '^#' | xargs)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 通用请求头
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 所有 API 请求都需要的请求头
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 验证配置
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 测试连接是否正常
|
||||||
|
curl -s -X GET "${GITEA_URL}/api/v1/user" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" | jq '.login'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 仓库操作
|
||||||
|
|
||||||
|
### 创建仓库
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
POST /api/v1/user/repos
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/user/repos" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"name": "my-repo",
|
||||||
|
"description": "仓库描述",
|
||||||
|
"private": false,
|
||||||
|
"auto_init": true,
|
||||||
|
"default_branch": "main"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# 状态码: 201 Created
|
||||||
|
```
|
||||||
|
|
||||||
|
### 获取仓库
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
GET /api/v1/repos/{owner}/{repo}
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
curl -X GET "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}"
|
||||||
|
|
||||||
|
# 状态码: 200 OK
|
||||||
|
```
|
||||||
|
|
||||||
|
### 列出仓库
|
||||||
|
```bash
|
||||||
|
GET /api/v1/user/repos?limit=50
|
||||||
|
```
|
||||||
|
|
||||||
|
### 删除仓库
|
||||||
|
```bash
|
||||||
|
DELETE /api/v1/repos/{owner}/{repo}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐛 Issue 操作
|
||||||
|
|
||||||
|
### 创建 Issue
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
POST /api/v1/repos/{owner}/{repo}/issues
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/issues" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"title": "实现新功能",
|
||||||
|
"body": "## 功能描述\n\n详细说明(支持 Markdown)"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# 状态码: 201 Created
|
||||||
|
```
|
||||||
|
|
||||||
|
### 列出 Issues
|
||||||
|
```bash
|
||||||
|
GET /api/v1/repos/{owner}/{repo}/issues?state=open
|
||||||
|
```
|
||||||
|
|
||||||
|
### 更新 Issue
|
||||||
|
```bash
|
||||||
|
PATCH /api/v1/repos/{owner}/{repo}/issues/{index}
|
||||||
|
{
|
||||||
|
"title": "新标题",
|
||||||
|
"state": "closed"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 添加评论
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
POST /api/v1/repos/{owner}/{repo}/issues/{index}/comments
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/issues/1/comments" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"body": "这是一条评论(支持 **Markdown**)"}'
|
||||||
|
|
||||||
|
# 状态码: 201 Created
|
||||||
|
```
|
||||||
|
|
||||||
|
### 关闭 Issue
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
PATCH /api/v1/repos/{owner}/{repo}/issues/{index}
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
curl -X PATCH "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/issues/1" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"state": "closed"}'
|
||||||
|
|
||||||
|
# 状态码: 201 Created
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌿 分支操作
|
||||||
|
|
||||||
|
### 创建分支
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
POST /api/v1/repos/{owner}/{repo}/branches
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/branches" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"new_branch_name": "feature/new-feature",
|
||||||
|
"old_branch_name": "main"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# 状态码: 201 Created
|
||||||
|
```
|
||||||
|
|
||||||
|
### 删除分支
|
||||||
|
```bash
|
||||||
|
DELETE /api/v1/repos/{owner}/{repo}/branches/{branch}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔀 Pull Request 操作
|
||||||
|
|
||||||
|
### 创建 PR
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
POST /api/v1/repos/{owner}/{repo}/pulls
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/pulls" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"title": "实现新功能",
|
||||||
|
"body": "Closes #1\n\n## 实现说明\n\n详细描述...",
|
||||||
|
"head": "feature/new-feature",
|
||||||
|
"base": "main"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# 状态码: 201 Created
|
||||||
|
```
|
||||||
|
|
||||||
|
### 创建 PR 审查
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
POST /api/v1/repos/{owner}/{repo}/pulls/{index}/reviews
|
||||||
|
|
||||||
|
# 示例(批准)
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/pulls/1/reviews" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"event": "APPROVE",
|
||||||
|
"body": "✅ 代码审查通过"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# 状态码: 200 OK
|
||||||
|
```
|
||||||
|
|
||||||
|
**⚠️ 重要说明**:
|
||||||
|
- ✅ 审查创建时已立即生效(有 `submitted_at` 时间戳)
|
||||||
|
- ℹ️ 返回的 `state` 字段可能显示为 `PENDING`,但审查已生效
|
||||||
|
- ✅ 不影响 PR 合并,一步创建即可
|
||||||
|
- 📖 详见: `docs/PR-REVIEW-SOLUTION.md`
|
||||||
|
|
||||||
|
### 合并 PR
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
POST /api/v1/repos/{owner}/{repo}/pulls/{index}/merge
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/pulls/1/merge" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"Do": "merge",
|
||||||
|
"merge_message": "合并 PR #1 - 实现新功能"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# 状态码: 200 OK
|
||||||
|
# Do 选项: merge(合并提交), squash(压缩合并), rebase(变基合并)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 文件操作
|
||||||
|
|
||||||
|
### 创建文件
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
POST /api/v1/repos/{owner}/{repo}/contents/{filepath}
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
# 1. Base64 编码文件内容
|
||||||
|
CONTENT=$(echo "# My File\n\nContent here..." | base64 | tr -d '\n')
|
||||||
|
|
||||||
|
# 2. 创建文件
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/contents/README.md" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{
|
||||||
|
\"message\": \"docs: Add README\",
|
||||||
|
\"content\": \"${CONTENT}\",
|
||||||
|
\"branch\": \"main\"
|
||||||
|
}"
|
||||||
|
|
||||||
|
# 状态码: 201 Created
|
||||||
|
```
|
||||||
|
|
||||||
|
### 读取文件
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
GET /api/v1/repos/{owner}/{repo}/contents/{filepath}?ref={branch}
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
curl -X GET "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/contents/README.md?ref=main" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}"
|
||||||
|
|
||||||
|
# 状态码: 200 OK
|
||||||
|
# 返回内容为 base64 编码
|
||||||
|
```
|
||||||
|
|
||||||
|
### 更新文件
|
||||||
|
```bash
|
||||||
|
# API 端点
|
||||||
|
PUT /api/v1/repos/{owner}/{repo}/contents/{filepath}
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
# 1. 获取文件 SHA
|
||||||
|
SHA=$(curl -s -X GET "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/contents/README.md" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" | jq -r '.sha')
|
||||||
|
|
||||||
|
# 2. 更新文件
|
||||||
|
NEW_CONTENT=$(echo "# Updated" | base64 | tr -d '\n')
|
||||||
|
|
||||||
|
curl -X PUT "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/my-repo/contents/README.md" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{
|
||||||
|
\"message\": \"docs: Update README\",
|
||||||
|
\"content\": \"${NEW_CONTENT}\",
|
||||||
|
\"sha\": \"${SHA}\",
|
||||||
|
\"branch\": \"main\"
|
||||||
|
}"
|
||||||
|
|
||||||
|
# 状态码: 200 OK
|
||||||
|
```
|
||||||
|
|
||||||
|
### 删除文件
|
||||||
|
```bash
|
||||||
|
DELETE /api/v1/repos/{owner}/{repo}/contents/{filepath}
|
||||||
|
{
|
||||||
|
"message": "删除信息",
|
||||||
|
"sha": "文件SHA",
|
||||||
|
"branch": "main"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 完整工作流示例
|
||||||
|
|
||||||
|
### 创建仓库 + Issue + PR + 合并
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# 完整工作流示例
|
||||||
|
|
||||||
|
# 1. 加载环境变量
|
||||||
|
export $(cat .env | grep -v '^#' | xargs)
|
||||||
|
|
||||||
|
# 2. 创建仓库
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/user/repos" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"name":"demo","auto_init":true}'
|
||||||
|
|
||||||
|
# 3. 创建 Issue
|
||||||
|
ISSUE=$(curl -s -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/demo/issues" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"title":"实现功能","body":"描述"}')
|
||||||
|
|
||||||
|
ISSUE_NUM=$(echo $ISSUE | jq -r '.number')
|
||||||
|
|
||||||
|
# 4. 创建分支
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/demo/branches" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"new_branch_name":"feature/demo"}'
|
||||||
|
|
||||||
|
# 5. 添加文件
|
||||||
|
CONTENT=$(echo "# Demo" | base64 | tr -d '\n')
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/demo/contents/test.md" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"message\":\"Add file\",\"content\":\"${CONTENT}\",\"branch\":\"feature/demo\"}"
|
||||||
|
|
||||||
|
# 6. 创建 PR
|
||||||
|
PR=$(curl -s -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/demo/pulls" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"title\":\"实现功能\",\"body\":\"Closes #${ISSUE_NUM}\",\"head\":\"feature/demo\",\"base\":\"main\"}")
|
||||||
|
|
||||||
|
PR_NUM=$(echo $PR | jq -r '.number')
|
||||||
|
|
||||||
|
# 7. 创建审查
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/demo/pulls/${PR_NUM}/reviews" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"event":"APPROVE","body":"审查通过"}'
|
||||||
|
|
||||||
|
# 8. 合并 PR
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/demo/pulls/${PR_NUM}/merge" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"Do":"merge"}'
|
||||||
|
|
||||||
|
# 9. 关闭 Issue
|
||||||
|
curl -X PATCH "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/demo/issues/${ISSUE_NUM}" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"state":"closed"}'
|
||||||
|
|
||||||
|
echo "✅ 工作流完成!"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 快速命令参考
|
||||||
|
|
||||||
|
### 最常用命令
|
||||||
|
|
||||||
|
### 快速创建仓库
|
||||||
|
```bash
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/user/repos" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"name":"test","auto_init":true}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 快速创建 Issue
|
||||||
|
```bash
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/repo/issues" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"title":"Bug report","body":"Description"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 快速创建分支
|
||||||
|
```bash
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/repo/branches" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"new_branch_name":"feature/new"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 快速创建 PR
|
||||||
|
```bash
|
||||||
|
curl -X POST "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/repo/pulls" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"title":"New feature","head":"feature/new","base":"main"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 HTTP 状态码
|
||||||
|
|
||||||
|
| 状态码 | 说明 |
|
||||||
|
|--------|------|
|
||||||
|
| 200 | 成功 |
|
||||||
|
| 201 | 创建成功 |
|
||||||
|
| 204 | 删除成功(无内容) |
|
||||||
|
| 401 | 未授权 |
|
||||||
|
| 403 | 权限不足 |
|
||||||
|
| 404 | 资源不存在 |
|
||||||
|
| 409 | 冲突 |
|
||||||
|
| 422 | 参数错误 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 辅助函数
|
||||||
|
|
||||||
|
### Bash 辅助函数
|
||||||
|
```bash
|
||||||
|
# 通用 API 调用函数
|
||||||
|
gitea_api() {
|
||||||
|
curl -s -X $1 "${GITEA_URL}/api/v1$2" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
${3:+-d "$3"}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 使用示例
|
||||||
|
gitea_api GET "/user/repos"
|
||||||
|
gitea_api POST "/user/repos" '{"name":"test"}'
|
||||||
|
gitea_api PATCH "/repos/owner/repo/issues/1" '{"state":"closed"}'
|
||||||
|
gitea_api DELETE "/repos/owner/repo"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Base64 编码辅助
|
||||||
|
```bash
|
||||||
|
# 文件内容编码
|
||||||
|
encode_content() {
|
||||||
|
echo "$1" | base64 | tr -d '\n'
|
||||||
|
}
|
||||||
|
|
||||||
|
# 使用示例
|
||||||
|
CONTENT=$(encode_content "# My File\n\nContent here...")
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎓 最佳实践
|
||||||
|
|
||||||
|
1. **使用环境变量** - 不要硬编码 Token
|
||||||
|
2. **添加错误处理** - 检查 HTTP 状态码
|
||||||
|
3. **实现幂等性** - 检查资源是否存在
|
||||||
|
4. **添加日志** - 记录操作历史
|
||||||
|
5. **控制速率** - 避免请求过快
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ API 验证状态
|
||||||
|
|
||||||
|
**最后验证**: 2026-03-19
|
||||||
|
|
||||||
|
| 功能类别 | 测试数 | 通过率 | 状态码 |
|
||||||
|
|---------|--------|--------|--------|
|
||||||
|
| 仓库操作 | 2 | 100% | 200, 201 |
|
||||||
|
| Issue 操作 | 3 | 100% | 201 |
|
||||||
|
| 分支操作 | 1 | 100% | 201 |
|
||||||
|
| 文件操作 | 3 | 100% | 200, 201 |
|
||||||
|
| Pull Request | 3 | 100% | 200, 201 |
|
||||||
|
| **总计** | **12** | **100%** | ✅ |
|
||||||
|
|
||||||
|
**关键发现**:
|
||||||
|
- ✅ 所有 API 端点已验证通过
|
||||||
|
- ✅ PR 审查功能正常(PENDING 状态不影响功能)
|
||||||
|
- ✅ 可以放心使用
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎓 最佳实践
|
||||||
|
|
||||||
|
1. **使用环境变量** - 不要硬编码 Token
|
||||||
|
2. **添加错误处理** - 检查 HTTP 状态码
|
||||||
|
3. **实现幂等性** - 检查资源是否存在
|
||||||
|
4. **添加日志** - 记录操作历史
|
||||||
|
5. **控制速率** - 避免请求过快(添加 `sleep 1`)
|
||||||
|
6. **验证配置** - 首次使用前验证连接
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 完整文档
|
||||||
|
|
||||||
|
- **API 操作指南**: `docs/API-OPERATIONS-GUIDE.md` - 详细说明和示例
|
||||||
|
- **API 验证报告**: `docs/API-VALIDATION-TEST-REPORT.md` - 完整测试结果
|
||||||
|
- **PR 审查说明**: `docs/PR-REVIEW-SOLUTION.md` - PR 审查问题解决
|
||||||
|
- **示例脚本**: `examples/complete-workflow.sh` - 完整工作流示例
|
||||||
|
- **配置指南**: `docs/CONFIGURATION.md` - 环境变量配置
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**快速参考版本**: 1.1
|
||||||
|
**最后更新**: 2026-03-19
|
||||||
|
**文档维护**: Claude Code
|
||||||
|
**验证状态**: ✅ 100% 通过
|
||||||
331
.claude/commands/gitea/init-project.md
Normal file
331
.claude/commands/gitea/init-project.md
Normal file
@ -0,0 +1,331 @@
|
|||||||
|
---
|
||||||
|
name: gitea-init-project
|
||||||
|
description: 初始化项目,创建 Gitea 仓库和 Issues
|
||||||
|
arguments:
|
||||||
|
- name: requirements_file
|
||||||
|
description: requirements 文件路径(可选,支持相对路径。如果不指定,将自动查找最相关的 requirements.md)
|
||||||
|
required: false
|
||||||
|
- name: repo_name
|
||||||
|
description: 仓库名称(可选,如果不提供则从 requirements.md 读取)
|
||||||
|
required: false
|
||||||
|
---
|
||||||
|
|
||||||
|
读取 requirements.md,分析需求,拆分为 Issues,并创建 Gitea 仓库。
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
|
||||||
|
### 第一步:选择需求文档
|
||||||
|
|
||||||
|
#### 情况 1:用户指定了文件路径
|
||||||
|
|
||||||
|
如果用户提供了 `requirements_file` 参数:
|
||||||
|
1. 检查文件是否存在
|
||||||
|
2. 如果存在,直接使用该文件
|
||||||
|
3. 如果不存在,提示错误并退出
|
||||||
|
|
||||||
|
#### 情况 2:用户未指定文件路径
|
||||||
|
|
||||||
|
自动查找最合适的 requirements.md:
|
||||||
|
|
||||||
|
**步骤 2.1: 搜索所有 requirements.md 文件**
|
||||||
|
```bash
|
||||||
|
# 搜索项目中所有的 requirements*.md 文件
|
||||||
|
find . -type f -name "*requirements*.md" 2>/dev/null
|
||||||
|
```
|
||||||
|
|
||||||
|
**步骤 2.2: 分析 Git 历史**
|
||||||
|
```bash
|
||||||
|
# 获取每个文件的 Git 历史
|
||||||
|
for file in $(find . -type f -name "*requirements*.md"); do
|
||||||
|
# 最后修改时间
|
||||||
|
last_modified=$(git log -1 --format="%at" "$file" 2>/dev/null || echo "0")
|
||||||
|
|
||||||
|
# 修改次数
|
||||||
|
commit_count=$(git log --oneline "$file" 2>/dev/null | wc -l)
|
||||||
|
|
||||||
|
# 最后修改者
|
||||||
|
last_author=$(git log -1 --format="%an" "$file" 2>/dev/null || echo "Unknown")
|
||||||
|
|
||||||
|
echo "$file|$last_modified|$commit_count|$last_author"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
**步骤 2.3: 评分和选择**
|
||||||
|
|
||||||
|
基于以下因素计算评分:
|
||||||
|
- **最近修改时间**(权重 40%):最近修改的文件得分更高
|
||||||
|
- **修改次数**(权重 30%):修改次数多说明文档更完善
|
||||||
|
- **文件位置**(权重 20%):根目录的文件优先级更高
|
||||||
|
- **文件内容**(权重 10%):内容更丰富的文件优先
|
||||||
|
|
||||||
|
选择评分最高的文件。
|
||||||
|
|
||||||
|
**步骤 2.4: 内容相似度检查(可选)**
|
||||||
|
|
||||||
|
如果找到多个文件且评分接近,进行内容相似度分析:
|
||||||
|
1. 读取每个文件的前 100 行
|
||||||
|
2. 比较项目名称、描述等关键信息
|
||||||
|
3. 选择内容最完整的文档
|
||||||
|
|
||||||
|
#### 示例输出
|
||||||
|
|
||||||
|
```
|
||||||
|
🔍 搜索需求文档
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
找到 3 个 requirements 文件:
|
||||||
|
• ./requirements.md (评分: 85)
|
||||||
|
• ./docs/requirements-v2.md (评分: 78)
|
||||||
|
• ./archive/requirements-old.md (评分: 45)
|
||||||
|
|
||||||
|
✅ 选择最相关的文档: ./requirements.md
|
||||||
|
|
||||||
|
📊 选择依据:
|
||||||
|
• 最后修改: 2 天前
|
||||||
|
• 修改次数: 5 次
|
||||||
|
• 文件位置: 根目录
|
||||||
|
• 文件大小: 132 行
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第二步:读取需求文档
|
||||||
|
|
||||||
|
1. 使用 Read 工具读取选定文件的内容
|
||||||
|
2. 如果文件不存在或无法读取,提示用户先运行 `/gitea-start` 创建需求文档
|
||||||
|
|
||||||
|
### 第二步:解析需求文档
|
||||||
|
|
||||||
|
解析以下信息:
|
||||||
|
- **项目基本信息**:名称、描述、类型
|
||||||
|
- **核心功能**:列出所有核心功能点
|
||||||
|
- **技术栈**:
|
||||||
|
- 编程语言
|
||||||
|
- 框架(前端/后端)
|
||||||
|
- 数据库
|
||||||
|
- 其他工具
|
||||||
|
- **功能模块**:识别所有功能模块
|
||||||
|
- **依赖关系**:模块间的依赖关系
|
||||||
|
- **开发里程碑**:开发阶段和任务
|
||||||
|
|
||||||
|
### 第三步:拆分 Issues
|
||||||
|
|
||||||
|
根据需求拆分为以下类型的 Issues:
|
||||||
|
|
||||||
|
#### 1. 项目基础设置 Issue
|
||||||
|
- 标题:`[基础] 项目初始化和环境配置`
|
||||||
|
- 内容:
|
||||||
|
- 初始化项目结构
|
||||||
|
- 配置开发环境
|
||||||
|
- 设置依赖管理
|
||||||
|
- 配置代码规范工具
|
||||||
|
- 标签:`基础`, `优先级:高`
|
||||||
|
- 优先级:1
|
||||||
|
|
||||||
|
#### 2. 数据模型/架构 Issue
|
||||||
|
- 标题:`[架构] 数据模型设计和数据库初始化`
|
||||||
|
- 内容:
|
||||||
|
- 设计核心数据模型
|
||||||
|
- 创建数据库 schema
|
||||||
|
- 设置 ORM/数据访问层
|
||||||
|
- 标签:`架构`, `优先级:高`
|
||||||
|
- 依赖:项目基础设置
|
||||||
|
- 优先级:2
|
||||||
|
|
||||||
|
#### 3. 核心功能 Issues
|
||||||
|
- 为每个核心功能创建一个 Issue
|
||||||
|
- 标题格式:`[功能] {功能名称}`
|
||||||
|
- 内容包含:
|
||||||
|
- 功能描述
|
||||||
|
- 实现要点
|
||||||
|
- 验收标准
|
||||||
|
- 标签:`功能`, `优先级:中`
|
||||||
|
- 依赖:数据模型
|
||||||
|
|
||||||
|
#### 4. 增强功能 Issues
|
||||||
|
- 为增强功能创建 Issues
|
||||||
|
- 标题格式:`[增强] {功能名称}`
|
||||||
|
- 标签:`增强`, `优先级:低`
|
||||||
|
- 依赖:核心功能
|
||||||
|
|
||||||
|
#### 5. 测试 Issue
|
||||||
|
- 标题:`[测试] 单元测试和集成测试`
|
||||||
|
- 内容:
|
||||||
|
- 单元测试(覆盖率 > 80%)
|
||||||
|
- 集成测试
|
||||||
|
- E2E 测试
|
||||||
|
- 标签:`测试`, `优先级:高`
|
||||||
|
- 依赖:核心功能
|
||||||
|
- 优先级:n-1
|
||||||
|
|
||||||
|
#### 6. 文档 Issue
|
||||||
|
- 标题:`[文档] API 文档和用户文档`
|
||||||
|
- 内容:
|
||||||
|
- API 文档
|
||||||
|
- 用户手册
|
||||||
|
- 部署文档
|
||||||
|
- 标签:`文档`, `优先级:中`
|
||||||
|
- 依赖:所有功能
|
||||||
|
- 优先级:n
|
||||||
|
|
||||||
|
### 第四步:确定依赖关系
|
||||||
|
|
||||||
|
分析 Issues 之间的依赖关系:
|
||||||
|
1. **项目基础设置** → 无依赖
|
||||||
|
2. **数据模型** → 依赖项目基础设置
|
||||||
|
3. **核心功能** → 依赖数据模型
|
||||||
|
4. **增强功能** → 依赖核心功能
|
||||||
|
5. **测试** → 依赖核心功能
|
||||||
|
6. **文档** → 依赖所有功能
|
||||||
|
|
||||||
|
在 Issue 描述中添加依赖标记:
|
||||||
|
```markdown
|
||||||
|
## 依赖关系
|
||||||
|
- 前置 Issue: #1, #2
|
||||||
|
- 阻塞 Issue: 无
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第五步:创建 Gitea 仓库
|
||||||
|
|
||||||
|
依据 `.claude/commands/gitea/API-QUICK-REFERENCE.md` 文档中的仓库操作指南创建或更新仓库。
|
||||||
|
|
||||||
|
### 第六步:创建 Issues
|
||||||
|
|
||||||
|
依据 `.claude/commands/gitea/API-QUICK-REFERENCE.md` 文档中的 Issue 操作指南为每个拆分的 Issue 创建 Issue。
|
||||||
|
|
||||||
|
### 第七步:创建项目看板(可选)
|
||||||
|
|
||||||
|
如果需要,依据 `.claude/commands/gitea/API-QUICK-REFERENCE.md` 文档中的项目看板操作指南创建项目看板来跟踪进度。
|
||||||
|
|
||||||
|
## 配置要求
|
||||||
|
|
||||||
|
需要的环境变量(从 .env 文件读取):
|
||||||
|
- `GITEA_URL`: Gitea 实例地址
|
||||||
|
- `GITEA_TOKEN`: API 访问令牌
|
||||||
|
- `GITEA_OWNER`: 仓库所有者
|
||||||
|
|
||||||
|
## Issue 标签系统
|
||||||
|
|
||||||
|
创建以下标签:
|
||||||
|
- **类型**:基础、架构、功能、增强、测试、文档
|
||||||
|
- **优先级**:优先级:高、优先级:中、优先级:低
|
||||||
|
- **状态**:进行中、已阻塞、待审核
|
||||||
|
|
||||||
|
## 使用示例
|
||||||
|
|
||||||
|
### 示例 1: 使用默认查找
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/gitea:init-project
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
```
|
||||||
|
🔍 搜索需求文档
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
找到 2 个 requirements 文件:
|
||||||
|
• ./requirements.md (评分: 92)
|
||||||
|
• ./docs/requirements-v1.md (评分: 67)
|
||||||
|
|
||||||
|
✅ 选择最相关的文档: ./requirements.md
|
||||||
|
|
||||||
|
📦 初始化项目:任务管理器
|
||||||
|
|
||||||
|
✅ 读取需求文档
|
||||||
|
✅ 解析需求:发现 4 个核心功能,3 个功能模块
|
||||||
|
✅ 拆分为 8 个 Issues
|
||||||
|
✅ 创建/更新仓库:chen/task-manager
|
||||||
|
✅ 创建 8 个 Issues
|
||||||
|
✅ 创建项目看板
|
||||||
|
|
||||||
|
📋 Issues 列表:
|
||||||
|
#1 [基础] 项目初始化和环境配置
|
||||||
|
#2 [架构] 数据模型设计和数据库初始化
|
||||||
|
#3 [功能] 任务的增删改查
|
||||||
|
#4 [功能] 任务状态管理
|
||||||
|
#5 [功能] 任务分类与标签
|
||||||
|
#6 [功能] 数据统计与可视化
|
||||||
|
#7 [测试] 单元测试和集成测试
|
||||||
|
#8 [文档] API 文档和用户文档
|
||||||
|
|
||||||
|
🔗 依赖关系:
|
||||||
|
#2 → 依赖 #1
|
||||||
|
#3-6 → 依赖 #2
|
||||||
|
#7 → 依赖 #3-6
|
||||||
|
#8 → 依赖 #3-7
|
||||||
|
|
||||||
|
✨ 项目初始化完成!
|
||||||
|
```
|
||||||
|
|
||||||
|
### 示例 2: 指定 requirements 文件
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/gitea:init-project docs/requirements-v2.md
|
||||||
|
```
|
||||||
|
|
||||||
|
输出:
|
||||||
|
```
|
||||||
|
📁 使用指定的需求文档: docs/requirements-v2.md
|
||||||
|
|
||||||
|
📦 初始化项目:在线商城系统
|
||||||
|
|
||||||
|
✅ 读取需求文档
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 示例 3: 指定 requirements 文件和仓库名
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/gitea:init-project docs/requirements.md my-custom-repo
|
||||||
|
```
|
||||||
|
|
||||||
|
## 错误处理
|
||||||
|
|
||||||
|
- 如果找不到任何 requirements.md 文件,提示用户创建
|
||||||
|
- 如果指定的文件不存在,显示错误并列出可用的文件
|
||||||
|
- 如果 Gitea API 调用失败,显示错误信息并建议检查配置
|
||||||
|
- 如果仓库已存在,询问是否更新 Issues
|
||||||
|
|
||||||
|
## 智能选择算法
|
||||||
|
|
||||||
|
### 评分公式
|
||||||
|
|
||||||
|
```
|
||||||
|
总分 = 时间分 × 0.4 + 修改次数分 × 0.3 + 位置分 × 0.2 + 内容分 × 0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
其中:
|
||||||
|
- **时间分**(0-100):
|
||||||
|
- 最近 1 天内修改: 100
|
||||||
|
- 1-7 天前修改: 80
|
||||||
|
- 7-30 天前修改: 60
|
||||||
|
- 30 天前修改: 40
|
||||||
|
|
||||||
|
- **修改次数分**(0-100):
|
||||||
|
- 10 次以上: 100
|
||||||
|
- 5-10 次: 80
|
||||||
|
- 2-5 次: 60
|
||||||
|
- 1 次: 40
|
||||||
|
|
||||||
|
- **位置分**(0-100):
|
||||||
|
- 根目录: 100
|
||||||
|
- docs/ 目录: 80
|
||||||
|
- 其他一级子目录: 60
|
||||||
|
- 更深层次的目录: 40
|
||||||
|
|
||||||
|
- **内容分**(0-100):
|
||||||
|
- 基于文件行数和内容丰富度
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **原子性**:每个 Issue 应该是一个最小可部署单元
|
||||||
|
2. **可测试性**:每个功能 Issue 应该有明确的验收标准
|
||||||
|
3. **依赖清晰**:明确标注依赖关系,避免循环依赖
|
||||||
|
4. **优先级合理**:按照依赖关系和重要程度排序
|
||||||
|
5. **可追溯性**:Issue 描述中引用 requirements.md 的相关部分
|
||||||
|
|
||||||
|
## 下一步
|
||||||
|
|
||||||
|
初始化完成后,可以:
|
||||||
|
1. 使用 `/gitea-start-scheduler` 启动自动化工作流
|
||||||
|
2. 使用 `/gitea-status` 查看项目状态
|
||||||
|
3. 使用 `/gitea-process-issue <number>` 手动处理单个 Issue
|
||||||
248
.claude/commands/gitea/process-issue.md
Normal file
248
.claude/commands/gitea/process-issue.md
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
---
|
||||||
|
name: gitea-process-issue
|
||||||
|
description: 手动处理单个 Issue
|
||||||
|
arguments:
|
||||||
|
- name: issue_number
|
||||||
|
description: Issue 编号
|
||||||
|
required: true
|
||||||
|
---
|
||||||
|
|
||||||
|
手动处理指定的 Issue,启动 Agent 实现代码和创建 PR。
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
|
||||||
|
### 第一步:获取 Issue 详情
|
||||||
|
|
||||||
|
依据 `.claude/commands/gitea/API-QUICK-REFERENCE.md` 文档中的 Issue 操作指南获取 Issue 详情。
|
||||||
|
|
||||||
|
### 第二步:解析 Issue 信息
|
||||||
|
|
||||||
|
从 Issue 提取:
|
||||||
|
- 标题和描述
|
||||||
|
- 标签(类型、优先级)
|
||||||
|
- 依赖关系(从描述中解析)
|
||||||
|
|
||||||
|
### 第三步:检查依赖
|
||||||
|
|
||||||
|
解析 Issue 描述中的依赖标记:
|
||||||
|
```markdown
|
||||||
|
## 依赖关系
|
||||||
|
- 前置 Issue: #1, #2
|
||||||
|
```
|
||||||
|
|
||||||
|
依据 `.claude/commands/gitea/API-QUICK-REFERENCE.md` 文档中的 Issue 操作指南检查前置 Issue 是否已完成。
|
||||||
|
|
||||||
|
### 第四步:启动 Code Agent
|
||||||
|
|
||||||
|
使用 Agent 工具启动 general-purpose Agent 处理 Issue。
|
||||||
|
|
||||||
|
**Agent 提示词模板**:
|
||||||
|
```
|
||||||
|
处理 Gitea Issue #${issue_number}
|
||||||
|
|
||||||
|
## Issue 信息
|
||||||
|
标题: ${issue_title}
|
||||||
|
描述: ${issue_body}
|
||||||
|
标签: ${labels}
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
|
||||||
|
### 1. 准备工作
|
||||||
|
首先检查当前 Git 状态:
|
||||||
|
```bash
|
||||||
|
git status
|
||||||
|
git branch
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 创建特性分支
|
||||||
|
```bash
|
||||||
|
git checkout main
|
||||||
|
git pull origin main
|
||||||
|
git checkout -b feature/issue-${issue_number}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 分析需求
|
||||||
|
仔细阅读 Issue 描述,理解需要实现的功能。
|
||||||
|
|
||||||
|
### 4. 探索现有代码
|
||||||
|
使用 Glob 和 Grep 工具了解项目结构:
|
||||||
|
- 查找相关的源代码文件
|
||||||
|
- 了解现有的代码组织方式
|
||||||
|
- 识别可以复用的模块
|
||||||
|
|
||||||
|
### 5. 增量式实现代码
|
||||||
|
重要原则:
|
||||||
|
- 只实现 Issue 要求的功能
|
||||||
|
- 不重复已有代码
|
||||||
|
- 遵循项目代码规范
|
||||||
|
- 保持代码简洁
|
||||||
|
|
||||||
|
使用 Read 工具读取现有代码,然后使用 Edit 或 Write 工具添加新代码。
|
||||||
|
|
||||||
|
### 6. 生成测试代码
|
||||||
|
根据功能特点生成适当的测试:
|
||||||
|
- 对于数据模型:单元测试
|
||||||
|
- 对于业务逻辑:单元测试 + 集成测试
|
||||||
|
- 对于 UI 组件:UI 测试(如果适用)
|
||||||
|
|
||||||
|
测试文件命名规范:
|
||||||
|
- 单元测试: `Tests/Editor/{ClassName}Tests.cs`
|
||||||
|
- 集成测试: `Tests/Integration/{FeatureName}Tests.cs`
|
||||||
|
|
||||||
|
### 7. 运行测试(如果有测试框架)
|
||||||
|
```bash
|
||||||
|
# 如果是 Unity 项目,使用 Unity Test Runner
|
||||||
|
# 如果有其他测试框架,运行相应命令
|
||||||
|
```
|
||||||
|
|
||||||
|
如果测试失败:
|
||||||
|
- 分析失败原因
|
||||||
|
- 修复代码
|
||||||
|
- 重新运行测试
|
||||||
|
- 重复直到测试通过
|
||||||
|
|
||||||
|
### 8. 提交代码
|
||||||
|
```bash
|
||||||
|
git add .
|
||||||
|
git commit -m "feat(${module}): 实现 Issue #${issue_number} - ${feature_name}
|
||||||
|
|
||||||
|
- 实现了 XXX 功能
|
||||||
|
- 添加了 YYY 测试
|
||||||
|
- 修复了 ZZZ 问题
|
||||||
|
|
||||||
|
Closes #${issue_number}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 9. 推送到远程
|
||||||
|
```bash
|
||||||
|
git push -u origin feature/issue-${issue_number}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10. 创建 Pull Request
|
||||||
|
|
||||||
|
依据 `.claude/commands/gitea/API-QUICK-REFERENCE.md` 文档中的 Pull Request 操作指南创建 PR。
|
||||||
|
|
||||||
|
### 11. 在 Issue 中添加评论
|
||||||
|
|
||||||
|
依据 `.claude/commands/gitea/API-QUICK-REFERENCE.md` 文档中的 Issue 评论操作指南在 Issue 中添加评论说明已创建 PR。
|
||||||
|
|
||||||
|
## 重要提示
|
||||||
|
|
||||||
|
1. **增量式开发**: 不要重新生成整个项目,只添加新的功能
|
||||||
|
2. **测试覆盖**: 必须生成测试代码,测试覆盖率目标 > 80%
|
||||||
|
3. **代码质量**: 遵循项目代码规范,保持代码整洁
|
||||||
|
4. **原子提交**: 每次提交应该是一个完整的、可工作的变更
|
||||||
|
5. **PR 描述**: PR 描述应该清晰说明变更内容和测试结果
|
||||||
|
|
||||||
|
## 错误处理
|
||||||
|
|
||||||
|
- 如果依赖未满足:报告并退出
|
||||||
|
- 如果分支已存在:询问是否继续或使用新分支名
|
||||||
|
- 如果测试失败:分析失败原因,修复代码,重试
|
||||||
|
- 如果 PR 创建失败:报告错误并建议手动创建
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第五步:等待 Agent 完成
|
||||||
|
|
||||||
|
使用 TaskOutput 监控 Agent 的执行进度和结果。
|
||||||
|
|
||||||
|
### 第六步:报告结果
|
||||||
|
|
||||||
|
显示处理结果:
|
||||||
|
- 创建的分支名称
|
||||||
|
- 创建的 PR 编号
|
||||||
|
- 测试结果
|
||||||
|
- 下一步建议
|
||||||
|
|
||||||
|
## 示例输出
|
||||||
|
|
||||||
|
```
|
||||||
|
🔧 处理 Issue #3
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
✅ 获取 Issue 详情
|
||||||
|
• 标题: [功能] 任务增删改查核心功能
|
||||||
|
• 标签: 功能, 优先级:中
|
||||||
|
• 依赖: Issue #2
|
||||||
|
|
||||||
|
✅ 检查依赖
|
||||||
|
• Issue #2: ✅ 已完成
|
||||||
|
|
||||||
|
🤖 启动 Code Agent
|
||||||
|
• 分支: feature/issue-3
|
||||||
|
• Agent ID: agent-xyz789
|
||||||
|
|
||||||
|
⏳ Agent 工作中...
|
||||||
|
[Agent 输出会实时显示]
|
||||||
|
|
||||||
|
✅ Agent 完成
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
📋 处理结果:
|
||||||
|
|
||||||
|
✅ 分支创建成功: feature/issue-3
|
||||||
|
✅ 代码实现完成: 5 个文件
|
||||||
|
✅ 测试通过: 12/12
|
||||||
|
✅ Pull Request 创建: #3
|
||||||
|
✅ Issue 评论已添加
|
||||||
|
|
||||||
|
🔗 链接:
|
||||||
|
• PR: http://192.168.2.200:3000/chen/task-manager-unity/pulls/3
|
||||||
|
• Issue: http://192.168.2.200:3000/chen/task-manager-unity/issues/3
|
||||||
|
|
||||||
|
💡 下一步:
|
||||||
|
• 等待 PR 审核
|
||||||
|
• 或使用 /gitea-status 查看状态
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **依赖检查**: 必须确保依赖 Issue 已完成
|
||||||
|
2. **分支命名**: 使用 `feature/issue-{number}` 格式
|
||||||
|
3. **测试要求**: 测试覆盖率必须 > 80%
|
||||||
|
4. **原子性**: 每个 Issue 应该是一个完整的功能单元
|
||||||
|
5. **冲突处理**: 如果有冲突,需要手动解决
|
||||||
|
|
||||||
|
## 错误场景
|
||||||
|
|
||||||
|
### 依赖未满足
|
||||||
|
```
|
||||||
|
❌ 无法处理 Issue #3
|
||||||
|
|
||||||
|
原因: 依赖 Issue #2 未完成
|
||||||
|
状态: Issue #2 当前状态为 open
|
||||||
|
|
||||||
|
💡 建议:
|
||||||
|
• 先完成 Issue #2
|
||||||
|
• 或修改 Issue #3 的依赖关系
|
||||||
|
```
|
||||||
|
|
||||||
|
### 分支已存在
|
||||||
|
```
|
||||||
|
⚠️ 分支已存在: feature/issue-3
|
||||||
|
|
||||||
|
选项:
|
||||||
|
1. 继续在现有分支上工作
|
||||||
|
2. 创建新分支: feature/issue-3-v2
|
||||||
|
3. 取消操作
|
||||||
|
|
||||||
|
请选择: _
|
||||||
|
```
|
||||||
|
|
||||||
|
### 测试失败
|
||||||
|
```
|
||||||
|
❌ 测试失败
|
||||||
|
|
||||||
|
失败的测试:
|
||||||
|
• TaskManagerTests.CreateTask_ShouldSetDefaultValues
|
||||||
|
• TaskManagerTests.DeleteTask_ShouldRemoveFromList
|
||||||
|
|
||||||
|
💡 Agent 正在尝试修复...
|
||||||
|
```
|
||||||
|
|
||||||
|
## 相关命令
|
||||||
|
|
||||||
|
- `/gitea-status` - 查看项目状态
|
||||||
|
- `/gitea-start-scheduler` - 启动自动处理
|
||||||
|
- `/gitea-init-project` - 初始化项目
|
||||||
234
.claude/commands/gitea/start-scheduler.md
Normal file
234
.claude/commands/gitea/start-scheduler.md
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
---
|
||||||
|
name: gitea-start-scheduler
|
||||||
|
description: 启动定时任务(Issue 处理和 PR 审核)
|
||||||
|
---
|
||||||
|
|
||||||
|
创建两个定时任务,自动处理 Issues 和审核 PRs。
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
|
||||||
|
### 第一步:读取配置
|
||||||
|
|
||||||
|
从环境变量读取配置:
|
||||||
|
- `GITEA_URL`: Gitea 实例地址
|
||||||
|
- `GITEA_TOKEN`: API 访问令牌
|
||||||
|
- `GITEA_OWNER`: 仓库所有者
|
||||||
|
- `GITEA_REPO`: 仓库名称(如果没有,则使用当前目录名)
|
||||||
|
- `CODE_AGENT_INTERVAL`: Code Agent 间隔(默认 5 分钟)
|
||||||
|
- `PR_AGENT_INTERVAL`: PR Agent 间隔(默认 10 分钟)
|
||||||
|
|
||||||
|
### 第二步:创建 Code Agent 定时任务
|
||||||
|
|
||||||
|
使用 CronCreate 创建定时任务,定期扫描和处理未完成的 Issues。
|
||||||
|
|
||||||
|
**定时任务逻辑**:
|
||||||
|
```
|
||||||
|
每 N 分钟执行一次:
|
||||||
|
1. 依据 .claude/commands/gitea/API-QUICK-REFERENCE.md 文档中的 Issue 操作指南获取所有打开的 Issues
|
||||||
|
2. 过滤出未处理的(没有 PR 关联)
|
||||||
|
3. 按优先级排序
|
||||||
|
4. 依据 API-QUICK-REFERENCE.md 文档检查依赖是否满足
|
||||||
|
5. 选择优先级最高的未阻塞 Issue
|
||||||
|
6. 启动 Agent 处理该 Issue
|
||||||
|
```
|
||||||
|
|
||||||
|
**Agent 工作流程**:
|
||||||
|
```
|
||||||
|
1. 依据 .claude/commands/gitea/API-QUICK-REFERENCE.md 文档中的 Issue 操作指南获取 Issue 详情
|
||||||
|
2. 解析 Issue 描述,提取需求
|
||||||
|
3. 依据 API-QUICK-REFERENCE.md 文档检查依赖 Issue 是否已完成
|
||||||
|
4. 如果依赖未满足,跳过该 Issue
|
||||||
|
5. 创建特性分支: feature/issue-{number}
|
||||||
|
6. 分析需要实现的功能
|
||||||
|
7. 读取现有代码结构
|
||||||
|
8. 增量式生成实现代码
|
||||||
|
- 只实现 Issue 要求的功能
|
||||||
|
- 不重复已有代码
|
||||||
|
- 遵循项目代码规范
|
||||||
|
9. 生成测试代码
|
||||||
|
- 单元测试
|
||||||
|
- 集成测试(如果需要)
|
||||||
|
10. 运行测试
|
||||||
|
- 如果测试失败,修复代码并重试
|
||||||
|
11. 提交代码
|
||||||
|
git add .
|
||||||
|
git commit -m "feat: 实现 Issue #{number}"
|
||||||
|
git push origin feature/issue-{number}
|
||||||
|
12. 依据 API-QUICK-REFERENCE.md 文档中的 Pull Request 操作指南创建 Pull Request
|
||||||
|
- 标题: [Issue #{number}] {Issue 标题}
|
||||||
|
- 描述: 关联 Issue,说明实现内容
|
||||||
|
- 标签: 继承 Issue 的标签
|
||||||
|
13. 依据 API-QUICK-REFERENCE.md 文档中的 Issue 评论操作指南在 Issue 中添加评论,说明已创建 PR
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第三步:创建 PR Agent 定时任务
|
||||||
|
|
||||||
|
使用 CronCreate 创建定时任务,定期审核未审核的 PRs。
|
||||||
|
|
||||||
|
**定时任务逻辑**:
|
||||||
|
```
|
||||||
|
每 N 分钟执行一次:
|
||||||
|
1. 依据 .claude/commands/gitea/API-QUICK-REFERENCE.md 文档中的 Pull Request 操作指南获取所有打开的 Pull Requests
|
||||||
|
2. 过滤出未审核的
|
||||||
|
3. 对每个 PR 启动 Agent 审核
|
||||||
|
```
|
||||||
|
|
||||||
|
**Agent 审核流程**:
|
||||||
|
```
|
||||||
|
1. 依据 .claude/commands/gitea/API-QUICK-REFERENCE.md 文档中的 Pull Request 操作指南获取 PR 详情
|
||||||
|
- 代码变更
|
||||||
|
- 关联的 Issue
|
||||||
|
- 提交历史
|
||||||
|
|
||||||
|
2. 代码质量检查
|
||||||
|
- 代码规范(如果有 linter)
|
||||||
|
- 代码风格一致性
|
||||||
|
- 潜在的 bug
|
||||||
|
|
||||||
|
3. 测试检查
|
||||||
|
- 检查是否有测试代码
|
||||||
|
- 运行测试(如果有测试框架)
|
||||||
|
- 验证测试覆盖率
|
||||||
|
|
||||||
|
4. 安全检查
|
||||||
|
- 检查是否有敏感信息泄露
|
||||||
|
- 检查是否有安全漏洞
|
||||||
|
|
||||||
|
5. 依据 API-QUICK-REFERENCE.md 文档中的 PR 审核操作指南创建审核评论
|
||||||
|
如果发现问题:
|
||||||
|
- 列出所有问题
|
||||||
|
- 提供修复建议
|
||||||
|
- 请求修改(REQUEST_CHANGES)
|
||||||
|
|
||||||
|
如果审核通过:
|
||||||
|
- 批准(APPROVE)
|
||||||
|
- 根据 AUTO_MERGE 配置决定是否自动合并
|
||||||
|
|
||||||
|
6. 如果需要修改
|
||||||
|
- 启动修复 Agent
|
||||||
|
- 修复问题
|
||||||
|
- 推送修复
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第四步:显示任务状态
|
||||||
|
|
||||||
|
创建完成后,显示:
|
||||||
|
- 两个定时任务的 ID
|
||||||
|
- 下次执行时间
|
||||||
|
- 如何停止任务(/gitea-stop-scheduler)
|
||||||
|
|
||||||
|
## 配置选项
|
||||||
|
|
||||||
|
### 环境变量
|
||||||
|
|
||||||
|
创建 `.env` 文件(如果不存在):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Gitea 配置
|
||||||
|
GITEA_URL=http://your-gitea-url
|
||||||
|
GITEA_TOKEN=your-api-token
|
||||||
|
GITEA_OWNER=your-username
|
||||||
|
GITEA_REPO=your-repo-name # 可选,默认使用当前目录名
|
||||||
|
|
||||||
|
# 定时间隔(分钟)
|
||||||
|
CODE_AGENT_INTERVAL=5 # 默认 5 分钟
|
||||||
|
PR_AGENT_INTERVAL=10 # 默认 10 分钟
|
||||||
|
|
||||||
|
# 审核配置
|
||||||
|
AUTO_MERGE=false # 是否自动合并审核通过的 PR
|
||||||
|
REQUIRE_REVIEW=true # 是否需要代码审查
|
||||||
|
TEST_COVERAGE_TARGET=80 # 测试覆盖率目标
|
||||||
|
```
|
||||||
|
|
||||||
|
### 定时间隔建议
|
||||||
|
|
||||||
|
根据项目规模调整间隔:
|
||||||
|
|
||||||
|
- **小型项目** (< 10 个 Issues):
|
||||||
|
- Code Agent: 3-5 分钟
|
||||||
|
- PR Agent: 5-10 分钟
|
||||||
|
|
||||||
|
- **中型项目** (10-50 个 Issues):
|
||||||
|
- Code Agent: 5-10 分钟
|
||||||
|
- PR Agent: 10-15 分钟
|
||||||
|
|
||||||
|
- **大型项目** (> 50 个 Issues):
|
||||||
|
- Code Agent: 10-15 分钟
|
||||||
|
- PR Agent: 15-20 分钟
|
||||||
|
|
||||||
|
## 示例输出
|
||||||
|
|
||||||
|
```
|
||||||
|
🚀 启动定时任务
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
✅ 读取配置
|
||||||
|
• 仓库: chen/task-manager-unity
|
||||||
|
• Code Agent 间隔: 5 分钟
|
||||||
|
• PR Agent 间隔: 10 分钟
|
||||||
|
|
||||||
|
✅ 创建 Code Agent 定时任务
|
||||||
|
• ID: job-abc123
|
||||||
|
• 间隔: */5 * * * *
|
||||||
|
• 下次执行: 2 分钟后
|
||||||
|
|
||||||
|
✅ 创建 PR Agent 定时任务
|
||||||
|
• ID: job-def456
|
||||||
|
• 间隔: */10 * * * *
|
||||||
|
• 下次执行: 7 分钟后
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
⏰ 定时任务已启动!
|
||||||
|
|
||||||
|
Agent 将自动:
|
||||||
|
• 扫描未处理的 Issues 并实现功能
|
||||||
|
• 审核提交的 Pull Requests
|
||||||
|
• 运行测试并确保代码质量
|
||||||
|
|
||||||
|
💡 提示:
|
||||||
|
• 使用 /gitea-status 查看进度
|
||||||
|
• 使用 /gitea-stop-scheduler 停止任务
|
||||||
|
• 定时任务仅在当前会话有效(最多 3 天)
|
||||||
|
|
||||||
|
✨ 准备就绪,Agent 开始工作!
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **会话限制**: 定时任务仅在当前会话有效,会话结束后需要重新启动
|
||||||
|
2. **自动过期**: 定时任务最多运行 3 天,之后会自动删除
|
||||||
|
3. **并发控制**: 同一时间只处理一个 Issue,避免冲突
|
||||||
|
4. **依赖检查**: 会自动跳过依赖未满足的 Issues
|
||||||
|
5. **错误重试**: 如果 Agent 执行失败,会在下次定时任务时重试
|
||||||
|
6. **手动干预**: 可以随时使用 `/gitea-process-issue` 手动处理特定 Issue
|
||||||
|
|
||||||
|
## 工作流示例
|
||||||
|
|
||||||
|
```
|
||||||
|
时间轴:
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
T=0 min 启动定时任务
|
||||||
|
T=2 min Code Agent 扫描 → 发现 Issue #2
|
||||||
|
开始实现 Issue #2...
|
||||||
|
|
||||||
|
T=5 min Code Agent 完成 Issue #2,创建 PR #1
|
||||||
|
下次扫描...
|
||||||
|
|
||||||
|
T=10 min PR Agent 审核通过 PR #1
|
||||||
|
AUTO_MERGE=false → 等待人工合并
|
||||||
|
|
||||||
|
T=15 min Code Agent 扫描 → 发现 Issue #3
|
||||||
|
开始实现 Issue #3...
|
||||||
|
|
||||||
|
...以此类推
|
||||||
|
```
|
||||||
|
|
||||||
|
## 下一步
|
||||||
|
|
||||||
|
启动定时任务后:
|
||||||
|
1. 使用 `/gitea-status` 查看实时状态
|
||||||
|
2. 查看 Issues 和 PRs 的进度
|
||||||
|
3. 手动审核和合并 PRs(如果 AUTO_MERGE=false)
|
||||||
|
4. 根据需要调整定时间隔
|
||||||
167
.claude/commands/gitea/start.md
Normal file
167
.claude/commands/gitea/start.md
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
---
|
||||||
|
name: gitea-start
|
||||||
|
description: 启动需求收集对话,创建项目需求文档
|
||||||
|
---
|
||||||
|
|
||||||
|
你是需求收集助手,负责与用户对话并收集项目需求。
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
|
||||||
|
### 第一步:问候并了解项目类型
|
||||||
|
|
||||||
|
首先使用 AskUserQuestion 询问用户想要创建什么类型的项目。
|
||||||
|
|
||||||
|
**问题选项**:
|
||||||
|
- unity项目
|
||||||
|
- Web 应用(前端 + 后端)
|
||||||
|
- 纯前端应用
|
||||||
|
- 纯后端 API
|
||||||
|
- 命令行工具
|
||||||
|
- 其他类型
|
||||||
|
|
||||||
|
### 第二步:收集基本信息
|
||||||
|
|
||||||
|
根据用户选择的项目类型,继续询问:
|
||||||
|
- 项目名称
|
||||||
|
- 项目描述(简短说明项目的目标和用途)
|
||||||
|
- 项目的主要功能(3-5 个核心功能点)
|
||||||
|
|
||||||
|
### 第三步:收集技术栈信息
|
||||||
|
|
||||||
|
询问技术栈相关的问题:
|
||||||
|
- **编程语言**: JavaScript/TypeScript、Python、Go、Java、Rust 等
|
||||||
|
- **框架**:
|
||||||
|
- 前端: React、Vue、Next.js、Nuxt.js、Svelte 等
|
||||||
|
- 后端: Express、FastAPI、Gin、Spring Boot 等
|
||||||
|
- **数据库**: PostgreSQL、MySQL、MongoDB、SQLite、Redis 等
|
||||||
|
- **其他工具**: 是否需要认证、API 文档、测试框架等
|
||||||
|
|
||||||
|
### 第四步:确认并生成文档
|
||||||
|
|
||||||
|
收集完所有信息后:
|
||||||
|
1. 向用户展示收集到的需求摘要
|
||||||
|
2. 询问是否确认或需要修改
|
||||||
|
3. 如果确认,使用 Write 工具生成 [yyyy-MM-dd_HH-mm-ss]-[功能名]-[requirements].md 文档
|
||||||
|
4. 告知用户文档已保存,并提示下一步可以使用 `/gitea-init-project` 创建项目
|
||||||
|
|
||||||
|
## 输出格式
|
||||||
|
|
||||||
|
生成的 requirements.md 文档应包含以下结构:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# 项目需求文档
|
||||||
|
|
||||||
|
**项目名称**: [项目名称]
|
||||||
|
**创建时间**: [日期]
|
||||||
|
**项目类型**: [类型]
|
||||||
|
|
||||||
|
## 项目描述
|
||||||
|
|
||||||
|
[项目描述内容]
|
||||||
|
|
||||||
|
## 核心功能
|
||||||
|
|
||||||
|
1. [功能 1]
|
||||||
|
2. [功能 2]
|
||||||
|
3. [功能 3]
|
||||||
|
...
|
||||||
|
|
||||||
|
## 技术栈
|
||||||
|
|
||||||
|
### 编程语言
|
||||||
|
- [语言]
|
||||||
|
|
||||||
|
### 框架
|
||||||
|
- 前端: [框架名称]
|
||||||
|
- 后端: [框架名称]
|
||||||
|
|
||||||
|
### 数据库
|
||||||
|
- [数据库类型]
|
||||||
|
|
||||||
|
### 其他工具
|
||||||
|
- 认证: [是/否]
|
||||||
|
- API 文档: [是/否]
|
||||||
|
- 测试框架: [框架名称]
|
||||||
|
|
||||||
|
## 依赖关系
|
||||||
|
|
||||||
|
[如果有模块间的依赖关系,在此说明]
|
||||||
|
|
||||||
|
## 备注
|
||||||
|
|
||||||
|
[其他补充信息]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **使用 AskUserQuestion 工具**: 所有与用户的交互必须使用 AskUserQuestion 工具
|
||||||
|
2. **友好的对话风格**: 保持对话精简、专业,避免出现无意义话语
|
||||||
|
3. **逐步引导**: 不要一次性问太多问题,分步骤收集信息
|
||||||
|
4. **确定性**: 必须保证每个技术栈是唯一确定的(比如数据库:不能sqlite、mysql等不确定)
|
||||||
|
5. **确定性**: 必须保证每个技术栈是唯一确定的(比如数据库:不能sqlite、mysql等不确定)
|
||||||
|
6. **确定性**: 必须保证每个技术栈是唯一确定的(比如数据库:不能sqlite、mysql等不确定)
|
||||||
|
7. **验证输入**: 如果用户输入不明确,可以追问或提供选项
|
||||||
|
8. **灵活应对**: 根据用户的项目类型调整问题(例如 CLI 工具不需要前端框架)
|
||||||
|
9. **保存文档**: 使用 Write 工具将 requirements.md 保存到项目根目录
|
||||||
|
10.
|
||||||
|
|
||||||
|
## 示例对话流程
|
||||||
|
|
||||||
|
**Agent**: 你好!我是需求收集助手。请问你想要创建什么类型的项目?
|
||||||
|
|
||||||
|
**用户**: Web 应用(前端 + 后端)
|
||||||
|
|
||||||
|
**Agent**: 项目的名称:
|
||||||
|
|
||||||
|
**用户**: TaskMaster - 任务管理系统
|
||||||
|
|
||||||
|
**Agent**: 简要描述这个项目的目标和主要用途。
|
||||||
|
|
||||||
|
**用户**: 一个团队协作的任务管理工具,支持任务分配、进度跟踪和团队沟通。
|
||||||
|
|
||||||
|
**Agent**: 请列出 3-5 个核心功能点。
|
||||||
|
|
||||||
|
**用户**:
|
||||||
|
1. 任务创建和分配
|
||||||
|
2. 看板视图
|
||||||
|
3. 实时通知
|
||||||
|
4. 团队协作评论
|
||||||
|
5. 数据统计和报表
|
||||||
|
|
||||||
|
**Agent**: 你计划使用什么编程语言?
|
||||||
|
|
||||||
|
**用户**: TypeScript
|
||||||
|
|
||||||
|
**Agent**: 前端框架呢?
|
||||||
|
|
||||||
|
**用户**: Next.js
|
||||||
|
|
||||||
|
**Agent**: 后端呢?
|
||||||
|
|
||||||
|
**用户**: 也用 Next.js API Routes
|
||||||
|
|
||||||
|
**Agent**: 数据库选择?
|
||||||
|
|
||||||
|
**用户**: PostgreSQL + Redis(缓存)
|
||||||
|
|
||||||
|
**Agent**: 是否需要用户认证功能?
|
||||||
|
|
||||||
|
**用户**: 是,需要完整的认证系统
|
||||||
|
|
||||||
|
**Agent**: 是否需要自动生成 API 文档?
|
||||||
|
|
||||||
|
**用户**: 是
|
||||||
|
|
||||||
|
**Agent**: 让我总结一下你的需求:
|
||||||
|
[显示需求摘要]
|
||||||
|
确认无误吗?如需修改请告诉我。
|
||||||
|
|
||||||
|
**用户**: 确认
|
||||||
|
|
||||||
|
**Agent**: [使用 Write 工具保存 requirements.md]
|
||||||
|
需求文档已保存到 requirements.md!
|
||||||
|
下一步你可以使用 `/gitea-init-project` 来初始化项目并创建 Gitea Issues。
|
||||||
|
|
||||||
|
## 开始执行
|
||||||
|
|
||||||
|
现在开始与用户对话,收集项目需求。
|
||||||
106
.claude/commands/gitea/status.md
Normal file
106
.claude/commands/gitea/status.md
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
---
|
||||||
|
name: gitea-status
|
||||||
|
description: 查看项目状态和定时任务
|
||||||
|
---
|
||||||
|
|
||||||
|
显示项目当前状态、Issues、PRs 和定时任务。
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
|
||||||
|
### 第一步:读取配置
|
||||||
|
|
||||||
|
从环境变量读取 Gitea 配置。
|
||||||
|
|
||||||
|
### 第二步:获取 Issues 状态
|
||||||
|
|
||||||
|
依据 `.claude/commands/gitea/API-QUICK-REFERENCE.md` 文档中的 Issue 操作指南获取所有 Issues,并按状态分类:
|
||||||
|
- 已完成(closed)
|
||||||
|
- 进行中(open + 有关联 PR)
|
||||||
|
- 等待中(open + 依赖未满足)
|
||||||
|
- 待处理(open + 依赖已满足)
|
||||||
|
|
||||||
|
### 第三步:获取 PRs 状态
|
||||||
|
|
||||||
|
依据 `.claude/commands/gitea/API-QUICK-REFERENCE.md` 文档中的 Pull Request 操作指南获取所有 PRs,并按状态分类:
|
||||||
|
- 已合并(merged)
|
||||||
|
- 审核中(open + 有审核评论)
|
||||||
|
- 需修改(open + REQUEST_CHANGES)
|
||||||
|
- 待审核(open + 无审核)
|
||||||
|
|
||||||
|
### 第四步:获取定时任务状态
|
||||||
|
|
||||||
|
使用 CronList 获取所有定时任务,显示:
|
||||||
|
- 任务 ID
|
||||||
|
- 运行状态
|
||||||
|
- 下次执行时间
|
||||||
|
|
||||||
|
### 第五步:获取最近提交
|
||||||
|
|
||||||
|
依据 `.claude/commands/gitea/API-QUICK-REFERENCE.md` 文档中的仓库操作指南获取最近 5 个提交。
|
||||||
|
|
||||||
|
### 第六步:格式化输出
|
||||||
|
|
||||||
|
生成清晰的状态报告。
|
||||||
|
|
||||||
|
## 示例输出
|
||||||
|
|
||||||
|
```
|
||||||
|
📊 项目状态 - task-manager-unity
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
Issues:
|
||||||
|
✅ 已完成: 2
|
||||||
|
🔄 进行中: 1
|
||||||
|
⏸️ 等待中: 2
|
||||||
|
📋 待处理: 1
|
||||||
|
|
||||||
|
PRs:
|
||||||
|
✅ 已合并: 2
|
||||||
|
🔍 审核中: 1
|
||||||
|
❌ 需修改: 0
|
||||||
|
|
||||||
|
定时任务:
|
||||||
|
• Code Agent: ✅ 运行中 (下次: 3 分钟后)
|
||||||
|
• PR Agent: ✅ 运行中 (下次: 7 分钟后)
|
||||||
|
|
||||||
|
最近提交:
|
||||||
|
• abc1234 - feat: 添加任务状态管理 (2 小时前)
|
||||||
|
• def5678 - feat: 实现任务CRUD (5 小时前)
|
||||||
|
• ghi9012 - chore: 初始化项目 (1 天前)
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
📈 进度概览:
|
||||||
|
Issues 完成率: 33% (2/6)
|
||||||
|
PRs 合并率: 67% (2/3)
|
||||||
|
|
||||||
|
💡 建议:
|
||||||
|
• 1 个 Issue 等待处理,可以加速开发
|
||||||
|
• 1 个 PR 正在审核,请及时处理
|
||||||
|
```
|
||||||
|
|
||||||
|
## 状态说明
|
||||||
|
|
||||||
|
### Issues 状态
|
||||||
|
- ✅ **已完成**: Issue 已关闭
|
||||||
|
- 🔄 **进行中**: Issue 打开但有关联的 PR
|
||||||
|
- ⏸️ **等待中**: Issue 打开但依赖未满足
|
||||||
|
- 📋 **待处理**: Issue 打开且可以开始处理
|
||||||
|
|
||||||
|
### PRs 状态
|
||||||
|
- ✅ **已合并**: PR 已合并到主分支
|
||||||
|
- 🔍 **审核中**: PR 打开且有人审核
|
||||||
|
- ❌ **需修改**: PR 被要求修改
|
||||||
|
- ⏳ **待审核**: PR 打开但未审核
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **实时性**: 状态信息是实时的,每次调用都会获取最新数据
|
||||||
|
2. **缓存**: API 调用可能有短暂的缓存延迟
|
||||||
|
3. **权限**: 需要有仓库的读取权限
|
||||||
|
|
||||||
|
## 相关命令
|
||||||
|
|
||||||
|
- `/gitea-start-scheduler` - 启动定时任务
|
||||||
|
- `/gitea-stop-scheduler` - 停止定时任务
|
||||||
|
- `/gitea-process-issue` - 手动处理 Issue
|
||||||
54
.claude/commands/gitea/stop-scheduler.md
Normal file
54
.claude/commands/gitea/stop-scheduler.md
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
name: gitea-stop-scheduler
|
||||||
|
description: 停止所有定时任务
|
||||||
|
---
|
||||||
|
|
||||||
|
停止正在运行的定时任务。
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
|
||||||
|
### 第一步:列出所有定时任务
|
||||||
|
|
||||||
|
使用 CronList 获取所有当前运行的定时任务。
|
||||||
|
|
||||||
|
### 第二步:停止所有任务
|
||||||
|
|
||||||
|
对每个任务使用 CronDelete 停止它。
|
||||||
|
|
||||||
|
### 第三步:确认停止
|
||||||
|
|
||||||
|
显示已停止的任务列表。
|
||||||
|
|
||||||
|
## 示例输出
|
||||||
|
|
||||||
|
```
|
||||||
|
⏹️ 停止定时任务
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
📋 正在运行的定时任务:
|
||||||
|
• job-abc123 (Code Agent)
|
||||||
|
• job-def456 (PR Agent)
|
||||||
|
|
||||||
|
✅ 已停止任务:
|
||||||
|
• job-abc123 - Code Agent
|
||||||
|
• job-def456 - PR Agent
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
✨ 所有定时任务已停止!
|
||||||
|
|
||||||
|
💡 提示:
|
||||||
|
• 使用 /gitea-start-scheduler 重新启动
|
||||||
|
• 任务状态不会保存,需要重新创建
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **不可恢复**: 停止后无法恢复,需要重新创建定时任务
|
||||||
|
2. **正在进行**: 如果有 Agent 正在工作,它不会立即停止,而是完成当前任务
|
||||||
|
3. **清理**: 停止任务不会删除已创建的代码或 PRs
|
||||||
|
|
||||||
|
## 相关命令
|
||||||
|
|
||||||
|
- `/gitea-start-scheduler` - 启动定时任务
|
||||||
|
- `/gitea-status` - 查看任务状态
|
||||||
1
.claude/scheduled_tasks.lock
Normal file
1
.claude/scheduled_tasks.lock
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"sessionId":"b4342e69-6a61-4e0d-8cc2-828e5e2b3ac1","pid":51948,"acquiredAt":1773907142799}
|
||||||
5
.claude/settings.local.json
Normal file
5
.claude/settings.local.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"defaultMode": "bypassPermissions"
|
||||||
|
}
|
||||||
|
}
|
||||||
56
.gitignore
vendored
Normal file
56
.gitignore
vendored
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# Dependencies
|
||||||
|
node_modules
|
||||||
|
.pnp
|
||||||
|
.pnp.js
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# Next.js
|
||||||
|
.next/
|
||||||
|
out/
|
||||||
|
build
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Production
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
.DS_Store
|
||||||
|
*.pem
|
||||||
|
|
||||||
|
# Debug
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Local env files
|
||||||
|
.env
|
||||||
|
.env*.local
|
||||||
|
|
||||||
|
# Vercel
|
||||||
|
.vercel
|
||||||
|
|
||||||
|
# TypeScript
|
||||||
|
*.tsbuildinfo
|
||||||
|
next-env.d.ts
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
|
||||||
|
# Turborepo
|
||||||
|
.turbo
|
||||||
|
|
||||||
|
# Database
|
||||||
|
*.sqlite
|
||||||
|
*.db
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# OS
|
||||||
|
Thumbs.db
|
||||||
106
2026-03-19_15-49-18-TaskManager-requirements.md
Normal file
106
2026-03-19_15-49-18-TaskManager-requirements.md
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
# 项目需求文档
|
||||||
|
|
||||||
|
**项目名称**: TaskManager
|
||||||
|
**创建时间**: 2026-03-19 15:49:18
|
||||||
|
**项目类型**: Web 应用(前端 + 后端)
|
||||||
|
|
||||||
|
## 项目描述
|
||||||
|
|
||||||
|
任务管理器 - 一个用于创建、管理和组织任务的 Web 应用系统。支持任务的完整生命周期管理,包括创建、编辑、状态管理和归档功能。
|
||||||
|
|
||||||
|
## 核心功能
|
||||||
|
|
||||||
|
1. **创建任务** - 用户可以创建新任务,填写任务名称、描述等信息
|
||||||
|
2. **编辑任务** - 修改任务的各项属性和信息
|
||||||
|
3. **删除任务** - 移除不再需要的任务
|
||||||
|
4. **修改任务状态** - 更新任务的完成状态(待办/进行中/已完成等)
|
||||||
|
5. **归档任务** - 将已完成或不再活跃的任务归档保存
|
||||||
|
6. **标签任务** - 为任务添加标签以便分类和筛选
|
||||||
|
|
||||||
|
## 技术栈
|
||||||
|
|
||||||
|
### 编程语言
|
||||||
|
- TypeScript
|
||||||
|
|
||||||
|
### 框架
|
||||||
|
- **前端**: Next.js(React 全栈框架)
|
||||||
|
- **后端**: NestJS(企业级 Node.js 框架)
|
||||||
|
|
||||||
|
### 数据库
|
||||||
|
- SQLite(嵌入式关系型数据库)
|
||||||
|
|
||||||
|
### 其他工具
|
||||||
|
- **认证**: 需要用户认证功能
|
||||||
|
- **API 文档**: 需要(Swagger/OpenAPI 自动生成)
|
||||||
|
- **测试框架**: 待定
|
||||||
|
|
||||||
|
## 依赖关系
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────┐
|
||||||
|
│ TaskManager 应用 │
|
||||||
|
├─────────────────┬───────────────────────────┤
|
||||||
|
│ Next.js 前端 │ NestJS 后端 │
|
||||||
|
│ (React SSR) │ (RESTful API) │
|
||||||
|
├─────────────────┴───────────────────────────┤
|
||||||
|
│ SQLite 数据库 │
|
||||||
|
├─────────────────────────────────────────────┤
|
||||||
|
│ 认证系统 + API 文档 │
|
||||||
|
└─────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## 项目结构建议
|
||||||
|
|
||||||
|
```
|
||||||
|
taskmanager/
|
||||||
|
├── frontend/ # Next.js 前端项目
|
||||||
|
│ ├── app/ # App Router 路由
|
||||||
|
│ ├── components/ # React 组件
|
||||||
|
│ └── lib/ # 前端工具库
|
||||||
|
├── backend/ # NestJS 后端项目
|
||||||
|
│ ├── src/
|
||||||
|
│ │ ├── modules/ # 功能模块
|
||||||
|
│ │ ├── common/ # 公共代码
|
||||||
|
│ │ └── config/ # 配置文件
|
||||||
|
│ └── test/ # 测试文件
|
||||||
|
├── docs/ # 项目文档
|
||||||
|
│ ├── plan/ # 开发计划
|
||||||
|
│ └── modules/ # 模块文档
|
||||||
|
├── CLAUDE.md # 开发规范
|
||||||
|
└── README.md # 项目说明
|
||||||
|
```
|
||||||
|
|
||||||
|
## 开发阶段建议
|
||||||
|
|
||||||
|
### 阶段一:基础架构搭建
|
||||||
|
- 初始化 Next.js 前端项目
|
||||||
|
- 初始化 NestJS 后端项目
|
||||||
|
- 配置 SQLite 数据库连接
|
||||||
|
- 配置 TypeScript 编译环境
|
||||||
|
|
||||||
|
### 阶段二:认证系统实现
|
||||||
|
- 实现用户注册/登录
|
||||||
|
- JWT Token 认证机制
|
||||||
|
- 路由权限保护
|
||||||
|
|
||||||
|
### 阶段三:核心功能开发
|
||||||
|
- 任务 CRUD 操作
|
||||||
|
- 任务状态管理
|
||||||
|
- 标签系统
|
||||||
|
- 归档功能
|
||||||
|
|
||||||
|
### 阶段四:API 文档与测试
|
||||||
|
- 集成 Swagger 文档
|
||||||
|
- 编写单元测试
|
||||||
|
- 编写集成测试
|
||||||
|
|
||||||
|
## 备注
|
||||||
|
|
||||||
|
- 项目采用前后端分离架构,前端使用 Next.js,后端使用 NestJS
|
||||||
|
- 数据库选择 SQLite 便于快速开发和部署
|
||||||
|
- 需要特别注意前后端的 API 接口设计和数据交互
|
||||||
|
- 建议使用 monorepo 结构管理前后端代码
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**下一步操作**: 使用 `/gitea-init-project` 初始化项目并创建 Gitea Issues
|
||||||
52
CLAUDE.md
Normal file
52
CLAUDE.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# 开发规范
|
||||||
|
## 工作要求
|
||||||
|
1. 行动前必须先要做计划,行动前必须先要做计划,行动前必须先要做计划。
|
||||||
|
2. 项目的具体描述在同级目录下:READMD.md 文档中。
|
||||||
|
|
||||||
|
## 编码规范
|
||||||
|
1. 编码前必须先要做计划,编码前必须先要做计划,编码前必须先要做计划。
|
||||||
|
2. 计划文档放置在当前目录 docs/plan,按照 [yyyy-MM-dd_HH-mm]_[模块名].md 格式命名。
|
||||||
|
3. 依据计划拆解任务,编码严格遵循计划。
|
||||||
|
4. 完成编码需要测试所有功能与函数。
|
||||||
|
5. 测试通过后,创建或更新文档(位于当前目录 docs/modules/ 下),提交 Git。
|
||||||
|
|
||||||
|
## 命名规范
|
||||||
|
1. 命名须具备描述性,严禁使用拼音、无意义缩写。
|
||||||
|
2. 类名使用 UpperCamelCase,方法/变量使用 lowerCamelCase,常量使用 UPPER_SNAKE_CASE。
|
||||||
|
3. 布尔变量/方法前缀须为 is、has 或 can。
|
||||||
|
|
||||||
|
## 注释规范
|
||||||
|
1. 公共类、公共方法必须添加文档注释,说明功能、参数及返回值。
|
||||||
|
2. 复杂逻辑或算法须在代码块上方添加行内注释解释意图。
|
||||||
|
3. 代码修改时须同步更新相关注释,严禁注释与代码不一致。
|
||||||
|
4. 禁止保留废弃代码注释或无用的署名注释。
|
||||||
|
|
||||||
|
## 项目结构规范
|
||||||
|
1. 源码置于 src 目录,测试代码置于 tests 目录。
|
||||||
|
2. 文档置于 docs 目录,环境配置置于 config 或根目录。
|
||||||
|
3. 单个文件代码行数不宜超过 500 行,超过时须拆分。
|
||||||
|
|
||||||
|
## Git 规范
|
||||||
|
1. 提交粒度须原子化,每次提交仅解决一个具体问题。
|
||||||
|
2. Commit Message 格式:<type>(<scope>): <subject>。
|
||||||
|
3. type: feat (新功能), fix (修复), docs (文档), refactor (重构), test (测试)。
|
||||||
|
示例:feat(user): add login module。
|
||||||
|
4. 禁止直接提交至主分支,须从开发分支提交 Pull Request/Merge Request。
|
||||||
|
|
||||||
|
## 测试规范
|
||||||
|
1. 核心业务逻辑须有单元测试覆盖。
|
||||||
|
2. 测试须遵循 AAA 原则:Arrange (准备), Act (执行), Assert (断言)。
|
||||||
|
3. 测试用例须覆盖正常流程、边界条件及异常情况。
|
||||||
|
4. 提交代码前须确保所有测试用例通过。
|
||||||
|
|
||||||
|
## 依赖管理规范
|
||||||
|
1. 禁止私自引入未经评估的依赖库。
|
||||||
|
2. 依赖版本须锁定,禁止使用模糊版本号 (如 ^, ~, *)。
|
||||||
|
3. 引入新依赖须在文档中说明用途及理由。
|
||||||
|
|
||||||
|
## 禁止事项
|
||||||
|
1. 禁止未经计划的直接编码。
|
||||||
|
2. 禁止提交包含敏感信息(密钥、账号密码)的代码。
|
||||||
|
3. 禁止在循环中执行数据库查询或网络请求。
|
||||||
|
4. 禁止使用 console.log 或 print 进行调试后遗留的输出语句。
|
||||||
|
5. 禁止忽略编译器或 Linter 的错误与警告。
|
||||||
101
README.md
101
README.md
@ -1,3 +1,100 @@
|
|||||||
# taskmanager
|
# TaskManager
|
||||||
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - һ<><D2BB><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֯<EFBFBD><D6AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Web Ӧ<><D3A6>ϵͳ
|
一个用于创建、管理和组织任务的 Web 应用系统。
|
||||||
|
|
||||||
|
## 🏗️ 项目结构
|
||||||
|
|
||||||
|
这是一个 monorepo 项目,使用 Turborepo 管理。
|
||||||
|
|
||||||
|
```
|
||||||
|
taskmanager/
|
||||||
|
├── frontend/ # Next.js 前端应用
|
||||||
|
├── backend/ # NestJS 后端 API
|
||||||
|
├── docs/ # 项目文档
|
||||||
|
│ ├── plan/ # 开发计划
|
||||||
|
│ └── modules/ # 模块文档
|
||||||
|
├── package.json # 根 package.json
|
||||||
|
└── turbo.json # Turborepo 配置
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 快速开始
|
||||||
|
|
||||||
|
### 环境要求
|
||||||
|
|
||||||
|
- Node.js >= 18.0.0
|
||||||
|
- npm >= 10.0.0
|
||||||
|
|
||||||
|
### 安装依赖
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 安装所有依赖
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 开发模式
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 同时启动前端和后端
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# 仅启动前端
|
||||||
|
cd frontend && npm run dev
|
||||||
|
|
||||||
|
# 仅启动后端
|
||||||
|
cd backend && npm run start:dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### 构建
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 测试
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run test
|
||||||
|
```
|
||||||
|
|
||||||
|
### 代码检查
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run lint
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📦 技术栈
|
||||||
|
|
||||||
|
### 前端
|
||||||
|
- **框架**: Next.js 14
|
||||||
|
- **语言**: TypeScript
|
||||||
|
- **样式**: Tailwind CSS
|
||||||
|
- **开发工具**: ESLint, Prettier
|
||||||
|
|
||||||
|
### 后端
|
||||||
|
- **框架**: NestJS 10
|
||||||
|
- **语言**: TypeScript
|
||||||
|
- **数据库**: SQLite(待配置)
|
||||||
|
- **ORM**: TypeORM(待配置)
|
||||||
|
- **开发工具**: ESLint, Prettier, Jest
|
||||||
|
|
||||||
|
## 📖 文档
|
||||||
|
|
||||||
|
- [开发规范](./CLAUDE.md)
|
||||||
|
- [需求文档](./2026-03-19_15-49-18-TaskManager-requirements.md)
|
||||||
|
- [实施计划](./docs/plan/2026-03-19_issue-1.md)
|
||||||
|
|
||||||
|
## 🔗 相关链接
|
||||||
|
|
||||||
|
- [Gitea 仓库](http://192.168.2.200:3000/chen/taskmanager)
|
||||||
|
- [Issues 列表](http://192.168.2.200:3000/chen/taskmanager/issues)
|
||||||
|
|
||||||
|
## 📝 开发进度
|
||||||
|
|
||||||
|
- [x] Issue #1: 项目初始化和环境配置
|
||||||
|
- [ ] Issue #2: 数据模型设计和数据库初始化
|
||||||
|
- [ ] Issue #3: 用户认证系统
|
||||||
|
- [ ] 更多功能开发中...
|
||||||
|
|
||||||
|
## 📄 License
|
||||||
|
|
||||||
|
待添加
|
||||||
|
|||||||
29
backend/README.md
Normal file
29
backend/README.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# TaskManager Backend
|
||||||
|
|
||||||
|
NestJS 后端 API 服务
|
||||||
|
|
||||||
|
## 开发
|
||||||
|
|
||||||
|
\`\`\`bash
|
||||||
|
npm install
|
||||||
|
npm run start:dev
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
## 构建
|
||||||
|
|
||||||
|
\`\`\`bash
|
||||||
|
npm run build
|
||||||
|
npm run start:prod
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
## 测试
|
||||||
|
|
||||||
|
\`\`\`bash
|
||||||
|
npm run test
|
||||||
|
npm run test:cov
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
## API 端点
|
||||||
|
|
||||||
|
- GET / - 欢迎消息
|
||||||
|
- GET /health - 健康检查
|
||||||
7
backend/nest-cli.json
Normal file
7
backend/nest-cli.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"collection": "@nestjs/schematics",
|
||||||
|
"sourceRoot": "src",
|
||||||
|
"compilerOptions": {
|
||||||
|
"deleteOutDir": true
|
||||||
|
}
|
||||||
|
}
|
||||||
58
backend/package.json
Normal file
58
backend/package.json
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"name": "backend",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "nest build",
|
||||||
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
||||||
|
"start": "nest start",
|
||||||
|
"start:dev": "nest start --watch",
|
||||||
|
"start:debug": "nest start --debug --watch",
|
||||||
|
"start:prod": "node dist/main",
|
||||||
|
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
||||||
|
"test": "jest",
|
||||||
|
"test:watch": "jest --watch",
|
||||||
|
"test:cov": "jest --coverage",
|
||||||
|
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
||||||
|
"test:e2e": "jest --config ./test/jest-e2e.json"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@nestjs/common": "^10.0.0",
|
||||||
|
"@nestjs/core": "^10.0.0",
|
||||||
|
"@nestjs/platform-express": "^10.0.0",
|
||||||
|
"reflect-metadata": "^0.1.13",
|
||||||
|
"rxjs": "^7.8.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@nestjs/cli": "^10.0.0",
|
||||||
|
"@nestjs/schematics": "^10.0.0",
|
||||||
|
"@nestjs/testing": "^10.0.0",
|
||||||
|
"@types/express": "^4.17.17",
|
||||||
|
"@types/jest": "^29.5.2",
|
||||||
|
"@types/node": "^20.3.1",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
||||||
|
"@typescript-eslint/parser": "^6.0.0",
|
||||||
|
"eslint": "^8.42.0",
|
||||||
|
"eslint-config-prettier": "^9.0.0",
|
||||||
|
"eslint-plugin-prettier": "^5.0.0",
|
||||||
|
"jest": "^29.5.0",
|
||||||
|
"prettier": "^3.0.0",
|
||||||
|
"source-map-support": "^0.5.21",
|
||||||
|
"ts-jest": "^29.1.0",
|
||||||
|
"ts-loader": "^9.4.3",
|
||||||
|
"ts-node": "^10.9.1",
|
||||||
|
"tsconfig-paths": "^4.2.0",
|
||||||
|
"typescript": "^5.1.3"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"moduleFileExtensions": ["js", "json", "ts"],
|
||||||
|
"rootDir": "src",
|
||||||
|
"testRegex": ".*\\.spec\\.ts$",
|
||||||
|
"transform": {
|
||||||
|
"^.+\\.(t|j)s$": "ts-jest"
|
||||||
|
},
|
||||||
|
"collectCoverageFrom": ["**/*.(t|j)s"],
|
||||||
|
"coverageDirectory": "../coverage",
|
||||||
|
"testEnvironment": "node"
|
||||||
|
}
|
||||||
|
}
|
||||||
22
backend/src/app.controller.spec.ts
Normal file
22
backend/src/app.controller.spec.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import { Test, TestingModule } from '@nestjs/testing';
|
||||||
|
import { AppController } from './app.controller';
|
||||||
|
import { AppService } from './app.service';
|
||||||
|
|
||||||
|
describe('AppController', () => {
|
||||||
|
let appController: AppController;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
const app: TestingModule = await Test.createTestingModule({
|
||||||
|
controllers: [AppController],
|
||||||
|
providers: [AppService],
|
||||||
|
}).compile();
|
||||||
|
|
||||||
|
appController = app.get<AppController>(AppController);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('root', () => {
|
||||||
|
it('should return "TaskManager Backend API is running!"', () => {
|
||||||
|
expect(appController.getHello()).toBe('TaskManager Backend API is running!');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
20
backend/src/app.controller.ts
Normal file
20
backend/src/app.controller.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { Controller, Get } from '@nestjs/common';
|
||||||
|
import { AppService } from './app.service';
|
||||||
|
|
||||||
|
@Controller()
|
||||||
|
export class AppController {
|
||||||
|
constructor(private readonly appService: AppService) {}
|
||||||
|
|
||||||
|
@Get()
|
||||||
|
getHello(): string {
|
||||||
|
return this.appService.getHello();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Get('health')
|
||||||
|
health() {
|
||||||
|
return {
|
||||||
|
status: 'ok',
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
10
backend/src/app.module.ts
Normal file
10
backend/src/app.module.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import { AppController } from './app.controller';
|
||||||
|
import { AppService } from './app.service';
|
||||||
|
|
||||||
|
@Module({
|
||||||
|
imports: [],
|
||||||
|
controllers: [AppController],
|
||||||
|
providers: [AppService],
|
||||||
|
})
|
||||||
|
export class AppModule {}
|
||||||
8
backend/src/app.service.ts
Normal file
8
backend/src/app.service.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class AppService {
|
||||||
|
getHello(): string {
|
||||||
|
return 'TaskManager Backend API is running!';
|
||||||
|
}
|
||||||
|
}
|
||||||
10
backend/src/main.ts
Normal file
10
backend/src/main.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { NestFactory } from '@nestjs/core';
|
||||||
|
import { AppModule } from './app.module';
|
||||||
|
|
||||||
|
async function bootstrap() {
|
||||||
|
const app = await NestFactory.create(AppModule);
|
||||||
|
app.enableCors();
|
||||||
|
await app.listen(3001);
|
||||||
|
console.log('Backend is running on: http://localhost:3001');
|
||||||
|
}
|
||||||
|
bootstrap();
|
||||||
21
backend/tsconfig.json
Normal file
21
backend/tsconfig.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "commonjs",
|
||||||
|
"declaration": true,
|
||||||
|
"removeComments": true,
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"target": "ES2021",
|
||||||
|
"sourceMap": true,
|
||||||
|
"outDir": "./dist",
|
||||||
|
"baseUrl": "./",
|
||||||
|
"incremental": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strictNullChecks": false,
|
||||||
|
"noImplicitAny": false,
|
||||||
|
"strictBindCallApply": false,
|
||||||
|
"forceConsistentCasingInFileNames": false,
|
||||||
|
"noFallthroughCasesInSwitch": false
|
||||||
|
}
|
||||||
|
}
|
||||||
50
docs/plan/2026-03-19_issue-1.md
Normal file
50
docs/plan/2026-03-19_issue-1.md
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Issue #1 实施计划
|
||||||
|
|
||||||
|
**Issue**: [基础] 项目初始化和环境配置
|
||||||
|
**分支**: feature/issue-1
|
||||||
|
**预计时间**: 4-6 小时
|
||||||
|
|
||||||
|
## 实施步骤
|
||||||
|
|
||||||
|
### 阶段一:Monorepo 结构(30分钟)
|
||||||
|
- [x] 创建根目录结构
|
||||||
|
- [ ] 初始化 package.json(工作区配置)
|
||||||
|
- [ ] 配置 Turborepo
|
||||||
|
- [ ] 创建基础文档目录
|
||||||
|
|
||||||
|
### 阶段二:前端项目 - Next.js(1.5小时)
|
||||||
|
- [ ] 创建 Next.js 项目(frontend/)
|
||||||
|
- [ ] 配置 TypeScript
|
||||||
|
- [ ] 配置 ESLint + Prettier
|
||||||
|
- [ ] 配置 Tailwind CSS
|
||||||
|
- [ ] 创建目录结构
|
||||||
|
|
||||||
|
### 阶段三:后端项目 - NestJS(1.5小时)
|
||||||
|
- [ ] 创建 NestJS 项目(backend/)
|
||||||
|
- [ ] 配置 TypeScript
|
||||||
|
- [ ] 配置 ESLint + Prettier
|
||||||
|
- [ ] 创建目录结构
|
||||||
|
- [ ] 安装核心依赖
|
||||||
|
|
||||||
|
### 阶段四:数据库配置(1小时)
|
||||||
|
- [ ] 安装 SQLite 和 TypeORM
|
||||||
|
- [ ] 配置数据库连接
|
||||||
|
- [ ] 创建数据库初始化脚本
|
||||||
|
|
||||||
|
### 阶段五:开发工具(30分钟)
|
||||||
|
- [ ] 配置 VS Code 设置
|
||||||
|
- [ ] 创建推荐扩展列表
|
||||||
|
- [ ] 配置调试脚本
|
||||||
|
- [ ] 完善 .gitignore
|
||||||
|
|
||||||
|
## 验收标准
|
||||||
|
- [ ] 前端项目可以成功启动(`npm run dev`)
|
||||||
|
- [ ] 后端项目可以成功启动(`npm run start:dev`)
|
||||||
|
- [ ] 数据库连接正常
|
||||||
|
- [ ] TypeScript 编译无错误
|
||||||
|
- [ ] ESLint 检查通过
|
||||||
|
- [ ] 项目结构符合设计要求
|
||||||
|
|
||||||
|
## 当前进度
|
||||||
|
- ✅ 创建特性分支
|
||||||
|
- ⏳ 阶段一进行中...
|
||||||
17
frontend/README.md
Normal file
17
frontend/README.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# TaskManager Frontend
|
||||||
|
|
||||||
|
Next.js 前端应用
|
||||||
|
|
||||||
|
## 开发
|
||||||
|
|
||||||
|
\`\`\`bash
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
## 构建
|
||||||
|
|
||||||
|
\`\`\`bash
|
||||||
|
npm run build
|
||||||
|
npm start
|
||||||
|
\`\`\`
|
||||||
27
frontend/app/globals.css
Normal file
27
frontend/app/globals.css
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--foreground-rgb: 0, 0, 0;
|
||||||
|
--background-start-rgb: 214, 219, 220;
|
||||||
|
--background-end-rgb: 255, 255, 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root {
|
||||||
|
--foreground-rgb: 255, 255, 255;
|
||||||
|
--background-start-rgb: 0, 0, 0;
|
||||||
|
--background-end-rgb: 0, 0, 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color: rgb(var(--foreground-rgb));
|
||||||
|
background: linear-gradient(
|
||||||
|
to bottom,
|
||||||
|
transparent,
|
||||||
|
rgb(var(--background-end-rgb))
|
||||||
|
)
|
||||||
|
rgb(var(--background-start-rgb));
|
||||||
|
}
|
||||||
22
frontend/app/layout.tsx
Normal file
22
frontend/app/layout.tsx
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import type { Metadata } from 'next'
|
||||||
|
import { Inter } from 'next/font/google'
|
||||||
|
import './globals.css'
|
||||||
|
|
||||||
|
const inter = Inter({ subsets: ['latin'] })
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: 'TaskManager',
|
||||||
|
description: '任务管理系统',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function RootLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<body className={inter.className}>{children}</body>
|
||||||
|
</html>
|
||||||
|
)
|
||||||
|
}
|
||||||
12
frontend/app/page.tsx
Normal file
12
frontend/app/page.tsx
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
export default function Home() {
|
||||||
|
return (
|
||||||
|
<main className="flex min-h-screen flex-col items-center justify-center p-24">
|
||||||
|
<div className="z-10 max-w-5xl w-full items-center justify-center font-mono text-sm">
|
||||||
|
<h1 className="text-4xl font-bold mb-4">TaskManager</h1>
|
||||||
|
<p className="text-xl text-gray-600 dark:text-gray-400">
|
||||||
|
任务管理系统 - 前端应用已成功初始化
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
)
|
||||||
|
}
|
||||||
6
frontend/next.config.js
Normal file
6
frontend/next.config.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
/** @type {import('next').NextConfig} */
|
||||||
|
const nextConfig = {
|
||||||
|
reactStrictMode: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = nextConfig
|
||||||
27
frontend/package.json
Normal file
27
frontend/package.json
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "frontend",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"dev": "next dev",
|
||||||
|
"build": "next build",
|
||||||
|
"start": "next start",
|
||||||
|
"lint": "next lint"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"next": "^14.0.0",
|
||||||
|
"react": "^18.2.0",
|
||||||
|
"react-dom": "^18.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^20.0.0",
|
||||||
|
"@types/react": "^18.2.0",
|
||||||
|
"@types/react-dom": "^18.2.0",
|
||||||
|
"autoprefixer": "^10.4.0",
|
||||||
|
"eslint": "^8.0.0",
|
||||||
|
"eslint-config-next": "^14.0.0",
|
||||||
|
"postcss": "^8.4.0",
|
||||||
|
"tailwindcss": "^3.3.0",
|
||||||
|
"typescript": "^5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
6
frontend/postcss.config.js
Normal file
6
frontend/postcss.config.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
11
frontend/tailwind.config.js
Normal file
11
frontend/tailwind.config.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
module.exports = {
|
||||||
|
content: [
|
||||||
|
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
|
'./components/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
|
'./app/**/*.{js,ts,jsx,tsx,mdx}',
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
extend: {},
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
}
|
||||||
27
frontend/tsconfig.json
Normal file
27
frontend/tsconfig.json
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "es5",
|
||||||
|
"lib": ["dom", "dom.iterable", "esnext"],
|
||||||
|
"allowJs": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strict": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"module": "esnext",
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"incremental": true,
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"name": "next"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./*"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
24
package.json
Normal file
24
package.json
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"name": "taskmanager",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"private": true,
|
||||||
|
"workspaces": [
|
||||||
|
"frontend",
|
||||||
|
"backend"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"dev": "turbo run dev",
|
||||||
|
"build": "turbo run build",
|
||||||
|
"test": "turbo run test",
|
||||||
|
"lint": "turbo run lint",
|
||||||
|
"format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\""
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"turbo": "^2.0.0",
|
||||||
|
"prettier": "^3.0.0"
|
||||||
|
},
|
||||||
|
"packageManager": "npm@10.0.0",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
21
turbo.json
Normal file
21
turbo.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://turbo.build/schema.json",
|
||||||
|
"globalDependencies": ["**/.env.*local"],
|
||||||
|
"tasks": {
|
||||||
|
"build": {
|
||||||
|
"dependsOn": ["^build"],
|
||||||
|
"outputs": [".next/**", "!.next/cache/**", "dist/**"]
|
||||||
|
},
|
||||||
|
"dev": {
|
||||||
|
"cache": false,
|
||||||
|
"persistent": true
|
||||||
|
},
|
||||||
|
"lint": {
|
||||||
|
"dependsOn": ["^lint"]
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"dependsOn": ["^build"],
|
||||||
|
"outputs": ["coverage/**"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user