| ci(backend): build frontend before cargo — rust-embed needs ../dist 0.7.1 embedded the frontend into the binary; the backend CI jobs only checkout the repo, so the derive macro failed with "folder does not exist" on all three platforms while Release (which runs beforeBuildCommand) stayed green — the gate and the packager disagreed about the same commit. Backend jobs now run npm ci + npm run build before cargo, which also means CI tests the real artifact (embedded UI present), not a crippled variant. Linux/macOS backend jobs gain setup-node for the first time. | 17 hours ago |
| docs(site): surface web mode and the CLI on the landing page The landing page still advertised v0.4.0 and stopped at nine feature cards — a visitor would have concluded 0.7.0 was a docs-only release. Bumps the pill to 0.7.0 in all three languages and adds Web mode and Scriptable CLI cards, each with the loopback / no-kill-endpoint caveat stated rather than implied. Also keeps the module count honest (nine pages, not eleven cards — two of the fourteen cards describe packaging, not product modules). | 23 hours ago |
| fix(ci): FIFO 测试对齐 fail-loud 语义、放宽 mobile 快照跨平台容差 CI main 仍红的两个尾巴: 1. Backend Linux/macOS Tests:scan_skips_fifo_without_opening_it 期望 Ok(empty),但扫描对非普通文件是有意 fail-loud(防链接 攻击遮蔽)→ 返回 Err。测试改名 scan_rejects_fifo... 并断言 Err;「不打开 FIFO」的验证保留(真打开了会阻塞而非立即 Err)。 2. Frontend Visual regression:mobile-overview 在 Linux runner 有 ~0.01 的字体抗锯齿漂移,0.005 容差误报 → 0.02 并注释。 | 3 days ago |
| docs(release): 0.7.0 — three modes, refreshed screenshots, roadmap catch-up - CHANGELOG 0.7.0: HTTP mode, transport layer, cost CLI, crash visibility, the decoupling that made them possible, and the three defects above. - README (en/zh/ja): new "three ways to run it" section, CLI block gains cost and serve, badges and test counts brought to 532/161. - Architecture docs (en/zh/ja): they claimed "no HTTP API" while server.rs had a full /api — corrected, plus an HTTP-mode section listing every endpoint and the deliberate read-only boundary. - COMPARISON: browser mode is no longer "demo" but local live data. - ROADMAP: adds shipped 0.6.0/0.7.0 evidence tables, renumbers the unshipped "Reach" items to 0.8.0, and records the next five items with the research that justifies them. - docs/research-12-projects-2026-11-06.md: the competitive study behind those items, including what could not be verified. - scripts: check-version now normalises CRLF before matching Cargo.lock (cargo writes CRLF on Windows, which made the gate fail spuriously); shoot_docs measures the hero region instead of guessing 120px, which had been clipping the second line of the subtitle. - Removes au.log: a 256 KB CI runner log committed by accident. Adds *.log and .tmp/ to .gitignore so the next one cannot slip in. | 1 day ago |
| feat(visual): 粒子强度滑杆、自定义背景图、空态插画 用户批准的 P1 三项全量落地: 粒子强度(0-100): - AppearancePanel 滑杆(开启粒子时显示),store 持久化并钳制。 - ParticleBackdrop 改读用户强度,内部仍封顶 0.55 透明度。 自定义背景图: - AppearancePanel 选图 → FileReader → Image 解码 → 等比压缩最长边 1920 → JPEG 原样/其余转 PNG(canvas 画 GIF 只取首帧)→ 2.5MB 容量守卫 → setBackground。全链路本机,绝不上传。 - BackgroundImage 组件:78% 主题底色遮罩保证任何壁纸下可读; z-0 与光晕/粒子同层。store 白名单只收 data:image/*,在写入 源头拒收其它 URL(注入面在入口消灭)。 空态插画: - 共享 Empty 组件升级:虚线托盘 + 悬浮盒 + 语义图标嵌盒面 + accent/accent2 光点,1.5px 缓浮(data-motion=off 集中断闸)。 全站 10+ 空态一处升级全部受益;任务页手搓空态换用 Empty。 测试 +9(缩放计算/格式选择/容量守卫/强度钳制/背景图白名单/ v5→v6 迁移),489 全绿。设置页基线合法漂移已重生成,e2e 连跑 两遍 23 全过。截图自检:空态插画与设置页新控件人审通过。 | 3 days ago |
| fix(release): make the installed build actually usable — 0.7.1 Acceptance testing followed the real user path (silent install → launch → page-by-page walkthrough) and found two defects that only exist on an end-user machine, both invisible to every prior gate: - **Installed Web mode returned 404 for the page.** The install dir holds one exe and no dist/; the static-dir fallback chain ended at CARGO_MANIFEST_DIR/../dist — the build machine's source tree. Verified by moving dist away: GET / went 404 while /api stayed fine. Frontend assets are now embedded at compile time (rust-embed, 34 files, ~1.3 MB), so workbench serve is self-contained; a disk dist still wins so frontend-only iteration doesn't need a Rust rebuild. /api misses still return 404 JSON instead of falling through to the SPA. - **Pricing editor showed "desktop-only" in the browser.** Its load gate was isTauri() and the HTTP side had no pricing endpoint at all. Added GET/PUT /api/cost/pricing sharing the desktop validation (all-or-nothing), gate changed to isBackend(). Verified PUT → pricing_overrides.json → read-back identical. Acceptance walkthrough also confirmed working: project/task creation with restart persistence, process search + virtual scrolling, command palette jump, diagnostics (7 checks) in web mode, honest log-page degradation, theme badge "Web · live data". Uninstaller removes dir and registry key. | 17 hours ago |
| fix(release): make the installed build actually usable — 0.7.1 Acceptance testing followed the real user path (silent install → launch → page-by-page walkthrough) and found two defects that only exist on an end-user machine, both invisible to every prior gate: - **Installed Web mode returned 404 for the page.** The install dir holds one exe and no dist/; the static-dir fallback chain ended at CARGO_MANIFEST_DIR/../dist — the build machine's source tree. Verified by moving dist away: GET / went 404 while /api stayed fine. Frontend assets are now embedded at compile time (rust-embed, 34 files, ~1.3 MB), so workbench serve is self-contained; a disk dist still wins so frontend-only iteration doesn't need a Rust rebuild. /api misses still return 404 JSON instead of falling through to the SPA. - **Pricing editor showed "desktop-only" in the browser.** Its load gate was isTauri() and the HTTP side had no pricing endpoint at all. Added GET/PUT /api/cost/pricing sharing the desktop validation (all-or-nothing), gate changed to isBackend(). Verified PUT → pricing_overrides.json → read-back identical. Acceptance walkthrough also confirmed working: project/task creation with restart persistence, process search + virtual scrolling, command palette jump, diagnostics (7 checks) in web mode, honest log-page degradation, theme badge "Web · live data". Uninstaller removes dir and registry key. | 17 hours ago |
| chore: 增加 .gitattributes 统一换行符,消除跨平台 diff 噪音 | 27 days ago |
| docs(release): 0.7.0 — three modes, refreshed screenshots, roadmap catch-up - CHANGELOG 0.7.0: HTTP mode, transport layer, cost CLI, crash visibility, the decoupling that made them possible, and the three defects above. - README (en/zh/ja): new "three ways to run it" section, CLI block gains cost and serve, badges and test counts brought to 532/161. - Architecture docs (en/zh/ja): they claimed "no HTTP API" while server.rs had a full /api — corrected, plus an HTTP-mode section listing every endpoint and the deliberate read-only boundary. - COMPARISON: browser mode is no longer "demo" but local live data. - ROADMAP: adds shipped 0.6.0/0.7.0 evidence tables, renumbers the unshipped "Reach" items to 0.8.0, and records the next five items with the research that justifies them. - docs/research-12-projects-2026-11-06.md: the competitive study behind those items, including what could not be verified. - scripts: check-version now normalises CRLF before matching Cargo.lock (cargo writes CRLF on Windows, which made the gate fail spuriously); shoot_docs measures the hero region instead of guessing 120px, which had been clipping the second line of the subtitle. - Removes au.log: a 256 KB CI runner log committed by accident. Adds *.log and .tmp/ to .gitignore so the next one cannot slip in. | 1 day ago |
| docs(release): 0.7.0 — three modes, refreshed screenshots, roadmap catch-up - CHANGELOG 0.7.0: HTTP mode, transport layer, cost CLI, crash visibility, the decoupling that made them possible, and the three defects above. - README (en/zh/ja): new "three ways to run it" section, CLI block gains cost and serve, badges and test counts brought to 532/161. - Architecture docs (en/zh/ja): they claimed "no HTTP API" while server.rs had a full /api — corrected, plus an HTTP-mode section listing every endpoint and the deliberate read-only boundary. - COMPARISON: browser mode is no longer "demo" but local live data. - ROADMAP: adds shipped 0.6.0/0.7.0 evidence tables, renumbers the unshipped "Reach" items to 0.8.0, and records the next five items with the research that justifies them. - docs/research-12-projects-2026-11-06.md: the competitive study behind those items, including what could not be verified. - scripts: check-version now normalises CRLF before matching Cargo.lock (cargo writes CRLF on Windows, which made the gate fail spuriously); shoot_docs measures the hero region instead of guessing 120px, which had been clipping the second line of the subtitle. - Removes au.log: a 256 KB CI runner log committed by accident. Adds *.log and .tmp/ to .gitignore so the next one cannot slip in. | 1 day ago |
| feat: 对标完整开源项目补齐工程化,新增落地页与自动发布 工程与质量 - 接入 ESLint 9 + Prettier 3,修复全部 12 个问题(含 2 个 error),CI 加为门禁 - ECharts 5.6.0 -> 6.1.0:修复 GHSA-fgmj-fm8m-jvvx(XSS,CVE-2026-45249), npm audit 归零 - 抽出 src/lib/chartTheme.ts:图表色板 + 横向条形图构造器, 消除 4 个页面各写一遍的重复配置 - 修复 EChart 的 MutationObserver 随 option 重建(依赖数组错误), 主题切换改为经 ref 回放最新选项 - 修复图表配色依赖:chartGapColor 由隐式读 DOM 改为显式传 theme, 使主题切换能正确进入 useMemo 依赖 社区文件 - CONTRIBUTING / CODE_OF_CONDUCT / SECURITY / CHANGELOG - Issue 模板(bug / feature)+ PR 模板 + Dependabot 配置 README - 顶部徽章组、下载章节(安装包与免安装 exe 直链) - 五平台镜像表、系统要求表、FAQ、Roadmap - 项目结构与质量门禁说明同步到实际 落地页与发布 - docs/ 作为 GitHub Pages 源:一份页面服务全部镜像, 链接按访问域名自动切换(含 GitHub 用户名大小写还原) - pages.yml:push 到 main 自动部署文档站 - release.yml:打 v* tag 自动构建 Windows 安装包并发布 Release 其他 - scripts/shoot_landing.mjs:落地页截图(首屏 / 整页 / 移动端) | 26 days ago |
| feat: v0.3.0 — process tree, command palette, CLI, diagnostics, real showcase Six new capabilities, all with tests and real verification: - Process tree: buildForest/flattenTree over sysinfo parent_pid, cycle- and orphan-safe (a 2-node cycle and a self-parent both render exactly once), virtualised, per-row detail listing that process's own listening ports, CSV export with RFC 4180 quoting plus formula-injection neutralisation. - Command palette (Ctrl/Cmd+K): fuzzy search over pages, processes, ports, projects and tasks; Enter runs, Esc closes; process/port hits jump to the process page pre-filtered on that PID. - Port -> process jump both ways: every listening port has "show owning process", the process detail lists the reverse mapping. - Environment self-check: platform, data directory writability, cost DB, Claude/Codex/opencode session folders and the real port command, each reported ok/warn/fail with a hint and a copyable summary. - CLI mode on the same binary: workbench ps|ports|diag [--json], read-only, no window. Windows stdout works when redirected to a file or a pipe (the first implementation produced an empty file — caught by e2e/cli.spec.ts). - Feature E2E suite (7) + CLI E2E (5) + desktop E2E now restores the data it overwrites. Fixes found while auditing: - Process status was localized Chinese from Rust, so English/Japanese UIs showed 运行中. Backend now emits stable keys; processStatus.ts translates and still accepts the legacy labels. - Resource chart had hard-coded cyan/amber series; now uses the theme accent and warn colours. - alwaysOnTop was persisted but never re-applied after a restart. - Landing page referenced four screenshots that never existed, still said v0.1.1, and its Pages/Release workflows had been deleted from main by the mirror clean-up commits. All three fixed; Pages now fails when a referenced asset is missing, Release builds all three platforms with SHA-256 sums. - Demo mode had no process hierarchy and an empty log page, so the new tree and the log viewer looked broken in every screenshot. Showcase: README x3 rewritten (positioning, screenshots, 32-second demo video, feature matrix), docs/COMPARISON{,.zh-CN,.ja}.md against Mission Center, System Informer, btop++, Glances, Stats, ccusage and Claude Code Usage Monitor. Verified: tsc 0, eslint 0, prettier clean, vitest 370/370 (34 files), cargo test 91/91 + binding export, clippy -D warnings 0, jscpd 0.18%, Playwright 35/35 (23 visual/contrast + 7 features + 5 CLI), packaged-exe desktop E2E 16 checks, io E2E 5 checks, NSIS 4.95 MiB at 0.3.0. | 14 days ago |
| fix(release): make the installed build actually usable — 0.7.1 Acceptance testing followed the real user path (silent install → launch → page-by-page walkthrough) and found two defects that only exist on an end-user machine, both invisible to every prior gate: - **Installed Web mode returned 404 for the page.** The install dir holds one exe and no dist/; the static-dir fallback chain ended at CARGO_MANIFEST_DIR/../dist — the build machine's source tree. Verified by moving dist away: GET / went 404 while /api stayed fine. Frontend assets are now embedded at compile time (rust-embed, 34 files, ~1.3 MB), so workbench serve is self-contained; a disk dist still wins so frontend-only iteration doesn't need a Rust rebuild. /api misses still return 404 JSON instead of falling through to the SPA. - **Pricing editor showed "desktop-only" in the browser.** Its load gate was isTauri() and the HTTP side had no pricing endpoint at all. Added GET/PUT /api/cost/pricing sharing the desktop validation (all-or-nothing), gate changed to isBackend(). Verified PUT → pricing_overrides.json → read-back identical. Acceptance walkthrough also confirmed working: project/task creation with restart persistence, process search + virtual scrolling, command palette jump, diagnostics (7 checks) in web mode, honest log-page degradation, theme badge "Web · live data". Uninstaller removes dir and registry key. | 17 hours ago |
| i18n: 整仓三语化(英语为主,可切换简体中文 / 日本語) 应用界面 - 新增 src/lib/i18n:自研轻量引擎(无第三方依赖,组件与 store 均可用, 语言选择 localStorage 持久化,缺 key 三级回退不渲染空白) - 8 个页面 + 应用壳 + 错误边界 + store 文案全部接入 t(),词典按页面拆分 - 设置页新增语言切换区块;util 的日期/时长/dueLabel 文案随语言走, dayjs 相对时间改用对应 locale(en / zh-cn / ja) - 图表文案随语言刷新(相关 useMemo 依赖已核对) - 单测锁定语言保证确定性(setLang("zh") 断言中文原文) 仓库文档 - README 重写为英语主版本 + README.zh-CN.md + README.ja.md,顶部互相切换 - CHANGELOG / CONTRIBUTING / SECURITY / CODE_OF_CONDUCT 全部英文化 - 落地页 docs/index.html 三语(EN 默认 + 切换器),链接仍按域名自指本平台 门禁:prettier / eslint 零警告 / tsc / vitest 48 / vite build 全绿 | 26 days ago |
| chore(release): cut 0.4.0, add version gate and fix chart label contrast The version number lived in four files plus a fifth hand-written copy in the UI. Bump to 0.4.0, move the single source to package.json, inject it at build time, and add npm run version:check to CI so a half-finished bump cannot ship. Three chart regressions found by reading the rendered screenshots: - Horizontal bar value labels inherited the series gradient colour and became near-invisible on dark themes (the "3" in the port distribution read as an empty cell). Labels now use the theme text colour. - Bar-top labels in the process histograms collided with the top gridline; the value axis gets one extra step and no split line. - The AI memory chart put its "NNN MB" label on top of the axis tick; the axis now leaves 30% headroom and the grid widened to fit the label. Also: unify the workflow branch filters on main, document the branch and versioning policy in CONTRIBUTING, add docs/ROADMAP.md with an explicit not-planned section, replace GitHub-only badges with platform-neutral ones, and regenerate the screenshots and the four affected visual baselines. | 5 days ago |
| docs: 补齐 LICENSE,README 从宣传口径改回事实口径 - 补 MIT LICENSE 文件(此前 README 声明 MIT 但仓库无 LICENSE)。 - 「支持 Windows/macOS/Linux」→ 实际只有 Windows:采集写死 cmd /c netstat, bundle targets 只有 nsis,其余平台未验证,据实改写。 - Rust 版本要求 1.70 → 1.77(与 Cargo.toml 的 rust-version 一致)。 - 结构图里的 docs/ 目录不存在,删除;「请自行截图」的 TODO 段落移除。 - pricing_overrides.json 说明改为「只读,无 UI 写入入口」。 - 更新成本语义文档:estimated 也按行级时间戳分日;未定价型号记 zero_pricing。 - 新增「开发与质量」与「已知限制」章节,把没有 CI/前端测试/类型双维护 这些真实短板写在脸上,而不是留成隐性债。 - Cargo.toml 去掉模板占位 authors=["you"];package.json 补 license/engines。 | 27 days ago |
| docs(release): 0.7.0 — three modes, refreshed screenshots, roadmap catch-up - CHANGELOG 0.7.0: HTTP mode, transport layer, cost CLI, crash visibility, the decoupling that made them possible, and the three defects above. - README (en/zh/ja): new "three ways to run it" section, CLI block gains cost and serve, badges and test counts brought to 532/161. - Architecture docs (en/zh/ja): they claimed "no HTTP API" while server.rs had a full /api — corrected, plus an HTTP-mode section listing every endpoint and the deliberate read-only boundary. - COMPARISON: browser mode is no longer "demo" but local live data. - ROADMAP: adds shipped 0.6.0/0.7.0 evidence tables, renumbers the unshipped "Reach" items to 0.8.0, and records the next five items with the research that justifies them. - docs/research-12-projects-2026-11-06.md: the competitive study behind those items, including what could not be verified. - scripts: check-version now normalises CRLF before matching Cargo.lock (cargo writes CRLF on Windows, which made the gate fail spuriously); shoot_docs measures the hero region instead of guessing 120px, which had been clipping the second line of the subtitle. - Removes au.log: a 256 KB CI runner log committed by accident. Adds *.log and .tmp/ to .gitignore so the next one cannot slip in. | 1 day ago |
| docs(release): 0.7.0 — three modes, refreshed screenshots, roadmap catch-up - CHANGELOG 0.7.0: HTTP mode, transport layer, cost CLI, crash visibility, the decoupling that made them possible, and the three defects above. - README (en/zh/ja): new "three ways to run it" section, CLI block gains cost and serve, badges and test counts brought to 532/161. - Architecture docs (en/zh/ja): they claimed "no HTTP API" while server.rs had a full /api — corrected, plus an HTTP-mode section listing every endpoint and the deliberate read-only boundary. - COMPARISON: browser mode is no longer "demo" but local live data. - ROADMAP: adds shipped 0.6.0/0.7.0 evidence tables, renumbers the unshipped "Reach" items to 0.8.0, and records the next five items with the research that justifies them. - docs/research-12-projects-2026-11-06.md: the competitive study behind those items, including what could not be verified. - scripts: check-version now normalises CRLF before matching Cargo.lock (cargo writes CRLF on Windows, which made the gate fail spuriously); shoot_docs measures the hero region instead of guessing 120px, which had been clipping the second line of the subtitle. - Removes au.log: a 256 KB CI runner log committed by accident. Adds *.log and .tmp/ to .gitignore so the next one cannot slip in. | 1 day ago |
| docs(release): 0.7.0 — three modes, refreshed screenshots, roadmap catch-up - CHANGELOG 0.7.0: HTTP mode, transport layer, cost CLI, crash visibility, the decoupling that made them possible, and the three defects above. - README (en/zh/ja): new "three ways to run it" section, CLI block gains cost and serve, badges and test counts brought to 532/161. - Architecture docs (en/zh/ja): they claimed "no HTTP API" while server.rs had a full /api — corrected, plus an HTTP-mode section listing every endpoint and the deliberate read-only boundary. - COMPARISON: browser mode is no longer "demo" but local live data. - ROADMAP: adds shipped 0.6.0/0.7.0 evidence tables, renumbers the unshipped "Reach" items to 0.8.0, and records the next five items with the research that justifies them. - docs/research-12-projects-2026-11-06.md: the competitive study behind those items, including what could not be verified. - scripts: check-version now normalises CRLF before matching Cargo.lock (cargo writes CRLF on Windows, which made the gate fail spuriously); shoot_docs measures the hero region instead of guessing 120px, which had been clipping the second line of the subtitle. - Removes au.log: a 256 KB CI runner log committed by accident. Adds *.log and .tmp/ to .gitignore so the next one cannot slip in. | 1 day ago |
| chore(release): cut 0.4.0, add version gate and fix chart label contrast The version number lived in four files plus a fifth hand-written copy in the UI. Bump to 0.4.0, move the single source to package.json, inject it at build time, and add npm run version:check to CI so a half-finished bump cannot ship. Three chart regressions found by reading the rendered screenshots: - Horizontal bar value labels inherited the series gradient colour and became near-invisible on dark themes (the "3" in the port distribution read as an empty cell). Labels now use the theme text colour. - Bar-top labels in the process histograms collided with the top gridline; the value axis gets one extra step and no split line. - The AI memory chart put its "NNN MB" label on top of the axis tick; the axis now leaves 30% headroom and the grid widened to fit the label. Also: unify the workflow branch filters on main, document the branch and versioning policy in CONTRIBUTING, add docs/ROADMAP.md with an explicit not-planned section, replace GitHub-only badges with platform-neutral ones, and regenerate the screenshots and the four affected visual baselines. | 5 days ago |
| test(e2e,quality): agent approval flow, import/export E2E, macOS job, dup + cognitive gates Agent E2E (scripts/e2e-agent.mjs): a local OpenAI-compatible mock returns a mutating tool call, so the whole path runs without a real key or cost — provider config (key never echoed) → step enters approval → approve → the tool really writes to data.json → the same token is rejected on replay → tool result goes back to the model. This was the only part of the approval chain with unit tests but no end-to-end evidence. Import/export E2E (scripts/e2e-io.mjs): drives the hidden file input directly. Malformed JSON and an illegal task status are both rejected whole with the existing data untouched; a valid import lands in the store; the exported file can be imported again. Also found that Settings has two file inputs (theme vs data), so the selector must match on aria-label — a data import fed to the theme parser reports "theme is missing fields", which looks like data corruption. CI: add Backend (macOS) — fmt / test / clippy / tauri build --bundles app / bundle structure check. The platform code has always been cfg-gated but was never compiled anywhere. Quality gates: jscpd at a 3% threshold (measured 0.26%, 5 clones) and sonarjs/cognitive-complexity at 15 (0 functions over) now run in ci.yml and ci-local.mjs. Mutation testing: installed Stryker with the vitest runner and ran it twice (14 min full, 2 min single-file). Both runs reported "Ran 0.00 tests per mutant" with a 0.00 score — the runner does not discover vitest 5 tests. That 0.00 is a tool failure, not a quality signal, so it is documented as unconfirmed and the tool is uninstalled rather than left as a permanently red gate. vitest.config.ts → vitest.config.mts so the ESM config is unambiguous. Verification: ci-local 11/11 (--fast), coverage 93.90% lines / 86.40% branches, 342 unit, 16 Playwright, 104 Rust, 16+8+5 desktop E2E against the packaged exe. | 15 days ago |
| feat(diagnostics,theme): frontend diagnostics buffer, logs filtering, and a light default that does not flash Frontend diagnostics: - src/lib/diagnostics.ts: capture global error / unhandledrejection (beyond what ErrorBoundary sees), keep the last 50 with id, kind, stack and page; consecutive duplicates collapse; localStorage only. - ErrorBoundary: expandable stack + one-click copy for issue reports, crashes also land in the buffer. - Settings -> Diagnostics: frontend error list, clear button, appended to the copyable report. Theme: - default is light Frost; index.html pins first-paint tokens and syncs saved polarity before paint, so neither polarity flashes. - accentsoft is solved from the 4.6:1 target per theme instead of a fixed mix ratio (Frost measured 4.45:1 before); test covers all eight built-ins. - theme editor shows an auto-adjusted badge when the contrast solve will change the user's color on save. Logs page: - finish the interrupted edit: split("\n") was broken across lines, LogLevel / levelOf were referenced but missing; add keyword search, level filter with counts, shown/total line counter; log pane uses theme-derived panel2 instead of a hardcoded dark mix (timestamps measured 4.02:1 on Frost). E2E: custom-theme accent asserts hue preserved + AA after the solve; visual baselines regenerated for the light default. | 4 days ago |
| fix(release): make the installed build actually usable — 0.7.1 Acceptance testing followed the real user path (silent install → launch → page-by-page walkthrough) and found two defects that only exist on an end-user machine, both invisible to every prior gate: - **Installed Web mode returned 404 for the page.** The install dir holds one exe and no dist/; the static-dir fallback chain ended at CARGO_MANIFEST_DIR/../dist — the build machine's source tree. Verified by moving dist away: GET / went 404 while /api stayed fine. Frontend assets are now embedded at compile time (rust-embed, 34 files, ~1.3 MB), so workbench serve is self-contained; a disk dist still wins so frontend-only iteration doesn't need a Rust rebuild. /api misses still return 404 JSON instead of falling through to the SPA. - **Pricing editor showed "desktop-only" in the browser.** Its load gate was isTauri() and the HTTP side had no pricing endpoint at all. Added GET/PUT /api/cost/pricing sharing the desktop validation (all-or-nothing), gate changed to isBackend(). Verified PUT → pricing_overrides.json → read-back identical. Acceptance walkthrough also confirmed working: project/task creation with restart persistence, process search + virtual scrolling, command palette jump, diagnostics (7 checks) in web mode, honest log-page degradation, theme badge "Web · live data". Uninstaller removes dir and registry key. | 17 hours ago |
| fix(release): make the installed build actually usable — 0.7.1 Acceptance testing followed the real user path (silent install → launch → page-by-page walkthrough) and found two defects that only exist on an end-user machine, both invisible to every prior gate: - **Installed Web mode returned 404 for the page.** The install dir holds one exe and no dist/; the static-dir fallback chain ended at CARGO_MANIFEST_DIR/../dist — the build machine's source tree. Verified by moving dist away: GET / went 404 while /api stayed fine. Frontend assets are now embedded at compile time (rust-embed, 34 files, ~1.3 MB), so workbench serve is self-contained; a disk dist still wins so frontend-only iteration doesn't need a Rust rebuild. /api misses still return 404 JSON instead of falling through to the SPA. - **Pricing editor showed "desktop-only" in the browser.** Its load gate was isTauri() and the HTTP side had no pricing endpoint at all. Added GET/PUT /api/cost/pricing sharing the desktop validation (all-or-nothing), gate changed to isBackend(). Verified PUT → pricing_overrides.json → read-back identical. Acceptance walkthrough also confirmed working: project/task creation with restart persistence, process search + virtual scrolling, command palette jump, diagnostics (7 checks) in web mode, honest log-page degradation, theme badge "Web · live data". Uninstaller removes dir and registry key. | 17 hours ago |
| feat(ui): five visual styles, and visual regression tests Styles ------ A theme is not a palette. Five styles now change corner radius, shadow, spacing, type family and panel opacity — the things that decide how a screen feels — not just hue: Midnight dense dark console (the previous look) Frost light, airy, large radii, soft shadows Paper warm paper, serif headings, wide margins, no shadows Aurora translucent glass over a fixed gradient Terminal monospace, square corners, high contrast, no decoration Each is a set of CSS variables consumed by @theme-derived tokens plus a few structural classes (t-card, t-panel, t-btn, t-heading). Settings shows a live preview per style drawn from that style's own colours and radius, so the choice is made on evidence. Charts follow the style's light/dark footing via data-chart-theme, and the persisted theme migrates from the old dark/light values. Three real defects surfaced while building this: - A backdrop-filter: blur(0px) on every panel made the whole Settings page render blank in any environment without GPU compositing (screenshot pipelines, headless WebView, some remote sessions). Blur is now only applied by the one style that actually wants glass. - Charts read dataset.theme === "light", so every new style fell back to the dark chart palette — pale grey axes on a white background. They now read an explicit light/dark attribute. - Aurora's background gradient was painted but invisible: the app shell's opaque background covered it. The shell is transparent for that style only. Visual regression ----------------- 11 Playwright baselines across five styles and the key pages, plus a structural assertion that reads computed radius/shadow per style. The thresholds were tuned against evidence, not guessed: at 0.02 a radius change from 12px to 0 did not fail, which made the suite decorative. The current 0.005 was validated the other way — painting the background red fails four of the six tests. Tests run against the built bundle rather than the dev server, because HMR can otherwise settle the stylesheet mid-capture. CI runs the suite and uploads failing diffs as artifacts. | 18 days ago |
| feat(diagnostics,theme): frontend diagnostics buffer, logs filtering, and a light default that does not flash Frontend diagnostics: - src/lib/diagnostics.ts: capture global error / unhandledrejection (beyond what ErrorBoundary sees), keep the last 50 with id, kind, stack and page; consecutive duplicates collapse; localStorage only. - ErrorBoundary: expandable stack + one-click copy for issue reports, crashes also land in the buffer. - Settings -> Diagnostics: frontend error list, clear button, appended to the copyable report. Theme: - default is light Frost; index.html pins first-paint tokens and syncs saved polarity before paint, so neither polarity flashes. - accentsoft is solved from the 4.6:1 target per theme instead of a fixed mix ratio (Frost measured 4.45:1 before); test covers all eight built-ins. - theme editor shows an auto-adjusted badge when the contrast solve will change the user's color on save. Logs page: - finish the interrupted edit: split("\n") was broken across lines, LogLevel / levelOf were referenced but missing; add keyword search, level filter with counts, shown/total line counter; log pane uses theme-derived panel2 instead of a hardcoded dark mix (timestamps measured 4.02:1 on Frost). E2E: custom-theme accent asserts hue preserved + AA after the solve; visual baselines regenerated for the light default. | 4 days ago |
| chore: 初始化工程脚手架(Vite 6 + TS strict + Tauri 2 配置) | 27 days ago |
| chore(release): cut 0.4.0, add version gate and fix chart label contrast The version number lived in four files plus a fifth hand-written copy in the UI. Bump to 0.4.0, move the single source to package.json, inject it at build time, and add npm run version:check to CI so a half-finished bump cannot ship. Three chart regressions found by reading the rendered screenshots: - Horizontal bar value labels inherited the series gradient colour and became near-invisible on dark themes (the "3" in the port distribution read as an empty cell). Labels now use the theme text colour. - Bar-top labels in the process histograms collided with the top gridline; the value axis gets one extra step and no split line. - The AI memory chart put its "NNN MB" label on top of the axis tick; the axis now leaves 30% headroom and the grid widened to fit the label. Also: unify the workflow branch filters on main, document the branch and versioning policy in CONTRIBUTING, add docs/ROADMAP.md with an explicit not-planned section, replace GitHub-only badges with platform-neutral ones, and regenerate the screenshots and the four affected visual baselines. | 5 days ago |
| chore(release): cut 0.4.0, add version gate and fix chart label contrast The version number lived in four files plus a fifth hand-written copy in the UI. Bump to 0.4.0, move the single source to package.json, inject it at build time, and add npm run version:check to CI so a half-finished bump cannot ship. Three chart regressions found by reading the rendered screenshots: - Horizontal bar value labels inherited the series gradient colour and became near-invisible on dark themes (the "3" in the port distribution read as an empty cell). Labels now use the theme text colour. - Bar-top labels in the process histograms collided with the top gridline; the value axis gets one extra step and no split line. - The AI memory chart put its "NNN MB" label on top of the axis tick; the axis now leaves 30% headroom and the grid widened to fit the label. Also: unify the workflow branch filters on main, document the branch and versioning policy in CONTRIBUTING, add docs/ROADMAP.md with an explicit not-planned section, replace GitHub-only badges with platform-neutral ones, and regenerate the screenshots and the four affected visual baselines. | 5 days ago |