Files
Edu/.trae/rules/project_rules.md
SpecialX a1d7fcfd71
Some checks failed
CI TypeScript / quality (push) Failing after 6s
CI TypeScript / arch-scan (push) Has been skipped
CI TypeScript / docker-build (map[context:. dockerfile:apps/teacher-portal/Dockerfile name:teacher-portal]) (push) Has been skipped
CI TypeScript / docker-build (map[context:. dockerfile:services/classes/Dockerfile name:classes]) (push) Has been skipped
Docker Build & Push / build-push (map[context:. dockerfile:apps/teacher-portal/Dockerfile name:teacher-portal]) (push) Failing after 3s
Docker Build & Push / build-push (map[context:. dockerfile:services/classes/Dockerfile name:classes]) (push) Failing after 10s
Docker Build & Push / build-push (map[context:./services/api-gateway dockerfile:services/api-gateway/Dockerfile name:api-gateway]) (push) Failing after 8s
CI Go / quality (push) Failing after 1m4s
CI Go / docker-build (push) Has been skipped
docs(docs): 新增 CICD 参考实现规范
- project_rules §15.7: 参考项目位置 + 关键配置点(container/runner 标签/部署方式/网络)

- cicd-runbook §10: 参考项目对照表(配置项、关键差异、修改流程、冲突处理)

- 修正 cicd-runbook runner 标签:self-hosted,deploy → ubuntu-latest
2026-07-08 16:12:45 +08:00

27 KiB
Raw Blame History

Edu 项目规则(微服务版)

版本1.0 日期2026-07-08 适用范围Edu 微服务架构DDD + EDA + CQRS多语言 monorepo 关联文档:


1. 架构图优先规则

任何任务开始前,必须先查阅架构影响地图,通过图定位代码和模块。

  1. 先图后码:执行任何分析、修改、搜索任务时,首先运行 pnpm run arch:scan 更新 arch.db再通过 pnpm run arch:query 查询目标模块、函数、依赖关系,结合阅读 docs/architecture/004_architecture_impact_map.md 定位架构设计意图,最后按图索骥读取源码
  2. 图未覆盖则先补图:如果发现项目中存在 arch.db 未记录的模块、函数、表、路由、proto 等结构,必须先运行 pnpm run arch:scan 重新扫描多语言扫描器TS + Go + Python + Proto然后检查 004 是否需要补充
  3. 改码必同步图:对源码的任何修改完成后,必须运行 pnpm run arch:scan 更新 arch.db若架构设计意图有变化同步更新 004

架构文档清单

文档 用途
docs/architecture/004_architecture_impact_map.md 架构设计意图唯一源(人类可读)
docs/architecture/0010_architecture.md 理想蓝图(目标态)
docs/architecture/roadmap/ 长远规划tech-debt / pending-features
docs/architecture/runbooks/ 运维手册P6 硬化、post-p6-followup、incident-response
docs/troubleshooting/known-issues.md 已知问题速查(场景→技术映射 + 工作经验日志)

需要同步图的场景

  • 新增/删除/重命名导出函数、组件、Hook、类型
  • 修改函数签名(参数、返回类型)
  • 修改权限点Permissions 常量)或角色-权限映射
  • 新增/删除数据库表
  • 新增/删除路由页面、API 路由、gRPC 服务、proto message
  • 修改模块间依赖关系或服务间调用关系
  • 新增服务、新增模块、新增 proto 定义
  • 修改 Kafka topic、Outbox 事件命名

同步方式

  • 修改源码后运行 pnpm run arch:scan 更新 arch.db强制
  • 若架构设计意图变化,同步更新 docs/architecture/004_architecture_impact_map.md
  • 若发现新的"场景→技术"映射或工作经验,更新 docs/troubleshooting/known-issues.md

2. 架构元数据库规则arch.db

arch.db 是代码结构唯一源AI 工作前必须运行 pnpm run arch:scan 更新。

  1. 多语言扫描arch.db 覆盖 TypeScriptts-morph、Gotree-sitter-go、Pythontree-sitter-python、Protobuf AST四类语言
  2. 查询命令
    • pnpm run arch:query -- sql "<SQL>" 自定义 SQL 查询
    • pnpm run arch:query -- module-deps 查模块依赖
    • pnpm run arch:query -- module-reverse-deps <module> 查反向依赖
    • pnpm run arch:query -- symbol-refs <symbol> 查符号引用链
    • pnpm run arch:query -- tech-usage <tag> 查技术使用
    • pnpm run arch:query -- violations 查架构违规
    • pnpm run arch:query -- stats 查总体统计
    • pnpm run arch:query -- modules 查模块列表
  3. arch.db 不替代 004arch.db 是"代码现状"004 是"设计意图",两者互补
  4. 预期规模:模块数 ≥ 10api-gateway、push-gateway、teacher-bff、iam、classes、core-edu、content、msg、data-ana、ai符号数 ≥ 100

