CLI 使用指南
CLI 使用指南
功能介紹
- 執行預定義或自定義的任務,例如
maa fight
,maa run <task>
; - 使用
maa install
和maa update
安裝和更新MaaCore
及資源; - 使用
maa self-update
更新自身。
安裝
Appimage
CLI 是 MAA 在 Linux 平臺的預設介面,你可以直接 下載 最新的 AppImage 包來使用 CLI。
包管理器
macOS
使用 Homebrew 安裝:
brew install MaaAssistantArknights/tap/maa-cli
Linux
Arch Linux 使用者可以安裝 AUR 包:
yay -S maa-cli
❄️ Nix 使用者可以直接執行:
# 穩定版 nix run nixpkgs#maa-cli
# 每夜構建 nix run github:Cryolitia/nur-packages#maa-cli-nightly
穩定版打包至 nixpkgs 中,使用
nixpkgs
中的 Rust 工具鏈;每夜構建位於 NUR 中,使用 Beta channel 的 Rust 工具鏈,由 Github Action 每日自動更新和構建驗證。對於 Linux Brew 使用者,可以使用 Linux Brew 安裝:
brew install MaaAssistantArknights/tap/maa-cli
預編譯二進位制檔案
你可以從 maa-cli
release 頁面下載預編譯的二進位制檔案,將其解壓後得到的可執行檔案放在你喜歡的位置。不同的平臺對應的檔名如下:
作業系統 | 處理器架構 | 檔名 |
---|---|---|
Linux | x86_64 | maa_cli-x86_64-unknown-linux-gnu.tar.gz |
aarch64 | maa_cli-aarch64-unknown-linux-gnu.tar.gz | |
macOS | x86_64 | maa_cli-universal-apple-darwin.zip |
aaarch64 | ||
Windows | x86_64 | maa_cli-x86_64-pc-windows-msvc.zip |
使用
maa-cli
的主要功能是執行任務,你可以透過 maa run <task>
來執行一個任務。這裡的 <task>
是一個任務的名字,你可以透過 maa list
來列出所有可用的任務。
更多資訊可以透過 maa help
獲取。
執行任務
maa-cli
的主要功能是執行任務,包括預定義的任務和自定義的任務。
預定義任務
maa startup [client]
: 啟動遊戲並進入主介面,[client]
是客戶端型別,如果留空則不會啟動遊戲客戶端。maa closedown
: 關閉遊戲客戶端;maa fight [stage]
: 執行戰鬥任務,[stage]
是關卡名稱,例如1-7
;留空選擇上次或者當前關卡;maa copilot <maa_uri>
: 執行自動戰鬥任務,其中<maa_uri>
是作業的 URI,其可以是maa://1234
或者本地檔案路徑./1234.json
;maa roguelike [theme]
: 執行 roguelike 模式的戰鬥任務,[theme]
是 roguelike 模式的主題,可選值為Phantom
,Mizuki
以及Sami
;
自定義任務
你可以透過 maa run <task>
來執行自定義任務。這裡的 <task>
是一個任務的名字,你可以透過 maa list
來列出所有可用的任務。
具體的任務定義可以在 配置小節 中找到。
任務總結
maa-cli
會在任務執行結束後向 stdout 輸出任務總結,包括每個子任務的執行時間和結果。你可以透過 --no-summary
選項來停用任務總結。
任務總結主要包括各任務的執行時間。對於以下任務,還會包括其他資訊:
- 刷理智
fight
: 關卡名稱,次數以及掉落統計; - 基建換班
infrast
: 各設施進駐的幹員,對於製造站和貿易站,還會包括產物型別; - 公招
recruit
: 公招標籤重新整理次數,招募次數以及檢測到的 tag 及星級。 - 肉鴿
roguelike
: 進行的次數,投資的次數。
日誌輸出
maa-cli
預設會向 stderr 輸出日誌。日誌輸出級別從低到高分別為 Error
,Warn
,Info
,Debug
和 Trace
。預設的日誌輸出級別為 Warn
。日誌級別可以透過 MAA_LOG
環境變數來設定,例如 MAA_LOG=debug
。你也可以透過 -v
或者 -q
來增加或者減少日誌輸出級別。
--log-file
選項可以將日誌輸出到檔案中,日誌儲存在 $(maa dir log)/YYYY/MM/DD/HH:MM:SS.log
中,其中 $(maa dir log)
是日誌目錄,你可以透過 maa dir log
獲取。你也可以透過 --log-file=path/to/log
來指定日誌檔案的路徑。
安裝和更新
安裝和更新 MaaCore
你可以透過 maa install
和 maa update
來安裝和更新 MaaCore
及資源,更多資訊可以透過 maa help install
和 maa help update
獲取。
資源熱更新
由於遊戲的更新,MaaCore
需要最新的資源才能正常執行,你可以透過 maa hot-update
來更新資源,或者設定資源自動更新,詳見 CLI 相關配置
更新自身
你可以透過 maa self update
來更新 maa-cli
自身,注意對於由包管理器安裝的 maa-cli
,你應該使用包管理器來更新 maa-cli
。
更多其他的命令可以透過 maa help
獲取。
其他子命令
maa list
: 列出所有可用的任務;maa dir <dir>
: 獲取特定目錄的路徑,比如maa dir config
可以用來獲取配置目錄的路徑;maa version
: 獲取maa-cli
以及MaaCore
的版本資訊;maa convert <input> [output]
: 將JSON
,YAML
或者TOML
格式的檔案轉換為其他格式;maa complete <shell>
: 生成自動補全指令碼;maa activity [client]
: 獲取遊戲的當前活動資訊,client
是客戶端型別,預設為Official
。
配置
配置目錄
maa-cli
配置檔案位於特定的配置目錄中,你可以透過maa dir config
獲取配置目錄。配置目錄也可以透過環境變數 MAA_CONFIG_DIR
更改。在下面的例子中,我們將用 $MAA_CONFIG_DIR
來表示配置目錄。
所有的配置檔案都可以使用 TOML,YAML 或者 JSON 格式,在下面的例子中,我們將使用 TOML 格式,並使用 .toml
作為副檔名。但是你可以混合這三種格式中的任意一種,只要你的副檔名正確。
定義自定義任務
每一個自定義任務都是一個單獨的檔案,它們應該位於 $MAA_CONFIG_DIR/tasks
目錄中。
基本結構
一個任務檔案包含多個子任務,每一個子任務是一個 MAA 任務,其包含一下幾個選項:
[[tasks]]
name = "啟動遊戲" # 任務的名字,可選,預設為任務型別
type = "StartUp" # maa任務的型別
params = { client_type = "Official", start_game_enabled = true } # maa任務的引數
任務條件
如果你想要根據一些條件執行不同引數的任務,你可以定義多個任務的變體:
[[tasks]]
name = "基建換班"
type = "Infrast"
[tasks.params]
mode = 10000
facility = ["Trade", "Reception", "Mfg", "Control", "Power", "Office", "Dorm"]
dorm_trust_enabled = true
filename = "normal.json" # 自定義的基建計劃的檔名應該位於`$MAA_CONFIG_DIR/infrast`
# 在12:00:00之前使用計劃1,在12:00:00到18:00:00之間使用計劃2,在18:00:00之後使用計劃0
[[tasks.variants]]
condition = { type = "Time", end = "12:00:00" } # 如果沒有定義start,那麼它將會是00:00:00
params = { plan_index = 1 }
[[tasks.variants]]
condition = { type = "Time", start = "12:00:00", end = "18:00:00" }
params = { plan_index = 2 }
[[tasks.variants]]
condition = { type = "Time", start = "18:00:00" }
params = { plan_index = 0 }
這裡的 condition
欄位用於確定哪一個變體應該被使用,而匹配的變體的 params
欄位將會被合併到任務的引數中。
注意:如果你的自定義基建計劃檔案使用相對路徑,應該相對於 $MAA_CONFIG_DIR/infrast
。此外,由於基建檔案是由 MaaCore
而不是 maa-cli
讀取的,因此這些檔案的格式必須是 JSON
。同時,maa-cli
不會讀取基建檔案,也不會根據其中定義的時間段來選擇相應的子計劃。因此,必須透過 condition
欄位來指定在相應時間段使用正確的基建計劃的引數中的 plan_index
欄位。這樣可以確保在適當的時間段使用正確的基建計劃。
除了 Time
條件,還有 DateTime
,Weekday
,DayMod
條件。DateTime
條件用於指定一個時間段,Weekday
條件用於指定一週中的某些天,DayMod
見下文多天排班。
[[tasks]]
type = "Fight"
# 在夏活期間,刷SL-8
[[tasks.variants]]
params = { stage = "SL-8" }
condition = { type = "DateTime", start = "2023-08-01T16:00:00", end = "2023-08-21T03:59:59" }
# 在夏活期間以外的週二、週四和週六,刷CE-6
[[tasks.variants]]
condition = { type = "Weekday", weekdays = ["Tue", "Thu", "Sat"] }
params = { stage = "CE-6" }
# 其他時間,刷1-7
[[tasks.variants]]
params = { stage = "1-7" }
除了上述確定的條件之外,還有一個依賴於熱更新資源的條件 OnSideStory
,當你啟動該條件後,maa-cli
會嘗試讀取相應的資源來判斷當前是否有正在開啟的活動,如果有那麼對應的變體會被匹配。 比如上述夏活期間刷 SL-8
的條件就可以簡化為 { type = "OnSideStory", client = "Official" }
,這裡的 client
引數用於確定你使用的客戶端,因為不同的客戶端的活動時間不同,對於使用官服或者 b 服的使用者,這可以省略。透過這個條件,每次活動更新之後你可以只需要更新需要刷的關卡而不需要手動編輯對應活動的開放時間。
除了以上基礎條件之外,你可以使用 { type = "And", conditions = [...] }
,{ type = "Or", conditions = [...] }
, { type = "Not", condition = ... }
來對條件進行邏輯運算。
對於想要基建多天排班的使用者,可以將 DayMod
和 Time
組合使用,可以實現多天排班。比如,你想要實現每兩天換六次班,那麼你可以這樣寫:
[[tasks]]
name = "基建換班 (2天6班)"
type = "Infrast"
[tasks.params]
mode = 10000
facility = ["Trade", "Reception", "Mfg", "Control", "Power", "Office", "Dorm"]
dorm_trust_enabled = true
filename = "normal.json"
# 第一班,第一天 4:00:00 - 12:00:00
[[tasks.variants]]
params = { plan_index = 0 }
[tasks.variants.condition]
type = "And"
conditions = [
# 這裡的 divisor 用來指定週期,remainder 用來指定偏移量
# 偏移量等於 num_days_since_ce % divisor
# 這裡的 num_days_since_ce 是公元以來的天數,0001-01-01 是第一天
# 當天偏移量你可以透過 `maa remainder <divisor>` 來獲取.
# 比如,2024-1-27 是第 738,912 天,那麼 738912 % 2 = 0
# 當天的偏移量為 0,那麼本條件將會被匹配
{ type = "DayMod", divisor = 2, remainder = 0 },
{ type = "Time", start = "04:00:00", end = "12:00:00" },
]
# 第二班,第一天 12:00:00 - 20:00:00
[[tasks.variants]]
params = { plan_index = 1 }
[tasks.variants.condition]
type = "And"
conditions = [
{ type = "DayMod", divisor = 2, remainder = 0 },
{ type = "Time", start = "12:00:00", end = "20:00:00" },
]
# 第三班,第一天 20:00:00 - 第二天 4:00:00
[[tasks.variants]]
params = { plan_index = 2 }
[tasks.variants.condition]
# 注意這裡必須使用 Or 條件,不能直接使用 Time { start = "20:00:00", end = "04:00:00" }
# 在這種情況下, 第二天的 00:00:00 - 04:00:00 不會被匹配
# 當然透過調整你的排班時間避免跨天是更好的選擇,這裡只是為了演示
type = "Or"
conditions = [
{ type = "And", conditions = [
{ type = "DayMod", divisor = 2, remainder = 0 },
{ type = "Time", start = "20:00:00" },
] },
{ type = "And", conditions = [
{ type = "DayMod", divisor = 2, remainder = 1 },
{ type = "Time", end = "04:00:00" },
] },
]
# 第四班,第二天 4:00:00 - 12:00:00
[[tasks.variants]]
params = { plan_index = 3 }
[tasks.variants.condition]
type = "And"
conditions = [
{ type = "DayMod", divisor = 2, remainder = 1 },
{ type = "Time", start = "04:00:00", end = "12:00:00" },
]
# 第五班,第二天 12:00:00 - 20:00:00
[[tasks.variants]]
params = { plan_index = 4 }
[tasks.variants.condition]
type = "And"
conditions = [
{ type = "DayMod", divisor = 2, remainder = 1 },
{ type = "Time", start = "12:00:00", end = "20:00:00" },
]
# 第六班,第二天 20:00:00 - 第三天(新的第一天)4:00:00
[[tasks.variants]]
params = { plan_index = 5 }
[tasks.variants.condition]
type = "Or"
conditions = [
{ type = "And", conditions = [
{ type = "DayMod", divisor = 2, remainder = 1 },
{ type = "Time", start = "20:00:00" },
] },
{ type = "And", conditions = [
{ type = "DayMod", divisor = 2, remainder = 0 },
{ type = "Time", end = "04:00:00" },
] },
]
在預設的策略下,如果有多個變體被匹配,第一個將會被使用。如果沒有給出條件,那麼變體將會總是被匹配,所以你可以把沒有條件的變體放在最後,作為預設的情況。
你可以使用 strategy
欄位來改變匹配策略:
[[tasks]]
type = "Fight"
strategy = "merge" # 或者 "first" (預設)
# 在周天晚上使用所有的將要過期的理智藥
[[tasks.variants]]
params = { expiring_medicine = 1000 }
[tasks.variants.condition]
type = "And"
conditions = [
{ type = "Time", start = "18:00:00" },
{ type = "Weekday", weekdays = ["Sun"] },
]
# 預設刷1-7
[[tasks.variants]]
params = { stage = "1-7" }
# 在週二、週四和週六,刷CE-6
[[tasks.variants]]
condition = { type = "Weekday", weekdays = ["Tue", "Thu", "Sat"] }
params = { stage = "CE-6" }
# 在夏活期間,刷SL-8
[[tasks.variants]]
params = { stage = "SL-8" }
condition = { type = "DateTime", start = "2023-08-01T16:00:00", end = "2023-08-21T03:59:59" }
這個例子和上面的例子將刷同樣的關卡,但是在周天晚上,將會使用所有的將要過期的理智藥。在 merge
策略下,如果有多個變體被匹配,後面的變體的引數將合併入前面的變體的引數中。如果多個變體都有相同的引數,那麼後面的變體的引數將會覆蓋前面的變體的引數。
如果沒有變體被匹配,那麼任務將不會被執行,這可以用於只在特定的條件下執行子任務:
# 只在在18:00:00之後進行信用商店相關的操作
[[tasks]]
type = "Mall"
[[tasks.variants]]
condition = { type = "Time", start = "18:00:00" }
使用者輸入
對於一些任務,你可能想要在執行時輸入一些引數,例如關卡名稱。 你可以將對應需要輸入的引數設定為 Input
或者 Select
型別:
[[tasks]]
type = "Fight"
# 選擇一個關卡
[[tasks.variants]]
condition = { type = "DateTime", start = "2023-08-01T16:00:00", end = "2023-08-21T03:59:59" }
[tasks.variants.params.stage]
# 可選的關卡,必須提供至少一個可選值
# 可選值可以是一個值,也可以是同時包含值和描述的一個表
alternatives = [
"SL-7", # 將被顯示為 "1. SL-7"
{ value = "SL-8", desc = "輕錳礦" } # 將被顯示為 "2. SL-8 (輕錳礦)"
]
default_index = 1 # 預設值的索引,從 1 開始,如果沒有設定,輸入空值將會重新提示輸入
description = "a stage to fight in summer event" # 描述,可選
allow_custom = true # 是否允許輸入自定義的值,預設為 false,如果允許,那麼非整數的值將會被視為自定義的值
# 無需任何輸入
[[tasks.variants]]
condition = { type = "Weekday", weekdays = ["Tue", "Thu", "Sat"] }
params = { stage = "CE-6" }
# 輸入一個關卡
[[tasks.variants]]
[tasks.variants.params.stage]
default = "1-7" # 預設的關卡,可選(如果沒有預設值,輸入空值將會重新提示輸入)
description = "a stage to fight" # 描述,可選
[tasks.variants.params.medicine]
# 依賴的引數,鍵為引數名,值為依賴的引數的預期值
# 當設定時,只有所有的依賴引數都滿足預期值時,這個引數才會被要求輸入
deps = { stage = "1-7" }
default = 1000
description = "medicine to use"
對於 Input
型別,當執行任務時,你將會被提示輸入一個值。如果你輸入了一個空值,如果有預設值,那麼預設值將會被使用,否則你將會被提示重新輸入。
對於 Select
型別,當執行任務時,你將會被提示輸入一個的索引或者自定義的值(如果允許)。如果你輸入了一個空值,如果有預設值,那麼預設值將會被使用,否則你將會被提示重新輸入。
--batch
選項可以用於在執行任務時跳過所有的輸入,這將會使用預設值;如果有任何輸入沒有預設值,那麼將會導致錯誤。
MaaCore 相關配置
和 MaaCore 相關的配置需要放在 $MAA_CONFIG_DIR/asst.toml
中。
目前其包含的配置有:
[connection]
type = "ADB"
adb_path = "adb"
device = "emulator-5554"
config = "CompatMac"
[resource]
global_resource = "YoStarEN"
platform_diff_resource = "iOS"
user_resource = true
[static_options]
cpu_ocr = false
gpu_ocr = 1
[instance_options]
touch_mode = "MAATouch"
deployment_with_pause = false
adb_lite_enabled = false
kill_adb_on_exit = false
連線配置
[connection]
相關欄位用於指定 MaaCore 連線遊戲的方式和引數。目前可用的連線方式有 ADB
和 PlayTools
。
當你使用 ADB
連線時,你需要提供 adb
的路徑和裝置的序列號:
[connection]
type = "ADB"
adb_path = "adb" # adb可執行檔案的路徑
device = "emulator-5554" # 你的android裝置的序列號
config = "General" # maa connect的配置
注意,此處的 device 是任何 adb -s
可以接受的值,比如 emulator-5554
和 127.0.0.1:5555
。
當你使用 PlayTools
連線時,你需要提供 PlayTools
的地址:
[connection]
type = "PlayCover"
address = "localhost:1717" # PlayTools的地址
config = "CompatMac" # maa connect的配置
兩者都需要提供 config
,這個值將被傳給 MaaCore,用於指定一些平臺和模擬器相關的配置。對於 Linux 他預設為 CompatPOSIXShell
,對於 macOS 他預設為 CompatMac
,對於 Windows 他預設為 General
。更多可選配置可以在資原始檔夾中的 config.json
檔案中找到。
資源配置
[resource]
相關欄位用於指定 MaaCore 載入的資源:
[resource]
global_resource = "YoStarEN" # 非中文版本的資源
platform_diff_resource = "iOS" # 非安卓版本的資源
user_resource = true # 是否載入使用者自定義的資源
當使用非簡體中文遊戲客戶端時,由於 MaaCore
預設載入的資源是簡體中文的,你需要指定 global_resource
欄位來載入非中文版本的資源。當使用 iOS 版本的遊戲客戶端時,你需要指定 platform_diff_resource
欄位來載入 iOS 版本的資源。這兩者都是可選的,如果你不需要載入這些資源,你可以將這兩個欄位設定為空。其次,這兩者也會被自動設定,如果你的 startup
任務中指定了 client_type
欄位,那麼 global_resource
將會被設定為對應客戶端的資源,而當你使用 PlayTools
連線時,platform_diff_resource
將會被設定為 iOS
。最後,當你想要載入使用者自定義的資源時,你需要將 user_resource
欄位設定為 true
。
靜態選項
[static_options]
相關欄位用於指定 MaaCore 靜態選項,詳見 整合文件:
[static_options]
cpu_ocr = false # 是否使用 CPU OCR,預設使用 CPU OCR
gpu_ocr = 1 # 使用 GPU OCR 時使用的 GPU ID,如果這個值被留空,那麼將會使用 CPU OCR
例項選項
[instance_options]
相關欄位用於指定 MaaCore 例項的選項,詳見 整合文件:
[instance_options]
touch_mode = "ADB" # 使用的觸控模式,可選值為 "ADB","MiniTouch","MAATouch" 或者 "MacPlayTools"
deployment_with_pause = false # 是否在部署時暫停遊戲
adb_lite_enabled = false # 是否使用 adb-lite
kill_adb_on_exit = false # 是否在退出時殺死 adb
注意,touch_mode
可選項 MacPlayTools
和連線方式 PlayTools
繫結。當你使用 PlayTools
連線時,touch_mode
將會被強制設定為 MacPlayTools
。
maa-cli
相關配置
maa-cli
相關的配置需要放在 $MAA_CONFIG_DIR/cli.toml
中。目前其包含的配置如下:
# MaaCore 安裝和更新相關配置
[core]
channel = "Stable" # 更新通道,可選值為 "Alpha","Beta" "Stable",預設為 "Stable"
test_time = 0 # 用於測試映象速度的時間,0 表示不測試,預設為 3
# 查詢 MaaCore 最新版本的 api 地址,留空表示使用預設地址
api_url = "https://github.com/MaaAssistantArknights/MaaRelease/raw/main/MaaAssistantArknights/api/version/"
# 配置是否安裝 MaaCore 對應的元件,不推薦使用,分開安裝可能會導致版本不一致,從而導致一些問題,該選項可能在未來的版本中移除
[core.components]
library = true # 是否安裝 MaaCore 的庫,預設為 true
resource = true # 是否安裝 MaaCore 的資源,預設為 true
# CLI 更新相關配置
[cli]
channel = "Stable" # 更新通道,可選值為 "Alpha","Beta" "Stable",預設為 "Stable"
# 查詢 maa-cli 最新版本的 api 地址,留空表示使用預設地址
api_url = "https://github.com/MaaAssistantArknights/maa-cli/raw/version/"
# 下載預編譯二進位制檔案的地址,留空表示使用預設地址
download_url = "https://github.com/MaaAssistantArknights/maa-cli/releases/download/"
# 配置是否安裝 maa-cli 對應的元件
[cli.components]
binary = true # 是否安裝 maa-cli 的二進位制檔案,預設為 true
# 資源熱更新相關配置
[resource]
auto_update = true # 是否在每次執行任務時自動更新資源,預設為 false
backend = "libgit2" # 資源熱更新後端,可選值為 "git" 或者 "libgit2",預設為 "git"
# 資源熱更新遠端倉庫相關配置
[resource.remote]
branch = "main" # 遠端倉庫的分支,預設為 "main"
# 遠端倉庫的 url,如果你想要使用 ssh,你必須配置 ssh_key 的路徑
url = "https://github.com/MaaAssistantArknights/MaaResource.git"
# url = "git@github.com:MaaAssistantArknights/MaaResource.git"
# ssh_key = "~/.ssh/id_ed25519" # ssh 私鑰的路徑,支援展開 ~ 但不支援其他環境變數
注意事項:
- MaaCore 的更新通道中
Alpha
只在 Windows 上可用; - 由於 CLI 預設的 API 連結和下載連結都是 GitHub 的連結,因此在國內可能會有一些問題,你可以透過配置
api_url
和download_url
來使用映象。 - 即使啟動了資源熱更新,你依然需要安裝
MaaCore
的資源,因為資源熱更新並不包含所有的資原始檔,只是包含部份可更新的資原始檔,基礎資原始檔仍然需要安裝。 - 資源熱更新是透過 Git 來拉取遠端倉庫,如果後端設定為
git
那麼git
命令列工具必須可用。 - 如果你想要使用 SSH 協議來拉取遠端倉庫,你必須配置
ssh_key
欄位,這個欄位應該是一個路徑,指向你的 SSH 私鑰。 - 遠端倉庫的
url
設定目前只對首次安裝資源有效,如果你想要更改遠端倉庫的地址,你需要透過git
命令列工具手動更改,或者刪除對應的倉庫。倉庫所在位置可以透過maa dir hot-update
獲取。 - 遠端倉庫的
url
會根據你本機的語言自動設定,如果你的語言是簡體中文,那麼遠端倉庫的url
將會被設定為國內的映象https://git.maa-org.net/MAA/MaaResource.git
,在其他情況則會被設定為 Github。如果你在國內但是使用的不是簡體中文,或者在國外使用簡體中文,那麼你可能需要手動設定以獲得最佳的體驗。
JSON Schema
你可以在 CLI 倉庫的 maa-cli/schemas
目錄下找到 maa-cli
的 JSON Schema 檔案,你可以使用這些檔案來驗證你的配置檔案,或者在編輯器中獲得自動補全。
任務檔案的 JSON Schema 檔案為 task.schema.json
;
MaaCore 相關配置的 JSON Schema 檔案為 asst.schema.json
;
CLI 相關配置的 JSON Schema 檔案為 cli.schema.json
。