Commit Graph
28 Commits
Author SHA1 Message Date
nyaKazuha 68c6c91b1e fix(glossary): 绑定 QA identity 与人工 override
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
2026-09-09 00:25:49 +08:00
nyaKazuha 0275a890bc fix(glossary): 补齐术语删除和审核门禁
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
2026-09-08 20:59:27 +08:00
nyaKazuha 94483ff14d feat(glossary): 实现 Rust Glossary V1 2026-09-07 22:38:53 +08:00
nyaKazuha 8fc93b8f39 docs: document Translation Memory and config contracts
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
2026-09-06 22:52:10 +08:00
nyaKazuha bd1e1a06f2 feat(resource): 增加历史 release 与 CAS 复用
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
Closes #47
2026-09-02 01:26:53 +08:00
nyaKazuha 4ed81f0030 feat(bat-api): 实现内嵌 dashboard
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
Closes #46
2026-08-31 23:17:23 +08:00
nyaKazuha ab21344773 feat(i18n): 完成 localized patch 发布回滚闭环
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
Closes #45
2026-08-31 00:02:55 +08:00
nyaKazuha f441f1810e feat(i18n): 接入翻译 provider worker
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
Closes #44
2026-08-30 21:13:31 +08:00
nyaKazuha 72c1a879a3 feat(bat): 补全工作流命令与人工校对状态
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
Refs #43
2026-08-19 21:33:33 +08:00
nyaKazuha 550ee7fd9a feat(bat): 补全翻译工作台编辑命令
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
Refs #43
2026-08-12 09:33:14 +08:00
nyaKazuha 974a6e18c3 feat(bat): 暴露翻译任务状态控制
Refs #43
2026-08-12 09:11:09 +08:00
nyaKazuha 1933d6acb0 feat(bat): 补全工作流校验与调度过滤
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
新增 parse clear-cache 和 i18n validate,补齐 schedule 的作用域过滤与单轮执行上限,并将列表过滤参数暴露给 bat-api dashboard。同步 RPC、OpenAPI、用户文档和回归测试。

Refs #43
2026-08-03 23:47:59 +08:00
nyaKazuha 0784d5b532 feat(bat): 完善工作流调度与 dashboard RPC
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
补全资源拉取、解析、翻译、重打包和本地化发布命令,支持单次、限定次数与周期调度。移除 TUI 计划并通过 schedule.* RPC 暴露给 bat-api dashboard。

Closes #43
2026-08-03 22:18:52 +08:00
nyaKazuha 3b103be8a9 docs: 对齐全部文档状态
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
2026-08-03 12:19:06 +08:00
nyaKazuha 6af7706190 fix(api): 补齐 bat-api 控制与后端 RPC 2026-07-31 17:01:03 +08:00
nyaKazuha 03021ad649 docs(project): 同步维护冻结与运行文档
bat-rust / Build and test Rust (push) Canceled after 0s
补齐解析模块维护冻结规则,并同步 CURRENT_STATUS、CURRENT_GAPS、PROJECT_PLAN、RPC 参考、部署指南、用户指南和官方资源运行说明。

文档同时反映 bat-api 资源 bootstrap/分发边界、官方同步解析缓存、TextUnit 队列、双目录发布和 patch 入口的当前状态。