3. 编码规范

详细规范见 docs/standards/coding-standards.md,以下为核心强制规则。

3.1 代码质量规则

  • 每次修改后运行 pnpm run lintpnpm run typecheck 确保零错误
  • TypeScript 服务必须用 @RequirePermission() 装饰器进行权限校验
  • 前端组件禁止使用 role === "xxx" 硬编码,统一使用 usePermission().hasPermission()
  • 单文件行数遵循企业级规范:
    • 配置文件、常量文件、类型定义文件、proto无限制
    • Controller / Service建议 ≤ 500 行
    • Repository / data-access建议 ≤ 800 行
    • 工具函数:建议 ≤ 40 行
    • 自定义 Hook建议 ≤ 80 行
    • 硬性上限:任何文件不超过 1000 行,超过必须拆分

3.2 架构分层规则(微服务)

  • 四层分层Gateway → BFF → Services → Data
  • 依赖方向单向Gateway → BFF → Services → Data禁止反向依赖
  • 服务间通信:通过 protobuf gRPC 或 Kafka 事件,禁止直接访问对方 DB
  • Gateway 职责JWT 校验、限流、熔断、CORS、请求 ID 注入
  • BFF 职责:聚合多个 Service 的数据,为前端提供场景化 API
  • Service 职责:业务逻辑,每服务独占 DBDDD 限界上下文)

3.3 模块标准结构DDD

services/[service]/src/
├─ [domain]/                  # 限界上下文
│  ├─ *.controller.ts         # ControllerHTTP/gRPC 入口)
│  ├─ *.service.ts            # Application Service编排层
│  ├─ *.repository.ts         # Repository数据访问
│  ├─ *.schema.ts             # Zod 验证
│  └─ *.dto.ts                # DTO
├─ config/                    # 配置database / env / kafka / neo4j / elasticsearch
├─ middleware/                # 中间件auth.middleware / permission.guard
├─ shared/                    # 共享
│  ├─ errors/                 # 错误application-error / global-error.filter
│  ├─ health/                 # 健康检查
│  ├─ lifecycle/              # 生命周期
│  ├─ observability/          # 可观测性logger / metrics / tracer
│  └─ outbox/                 # Outbox仅事件驱动服务
├─ app.module.ts              # 根模块
└─ main.ts                    # 入口

3.4 TypeScript 规则

  • 禁止 any:未知类型用 unknown 并做类型守卫
  • 禁止 as 断言(除非从 unknown 转换或测试中,需注释原因)
  • 函数返回值必须显式标注,特别是 Promise<T>
  • 仅用于类型的导入必须使用 import type
  • 可选链后禁止跟非空断言 !
  • ESM 模式NestJS ESM 模式下,相对 import 的 .js 后缀(构建产物)

3.5 Go 规则

  • 包名小写单词,不使用下划线或驼峰
  • 导出函数必须有 doc comment// FuncName ...
  • 错误处理:if err != nil { return err },禁止 _ = err
  • 不使用 interface{},用 anyGo 1.18+
  • 包内文件命名 lowercase不使用下划线_test.go
  • 中间件位于 internal/middleware/,路由位于 internal/routing/

