Skip to content

SrP-CFG_v3.1.10

Choose a tag to compare

@github-actions github-actions released this 04 Aug 13:25
· 32 commits to main since this release
a5057c9

📋 版本更新说明

项目仓库地址: 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:
    1. 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
    1. 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:
    1. 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
    1. 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:
    1. 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
    1. 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)'
    1. 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)
    1. README: added 技术栈 section + precise 项目结构 annotations
  • (Vite + React Router 7 SSG / Tauri v2 + React 19 + Rust core)
    1. 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):
    1. 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
    1. 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

    1. 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.
    1. 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.
    1. 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 测试)已入档;下一步任务重排——
    1. 黄金样本(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 完整迁移:
    1. SEO 预渲染(核心目标):
  • commands.json(2785 条,gzip ~169KB)随路由模块打包(任务允许"随包下发"),
  • 无需运行时 fetch,首屏即时渲染 + 搜索零等待
  • SSG 构建期直接渲染前 50 张指令卡进 HTML:指令名/中文释义/分类/默认值/数值说明
  • 对爬虫可见(验证:build/client/commands/index.html 含 50 卡 + "共筛选出 2785 条指令")
    1. 指令检索(commands-data.ts + CommandCard.tsx):
  • 分类侧栏(9 类 + 图标)、搜索(中/英/拼音/数值/分类关键词,逻辑与旧实现一致)、
  • 类型筛选(all/cmd/var)、排除作弊、无限滚动 + 加载更多
  • 卡片复用共享组件:Card(hoverable 与旧样式一致)/ Badge(flag 徽章 red/teal/default)/
  • CopyButton(复制反馈);数值说明
    (约束/离散取值)保留
  • 检索增强字段(n_lower/cn_lower/pinyin 等)模块级计算一次
    1. 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:
    1. 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 一致)
    1. 页面与组件(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> 转普通选择器)
    1. 构建链路:
  • 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

    1. 下载页 /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
    1. 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)
    1. 边界说明: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