验证:未运行新命令;本轮已按要求停止重复构建/测试。
2026-07-31 00:45:46 +08:00
nyaKazuha 102b49b666 feat(rpc): 完成 issue #1 Go 调用边界
bat-rust / Build and test Rust (push) Failing after 3m17s
2026-07-24 17:58:34 +08:00
nyaKazuha ecda08ed97 feat(rpc): 补齐 issue #1 资源后端接口 2026-07-24 15:55:37 +08:00
nyaKazuha a729615a48 fix(sync): 移除多线程下载并补齐staging复用回归 2026-07-24 10:34:58 +08:00
nyaKazuha d76f6f1c88 ci(rust): 添加 Gitea host runner 工作流
补充自托管 Gitea host-runner workflow,并将项目状态、缺口、开发指南与路线图同步到当前实际情况。
2026-07-21 10:39:11 +08:00
nyaKazuhaandClaude Fable 5 0ab3f3b953 feat(download): 多线程下载 + 重试指数退避(issue #17)
下载主循环由串行改为「并发下载 + 串行簿记」三段式:
- Phase A:无网络前置校验(官方性/目标路径/建目录)+ 判定跳过/需下载,
  非官方 URL 在任何下载前 fail-fast
- Phase B:need-download 项经 scoped 线程池并发下载(默认并发 4,
  可配 1..=256)。worker 只做只读 &self 的 pull_one(各 URL 独立
  .part/目标文件),经 mpsc 把结果送回主线程;manifest/quarantine
  簿记与进度回调全在主线程串行执行,无需加锁。首个失败或 should_cancel
  置 cancel 标志,其余 worker 在任务边界停止
- Phase C:按 plan 顺序串行收尾——seed .hash 校验(顺序相关、可
  fail-fast)+ 构建有序结果

fail-fast 与「不发布不完整资源」不变量保留;进度事件按 URL 配对但
顺序不再单调(并发下天然如此)。

curl 重试加指数退避(网络类 200ms→400ms→800ms…上限 5s;ETXTBSY 仍走
极短退避),并发下对官方 CDN 更礼貌;退避基值 cfg(test) 下为 0 不拖慢
单测。

并发度经 OfficialUpdateConfig.download_concurrency 贯通,CLI
--download-concurrency 与 BAT_DOWNLOAD_CONCURRENCY 可配,.env 模板
与 USERGUIDE/CURRENT_STATUS/CHANGELOG 同步。

验证:新增并发正确性测试(并发 8:每 URL 恰一次 started+finished、
全部落盘)、并发度钳制、退避时长计算、CLI/env 解析单测;progress
排序测试改为顺序无关不变量;workspace 全测试(20 套件) + fmt +
clippy --all-targets -D warnings 全绿。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 03:25:04 -07:00
nyaKazuhaandClaude Fable 5 3edbe7ccee feat(daemon): 任务历史文件态持久化与 .env 无参启动(issue #1)
任务持久化:
- 任务历史落 <state-dir>/bat-tasks.json(版本化、0600 原子写、不跟随
  symlink),生命周期转换时 write-through;seq 持久化避免 pid 复用撞 ID
- daemon 重启恢复历史,中断时仍 queued/running 的任务标记 failed,
  新增错误码 TASK_INTERRUPTED(BAT-ERR-700005)
- 损坏文件改名 .corrupt 留证后从空历史开始;无法识别的记录计数跳过
- core 新增 ErrorCode::ALL 公开码表与 from_id 反查(持久化错误码往返)

.env 配置:
- 首次启动在二进制所在目录释放 .env 模板(0600、create_new 防竞态),
  之后每次启动加载为进程环境变量(不覆盖已存在变量)
- 优先级:CLI > 进程环境变量 > .env > 内置默认;BAT_* 键映射到
  CliOptions 默认值,BAT_WATCH/BAT_DAEMON 仅对无子命令 Run 生效且
  CLI 显式模式/dry-run 时让位;Redis 键预留(未接入)
- 工具/代理"非默认"判断改按 env 应用后基线,status/stop/logs 在
  .env 存在时不误判;BAT_SKIP_ENV_FILE=1 整体禁用

验证:新增 10 个单测(env 解析/优先级/守卫回归/持久化往返/中断标记/
损坏恢复/未知类型跳过);真机 e2e:.env 释放加载、daemon 纯 .env 启动、
catalog.refresh 任务带类型化错误码落盘并跨 daemon 重启恢复(含日志);
fmt / clippy --workspace --all-targets -D warnings / test --workspace 全绿

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 21:15:47 -07:00
nyaKazuhaandClaude Fable 5 11b19683cf feat(daemon): 实现 catalog.* 命名空间与 resource.manifest(issue #1)
补齐 issue #1 方法分层中可立即实现的剩余命名空间:

- catalog.status:当前已发布版本的 catalog 概览(读取其 snapshot:
  app/bundle 版本、connection group、addressables 根、端点与 marker
  计数、launcher 元数据、GameMainConfig 摘要)。
- catalog.versions:版本历史(current / in_progress / previous /
  failed,来自 official-version-state.json)。
- catalog.diff:当前 snapshot 相对上一个可用版本的差异(复用
  YostarJpSyncSnapshot::diff 与 diff_extended_snapshot;含
  changed_endpoint_urls 与 previous_snapshot_missing 标志;无上一版本
  时按首次观察处理 is_initial=true)。
- catalog.refresh:经任务执行器的 catalog 更新检查任务(dry-run +
  plan,不下载不审计;支持 force),返回 task_id 可轮询。
- resource.manifest:当前版本下载 manifest 的分页只读查询(offset
  默认 0、limit 默认 100/上限 1000,BTreeMap 按 URL 有序保证分页稳定;
  非法 limit → 700002)。infrastructure 公开
  OfficialDownloadManifest(Entry) 与 read_download_manifest_at。

约定:只读查询在尚无已发布版本或文件缺失时返回 ok=true 且
data.available=false(正常状态而非错误,便于 Go 层直接分支)。
is_pending_rpc_method 缩减为 task.create / resource.repair /
patch.* / unityfs.*(后两者待引擎;repair 待引擎独立修复模式)。
新增 read_daemon_resource_state 供 resource/catalog 只读查询共用。

测试:新增 10 个 dispatch 单测(含 fixture:状态文件 + 版本状态 +
snapshot + manifest)与 read_download_manifest_at 单测;调整 pending
断言。真实 daemon 端到端验证(fixture 资源根 + 死代理快速失败):
raw socket 依次断言 catalog.status/versions/diff、resource.manifest
分页与参数错误、catalog.refresh 入队与 task.status 轮询、
resource.repair→700003、未知方法→700001,全部通过,daemon.stop 干净
退出。全量 fmt / clippy --workspace --all-targets -D warnings /
test --workspace 全绿。

已知后续(另行推进):任务配置校验失败(如缺少 app-version)尚未接入
输入域错误码(应为 100001,现落 900001)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 10:10:03 -07:00
nyaKazuhaandClaude Fable 5 e9b7ce219f fix(official-sync): 修正对抗性审查发现的 launcher 链错误码误归类
d2466d6 做三视角对抗性核查(错误码语义/消费者破坏面/测试与文档),
确认 8 项(去重后 5 类)误归类,全部集中在 official_game_main_config
的 From<String> 兜底面。逐项修正:

- launcher_package_url 改返回 DownloadError:非官方 CDN 根(来自远端
  API 响应,安全边界拒绝)→ NON_OFFICIAL_URL;非法包路径(来自远端
  manifest 内容)→ LAUNCHER_RESPONSE_INVALID。此前提交说明称其为
  "硬编码常量上的内部不变量"不成立——三个生产调用点传入的都是远端
  API 下发的 cdn_root。
- select_game_main_config_source / find_resources_assets:目录 source
  缺 resources.assets 条目、无可用游戏包路径、包内容缺必需文件均为
  远端可触发的内容缺陷 → LAUNCHER_RESPONSE_INVALID(此前落 INTERNAL,
  且官方 manifest 布局已演进过一次,是现实的主要失败面)。
- extract_archive 解压失败 → ZIP_STRUCTURE_INVALID:结构校验不覆盖
  压缩数据流,数据区损坏(bad CRC)在 unzip 阶段首次暴露,主导成因
  是损坏/截断下载,归完整性域;本地原因保留在 stderr 消息中。
- verify_manifest_file_size 三种失败分码:size 字段无效 →
  LAUNCHER_RESPONSE_INVALID、本地读文件失败 → INTERNAL、真正不符 →
  SIZE_MISMATCH(此前三者统归 SIZE_MISMATCH)。
- 空 --launcher-version(用户 CLI 输入)→ INVALID_ARGUMENT,在发起
  任何请求前拒绝(此前落 INTERNAL)。
- 统一 launcher 链内容口径:API 响应、远端 manifest、包内容的解析/
  缺失问题全部归 LAUNCHER_RESPONSE_INVALID(600004),
  MANIFEST_PARSE_FAILED(600001) 保留给资源侧 manifest/catalog;
  fetch_remote_manifest 两处 600001 改 600004,error_code.rs 注释与
  USERGUIDE 描述同步。
- download_file_with_fallback:备用 URL 构造失败不再经 `?` 丢弃主地址
  失败上下文,错误码与"两次都失败以最终一次为准"策略一致。

新增 7 个错误码断言测试(launcher_package_url 两类拒绝、空版本、
manifest 无条目、fallback 终码保留、fallback 构造失败保留主上下文、
select/verify/extract 各失败面)。全量 fmt / clippy --workspace
--all-targets -D warnings / test --workspace 全绿。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 09:42:17 -07:00
nyaKazuhaandClaude Fable 5 d2466d60db feat(official-sync): 错误码模型铺开到 launcher/metadata 拉取路径
此前统一错误码只覆盖资源下载路径,launcher/metadata 链
(fetch_game_config → manifest URL → remote manifest → resources.assets
→ GameMainConfig)整条返回 Result<_, String>,经 anyhow::Error::msg
抹成无类型消息,RPC/任务层只能标为 internal。

本次将该链整体改为 Result<_, DownloadError>:

- core 新增两个错误码:LAUNCHER_API_REJECTED(300031,官方启动器 API
  返回非 200 业务码)与 LAUNCHER_RESPONSE_INVALID(600004,响应无法
  解析或缺少必需字段),并纳入唯一性测试;
- official_launcher:curl 失败保留准确网络域码(403/404/DNS/超时/TLS/
  代理等,final_error_code()),API 非 200 → LAUNCHER_API_REJECTED,
  响应解析/缺字段 → LAUNCHER_RESPONSE_INVALID,非官方 manifest URL →
  NON_OFFICIAL_URL,manifest 无文件条目 → MANIFEST_PARSE_FAILED,
  空版本/路径入参 → INVALID_ARGUMENT;
- official_game_main_config:下载失败带网络域码(主/备 CDN 均失败时
  以最终一次为准),ZIP 结构 → ZIP_STRUCTURE_INVALID,manifest 大小
  不符 → SIZE_MISMATCH,GameMainConfig 解密/解析 →
  GAME_MAIN_CONFIG_FAILED,manifest 缺 source →
  LAUNCHER_RESPONSE_INVALID;
- official_update 两处调用改 anyhow::Error::msg → anyhow::Error::new,
  保留类型,task worker 现有 downcast 直接接住 launcher 路径错误码;
- USERGUIDE 错误码表补录 300031 与 600004。

内部工具函数(launcher_package_url / launcher_api_url /
launcher_authorization_header)仍返回 String,经 From<String> 归
INTERNAL——这些是硬编码常量上的内部不变量校验,非运行时主要失败面。

验证:新增 4 个单测断言映射(API 403 业务码 → 300031、非法 JSON →
600004、HTTP 404 → 300002、非官方 URL → 300030);全量
fmt / clippy --workspace --all-targets -D warnings / test --workspace
全绿(含 examples 编译)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:29:16 -07:00
nyaKazuhaandClaude Fable 5 9a5fef23af feat(daemon): 补全 task.cancel 与 task.logs
完成 task.* 命名空间:

- task.cancel:每个任务带共享的取消标志(Arc<AtomicBool>),worker 的 should_cancel
  同时检查它和 daemon 停止标志;请求取消后置标志,worker 在下一个同步检查点中止,
  任务转为 cancelled(协作式,不硬杀正在执行的 curl)。已结束任务返回 already-finished,
  不存在返回 700004。
- task.logs:worker 把每条 progress 追加到任务的有界日志(上限 200 行),task.logs
  返回该历史;不存在返回 700004。TaskRecord 的 cancel/log 字段 serde(skip),不进
  task.status 输出。
- 新增 cancelled 任务状态;prune 与已结束判定纳入 cancelled。
- USERGUIDE RPC 方法表更新(cancel/logs 标为已实现)。

验证:新增取消/日志注册表单测(63 bin 测试全过);真机端到端确认触发 resource.sync
后 task.cancel 使任务转为 cancelled、task.logs 返回进度历史。

对应 issue #1(task.* 命名空间补全)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 06:00:26 -07:00
nyaKazuhaandClaude Fable 5 d7257db447 docs(userguide): 增加 Daemon RPC 接口章节
记录 bat.sock JSON-RPC 2.0 控制面:统一 envelope(ok/status/data/error/request_id)、
方法命名空间与实现状态(daemon.*/resource.*/task.* 已实现,catalog/patch/unityfs
及 task.cancel/logs 返回 700003)、异步任务模型(resource.sync/verify 返回 task_id、
task.status/list 轮询)和调用示例。

对应 issue #1(协议文档)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 05:31:57 -07:00
nyaKazuhaandClaude Fable 5 1a25ea58dd feat(core): 引入统一错误码模型并新增 USERGUIDE
为 issue #1 的公共错误契约建立错误码模型:

- core/src/error_code.rs:ErrorCode(BAT-ERR-<域3位><序号3位>,如 BAT-ERR-300012)
  + 44 个初始码表(覆盖输入/路径安全/网络下载/校验/发布存储/解析/任务RPC/内部
  八域,网络域含代理故障 310001)、ErrorDomain、以及进入 RPC envelope / --json /
  bat-events.jsonl 的统一 ApiError { code, kind, domain, location, message, retryable }。
  location 用稳定的组件·操作标签(不随行号漂移)。
- 新增 USERGUIDE.md:bat 命令、选项(发现/同步/守护/输出)、退出码(含 75=locked)、
  运行时默认值,以及从码表同步的错误码参考(含承载结构与域一览)。

命名遵循国际惯例(英文 kind/domain slug)。码表以 error_code.rs 为准,USERGUIDE
错误码表与之逐条一致。后续各链路报错接入该码表在 issue #1 下推进。

对应 issue #1(错误码模型 + 用户指南)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 03:57:17 -07:00