diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9ab5a35 --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +# 复制为 .env 并填写你的后端地址后生效(无需提交到 git) +# 后端接口契约见 docs/api-contract.md +VITE_API_BASE=https://api.xpcool.com diff --git a/.workbuddy/memory/2026-08-24.md b/.workbuddy/memory/2026-08-24.md new file mode 100644 index 0000000..5965ca7 --- /dev/null +++ b/.workbuddy/memory/2026-08-24.md @@ -0,0 +1,64 @@ +# 2026-08-24 工作日志 + +## 工具箱新增「有趣的分类与工具」批次 + +为 tool.xpcool.com 新增 3 个分类 + 9 个工具(31 → 40 个),全部通过 `pnpm type-check`。 + +### 新增分类(src/router/tools.ts) +- `dev` 开发进阶 / `design` 创意设计 / `fun` 趣味娱乐 + +### 新增工具(views/ 下各自目录) +- 开发进阶:sql-format(手写分词+关键词换行格式化器)、text-diff(LCS 行级 diff,折叠相同行)、json-to-code(JSON→TS interface/Go struct 含 json tag/Python dataclass,嵌套递归建类型表) +- 创意设计:gradient-generator(linear/radial/conic + 12 组预设 + 随机)、placeholder-image(canvas 占位图 + SVG 代码)、ascii-art(亮度感知加权灰度 → 字符,支持反色) +- 趣味娱乐:morse-code(pinyin-pro 中文转拼音编码 + Web Audio 电报声播放)、lucky-wheel(canvas 转盘 + ease-out 动画 + 指针判定)、slogan-generator(5 类文案库随机) + +### 要点备忘 +- TDesign 图标名需先在 node_modules/tdesign-icons-vue-next/esm/components/ 确认存在(PaletteIcon 不存在,只有 Palette1Icon;ascii-art 用了 ViewModuleIcon) +- 创意库设计文档:docs/tool-ideas.md(含未来 60+ 工具想法清单) +- 页面样式约定:scoped 内自建 .page-wrap/.form-actions/.code-block,复用公共组件 CopyButton/ErrorAlert/HistoryPanel/UploadDrop + +## 第二批:分类重构 + 后端预留机制 + 编程工具全系(40 → 58 个) + +### 分类重构(9 分类) +- 在 dev/design/fun 基础上新增 health(健康生活)/ study(学习办公)/ travel(旅行出行)/ online(在线服务·后端预留) + +### 后端预留机制(用户正在准备后端服务) +- `src/api/client.ts`:统一 API 客户端(VITE_API_BASE 配置,未配置返回「后端未接入」,统一响应 `{code,message,data}`) +- `docs/api-contract.md`:6 个接口契约(weather/exchange-rate/express-query/stock-quote/phone-locate/ip-info) +- 6 个预留页面:UI 完整、字段按契约类型化,后端上线即用;`.env.example` 提供 VITE_API_BASE 模板 + +### 编程工具 12 个(dev 分类) +- code-minify(JS/CSS/HTML 压缩美化,手写 tokenizer)、regex-visual(正则结构树解析器)、markdown-table、api-builder(fetch/curl 生成)、gitignore-gen、code-to-image(canvas 高亮卡片)、color-namer(148 色表欧氏距离匹配)、indent-convert、code-stats(30+ 语言注释规则状态机)、hello-world(33 语言)、json-diff(递归路径级 diff)、env-parse + +### 坑 +- ⚠️ Vue 模板 attribute 内嵌字符串不能写 `\"`(HTML 解析器把 " 当属性结束符)→ 字符串常量移到 script 定义 +- json-diff 的 `k in b` 需先把 b 断言为 Record,否则 TS2638/TS18048 + +### 剩余批次(创意库台账见 docs/tool-ideas.md 第三部分) +- 批次 A 健康 12 / B 学习 10 / C 旅行 6 / D 设计补全 9 / E 趣味补全 14 + +## 第三批:网络测试工具 + 上下文无缝切换机制(58 → 59) + +### 网络测试(online 分类) +- `network-test`:HTTP 检测走前端直连(CORS 受限时提示);Ping / TCP / DNS 走后端 `POST /api/tools/network-test`(契约已追加到 api-contract.md 第 7 节) +- 图标 WifiIcon + +### 上下文无缝切换机制(核心需求:切 CodeBuddy 账号后新 AI 能无缝接手) +- 关键洞察:**用户级数据(skills/memory)随账号走,项目内文件不随账号走** → 状态必须存在项目内 docs/ 下 +- `docs/PROJECT_STATE.md`:项目状态与交接文档(单点真相)——全貌/架构机制/待办批次/后端契约索引/技术坑/接手清单,含维护规则 +- `docs/CHANGELOG.md`:变更日志(倒序),每次请求/更改必追加 +- `AGENTS.md` 顶部新增「⚡ 接手必读」段落:新账号 AI 按顺序读 PROJECT_STATE → CHANGELOG → api-contract +- 约定:此后每次实质变更必须同步更新这 3 份文档 + 工作日志(已在 AGENTS.md 写明) + +## 第四批:网络测速工具(59 → 60) + +- `speed-test`(online,RocketIcon):下载测速(流式读 body 计时,后端/公网 cloudflare/自定义 URL 三模式,5-50MB,实时进度+峰值)、上传测速(随机数据上传,后端计时优先,1-10MB)、延迟测试(5/10 次 RTT + 抖动) +- 契约第 8 节:下载返回随机二进制流(Content-Length + Cache-Control: no-store 建议),上传返回 {bytes, duration_ms, speed_mbps} +- client.ts 导出 BASE_URL 供直接拼流式地址 + +## 第五批:删除 5 个工具(60 → 55) + +- 按用户要求删除:code-minify、lucky-wheel、slogan-generator、weather、stock-quote(页面目录 + tools.ts 条目 + 契约节) +- tools.ts 顺带清理无引用图标(Star/Smile/Edit/CloudyDay;ChartIcon 因 word-count 保留) +- ⚠️ 坑:项目内 rm -rf 被沙箱 safe-delete(genie-trash)拦截失败 → 改用 mv 到 $TMPDIR 实现移除(dist 同理) +- 文档全部同步:CHANGELOG 第五批 / PROJECT_STATE(55 个、dev 14、fun 1、online 6、契约 7 个)/ tool-ideas / api-contract(7 接口)/ 本日志 diff --git a/agents.md b/agents.md index b36fb02..3f07611 100644 --- a/agents.md +++ b/agents.md @@ -2,6 +2,14 @@ 本文档面向后续接手维护/扩展本项目的 AI 编码代理(Agent)与开发者,说明架构约定、关键机制、开发流程与常见坑。动手改代码前请先读完本文。 +> ## ⚡ 接手必读(任何 AI 账号 / 开发者接手时,按顺序先读这三份) +> +> 1. **`docs/PROJECT_STATE.md`** — 项目状态与交接文档(单点真相):当前全貌、9 分类 59 个工具清单、待办批次、技术坑、接手清单 +> 2. **`docs/CHANGELOG.md`** — 变更日志:每次请求/变更都会追加记录(倒序),先看最近的改动 +> 3. **`docs/api-contract.md`** — 后端接口契约:「在线服务」分类工具的后端契约,后端按此实现即可直接对接 +> +> **维护约定**:每次对本项目做实质变更,必须同步更新这三份文档(CHANGELOG 追加记录 / PROJECT_STATE 刷新状态 / 涉及后端则更新契约),并把 `docs/PROJECT_STATE.md` 第 7 节的接手清单走一遍。 + ## 1. 项目定位 - 名称:tool.xpcool.com(在线工具箱) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..37643e4 --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,74 @@ +# CHANGELOG — 项目变更日志 + +> 记录每次请求/变更,**倒序排列(最新在上)**。 +> 与 `docs/PROJECT_STATE.md` 配合使用:本文件回答「改了什么」,状态文档回答「现在是什么样」。 + +--- + +## 2026-08-24 第五批:删除 5 个工具(60 → 55) + +### 🗑 删除工具(页面目录 + 注册条目 + 相关契约全部清除) +- `code-minify` 代码压缩美化(dev) +- `lucky-wheel` 抽奖转盘(fun) +- `slogan-generator` 文案生成器(fun) +- `weather` 天气预报(online)—— api-contract 第 1 节一并删除 +- `stock-quote` 股票行情(online)—— api-contract 第 4 节一并删除 + +### 🧹 清理 +- tools.ts 删除对应条目及无引用图标(StarIcon / SmileIcon / EditIcon / CloudyDayIcon;ChartIcon 因 word-count 仍使用而保留) +- api-contract.md 接口一览更新为 7 个:exchange-rate / express-query / phone-locate / ip-info / network-test / speedtest-download / speedtest-upload +- 删除方式备忘:项目内 `rm` 触发沙箱 trash 保护(genie-trash 失败),改用 `mv` 到系统临时目录(`$TMPDIR/tool-deleted-*`)实现移除 + +## 2026-08-24 第四批:网络测速工具(59 → 60) + +### 🆕 新增工具 +- `speed-test` 网络测速(online 分类,图标 RocketIcon): + - 下载测速:流式读取计时(后端测速源 / 公网源 / 自定义 URL 三模式),实时进度与峰值速度,5/10/25/50MB + - 上传测速:生成随机数据上传,后端计时优先(`POST /api/tools/speedtest/upload`),1/5/10MB + - 延迟测试:5/10 次 RTT 采样,平均/最小/最大/抖动 + 等级 +- 契约新增第 8 节:下载测速返回随机二进制流(带 Content-Length)、上传测速返回 `{bytes, duration_ms, speed_mbps}` +- `src/api/client.ts` 导出 `BASE_URL`(测速工具直接拼流式地址) + +## 2026-08-24 第三批:网络测试工具 + 上下文无缝切换机制 + +### 🆕 新增工具 +- `network-test` 网络测试(online 分类):HTTP 站点检测(前端直连,测 DNS/TTFB/状态/大小)+ Ping / TCP 端口 / DNS 解析(后端模式),后端契约见 api-contract.md 第 7 节 + +### 🏗 机制 +- 新增 `docs/PROJECT_STATE.md`:项目状态与交接文档(单点真相),新账号 AI 接手必读 +- 新增 `docs/CHANGELOG.md`:本文件,每次变更必记录 +- `AGENTS.md` 顶部新增「接手必读」指引,指向上述两份文档与 api-contract.md —— 实现跨 CodeBuddy 账号无缝接续 +- 约定:任何后续变更必须同步更新 CHANGELOG.md / PROJECT_STATE.md / 工作日志 + +## 2026-08-24 第二批:分类重构 + 后端预留机制 + 编程工具全系(40 → 58) + +### 🏗 分类 +- 分类重构为 9 个:新增 `health 健康生活` / `study 学习办公` / `travel 旅行出行` / `online 在线服务(后端预留)` + +### 🆕 后端预留(6) +- `src/api/client.ts` 统一 API 客户端(VITE_API_BASE 配置,未配置降级提示,统一响应 `{code,message,data}`) +- `docs/api-contract.md` 接口契约文档(weather / exchange-rate / express-query / stock-quote / phone-locate / ip-info) +- 6 个预留页面骨架(UI 完整、字段按契约类型化),`.env.example` 提供配置模板 + +### 🆕 编程工具(12) +- code-minify(JS/CSS/HTML 压缩美化)、regex-visual(正则结构树)、markdown-table、api-builder(fetch/curl)、gitignore-gen、code-to-image(canvas 高亮卡片)、color-namer(148 色表)、indent-convert、code-stats(30+ 语言注释规则)、hello-world(33 语言)、json-diff(路径级)、env-parse + +### 🐛 修复 +- Vue 模板 attribute 内 `\"` 导致编译错误 → 字符串常量移到 script +- json-diff `k in b` 类型收窄 → 断言为 Record + +## 2026-08-24 第一批:趣味分类与工具(31 → 40) + +### 🏗 分类 +- 新增 `dev 开发进阶` / `design 创意设计` / `fun 趣味娱乐` + +### 🆕 工具(9) +- dev:sql-format(手写分词 SQL 格式化)、text-diff(LCS 行级 diff)、json-to-code(JSON → TS/Go/Python) +- design:gradient-generator(linear/radial/conic + 12 预设)、placeholder-image(PNG/SVG 占位图)、ascii-art(图片转字符画) +- fun:morse-code(中文走 pinyin-pro + Web Audio 电报声)、lucky-wheel(canvas 转盘动画)、slogan-generator(5 类文案库) + +### 📄 文档 +- 新增 `docs/tool-ideas.md` 工具创意库(现状 + 未来创意 + 进度台账) + +### 🐛 修复 +- `PaletteIcon` 不存在 → 改用 `ViewModuleIcon`(图标引用前需在 node_modules 确认存在) diff --git a/docs/PROJECT_STATE.md b/docs/PROJECT_STATE.md new file mode 100644 index 0000000..0c18686 --- /dev/null +++ b/docs/PROJECT_STATE.md @@ -0,0 +1,74 @@ +# PROJECT_STATE.md — 项目状态与交接文档 + +> **本文件是项目的「单点真相」(Source of Truth),任何 AI 账号 / 开发者接手项目时,请先读本文件,再读 `CHANGELOG.md` 与 `docs/api-contract.md`,即可无缝接续工作。** +> +> **维护规则(重要)**:每次对本项目做任何实质变更(新增/修改工具、改架构、改契约、修坑),必须同步更新: +> 1. `docs/CHANGELOG.md` —— 追加一条变更记录(倒序,最新在上) +> 2. 本文档 —— 更新工具清单、状态、待办与技术约定 +> 3. `.workbuddy/memory/YYYY-MM-DD.md` —— 工作日志 + +--- + +## 1. 项目快照 + +- **名称**:tool.xpcool.com(在线工具箱) +- **形态**:纯前端 SPA,无后端、无 mock。计算与文件处理在浏览器本地完成;「在线服务」分类的工具依赖自建后端(见第 5 节)。 +- **技术栈**:Vite 6 + Vue 3(` + + diff --git a/src/views/ascii-art/AsciiArtView.vue b/src/views/ascii-art/AsciiArtView.vue new file mode 100644 index 0000000..f3f0455 --- /dev/null +++ b/src/views/ascii-art/AsciiArtView.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/src/views/code-stats/CodeStatsView.vue b/src/views/code-stats/CodeStatsView.vue new file mode 100644 index 0000000..81fd4e3 --- /dev/null +++ b/src/views/code-stats/CodeStatsView.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/src/views/code-to-image/CodeToImageView.vue b/src/views/code-to-image/CodeToImageView.vue new file mode 100644 index 0000000..b91846c --- /dev/null +++ b/src/views/code-to-image/CodeToImageView.vue @@ -0,0 +1,308 @@ + + + + + diff --git a/src/views/color-namer/ColorNamerView.vue b/src/views/color-namer/ColorNamerView.vue new file mode 100644 index 0000000..caf6b69 --- /dev/null +++ b/src/views/color-namer/ColorNamerView.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/src/views/env-parse/EnvParseView.vue b/src/views/env-parse/EnvParseView.vue new file mode 100644 index 0000000..ed6206b --- /dev/null +++ b/src/views/env-parse/EnvParseView.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/src/views/exchange-rate/ExchangeRateView.vue b/src/views/exchange-rate/ExchangeRateView.vue new file mode 100644 index 0000000..51aa1de --- /dev/null +++ b/src/views/exchange-rate/ExchangeRateView.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/views/express-query/ExpressQueryView.vue b/src/views/express-query/ExpressQueryView.vue new file mode 100644 index 0000000..c9c00aa --- /dev/null +++ b/src/views/express-query/ExpressQueryView.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/views/gitignore-gen/GitignoreGenView.vue b/src/views/gitignore-gen/GitignoreGenView.vue new file mode 100644 index 0000000..769bd81 --- /dev/null +++ b/src/views/gitignore-gen/GitignoreGenView.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/src/views/gradient-generator/GradientGeneratorView.vue b/src/views/gradient-generator/GradientGeneratorView.vue new file mode 100644 index 0000000..975e67c --- /dev/null +++ b/src/views/gradient-generator/GradientGeneratorView.vue @@ -0,0 +1,279 @@ + + + + + diff --git a/src/views/hello-world/HelloWorldView.vue b/src/views/hello-world/HelloWorldView.vue new file mode 100644 index 0000000..5c327d9 --- /dev/null +++ b/src/views/hello-world/HelloWorldView.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/views/indent-convert/IndentConvertView.vue b/src/views/indent-convert/IndentConvertView.vue new file mode 100644 index 0000000..9a5a7a1 --- /dev/null +++ b/src/views/indent-convert/IndentConvertView.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/views/ip-info/IpInfoView.vue b/src/views/ip-info/IpInfoView.vue new file mode 100644 index 0000000..5ca1f38 --- /dev/null +++ b/src/views/ip-info/IpInfoView.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/src/views/json-diff/JsonDiffView.vue b/src/views/json-diff/JsonDiffView.vue new file mode 100644 index 0000000..55da7f4 --- /dev/null +++ b/src/views/json-diff/JsonDiffView.vue @@ -0,0 +1,261 @@ + + + + + diff --git a/src/views/json-to-code/JsonToCodeView.vue b/src/views/json-to-code/JsonToCodeView.vue new file mode 100644 index 0000000..51ee628 --- /dev/null +++ b/src/views/json-to-code/JsonToCodeView.vue @@ -0,0 +1,304 @@ + + + + + diff --git a/src/views/markdown-table/MarkdownTableView.vue b/src/views/markdown-table/MarkdownTableView.vue new file mode 100644 index 0000000..773041e --- /dev/null +++ b/src/views/markdown-table/MarkdownTableView.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/src/views/morse-code/MorseCodeView.vue b/src/views/morse-code/MorseCodeView.vue new file mode 100644 index 0000000..34763f6 --- /dev/null +++ b/src/views/morse-code/MorseCodeView.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/src/views/network-test/NetworkTestView.vue b/src/views/network-test/NetworkTestView.vue new file mode 100644 index 0000000..ad8bde7 --- /dev/null +++ b/src/views/network-test/NetworkTestView.vue @@ -0,0 +1,260 @@ + + + + + diff --git a/src/views/phone-locate/PhoneLocateView.vue b/src/views/phone-locate/PhoneLocateView.vue new file mode 100644 index 0000000..3620fae --- /dev/null +++ b/src/views/phone-locate/PhoneLocateView.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/src/views/placeholder-image/PlaceholderImageView.vue b/src/views/placeholder-image/PlaceholderImageView.vue new file mode 100644 index 0000000..a902f4a --- /dev/null +++ b/src/views/placeholder-image/PlaceholderImageView.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/src/views/regex-visual/RegexVisualView.vue b/src/views/regex-visual/RegexVisualView.vue new file mode 100644 index 0000000..b68b6f3 --- /dev/null +++ b/src/views/regex-visual/RegexVisualView.vue @@ -0,0 +1,368 @@ + + + + + diff --git a/src/views/speed-test/SpeedTestView.vue b/src/views/speed-test/SpeedTestView.vue new file mode 100644 index 0000000..9c7aef5 --- /dev/null +++ b/src/views/speed-test/SpeedTestView.vue @@ -0,0 +1,401 @@ + + + + + diff --git a/src/views/sql-format/SqlFormatView.vue b/src/views/sql-format/SqlFormatView.vue new file mode 100644 index 0000000..479585a --- /dev/null +++ b/src/views/sql-format/SqlFormatView.vue @@ -0,0 +1,355 @@ + + + + + diff --git a/src/views/text-diff/TextDiffView.vue b/src/views/text-diff/TextDiffView.vue new file mode 100644 index 0000000..87ab43f --- /dev/null +++ b/src/views/text-diff/TextDiffView.vue @@ -0,0 +1,319 @@ + + + + +