3.6 Python 规则

  • 类型注解强制(所有函数签名、变量声明)
  • FastAPI 路由用 APIRouter
  • 异步优先:async defIO 密集场景禁止同步阻塞调用
  • 模块名 snake_case类名 PascalCase
  • 配置统一通过 pydantic-settings 管理(config.py

3.7 命名规范(多语言)

对象 规范 示例
目录 kebab-case api-gateway/core-edu/
TS 组件 PascalCase UserController.ts
TS Hook camelCase useAuth.ts
Go 文件 lowercase circuitbreaker.go
Python 文件 snake_case clickhouse_client.py
Proto 文件 snake_case core_edu.proto
变量/函数 camelCaseTS/ lowercaseGo/ snake_casePy getUserById / getUserById / get_user_by_id
常量 UPPER_SNAKE_CASE MAX_RETRY_COUNT
类/接口 PascalCase接口不加 I 前缀 UserService
布尔值 is/has/can/should 前缀 isActivehasPermission

3.8 Controller / Server Action 规范

  • 每个 Controller 方法必须用 @RequirePermission() 装饰器声明权限
  • 输入用 Zod / class-validator 验证,验证失败返回结构化错误
  • 返回 protobuf message 或 DTO结构同 ActionState
  • 错误统一走 GlobalErrorFilter
  • BFF Controller 聚合多个 Service 调用,禁止直接访问 DB

3.9 Tailwind 规范

  • 使用 cn() 工具函数管理条件类名
  • 禁止字符串拼接动态类名(bg-${color}-500
  • 禁止使用任意值(w-[137px]),除非有充分理由并注释
  • 设计令牌在 packages/shared-tokens/(待建立)或 apps/teacher-portal/src/app/styles/tokens/

3.10 设计令牌规范(强制)

  • 禁止硬编码颜色TSX/TS/CSS 中不得出现 #hex 颜色字面量,统一使用 hsl(var(--*)) 或 Tailwind 类 bg-*
  • 禁止硬编码字体:不得出现 'Inter'/'Fraunces'/'JetBrains Mono' 字面量,使用 var(--font-family-sans/serif/mono)
  • 禁止硬编码字号:不得出现 font-size: Npx,使用 var(--font-size-1~9)
  • 禁止 Tailwind 任意值:不得使用 w-[Npx]/h-[Npx]/p-[Npx] 等,映射到 --space-* 或 Tailwind 默认阶梯
  • 三层令牌
    • Layer 1 Primitive原始色板/字号/间距/阴影,业务代码不直接引用
    • Layer 2 Semantic语义令牌light/dark业务代码唯一引用入口
    • Layer 3 Tailwind Theme@theme inline 将 Semantic 令牌暴露为 bg-*/text-*/font-*
  • 改令牌必同步图:修改令牌定义后,同步更新 004 与 arch.db
  • ESLint 强制约束
    • no-restricted-syntax:禁止 #hex 字面量
    • design-tokens/no-hardcoded-fonts:禁止 'Inter'/'Fraunces' 字面量
    • 白名单:primitive.cssemail-channelmanifest.ts

4. 安全规范

  • JWT RS256IAM 签发Gateway 公钥校验(不共享密钥)
  • CookiehttpOnly + Secure + SameSite=Strict
  • 环境变量:服务端变量不加 NEXT_PUBLIC_ 前缀;前端变量必须加
  • 环境校验:用 @t3-oss/env-nextjs + Zod 或 pydantic-settings 校验
  • 禁止 dangerouslySetInnerHTML(如必须使用,先用 DOMPurify 清洗)
  • 密码哈希bcryptcost ≥ 12禁止 MD5/SHA1
  • 限流Gateway 层 IP 级令牌桶,登录接口额外加用户级限流
  • CORS:白名单域名,禁止 *
  • WAF:见 infra/security/waf-rules.conf

5. 契约规范

  • 契约先行:服务间通信先定 .proto,再写实现
  • 工具链protobuf + buf v2
  • buf lintSTANDARD 规则集
  • buf breakingFILE 级别检查CI 强制)
  • proto 文件位置packages/shared-proto/proto/
  • 包名规范edu.<domain>.v1(如 edu.iam.v1edu.core_edu.v1
  • 生成代码buf generateTS 走 buf.gen.yamlGo/Python 各自配置)
  • gRPC 服务端口:每服务独立端口,见 004 服务清单

6. 事件驱动规范

  • Outbox 模式:事务内写业务表 + outbox 表,独立 publisher 投递到 Kafka保证 at-least-once
  • 事件命名<Aggregate>.<Action>(如 ExamCreatedHomeworkSubmittedGradeReleased
  • TOPIC_MAP 路由:每个服务维护 事件 → topic 映射(见 shared/outbox/
  • 幂等性
    • Kafka produceridempotent=true + transactionalId
    • Consumer基于 event_id 去重Redis SETNX 或 DB 唯一索引)
  • CDCMySQL → Debezium → Kafka可选用于读模型同步
  • 事件版本schema 演化用 v1/v2 后缀,禁止破坏性变更

7. 提交规范

  • 使用 Conventional Commits 格式:feat(scope): description
  • 类型featfixchoredocsstylerefactortestperfci
  • scope(服务名或包名):
    • 服务:iamclassescore-educontentmsgaidata-anaapi-gatewaypush-gatewayteacher-bff
    • 包:shared-protoshared-tsshared-goshared-pyshared-tokens
    • 基础设施:infrak8shelmci
    • 文档:docs
  • 提交前必须运行pnpm run lint + pnpm run typecheckTSgo vet ./...Goruff check src/Python
  • commitlint + husky:强制校验(见 .commitlintrc.js.husky/commit-msg

8. Git 工作流

  • 分支策略trunk-based直接提交 main 分支,小项目)
  • 大型团队feature branch + PRPR 至少 1 人 review
  • pre-commit hooklint-staged 自动修复 + 校验(见 lint-staged.config.js
  • commit-msg hookcommitlint 校验格式
  • 禁止 force push:除非显式要求并通知团队

9. 问题记录规则

所有工作完成后,必须将遇到的问题记录到 docs/troubleshooting/known-issues.md(索引式速查手册)。

必须记录的场景

场景 记录要求
构建报错dev/build/lint/tsc/go vet/ruff 记录到"全局经验"对应主题分区
运行时异常(白屏/API 报错/数据加载失败/gRPC 错误) 记录到"模块经验"对应模块分区
框架/库版本兼容问题 记录到"全局经验: 框架与运行时"
依赖配置问题go mod / uv / pnpm workspace 记录到"全局经验: 依赖管理"
架构约束违规(跨服务访问 DB / 缺契约) 记录到"全局经验: 架构约束"
多语言 monorepo 问题(共享包链接失败等) 记录到"全局经验: 多语言 monorepo"

记录格式

索引式表格,指明"场景→技术/规则"映射,不写多行代码示例:

### X.X 主题分区

| 场景     | 技术/规则          |
| -------- | ------------------ |
| 简述场景 | 正确做法(一句话) |

记录要求

  • 索引式:场景→技术/规则映射,不写代码示例和错误示范列
  • 去重:同类问题在原条目补充,不重复创建
  • 引用架构规则:架构分层、模块结构等规则引用 004 和本规则文件,不重复
  • 工作经验日志:在"工作经验日志"区按时间倒序追加50 条上限),记录"做了什么/学到什么/下次注意"

10. AI 工作强制流程

所有 AI 工作必须遵循此流程,违反即违规。

阶段 1上下文加载

  1. pnpm run arch:scan 更新 arch.db
  2. pnpm run arch:query -- module-deps 查目标模块依赖
  3. pnpm run arch:query -- symbol-refs <目标函数> 查调用链
  4. 阅读 services/[service]/README.md 读模块工作流程
  5. docs/troubleshooting/known-issues.md "模块经验"分区读相关经验
  6. docs/architecture/004_architecture_impact_map.md 对应章节

阶段 2执行工作

  1. 按规划执行(契约先行:先 proto再实现
  2. 修改代码后立即运行 pnpm run arch:scan 更新 arch.db
  3. 运行质量校验确保零错误:
    • TSpnpm run lint + pnpm run typecheck
    • Gogo vet ./... + go build ./...
    • Pythonruff check src/

阶段 3经验沉淀强制不可跳过

  1. docs/troubleshooting/known-issues.md "工作经验日志"区追加一条记录:
    • 日期 + 时间
    • 模块
    • 做了什么 + 学到什么
  2. 若发现新的"场景→技术"映射 → 提炼到对应模块分区
  3. 若发现新的架构决策 → 更新 004
  4. 若代码结构变化 → pnpm run arch:scan 确认 arch.db 已更新

11. 多语言 monorepo 规则

  • 包管理器分工
    • TypeScriptpnpm workspacepnpm-workspace.yaml
    • Gogo.workgo.work
    • Pythonuv workspacepyproject.toml[tool.uv.workspace]
  • 共享包packages/
    • shared-protoprotobuf 契约定义(跨语言共享)
    • shared-tsTypeScript 共享类型与工具(待建立)
    • shared-goGo 共享工具(待建立)
    • shared-pyPython 共享工具(待建立)
    • shared-tokens:设计令牌(待建立)
  • 跨语言契约:通过 protobuf禁止 JSON Schema 或 OpenAPI 作为内部契约
  • 依赖版本对齐:共享依赖(如 uuid、jwt在多语言版本号保持一致

12. 可观测性规范

  • 三支柱必须同时启用(所有服务):
    • 日志pinoTS/ zapGo/ structlogPython—— 结构化 JSON
    • 指标prom-clientTS/ prometheusGo/ prometheus-clientPython—— /metrics 端点
    • 链路OpenTelemetry SDK + OTLP exporter —— 统一 traceparent
  • 健康检查/healthliveness+ /readyreadiness见各服务 shared/health/
  • 请求 IDGateway 注入 X-Request-Id全链路传递日志、metrics、trace
  • 指标命名<service>_<module>_<operation>_<unit>(如 iam_login_duration_seconds
  • 告警规则:见 infra/prometheus/rules.yml + infra/alertmanager/alertmanager.yml
  • Grafana 面板:见 infra/grafana/dashboards/

13. 部署与基础设施规范

  • 容器化:每服务独立 Dockerfileservices/[service]/Dockerfile
  • K8s:基础设施 manifest 位于 infra/k8s/,演化目标为 Helm chartinfra/k8s/helm/
  • 命名空间edu-systemedu-monitoringedu-chaosedu-backup
  • 配置分离
    • ConfigMap非敏感配置环境变量、特性开关
    • Secret敏感配置DB 密码、JWT 密钥、API key—— 见 infra/security/secrets.example.env
  • 备份:见 infra/backup/backup-mysql.sh,每服务独立备份,保留 7 天
  • 监控栈Prometheus + Grafana + Alertmanagerinfra/docker-compose.monitoring.yml
  • 混沌工程:见 infra/chaos/experiments.yaml

14. 多 AI 协作规范

详细流程见 多 AI 协作指南,本节为强制约束摘要。

14.1 角色与权限

角色 职责 push 特性分支 创建 PR 合并 PR push main force push main
协调 AICoordinator PR 审核、合并、冲突仲裁、发布 ⚠️(仅事故)
开发 AIDev 按模块分工写代码、提 PR
SRE AI infra/ 维护、部署 infra infra ⚠️(仅事故)
人类决策者 架构决策、Breaking Change 审批、发布确认

14.2 模块单一负责制

  • 每个模块(限界上下文)只有一个 AI 负责,禁止并行修改同一模块
  • shared-protoshared-tokensdocs/ 由协调 AI 维护,开发 AI 只读引用
  • infra/ 由 SRE AI 专门负责,业务 AI 不直接修改

14.3 分支命名规范(强制)

<type>/<scope>-<task-id>-<ai-id>
  • typefeat / fix / refactor / docs / chore / test
  • scope:见 §7 提交规范 scope-enum26 项)
  • task-id任务简短描述kebab-case
  • ai-idAI 唯一标识符(如 ai01ai02coord

示例feat/classes-add-pagination-ai01

14.4 PR 与合并规则(强制)

  1. 禁止直接 push 到 main:所有变更通过 PR
  2. PR 必须通过 CIlint / typecheck / build / test 全绿
  3. PR 必须通过 CODEOWNERS review:至少 1 人 approve
  4. 合并策略Squash Merge默认Rebase Merge保留多 commit 历史),禁止 Merge Commit
  5. 特性分支寿命 ≤ 3 天:超期需 rebase 最新 main
  6. 跨模块变更拆分:按依赖顺序拆多个 PRproto → service → gateway → frontend协调 AI 按序合并

14.5 跨模块变更顺序(强制)

修改涉及多模块时,必须按以下顺序拆分 PR 并顺序合并:

  1. shared-protoproto 契约)
  2. 业务服务classes / iam / core-edu 等)
  3. api-gateway(路由)
  4. BFFteacher-bff 等)
  5. 微前端teacher-portal 等)

