# skillhub 交付路线

## Phase 0：设计定稿（当前阶段）

产出：架构设计文档、数据库 DDL、API OpenAPI spec 草案、前端线框图

已冻结决策：
- 技能坐标体系：`@{namespace_slug}/{skill_slug}`，兼容层使用 `--` 双连字符映射（详见 `00-product-direction.md` 1.1 节）
- 一期同步发布模型，暂不考虑异步发布
- API Token 一期继承用户全部权限（非最小权限），后续版本细化
- CLI 主认证切换为 OAuth Device Flow，Bearer Token 统一用于 CLI API 和兼容层
- ClawHub CLI 兼容层基地址 `/api/v1`，通过 `/.well-known/clawhub.json` 发现

## Phase 1：工程骨架 + 认证打通

### 后端

- Maven 多模块初始化（6 个模块）
- Spring Boot 启动、配置、Profile 分层
- Flyway + 数据库初始化
- Redis 集成（Session + 分布式锁）
- Spring Security OAuth2 Client 配置（GitHub OAuth 登录）
- CustomOAuth2UserService + IdentityBindingService（自动注册/绑定）
- Spring Session (Redis) 管理、API Token 签发校验
- RBAC 基础（SUPER_ADMIN / SKILL_ADMIN / USER_ADMIN / AUDITOR + 命名空间角色）
- 全局异常处理、requestId 透传、日志格式
- Springdoc OpenAPI、健康检查
- CSRF 防护（Cookie-to-Header 模式，CLI API 豁免）
- 本地开发 MockAuthFilter（`local` profile）
- 基础限流：Nginx Ingress `limit-req` 按 IP 限流（认证/搜索/下载接口）

### 前端

- Vite + React + TypeScript 初始化
- shadcn/ui + Tailwind 配置
- TanStack Router 路由骨架、TanStack Query 配置
- openapi-fetch 客户端生成管线
- 布局组件、OAuth 登录流程（调用 `/api/v1/auth/providers` → 跳转）
- 登录态检测（`/api/v1/auth/me`）+ 路由守卫
- Makefile 顶层编排

### 验收

前后端能跑，GitHub OAuth 登录可用，AccessPolicy 准入策略生效，`/api/v1/auth/me` 可用，Token 可用，OpenAPI spec 可访问，Ingress 基础限流生效

## Phase 2：命名空间 + Skill 核心链路

### 后端

- 命名空间 CRUD + 成员管理
- 对象存储集成（LocalFile + S3 双实现）
- 技能发布（上传 → 校验 → 存储 → 审核 / 上线，一期同步处理）
- 技能查询（详情、版本、文件）、下载（打包 + 可见性检查，PUBLIC 匿名可下载）
- 标签管理、搜索（PostgreSQL Full-Text，匿名搜索限 PUBLIC）
- 异步事件基础设施
- Rate Limiting 升级（应用层精细限流：按用户/端点分类，基于 Redis 滑动窗口）

### 前端

- 首页、搜索页、命名空间主页（匿名可访问）
- 技能详情页、版本历史页（PUBLIC 匿名可浏览/下载）
- 发布页、我的技能列表
- 命名空间管理页

### 验收

完整发布 → 存储 → 审核 → 查询 → 下载链路可用，搜索可用，命名空间隔离生效，匿名用户可浏览/下载公共技能

## Phase 3：审核流程 + 评分收藏 + CLI API / ClawHub 兼容层

### 后端

- 审核流程（提交 → 审核 → 发布，含乐观锁）
- 团队技能提升到全局（promotion_request 流程）
- 评分 + 收藏 + 计数器（原子更新）
- OAuth Device Flow（device code、授权确认、轮询换取 Bearer Token）
- CLI API（whoami、publish、resolve、check）
- ClawHub CLI 协议兼容层（`/api/v1` 端点：search、resolve、download、publish、whoami）
- 兼容层 canonical slug 映射（`--` 双连字符规则）
- `/.well-known/clawhub.json` 发现端点
- 协议适配器与兼容性测试（针对 ClawHub CLI 的真实请求/响应样例）
- 审计日志（同步落库）、幂等去重（idempotency_record + Redis）

### 前端

