Commit Graph
95 Commits
Author SHA1 Message Date
liquidliang 0002654a68 docs: 添加配置对象深拷贝规则
- CLAUDE.md 新增第 18 条规则:getSetting 等返回配置对象的方法需返回深拷贝
- CODING_RULES.md 添加详细规则和错误/正确示例
- 防止脱敏函数等外部操作意外修改全局设置状态
2026-02-05 15:53:10 +08:00
liquidliang cbe11e0865 perf: 优化同步上传性能,避免 UI 阻塞
问题:pushToRemote 在主线程连续执行大量 CPU 密集型操作(JSON.stringify、加密等),
导致事件处理器无法及时响应,页面卡顿。

解决方案:
- 在 @aitu/utils 中添加 yieldToMain() 和 processBatched() 工具函数
- 在同步相关的 CPU 密集型循环中添加 yield 点,每 3-5 次迭代让出主线程
- 更新 CLAUDE.md 和 CODING_RULES.md 记录此规则

优化的文件:
- sync-engine.ts: 画板增量比较/上传循环
- data-serializer.ts: collectSyncData、serializeToGistFiles* 方法
- task-sync-service.ts: syncTasks、uploadTaskData 方法
- workflow-sync-service.ts: syncWorkflows、uploadWorkflowData 方法
2026-02-05 14:10:43 +08:00
liquidliang 3cdc13eaf1 chore: update version to 0.5.72 and enhance LLM API logging
- Bumped application version to 0.5.72 in index.html and version.json.
- Updated build time in version.json.
- Added remoteId support in LLM API logging functions for better tracking of asynchronous tasks.
- Improved logging in image generation API for better debugging and monitoring.
2026-02-05 10:55:46 +08:00
liquidliang 708131f7c1 docs: 添加 LLM API 日志记录异步任务 remoteId 规则
在 CODING_RULES.md 中添加规则,说明 failLLMApiLog 和 completeLLMApiLog
函数参数需要支持 remoteId 字段,便于异步任务调试和恢复追踪。
2026-02-05 10:28:02 +08:00
liquid f13f809a3f docs: 添加编码规则 - SW 初始化统一入口
- CLAUDE.md: 添加第 23 条规则 - 使用 swChannelClient.ensureReady() 作为统一入口
- CODING_RULES.md: 添加详细规则和示例代码
2026-02-05 09:08:53 +08:00
liquid e6a39db673 docs: 添加编码规则 - 模块循环依赖处理
新增规则说明如何避免和解决 ES 模块循环依赖导致的 TDZ 错误:
- 将共享函数提取到独立的隔离模块
- 使用服务注册表和 Proxy 延迟服务访问
- 单例构造函数中使用 queueMicrotask 延迟
2026-02-05 09:04:43 +08:00
liquid e0f459a63d docs: 添加降级模式任务执行规则
- 合并 CLAUDE.md 规则 13 和 20(主线程直接读取 IndexedDB)
- 新增规则 15:降级模式下 createTask 后必须自动触发 executeTask
- CODING_RULES.md 添加详细示例和说明
- task-queue-service.ts: 添加 executeTask 方法,创建/重试任务后自动执行
- task-storage-writer.ts: 添加 deleteTask 方法
2026-02-05 08:24:36 +08:00
liquidliang 8dfcf4a351 docs: 更新工具函数规则 - 添加新模块和避免不必要包装
- 更新 @aitu/utils 可用函数列表(blob、device、format、indexeddb)
- 添加"避免不必要的函数包装/别名"规则
- 优化规则 15 描述:禁止二次导出或不必要的包装
2026-02-04 11:19:20 +08:00
liquidliang 5c86d02b79 docs: 添加编码规则 - 降级路径功能一致性
降级到主线程直接调用 API 时,必须保持与 SW 模式相同的功能行为,
特别是 LLM API 日志记录,否则调试工具会漏掉这些调用。
2026-02-04 10:30:55 +08:00
liquid 3d844c4250 docs: 添加 LLM 响应格式兼容性和工作流状态同步规则
- LLM 响应格式兼容性:支持多种 AI 返回格式
- 工作流状态同步:使用轮询 IndexedDB 替代 SW 事件依赖
2026-02-04 09:18:09 +08:00
liquidliang 10f953f73c docs: 添加编码规则 - IndexedDB 直接读取和 RPC 超时处理
- 主线程直接读取 IndexedDB 优于 RPC:避免 postMessage 限制
- RPC 超时与重连策略:合理超时 + 自动重连重试
2026-02-03 20:42:27 +08:00
liquidliang ebb412d1c3 docs: 添加同步数据格式一致性规则
- CLAUDE.md: 添加第19条 SW 规则摘要
- CODING_RULES.md: 添加详细示例和数据格式参考表