每合并一个 PR后续 PR 的开发 AI 必须 rebase 最新 main 并重新校验。

14.6 冲突处理规则

  • 文件冲突:后合并的 PR rebase 最新 maingit push --force-with-lease(仅自己的分支)
  • 架构冲突:由协调 AI 仲裁保留方案
  • 禁止 git push --force 到 main 或他人分支

14.7 AI 身份标注(强制)

每个 PR 描述末尾必须追加:

---

**AI Agent**: <ai-id> (<负责模块>)
**Branch**: <分支名>
**Coordinator**: <协调 AI ai-id>

每个 AI 完成任务后,在 docs/troubleshooting/known-issues.md "工作经验日志"区追加记录(见 §9.3)。

14.8 敏感文件保护

以下文件修改需人类决策者额外审批:

  • .env.env.exampleinfra/security/secrets.example.env
  • infra/k8s/(生产部署)
  • .github/workflows/CI 配置)
  • .trae/rules/project_rules.md(项目规则)

15. CI/CD 规范

详细配置见 .github/workflows/,本节为强制约束。

15.1 流水线阶段(强制)

所有 PR 与 main 分支推送必须通过以下阶段:

阶段 并行 内容 失败策略
lint (按语言) TS ESLint / Go vet / Python ruff 失败阻断
typecheck TS tsc --noEmit 失败阻断
test (按服务) Go test / Vitest / pytest 失败阻断
build (按服务) Go build / nest build / next build 失败阻断
arch:scan pnpm run arch:scan + 校验 arch.db 一致性 失败阻断
docker-build (按服务) 构建镜像(不推送) 失败阻断

