BlueArchive Toolkit
BlueArchiveToolkit 是一个面向长期维护的 Blue Archive 资源管理、解析、翻译和补丁工具套件。
当前仓库仍不是完整产品,但 Rust 侧已经具备一条可运行的官方日服资源同步链路:可以在 Linux 上通过官方 HTTP metadata 自动发现资源入口,拉取 Windows + Android 官方资源,保存同步 snapshot,校验本地下载清单,并用近乎全自动的 --watch / --daemon 常驻更新。Go module 名为 bat-api:正式 Go 入口是资源 bootstrap + 分发服务 cmd/bat-api(与 Rust bat 同环境运行,经 bat.sock RPC 周期发现 release 和 resource_root,提供 /v1/bootstrap、server-info 改写、CDN path 只读分发和内嵌管理 dashboard);internal/backendrpc 为 RPC client;cmd/bat 仅为试验骨架(产物 bin/bat-go,不是产品 CLI)。边界与进度见 docs/reports/GO_STATUS.md。完整游戏业务 API、完整 Web 协作后台和复杂 AssetBundle 重打包仍在后续阶段。
当前可用
- Rust workspace 和 monorepo 结构。
bat-core领域对象和仓储接口骨架。bat-adaptersUnity、Manifest、Client 集成框架,以及当前真实形态 Addressables catalog 解析覆盖,含m_Crc提取和 UnityFS 解包/TextAsset 提取基础校验。bat-cas-engineCAS V1:原子写入、BLAKE3 校验、引用计数、GC、并发写入测试、损坏检测。bat-infrastructureCAS 适配层、SQLite Resource Repository、资源导入服务、官方资源 pull/update 服务。bat:官方资源自动发现、全量拉取、原子发布到current -> versions/<id>、本地 manifest audit/repair、.part断点续传、403/404/5xx 分类重试、指数退避、默认并发 8(可配置1..=256,report 按 plan 顺序、进度按完成数单调上报)、已发布历史 release 与 CAS 复用、下载 quarantine 诊断、ZIP 结构校验、官方 seed.hash校验、snapshot/cache、版本化official-launcher-bootstrap.json、--watch常驻更新、--daemon后台运行,以及 Unix socket JSON-RPC live control/backend 方法(daemon.*、resource.*、parse.*、translation.tasks/handoff/task.update/worker.run、translation.memory.*、translation.glossary.*、localized.status、catalog.*、task.*、patch.apply、unityfs.patch_*)。internal/backendrpc:Go 侧 typed Unix socket JSON-RPC client,是bat-api调用 Rust daemon 的默认路径。cmd/bat-api:资源 bootstrap + 分发 HTTP MVP(G-009);/v1/bootstrap和/v1/launcher/bootstrap组织bat已发布 release 的启动前资源入口,launcher 形状兼容端点仅输出资源 metadata / GameMainConfig 引导,/healthz暴露 RPC refresh 诊断,/readyz做 release readiness,CDN path 支持GET/HEAD/Range、ETag、Last-Modified 和缓存头;玩家-facing 控制面已具备 token 鉴权、限流、访问日志、反代 IP 适配、动态 JSON no-store、OpenAPI、管理控制白名单、task/log/parse/translation/TM admin 查询控制入口和无构建内嵌 dashboard;.env配置端口/RPC socket/刷新周期;生产资源根和长期状态来自 RPC,不负责自动拉取。- Go 边界权威说明:
docs/reports/GO_STATUS.md(同步 CLI = Rustbat)。 - 官方同步会维护
<output>/official-version-state.json,明确记录当前已完成版本、正在拉取版本、上一个可用版本和失败版本。 - 资源导入链路可配置为在官方 release 发布后写入 CAS +
ResourceRepository,资源 metadata 会记录 release、平台、bundle path、parse status、TextAsset 名称和 TextUnit 数量/格式,TextAsset/Table/Media 会按类型分类索引;resource.indexRPC/CLI 可按类型、hash、路径模式、官方 release ID、平台、destination、bundle path、archive entry、parse status 和 TextUnit format 分页查询索引,常用 metadata 过滤会下推到 SQLite;历史 release 复用会重新校验 size、BLAKE3 和 ZIP 结构,失败时按历史 release、CAS、网络顺序回退,CAS 引用记录在official-cas-reuse-references.json中;bat doctor cas可只读诊断既有 CAS 目录、对象数、对象字节数和元数据库文件状态。 - 新 release 发布后会生成
official-resource-changes.json、official-parse-cache.json、official-textunit-index.json、official-textunit-tasks.json、crowdin-translation-handoff.json、crowdin-textunit-queue.json、translation-tasks.sqlite和translation-handoff.json;其中 TextUnit/Crowdin 队列只使用 Added/Modified 资源,不调用 Crowdin 网络 API,离线 TextUnit 翻译任务可通过translation.tasks/translation.handoffRPC 或 CLI 查询状态、跳过/失败原因和 provider run 交接。 translation.worker.run已提供 Rustbat的 mock/Crowdin provider worker,支持 lease、失败重试、TextUnit 译文结果落库、Translation Memory V1 和 Glossary V2;Glossary 独立于 release task/TM,支持全局与 TextUnit scope、alias、priority、approved review、冲突诊断、provider constraints、deletion audit 和确定性 QA。TM 独立于 release task 库,支持 candidate/trusted、完整 context exact match、显式 confirm 和 provenance 查询。模糊匹配和完整 Provider 扩展体系仍待实现。LocalizedPatchService已具备受支持的 UnityFS localized patch 发布/回滚能力:在--localized-output/BAT_LOCALIZED_OUTPUT配置的独立汉化目录 staging 中复制官方 release、应用 TextAsset、TypeTree string field 或 managed-reference string field patch、写入带 TextUnit/provider/review/rollback trace 的localized-patch-manifest.json,校验后发布到versions/<id>并切换current,也可显式 rollback。bat-patch已具备通用 Patch 基础:确定性 Binary hunk diff/apply、RFC 6902 JSON Patch apply、UTF-8 Text Patch、Patch manifest、BLAKE3/size 完整性校验和 rollback 元数据;文件级patch.applyRPC /patch-applyCLI 与 UnityFS TextAsset / TypeTree string / TypeTree 语义字段写入入口已开放,TypeTree 语义字段支持基础标量、固定 Unity float/int/hash 值类型的 leaf/direct-child 形态、PPtr、managed-reference registry payload 字符串、object 字段组合、unknown fixed-size raw bytes 同长度替换和 TypeTree schema 支撑的 array/vector/map 整体替换;TextUnit 提取会把 managed-reference 类型信息保留为上下文而非翻译文本,受支持 localized 发布通过独立 manifest/staging/current 流程完成。bat-ffi可选无状态 C ABI 兼容层:仅保留 Manifest inspect 和官方 sync plan 的粗粒度 JSON helper,不作为 Go CLI 或生产同步的主集成边界。- 文档路线图、当前状态、缺口清单、官方资源运行指南。
仍未完成:
bat-api完整游戏业务 API / launcher 安装包更新全链仍未完成;资源 CDN、HTTP 控制面、launcher 资源引导兼容和内嵌 dashboard MVP 已可用。- 完整 AssetBundle 对象级解析(UnityFS 解包、object table、TypeTree node 元数据、TextAsset bytes、MonoBehaviour/ScriptableObject 基础 TypeTree 字段级解析已起步;复杂字段覆盖、发布级重打包和 Patch 发布统一仍未完成)。
- 复杂 AssetBundle 重打包和完整翻译资产编排仍未完成;当前 generic manifest 已驱动已验证的 Binary/JSON/Text 与 UnityFS localized 操作,未知结构仍明确拒绝。
- Translation Memory、Glossary 和完整 Provider 扩展体系:Translation Memory V1 与 Glossary V2 已由 Rust
bat持有;仍未实现的是模糊匹配、完整 Provider 扩展体系和完整 Web 协作后台。 - SDK、完整 Web 协作后台。
详细状态见:
- 当前状态
- Go 侧进度与边界
- 完整开发计划
- 文档索引
- 当前缺口清单
- 官方资源拉取与自动更新指南
- 官方全量拉取 Smoke Runbook
- bat-api 同机 Live Smoke Runbook
- 官方资源后端说明
快速验证
前置要求:
- Rust 1.75+
- Go 1.26.4+
curlunzip,仅旧版 launcher manifest 指向整包 ZIP 且--auto-discover需要从 ZIP 解析GameMainConfig时使用;当前目录型 manifest 会直接下载resources.assets
运行当前通用验证:
make ci-check
make ci-check 是只读 required 门禁;make format / make fmt 才会格式化源码。
Go lint 是 required gate,使用 scripts/ci-versions.sh 固定的
golangci-lint 2.12.2;工具缺失或版本不匹配都会失败。
查看官方同步命令:
cargo run -p bat-infrastructure --bin bat -- --help
只做官方资源更新判断,不写同步状态:
cargo run -p bat-infrastructure --bin bat -- \
--auto-discover \
--dry-run
常驻自动更新,正常情况下默认每 1 小时检查一次;每天北京时间(UTC+8)03:00、16:00、18:00 会强制执行一次自动刷新。远端和本地一致时静默。下载或发现失败时默认 60 秒后重试,可用 --error-retry 60s 调整:
cargo run -p bat-infrastructure --bin bat -- \
--auto-discover \
--watch \
--error-retry 60s
后台自动运行可以把 --watch 换成 --daemon。默认官方原版资源目录是 ./bat-resources,默认汉化产物目录是 ./bat-localized,默认后台状态目录是 /tmp/bat-pid。daemon 会在状态目录下创建 bat.sock 作为 Unix socket JSON-RPC 控制通道,同时写入 bat.pid、bat-status.json、bat-daemon.log、bat-events.jsonl 和短生命周期的 bat-control.lock;bat-events.jsonl 是带轮转的结构化 JSONL 事件日志,bat-status.json 保存最后成功时间、下次检查时间、最后错误摘要和当前下载进度,bat-control.lock 用于串行化 status/stop/restart/reload/logs/refresh/repair 等控制命令:
cargo run -p bat-infrastructure --bin bat -- \
--auto-discover \
--daemon
cargo run -p bat-infrastructure --bin bat -- status
cargo run -p bat-infrastructure --bin bat -- logs
cargo run -p bat-infrastructure --bin bat -- restart
cargo run -p bat-infrastructure --bin bat -- reload
cargo run -p bat-infrastructure --bin bat -- stop
status、stop、restart、logs、reload、默认形态的 refresh 和默认形态的 repair 会优先连接 live RPC socket;socket 不可用时,状态和停止命令会回退到 PID/状态文件兼容路径。restart 会通过 Rust lifecycle controller 复用 CLI restart 路径替换后台进程;reload 不再强制重启进程,而是让后台 watch 循环重新自动发现并执行强制刷新:空闲睡眠时立即唤醒,正在同步时排队到当前轮结束后执行。确实需要替换启动参数时使用 restart,或给 reload 显式传入同步、输出、worker/TM 等 daemon 启动参数。后台 daemon 正在管理某个资源目录时,前台 run/watch/refresh/repair 不能直接写同一目录;默认形态的 refresh/repair 会改走 RPC,显式参数导致无法走 RPC 时需要先 stop。
bat 会拒绝危险输出目录、路径逃逸和现有 symlink 路径组件;下载目标、.part、manifest、snapshot、PID、status、log 和控制锁文件不会跟随 symlink,daemon 状态类文件默认以 0600 权限创建。
非 dry-run 同步不会把新文件直接写进生产可读目录。官方原版资源会先下载到 <output>/.staging/<id>,完成 manifest、BLAKE3、ZIP 和官方 .hash 校验后移动到 <output>/versions/<id>,再原子切换 <output>/current symlink;生产读取方应只读取 <output>/current。同步过程会更新 <output>/official-version-state.json:下载开始时写入 in_progress_version,发布成功后写入 current_completed_version 和 previous_available_version,失败或中断时写入 failed_versions。启用 --auto-discover 时,已发布 release 会写入 official-launcher-bootstrap.json,其中包含 launcher metadata、launcher CDN config、remote manifest 文件列表、选中的 resources.assets 来源和 GameMainConfig 摘要;官方资源端尚未开放时会写 <output>/official-launcher-bootstrap.pending.json,但不会切换 current。新 release 发布后会对比上一完整 release 的 download manifest,在当前 release 下写入 official-resource-changes.json、crowdin-translation-handoff.json、official-parse-cache.json、official-textunit-index.json、official-textunit-tasks.json 和 crowdin-textunit-queue.json;新增+变更资源作为解析/翻译候选,删除资源只进入差异记录。复用历史 release 时会先按 destination 找候选并重新校验 size、BLAKE3、ZIP 结构,必要时验证 CAS;候选不可靠就记录诊断并回退网络,不会静默复用。CAS release 引用存放在 official-cas-reuse-references.json,孤儿 staging 清理时会递减这些引用。up-to-date 轮询在已有有效解析缓存、TextUnit 明细索引和 TextUnit 队列时只读取摘要,不重复解析。官方同步报告默认 localized_release_status=not_localized,表示原版资源已发布、汉化资源未发布;后续 Patch/导出写入 --localized-output / BAT_LOCALIZED_OUTPUT 指定的独立目录,保留官方相对目录结构,manifest 校验通过后才切换为 localized。
资源操作命令默认输出人类可读摘要,并在没有显式 metadata 参数时默认走官方自动发现。脚本或上层程序需要稳定结构化输出时加 --json:
cargo run -p bat-infrastructure --bin bat -- refresh
cargo run -p bat-infrastructure --bin bat -- refresh --force --json
cargo run -p bat-infrastructure --bin bat -- verify
cargo run -p bat-infrastructure --bin bat -- repair
cargo run -p bat-infrastructure --bin bat -- doctor
cargo run -p bat-infrastructure --bin bat -- clean-stable
verify 会以只读方式检查当前官方计划、current 指向的 active release 中 download manifest 的 size+BLAKE3、ZIP 结构,以及本地已有官方 seed .bytes/.hash 对的 xxHash32;发现缺失、远端变化或本地损坏会返回非 0。repair 会在异常资源存在时复用当前同步链路重新下载必要文件。clean-stable 只清理 .part、临时状态文件、失效或损坏的 PID/锁/socket,不删除正式资源。
下载失败会按 curl exit 和 HTTP 状态分类:403/404/普通 4xx 视为不可重试,5xx、429、DNS、连接、超时、中断和网络类错误会按尝试次数重试。若官方启动器/server-info 已先行更新,但 client-patch root 下的 seed marker 或必需 seed catalog 仍返回 403/404/普通 4xx,bat 会返回 update_status=waiting_for_official_resources,保留现有 current,不创建失败 staging,不把维护期记为失败版本;watch/daemon 会按错误重试间隔继续探测。已进入下载阶段的单个资源 URL 最终失败后会写入 <output>/current 或 staging 下的 official-download-quarantine.json,stderr progress、daemon status 和 bat-events.jsonl 会记录失败类型、HTTP 状态、是否可重试、尝试次数和 quarantine 状态;同步会中断并阻止发布不完整资源。旧 launcher 包下载路径会在官方 primary CDN 失败后切换官方 backup CDN。
CLI 默认启动时会向 stderr 打印 BlueArchiveToolkit ASCII banner,并继续把阶段进度日志写到 stderr,例如自动发现、拉取 catalog、audit、下载已完成计数、单文件下载进度、校验结果摘要、snapshot 和 publish;命令结果默认以人类可读摘要写到 stdout。需要给上层程序保留稳定结构化输出时加 --json --no-progress,只想关闭横幅但保留日志时可加 --no-banner。
真实官方网络全量拉取 smoke 已固化为可重复命令,默认使用 /tmp/bat-official-smoke-<UTC timestamp>/ 隔离目录,不会写入已有客户端、生产目录或开发机人工维护资源目录:
scripts/official-full-pull-smoke.sh
# 或
make official-smoke
该 smoke 会执行 dry-run plan、首次全量拉取、二次 up_to_date 检查、本地文件破坏后的 repair、repair 后 verify,并在 report/SMOKE_REPORT.md 记录命令、输出目录、active release、文件数量、release 大小和被破坏文件。大型官方资源文件不纳入 Git。
生产官方资源输出目录和汉化产物目录都必须使用独立目录,不要指向已有客户端目录,也不要指向 /home/wanye/D/BlueArchive 这类人工维护或开发资源目录。需要覆盖官方原版资源位置时,用 --output <资源目录> 或 config.toml 中 [resource].output_root / 环境变量 BAT_OUTPUT;需要覆盖汉化产物位置时,用 --localized-output <目录> 或 config.toml 中 [localized].output_root / 环境变量 BAT_LOCALIZED_OUTPUT;需要启用官方 release 导入 CAS/索引时,用 --import-repository,并可用 config.toml 中 [repository].import_cas_root、[repository].import_resource_repository_path 或环境变量 BAT_IMPORT_CAS_ROOT、BAT_IMPORT_RESOURCE_DB 覆盖默认路径;需要覆盖后台状态目录时,用 --state-dir <状态目录> 或 config.toml 中 [runtime].state_dir。
技术栈
- Rust:CAS、官方资源同步核心、AssetBundle/Patch 引擎;当前生产同步入口是
batbinary。 - Go:当前正式入口是
bat-api资源 bootstrap/分发服务、内嵌 dashboard 和internal/backendrpc;完整游戏业务 API、SDK、Provider 编排仍按路线图推进,cmd/bat仅为试验 CLI。 bat-ffi:可选兼容层,只暴露无状态粗粒度 JSON C ABI,不承载 daemon、下载器、CAS handle 或主控制面。- PostgreSQL:计划中的服务端主数据库。
- Redis:计划中的缓存、队列状态、限流和短期锁。
- Vue 3 + TypeScript:计划中的完整 Web 协作后台;当前已先提供无构建内嵌 dashboard。
- Docker / Docker Compose:数据库和后续服务部署配置。
项目结构
BlueArchiveToolkit/
├── core/ # Rust 领域模型和仓储接口
├── adapters/ # Rust 适配器框架与官方资源规则
├── infrastructure/ # Rust 基础设施、官方同步、CAS/ResourceRepository 适配
├── crates/ # Rust 引擎 crate
│ ├── bat-cas-engine/
│ ├── bat-assetbundle/
│ ├── bat-patch/
│ └── bat-ffi/ # 可选无状态 C ABI 兼容层
├── internal/backendrpc/ # Go -> Rust daemon 的 typed JSON-RPC client
├── internal/ffi/ # 可选 CGO 兼容包装,不是 Go CLI 主路径
├── cmd/ # Go CLI 试验骨架与后续产品入口
├── pkg/ # Go SDK 包,尚未实现
├── api/ # 预留 API 定义;bat-api OpenAPI 静态规范已提供,完整业务 API 尚未实现
├── web/ # bat-api 内嵌 dashboard 静态资产;完整协作后台仍在后续阶段
├── deployments/ # Docker 和部署配置
├── docs/ # 文档、历史报告和分析资料
├── Cargo.toml
├── go.mod
└── Makefile
开发优先级
近期优先级:
- 维护并联调 Go
bat-api资源 bootstrap/分发入口和内嵌 dashboard;cmd/bat仅有doctor、manifest inspect、sync plan试验能力,不应误写成完整产品 CLI。 - 补齐 AssetBundle UnityFS 引擎级解析。
- 扩展 Addressables catalog 解析覆盖,继续用真实形态 fixture/golden 锁定行为。
- 基于
translation.worker.runprovider worker 继续推进完整 Patch 构建和发布/回滚闭环。 - 按 smoke runbook 在具备网络和磁盘窗口的环境中执行真实官方全量拉取,并保留本地报告。
当前已提供直接调用 bat-api 鉴权接口的内嵌 dashboard;完整 Web 协作后台仍应在 TM 扩展、权限模型和持久化 API 明确后推进。
许可证
本项目采用 MIT 许可证,见 LICENSE。