SrP-CFG_v3.1.10
📋 版本更新说明
项目仓库地址: github.com/RolinShmily/SrP-CFG_ForCS2
官方网站地址: cfg.srprolin.top
作者博客: blog.srprolin.top
当前版本: v3.1.10
fix(desktop/website): in-app download silently failing on mirror - ureq 3.3 cannot parse gh.269601.xyz chunked response; switch to ghproxy.net + surface download errors
a5057c9
- User report: downloaded in desktop app but package never showed in install
- page. Root cause (reproduced with standalone ureq 3.3 + native-tls test
- against the exact app download call):
- 国内加速 URL used mirror prefix gh.269601.xyz; its chunked-encoding
- response fails ureq 3.3 with 'protocol: chunk expected crlf as next
- character' -> download_from_url Err -> staging dir removed -> install page
- (folder-scanned) shows nothing; button had no catch -> silent failure
- direct GitHub URL works (116802B ok)
- tested alternative mirrors with the same ureq stack: ghproxy.net /
- gh-proxy.com / ghfast.top / gh.llkk.cc all OK; mirror.ghproxy.com 530;
- ghproxy.cc cert expired
- Changes:
-
- DL_MIRROR_PREFIX -> https://ghproxy.net/ (website navigation.ts +
- desktop lib/downloads.ts) with comment warning to re-test with ureq 3.3
- before changing mirrors
-
- Desktop DownloadPage.handleDownloadInApp: catch rejection and show
- inline red error '下载失败:... 可点击另一个按钮切换下载来源重试'
- (was try/finally only -> unhandled rejection, invisible failure)
- Verified: ureq-test binary downloads 116802B via ghproxy.net mirror;
- tsc both sides 0 err; build:web + desktop dist ok; workspace exe rebuilt
- (cargo build --release --features tauri/custom-protocol) and embedded new
- dist (index-BpT33P3D.js) - USER MANUALLY VERIFIED: download lands in
- %APPDATA%/top.srprolin.cfg/download// and install page shows it.
- build/client + app/desktop/dist synced.
docs(tasks): record desktop in-app download restore + 推荐 tag removal (1e51889, v3.1.10 re-tagged 3rd)
641a03e
feat(desktop/website): download page - in-app download restored (desktop) + remove 推荐 tag from buttons
1e51889
- User follow-up:
-
- Desktop: downloads must go in-app (staging dir) so the install page's
- '已下载配置包' can use them directly - restore handleDownloadInApp via
- window.api.downloadFromUrl for BOTH buttons (国内加速 mirror / GitHub 源
- direct); spinner + disabled while downloading
-
- Remove the 推荐 text+overlay pill from the buttons (desktop + website);
- color alone distinguishes source (accent orange = 国内加速, neutral
- outline = GitHub 源). Website info-box '(镜像,推荐)' -> '(镜像)'.
- Card-level badges (MSI/package 推荐) untouched - they recommend the item,
- not the source
- Verified: desktop renderer tsc 0 err, website tsc -b 0 err, builds ok;
- headless Edge on desktop dist: buttons '国内加速下载'/'GitHub 源下载', no
- 推荐 text on page; website download HTML: 3x each button, button-level 推荐
- removed. build/client + app/desktop/dist synced.
docs(tasks): record download two-button change (632dad8, deployed 30920977359)
0bb24af
feat(website/desktop): download page - two per-item buttons (国内加速 recommended / GitHub 源) instead of whole-card link
632dad8
- User request: replace single download affordance with two color-distinguished
- buttons per item; links differ only by mirror prefix.
- Website (download.tsx + downloads.ts):
- installers/packages data now expose mirrorUrl (gh.269601.xyz prefix) +
- githubUrl (direct GitHub releases/latest/download)
- cards are no longer whole-card links; each item renders 2 buttons:
- 国内加速下载 (accent bg + 推荐 tag, recommended) and GitHub 源下载
- (neutral outline); hover affordance moved from card to buttons
- info box notes both sources point at official GitHub Release assets
- Desktop (DownloadPage.tsx + lib/downloads.ts):
- replaces 下载到应用 (in-app downloadFromUrl) + external icon button with
- two openExternal buttons: 国内加速下载 (accent + 推荐) / GitHub 源下载
- (neutral outline); adds dlGithub() helper (no mirror prefix) alongside dl()
- usage box text updated (no more 下载到应用; both entries = official assets)
- Verified: website tsc -b 0 err, desktop renderer tsc 0 err, build:web 7.7s,
- desktop vite build ok; headless Edge on localhost: download page shows 6
- buttons (2x3 items) with correct mirror/direct hrefs and 0 whole-card links;
- computed styles: accent rgb(242,138,26) vs neutral transparent+border;
- desktop dist renders both buttons. build/client + app/desktop/dist synced.
docs(tasks): record v3.1.10 tag overwrite + re-release (3 workflows green, assets refreshed)
c2c8872
- TASK-about-download-content-fix: 四-部署 add tag overwrite record; 备注
- desktop About copy now live via rebuilt release
- PROGRESS 四-7: add tag overwrite + release workflows overwrite:true note
- AGENT-START: next-step item resolved (desktop About copy shipped in v3.1.10)
chore(ci): allow re-uploading assets when an existing tag is overwritten (overwrite: true)
be0a39e
- Re-tagging v3.1.10 at current HEAD triggers release-desktop/release-config
- again; softprops/action-gh-release fails on duplicate asset names unless
- overwrite: true. Adds it to all 3 upload steps (MSI+NSIS, marker, config zip).
docs(tasks): handoff prep - new task book TASK-about-download-content-fix (done 718f48b), update PROGRESS 四-7 + AGENT-START status
d109c95
- new task book: about pages tech stack / download portable->Setup EXE /
- Runtime Core card double-border bug / README+docs tech stack; verified
-
- deployed (run 30918405839)
- PROGRESS: header + 四-7 (content update done) + 已完成 list
- AGENT-START: mark both website tasks done, add next-step candidates
- (user final confirmation, desktop release for About copy, refactor->main merge)
feat(site): align about/download pages + README/docs tech stack with rebuilt stack (Tauri/Vite-RR7)
718f48b
- User-reported content/presentation issues after L2/L3 rebuild:
-
- About pages (website + desktop): tech stack was stale (Astro/Electron).
- website about: Vite / React Router 7 (SSG 2800+ 页) / React 19 / Tauri v2
- (Rust 后端) / TypeScript / TailwindCSS / Velite / Cloudflare Workers
- desktop about: Tauri v2 / Rust (core crate) / React 19 / Vite / TypeScript /
- TailwindCSS; intro aligned with website
-
- Download page '便携版 (Portable)' -> releases only publish exe+msi (L4
- removed Portable.zip). Replaced with 'Setup 安装程序 (EXE)'
- (SrP-CFG_Setup_x64.exe, NSIS); README quick-start line 21 likewise
- 'MSI / Portable' -> 'MSI / Setup (EXE)'
-
- Runtime Core featured card double-border bug: outer div (border-accent/20)
-
- nested Card (own border-border) rendered two stacked borders. Both card
- variants now single plain div (featured accent border / plain border-border)
-
- README: added 技术栈 section + precise 项目结构 annotations
- (Vite + React Router 7 SSG / Tauri v2 + React 19 + Rust core)
-
- Docs center: srpcfg-1.md overview gains 项目工具链 section (desktop/site/
- commands/AI/style stack table)
- Verified: pnpm build:web (7.9s) + tsc -b zero errors + desktop renderer tsc
- zero errors + test:ai-stream 12/12; local wrangler dev + headless Edge:
- download page shows MSI + Setup EXE (no Portable), Runtime Core card single
- 1px accent border (no nested Card), about tech stack accurate, docs
- srpcfg-1 shows 项目工具链 table. build/client + app/desktop/dist synced.
docs(tasks): mark website prod routing fix done (ac887fc) - update PROGRESS 四-6 + gotchas 35/36, task book status/acceptance
2a28282
- PROGRESS 四-6: ✅ done - root cause (assets.binding missing -> env.ASSETS
- undefined -> TypeError 1101), fix (routeDiscovery initial + assets.binding
- ASSETS), deploy via workflow_dispatch run 30916591921, prod verification
- gotcha 35: resolved record + 'keep assets.binding' warning for future deploys
- gotcha 36: add headless Edge --ignore-certificate-errors workaround (proven
- for prod client-side nav verification)
- TASK-prod-routing-fix.md: status -> fixed, task checklist checked, root
- cause + verification recorded
fix(website): production routing broken - /__manifest 500 -> client route discovery failure
ac887fc
- Root cause (locally reproduced with wrangler dev --local, identical to prod):
- wrangler.json assets.directory without assets.binding -> platform-direct
- 'Workers Static Assets' mode where env.ASSETS is undefined
- worker.ts line 111 'env.ASSETS.fetch(request)' throws TypeError on any
- non-asset path (worker.ts untouched per 铁律) -> 500 error 1101
- react-router v7.18 lazy route discovery (fog-of-war) fetches /__manifest
- on mount + every client navigation -> 500 -> 'Failed to fetch manifest
- patches' -> only / (hydration succeeds without patches) worked
- Fix (2 config-level changes, worker.ts / ai-stream.ts / AI-Vectorize
- bindings / assets.directory all untouched):
-
- react-router.config.ts: routeDiscovery mode 'lazy' -> 'initial'
- all 2806 pages are SSG prerendered and the full route manifest is
- bundled (manifest-*.js); initial mode loads all routes eagerly and
- the client never requests /__manifest
-
- wrangler.json: assets.binding: "ASSETS"
- restores worker-first mode; env.ASSETS defined -> existing assets
- (html/js/css/.data) served 200, missing paths 404 instead of 500
- Verified:
- pnpm build:web ok (7.9s, 2806 html + 16 .data files, sitemap 2806 URLs)
- tsc -b zero errors; test:ai-stream 12/12
- wrangler dev --local: / 200, /__manifest 404, /nonexistent-page-xyz 404,
- /docs/practice.data 200, /api/chat 405, no worker TypeError in log
- headless Edge CDP client-nav test (localhost:8787): home -> /docs ->
- /docs/srpcfg-1 (loader .data fetch) -> /commands -> /commands/+cl_show_
- team_equipment -> back home: all render, 0 console errors
- build/client + build/server synced per repo convention
docs(tasks): new task book - website prod routing fix (/__manifest 500 -> client routing broken); update PROGRESS/AGENT-START with diagnosis + gotchas 35/36
b97b22f
docs(tasks): mark GH Actions real trigger done - v3.1.10 release all green, updater e2e verified
f5408d3
docs(tasks): mark official icon replacement done (0e09eb6) + note 34 resource.lib cache gotcha
e79c3aa
feat(desktop): replace placeholder icons with official software icon
0e09eb6
- source: app/desktop/resources/icon.ico (= C:\Users\Rolin\Downloads\icon.ico,
- byte-identical md5 6ef8adac; the pre-refactor Electron app icon per forge.config
- icon: ./resources/icon) regenerated via tauri icon -> 32x32/128x128/128x128@2x/
- icon.ico/icon.png + icon-source.png (1024px)
- verified: generated icon.ico vs official diff 0%; installed exe (NSIS) embedded
- icon diff 1.0% (32px downsample); app functional after reinstall
- note: had to delete stale target/release/build/srp-cfg-desktop-* so tauri-build
- regenerates resource.lib with the new icon (windres resource was cached)
docs(tasks): check L4 acceptance 28 (upgrade migration) done in TASK.md
8bdf9ea
docs(tasks): TitleBar physical drag verified by human (2026-08-05) - mark L2 leftover 2.7 fully done, screenshots archived
61667bf
docs(tasks): archive 7-page visual regression screenshots (installed app 3.1.6, migration-fixed build)
d3dbf29
docs(tasks): mark L4 migration acceptance done (bug f7f2fa6 found+fixed), TitleBar drag handed to manual, GH Actions trigger pending user confirmation
117ced3
fix(desktop): migration skipped when staging pre-creates target dirs (L4 acceptance 28)
f7f2fa6
- root cause: lib.rs setup ran initialize_staging_area() BEFORE run_migration();
- staging creates the exact 7 category dirs (cfg/annotations/video/upload/download/
- save/res) in app_data_dir, so plan_migration saw all legacy entries as already
- present -> all Skip -> should_migrate=false -> old %APPDATA%/srp-cfg data never
- migrated and no .migrated marker (silent data invisibility)
- fix 1: run run_migration() before initialize_staging_area() in setup
- fix 2: migrate.rs ignores EMPTY target dirs when planning (staging scaffolding
- does not count as real data), so partially-initialized targets still migrate
- verified on Windows real install (NSIS /S -> %LOCALAPPDATA%\SrP-CFG Installer):
- fresh first launch -> 283 files moved byte-identical across 7 categories
- (0 missing / 0 size mismatch vs backup), legacy dir emptied, .migrated written,
- app functional (detectAll Steam+CS2+3 users, getUserConfig reads migrated custom.cfg)
docs(tasks): manual TitleBar physical drag test spec - hand over to human (auto mouse_event sim inconclusive, env blocked)
51b052f
docs(tasks): handover update - 2.7 acceptance done (5 bugs fixed+committed), remaining TitleBar physical drag / L4 migration / GH Actions
8c8f34c
- AGENT-START.md: rewrite for final leftover round - 4+1 bugs committed
- (27f8f9d IPC cmd names / 5b8eb94 updater null body / 418c2d4 drag ACL /
- 556fc21 dist refresh), new env rules (custom-protocol feature, FLUTTERVIEW
- overlay, winctl.ps1/cursormove.ps1 helpers), remaining tasks
- PROGRESS.md: 2.7 acceptance status, updater resolved (was suspected
- rate-limit, actual root cause null body), gotchas 26-30 added
- TASK.md (L2): tick getFilePaths pluginization + visual regression
fix(desktop): TitleBar drag blocked by ACL - add core:window:allow-start-dragging
418c2d4
- L2 leftover acceptance: data-tauri-drag-region attr + drag.js handler present
- but window drag failed. Root cause: capabilities/default.json only had
- core:default/opener:default/dialog:default; core:window:default does NOT
- include allow-start-dragging -> invoke('plugin:window|start_dragging') was
- rejected by ACL ("not allowed by ACL"). Added core:window:allow-start-dragging.
- Verified: rebuilt release exe (custom-protocol), invoke now resolves
- DRAG_CMD_ALLOWED. Physical OS drag loop not visually verified - local
- Flutter terminal window (FLUTTERVIEW) constantly reasserts foreground and
- covers the app window (environment limitation).
chore(desktop): refresh renderer dist - sync api command-name fix + getFilePaths pluginization
556fc21
- Tracked dist (from 443bb84) still contained the broken Electron-era
- "installer:detectAll" channel names; 27f8f9d fixed api.ts source but dist
- was not rebuilt. Rebuild renderer (vite) -> bundle now has detect_all/
- data-tauri-drag-region/drag-drop markers, zero "installer:" channel refs.
fix(desktop): updater JSON parse fails on GitHub null body (L2 leftover acceptance)
5b8eb94
- Real-device finding: checkForUpdate returned hasUpdate:false although v3.1.7-9
- exist upstream. Root cause: GitHub Releases API returns "body": null for
- releases without body text (v3.1.4), but GitHubReleaseRaw declared body:
- String -> strict serde parse of the whole 10-release list failed
- ("invalid type: null, expected a string"), and the Err path silently
- degraded to empty result. Fixed: name/body as Option with #[serde(default)],
- mapped via as_deref().unwrap_or("") in map_raw.
- Verified (Windows release exe + CDP): checkForUpdate(true) -> hasUpdate:true,
- releases 3.1.9/3.1.8/3.1.7, hasConfigUpdate:true (newer releases are config-only,
- no DESKTOP_UPDATE_MARKER -> hasDesktopUpdate:false correct); getLatestVersion -> 3.1.9;
- getUpdateHistory -> 10 releases; cache.json written with all releases.
fix(desktop): tauri dev acceptance - fix 3 hidden bugs found in real-device testing
27f8f9d
-
- IPC command names all broken: api.ts used Electron-era "installer:detectAll" channel
- names but Rust registers snake_case #[tauri::command] fn names -> all 49 window.api
- calls failed at runtime (tsc static check could not catch). Fixed: all invoke strings
- now use real command names (detect_all/updater_check/...), param keys camelCase.
-
- ureq 3.3 TLS panic: default TLS provider is Rustls but not compiled (default-features=false
-
- native-tls) -> https requests panic immediately. Fixed: explicit
- ureq::tls::TlsConfig::builder().provider(TlsProvider::NativeTls) in updater.rs + staging.rs.
-
- TitleBar drag broken: -webkit-app-region is Electron-only; Tauri v2 needs
- data-tauri-drag-region attribute. Fixed: data-tauri-drag-region="deep" + removed CSS.
- Verified: tsc -p tsconfig.renderer.json ✓, vite build ✓, cargo test -p srp-cfg-core 84 ✓,
- 47 invoke strings cross-checked 1:1 against registered commands ✓
docs(tasks): record L2 leftover wrap-up progress - getFilePaths done, 3 hidden bugs found in tauri dev acceptance
1c105f0
- PROGRESS: task 1 (getFilePaths pluginization, 443bb84) done; task 2 in progress
- record 3 hidden bugs found via real-machine tauri dev (IPC command names all broken /
- ureq 3.3 TLS panic / TitleBar drag region), all fixed but uncommitted
- add env pitfalls 19-25: IPC naming rule, ureq TLS rule, data-tauri-drag-region rule,
- dev tree reaping by WSL interop, vite HMR reads Windows workspace, WebView2 CDP
- verification method, updater hasUpdate:false pending re-check (likely GitHub rate limit)
- AGENT-START: sync task status + environment rules
chore(desktop): update Cargo.lock for tauri-plugin-dialog (workspace resolution)
6e8472f
feat(desktop): pluginize getFilePaths - native dialog picker + Tauri drag-drop paths (L2 leftover)
443bb84
- add @tauri-apps/plugin-dialog (JS) + tauri-plugin-dialog (Rust) deps, register plugin, capability dialog:default
- api.ts getFilePaths: real impl (normalize/dedupe path strings) keeping signature; File objects return [] (Tauri has no webUtils.getPathForFile)
- UploadZone: click opens native multi-select dialog (.zip/.cfg/.txt); drag-drop via onDragDropEvent (tauri://drag-drop) with real paths incl. folders
- verified: tsc + vite build clean (WSL), cargo test core 84 green, Windows tauri build NSIS 2.6MB/MSI 3.7MB
docs(tasks): update PROGRESS/AGENT-START for L2/L4 completion - handover to leftover wrap-up
c881aa9
- AGENT-START.md:新任务 = L2/L4 遗留收尾(getFilePaths 插件化 / 2.7 视觉回归 + tauri dev
- 全功能验收 / 真实升级迁移验证 / GH Actions 真实触发 / 正式图标替换);补充 Windows 实机
- 构建环境铁律(本地盘工作区 C:\Users\Rolin\srp-cfg-build、cargo 镜像、命令模板);
- 保留参考实现勿删(src/main/services + preload)
- PROGRESS.md:修正 WSL 发行版为 Arch Linux(原误写 Ubuntu);提交数 35→41;环境表加
- Windows 实机构建行;下一步任务整理为遗留收尾清单(5 项按优先级 + 已完成项)
- 验证:cargo test -p srp-cfg-core 84 全绿(上一轮已验证)
docs(tasks): mark L2/L4 complete - shell+commands+2.6 acceptance+2.8 packaging+CI switch
d64a021
- layer-2-desktop-tauri/TASK.md:2.1-2.6/2.8 勾选(2.6 实机验收 4 项、2.8 NSIS+MSI 产物大小);
- 遗留标注:getFilePaths stub(UploadZone 插件化)、2.7 视觉回归 GUI、tauri dev 全功能手动验收
- layer-4-ci-release/TASK.md:4.2/4.3/4.4 勾选(tauri build 切换、electron-forge/WiX 清理、
- 全新环境跑通、体积 ≤20MB);遗留:真实升级路径迁移验证、GitHub Actions 真实触发(需推 tag)
- PROGRESS.md:L2/L4 状态更新 + Windows 实机构建环境说明(rustup/MSVC/cargo 镜像/本地盘工作区)
-
- 遗留注意点 15-18
- tasks/README.md:L2/L4 看板完成
- golden-samples.md §8:README 发布说明已切换记录(原记录任务完成)
- 验证:cargo test -p srp-cfg-core 84 全绿;golden runner 117 断言全 PASS
chore(ci): L4 wrap-up - switch release-desktop to tauri build, remove electron-forge/WiX
5291f00
- release-desktop.yml:build-app 切 tauri build(NSIS+MSI);上传 SrP-CFG_Installer.msi +
- SrP-CFG_Setup_x64.exe(原 Portable.zip 移除);版本注入后跑 pnpm sync:version(package.json →
- tauri.conf.json + Cargo.toml)
- 清理:msi/(WiX + harvest.js)、forge.config.ts、vite.main/preload/renderer.config.ts、
- @electron-forge/* + electron + electron-winstaller + archiver + winreg 依赖、onlyBuiltDependencies
- 仅留 esbuild/sharp、根 package.json build:msi 移除
- 保留参考实现(不参与构建):src/main/services/*.ts(L0.6 golden runner 依赖)+
- src/preload/preload.ts(API 契约基准)
- package.json scripts:dev/build → tauri;vite.config.ts(Tauri 专用,root=src/renderer,outDir=dist)
- 根 README 发布说明更新(Tauri v2 / NSIS+MSI / Rust+MSVC 开发环境)
- .gitignore:+ src-tauri/gen/schemas(tauri 生成物)
- 验证:Windows 本地盘工作区全新 pnpm install + tauri build 通过(NSIS 2.5MB / MSI 3.6MB);
- cargo test -p srp-cfg-core 84 全绿;golden runner 117 断言全 PASS
feat(desktop): L2 wrap-up - Rust services shell + 49 tauri commands + NSIS/MSI packaging
2514ad2
- Windows 实机收尾(Track A):Electron 主进程 3645 行 TS → Tauri Rust 后端。
- core:结构加 serde derive(camelCase 输出对齐 renderer types);lib.rs 补导出
- parse_vdf/child/string_entries/decide_append_conflicts/CategoryInput 等;serde derive feature
- services/ 壳层(只做 I/O,决策全走 core):
- detection.rs:winreg 注册表 4 路径 + 默认路径扫描 + steam.exe 评分 → core 解析
- staging.rs:zip 解压(zip crate)+ 归类复制 + 时间戳目录/上限 + 上传/下载
- installer.rs:install/res/save 三清单容错读写 + overlay/append 部署 + 删除/恢复/清除 + 用户偏好保护
- updater.rs:GitHub Releases(ureq)+ 缓存 + 4h 节流 → core map_release/filter_newer
- vcfg.rs / user_config.rs / migrate.rs(旧 %APPDATA%/srp-cfg 一次性迁移,D2)
- commands/:49 个 #[tauri::command](window.* + installer:* + userConfig:* + vcfg:* + app:* + updater:* + shell:*),
- 签名对齐 api-contract.md / api.ts,命令名一一对应;log:new → emit/listen
- build.rs / icons(占位生成,可换正式)/ capabilities(core:default + opener:default)/
- tauri.conf.json:license 接入根 LICENSE、msi→wix 配置修正
- 2.6 实机验收:cargo test -- --ignored detect_all 本机实测通过
- (Steam=C:\Program Files (x86)\Steam、CS2 installed D:、3 账号、当前用户 RoL1n_SrP、VCFG 79/2/92/338)
- 2.8 打包:tauri build NSIS 2.5MB + MSI 3.6MB(≤20MB;原 Electron 100MB → 降幅 97%)
- 验证:cargo test -p srp-cfg-core 84 全绿(WSL + Windows target);cargo check/test desktop 通过;
- renderer vite build + tsc 通过;golden runner 117 断言仍全 PASS
docs(tasks): mark L0.6 golden samples complete in PROGRESS/README
5255d75
- PROGRESS.md:L0 状态改为全部完成;下一步任务 1 勾选(附复现命令与 Windows 遗留);
- 遗留注意点 14 新增 golden samples 位置/复现/gitignore 说明
- tasks/README.md:L0 看板行更新为完成(0.6 已落地,Rust 84 测试对照 100%)
docs(tasks): add L0.6 golden samples - fixtures + Node runner + dual-version comparison
3240c37
- Track B (WSL): 落地 0.6 黄金样本记录,供 L2(Tauri 重写)验收对照 ≥80%。
- fixtures/:伪 Steam 目录(libraryfolders.vdf / appmanifest_730.acf 多 StateFlags /
- loginusers.vdf 多账号 / userdata cfg 含 vcfg 族)+ 上传包(zip + 目录两形态,含
- annotations/video/vcfg/unsupported)+ 游戏 CFG 冲突场景(同名文件/目录 + 用户偏好层)
- scripts/golden-node.mjs + stubs/(electron/winreg)+ run-golden.sh:
- 在 WSL 直接跑 app/desktop/src/main/services/*.ts 导出纯函数(stub electron/winreg),
- 对同一 fixtures 输入落盘输出,117 条断言全 PASS(exit 0 可复现)
- golden-outputs/*.json:7 场景归一化输出(时间戳→0、沙箱路径→)
- golden-samples.md:5+2 业务路径(Steam 检测 / VCFG / staging / overlay+append /
- 冲突恢复 / updater / 用户配置层)× 输入→期望输出,与 Rust core 84 测试逐条对照,
- 结论:Node(生产参照)与 Rust 行为一致,无需修 core;注册表读取为 Windows 实机项(L2.6)
- TASK.md 0.6 勾选;.gitignore 排除 .sandbox/ 与 esbuild 产物 golden-node.cjs
- 验证:bash scripts/run-golden.sh → 117 passed, 0 failed;cargo test -p srp-cfg-core 84 全绿
docs(tasks): update PROGRESS/AGENT-START for L2 wrap-up phase
4060e62
- AGENT-START 重写:L2 收尾阶段提示词。Track A(Windows)= fs/winreg 壳层
- 接线(全部调 core 纯逻辑)+ commands 注册 + 2.6 实机验收 + 2.8 打包 + L4 后半
- (tauri build 切换/删 msi+electron-forge);Track B(WSL)= L0.6 黄金样本
- 记录(fixtures + Node/Rust 双版输出对照,产出 golden-samples.md)
- PROGRESS:core 纯逻辑全量完成(7 模块/84 测试)已入档;下一步任务重排——
-
- 黄金样本(WSL 可做)2. L2 收尾(Windows)3. L4 后半 4. L3 可选(已完成);
- 遗留注意点 + 版本同步脚本 / core 依赖约束
- README 看板:L0 改为「除 0.6 外完成」
docs(tasks): sync PROGRESS/README - core pure logic complete (84 tests), tsc clean
d775c82
- L2: staging/installer/updater/detection 纯逻辑全量进 core(31→84 测试),
- 剩余仅 Windows 实机项(fs/winreg 壳层、commands 注册、2.6 验收、2.8 打包)
- L4: 版本同步脚本(sync-tauri-version.mjs)已加
- 遗留 6 已解决:website tsc -b 零错误(19093f7)
- 记录 target/ 误提交清理(22a76f6)
chore(desktop): untrack src-tauri/target build artifacts (467 files / 136MB)
22a76f6
- cargo 构建产物被误提交(a5a41b9 时 git add 吞入),从索引移除并加 .gitignore;
- 不影响工作区磁盘文件,CI 已有 cargo 缓存(swatinem/rust-cache)。
fix(website): resolve vite.config.ts Plugin type identity - tsc -b fully clean
19093f7
- 根/子 vite(6.4.2/6.4.3,node-linker=hoisted)各带一份 rollup + @types/estree,
- 插件返回类型与 defineConfig 的 PluginOption 类型身份不一致(estree 两份副本)。
- plugins 数组加
as PluginOption[]对齐类型(运行时 esbuild 转译不受影响)。 - 效果:
tsc -b零错误(原 PROGRESS 遗留 6 的唯一错误消除);pnpm build:web 不变 - (18.6s,2786 页);不触碰依赖解析(不改 pnpm-workspace overrides)。
feat(desktop): L2.6 core pure logic - Steam/CS2 detection (loginusers/acf/libraryfolders)
bfd8a1e
- core detection.rs(纯解析,无 fs/注册表,壳层做 I/O):
- parse_library_paths: libraryfolders.vdf "path" 提取 + \ 归一化
- parse_acf_value / cs2_game_dir / cs2_manifest_state: appmanifest_730.acf
- StateFlags 判定(4=已装,4|2=needs-update,其余/缺失=继续下一个库)
- parse_login_users: loginusers.vdf 用户块解析(17+ 位 steamId64 + 块内字段),
- 当前用户选择顺序(AutoLogin/AllowAutoLogin/mostrecent → Timestamp 最大 → 唯一)
- steam_id64_to_account_id(BigInt 减法语义)
- 测试 73 → 84 全绿;clippy 0 警告
- Windows 实机部分(winreg 读 Steam 路径、fs 扫描、2.6 手动验收)不变
feat(desktop): L2.4/2.5 core pure logic - staging/installer/updater + version sync
3c0298f
- core crate (纯逻辑,可跨平台测试,tauri 壳层只做 I/O):
- staging.rs: 文件归类(annotations/cfg/video/vcfg 优先级与 TS classifyFile 一致)、
- staging 目标路径推导、时间戳目录命名与数量上限(复刻 TS while len>=max 语义)、
- Runtime 包识别(executable_line/exec_target/exec 链 BFS,含引号/注释/反斜杠归一化)
- installer.rs: 三清单容错规范化(serde_json)、overlay 部署规划(prev→save/冲突→res/
- staging→game)、append 并集合并(保持顺序)、单项/整类删除恢复清除、路径回填
- (video→userCfgPath 历史行为)
- updater.rs: GitHub release 映射(DESKTOP_UPDATE_MARKER/Runtime_Core.zip 资产判定)、
- filter_newer/排序/忽略版本/4h 缓存节流/历史版本下限
- Cargo.toml: + serde/serde_json(纯库);lib.rs 导出全部新 API
- 测试 31 → 73 全绿;clippy 0 警告(顺带清理 vcfg.rs 旧 map_or)
- scripts/sync-tauri-version.mjs (L4.2 版本统一): package.json 为唯一来源 → 同步
- tauri.conf.json + Cargo.toml[package];--check 模式供 CI(不一致 exit 1);根
- package.json 加 sync:version。已验证:drift 检测→同步→复检闭环
- Windows 专属部分(winreg 检测、commands 注册、tauri 编译/打包)仍需实机
docs(tasks): sync PROGRESS/README - mark L2.7, L3 optional, L4 first-half done
5e60fec
- PROGRESS: L2.7 组件替换完成(c436140,含 desktop @source 修复);L3 可选
- 遗留完成(70aa5c9/954f113,/commands/{name} + JSON-LD);L4 前半完成
- (bed306a,website GITHUB_TOKEN + desktop Rust toolchain/cache)
- README status board: Layer 2/Layer 4 -> 进行中(明细更新),Layer 3 -> 完成
- 遗留注意点新增 @source 不可删、build/client 随提交同步两条
build(website): sync build/client artifacts (command detail pages + FAQ/DefinedTerm JSON-LD)
954f113
- 2785 prerendered /commands/{name} pages (DefinedTerm JSON-LD each)
- commands page FAQPage JSON-LD; sitemap.xml now 2806 URLs
- regenerated hashed assets + server bundle
feat(website): L3.4 optional - /commands/:name detail pages + JSON-LD dataset
70aa5c9
- new route commands/command-detail.tsx: prerendered detail page for every
- CS2 console command (2785), showing name/type/category/flags/中文释义/
- English description/default value/value details (reuses ValueDetails);
- DefinedTerm JSON-LD per page (termCode + DefinedTermSet)
- react-router.config.ts: prerender all 2785 /commands/:name paths
- CommandCard: command name links to detail page; footer adds 详情 link
- (copy stays on CopyButton); ValueDetails exported for reuse
- commands.tsx: FAQPage JSON-LD (console enable/cheats/var-vs-cmd/default)
- Verify: pnpm build:web PASS (17s, 2786 pages under build/client/commands);
- tsc only pre-existing vite.config.ts error; wrangler dev --local serves
- /commands, detail and +-prefixed pages (200 after redirect); sitemap
- grows to 2806 URLs automatically
chore(ci): L4 first half - website build token + desktop Rust toolchain/cache
bed306a
- deploy-website.yml: build step passes GITHUB_TOKEN so the version-injection
- plugin (srp-cfg-latest-version) gets 5000 req/h instead of unauthenticated
- 60 req/h IP limit that caused 0.0.0 fallback (tasks/PROGRESS.md note 3)
- release-desktop.yml: add dtolnay/rust-toolchain (x86_64-pc-windows-msvc) +
- swatinem/rust-cache (registry + src-tauri/target) + cargo test -p srp-cfg-core
- step to build-app job; Electron packaging chain untouched (L4.2/4.3 later)
- Verify: both workflows parse with yaml pkg; cargo test -p srp-cfg-core = 31 pass
refactor(desktop): L2.7 replace Desktop pages with @srp-cfg/ui components
c436140
- ConfirmAppendModal -> shared Modal (drop local modal markup/Esc handling)
- PersonalizePage: 3 command-copy buttons -> CopyButton (default/teal/accent
- variants), editor target chip -> Badge; drop copiedCommand state
- AppliedConfigPage: plain stat cards + category panels -> Card
- BackupRestorePage: save/res panels + snapshot card -> Card
- DownloadPage/QuickStartPage/AboutPage: info boxes/sections -> Card
- UpdateModal release chips -> Badge size="md"
- shared Badge: + size prop (sm/md); CopyButton: + variant prop
- (default/accent/teal/red, copied state exclusive per-variant)
- fix desktop global.css @source ../../../../shared/ui/src so
- @tailwindcss/postcss scans the workspace shared lib (previously only
- classes coincidentally present in desktop source were generated)
- Verify: tsc -p tsconfig.renderer.json PASS; vite renderer build PASS
- (CSS 34.6->41.2kB with previously-missing shared classes); shared lib
- grep lint clean; website tsc unchanged (only known vite.config.ts error)
docs(tasks): rewrite AGENT-START for L2 continuation + sync PROGRESS
1f753f4
- AGENT-START.md:L3 收尾提示词 → L2 Desktop→Tauri 剩余部分续作,带环境分支
- (Windows 实机 = Track A 主线 2.4-2.8;WSL/Linux = Track B:L2.7 组件替换 + L4 前半
- website CI + L3 可选遗留),更新读文件顺序/保护清单/提交规范
- PROGRESS.md:提交数 20 -> 24(main..HEAD);L3 历史补 ccecc19/c91b676;
- 下一步任务重排(L2 Windows 实机第一,L4 第二,L3 可选第三);
- 遗留注意点补 wrangler assets 已统一勿改回
- 验证:仅 docs 改动,无代码变更
build(website): sync build/client artifacts after layout.tsx comment cleanup
c91b676
- 重建产物随 ccecc19 的 layout.tsx 注释清理更新(root chunk hash 变化)
- 仍为 21 个预渲染 HTML + sitemap.xml + robots.txt
docs(tasks): mark L3 wrap-up done in PROGRESS/README
ccecc19
- PROGRESS.md:L3 收尾 3 个提交(919302a/589fa79/62b4cc5)勾选完成;
- 部署链路统一、Velite root=content、tsc 遗留 1 个错误(vite.config Plugin)等
- 遗留注意点更新;提交数 17 -> 20
- tasks/README.md:Layer 3 状态看板 -> ✅ 完成(可选遗留:/commands/{name} 详情页)
- layout.tsx:去掉迁移骨架(WIP)陈旧注释
refactor(website): unify deploy chain - wrangler assets point to react-router SSG output
62b4cc5
- wrangler.json assets.directory: ./dist -> ./build/client(react-router 框架模式 SSG 输出;
- 旧 ./dist 为 Astro 产物,链路未统一是 L3.5 遗留)
- 选择改 wrangler 而非改输出目录:react-router 的 buildDirectory 由框架控制(默认 build/),
- 若改 dist 会把 build/server 的 server bundle 也暴露到静态托管下,不干净
- .gitignore 追加 app/website/.wrangler/(wrangler dev 本地状态目录)
- 验证:npx wrangler dev --local(4.118.0)起服后 curl:
- / /download/ /about/ /docs/ /docs/srpcfg-1/ /commands/ 均 200,首屏 HTML 含
- 指令文本(+cl_show_team_equipment)与下载内容;/api/chat POST 命中 worker 逻辑
- (无 Turnstile 时返回「AI 助手安全验证未配置」JSON 错误,无需真连 AI);
- hashed 静态资源 200
- worker.ts / src/lib/ai-stream.ts 零改动;bindings 拓扑不变
refactor(website): delete Astro structure, switch scripts to Vite+React Router
589fa79
- 删除(git rm):
- src/pages/ src/layouts/ src/components/*.astro(含 icons/BilibiliIcon.astro,grep 确认 React 侧零引用)
- src/content.config.ts astro.config.ts(tsc 的 2 个 astro.config 错误随之消失)
- app/website/package-lock.json(npm 产物,pnpm workspace 下早已陈旧且含 astro 依赖)
- package.json:移除 astro/@astrojs/mdx/@astrojs/sitemap/lucide-astro/@astrojs/check;
- scripts:dev=vite dev / build=velite --clean {{CHANGELOG}}{{CHANGELOG}} react-router build / preview=vite preview /
- deploy=pnpm build {{CHANGELOG}}{{CHANGELOG}} npx wrangler deploy(build:web/check 移除,根 build:web 走 website build)
- → 根 pnpm build:web 现在就是 velite + react-router SSG 链路
- tsconfig.json:不再 extends astro/tsconfigs/strict,改 vite 标准配置(保留 jsx/react-jsx、
- paths @/* 与 @shared/*、.velite include;新增 allowImportingTsExtensions 以兼容
- node --experimental-strip-types 测试文件的 .ts 后缀导入)
- Showcase.tsx:移除 astro ImageMetadata 导入与 toUrl() 收敛(Vite 原生 import PNG 即 URL)
- 验证:
- pnpm build:web:21 个 HTML 预渲染 + build/client/sitemap.xml + robots.txt
- npx tsc --noEmit:仅剩 1 个既存 vite.config.ts Plugin 类型错误(与基线逐字节一致)
- test:ai-stream:12/12 通过(worker.ts / ai-stream.ts 零改动)
- grep astro:src/ 仅注释提及,无 import
refactor(website): move Velite content out of src/content to content/
919302a
- git mv src/content -> content(16 篇文档 md 迁出 Astro 旧结构)
- velite.config.ts root: src/content -> content(pattern/slug 变换不变)
- 重新 pnpm build:web:21 个 HTML 预渲染(/ + /download + /about + /docs + 16 文档 + /commands),sitemap.xml 正常生成
- .velite/docs.json 产物与迁移前逐字节一致(内容未变)
docs(tasks): update PROGRESS handoff + rewrite AGENT-START for L3 wrap-up
ba2ad47
- PROGRESS.md:L3 页面迁移 + SEO 收尾标记完成(6 个新提交 3954011~f60786e),
- 新增环境坑(GitHub API 限流回落 0.0.0 / Velite 0.4 s.slug 坑 / commands.json 打包体积),
- 下一步任务改为:L3 收尾(删 Astro 结构 + 部署链路统一)→ L2 Windows 实机 → L4 CI/CD
- AGENT-START.md:重写为 L3 收尾执行提示词(Velite 数据源迁移 → 删 Astro 旧结构 →
- 部署链路统一 → 清理验证),含验收标准与拆 commit 规范
feat(website): add sitemap, robots.txt and JSON-LD structured data (L3.7 SEO)
f60786e
- vite.config.ts 新增 srp-cfg-sitemap 插件:构建期遍历 build/client 下所有
- index.html(SSG 预渲染产物)生成 sitemap.xml(21 个 URL,站点根 https://srprolin.top
- 与旧 astro.config.ts 一致),替换 @astrojs/sitemap
- public/robots.txt:允许全站 + Sitemap 声明(随 publicDir 复制到构建产物)
- home.tsx 增加 SoftwareApplication JSON-LD(软件名/分类/版本/下载链接/许可证,
- softwareVersion 使用构建期注入的 LATEST_VERSION)
- 验证:
- pnpm build:web 通过;sitemap.xml 含 21 个 URL(/ + /about + /commands + /docs + 16 篇文档 + /download)
- robots.txt 复制进 build/client;JSON-LD 渲染进首页 HTML
- 修复:home.tsx 补 LATEST_VERSION import(JSON-LD 引入的 SSR 运行时引用)
- tsc --noEmit 仍仅 3 个既有错误(无新增)
feat(website): migrate commands center to React SSG with SEO prerender
677e21c
- 按 TASK.md 3.4(D9:指令检索中心 SEO 化),将 commands.astro 完整迁移:
-
- SEO 预渲染(核心目标):
- commands.json(2785 条,gzip ~169KB)随路由模块打包(任务允许"随包下发"),
- 无需运行时 fetch,首屏即时渲染 + 搜索零等待
- SSG 构建期直接渲染前 50 张指令卡进 HTML:指令名/中文释义/分类/默认值/数值说明
- 对爬虫可见(验证:build/client/commands/index.html 含 50 卡 + "共筛选出 2785 条指令")
-
- 指令检索(commands-data.ts + CommandCard.tsx):
- 分类侧栏(9 类 + 图标)、搜索(中/英/拼音/数值/分类关键词,逻辑与旧实现一致)、
- 类型筛选(all/cmd/var)、排除作弊、无限滚动 + 加载更多
- 卡片复用共享组件:Card(hoverable 与旧样式一致)/ Badge(flag 徽章 red/teal/default)/
- CopyButton(复制反馈);数值说明 (约束/离散取值)保留
- 检索增强字段(n_lower/cn_lower/pinyin 等)模块级计算一次
-
- AI 面板(AiPanel.tsx):
- Turnstile 显式渲染(execution:execute / interaction-only / dark / zh-CN),
- 错误码映射与旧实现一致(110200/110100/200500/300/600...)
- /api/chat SSE:readAiEventStream(src/lib/ai-stream.ts 零改动),
- IncompleteAiStreamError 自动重试一次 / TruncatedAiResponseError 引导
- 双数据库(srpcfg/commands)独立历史 + 欢迎语/快捷提问;流式轻量 markdown
- (inline-code 点击复制 / bold / 列表);小屏 FAB + 抽屉面板
- 桌面 xl 常驻右侧栏(sticky),小屏 fixed 抽屉
- 验证:
- pnpm build:web 通过,22 个 HTML 预渲染(5 静态 + 16 文档 + commands)
- tsc --noEmit 仍仅 3 个既有错误(无新增)
- worker.ts / wrangler.json / ai-stream.ts / src/pages/ 零改动;共享组件 lint 干净
- 遗留:/commands/{name} 指令详情静态页(3.4 可选)、sitemap/robots(3.7)
feat(website): migrate docs center to React SSG with Velite content pipeline
f6eecb3
- 按 TASK.md 3.3(D8:Velite 内容管线替代 Astro Content Collections),
- 将文档中心完整迁移到 React Router 7 SSG:
-
- Velite 管线(新):
- velite.config.ts:docs collection(title/description 与旧 content.config.ts 对齐),
- slug 由 s.path() 从文件路径派生(0.4 的 s.slug() 仅校验不派生),
- content 由 s.markdown() 构建期渲染(GFM + rehype-slug 锚点),toc 由 s.toc() 提取
- 16 篇 md 原地由 Velite 管理(旧 Astro 结构保留);生成 .velite/docs.json(120KB)
- 数据导入直接指向 docs.json(绕过生成 index.js 的
with { type: 'json' }语法, - Vite 6 对其解析不稳定);docs-data.ts 统一分组/顺序逻辑(与旧 DocLayout/index 一致)
-
- 页面与组件(React 化):
- routes/docs.tsx:文档中心索引(hero/3 张 featured/四分组/DeepWiki CTA/底部双链)
- routes/docs-detail.tsx:/docs/:slug 详情(loader 取 Velite 数据 + 动态 meta,
- 前后篇导航用共享 Card;内容 dangerouslySetInnerHTML 渲染构建期 HTML)
- components/docs/DocsShell.tsx:三栏布局 + 移动端文档菜单/目录面板(Escape/断点收起/滚动锁)
- components/docs/DocsToc.tsx:目录 + IntersectionObserver 滚动高亮(对齐旧 script)
- components/docs/DocsNavigation.tsx:侧边导航(active 态)
- prose-doc 样式迁移至 global.css(旧 DocLayout <style> 转普通选择器)
-
- 构建链路:
- react-router.config.ts:prerender 含 /docs + 16 个 /docs/:slug(数据来自 .velite/docs.json)
- routes.ts 增加 /docs/:slug;tsconfig include .velite
- package.json:build:web = velite --clean {{CHANGELOG}}{{CHANGELOG}} react-router build;新增 velite + rehype-slug
- 验证:
- pnpm build:web 通过;21 个 HTML 预渲染(5 静态 + 16 文档详情)
- 详情页含标题/meta/锚点/TOC/侧边栏/前后篇/移动端按钮;索引页含全部卡片与分组
- tsc --noEmit 仍仅 3 个既有错误(astro.config.ts x2 / vite.config.ts x1,无新增)
- worker.ts / wrangler.json / ai-stream.ts / src/pages/ / astro.config.ts 零改动
- 遗留:sitemap.xml/robots.txt 属 3.7 SEO 收尾,待全站迁移后统一处理
feat(website): migrate about page to React SSG
f8a0fe1
- 按 TASK.md 3.2 将 src/pages/about.astro 迁移到 src/app/routes/about.tsx,替换占位页:
- SectionHeader.astro -> 共享 @srp-cfg/ui SectionHeader(level h1 / label About)
- 快速链接/技术栈/贡献者/开源许可卡 -> 共享 Card( 或 包装,group-hover 等价 hover)
- 原 ?raw 内联 SVG(blog/bilibili/github 品牌图标)-> Vite ?raw import + dangerouslySetInnerHTML
- meta 对齐原 MainLayout(title "关于 — SrP-CFG" / description)
- 内容与旧版静态等价(技术栈文案等原样保留,后续再做内容更新)
- 验证:
- npx react-router build 通过,5 页预渲染
- /about HTML 含全部区块(项目简介/快速链接/技术栈/贡献者/开源许可)、4 条外链、
- 3 个品牌 SVG 内联、avatar.jpg 与 favicon、Nav/Footer 布局
- 新页面消费 @srp-cfg/ui:SectionHeader x1 / Card x12
- tsc --noEmit 仍仅 3 个既有错误(无新增)
- worker.ts / wrangler.json / ai-stream.ts / src/pages/ 零改动
feat(website): migrate download page to React SSG + build-time version injection
fe186a9
-
- 下载页 /download(对应 download.astro)React 化,替换占位页:
- SectionHeader.astro -> 共享 @srp-cfg/ui SectionHeader(level h1 / label Download)
- Card.astro(href 链接形态) -> 包装共享 Card(group-hover 等价 hover 效果)
- 安装器徽章 -> 共享 Badge(accent 变体 + className 覆盖,Tailwind v4 排序已实证)
- 下载链接沿用 downloads.ts 镜像前缀逻辑(gh.269601.xyz + GitHub latest/download)
- meta 对齐原 MainLayout(title/description);使用说明信息框用共享 Card
-
- data/version.ts 顶层 await 适配(L3.2 遗留 TODO,首页 Hero/TerminalDemo 一并解决):
- fetchLatestVersion() 保留为纯函数(可被 vite.config 显式调用)
- LATEST_VERSION 改为构建期注入常量 SRP_CFG_LATEST_VERSION(typeof 守卫,
- vite.config 打包时无 define 不报 ReferenceError;未注入回落 "0.0.0",与旧行为一致)
- vite.config.ts 新增 srp-cfg-latest-version 插件:config hook 构建开始时 fetch
- 最新版本经 define 注入(已验证:GitHub v3.1.9 注入 SSG HTML;瞬时失败回落 0.0.0)
-
- 边界说明:featured 卡需 border-accent/20,但 Tailwind 排序 border-accent/* 恒在
- border-border 之前无法经 Card className 覆盖,故 featured 卡用原生 div 精确还原。
- 验证:
- npx react-router build 通过,5 页预渲染;下载页含全部文件/镜像链接/使用说明
- 首页 hero + terminal 显示真实版本 v3.1.9(由插件注入)
- tsc --noEmit 仍仅 3 个既有错误(astro.config.ts x2 / vite.config.ts x1,无新增)
- 新页面消费 @srp-cfg/ui:SectionHeader / Card x4 / Badge x2
- worker.ts / wrangler.json / ai-stream.ts / src/pages/ / astro.config.ts 零改动
feat(website): migrate home page to React SSG
3954011
- 按 TASK.md 3.2 将 Astro 首页完整迁移到 React Router 7 框架模式(SSG),
- 复用 @srp-cfg/ui 共享组件,替换 src/app/routes/home.tsx 占位页。
- 迁移组件清单(Astro → React,src/app/components/):
- Hero.astro -> Hero.tsx(含 stats 条;LATEST_VERSION 暂静态 "3")
- Features.astro -> Features.tsx(SectionHeader + Card 面板)
- Showcase.astro -> Showcase.tsx(7 张 desktop-*.png 截图卡,Card 容器)
- Steps.astro -> Steps.tsx(SectionHeader)
- CTA.astro -> CTA.tsx(ButtonLink)
- TerminalDemo.astro -> TerminalDemo.tsx(Badge owner 徽章)
- ButtonLink.astro -> ButtonLink.tsx(共享 Button tokens + react-router Link)
- SectionHeader.astro -> 共享 @srp-cfg/ui SectionHeader
- Card.astro -> 共享 @srp-cfg/ui Card
- 转换规则落地:
- lucide-astro -> lucide-react(website 声明依赖,lockfile 同步)
- class: 列表 -> clsx/模板字符串;data-astro-prefetch 删除;内链 ->
- tech-grid / hero-reveal / home-section 动画类名保留(global.css 定义)
- astro:assets Image -> import PNG +
(vite-env.d.ts 提供 vite/client 类型;
- astro/client 的 ImageMetadata 类型经 toUrl() 收敛为 URL 字符串,L3.7 可去掉)
- home.tsx 增加 meta 导出(title/description 对齐原 MainLayout)
- 验证:
- npx react-router build 通过,5 页预渲染
- build/client/index.html 含标题/Hero 文案/7 张演示图/Features/Steps/CTA/Nav/Footer
- tsc --noEmit:仅剩 3 个既有错误(astro.config.ts x2 / vite.config.ts x1,本次未引入)
- 新组件消费 @srp-cfg/ui 导出:SectionHeader x3 / Card x9 / Badge x3 / Button(类型)
- worker.ts / wrangler.json / ai-stream.ts / src/pages/ 零改动
- 遗留 TODO(L3.2 下载页):
- data/version.ts 顶层 await 需改 SSG loader/构建期注入,首页暂以静态 "3" 渲染
docs(tasks): add AGENT-START.md bootstrap prompt for next agent
325a213
docs(tasks): add PROGRESS.md handoff summary for next agent
4618b6e
feat(website): app layout (Nav/Footer) in React Router SSG
c21c7fb
- src/app/layout.tsx: Nav + Outlet + Footer (mirrors MainLayout.astro)
- src/app/components/Nav.tsx: NavLink active states, mobile menu (React state)
- src/app/components/Footer.tsx: internal Link + external anchors
- root.tsx: aligned with BaseLayout.astro (meta, Chakra Petch font, skip-link)
- routes.ts: wrap 5 pages in layout()
- Verified: build passes, prerendered HTML contains Nav/Footer/skip-link
refactor(desktop): UpdateModal now uses shared Modal (L2.7)
92310ca
- Modal.tsx gains scrollable + maxHeight props (long-content dialogs)
- UpdateModal: replaces inline dialog shell with @srp-cfg/ui Modal
- (Esc handling, backdrop, header close now from shared component)
- Verified: tsc renderer + vite build pass
feat(desktop): data migration planner in core crate + tauri.conf.json
a08ac67
- core/migrate.rs: plan_migration/should_migrate (legacy %APPDATA%/srp-cfg -> app_data_dir)
- with 4 tests (target-wins on conflict, skip when present, empty case)
- src-tauri/tauri.conf.json: window sizing aligned with Electron (1707x960, min 896x504,
- decorations:false, #0b0d14), NSIS+MSI targets, zh-CN MSI
- cargo test: 31 passed
docs(tasks): update progress board (L1 done, L2/L3 in progress)
1b6f5ca
feat(website): make Vite + React Router 7 SSG skeleton buildable
d1194df
- Fix config for RR v7.18 API: default-export Config object, appDirectory in react-router.config.ts, reactRouter() plugin from @react-router/dev/vite
- Add deps: react 19, react-router 7.18, @react-router/dev, @react-router/node, @tailwindcss/vite, @vitejs/plugin-react, @srp-cfg/ui (workspace)
- Verified: react-router build passes; 5 routes prerendered to static HTML
- NOTE: output goes to build/ (wrangler assets currently expect ./dist — reconcile in L3.5)
feat(desktop): Tauri IPC adapter layer with ElectronAPI-compatible window.api
a40c1fa
- src/renderer/lib/api.ts: createApi() implements ElectronAPI (40+ methods)
- All signatures preserved per api-contract.md → renderer call sites untouched
- invoke() calls map 1:1 to future Rust commands (installer:, vcfg:, etc.)
- log:new / append-conflicts events via tauri listen()
- getFilePaths stubbed (TODO: dialog plugin for UploadZone)
- main.tsx injects window.api at startup (Tauri has no preload)
- Verified: tsc renderer typecheck passes
feat(website): scaffold Vite + React Router 7 SSG skeleton
a65659b
- Parallel migration scaffold alongside existing Astro structure (WIP):
- vite.config.ts: @vitejs/plugin-react + @tailwindcss/vite + reactRouter() (appDirectory: src/app)
- react-router.config.ts: ssr: true, prerender [/ /download /about /docs /commands]
- src/app/root.tsx: framework-mode root route (html shell + Outlet, global.css in head)
- src/app/routes.ts: 5 routes -> routes/ placeholders
- src/app/routes/*.tsx: home/download/about/docs/commands placeholders (home uses @srp-cfg/ui PageHeader)
- No existing files modified; Astro structure (astro.config.ts, src/pages, worker.ts, etc.) untouched.
feat(desktop): scaffold Tauri workspace + port pure logic to srp-cfg-core
a5a41b9
- src-tauri/: cargo workspace (core + tauri shell stub), Windows-target shell
- core crate: zero-dep pure logic, no tauri/fs/platform coupling
- vcfg: VDF tokenizer/parser, CFG convar parsing, snapshot->cfg (D3)
- conflicts: append-install conflict decision (threshold >3 reject)
- version: compare_versions (faithful to TS '|| 0' / single-v semantics)
- 27 unit tests passing (vcfg 15, version 5, conflicts 7)
- Tests calibrated against Electron behavior (e.g. 3.1.6-beta < 3.1.6)
feat(shared-ui): extract 9 base components, wire desktop to consume them
57f0f21
- Add Card/PageHeader/SectionHeader/LabeledValue/Badge/Modal/CopyButton/Skeleton/EmptyState
- Inline SVG icons only (no lucide dep), token-based styling (dual-theme safe)
- Desktop: 6 pages use shared PageHeader, DetectionCard uses LabeledValue
- Remove local PageHeader.tsx and PathRow.tsx
- Verified: tsc renderer typecheck + vite build (1665 modules) pass
- Docs: shared ui README (conventions/tokens/validation) + tsconfig
docs(tasks): add layered refactor plan (L0 baseline + contracts + inventory)
9b5342e
- Branch refactor/tauri-vite-react: Electron->Tauri, Astro->Vite+React SSG
- 5-layer task breakdown with folder structure (tasks/layer-*)
- L0: website baseline build verified (21 pages), desktop deferred to L2
- Contracts: desktop API (40+ methods), website /api/chat + commands.json
- Component inventory: A/B/C triage for shared UI extraction
chore(auto): update CS2 console commands database
9ced37e
chore(auto): update curated Config knowledge from source changes
1372a38