Stev_Wang
|
b377618ff9
|
feat(shared): 演练任务预估配置对前端公开
背景:PRD R-06 要求批量任务提交前展示预估条数与成本;A6 提交演练任务的弹层需要读取生效配置,原先两项预估配置为 public:false,前端无法预展示。
改动:将 task.estimate.demo_cost_per_item / task.estimate.demo_seconds_per_item 的 public 置为 true(数值非敏感、演练任务不产生真实计费);frontend 读取失败时仍回退 shared 默认值,后端继续做最终校验与计算。
影响面:/system/configs/effective 多返回两项 task.* 配置;系统配置页与权限不变。
回滚:撤销提交即可,前端预估回退到 shared 默认值。
验证:web 单测 / typecheck 通过;API 集成与 e2e 通过;effective 接口实测返回三项 task 配置。
|
2026-11-05 11:40:23 +08:00 |
|
Stev_Wang
|
633765f10f
|
feat(media): A6 任务中心 API、SSE 进度与队列骨架
ci / 质量门禁 (push) Successful in 6m4s
背景:A6-BE-01..05 与 A6-INF-01,打通「提交 → 队列 → SSE 进度 → 完成/失败 → 取消 / 仅重试失败项」闭环,为 B3 / M1 的真实任务提供统一协议。
改动:
- API media 模块:POST/GET /media-tasks、详情、SSE(Last-Event-ID 续推 + 15s 心跳 + 800ms 落库轮询)、取消(只影响未开始项)、仅重试失败项;Idempotency-Key 24h(异步提交 202;同 key 同 body 返回同一任务且不重复审计,不同 body 40902);范围外统一 404;
- 队列骨架:BullMQ 5 九队列(5 组独立启停)、Outbox dispatcher(Redis 锁 + FOR UPDATE SKIP LOCKED + jobId 幂等 + 指数退避/死信)、worker 按 QUEUE 启停、demo 演练处理器(事务 + 行锁 + 取消/重试/幂等)、优雅退出与心跳;
- 监控:GET /api/v1/health/queues、GET /api/v1/metrics(Prometheus 0.0.4)、infra/monitoring 告警规则与接入说明;
- 通用:AuditInterceptor 支持幂等重放 skipAudit(默认行为不变)、AppModule 接线、.env.example 的 QUEUE 语义、bullmq 5.81.5 / worker @prisma/client / worker 覆盖率依赖。
影响面:OpenAPI 新增 6 个端点(openapi:diff 无破坏性变更);API 进程新增 outbox dispatcher 与 metrics/health 路由;worker 新增 BullMQ 消费;未改旧审计导出链路与既有接口。
回滚:回滚提交并停止 worker 新队列消费;task/outbox 新表数据不影响旧功能,可按需保留。
验证:api 单测 257、集成 92(连跑 2 次)、worker 27、shared 197;typecheck / lint / format:check / build / openapi:diff 全绿;本地真实 worker 启用 9 队列心跳,/health/queues、/metrics 实测,/media-tasks 未登录 401。
|
2026-11-04 21:52:35 +08:00 |
|
Stev_Wang
|
4a29cf815e
|
feat(shared): A6 任务协议契约、任务数据模型与系统配置
背景:A6 任务中心需要统一任务协议(九态状态机 / 队列映射 / SSE 事件)与任务落库模型,供 API、worker 与前端共用,避免各端自建枚举。
改动:
- 新增 packages/shared/src/tasks/task-protocol.ts:任务类型、架构 §3.6 九态与允许迁移、5 组 9 队列定义、Outbox/SSE 事件、进度与收敛纯函数;
- 新增 packages/shared/src/schemas/tasks.ts:提交/列表/详情/取消/重试/SSE 的 Zod DTO(body camelCase、query snake_case,列表 { items, next_cursor });
- system_configs 新增 task 分组(演练上限 20 项 / 单条成本 0.02 元 / 单条时长 3 秒),seed 按定义幂等;
- Prisma 新增 media_tasks / media_items / task_events 三表与迁移 20261104125003_a6_media_tasks(expand-only,不改旧表)。
影响面:仅新增 shared 导出、配置项与三张新表,旧接口与旧表不受影响。
回滚:撤销提交,并对三张新表执行 prisma migrate resolve/删除(无业务数据)。
验证:shared 197 tests 全绿;typecheck / lint / format:check 全绿;prisma migrate status up to date。
|
2026-11-04 21:52:12 +08:00 |
|
Stev_Wang
|
b505dfe5e3
|
fix(ci): 使用 service 容器名访问 PostgreSQL 与 Redis
ci / 质量门禁 (push) Successful in 5m3s
背景:run #42 第 10 步「数据库迁移与幂等种子」失败,Prisma 报
P1001: Can't reach database server at 127.0.0.1:5432。
原因:job 运行在容器里,service 容器不能用 127.0.0.1 访问;act_runner 会为
service 容器在 job 网络里加别名,须用 <service-id>:<port>。
改动:DATABASE_URL 改为 @postgres:5432,REDIS_URL 改为 //redis:6379,并注释说明。
影响面:仅 CI job env;本地与生产连接串不变。
回滚方式:revert 本提交。
验证证据:推送后观察 run #43 的迁移 / 集成测试步骤。
|
2026-11-04 18:09:43 +08:00 |
|
Stev_Wang
|
59f07d823a
|
fix(ci): 按任务声明 VITE 环境变量避免污染单测
ci / 质量门禁 (push) Failing after 2m47s
背景:run #41 单测推进到 @lingxi/web 后失败——use-login-form.spec 断言真实登录,
但 VITE_PUBLIC_DEMO_SESSION=true 在 job 级 env 对所有步骤生效,且 turbo globalEnv
会把 VITE 变量下发给 test 任务,导致演示会话被打开。
改动:
- turbo.json:globalEnv 的 VITE 变量改为 build / dev 任务显式声明;
- ci.yml:VITE 变量从 job env 下移到「构建」「端到端冒烟」两个步骤。
影响面:单测不再看到 demo 会话开关;构建与 e2e 仍以 demo 会话构建。
回滚方式:revert 本提交。
验证证据:本地 turbo web build / test 通过;推送后观察 run #42。
|
2026-11-04 18:05:55 +08:00 |
|
Stev_Wang
|
0ed855b42a
|
fix(ci): 声明 turbo 任务环境变量以适配严格模式
ci / 质量门禁 (push) Failing after 2m19s
背景:run #39/#40「单元测试与覆盖率」失败,bootstrap.spec 加载 env 报
DATABASE_URL / REDIS_URL / JWT_ACCESS_SECRET / JWT_REFRESH_SECRET Required。
根因:Turborepo 2.x 默认 Strict 环境模式,任务只能拿到 turbo.json 声明的变量,
ci.yml 的 job env 因此被剥离;本地因 .env 由 dotenv 在进程内加载而未暴露。
改动:turbo.json 的 test / test:int 任务声明上述 5 个变量(含 WEB_ORIGIN)。
影响面:这些变量进入任务环境与缓存键;值变化会让对应任务重新执行。
回滚方式:revert 本提交。
验证证据:推送后观察 run #41 的单测结果。
|
2026-11-04 18:01:11 +08:00 |
|
Stev_Wang
|
6e6435d47b
|
fix(ci): 修正 JWT 环境变量名并补充迁移后种子
ci / 质量门禁 (push) Failing after 2m12s
背景:run #39 在第 8 步「单元测试与覆盖率」失败,日志报
环境变量校验失败:DATABASE_URL / REDIS_URL / JWT_ACCESS_SECRET / JWT_REFRESH_SECRET Required——
ci.yml 写的是 JWT_SECRET(应用实际读 JWT_ACCESS_SECRET 且要求 ≥32 位);
另集成测试依赖 seed 的部门 content-g1 与示例角色,ci.yml 只有 migrate deploy 无 seed。
改动:
- JWT_SECRET 改为 JWT_ACCESS_SECRET,access / refresh 密钥均补足 32 位;
- 「数据库迁移」步骤补充 pnpm db:seed(与本地 ci:local 对齐)。
影响面:仅 CI job env 与步骤,不改应用代码;种子只作用于 CI 的空库。
回滚方式:revert 本提交。
验证证据:推送后 run 上一次已推进到 Lint/类型检查通过(前两处修复生效),本次继续验证单测与后续链路。
|
2026-11-04 17:57:14 +08:00 |
|
Stev_Wang
|
a06043ce92
|
docs(ci): 同步远端 CI 已启用与推送前本地门禁要求
ci / 质量门禁 (push) Failing after 2m11s
背景:自建 Gitea 已部署 Actions runner(gitea-runner-01),旧文档
「远端无 runner、CI 只本地执行」已与事实不符。
改动:AGENTS.md、README、01/06/07 三份细则统一改为「推送前本地门禁强制 +
push main 自动远端 CI,失败即以新提交修复」,并注明 ci-smoke.yml 可手动冒烟;
AGENTS 版本升 V1.2,01/06/07 版本升 V1.2。
影响面:仅文档与索引版本号,不改代码与流水线行为。
回滚方式:revert 本提交。
验证证据:prettier 检查通过;文档相对链接未变。
|
2026-11-04 17:52:24 +08:00 |
|
Stev_Wang
|
88d9c77522
|
fix(ci): 修复全新检出 Lint 失败并恢复 main 自动触发
背景:run #37 在 runner 上失败于 Lint,日志报 @lingxi/* 下发类型无法解析——
workspace 包 types 指向 dist/,而 dist/ 被 gitignore,全新检出未构建导致
类型感知规则失效;另 postgres 健康检查 -U lingxi 与 POSTGRES_USER=postgres 不一致。
改动:
- ci.yml:Lint 前新增 packages 构建步骤;健康检查改为 pg_isready -U postgres;
恢复 push main 自动触发(保留 workflow_dispatch)。
- ci-local.mjs:同步补充 packages 构建步骤,避免全新检出本地 CI 同样失败。
影响面:仅 CI 配置与本地 CI 脚本,不改业务代码;push main 后自动跑完整门禁。
回滚方式:revert 本提交;如需临时停用远端 CI,注释 on.push。
验证证据:runner 冒烟 run #38 全绿(ci-smoke.yml,71s);本提交推送后由远端 ci.yml 完整链路验证。
|
2026-11-04 17:52:16 +08:00 |
|
Stev_Wang
|
81c0426d71
|
ci(ci): 新增 Gitea runner 冒烟工作流
|
2026-11-04 17:48:19 +08:00 |
|
Stev_Wang
|
0d48bd7e37
|
fix(web): 优化操作日志关键字输入框间距
关键字输入框左侧内边距 12px、图标与占位文字间距 8px、右侧留 8px,修复图标贴边与提示文字拥挤;仅调整 audit 筛选关键字输入,不影响其他输入框。
|
2026-11-04 17:21:29 +08:00 |
|
Stev_Wang
|
26179e83dd
|
fix(web): 修复首屏深色画布导致的黑屏闪烁
背景:
index.html 声明 color-scheme=dark,与全站浅色主题(Cloud Blue)冲突。
浏览器在样式表与 JS 就绪前会按深色绘制默认画布,导致打开任意页面时短暂黑屏。
改动:
- apps/web/index.html:color-scheme 改为 light,并在 head 内联首屏兜底底色 #f5f7fa
- packages/ui/src/theme/tokens.css::root 锁定 color-scheme: light,避免系统深色偏好影响控件
- apps/web/src/shell.spec.ts:新增护栏,禁止 dark 声明并校验兜底底色与 --lx-color-bg-app 一致
影响面:
仅 Web 外壳首屏绘制与主题声明,不涉及接口、数据与业务逻辑;
浅色主题下视觉无变化,系统深色偏好场景下保持浅色。
回滚方式:
git revert 本提交即可恢复原状。
验证证据:
- Playwright 阻断入口模块实测首帧:修复前 #0f0f0f 黑屏,修复后 rgb(245, 247, 250)
- pnpm --filter @lingxi/web test:33 个文件 / 189 个用例通过
- pnpm lint / pnpm format:check / pnpm typecheck / pnpm build 全绿
- pnpm ci:local 全部门禁通过(248.5s,含构建、集成测试、契约检查与 E2E 冒烟)
|
2026-11-04 17:18:34 +08:00 |
|
Stev_Wang
|
dcbd600e9c
|
docs(plan): 补齐 A5 完成状态与任务状态列
§6.6 增加执行状态与 8 项 WBS 状态列;§7.5 页面 / 接口 / 状态回写实际实现;§5.2 增加 A5 完成情况;OTel 与资产 / 任务待接入显式标注。
|
2026-11-04 17:02:48 +08:00 |
|
Stev_Wang
|
dca498ec15
|
fix(web): 操作日志列头吸顶并移除重复列表工具条
Semi Table 增加 scroll.y(按容器高度测量),表头固定、仅表体滚动;移除「日志列表 / 已加载 N 条」重复工具条,刷新按钮移到页头,条数保留在底部分页;表格宽度统一跟随容器,修复宽屏右侧空白与 1024 留白。
|
2026-11-04 16:55:54 +08:00 |
|
Stev_Wang
|
ab951894b9
|
fix(web): 修复宽屏操作日志表格右侧空白
桌面端表格宽度改为跟随容器(100%),避免 1920 等宽屏下 1180px 固定宽度导致「查看」列右侧出现大片空白;1024 仍保持 760px 横向滚动。
|
2026-11-04 16:38:28 +08:00 |
|
Stev_Wang
|
83aa04b856
|
docs(plan): A5 实施报告与计划回写
新增 A5 审计与日志实施报告;回写开发计划状态、§6.6 完成情况与 WBS 状态;README 文档索引增加 A5 报告。
|
2026-11-04 16:28:30 +08:00 |
|
Stev_Wang
|
26ffe97927
|
test(e2e): A5 审计与日志端到端用例
覆盖操作日志列表 / 筛选 / 详情 diff 与原始 JSON / 导出创建轮询与签名下载 / 导出自身留痕 / 权限三态 / 运行日志空态与配置外链;A5_E2E=1 门控,临时账号与角色自建自清。
|
2026-11-04 16:28:10 +08:00 |
|
Stev_Wang
|
a5933a286e
|
feat(web): A5 操作日志与运行日志页
按用户选定实现操作日志列表 / 详情(方案 A)与运行日志(方案 C);多条件筛选、真实游标分页、字段级 diff / 完整原始 JSON、560 导出抽屉(轮询 / 历史 / 签名下载)、只读与权限控制;侧栏「审计日志」更名「操作日志」、「客户字段」更名「字段管理」并新增「运行日志」;1024 关键列适配。
|
2026-11-04 16:27:29 +08:00 |
|
Stev_Wang
|
6bdda6ec62
|
feat(api): A5 审计采集、检索与导出
AuditInterceptor 成功 / 失败双写 audit_logs(响应前 await、脱敏、sink 缺失退化 Pino);登录 / 权限 / 客户 / 字典 / 配置等既有动作补审计;审计列表 / 详情 / 动作目录 / 异步 CSV 导出 / HMAC 签名下载;分区维护与保留归档占位;OpenAPI 快照更新。
|
2026-11-04 16:26:42 +08:00 |
|
Stev_Wang
|
6215f204ce
|
feat(db): A5 审计表分区、append-only 与种子
audit_logs 按月 RANGE 分区、复合主键与 6 组索引;ensure_partitions 幂等建分区;UPDATE/DELETE/TRUNCATE 触发器与 lingxi_app 最小权限;audit_export_jobs;种子新增 3 项配置与 6 条演示审计。
|
2026-11-04 16:26:20 +08:00 |
|
Stev_Wang
|
408dc5e81b
|
feat(shared): A5 审计契约、动作目录与配置
新增审计动作目录(10 分类 / 54 动作)、前后值 diff 纯函数、列表 / 详情 / 导出 Zod 契约;system_configs 增加 audit 分组与保留期 / 导出上限 / 日志平台地址 3 项配置。
|
2026-11-04 16:26:03 +08:00 |
|
Stev_Wang
|
a5a2914214
|
docs(plan): 标注 A4 完成状态与 WBS 状态列
背景:A4 已完成,开发计划需显式标注阶段与 7 项 WBS 的完成状态。\n改动:§6.5 增加「✅ 已完成」执行状态;WBS 表新增状态列并逐项标 ✅;与 §5.2 批次总览、§12.1 DoD、版本记录保持一致。\n影响面:仅文档;不改变范围与验收口径。\n回滚:回滚本提交即可。\n验证:prettier 通过;A4 报告/门禁数据已在上一提交回写。
|
2026-11-04 13:33:34 +08:00 |
|
Stev_Wang
|
02c716d6f2
|
docs(plan): A4 实施报告与计划回写
背景:A4 开发完成,需要回写实施报告、技术架构与开发计划状态。\n改动:新增 A4 实施报告;技术架构补 system_config_versions 与 dict:manage 口径;开发计划 A4 标记完成并回写门禁/遗留;README 索引补 A4 报告。\n影响面:仅文档;不改变需求与技术边界。\n回滚:回滚本提交即可。\n验证:prettier 通过;文档链接已检查。
|
2026-11-04 11:50:30 +08:00 |
|
Stev_Wang
|
f16d04fe02
|
test(e2e): A4 字典与配置端到端用例
背景:A4-QA-01 需要真实 API + Web + PG 的浏览器回归。\n改动:新增 e2e/a4-dicts-settings.spec.ts,覆盖三层合并 / 编码只读 / 树词表切换 / 类型与条目启停 / 命名预览 / 阈值二次确认 / 变更记录 / 权限三态;e2e/README 登记 A4 用例与 Semi 选择器口径。\n影响面:仅测试文件;A4_E2E=1 才执行,默认 skip。\n回滚:删除本文件即可。\n验证:A4_E2E=1 运行 7 passed(约 1.1m);eslint/prettier 通过。
|
2026-11-04 11:50:11 +08:00 |
|
Stev_Wang
|
3b0a99d91f
|
feat(web): A4 数据字典与系统配置页
背景:用户选定方案 A 主从分栏,A4 需要落地字典与配置页。\n改动:新增 /system/dicts、/system/dicts/:type、/system/settings;主从类型列表 + 三层合并 + 树/词表切换 + 条目/类型弹层;6 组配置 + 命名预览 + 阈值二次确认 + 变更记录;客户字段上限改读 effective config;路由/样式/OpenAPI 类型同步。\n影响面:管理中心新增两个菜单页;客户页上限显示改为配置读取(fallback 共享常量)。\n回滚:回滚本提交并恢复 AppLayout / routes / main 样式 import。\n验证:web typecheck/lint/build;单测 154;浏览器自检 1440/1024 无溢出。
|
2026-11-04 11:49:32 +08:00 |
|
Stev_Wang
|
e4330a43e4
|
feat(api): A4 数据字典与系统配置后端
背景:A4 需要字典三层合并、配置单一来源与阈值同源。\n改动:新增 catalog 模块(类型/条目/三层合并/编码不可改/快照工具);platform 新增 SystemConfigService/Controller、NamingService 与配置版本历史;roles/users/customers/customer-fields 改为读 system_configs 上限。\n影响面:新增 13 个 REST 端点与 4 个模块注入;system_configs 写入走事务/乐观锁/版本历史;OpenAPI 快照更新。\n回滚:回滚本提交并恢复 shared 契约;新增表可保留。\n验证:api typecheck/build;单测 137;集成 58;OpenAPI diff 无破坏性变更。
|
2026-11-04 11:49:05 +08:00 |
|
Stev_Wang
|
cc6e84cdbc
|
feat(shared): A4 数据字典与系统配置契约
背景:A4 需要字典三层合并、配置版本与命名规则的共享契约。\n改动:新增 dict/config 契约、system-configs 定义与校验、命名模板解析;新增 dict_types/dict_items/system_config_versions 迁移与 13 类/96 条字典、26 项配置种子。\n影响面:shared 新增导出;prisma 新增表与迁移;客户基础字段 DTO 硬上界调整为 50(实际生效上限仍由配置动态校验)。\n回滚:回滚本提交并保留新增表(不删数据)。\n验证:shared typecheck/test 147;seed 幂等;prisma migrate dev 已应用。
|
2026-11-04 11:48:38 +08:00 |
|
Stev_Wang
|
32b44bdeec
|
refactor(web): 侧栏「字典」更名为「数据字典」
背景:进入 A4 数据字典与系统配置阶段,产品口径统一为「数据字典」。\n改动:nav-config 菜单 label 与 description;补充 nav-config 单测。\n影响面:仅管理中心侧栏文案;路由 /system/dicts 与权限 dict:manage 不变。\n回滚:回滚本提交即可。\n验证:nav-config 单测 10/10;web lint / typecheck / 全量单测 126 通过;prettier 通过。
|
2026-11-04 10:26:23 +08:00 |
|
Stev_Wang
|
50afaee49c
|
docs(plan): 回写 A3 标准完成状态(WBS 状态列 + 最终验收)
按 A1 的完成状态格式补齐 A3 §6.4:新增执行状态说明、WBS 表状态列并逐项标 ✅;完成日期更新为 2026-11-04 最终验收。仅文档变更。
|
2026-11-04 09:37:24 +08:00 |
|
Stev_Wang
|
c90a036f82
|
docs(ci): 明确 CI 仅本地执行,远端 Gitea 不启用 CI
背景:远端自建 Gitea 未部署 Actions runner,推送后线上 CI 无法执行;原规范仍要求「推送后确认 CI」,容易误以为需等待远端流水线。
改动:
- AGENTS §6/§7:CI 只本地执行,推送前必须 pnpm ci:local 或本地门禁全绿,禁止等待/依赖远端 CI。
- 06-测试与CI规范 V1.1:新增「本地 CI 流水线(远端不跑 CI)」强制规则;集成/契约运行时机改为推送前本地。
- 01-Git规范 / 07-CodeReview:删除「推送后确认 CI」,改为本地门禁后推送。
- README:明确远端无 runner,ci.yml 仅本地参考/手动触发。
- .gitea/workflows/ci.yml:去掉 push 触发,仅保留 workflow_dispatch,避免推送停留在 queued。
影响面:仅规范与工作流配置,不影响代码/数据。
验证:pnpm format:check / lint 通过;pnpm ci:local 全部门禁通过(237.2s,4 e2e 冒烟 passed,8 个门控用例按环境变量跳过)。
|
2026-11-04 08:15:06 +08:00 |
|
Stev_Wang
|
3e4bf48841
|
fix(web): A3 页面对齐选定原型(行业 Tab / 新建向导 / 筛选条)
ci / 质量门禁 (push) Failing after 4m7s
背景:A3 首版实现把行业管理简化为普通树 + 简化详情,新建客户用 Semi 默认 Steps + 下拉框,与用户选定的原型 B 结构差异较大;客户管理筛选区也缺少白底与统一图标间距。
改动:
- 行业管理(B):补头像 + 状态/层级标签、基本信息/子行业/引用 Tab、最近变更时间线、子行业与引用客户列表,右栏白底卡片,删除入口。
- 新建客户(B):补左侧「创建客户/共 4 步」步骤导航(标题 + 说明 + 当前/完成态)、两级行业卡片选择、表单卡头/底部操作条。
- 客户组(B):成员改为「客户/所属行业/状态/负责人/操作」表格并支持移除。
- 客户列表(A):补表头统计、筛选区白底卡片与搜索图标间距。
- 客户详情(A):补右栏快捷操作;字段审批(A):补状态分段、中文类型。
- 主操作 theme=solid、次操作 theme=outline,与原型按钮层级一致。
- 更新 A3 实施报告与设计说明。
影响面:仅 apps/web A3 页面、client.css 与文档;接口、数据、权限不变。
验证:lint / format:check / typecheck / test(shared 131 / api 90 / web 125)/ build 全绿;真实浏览器六页重拍通过。截图:design/a3-ui-v1/impl/。
|
2026-11-04 08:04:14 +08:00 |
|
Stev_Wang
|
140dc386c1
|
feat(client): A3 客户与行业目录(两级行业、客户组、字段审批)
背景:A3 需把行业 / 客户 / 客户组 / 客户级字段立为资产根节点;用户确认两级行业树与混搭 UI(行业 B / 客户列表 A / 详情 A / 新建 B / 客户组 B / 字段 A)。
改动:
- 新增 ADR-002,行业改为两级树,客户挂末级行业;同步 PRD / 技术架构 / 开发计划。
- 新增 client 模块:industries / customers / customer-groups / customer-fields 接口、真实 PrismaCustomerDirectory、客户状态机与客户转交、客户组数据范围解析、跨客户 404。
- 新增迁移与幂等种子(电商/金融两级行业、2 客户、1 客户组、4 条字段)。
- 前端新增行业/客户/客户组/字段审批页面与路由、导航更名(客户管理 / 行业管理 / 客户组),复用现有 token。
- 补充 shared 契约单测、client 集成用例、A3 浏览器 e2e。
影响面:client 模块与 client 表、shared 契约、web 路由/导航、ScopeContext 数据范围、OpenAPI 与种子;A1 客户转交占位由 client 实现替换。
回滚:回滚本提交;数据库保留新增表或按报告执行 down SQL;CUSTOMER_DIRECTORY 可切回空集实现。
验证:format:check / lint / typecheck / test 全绿(shared 131 / api 90 / web 125,共 346);test:int 5 文件 39 条;A3 e2e 1/1;build 8/8;真实浏览器六页验证通过。
|
2026-11-03 21:45:38 +08:00 |
|
Stev_Wang
|
8626996bb1
|
docs(plan): A2 最终验收通过并确认完成状态
ci / 质量门禁 (push) Canceled after 0s
背景:A2 全部 WBS 已完成,且后续合入了 A1 部门管理补强与角色页 UI 收口;需按当前 main 重新验收并在开发计划确认完成状态。
改动:
- 开发计划 A2 状态行/批次表保持 ✅ 已完成,进度与 §6.3 完成情况更新为最终验收口径;
- 更新最终测试数字:test 331(shared 121 / api 90 / web 120)、test:int 33、A2 e2e 1/1(22.1s);
- 补充收口项(角色管理命名、页头操作右对齐、编辑角色移入页头、移除重复目录抽屉),A2 实施报告同步。
验证:format:check / lint / typecheck / test / test:int 全绿;A2 e2e 最终版 UI 下通过。
|
2026-11-03 17:10:18 +08:00 |
|
Stev_Wang
|
cda4b1825b
|
chore(openapi): 同步部门管理接口的生成类型
ci / 质量门禁 (push) Canceled after 0s
背景:
- 上一批部门管理接口(disable / enable、update、树与字段说明)合入后没有重新导出 OpenAPI,
apps/web/src/api/generated/openapi.d.ts 仍停留在「部门改名」版本,前端类型与真实契约不一致;
- pnpm ci:local 第 9 步 openapi:export 会自动重生成该文件,导致每次跑完工作区变脏。
改动:
- 执行 pnpm openapi:export,重新生成 apps/web/src/api/generated/openapi.d.ts
(新增 /departments/{id}/disable、/departments/{id}/enable、update 操作与字段说明)。
影响面:
- 仅前端生成类型,无运行时行为变化;openapi/lingxi.openapi.json 无差异。
回滚方式:
- 回滚本提交即恢复旧生成文件。
验证证据:
- pnpm openapi:diff 通过;
- pnpm ci:local 全部门禁通过。
|
2026-11-03 16:26:10 +08:00 |
|
Stev_Wang
|
087f27936e
|
fix(ci): 修复本地 CI 端到端冒烟的 demo 会话与 A0 遗留用例
背景:
- .gitea/workflows/ci.yml 在 job env 中设置 VITE_PUBLIC_DEMO_SESSION=true,
e2e 用 vite preview + 演示会话登录;scripts/ci-local.mjs 没有同步这组 env,
本地 CI 第 10 步必失败;
- e2e/smoke.spec.ts 是 A0 用例:还在找「请输入账号或邮箱」占位符、断言登录后落在工作台;
A1 接入真实登录后占位符为「请输入账号或手机号」,且登录默认落地 /system/users。
改动:
- ci-local:构建与 e2e 步骤注入 VITE_PUBLIC_DEMO_SESSION / VITE_PUBLIC_API_BASE_URL
(与 ci.yml 对齐),只作用于这两个步骤,避免影响单测对真实登录流程的断言;
- turbo.json:声明 globalEnv,保证构建产物随这两个 VITE 变量变化,不复用非 demo 构建缓存;
- smoke.spec:登录占位符改为「请输入账号或手机号」;登录后按 A1 现状断言落地 /system/users,
再从顶部「工作台」进入首页并校验模块导航;
- README:单独执行 e2e 时补充 demo 会话环境变量,并注明 ci:local 已内置。
影响面:
- 仅本地 CI 与 e2e 冒烟;业务代码与 CI 工作流行为不变(ci.yml 本就在 job env 注入这些变量);
- 本地构建缓存会因 globalEnv 变更失效一次。
回滚方式:
- 回滚本提交即恢复原 ci-local 步骤、冒烟用例与 README。
验证证据:
- pnpm ci:local 全部门禁通过(用时 218.8s);
- e2e smoke 4 项通过(登录 / 403 / 模块切换 / 404;A1 账号周期 7 项按预期 skip)。
|
2026-11-03 16:25:55 +08:00 |
|
Stev_Wang
|
b489cb3152
|
test(api): 修复集成测试对根部门顺序与文件并行的依赖
ci / 质量门禁 (push) Canceled after 0s
背景:
- pnpm ci:local 的 test:int 在本地真实 PG 上失败,与业务代码无关,是测试自身不稳定:
1) identity 用例断言部门树第一项根部门必须有子级,但管理员可以新建无子级根部门
并排在最前(本地已有手工部门「111」,sortOrder=0),该断言不成立;
2) identity.int.spec 清理用 account startsWith('it.'),会误删 departments.int.spec
的 it.dep.* 夹具;四个 int 文件默认并行且共用同一个真实 PG,beforeAll 偶发失败。
改动:
- identity.int.spec:部门树断言改为「存在带子级的根部门」,不再依赖根部门顺序;
- vitest.int.config:fileParallelism: false,集成测试文件串行执行,并注释原因。
影响面:
- 仅集成测试的断言与执行方式;业务代码、单测、构建不变;
- test:int 改为串行,耗时略增。
回滚方式:
- 回滚本提交即恢复原断言与并行执行。
验证证据:
- pnpm --filter @lingxi/api test:int 连续 3 次:4 个文件 / 33 项全通过;
- pnpm ci:local 第 1–8 步通过(第 10 步 e2e 为 A0 遗留问题,另行处理);
- pnpm format:check / lint / typecheck / test 通过。
|
2026-11-03 16:17:21 +08:00 |
|
Stev_Wang
|
4f6ccda6e3
|
fix(web): 统一用户/角色/部门列表行样式与选中态
ci / 质量门禁 (push) Canceled after 0s
背景:
- 用户、角色列表行为全宽 + 1px 分隔线,选中行与相邻悬停行的高亮背景会盖住分隔线,
两块色块粘连,看起来间距被挤在一起;
- 部门树为列表内留白 + 圆角行,其左侧 2px 竖条贴行左缘,而用户 / 角色的竖条贴卡片边缘,
三页选中指示器不一致;部门子级缩进后竖条位置还会随层级漂移;
- 行宽收紧后角色副信息(编码 · 数据范围)会被硬裁掉半个字。
改动:
- 三页列表统一行几何:列表内留白 6px、行间 2px、行圆角 6px,去掉贯穿分隔线;
- 统一取消左侧 2px 竖条,选中态改为品牌浅底 + 品牌色 / 600 字重标题,与侧栏导航一致;
- 行高 64→60,保持 9 条一屏;部门树根级 / 子级行距同步;
- 新建角色页的角色模板列表套用同一套行样式;
- 角色副信息改为块级 text-overflow: ellipsis,右侧统计列 132→112px 归还宽度,
1440 下角色编码与数据范围不再截断。
影响面:
- 仅管理中心用户 / 角色 / 部门三页与新建角色页的列表视觉;
- 结构与交互不变,接口、权限、路由、数据均不变;≤1280/1080 沿用原响应式收缩规则。
回滚方式:
- 回滚本提交即恢复全宽行 + 1px 分隔线 + 左侧竖条与原行宽。
验证证据:
- pnpm format:check / lint / typecheck 通过;pnpm test:web 120/120 通过;
- Chrome 1440×900 实机截图:选中 + 悬停相邻行留白清晰,三页选中态一致;
- 角色列表副信息溢出检测:overflow: [](无截断)。
|
2026-11-03 15:55:06 +08:00 |
|
Stev_Wang
|
f849e443d7
|
refactor(web): 侧栏「用户与组织」更名为「用户管理」
背景:
- 管理中心侧栏菜单名为「用户与组织」,与「角色管理」「部门管理」的命名方式不一致;
- 页面标题、面包屑仍沿用旧名,三处展示不统一;
- A1 文档与代码注释中该功能域本来即称「用户管理」。
改动:
- nav-config:菜单 label 改为「用户管理」,description 改为「成员账号、部门归属与登录状态」;
- breadcrumbs:用户新建 / 详情子路由的面包屑 2 处同步;
- UsersPage:页面 h1 同步;
- nav-config.spec / breadcrumbs.spec / e2e a1-identity 的标签与 heading 断言同步;
- 11-前端路由与目录规范、AppLayout 注释同步;PRD P-01 功能名保持「用户与组织管理」不变。
影响面:
- 仅前端文案与对应断言;路由、权限点、接口、数据均不变。
回滚方式:
- 回滚本提交即恢复原「用户与组织」文案与断言。
验证证据:
- pnpm format:check / lint / typecheck 通过;
- pnpm test:web 120/120 通过;
- Chrome 1440×900 实机:侧栏、面包屑、页面标题均显示「用户管理」。
|
2026-11-03 15:54:13 +08:00 |
|
Stev_Wang
|
3e384febf3
|
fix(tooling): 给 db:reset 增加显式确认,避免误清本地密码
ci / 质量门禁 (push) Canceled after 0s
背景:
- 本轮部门管理联调后执行了 pnpm db:reset 清理测试数据,清空本地库,
导致用户手工改过的登录密码被重置回 lingxi2026;
- 之前只保证了 ./dev.sh / pnpm dev / pnpm db:init 不会重置数据,
db:reset 本身仍可被脚本或助手无提示执行,问题没有真正兜住。
改动:
- 新增 scripts/db-reset.mjs:默认拒绝执行并打印影响;只有显式
ALLOW_DB_RESET=1 才调用 prisma migrate reset --force;
- package.json 的 db:reset 指向该脚本;
- README / AGENTS §6 §11 / e2e README / A1 实施报告同步:
日常迁移补种子只用 pnpm db:init,验证/联调中禁止 db:reset;
e2e 会改写 actor 密码,需使用专用账号或独立测试库。
影响面:
- 确需清库时多一步显式确认;迁移、启动、单测、int 测试不受影响。
回滚方式:
- 回滚本提交即恢复 db:reset 直接执行 prisma migrate reset --force。
验证证据:
- pnpm db:reset 无 ALLOW_DB_RESET 时退出码 1,并打印拦截说明;
- pnpm format:check / lint 通过;node --check scripts/db-reset.mjs 通过。
|
2026-11-03 15:16:52 +08:00 |
|
Stev_Wang
|
981757b76c
|
docs(plan): 回写 A1 部门管理补强
ci / 质量门禁 (push) Canceled after 0s
背景:
- 部门管理已实现(独立页面 /system/departments、只停用不删除、
有成员/启用子部门禁止停用),需要同步计划、规范与实施报告。
改动:
- 开发计划:新增 WBS A1-BE-05(部门接口)与 A1-FE-04(部门管理页),
A1 进度更新为 10/10、测试计数与「补强」说明;附录 C 增加
/system/departments,§7.1 页面/接口清单更新;版本记录增补。
- A1 实施报告:范围表、契约/后端/前端交付物、测试计数与验证表补充
部门管理;新增 §2.5 部门管理补强(口径、规则、覆盖范围)与遗留项。
- 11-前端路由与目录规范:管理中心模块表补 /system/departments
(pages/system/departments/),版本 V1.1。
影响面:
- 仅文档;与已提交的代码行为一致,不改变其它批次范围。
回滚方式:
- 回滚本提交即恢复文档原状;不影响代码。
验证证据:
- pnpm format:check 通过;
- 文档中的测试计数、接口与页面路径与 feat(identity) 提交一致。
|
2026-11-03 15:02:14 +08:00 |
|
Stev_Wang
|
6661c42e84
|
feat(identity): 补齐部门管理(两级组织树、停用启用)
ci / 质量门禁 (push) Canceled after 0s
背景:
- A1 只实现了部门树读取与新建 / 改名接口,没有部门管理入口,
负责人、排序、停用状态都无法维护;
- 用户必须关联部门,部门无法维护会让 A2 的数据范围缺少组织基础。
改动:
- shared:DepartmentNode 增加 status / sortOrder / directMemberCount;
新增 createDepartmentInput / updateDepartmentInput / departmentTreeQuery 契约;
- api:GET /departments/tree?include_disabled;POST/PATCH /departments
(名称 / 负责人 / 排序);POST /departments/{id}/disable|enable;
只停用不删除,有在职成员 / 启用子部门 / 下级在职成员时禁止停用;
新建 / 编辑用户校验部门必须启用;@Audit 与 OpenAPI 同步;
- web:管理中心新增「部门管理」/system/departments,左两级组织树 +
右详情 / 内联编辑 + 新建部门/小组 + 停用启用二次确认;显示已停用、
?id= 选中可恢复、无 user:manage 只读;用户页部门选择仍只取启用部门;
- 测试:shared 契约、api 单测 + int、web 树/表单/接口单测同步。
影响面:
- 新增部门写接口与页面;GET tree 默认仍只返回启用部门,对用户页无破坏;
- 权限复用 user:view / user:manage,不新增权限点;
- 无数据库迁移(status / leader_user_id / sort_order 列已存在)。
回滚方式:
- 回滚本提交即移除部门管理页与写接口,保留原只读树;数据库无需回滚。
验证证据:
- pnpm format:check / lint / typecheck 全绿;
- pnpm test:shared 121 / api 90 / web 120;test:int 4 files / 33 tests;
- pnpm openapi:diff:无破坏性变更;
- 真实 API + 浏览器(jiang.lan):新建一级部门 / 小组、改名、停用空小组、
重名 40903、树/详情/停用确认均正常;
截图 design/a1-ui-v1/shots/impl/70-departments.png。
|
2026-11-03 15:01:07 +08:00 |
|
Stev_Wang
|
f4da1f3c02
|
refactor(web): 编辑角色主操作移入详情页头并移除页脚
ci / 质量门禁 (push) Canceled after 0s
背景:角色详情页把「编辑角色」放在右下角页脚,与页头的复制/停用分离,主操作位置突兀;页脚只剩一句备注也浪费垂直空间。
改动:
- 页头操作顺序调整为:复制 → 停用/启用(系统角色为改名)→ 编辑角色(实心主按钮);
- 只读用户显示「查看角色」,系统角色也显示「查看角色」(仅名称可改,避免编辑语义过强);
- 移除详情页脚及编辑按钮,权限摘要与绑定用户获得更多高度;
- 更新只读态单测断言。
验证:format:check / lint / typecheck / test 全绿;5173 实测页头操作与主按钮位置正确。
|
2026-11-03 14:16:39 +08:00 |
|
Stev_Wang
|
f5a8afe835
|
refactor(web): 侧栏与页面模块名由角色权限改为角色管理
ci / 质量门禁 (push) Canceled after 0s
背景:角色权限只描述模块的一部分能力,侧栏同级均为模块级命名(用户与组织 / 客户 / 行业树);角色页实际覆盖角色 CRUD、权限点、数据范围、特殊权限与 SoD。
改动:
- 侧栏、面包屑、页面标题统一为「角色管理」,页面内权限点 / 数据范围 / 特殊权限分区名不变;
- 用户详情与超管授予弹窗中的模块引用同步改为「角色管理」;
- 开发计划页面清单与 A2 实施报告同步;
- 更新导航与面包屑单测、A2 e2e 标题断言。
验证:format:check / lint / typecheck / test 全绿;5173 实测侧栏、面包屑、页标题均为「角色管理」。
|
2026-11-03 14:03:13 +08:00 |
|
Stev_Wang
|
a3419cf5da
|
refactor(web): 收敛角色页权限点目录入口
ci / 质量门禁 (push) Canceled after 0s
背景:列表页页头「权限点目录」与详情面板「查看权限点目录」和编辑器权限点 Tab 信息重复,抽屉只读、无搜索、无操作,且页头出现两个并列动作。
改动:
- 移除列表页页头目录按钮与 PermissionCatalogDrawer 组件及对应样式;
- 详情面板删除「查看权限点目录」入口,保留「已选 n / 30」信息;
- 权限查看统一走编辑器「权限点」Tab(只读用户也可进入查看);
- 同步 A2 实施报告与设计说明。
验证:pnpm format:check / lint / typecheck / test 全绿;5173 实测页头仅保留「新建角色」,详情面板无目录入口。
|
2026-11-03 13:56:35 +08:00 |
|
Stev_Wang
|
fe70a2bcee
|
fix(web): 修复角色列表页头操作按钮未右对齐
ci / 质量门禁 (push) Canceled after 0s
背景:/system/roles 页头标题容器缺少 lx-roles__head-txt 类,且页头未设置 space-between,导致「权限点目录 / 新建角色」紧跟在标题后停在页面中间;编辑器/新建页因标题容器有 flex:1 不受影响。
改动:RolesPage 标题容器补 lx-roles__head-txt;.lx-roles__header 增加 justify-content:space-between,操作区增加 margin-left:auto。
验证:pnpm format:check / lint / typecheck / test 全绿;本地 5173 实测按钮回到右侧(1440×900 截图已更新)。
|
2026-11-03 13:44:51 +08:00 |
|
Stev_Wang
|
7824bc7b32
|
fix(dev): 明确启动不重置数据库并新增安全 db:init
ci / 质量门禁 (push) Canceled after 0s
背景:开发机每次重启后被反馈需要重新用默认密码登录并强改,排查确认仓库启动链路(dev.sh / pnpm dev / API / worker / db:seed)均不重置密码;只有 db:reset / migrate reset / 重建数据卷会恢复种子密码。A2 收尾时为干净截图执行过 db:reset,是最近一次重置的直接原因。
改动:
- 新增 pnpm db:init = prisma migrate deploy + 幂等 seed,作为首次/迁移后的安全初始化;不重置数据、不覆盖已有密码。
- README / dev.sh / AGENTS 命令契约 / SEED.md / A1·A2 实施报告明确:日常启动不需要 DB 命令,db:reset 仅用于清库。
- 实测:对已改密的 admin 执行 db:init 后 password_hash 与 must_change_password 均未变化。
验证:pnpm format:check / pnpm lint 通过;db:init 实际执行通过。
|
2026-11-03 13:37:34 +08:00 |
|
Stev_Wang
|
7fb458f62f
|
docs(plan): 回写 A2 完成状态并记录 H1 权限门决策
ci / 质量门禁 (push) Canceled after 0s
背景:A2 角色权限与数据范围已完成,需回写计划状态、实施报告与架构决策记录。
改动:
- 新增 docs/adr/ADR-001-权限点目录与六类数据范围.md 及 ADR 索引,记录 H1 权限门六项决策。
- 新增 A2 实施报告(范围、交付、门禁、遗留、回滚、下一步)。
- 更新开发计划 §5.2 / §6.3 / 文档状态,并同步根 README 文档索引。
|
2026-11-03 12:27:15 +08:00 |
|
Stev_Wang
|
61894df401
|
feat(identity): 完成 A2 角色权限与数据范围全栈落地
背景:A2 开卡前完成 H1 权限门,确认权限点目录、特殊权限、SoD 三对、六类数据范围与超管隐式全集口径(ADR-001)。
改动:
- shared:30 权限点 / 10 模块目录与元数据、特殊权限 6 编码、SoD 三对、角色与权限树契约;/me 改 dataScopes 多角色并集。
- prisma:expand 迁移新增 permissions / data_scopes;种子按原型口径重写角色权限、数据范围与 8 项特殊授予。
- api:角色 CRUD / 复制 / 停用 / 删除、权限点启动同步、SoD 40304、系统角色保护、六类范围 ScopeContext 与 CustomerDirectory 端口、变更审计与 outbox。
- web:方案 B 主从分栏三角色页面(列表 / 编辑器 / 新建),权限树、范围选择、特殊权限二次确认、保存影响、SoD 冲突、只读态与模板预填。
- 测试:角色集成 13 条 + A2 e2e 1 条;A1 全量回归。
验证:format:check / lint / typecheck / test(306)/ test:int(27)/ A2 e2e(1,复跑通过)/ openapi:export 全绿。
|
2026-11-03 12:26:51 +08:00 |
|
Stev_Wang
|
f97f97b0cd
|
refactor(web): 统一模块化路由并将平台更名为管理中心
ci / 质量门禁 (push) Canceled after 0s
背景:
- 落实 11-前端路由与目录规范:URL、导航、面包屑、页面目录一一对应;
- 「平台」更名「管理中心」,模块 key 由 platform 改为 system;
- 原导航模块 key 与 URL 首段不一致(script vs /scripts、asset vs /assets),
占位页按 URL 解析不到模块,出现「页面不存在」。
改动:
- nav-config:模块 key 改为 URL 首段(scripts / assets / system),平台更名
管理中心,管理中心全部路径收敛到 /system/*;用户页为 /system/users;
- routes / router:ROUTES 按模块分组;新增 /system/users、/system/users/new、
/system/users/:id;旧 /users* 与 /platform* 加前端重定向;/system 落到用户列表;
- 页面目录迁移:pages/users → pages/system/users,pages/home → pages/dashboard,
懒加载与所有引用同步;
- 面包屑、AppLayout、登录回跳、通用占位页(按路径 + 权限解析,无权限进 403)
与单测 / e2e 路径同步;
- 顺带修复 /scripts/library、/assets/library 等占位页因模块 key 不一致导致的 404。
影响面:
- 仅前端路由与目录;后端 /api/v1/users 等接口与权限点不变;
- 旧书签 /users*、/platform* 由前端重定向兼容一个版本。
回滚方式:
- 回滚本提交即恢复 /users 与 /platform/* 路由、原页面目录与导航命名。
验证证据:
- pnpm --filter @lingxi/web lint / typecheck / test 通过(15 files / 55 tests);
- pnpm build 通过;
- 浏览器:登录后落在 /system/users,导航显示「管理中心」;/users → /system/users,
/platform/roles → /system/roles;有权限的 /scripts/library、/assets/library
显示占位页,无权限显示 403;
- A1 e2e 6/6 通过(真实 API + 浏览器)。
|
2026-11-03 10:31:13 +08:00 |
|
Stev_Wang
|
a1e28daec5
|
docs(routing): 新增前端路由与目录规范并收敛计划路由
ci / 质量门禁 (push) Canceled after 0s
背景:
- 前端路由缺少统一规范:导航模块 key 与 URL 首段不一致,页面目录未镜像
路由,04 规范中的历史路由示例与实际实现不符;
- 用户确认「平台」更名为「管理中心」,路由统一为 /<模块>/<功能>。
改动:
- 新增 11-前端路由与目录规范:模块与基础路径表、路径语法(复数 kebab-case、
/new、:id、层级与 query 状态)、pages/<模块>/<功能>/ 目录映射、路由注册、
旧链重定向、新增页面检查清单;
- 04 §8 的 API-27 改为模块化路由并链接 11;工程规范索引与 AGENTS §9 登记 11;
- 开发计划:平台更名管理中心,附录 C 页面清单收敛为模块化路由,§7.1 / §8.3
同步,版本记录补「路由规范回写」;
- A1 实施报告路由说明更新为 /system/users(旧 /users* 重定向)。
影响面:
- 仅文档与规范,不改变功能范围、权限点与后端接口;后续批次按 11 执行。
回滚方式:
- 回滚本提交即恢复原附录 C 与 04 §8 描述;代码不受影响。
验证证据:
- pnpm format:check 通过;路由与代码行为见相邻的 web 重构提交。
|
2026-11-03 10:30:55 +08:00 |
|