diff --git a/AGENTS.md b/AGENTS.md index 3a9258aa..c080235a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -123,6 +123,9 @@ graph TD - Primary language is Simplified Chinese; add English when practical. - One paragraph per line; use `
` for line breaks only when needed; no trailing spaces. - Markdown is linted by `markdownlint-cli2`. +- End-user / agent usage of the installed `maa` CLI lives in `skills/maa-cli/` (`SKILL.md`, `setup.md`, `reference.md`). This file is for contributing to the crates. +- Unimplemented product designs live in `docs/design/`. Do not describe them in `skills/maa-cli/` as if the commands exist; the skill may link to a design to say they do not. +- When changing commands, task types, connection presets, or installer behavior, update `skills/maa-cli/` in the same change. When the task is to install, connect, or run maa-cli, read `skills/maa-cli/SKILL.md` instead of this file. ## MISC diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index a1ec8a50..8596eb5e 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -159,3 +159,4 @@ graph TD - 文档以简体中文为主,英文为辅,其他语言(繁体、韩文、日文)尽量翻译,无法翻译时可用简体中文占位。 - 所有文档为 Markdown 格式,使用 [markdownlint-cli2](https://github.com/DavidAnson/markdownlint-cli2) 检查。 - 段落内不换行,每段仅一行,段落间空行分隔。非段落换行请用 `
`,不要用尾随空格。 +- 尚未实现、需要跨 MaaCore / maa-cli 讨论的方案放在 [`docs/design/`](docs/design/)(例如 [信息查询面](docs/design/query-surface.md)),不要写进用户手册或 `skills/maa-cli/` 当成已有命令。 diff --git a/README.md b/README.md index 97fbceb3..8db54d0b 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ - [使用](crates/maa-cli/docs/zh-CN/usage.md) - [配置](crates/maa-cli/docs/zh-CN/config.md) - [常见问题](crates/maa-cli/docs/zh-CN/faq.md) +- [Agent 技能](skills/maa-cli/SKILL.md) [maa-home]: https://github.com/MaaAssistantArknights/MaaAssistantArknights/ diff --git a/crates/maa-cli/docs/zh-CN/intro.md b/crates/maa-cli/docs/zh-CN/intro.md index 2e4ec498..b42ed8aa 100644 --- a/crates/maa-cli/docs/zh-CN/intro.md +++ b/crates/maa-cli/docs/zh-CN/intro.md @@ -14,5 +14,6 @@ - [使用](usage.md) - [配置](config.md) - [常见问题](faq.md) +- [Agent 技能](../../../../skills/maa-cli/SKILL.md) [maa-home]: https://github.com/MaaAssistantArknights/MaaAssistantArknights/ diff --git a/docs/design/query-surface.md b/docs/design/query-surface.md new file mode 100644 index 00000000..0eaf9993 --- /dev/null +++ b/docs/design/query-surface.md @@ -0,0 +1,115 @@ +# 信息查询面(中期) + +状态:提案。未实现。文中的 `maa snapshot` / `maa query` 不存在,只是切面草图。 + +本文写给要改 maa-cli / 对接 MaaCore 的人。用户手册在 `crates/maa-cli/docs/`。当前 CLI 怎么用在 `skills/maa-cli/`。 + +## 要解决什么 + +MAA 现在是执行器:识别界面、点按钮、把 callback 打进日志。maa-cli 把任务交出去,自己不识图,也不把结果收成 agent 能反复引用的事实。 + +Agent 接上之后,真正缺的不是再写一套自动点击,而是**这个号现在是什么状态**——按需、带来源、缺了就说缺。有了这层,才能做比「按名单点下去」更复杂的决策:这周期红票换书还是换芯片、绿票要不要兑许可、专精材料刷关还是等店、公招许可还够不够撑到下次刷新。 + +所以中期要扩的是信息查询面,不是某一个推荐功能。两块一起做: + +1. **OCR / 只读扫描**:把现在扫不到、扫不稳、或不落盘的界面状态读出来。包括但不限于各种票据、凭证店本期限购,以及干员箱里仍缺的养成字段。 +2. **Agent 友好的查询切面**:按需取 detail,输出带 `source` / `as_of` 的 JSON。静态表(货盘、掉率、养成消耗)和 OCR 事实分开,不让模型记价格,也不把「没扫到」补成 0。 + +购买清单、公招规划、刷关 vs 兑换,都是这层之上的**消费者**。第一期可以拿红/绿票店当试金石,但不能把产品做成「商店购买推荐」。 + +## 现在停在哪 + +|能力|今天做什么|查询面缺什么| +|---|---|---| +|`Depot`|材料页模板匹配;部分 Core 再扫「全部」里少数货币|票类不是一等公民;结果只打日志,不落盘| +|`OperBox`|干员列表:`id` / 精英 / 等级 / 潜能 / 稀有度|技能等级、专精、模组、信赖不在结果里| +|`Mall`|按名单**真实购买**信用店|不解释为什么;不管凭证店| +|`Recruit` / `Fight` / `Infrast`|执行公招、作战、基建|callback 里有片段(理智、公招结果),没有按需查询| +|maa-cli|派任务、打日志|没有 snapshot,没有 `query`,agent 只能从日志里抠| + +信用商店已经有执行器,高价值状态(票、限购、养成细节)既不扫全,也不供查询。卡点不是「OCR 读不了」,而是 Core 很少把只读扫描当成任务,cli 也没有给 agent 的事实层。 + +## 非目标 + +- 不把 Depot 扩成万能背包。票、许可、黄票、情报凭证和材料不是同一套 OCR 模板;硬扩仓库会把「没识别」混进「数量为零」。 +- 不做通用「OCR 任意界面大脑」。按界面拆扫描器,查询切面再组合。 +- 不替代 `Mall`。信用店货每天随机,按 `buy_first` / `blacklist` 下单是规则执行,不是查询。 +- 不在 Core 或 cli 里跑模型做养成规划。表负责数值,agent 负责把事实和用户目标翻成决策。 +- 不把建议或代操作写成已经存在的子命令。高代价动作(凭证店下单、源石)默认不 click;apply 若要做,必须和查询分开。 + +## OCR:按事实选界面 + +一条事实从它自然出现的页面读。不要假设「扫一次仓库就有一切」。 + +|要读的事实|自然界面|现状| +|---|---|---| +|材料数量|仓库「材料」|`Depot` 已有| +|红票 / 源石 / 合成玉 / 龙门币 / 赤金|仓库「全部」或部分商店顶栏|部分 Core 已扫;以当前日志为准| +|绿票、黄票、情报凭证、寻访凭证、招聘许可|仓库「全部」或对应商店顶栏|默认不稳或不全| +|凭证店还能买几次|该商店货架(例如芯片助剂 2/2)|没有只读扫描任务| +|信用点|信用商店|走 `Mall` 执行过程,不是查询| +|干员技能 / 专精 / 模组|干员详情,不是列表页|`OperBox` 没有| +|理智|作战前后|`SanityBeforeStage` 等 callback,不是独立查询| + +凭证店「库存」不是全服货量,而是这个号本周期的限购余量。OCR 商店页读到的是「还能买几次」。货盘本身多半是静态表(GameData 商店表,例如 `shop_client_table`),多数时候不必 OCR 整页商品名。 + +票据同理:数量是 OCR,物品定义走 `item_index.json`。常用 ID:黄票 `4004`、绿票 `4005`、红票 `4006`、情报凭证 `REP_COIN`。 + +## 查询切面:按需、可引用、可组合 + +Agent 一次决策往往只要几条 detail,而不是整局游戏的 dump。切面按资源分,而不是按「推荐场景」分。 + +草图(实现时再定名): + +```text +maa snapshot tickets # 票/凭证余量 +maa snapshot shop red|green # 本期限购余量 +maa snapshot depot # 材料 +maa snapshot operators # 干员箱;以后可加技能/专精 +maa query tickets +maa query shop --shop red +maa query operator --id +maa query depot --item 30012 +``` + +约定: + +- `snapshot`:跑只读扫描,写出带时间戳的 JSON。可以贵,所以按需,不默认全量。 +- `query`:读已有 snapshot + 静态表。没有快照就说没有,不要默默再扫一遍;需要刷新时显式 snapshot。 +- 每条字段带 `source`(`ocr` / `table` / `callback` / `user`)和 `as_of`。缺测用缺测,禁止用 0 填充。 +- 执行类结果若要暴露,也走同一形状,并标明 `side_effect`(例如 `Mall` 已经买过)。查询切面默认无副作用。 + +静态表不走 OCR:货盘与兑换价、企鹅掉率、技能专精消耗、经验规则。查询输出里表数据与账号状态并列,让 agent 能区分「游戏里还剩几次」和「表上这件值多少票」。 + +## 决策是消费者,不是切面本身 + +查询面给的是事实。复杂决策在 agent(或以后可选的纯函数)里做。下面只说明**为什么切面必须比单一推荐更宽**,不是第一期要交货的产品列表。 + +凭证店是一个典型组合:用户缺口 × 本周期性价比 × 余票 × 限购余量。没有票余量和限购,推荐只能猜;没有材料 Depot,不知道缺什么;没有表,模型会编价格。MAA 故意不自动买红/绿票店,因为买错代价高——查询面默认只建议、不代操作,和这条一致。 + +同一组事实还能支撑别的决策,例如:绿票 + 招聘许可限购 + 公招目标 → 要不要兑许可;红票 + 技能书库存 + 专精表 → 兑书还是刷关;干员专精缺口 + 芯片库存 + 芯片助剂限购 → 这期店该不该动。这些都不该各自做一套 OCR。 + +若以后要 `recommend` 入口,它是读 query JSON 的纯函数,可以先放在仓库外或脚本里,不一定进二进制。Apply(按清单代点)更往后,且必须和建议、查询分开:查询可旧,建议可错,代买不能默默错。 + +## 分层 + +|层|做什么|不做什么| +|---|---|---| +|MaaCore|按界面增加只读扫描,稳定 callback / 结构化结果|不在 Core 里做养成规划;只读任务默认不点击购买| +|maa-cli|查询切面:收 snapshot、按需 query、标明来源与时间|不把日志当 API;不用模型算性价比| +|表 / 外部数据|货盘、兑换价、掉率、养成消耗|不靠截图推数值| +|Agent|组合事实与用户目标,输出可解释决策|不把缺测补成 0;高代价动作先问再执行| + +## 分期 + +第一期把**查询面的形状**做对,并补上最常用、现在又最残的 OCR:票据余量(红/绿优先,黄票与许可跟上),以及红票店、绿票店的限购余量。`snapshot` JSON 带 `source` / `as_of`;`query` 可以先是读文件的约定,不一定立刻进 CLI。 + +紧接着把 `query` 做成真正的无副作用入口,并决定 OperBox 要不要扩技能/专精/模组(可能是另一套详情扫描,而不是给列表页加字段)。 + +第二期再扩黄票店、情报凭证店、活动店,以及把更多 callback(理智、公招)收进同一套 query 形状。决策辅助(商店清单、材料缺口)作为消费者接入,仍然默认不代操作。 + +## 为什么这样切 + +把 Depot 做成万能背包,看起来一次扫完,实际是把不同界面的失败模式叠进一个「已读到」。票余量可以在仓库「全部」或商店顶栏;限购只在商店货架上;技能等级在干员详情。查询切面按事实组合,扫描器按界面拆开。 + +先做某一个推荐功能,会把 API 绑死在「买不买」上,后面的公招、专精、刷关规划都要另起炉灶。先做 OCR + 按需 query,推荐只是其中一个调用方,才配得上 agent 要做的复杂决策。 diff --git a/skills/maa-cli/SKILL.md b/skills/maa-cli/SKILL.md new file mode 100644 index 00000000..1a59288e --- /dev/null +++ b/skills/maa-cli/SKILL.md @@ -0,0 +1,93 @@ +--- +name: maa-cli +description: >- + Operate MaaAssistantArknights maa-cli (`maa` / `maa-cli`) for 明日方舟 automation. + Use when installing or running maa-cli, connecting via PlayCover / Waydroid / ADB, + or diagnosing a failed game connection. Do not use for the MAA desktop GUI, + non-Arknights games, or this repo's Rust/CI work. +license: AGPL-3.0-only +metadata: + author: MaaAssistantArknights + version: "0.2.2" + tags: arknights maa-cli maacore +--- + +# maa-cli + +maa-cli 只服务《明日方舟》。它把任务交给已安装的 MaaCore,自己不识图、不点屏幕。 +本机命令多数是 `maa`;Windows winget 安装后是 `maa-cli`。先 `command -v maa`,没有再试 `maa-cli`。下文示例写 `maa`。 +旗标以 `maa help` / `maa help ` 为准。 + +**会点击购买或消耗源石的操作,先得到用户明确同意。** + +## 三层 + +会操作游戏的命令要求三层同时就绪。缺哪一层就补哪一层。 + +1. **maa-cli**:PATH 上的 `maa` 或 `maa-cli`。 +2. **MaaCore + 资源**:`maa install`(已装则 `maa update`)。热更新资源用 `maa hot-update`。Nix 已捆绑 Core。包管理器装的 cli 用包管理器升级。 +3. **游戏运行时**:Android 走 ADB(模拟器、真机、Waydroid);macOS 上的 iOS 包走 PlayCover + PlayTools。maa-cli 不安装模拟器、PlayCover 或游戏。 + +数量、余量、限购只引用命令日志或用户给出的数字。物品 ID 查已装资源的 `item_index.json`(`maa dir resource`)。 + +## 冷启动 + +完成标准:`maa version` 同时打出 cli 与 Core;`maa dir config` 能打印路径;若要跑游戏,profile 的 preset/地址与当前运行时一致,且目标命令 `--dry-run` 通过。 + +1. 跑 `maa version`。命令不存在 → 读 [setup.md](setup.md) 的「安装 maa-cli」,装到 `maa version` 能跑。没有 Core → `maa install`(Windows 先装 VC++)。**完成:** 输出版本里同时有 cli 和 Core。 +2. `maa dir config` 打印配置目录(`MAA_CONFIG_DIR` 可覆盖)。**完成:** 得到一条真实路径。 +3. 要操作游戏且运行时不明:问用户是 PlayCover、哪家模拟器、Waydroid 还是真机,再按 [setup.md](setup.md) 写 `$MAA_CONFIG_DIR/profiles/default.toml`。有人在场可用 `maa init`;无人值守直接写文件。**完成:** profile 的 preset/地址与当前客户端一致,或用户只要安装、不连游戏。 +4. `maa startup --dry-run`(或目标任务加 `--dry-run`)。连不上走 setup 的连通性检查。**完成:** dry-run 退出码为 0。 +5. 任务文件有输入项时加 `--batch`。**完成:** 不会在提示符上卡住。 + +## 连接怎么选 + +选 `preset` 用下表。写入文件的完整模板、分平台依赖、排错见 [setup.md](setup.md) 对应平台小节和「写连接 profile」。 + +|本机|游戏怎么跑|`connection.preset`|默认地址| +|---|---|---|---| +|macOS|PlayCover 安装的 iOS 包|`PlayCover`|`127.0.0.1:1717`(以窗口标题 `[host:port]` 为准)| +|macOS|MuMu Player Pro|`MuMuPro`|`127.0.0.1:16384`| +|Windows|腾讯 Androws|`Androws`|`127.0.0.1:5555`| +|Linux|Waydroid|`Waydroid`|`waydroid`| +|任意|其它 Android 模拟器或真机|`ADB`|`adb devices` 的 serial,找不到则 `emulator-5554`| + +PlayCover 预设强制 `MacPlayTools`,并加载 iOS 资源。窗口保持可见。B 服没有 iOS 包。 +本次运行覆盖地址:`maa fight 1-7 --addr 127.0.0.1:1717`。 + +## 命令怎么路由 + +|用户要|去做| +|---|---| +|装 / 更新 Core|`maa install` / `maa update`| +|热更新资源|`maa hot-update`| +|路径 / 版本 / 活动表|`maa dir …` / `maa version` / `maa activity`| +|启动、作战、抄作业、肉鸽、生息|预定义子命令:`startup` `closedown` `fight` `copilot` `ssscopilot` `paradoxcopilot` `roguelike` `reclamation`| +|基建、公招、信用商店、领奖、仓库、干员箱|自定义任务的 `type`,`maa run <文件名不含扩展名>`| + +预定义例子:`maa startup Official && maa fight BB-7 -m 3 && maa closedown` +作业 URI 用 `prts://` 或 `prts://s`,或本地 JSON。 +自定义任务放 `$MAA_CONFIG_DIR/tasks/`。类型名与识别边界见 [reference.md](reference.md)。 +`Mall` 的 `buy_first` / `blacklist` 会在信用商店真实下单。 + +## 何时读哪份文件 + +- 缺 cli / Core、要写 profile、连不上:读 [setup.md](setup.md) 里对应当前 OS 的那一节。 +- 自定义 `type`、URI、仓库/干员箱能扫到什么:读 [reference.md](reference.md) 对应小节。 + +仓库内用户手册: + +- 安装:[install.md](../../crates/maa-cli/docs/zh-CN/install.md) +- 使用:[usage.md](../../crates/maa-cli/docs/zh-CN/usage.md) +- 配置:[config.md](../../crates/maa-cli/docs/zh-CN/config.md) + +## 常见错误 + +|错|改成| +|---|---| +|把 `Infrast` / `Recruit` / `Mall` / `Depot` 当成子命令|自定义任务 `type` + `maa run …`| +|只装了 cli 就开打|`maa version` 看到 Core 之后再连| +|macOS 默认 ADB 去连 PlayCover|preset `PlayCover`,地址用标题栏端口| +|作业写成 `maa://`|`prts://`| +|把 `Mall` 名单当成推荐清单|先确认再跑;名单里的东西会被买掉| +|把 `maa activity` 当成背包|活动表来自已装资源;背包走 `Depot` 任务日志| diff --git a/skills/maa-cli/reference.md b/skills/maa-cli/reference.md new file mode 100644 index 00000000..8eac7181 --- /dev/null +++ b/skills/maa-cli/reference.md @@ -0,0 +1,93 @@ +# maa-cli 参考 + +任务类型和识别边界。旗标以 `maa help` 为准。 + +## Contents + +- [子命令 vs 任务类型](#子命令-vs-任务类型) +- [Copilot URI](#copilot-uri) +- [客户端](#客户端) +- [物品 ID 与 Depot](#物品-id-与-depot) +- [OperBox / Mall](#operbox--mall) +- [安装资源里有什么](#安装资源里有什么) +- [条件与 batch](#条件与-batch) + +## 子命令 vs 任务类型 + +|能力|有子命令|自定义任务 `type`| +|---|---|---| +|启动/关闭|`startup` / `closedown`|`StartUp` / `CloseDown`| +|作战|`fight`|`Fight`| +|作业|`copilot` / `ssscopilot` / `paradoxcopilot`|`Copilot` / `SSSCopilot` / `ParadoxCopilot`| +|肉鸽|`roguelike`|`Roguelike`| +|生息演算|`reclamation`|`Reclamation`| +|基建 / 公招 / 信用商店 / 领奖 / 仓库 / 干员箱|无|`Infrast` / `Recruit` / `Mall` / `Award` / `Depot` / `OperBox`| +|其它|无|`Custom` / `SingleStep` / `VideoRecognition`| + +自定义任务文件:`$MAA_CONFIG_DIR/tasks/`,`maa run `。 +基建计划 JSON:`$MAA_CONFIG_DIR/infrast/`(必须 JSON)。maa-cli 不按时段读计划文件,要用任务 `condition` 配 `plan_index`。 +Schema:[task.schema.json](../../crates/maa-cli/schemas/task.schema.json) +参数权威:[集成文档 · 任务类型](https://maa.plus/docs/zh-cn/protocol/integration.html) + +`maa fight --help` 给出作战旗标。`--stone` 先确认;`-D<物品ID>=件数` 的 ID 来自 `item_index.json`(`maa dir resource`)。 + +未知 `connection.preset` 会被当成 `ADB` 并打警告。PlayCover 的别名是 `PlayTools`。 + +## Copilot URI + +优先 `prts://`(单份作业)或 `prts://s`(作业集)。 +也接受本地路径或 `file://`。 +`maa://` / `maa://s` 仍能用,但会告警弃用。 + +## 客户端 + +|值|说明|PlayCover bundle|Android 包名| +|---|---|---|---| +|`Official`|官服|`com.hypergryph.arknights`|`com.hypergryph.arknights`| +|`Bilibili`|B 服|无|`com.hypergryph.arknights.bilibili`| +|`txwy`|台服|`tw.txwy.ios.arknights`|`tw.txwy.and.arknights`| +|`YoStarEN`|国际服|`com.YoStarEN.Arknights`|同左| +|`YoStarJP`|日服|`com.YoStarJP.Arknights`|同左| +|`YoStarKR`|韩服|`com.YoStarKR.Arknights`|同左| + +## 物品 ID 与 Depot + +票和货币的常用 ID(其余查 `item_index.json`): + +|ID|名称|classifyType|备注| +|---|---|---|---| +|`4001`|龙门币|NORMAL|| +|`4002`|至纯源石|NORMAL|| +|`4003`|合成玉|NORMAL|| +|`4004`|高级凭证|NORMAL|黄票| +|`4005`|资质凭证|NORMAL|绿票| +|`4006`|采购凭证|NORMAL|红票| +|`REP_COIN`|情报凭证|NORMAL|| +|`30012`|固源岩|MATERIAL|`-D` 示例常用| + +`classifyType == MATERIAL` 才是 Depot 材料页模板白名单。票和货币是 `NORMAL`。 + +Depot 是自定义任务 `type = "Depot"`,截图模板匹配 + 数量 OCR。结果打在日志里,不落盘。 +部分 Core 会再扫「全部」页的源石/合成玉/龙门币/赤金/红票;黄票、绿票、情报凭证、寻访凭证、招聘许可以当前日志为准。 +理智在战斗 callback `SanityBeforeStage`。信用点走 `Mall`。 + +## OperBox / Mall + +OperBox 日志字段:`id` / `name` / `own` / `elite` / `level` / `potential` / `rarity`。技能等级、专精、模组、信赖不在结果里。 + +`Mall` 只自动买信用商店,会真实点击购买。红/绿/黄票店和情报凭证店没有扫描或自动购买子命令。没有 `maa snapshot` / `maa query`。 +凭证店「库存」是本号本周期限购余量。没扫到的票余量和限购次数不当成已经读到。 +中期方向(OCR 扩采集 + 按需查询,决策是消费者)见 [信息查询面](../../docs/design/query-surface.md)。 + +## 安装资源里有什么 + +`maa install` 装的资源够识别图标和跑作业:物品名、关卡掉落种类、干员职业/射程、基建技能文案与排班效率、公招 tags。 +养成数值(攻防 HP、技能各等级、专精/模组材料)查游戏数据或 wiki。掉率查企鹅物流。 + +## 条件与 batch + +自定义任务可用 `Time` / `DateTime` / `Weekday` / `DayMod` / `OnSideStory` 以及 `And`/`Or`/`Not`。 +`timezone = "Official"` 用游戏日界(官服 UTC+4),不是东八区 0 点。 +当天 `DayMod` 余数:`maa remainder `。 + +任务参数里的 `Input`/`Select` 在交互运行时会提问。`--batch` 用默认值;没有默认值就失败。 diff --git a/skills/maa-cli/setup.md b/skills/maa-cli/setup.md new file mode 100644 index 00000000..ba341e18 --- /dev/null +++ b/skills/maa-cli/setup.md @@ -0,0 +1,208 @@ +# 安装与运行时 + +在用户本机把 maa-cli 接到能打的明日方舟客户端。 +命令示例写 `maa`;winget 安装后改成 `maa-cli`。 +技能未写到的安装细节以 [install.md](../../crates/maa-cli/docs/zh-CN/install.md) 和 [config.md](../../crates/maa-cli/docs/zh-CN/config.md) 为准。 + +完成标准:`maa version` 含 Core;`maa dir library` 下能找到 MaaCore 动态库;profile 的 `preset` / 地址与当前客户端一致;目标任务 `--dry-run` 通过。 + +## Contents + +- [1. 安装 maa-cli](#1-安装-maa-cli) +- [2. 安装 MaaCore 与资源](#2-安装-maacore-与资源) +- [3. 游戏运行时(按平台)](#3-游戏运行时按平台) +- [4. 写连接 profile](#4-写连接-profile) +- [5. 连通性检查](#5-连通性检查) + +## 1. 安装 maa-cli + +探测:`uname -s`(或 Windows 的 `$env:OS`),以及 `command -v maa` / `command -v maa-cli`。 + +### macOS + +推荐 Homebrew tap: + +```bash +brew install MaaAssistantArknights/tap/maa-cli +``` + +预发行版用 `maa-cli-beta`。Linux 上的 Homebrew 同样走这个 tap。 + +### Linux + +- Arch:`yay -S maa-cli` +- Nix:`nix run nixpkgs#maa-cli`(已依赖 MaaCore,跳过第 2 步的 `maa install`) + +### Windows + +```bat +winget install maa-cli +``` + +此后命令名是 `maa-cli`,不是 `maa`。升级用 `winget update maa-cli`。 + +### 脚本 / 源码 + +系统不受包管理器支持时: + +```bash +curl -fsSL https://raw.githubusercontent.com/MaaAssistantArknights/maa-cli/main/install.sh | bash +``` + +Windows PowerShell: + +```powershell +Invoke-WebRequest -Uri "https://raw.githubusercontent.com/MaaAssistantArknights/maa-cli/main/install.ps1" -OutFile install.ps1; .\install.ps1 +``` + +Rust 开发者:`cargo install maa-cli --git https://github.com/MaaAssistantArknights/maa-cli.git --bin maa --tag stable --locked` + +国内访问 GitHub 失败时,让用户改 `$MAA_CONFIG_DIR/cli.toml` 里的 `api_url` / `download_url` 镜像;镜像字段说明在 [config.md](../../crates/maa-cli/docs/zh-CN/config.md) 的「CLI 相关配置」。 + +## 2. 安装 MaaCore 与资源 + +maa-cli 只是 CLI。没有 Core 就不能跑任务。 + +```bash +maa install +``` + +已装则 `maa update`。热更新资源:`maa hot-update`。即使开了热更新,基础资源仍要随 Core 安装。 + +Windows:在 `install` 之前先装 VC++ 运行库: + +```bat +winget install "Microsoft.VCRedist.2015+.x64" --override "/repair /passive /norestart" --uninstall-previous --accept-package-agreements --force +``` + +包管理器可选 Core(仅当 maa-cli 也是同一包管理器装的): + +- Homebrew:`brew install MaaAssistantArknights/tap/maa-core` +- Arch:`yay -S maa-assistant-arknights` + +`maa install` 下的是官方预编译 Core;包管理器编出来的可能略有差异。 +Core 通道 `Alpha` 只在 Windows 可用。 + +确认:`maa version` 同时列出 maa-cli 与 MaaCore;`maa dir library`、`maa dir resource` 非空。 + +## 3. 游戏运行时(按平台) + +maa-cli 只负责连上已有客户端。游戏、模拟器、PlayCover 都要用户(或你按官方文档协助用户)另行安装。 + +### macOS:PlayCover + PlayTools(iOS 包) + +适用:Apple Silicon 上用 iOS 版明日方舟,追求原生流畅。Intel Mac 更常见的是 Android 模拟器,见下一节。 + +MaaCore 这边:profile 设 `preset = "PlayCover"`。maa-cli 会: + +- 忽略 `adb_path` +- 默认连 `127.0.0.1:1717`(可用 `address` 或 `--addr` 覆盖) +- 强制 `touch_mode = MacPlayTools` +- 加载 iOS 差分资源 +- 在 `startup` 且需要拉起游戏时,用 `open` 打开 PlayCover 容器里的 `.app`(官服 bundle `com.hypergryph.arknights`)。B 服没有 App Store / PlayCover 包。 + +客户端与 PlayTools 不由 maa-cli 安装。按 [MAA macOS 手册 · PlayCover](https://maa.plus/docs/zh-cn/manual/device/macos.html) 做完这些,再让 maa-cli 去连: + +1. 安装手册指定的 PlayCover(MAA 要求用其文档中的 fork,不要假设任意 PlayCover 发行版都能用)。 +2. 在 PlayCover 里安装 iOS 版明日方舟。游戏更新后通常要重新装包。 +3. PlayCover 右键游戏 → 设置 → 绕过:启用 PlayChain、绕过越狱检测、插入内省库、**MaaTools**(即 PlayTools)。 +4. 启动游戏。标题栏出现 `[localhost:端口]` 才算 PlayTools 起来了。把该地址写入 profile(常见 `127.0.0.1:1717`)。 +5. 识别出错时,在 PlayCover 里把分辨率设到 1080p。 +6. 运行期间保持窗口可见:最小化、台前调度切走、移到其它桌面会导致截图失败。 + +交互 `maa init` 选预设 `PlayCover` 时,地址填 PlayTools 的 `host:port`。 + +### macOS:Android 模拟器 + +PlayCover 不是唯一路径。macOS 也可以 ADB 连模拟器,此时用 `ADB` / `MaaTouch`,不用 `MacPlayTools`。 + +|模拟器|maa-cli preset|备注| +|---|---|---| +|MuMu Player Pro|`MuMuPro`|默认 adb:`/Applications/MuMuPlayer.app/Contents/MacOS/MuMuEmulator.app/Contents/MacOS/tools/adb`;默认 `127.0.0.1:16384`| +|BlueStacks Air|`ADB`|开「Android 调试(ADB)」;测试可用 MaaTouch + `127.0.0.1:5555`| +|Android Studio AVD|`ADB`|自带 platform-tools;Android 10+ 上 MiniTouch 在 SELinux Enforcing 下不可用,改 MaaTouch/ADB| +|夜神(Intel)|`ADB`|adb 常在 `/Applications/NoxAppPlayer.app/Contents/MacOS/adb`| + +模拟器必须已启动、ADB 开关已打开。用模拟器自带 `adb devices` 核对 serial,再写入 `address`。 + +### Windows:模拟器 + ADB + +常见路径:模拟器 + ADB。`maa init` 可选 `Androws`(腾讯 Androws,默认 `127.0.0.1:5555`)或通用 `ADB`。 + +- 优先使用模拟器自带 adb,把 `adb_path` 指到那个可执行文件。 +- 端口见 [连接说明](https://maa.plus/docs/zh-cn/manual/connection.html)。 +- 触控:兼容优先 `ADB`;多数模拟器可用 `MaaTouch`。`MacPlayTools` 只给 PlayCover。 + +### Linux:Waydroid / AVD + +- **Waydroid**:profile `preset = "Waydroid"`。仍需本机 `adb`(默认 PATH 里的 `adb`)。maa-cli 会 `waydroid status`,必要时起 session,再 `waydroid adb connect`。分辨率至少 720p 且 16:9,例如: + + ```bash + waydroid prop set persist.waydroid.width 1280 + waydroid prop set persist.waydroid.height 720 + ``` + + 细节:[MAA Linux 手册 · Waydroid](https://maa.plus/docs/zh-cn/manual/device/linux.html) + +- **AVD / 其它**:`preset = "ADB"`,`adb_path` 指向 SDK `platform-tools/adb` 或发行版 `adb`。同样要求 16:9 且 ≥720p。 + +Linux 上跑 MAA 桌面 GUI(Wine)与 maa-cli 是两条线;命令行任务走 maa-cli + 原生 Core。 + +## 4. 写连接 profile + +选哪个 `preset` 见 [SKILL.md · 连接怎么选](SKILL.md#连接怎么选)。本节只写文件模板和触控等字段。 + +目录:`$(maa dir config)/profiles/`。默认名 `default`,扩展名 json/toml/yaml 均可。本次运行换文件:`--profile 名字`。 + +`maa init` 会交互询问预设(`MuMuPro` / `PlayCover` / `Waydroid` / `Androws` / `ADB`)、adb 路径、地址、触控模式。代理无人值守时直接写文件。 + +PlayCover: + +```toml +[connection] +preset = "PlayCover" +address = "127.0.0.1:1717" + +[instance_options] +touch_mode = "MacPlayTools" +``` + +`touch_mode` 即使写错,PlayCover 预设也会被强制改成 `MacPlayTools`。 + +Waydroid: + +```toml +[connection] +preset = "Waydroid" +``` + +通用 ADB(按实际 serial 改 `address`): + +```toml +[connection] +preset = "ADB" +adb_path = "adb" +address = "127.0.0.1:5555" + +[instance_options] +touch_mode = "MaaTouch" +``` + +非简中客户端:在 `startup` 里带 `client_type`,或在 profile 里设 `resource.global_resource`(`YoStarEN` / `YoStarJP` / `YoStarKR` / `txwy`)。iOS / PlayCover 会自动加 `platform_diff_resource = "iOS"`。 + +## 5. 连通性检查 + +按顺序排除,不要跳着改。 + +1. `maa version`:没有 Core → 回到第 2 步。 +2. 游戏或模拟器窗口在前台(PlayCover 尤其不能最小化)。 +3. PlayCover:标题栏有 `[localhost:port]`,profile 地址与之一致。ADB:`"$adb_path" devices` 能看到 `device` 而不是 `offline`。 +4. `maa startup --dry-run` 通过后再去掉 `--dry-run`。需要拉起游戏时:`maa startup Official`(或对应 `client_type`)。 +5. 仍失败:`-v` 或 `MAA_LOG=debug`,日志目录 `maa dir log`。 + +常见失败: + +- 连 `emulator-5554` 但模拟器实际是 `127.0.0.1:16384` 这类端口 → 改 `address` 或 `--addr`。 +- macOS 默认连 ADB,游戏却在 PlayCover 里 → 改 preset。 +- 多设备时 ADB 预设会拿 `adb devices` 的第一台 → 显式写 `address`。 +- MiniTouch + 新 Android 模拟器 → 改 `MaaTouch` 或 `ADB`。