- 审核中心、命名空间审核页、提升审核页
- 评分组件 + 收藏按钮（匿名用户点击提示登录）、我的收藏页
- Token 管理页
- 管理后台（用户管理、角色分配、准入审批、封禁/解封）
- 前端 API 层收口：统一迁移到 OpenAPI 生成类型 + `openapi-fetch` 客户端，淘汰业务页面里的手写 `fetch`
- 建立 API 变更后的前端同步机制：后端 OpenAPI 更新后执行 `generate-api`，禁止生成类型与真实返回长期漂移

### 验收

团队空间自治审核与全局空间平台审核生效，skillhub CLI Device Flow 可用，ClawHub CLI 通过兼容层可完成核心 registry 操作，评分收藏可用

## Phase 4：运维增强 + 打磨 + 开源就绪

### 后端

- 本地认证体系（用户名密码注册/登录 + BCrypt + 密码策略 + 账号锁定）
- 多账号合并流程（发起 → 验证 → 确认 → 数据迁移）
- 技能治理（隐藏/恢复 + 已发布版本撤回 YANKED）
- 审计日志查询 API（多条件筛选 + 分页）
- Prometheus 指标暴露（Actuator + Micrometer 自定义业务指标）
- 性能优化（数据库索引 + S3 预签名 URL + 连接池调优）
- 安全加固（Session Cookie 安全 + 安全响应头 + XSS 防护）

### 前端

- 注册页、登录页扩展（用户名密码 + OAuth 双模式）
- 密码修改页、账号合并页
- 审计日志查询页
- 技能隐藏/恢复/已发布版本撤回操作（管理员可见）
- 前端代码分割（TanStack Router lazy routes）
- rehype-sanitize XSS 防护
- OpenAPI SDK 工程化：生成文件纳入 CI 校验，避免新增接口回退到手写调用

### 部署 & 开源

- Docker 一键启动（多阶段 Dockerfile + docker-compose + 种子数据）
- K8s 基础部署清单（Deployment + Service + Ingress）
- README.md、CONTRIBUTING.md、GitHub Issue/PR 模板
- LICENSE（Apache 2.0）、CODE_OF_CONDUCT.md

### 验收

本地认证可用，多账号合并可用，技能隐藏/恢复/已发布版本撤回可用，审计日志可查询，Prometheus 指标可拉取，`docker compose up` 一键启动，K8s 清单可部署，开源基础设施齐全

## Phase 5：治理闭环 + 社交

- 评论功能
- 举报/标记机制（用户举报 → 管理员处理 → 隐藏/已发布版本撤回）
- 自动安全预检（`PrePublishValidator` 从当前 `NoOp` 扩展为真实校验链）
- Webhook/事件通知（发布通知、审核结果通知）
- 后续 OAuth Provider 扩展（GitLab、Google 等）
- 向量搜索第二阶段增强（当前第一阶段仅做搜索增强，不做推荐）

## 主要风险与应对

| 风险 | 应对 |
|------|------|
| GitHub OAuth 回调配置复杂 | 本地用 MockAuthFilter 解耦，OAuth 联调可并行 |
| 审核流程需求变更 | 生命周期状态机已收敛到 `DRAFT / PENDING_REVIEW / PUBLISHED / REJECTED / YANKED`，读模型通过统一 projection 暴露 |
| 搜索效果不佳 | SPI 架构允许随时切换实现 |
| 前后端接口频繁变更 | OpenAPI spec 先行，类型自动生成 |
| 新增 OAuth Provider | Spring Security OAuth2 原生多 Provider 支持，只需配置 + 属性映射 |
| ClawHub CLI 协议细节与现有模型不完全一致 | 兼容层使用 `--` 双连字符 canonical slug 映射，独立 Controller 层适配，协议回归测试覆盖 |

## 测试演进策略

- 当前阶段（Phase 2 验证优先）：本地通过 `docker-compose.yml` 启动 PostgreSQL、Redis、MinIO，后端与集成测试直接连接真实依赖，优先验证发布、搜索、下载、限流等基础设施相关链路
- 后续阶段（工程化收口）：逐步把后端集成测试迁移到 Testcontainers，由测试代码按需拉起 PostgreSQL、Redis、MinIO，减少对手工启动本地依赖的要求，并纳入 CI
- 前端阶段性要求：后端 API 契约稳定后，前端必须同步刷新 OpenAPI 生成类型并校验关键页面；统一响应结构变更不允许只改后端不改前端
- 原则：单元测试可继续使用 mock/in-memory 替身，但 Phase 2/3 的核心验收必须保留一组基于真实中间件的集成测试，避免 Redis Lua、对象存储、Flyway、搜索 SQL 等问题被假实现掩盖
