Skip to content

Latest commit

 

History

History
357 lines (264 loc) · 16.8 KB

File metadata and controls

357 lines (264 loc) · 16.8 KB

BR AI Spec Visual 需求说明文档(PRD)

版本:v1.0 | 更新时间:2026-04-23 适用范围:br-ai-spec-visual 仓库(可视化与控制面) 关联底座:br-ai-spec / npm @ex/ai-spec-auto(规范与运行时底座)


1. 文档目的与背景

1.1 背景

团队在多个业务项目中引入了 规范驱动 AI 研发流程(ai-spec-auto):在每个业务仓内通过 npx @ex/ai-spec-auto init . 注入规则、技能、OpenSpec 流程与 IDE 适配(.cursor/.claude/.opencode/.trae/ 等),并在运行期产出:

  • .ai-spec/:current-run、history、repo-map 等运行态
  • .agents/registry/:角色 / 技能 / 流程注册表
  • .omx/logs/*.jsonl:Agent 运行日志
  • openspec/specs|changes:规范资产与变更文档

问题:这些数据分散在开发者本机与各业务仓,缺少统一入口观测"谁在跑什么 / 改了什么 / 规范长什么样",也无法跨项目做横向治理。

本仓定位:作为 ai-spec-auto 体系的 可视化与控制面 (Visual + Control Plane),聚合多项目运行态、变更、拓扑与采集数据,并提供 WebSocket 实时能力与 Collector 上报通道。

补充边界:

  • registry(注册表)主数据由 skill-q-platform(Hub 平台) 维护
  • br-ai-spec 负责把 manifest / registry snapshot(安装清单 / 注册表快照)同步到项目本地
  • br-ai-spec-visual 只消费已同步、已上报、已入库的结果,不在 Visual 内重新定义 registry 规则

1.2 目标(Goals)

  1. 为多个接入 ai-spec-auto 的项目提供 统一汇聚面板:Workspaces / Runs / Changes / Topology / Specs / Tasks。
  2. 提供 实时能力:hook 事件与 WebSocket 推送,浏览器无刷新看到运行状态变化。
  3. 提供 自动 + 手动 两条数据上报链路:
    • 自动:internal/visual-hooks 在关键事件 POST 到 /api/internal/ingest/raw
    • 手动/定时:Collector CLI 扫描项目目录批量上报
  4. 提供 反向控制 通道:UI 下发控制指令 → auto 侧 control-puller 拉取执行 → 回执上报。
  5. 提供 安装遥测:追踪 @ex/ai-spec-auto 的 init/update/sync 在各机器上的使用情况。
  6. 保证 最小侵入:hook 超时即降级、不阻塞业务项目的协议推进。

1.3 非目标(Non-Goals)

  • 不重复实现 ai-spec-auto 的规则/技能/OpenSpec 能力(由 br-ai-spec 负责)。
  • 不替代 IDE,不在 UI 内直接编辑业务仓代码。
  • 当前版本不提供多租户级别的计费 / SSO / 审计导出。
  • 不承诺对外 SaaS 化(默认私有部署,MySQL / MariaDB 自管)。

2. 术语与角色

2.1 术语表

术语 含义
Workspace 工作区,一个接入 ai-spec-auto 的业务项目在本系统的抽象
Run 一次 ai-spec-auto protocol-step 协议推进或等价的运行
Change OpenSpec 变更文档(spec / change / archive)
Registry .agents/registry/ 中的角色 / 技能 / 流程等资产
Raw Event 统一摄取的原始事件(Collector 与 Hook 共用一套契约)
Projection 将 raw event 投影到 Prisma 关系模型(RunState / ChangeDocument 等)
Control Outbox UI 下发的反向控制指令队列(等待 auto 侧拉取)
Installation 一次 @ex/ai-spec-auto 的安装实例(按 installationId 唯一)

2.2 用户角色

角色 能力
admin 全局管理(所有 workspace、成员、安装遥测)
maintainer 管理所授权的 workspace,可触发控制指令、管理成员
viewer 只读查看已授权 workspace 的 Runs / Changes / 拓扑 / 规格

权限模型:User → WorkspaceMember(role) → Workspace 三元组。


3. 功能需求

3.1 认证与会话(F-AUTH)

编号 需求 对应实现
F-AUTH-01 邮箱 + 密码登录,密码 bcryptjs 哈希存储 src/app/api/auth/login
F-AUTH-02 Cookie 会话,支持通过 BR_AI_SPEC_VISUAL_COOKIE_NAME / SESSION_SECRET 环境变量配置 src/server/auth.ts
F-AUTH-03 会话过期自动清理;登出清空 cookie src/app/api/auth/logout
F-AUTH-04 未认证访问受保护路由统一重定向登录页 src/app/(protected)/layout.tsxmiddleware.ts
F-AUTH-05 GET /api/me 返回当前用户与角色 src/app/api/me/route.ts

3.2 工作区管理(F-WS)

编号 需求
F-WS-01 创建 / 查看 / 更新 / 归档 workspace(slug 唯一、可选 rootPath)
F-WS-02 workspace 详情包含基础信息、成员、连接令牌、最近 Runs / Changes / Alerts
F-WS-03 生成与轮换 Connect Token(Collector 与 Hook 使用,HMAC 方案,密钥来自 REALTIME_CONNECT_SECRET
F-WS-04 Member 管理:邀请已有用户加入,设置 admin/maintainer/viewer;唯一约束 (workspaceId, userId)
F-WS-05 workspace 状态支持 active / archived,归档后隐藏默认列表

对应实现:src/app/api/workspaces/**src/server/connect-token.tssrc/app/(protected)/workspaces

3.3 Runs 运行态(F-RUN)

编号 需求
F-RUN-01 workspaceId + runKey 汇总一次运行的最新 status / lastEventType / turnCount
F-RUN-02 支持查看运行事件时间线(RunEventoccurredAt 排序)
F-RUN-03 支持查看角色级执行(RunRoleExecution:roleSlug / status / startedAt / endedAt)
F-RUN-04 UI 提供列表页、详情页、实时刷新(WS)
F-RUN-05 投影幂等:相同 dedupeKey 的 raw event 不重复投影

事件类型:run.started / run.state_changed / run.archived / runtime-state.snapshot / omx.log.entry

3.4 Changes 变更文档(F-CHG)

编号 需求
F-CHG-01 接收 OpenSpec specs / changes / archive 目录内容并投影为 ChangeDocument
F-CHG-02 changeKey + docType + sourcePath 唯一去重,contentHash 变化触发更新
F-CHG-03 UI 支持按状态筛选(draft/in-progress/archived),Markdown 预览(/api/changes/[id]/preview
F-CHG-04 支持 archive 字段,归档后列表降权显示

3.5 Specs 规格视图(F-SPEC)

编号 需求
F-SPEC-01 以 workspace 为范围列出 OpenSpec 规范条目
F-SPEC-02 支持按分类(domain / role / skill)检索
F-SPEC-03 与 Registry / 拓扑联动:点击规格可跳转至关联角色

3.6 Topology 拓扑(F-TOPO)

编号 需求
F-TOPO-01 基于 RegistryItem + RegistryRelation@xyflow/react 渲染图形
F-TOPO-02 支持节点分类着色(role / skill / flow),关系类型分线型
F-TOPO-03 支持折叠、搜索、定位到某节点

3.7 Tasks 与 Trace(F-TASK / F-TRACE)

编号 需求
F-TASK-01 列出各 workspace 正在进行的任务(以 Run 为基本单位)
F-TRACE-01 提供最近 trace 流(/api/trace/recent)供调试,近实时显示事件摘要

3.8 反向控制(F-CTRL)

编号 需求
F-CTRL-01 POST /api/control/pending 让 auto 侧拉取当前 workspace 未处理指令(按 signature 校验身份)
F-CTRL-02 POST /api/control/approve 标记指令为 delivered/applied,写 appliedSnapshot
F-CTRL-03 POST /api/control/resume 恢复被暂停的运行
F-CTRL-04 指令状态机:pending → delivered → applied / conflict / rejected / expired
F-CTRL-05 指令携带 HMAC signature,使用 REALTIME_CONNECT_SECRET 生成与校验
F-CTRL-06 UI 提供"待审批""已应用""冲突"三栏视图

对应模型:ControlOutbox;实现:src/server/control.tssrc/server/control-outbox.ts

3.9 实时通道(F-RT)

编号 需求
F-RT-01 server.mjs 自定义启动,使 Next.js 与 ws 挂同一端口
F-RT-02 握手消息:session.hello / session.ack,携带 workspaceId 与 connect-token
F-RT-03 事件广播:run.*baseline.scan.*change.*,按 workspace 订阅
F-RT-04 installations-presence 跟踪在线 Installation 心跳
F-RT-05 客户端断线自动重连(UI 端实现),服务端容忍暂时断开

实现:src/server/ws-server.tssrc/server/realtime-hub.tssrc/lib/realtime/*

3.10 Ingest 统一摄取(F-INGEST)

编号 需求
F-INGEST-01 统一端点 POST /api/internal/ingest/raw,兼容两种形态:Collector snake_case Body 与 Hook camelCase + Header
F-INGEST-02 dedupeKey 去重,命中返回 skipped,否则返回 inserted
F-INGEST-03 原始事件落 RawIngestEvent,同步触发投影到 RunState / RunEvent / ChangeDocument / RegistryItem / RegistryRelation / OmxSession / OmxTurn
F-INGEST-04 connect_token 缺省按本地受信任来源处理;存在时做 HMAC 校验,失败仅日志不阻断(以保证 hook 零侵入)
F-INGEST-05 POST /api/internal/ingest/run-state 提供纯状态快照快速入口
F-INGEST-06 单次批量上限(建议 500 条/批),超限分批处理

支持的 sourceKindregistry / omx-jsonl / run-state-json / repo-map-json / hook-event / control-receipt

3.11 Collector CLI(F-COL)

编号 需求
F-COL-01 提供 br-ai-spec-visual-collector CLI(入口 src/collector/cli.ts
F-COL-02 扫描目录:.ai-spec/.agents/registry/.omx/logs/openspec/
F-COL-03 支持 --workspace-id --project --server [--connect-token --agent-id --json]
F-COL-04 HTTP 批量上报(http-transport.ts),可选 WS 推送握手(transport.ts
F-COL-05 首次接入跑 baseline 扫描;支持 chokidar 监听增量(预留)
F-COL-06 网络错误退避重试,上报失败不影响本地业务

3.12 安装遥测(F-TELEM)

编号 需求
F-TELEM-01 对外端点 POST /api/public/installations/report,接收 @ex/ai-spec-auto 的安装/升级/同步上报
F-TELEM-02 存储 Installation(机器维度)+ InstallationEvent(每次事件)+ InstallationProject(项目命中)
F-TELEM-03 Admin 查看端点:/api/admin/installations/active/stats/[id]
F-TELEM-04 项目使用 projectHash 匿名化(避免泄露真实路径)
F-TELEM-05 默认超时 1500ms,远端不可用时 auto 侧降级为不上报

3.13 健康检查(F-OPS)

编号 需求
F-OPS-01 GET /api/health 返回 { ok, db, ws, version },用于容器探针
F-OPS-02 启动脚本 fix-and-start.sh / start-with-db.sh 在开发环境自动修复常见问题

4. 非功能需求

4.1 性能

  • 单次 raw ingest 批处理 500 条:服务端 P95 < 500ms(本地 MySQL)。
  • WS 推送延迟:相对 hook 落库 < 200ms(同机)。
  • 列表类 API P95 < 300ms(分页默认 50)。

4.2 可靠性

  • Hook 与 Collector 的上报至少一次语义,依赖 dedupeKey 幂等。
  • 控制指令状态机终态(applied/conflict/rejected/expired)不可回退。
  • 数据库连接用 @prisma/adapter-mariadb,短连接失败支持自动重连(Prisma 默认)。

4.3 安全

  • 所有写入型内部端点必须携带 connect-token(本地受信任模式仅供开发/测试)。
  • HMAC 校验使用 REALTIME_CONNECT_SECRET,生产环境不得为空或使用默认值。
  • 密码 bcrypt cost ≥ 10;session token 写入 VarChar(512),随机 ≥ 256bit。
  • 不在 payload 中落明文密钥;raw event 中含敏感字段由 hook 侧负责脱敏。

4.4 兼容性

  • Node.js 18+;推荐 20 LTS。
  • Next.js 16.2.x(App Router)+ React 19 + Turbopack dev。
  • 数据库:MySQL / MariaDB 兼容实例。
  • 浏览器:最近两个版本的 Chrome / Edge / Safari。

4.5 可观测性

  • ingest / control / ws 关键路径打结构化日志。
  • 预留 alerts 表,支持未来写入告警(当前以人工写入 + UI 展示为主)。

4.6 部署


5. 数据模型(概要)

核心实体(详见 prisma/schema.prisma):

User ─┬─< Session
      └─< WorkspaceMember >─ Workspace
                              ├─< WorkspaceAgent
                              ├─< SyncJob
                              ├─< RegistryItem / RegistryRelation
                              ├─< RunState / RunEvent / RunRoleExecution
                              ├─< ChangeDocument
                              ├─< OmxSession / OmxTurn
                              ├─< Alert
                              └─< RawIngestEvent

ControlOutbox           (workspaceId + runKey + command,独立审计)
Installation ─┬─< InstallationEvent
              └─< InstallationProject

关键唯一约束:

  • Workspace.slugUser.emailSession.token
  • (workspaceId, runKey) on RunState
  • (workspaceId, changeKey, docType, sourcePath) on ChangeDocument
  • (workspaceId, category, slug) on RegistryItem
  • RawIngestEvent.idempotencyKey(workspaceId, eventId)
  • Installation.installationId

6. 外部接口

6.1 REST 一览

分组 方法+路径 说明
认证 POST /api/auth/login POST /api/auth/logout GET /api/me
Workspace GET/POST /api/workspaces GET/PATCH /api/workspaces/[id] POST /api/workspaces/[id]/connect-token
成员 GET/POST /api/members
Runs GET /api/runs GET /api/runs/[id]
Changes GET /api/changes GET /api/changes/[id] GET /api/changes/[id]/preview
Specs GET /api/specs
Tasks GET /api/tasks
Trace GET /api/trace/recent
控制 POST /api/control/pending POST /api/control/approve POST /api/control/resume
摄取 POST /api/internal/ingest/raw POST /api/internal/ingest/run-state 内部 / hook / collector
安装遥测 POST /api/public/installations/report 对外(公网可暴露)
管理 GET /api/admin/installations[/active/stats/:id] admin only
健康 GET /api/health

6.2 WebSocket

  • 路径:/ws
  • 握手:{ type: "session.hello", workspaceId, connectToken, agentId?, capabilities? }
  • 服务端回复:{ type: "session.ack", accepted, sessionId, since }
  • 事件:run.*change.*baseline.scan.*alert.*

7. 约束与依赖

  • 依赖 br-ai-spec@ex/ai-spec-auto)在业务项目中完成规则、OpenSpec、internal/visual-hooks/ 注入,否则数据源为空。
  • 数据库 schema 使用 Prisma 迁移(pnpm prisma:pushprisma:generate);禁止手工改表。
  • REALTIME_CONNECT_SECRET 在生产环境必须与 auto 侧保持一致,否则 HMAC 校验不通过(当前实现仅日志告警,计划在 v2 改为强制)。
  • 端口:dev 默认 3000;CLI 调用 AI_SPEC_VISUAL_URL 需同步。

8. 里程碑(建议)

版本 范围
v1.0(当前) Workspace / Runs / Changes / Topology / Specs / Collector / Hook ingest / 控制指令 / 安装遥测 / WS 实时
v1.1 告警规则引擎(基于 Alert 表 + 触发器),失败 run 自动告警
v1.2 强制 HMAC(失败即阻断)、Connect Token 轮换策略、操作审计日志
v1.3 多租户 / SSO(OIDC)、跨 workspace 度量看板
v2.0 与 OpenSpec 双向写入(UI 创建 change proposal → 下发 auto)

9. 风险与对策

风险 影响 对策
Hook 网络波动导致事件丢失 运行态不及时 Collector 定时补扫 + dedupeKey 幂等
数据库写入放大(RawIngestEvent + Projection) 存储增长 raw 表按 occurredAt 归档;提供清理脚本
REALTIME_CONNECT_SECRET 配置错位 控制指令无法校验 启动自检(计划)+ 部署文档红线
WS 长连接资源泄漏 服务退化 realtime-hub 心跳与回收;压测验证
遥测端点公开暴露 被刷量 加限流 + projectHash 匿名化(已实现)

10. 关联文档