修复调试面板中多处使用错误数据格式的问题:
- tasks.json 结构是 { completedTasks: Task[] } 不是数组
- 画板文件是 board_{id}.json 不是 .drawnix
2026-02-03 17:21:27 +08:00
liquid 97332dc7f1 docs: 添加同步模块日志规范
- 更新 CLAUDE.md 规则6,同步模块使用统一日志服务
- 在 CODING_RULES.md 添加详细的同步模块日志规范
- 包含正确/错误示例和 API 说明
2026-02-03 09:07:45 +08:00
liquid 27064a500e feat(sync): 任务队列同步下载远程数据时双向合并
- 修改 applySyncData 中的任务合并逻辑,基于 ID 去重
- 使用 updatedAt 时间戳判断保留更新的版本
- 合并完成后自动上传任务数据到远程,确保双向同步
- 添加编码规则:同步数据双向合并
2026-02-02 07:49:49 +08:00
liquidliang 8ecc8e7571 docs: 添加 CSS 变量优先级和弹出菜单截断规则
- CLAUDE.md: 更新 createPortal 规则说明,新增组件内颜色使用规范
- CODING_RULES.md: 添加详细的 TDesign CSS 变量优先级问题说明
- CODING_RULES.md: 添加弹出菜单被 overflow 截断的解决方案
2026-02-01 22:19:02 +08:00
liquid 8a95524814 docs: 添加数据安全保护编码规则
- CLAUDE.md: 添加摘要规则 #16 数据安全保护
- CODING_RULES.md: 新增"数据安全规范"章节
  - 破坏性操作前必须进行安全检查
  - 不可逆操作需要用户输入确认文字
  - 使用软删除(Tombstone)支持数据恢复
2026-02-01 15:06:19 +08:00
liquid da0c37e11c docs: 添加 SW 任务持久化规则和敏感 ID 脱敏说明
- CLAUDE.md: 新增规则14 - 任务数据必须通过 RPC 持久化到 SW
- CLAUDE.md: 规则7 补充 maskId 函数用于敏感 ID 脱敏
- CODING_RULES.md: 添加详细示例说明主线程任务数据持久化流程
2026-02-01 09:53:55 +08:00
liquid fbfd0f1329 docs: 添加 SW 重发 Tool Request 延迟规则
问题:页面刷新后 SW claim 工作流时立即重发 pending tool request,
但主线程的 registerToolRequestHandler 可能还没准备好,导致请求失败。