main 分支额外阶段:docker-push(推送镜像)+ deploy(部署到服务器)

15.2 触发条件

事件 触发阶段 触发条件
PR 创建/更新 lint + typecheck + test + build + arch:scan + docker-build 所有路径
push 到 main 上述全部 + docker-push + deploy 合并后自动
tag v* docker-pushtag 镜像)+ deploy生产 手动打 tag

15.3 镜像规范

  • 镜像名edu/<service>:<tag>
  • tag 策略
    • latestmain 分支最新
    • <git-sha>:每次构建的 commit SHA可追溯
    • v<version>:正式发布 tag
  • 镜像扫描docker-push 后自动运行 Trivy 扫描CRITICAL 漏洞阻断部署

15.4 部署策略

  • 目标环境:服务器 Docker ComposeP1-P2 阶段K8sP3+ 阶段)
  • 部署方式SSH 到服务器,docker compose pull && docker compose up -d
  • 健康检查:部署后轮询 /healthz 端点,连续 3 次失败回滚
  • 回滚docker compose rollback(上一版本镜像 tag

15.5 Secrets 管理

  • CI Secrets:存于 GitHub Actions secrets / Gitea Actions secrets
  • 部署服务器.env 文件由 SRE AI 管理,不进版本库
  • JWT_SECRET:生产环境强随机值,不与开发环境共享

15.6 必需的 CI 文件

文件 用途
.github/workflows/ci.yml 主流水线lint + typecheck + test + build
.github/workflows/docker.yml Docker 镜像构建与推送main + tag 触发)
.github/workflows/deploy.yml 部署到服务器main 触发,需环境审批)

