# 初始化 MRCC 项目

## Summary

将 MRCC (MineRedCircuitcraft) 从空目录初始化为完整的 monorepo 骨架，包含 Unity 客户端和 Go 后端（6 个服务），每个服务具备 `/health` 健康检查端点并可独立启动。对应开发文档 Sprint 1 的交付目标。

## Current State Analysis

| 项目 | 状态 |
|------|------|
| Git 仓库 | 已初始化，main 分支，remote: `dcp.itnet.buzz/Deaicup/MRCC` |
| 现有文件 | `README.md`、`完整开发文档.html` |
| Go | **未安装** |
| Docker | **未安装** |
| Unity CLI | 不在 PATH 中（可能已安装 Editor） |

开发文档定义的技术栈：
- 客户端: Unity 2024 LTS (C#)，8 个模块
- 后端: Go 1.22 + Gin，5 个业务微服务 + 1 个联机中转站
- 基础设施: PostgreSQL 16、Redis 7.2、MinIO、RabbitMQ 3.13

## Prerequisites

执行前需安装（可通过 dev-env-expert 辅助）：
1. **Go 1.22+** — 后端编译运行
2. **Docker Desktop** — 开发环境基础设施（PostgreSQL/Redis/MinIO/RabbitMQ）
3. **Unity 2024 LTS** — 客户端打开编辑

> 骨架代码可先创建，Go 安装后即可 `go run` 启动后端。

## Proposed Changes

### 1. 根目录文件 (4 files)

| 文件 | 内容 |
|------|------|
| `.gitignore` | Go + Unity + IDE 忽略规则合并 |
| `docker-compose.dev.yml` | PostgreSQL 16、Redis 7.2、MinIO、RabbitMQ 3.13 开发环境 |
| `Makefile` | 根目录快捷命令：`make dev`（启动基础设施）、`make build-all`、`make run-*` |
| `.github/workflows/ci.yml` | Go build + vet + test；PR 触发 |

### 2. Go 后端 (`server/`)

**Module path**: `mrcc`

```
server/
├── go.mod                          # module mrcc, go 1.22, deps: gin, gorilla/websocket
├── Makefile                        # build / run-* / tidy / lint / test
├── cmd/
│   ├── auth-service/main.go        # :8081, /health
│   ├── economy-service/main.go     # :8082, /health
│   ├── blueprint-service/main.go   # :8083, /health
│   ├── match-service/main.go       # :8084, /health
│   ├── social-service/main.go      # :8085, /health
│   └── relay-server/main.go        # :8086, /health + /ws WebSocket 骨架
├── internal/
│   ├── config/config.go            # 环境变量加载，ServiceConfig 结构体
│   ├── logger/logger.go            # slog 封装，统一日志格式
│   └── httpserver/server.go        # Gin 实例工厂：CORS、Recovery、日志中间件、/health 注册
└── pkg/
    └── response/response.go        # 标准 JSON 响应 {code, message, data}
```

**每个业务微服务 main.go 模式**（以 auth-service 为例）：
```go
package main

import (
    "log"
    "mrcc/internal/config"
    "mrcc/internal/httpserver"
)

func main() {
    cfg := config.Load("auth-service", "8081")
    srv := httpserver.New(cfg)
    log.Printf("auth-service listening on :%s", cfg.Port)
    if err := srv.Run(":" + cfg.Port); err != nil {
        log.Fatal(err)
    }
}
```

**relay-server 额外内容**：
- `/ws` WebSocket 升级端点（gorilla/websocket）
- `Room`、`Player` 结构体定义（对照文档 18.5 节）
- 连接注册/注销 channel 骨架（不实现完整逻辑）

**go.mod 依赖**（最小化）：
- `github.com/gin-gonic/gin v1.10.0`
- `github.com/gorilla/websocket v1.5.3`

### 3. Unity 客户端 (`client/`)

```
client/
├── Assets/
│   └── Scripts/
│       ├── RedCircuit.Grid/            # RedCircuit.Grid.asmdef
│       │   ├── GridCanvas.cs           # 网格画布渲染
│       │   ├── ChunkManager.cs         # 分块管理
│       │   └── TileRenderer.cs         # 瓦片渲染
│       ├── RedCircuit.Simulation/      # RedCircuit.Simulation.asmdef
│       │   ├── SimulationLoop.cs       # 仿真主循环
│       │   ├── SignalPropagator.cs     # 信号传播
│       │   └── ComponentBehavior.cs    # 元件行为基类
│       ├── RedCircuit.Components/      # RedCircuit.Components.asmdef
│       │   ├── ComponentRegistry.cs    # 元件注册表
│       │   ├── PlacementController.cs  # 放置控制器
│       │   └── ComponentData.cs        # 元件数据定义
│       ├── RedCircuit.UI/              # RedCircuit.UI.asmdef
│       │   ├── EditorWindow.cs         # 编辑器窗口
│       │   ├── ToolbarController.cs    # 工具栏
│       │   ├── PalettePanel.cs         # 元件面板
│       │   └── InspectorPanel.cs       # 属性面板
│       ├── RedCircuit.Net/             # RedCircuit.Net.asmdef
│       │   ├── ApiClient.cs            # REST 客户端
│       │   ├── WsClient.cs             # WebSocket 客户端
│       │   └── SyncManager.cs          # 同步管理
│       ├── RedCircuit.Save/            # RedCircuit.Save.asmdef
│       │   ├── SaveManager.cs          # 存档管理
│       │   ├── LocalDatabase.cs        # 本地 SQLite
│       │   └── CloudSync.cs            # 云端同步
│       ├── RedCircuit.Audio/           # RedCircuit.Audio.asmdef
│       │   ├── AudioManager.cs         # 音频管理
│       │   └── NotePlayer.cs           # 音符播放
│       └── RedCircuit.Auth/            # RedCircuit.Auth.asmdef
│           ├── AuthManager.cs          # 认证管理
│           ├── TokenStore.cs           # Token 存储
│           └── OAuthClient.cs          # OAuth 客户端
├── Packages/
│   └── manifest.json                   # Unity 2024 LTS 基础包
└── ProjectSettings/
    └── ProjectVersion.txt              # 2024.2.0f1
```

**每个 C# 脚本模式**（空骨架）：
```csharp
using UnityEngine;

namespace RedCircuit.Grid
{
    /// <summary>网格画布渲染器，负责 PCB 风格网格绘制与视口裁剪。</summary>
    public class GridCanvas : MonoBehaviour
    {
    }
}
```

**Assembly Definition (asmdef) 模式**：
```json
{
    "name": "RedCircuit.Grid",
    "rootNamespace": "RedCircuit.Grid",
    "references": [],
    "includePlatforms": [],
    "excludePlatforms": [],
    "allowUnsafeCode": false,
    "autoReferenced": true,
    "defineConstraints": []
}
```

### 4. 文件清单汇总

| 区域 | 文件数 |
|------|--------|
| 根目录 | 4 |
| server/ (Go) | 16 (go.mod, Makefile, 6×main.go, 4×internal, 1×pkg) |
| client/ (Unity) | 29 (8×asmdef, 24×cs, manifest.json, ProjectVersion.txt) |
| **合计** | **~49 files** |

## Assumptions & Decisions

1. **端口分配**: relay-server 使用 8086（文档中 8084 与 match-service 冲突，调整为 8086）
2. **Go module path**: 使用 `mrcc`（简单私有项目名，可后续改为 VCS URL）
3. **日志**: 使用标准库 `log/slog`，不引入 zap（最小化依赖）
4. **数据库连接**: 骨架阶段不连接实际数据库，docker-compose 仅供后续 Sprint 使用
5. **Unity 场景**: 不手动创建 .unity 场景文件（格式复杂且版本相关），用户在 Unity Editor 中新建
6. **.meta 文件**: 不创建 Unity .meta 文件，Unity Editor 首次打开自动生成
7. **CI**: 仅 Go 后端 CI（Unity CI 需要 Unity License，后续 Sprint 再加）

## Verification Steps

1. **Go 后端编译**:
   ```powershell
   cd server; go mod tidy; go build ./cmd/...
   ```
2. **各服务启动 + 健康检查**:
   ```powershell
   go run ./cmd/auth-service &
   curl http://localhost:8081/health  # 期望 {"code":0,"message":"ok"}
   # 对 8082-8086 重复
   ```
3. **relay-server WebSocket**:
   ```powershell
   # 连接 ws://localhost:8086/ws 应成功升级
   ```
4. **Unity 客户端**:
   - 用 Unity Hub 打开 `client/` 文件夹
   - 无编译错误，8 个 asmdef 程序集均编译通过
5. **Git 提交**:
   ```powershell
   git add -A; git status  # 确认无敏感文件
   ```