解决:重发时延迟 500ms,等待主线程 handler 准备好。
2026-01-31 21:38:18 +08:00
liquidandClaude d27939f80b feat(sw): 改进工作流恢复机制和错误处理
- 修复工作流恢复时 UI 与 SW 状态不一致导致的错误失败状态
- 保持 AWAITING_CLIENT 错误处理链完整,避免错误属性丢失
- 重构 channel-manager 和 workflow-executor
- 添加崩溃恢复对话框组件
- 拆分 sw-channel 类型定义到独立文件
- 更新文档规则:工作流恢复状态不一致、错误处理链保持完整

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-31 20:53:06 +08:00
liquid a91afda0f4 docs: 更新 postmessage-duplex 规则 (v1.1.0)
- 更新通信模式:broadcast/onBroadcast 用于单向通知
- 更新初始化:enableGlobalRouting 自动管理 channel
- 新增客户端配置:autoReconnect 处理 SW 更新
- 新增任务队列双服务同步规则
2026-01-31 14:09:20 +08:00
liquidandClaude 50c94058af feat: move ai_analyze to SW and improve debug panel logging
- Move ai_analyze tool execution to Service Worker to avoid postMessage
  timeouts; system prompt built in app layer and passed to SW
- Add full response JSON display for LLM API logs (fetch on expand)
- Improve PostMessage logging: use source labels (应用页面/SW) instead
  of direction, filter debug panel messages, support request-response linking
- Add waitForStorageRestore() to ensure RPC handlers return complete data
- Remove syncTasksToClients() in favor of paginated RPC queries
- Better VideoGenerationFailedError detection for business failures
- Clean up debug console.log statements

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-31 09:12:07 +08:00
liquid 597181ebca docs: 添加 postmessage-duplex 消息大小限制规则
- CLAUDE.md: 添加规则 12 - RPC 响应不超过 1MB,需后端分页+精简数据
- CODING_RULES.md: 添加详细规则和示例
  - postmessage-duplex RPC 消息大小限制
  - 分页查询必须在服务端过滤
2026-01-31 00:05:21 +08:00
liquid cac87cf458 docs: 添加 postmessage-duplex publish 模式规则
- CLAUDE.md: 新增规则 #11 - publish 模式下 ret 可能是 undefined,isReady 返回数字
- CODING_RULES.md: 新增错误示例 4-6,包含 ret 检查、isReady 检查、响应格式解析
2026-01-30 22:11:53 +08:00
liquidliang cacf6b43e5 docs: 添加 postmessage-duplex 库使用规范
- CLAUDE.md: 新增 SW 规则第 10 条摘要
- CODING_RULES.md: 详细规则包含 3 个错误/正确示例
  - subscribe 回调需从 response.data 提取数据
  - handler 必须返回响应避免发送方超时
  - 客户端需先发 SW_CHANNEL_CONNECT 让 SW 创建 channel
2026-01-30 19:27:59 +08:00
liquidliang a4ca6ca6ee refactor: rename project from Aitu to Opentu
- Updated project references across various files to reflect the new name "Opentu" instead of "Aitu".
- Adjusted ESLint configuration, documentation, and user manuals to ensure consistency with the rebranding.
- Removed outdated README backup file.

This change marks a significant rebranding effort to align the project identity with its new vision.
2026-01-29 11:24:47 +08:00
liquidliang 6abdcad300 docs: 添加工具函数组织规则
- CLAUDE.md: 新增第 15 条规则,禁止在业务包中二次导出通用函数
- CODING_RULES.md: 添加详细的错误/正确示例和 @aitu/utils 函数列表
2026-01-29 10:46:41 +08:00
gongchengtu a69c57a5b6 feat(workspace): 添加重命名验证功能,禁止同级重名
## 🎯 问题修复

修复项目管理中重命名时允许重复名称的问题,参考主流应用最佳实践。

## ✨ 核心功能

### 验证规则
1. **空名称检查** - 拒绝空字符串和纯空格
2. **长度限制** - 名称不能超过 100 个字符
3. **同级重名检查** - 同一文件夹内的画板/文件夹不能重名
4. **跨文件夹允许** - 不同文件夹内可以有同名项目
5. **类型区分** - 文件夹和画板可以同名(不同类型)

### 实现细节

**新增类型**:
- `ValidationError` - 验证错误类

**更新方法**:
- `workspace-service.ts`:
  - `validateBoardName()` - 画板名称验证
  - `validateFolderName()` - 文件夹名称验证
  - `renameBoard()` - 添加验证逻辑
  - `renameFolder()` - 添加验证逻辑