15.7 参考实现(强制参照)

所有 CI/CD 配置必须参照 E:\Desktop\CICD\ 项目(同机 Gitea 仓库),不另行自创。

  • 参考项目位置E:\Desktop\CICD\.gitea\workflows\ci.yml(同机单仓库 CI 实现)
  • 关键配置点(必须沿用)
    • Runner 标签ubuntu-latestactrunner 已配置;参考项目用 CDCDEdu 改为 ubuntu-latest
    • 容器化运行TS 类 job 必须使用 container: dockerreg.eazygame.cn/node-with-docker:22(带 docker 的 node 22 镜像,用于在 job 内执行 docker build/docker run
    • Go 类 job:使用 container: golang:1.22-alpine(仅 quality 阶段),docker-build 阶段切换到 node-with-docker:22 镜像 + setup-go
    • 部署方式:保留 docker compose(不照搬参考项目的 docker run 单容器方式,因 Edu 是微服务多容器)
    • 代理配置runner 已配置全局代理CI 内不再设置 npm/docker 代理(参考项目中的 172.17.0.1:7890 代理段不要照搬)
    • Next.js standalone 构建teacher-portal 沿用参考项目的 standalone 模式(output: 'standalone' + 复制 public/.next/static
    • 网络:部署用 edu-shared 外部网络连接服务器已有 MySQL/Redis参考项目用 1panel-networkEdu 不同)
  • 改动需同步:修改任何 workflow 文件前,先比对参考项目同类配置,确保不偏离上述约定

当参考项目与本规范冲突时以本规范为准Edu 是微服务架构,参考项目是单体 Next.js


本规则文件是项目的强制约束,所有 contributor含 AI必须遵守。规则变更需同步更新 004 与 arch.db。