**UI 优化**:
- `ProjectDrawer.tsx`:
  - 友好的错误提示(MessagePlugin.warning)
  - 验证失败时保持编辑状态
  - 自动 trim 空格

## 📊 验证逻辑

```
同级禁止重名:
├── 文件夹A/
│   ├── 📄 设计稿 ✅
│   └── 📄 设计稿 ❌ 禁止
└── 文件夹B/
    └── 📄 设计稿 ✅(不同文件夹,允许)
```

## 🧪 测试

新增完整测试套件:
- 空名称验证
- 长度限制验证
- 同级重名验证
- 跨文件夹同名允许
- 自动 trim 空格
- 类型区分验证

## 📚 文档

- `docs/RENAME_VALIDATION_ANALYSIS.md` - 详细分析文档(617 行)
  - 主流应用对比分析
  - 方案选择与理由
  - 实施步骤与测试用例

## 🎨 用户体验

**Before**:
- ❌ 允许完全重复的名称
- ❌ 用户无法区分同名项目

**After**:
- ✅ 清晰的错误提示
- ✅ 保持编辑状态让用户修改
- ✅ 符合文件系统习惯

## 🔗 相关文件

- `packages/drawnix/src/services/workspace-service.ts`
- `packages/drawnix/src/components/project-drawer/ProjectDrawer.tsx`
- `packages/drawnix/src/types/workspace.types.ts`
- `packages/drawnix/src/services/__tests__/workspace-rename-validation.spec.ts`
2026-01-27 16:07:53 +08:00
gongchengtu 1c3fa39f3c feat(manual): 完成 AI 输入栏和 ChatDrawer 完整测试体系
🎉 项目里程碑:100% Manual 测试覆盖达成!

## 📊 完整成果

新增功能测试(9 个):
- ✅ AI 输入栏基础交互(输入/聚焦/展开/清空)
- ✅ 模型选择器(下拉/浏览/健康状态/选择)
- ✅ 参数配置(尺寸/数量/平铺展示)
- ✅ 多模态内容选择(上传/素材库/预览/移除)
- ✅ ChatDrawer 基础交互(打开/新建/列表/调整宽度)
- ✅ 会话管理(新建/重命名/切换/删除)
- ✅ 智能提示面板(历史/预设/置顶/使用)
- ✅ 灵感面板(空画布/推荐/分类/选择)
- ✅ AI 工作流(输入→配置→发送→执行→结果)

生成的 GIF(9 个):
- 📹 总大小:9.8 MB
- ⏱️  总时长:~149 秒
- 🎨 品牌色统一(#F39C12、#E91E63)
- ✨ 视觉效果完整(点击圆圈、快捷键提示)

新增代码(+1246 行):
- ✅ gif-recordings.manual.spec.ts  +575 行(9 个测试)
- ✅ 9 个 DSL 配置文件
- ✅ MANUAL_TEST_ANALYSIS.md(671 行分析文档)

## 🎯 覆盖度达成

- 静态截图:100% (21/21)
- 测试代码:100% (13/13)
- DSL 配置:100% (20/20)
- 已生成 GIF:100% (13/13)
- **总进度:100%** 🎊

## 💡 技术亮点

1. **完整的 AI 交互流程**:从输入到生成的全链路测试
2. **多模态内容支持**:上传、素材库、画布选择
3. **智能提示系统**:历史记录、预设、灵感面板
4. **对话管理完整**:会话创建、切换、管理
5. **工作流可视化**:实时状态、步骤展示

## 🎨 视觉质量

- ✅ 橙色渐变提示气泡(品牌色)
- ✅ 红色点击效果圆圈
- ✅ 流畅的动画过渡
- ✅ 所有 13 个 GIF 视觉统一

## 🔗 相关文档

- docs/MANUAL_TEST_ANALYSIS.md - 详细测试分析(671 行)
- apps/web-e2e/src/manual-gen/gifs/*.json - DSL 配置

注:GIF 文件(18MB)已生成但未提交(gitignore)
2026-01-27 15:06:52 +08:00
liquid c571cb77d4 docs(claude): 添加新规则 - 工作区初始化自动选择画板 2026-01-27 00:29:58 +08:00
liquidliang f7c1cded31 chore: update deployment scripts and versioning logic; bump version to 0.5.58 2026-01-26 11:54:07 +08:00
liquidandClaude ebca700560 fix(batch-generation): 修复批量生成只执行第一个任务的问题
批量生成时(通过 AIInputBar 指定数量 n),之前只会执行 1 个任务,其余被跳过为"重复"。
修复包括:
- 跳过 batchId 存在时的重复检测逻辑
- 在工作流转换和执行时正确传递批量参数 (batchId, batchIndex, batchTotal)
- 添加跨层数据转换的编码规则文档

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-26 00:13:03 +08:00
liquidandClaude a6172119cd feat(ui): 统一媒体预览组件并优化缩略图展示
- DialogTaskList 改用 UnifiedMediaViewer 替代自定义 Dialog 预览
- 删除 TaskQueuePanel 未使用的 PreviewContent 组件
- 生成结果缩略图改为 object-fit: contain 完整展示
- 图片上传组件添加 hover 大图预览功能
- 更新 CLAUDE.md 和 CODING_RULES.md 添加相关 UI 规范

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-25 15:37:59 +08:00
liquid a20c4a4685 docs: 添加 Slate-React Leaf DOM 结构稳定性规则
- CLAUDE.md: 新增 React 规则第 10 条摘要
- CODING_RULES.md: 添加详细规则和代码示例

问题背景:在 Slate-React 的 Leaf 组件中,根据样式条件动态
切换 HTML 标签(<u>/<s>)和 CSS 实现方式会导致 DOM 结构
变化,引发 "Cannot resolve a DOM node from Slate node" 错误
2026-01-25 13:13:39 +08:00
liquid fe13ef85e5 docs: 添加编码规则 - Clipper 布尔运算结果处理
添加关于 clipper-lib 布尔运算结果中外环和孔洞识别的规则:
- 不要依赖面积符号判断(坐标系不同会导致符号不一致)
- 应该用面积大小判断:最大的是外环,其他是孔洞
2026-01-25 13:04:47 +08:00
liquid 6f891ea637 docs: 添加编码规则 - useCallback 定义顺序
新增规则:useCallback 定义必须在引用它的 useEffect 之前,
否则会触发 TDZ (暂时性死区) 错误。
2026-01-24 23:52:33 +08:00
liquid 2bd5909824 Merge branch 'new-e2e' into develop 2026-01-24 23:38:34 +08:00
liquid c714761174 docs(claude): 添加新规则 - 日志记录应反映实际发送的数据 2026-01-24 23:37:30 +08:00
liquidandClaude 4daff777fe feat(e2e): 添加用户手册生成系统和 E2E 测试增强
- 新增截图标注工具,支持高亮、圆圈、箭头等标注
- 新增 MDX 用户手册源文件和 HTML 生成脚本
- 新增 GIF 录制功能,支持视频转 GIF 和键盘提示
- 为组件添加 data-testid 属性以支持 E2E 定位
- 更新 smoke/visual 测试,修复 tooltip 拦截问题
- 新增 E2E 测试规范到 CODING_RULES.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-24 23:13:30 +08:00
liquid 247676f7de chore: bump version to 0.5.45 2026-01-23 23:51:45 +08:00
liquid db199405de docs: 添加编码规则 - 模式切换状态同步 2026-01-23 22:48:21 +08:00
liquidliang 2ca7cc9d83 docs: 精简 CLAUDE.md 并补充编码规则
- 将 CLAUDE.md 从 356 行精简到 237 行(限制 300 行)
- 移动详细示例到 docs/CODING_RULES.md:
  - 外部 API 调用频率控制
  - 无效配置下的数据不应被持久化或执行
  - 同名模块的全局状态隔离问题
- 新增规则:坐标变换场景的一致性处理
  - 翻转状态下的鼠标交互方向调整
  - 翻转状态下的 cursor 样式动态计算
2026-01-23 18:05:51 +08:00
liquidliang 53d0900a3c docs: 添加共享模块设计规则
- 清理 CLAUDE.md 中重复的规则 8-10
- 添加规则 11:共享模块设计(*-core.ts 命名规范)
- 在 CODING_RULES.md 添加详细示例(TrimMode 配置模式)
2026-01-23 15:42:53 +08:00
liquidliang 27dedeac5a docs: 添加编码规则 - 布局抖动、结构化数据与图标验证 2026-01-23 12:36:23 +08:00
liquidliang 33aa2ed122 refactor(sw-debug): 模块化重构调试面板
- 将 app.js (4865行) 拆分为 21 个独立模块
- 新增模块: state, common, toast, backup, analysis-mode, theme-settings,
  llmapi-logs, memory-logs, export-modal, fetch-logs, indexeddb
- 排除 sw-debug 目录从预缓存清单,避免影响主应用性能
- 更换分析模式图标为文档图标(原为搜索图标易混淆)
- 添加预缓存配置规范到编码规则文档
2026-01-23 10:44:58 +08:00
liquidandClaude bbfeaaac91 fix(popup-toolbar): 修复多选元素时填充色图标显示异常
- 修复内联 style undefined 覆盖 CSS 类导致杂色图标不显示的问题
- 修复 BackgroundColorIcon 作为函数传递导致 React 警告
- 填充色杂色样式改用环形渐变,与线条杂色表示一致
- 添加相关编码规则到文档

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-23 00:13:35 +08:00
liquid dceb83a517 docs: 添加 SW 枚举值小写规则
Service Worker 内部枚举使用小写值(completed、image、video),
读取 SW 数据进行过滤时必须使用相同大小写,否则匹配失败但无报错。
2026-01-22 23:58:54 +08:00
liquid 1076cb2411 feat(ui): 统一 Tooltip 样式并美化模型健康状态信号展示
- 统一全站 Tooltip 为白底样式 (theme="light"),并优化层级 (zIndex)
- 将模型健康状态由圆点改为 3 格信号塔设计,根据错误率 (errorRate) 自动调整格数与颜色
- 在模型下拉选择器触发按钮上增加实时健康状态展示
- 更新 CLAUDE.md 和 CODING_RULES.md,添加 Tooltip 规范与量化表意设计准则
2026-01-22 22:38:58 +08:00
liquid f110657f6d feat(toolbar): 初始化时自动滚动显示 AI 按钮
当屏幕高度不足时,AI 图片/视频生成按钮可能不可见。
添加初始化时检测并自动滚动的逻辑,确保重要功能可被发现。

- 为工具栏按钮添加 data-button-id 属性便于定位
- 使用 ref 标志确保只执行一次,避免死循环
- 添加相关编码规则文档 (错误 19)
2026-01-22 22:14:44 +08:00
liquidliang c0e63d0c8c docs(rules): 添加 Blob MIME 类型获取和 Shift 连选防文本选中规则 2026-01-22 18:45:07 +08:00
liquidliang 1d8c77ca43 docs: 添加 UI 交互规范 - 可点击容器、筛选联动、全局配色
新增三条 UI 交互规则:
- 可点击容器模式:使用 pointer-events: none + 父容器 onClick 扩大交互区域
- 筛选与选中状态联动:选中计数和操作都基于筛选后的结果
- 全局组件配色统一:在 tdesign-theme.scss 中集中覆盖第三方组件样式
2026-01-22 14:38:40 +08:00