@rom-weaver/cli 0.16.1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -61,7 +61,7 @@ Open [rom-weaver.com/apply-patches](https://rom-weaver.com/apply-patches). Add y
61
61
 
62
62
  For offline use, first cache the app and any needed identify packs, cheat databases, and emulator cores. Remote files still need a connection. See [offline behavior](docs/explanation/local-first.md#offline) and [privacy](docs/legal/privacy.md).
63
63
 
64
- Start with [your first patch](docs/tutorials/first-patch.md) to practise on supplied homebrew files. The [browser guides](docs/README.md#in-the-browser) cover applying, creating, bundling, and testing ROM patches.
64
+ Start with [your first patch](docs/tutorials/first-patch.md) to practise on supplied homebrew files. Use the [task chooser](docs/README.md#choose-a-task) for the other browser workflows.
65
65
 
66
66
  ## Self-hosting
67
67
 
@@ -112,25 +112,18 @@ The CLI and browser share one Rust engine. Browser workers and storage add costs
112
112
 
113
113
  ## Features
114
114
 
115
- - **Apply and create patches.** Twenty-one formats, including IPS, BPS, UPS, xdelta/VCDIFF, PPF, RUP, BDF/BSDIFF40, APS, and DCP (Dreamcast), with ordered multi-patch chains, checksum validation when the format or bundle supplies expected values, and cheat-code baking. Three of them (DCP, BSP, and HDiffPatch) can only be applied, not created.
116
- - **Play and test in the browser.** Run supported games with EmulatorJS, including patched output. Keep game saves and save states in browser storage, and import or export them. See [browser testing](docs/how-to/test-roms-in-browser.md) and [supported platforms](docs/reference/formats.md#browser-emulator-support).
117
- - **Use cheat codes.** Select codes from the built-in database or enter your own. Bake supported ROM cheats into a game or export them as a patch. Codes that require runtime memory writes cannot be baked. See [browser cheats](docs/how-to/use-browser-cheats.md).
118
- - **Edit supported game saves.** The beta Save Editor inspects and edits supported fields, validates checksums, and writes an edited copy. Game and layout support is specific; emulator save states are not editable game saves. See the [Save Editor reference](docs/reference/save-editor.md) and [CLI save guide](docs/how-to/cli-save.md).
119
- - **Inspect and extract containers.** ZIP, 7z, RAR, the tar family, CHD, RVZ, Z3DS, CSO, PBP, GCZ, WIA, WBFS, and more, including nested archives.
120
- - **Create format-specific compressed containers.** ZIP, 7z, CHD, RVZ, and Z3DS with codec-aware compression settings. CHD and RVZ outputs are checked for round-trip compatibility with chdman and dolphin-tool.
121
- - **Checksum and verify.** CRC32, MD5, SHA-1, SHA-256, BLAKE3, and friends, with copier-header detection, header repair, and header-aware checksum variants.
122
- - **Trim and restore.** Trimming for NDS, GBA, 3DS, XISO, and RVZ scrub. NDS, GBA, and 3DS can be padded back out. An optional footer records the original length and one padding byte; exact restoration has [limits](docs/how-to/cli-trim.md#make-the-trim-reversible).
123
- - **Share workflows.** Distributable [`rom-weaver-bundle.json`](./docs/rom-weaver-bundle-v2.schema.json) bundles pin patch order, checksums, and output naming so others can replay the exact workflow.
124
- - **Local-first and private.** Everything runs on your machine. The webapp is an installable PWA that works offline with cached assets. Your files are never uploaded, and rom-weaver sends no telemetry.
125
- - **One engine, two frontends.** The same Rust core powers the terminal CLI and the threaded WASM webapp. CLI operation commands can emit line-delimited JSON for scripting.
115
+ - **Change games.** Apply or create patches, arrange patch chains, bake supported cheats, and share patch bundles.
116
+ - **Prepare files.** Identify games and revisions, compare checksums, extract archives, convert containers, compress files, trim padding, and undo PPF3 patches with undo data.
117
+ - **Play and manage progress.** Test supported games in the browser. Import or export emulator saves, edit supported game saves, and create fresh supported saves.
118
+ - **Work locally.** Process files without uploads or accounts. Cached app assets work offline; CLI commands support scripts and JSON output.
126
119
 
127
- The complete format, codec, and checksum compatibility tables are maintained in [Supported formats](./docs/reference/formats.md).
120
+ The [plain-language feature map](docs/reference/features.md) links every feature to its browser or CLI guide. Exact limits live in the [format tables](docs/reference/formats.md), [cheat reference](docs/reference/cheat-database.md), and [save reference](docs/reference/save-editor.md).
128
121
 
129
122
  ## Notices
130
123
 
131
124
  ### Beta status
132
125
 
133
- rom-weaver is beta software and follows Semantic Versioning, but until v1.0, breaking changes may still happen between minor releases. Patching, compressing, extracting, and bundling are covered by automated tests. Hands-on testing happens on macOS and Linux; Windows is covered by hosted CI but has seen much less real-world use, so expect rougher edges there and please report anything Windows-specific. If you rely on the APIs or CLI flags, expect things to be a bit tougher: those interfaces may still change as the project heads toward v1.0. Trim and Tools are still beta, so they are disabled by default in the webapp and can be enabled in Settings. The `rom-weaver-core`, `-checksum`, `-containers`, and `-patches` crates are published to crates.io only so `rom-weaver-cli` can use them. The CLI and the webapp are the supported interfaces; using those crates as libraries in another project is not supported.
126
+ rom-weaver is beta software and follows Semantic Versioning, but until v1.0, breaking changes may still happen between minor releases. Patching, compressing, extracting, and bundling are covered by automated tests. Hands-on testing happens on macOS and Linux; Windows is covered by hosted CI but has seen much less real-world use, so expect rougher edges there and please report anything Windows-specific. If you rely on the APIs or CLI flags, expect things to be a bit tougher: those interfaces may still change as the project heads toward v1.0. Some browser features are hidden behind [the beta setting](docs/how-to/browser-settings.md#enable-beta-tools). The [feature map](docs/reference/features.md#app-and-automation) lists them. The `rom-weaver-core`, `-checksum`, `-containers`, and `-patches` crates are published to crates.io only so `rom-weaver-cli` can use them. The CLI and the webapp are the supported interfaces; using those crates as libraries in another project is not supported.
134
127
 
135
128
  ### First complete public release
136
129
 
@@ -146,7 +139,7 @@ Localized translations are early and may be entirely wrong in places. Manual edi
146
139
 
147
140
  ## Screenshots
148
141
 
149
- [View every screenshot at full size.](./docs/development/screenshots.md)
142
+ [Screenshot inventory and capture instructions.](./docs/development/screenshots.md)
150
143
 
151
144
  <table>
152
145
  <thead>
@@ -197,7 +190,7 @@ Localized translations are early and may be entirely wrong in places. Manual edi
197
190
 
198
191
  ## Documentation
199
192
 
200
- Start with the browser-first [documentation home](https://rom-weaver.com/docs) or the repository [documentation index](./docs/README.md). The web docs include a task and tool picker, guided samples, focused screenshots, and a [FAQ](./docs/faq.md). CLI, deployment, integration, development, architecture, and format references each have their own guides.
193
+ Start with the browser-first [documentation home](https://rom-weaver.com/docs) or the repository [documentation index](./docs/README.md). Both link to the task chooser, feature map, guided samples, and [FAQ](./docs/faq.md). CLI, deployment, integration, development, architecture, and format references have their own pages.
201
194
 
202
195
  ## Contributing and support
203
196
 
@@ -440,6 +440,7 @@ _arguments "${_arguments_options[@]}" : \
440
440
  '(-v --verbose --debug -q --quiet)--log-level=[How much rom-weaver logs to stderr. Separate from the normal output \[default\: warn\]]:LOG_LEVEL:(off error warn info debug trace)' \
441
441
  '--no-extract[Do not look inside archives; identify the file itself]' \
442
442
  '--no-ignore[Also consider files normally skipped inside archives\: readmes, images, checksum sidecars, and OS clutter such as .DS_Store]' \
443
+ '--split-bin[List per-track BIN files for a CD-format CHD]' \
443
444
  '-n[Plan the command without changing files or downloading data]' \
444
445
  '--dry-run[Plan the command without changing files or downloading data]' \
445
446
  '(--jsonl)--json[Print one complete JSON report; progress and diagnostics use stderr]' \
@@ -471,6 +472,7 @@ _arguments "${_arguments_options[@]}" : \
471
472
  '(-v --verbose --debug -q --quiet)--log-level=[How much rom-weaver logs to stderr. Separate from the normal output \[default\: warn\]]:LOG_LEVEL:(off error warn info debug trace)' \
472
473
  '--no-extract[Do not look inside archives; identify the file itself]' \
473
474
  '--no-ignore[Also consider files normally skipped inside archives\: readmes, images, checksum sidecars, and OS clutter such as .DS_Store]' \
475
+ '--split-bin[List per-track BIN files for a CD-format CHD]' \
474
476
  '-n[Plan the command without changing files or downloading data]' \
475
477
  '--dry-run[Plan the command without changing files or downloading data]' \
476
478
  '(--jsonl)--json[Print one complete JSON report; progress and diagnostics use stderr]' \
@@ -1022,6 +1024,7 @@ _arguments "${_arguments_options[@]}" : \
1022
1024
  ;;
1023
1025
  (compress)
1024
1026
  _arguments "${_arguments_options[@]}" : \
1027
+ '*--entry-name=[]:ENTRY_NAMES:_default' \
1025
1028
  '-f+[Output format, such as zip, 7z, chd, rvz, or z3ds \[default\: from the --output extension\]]:FORMAT:(zip 7z chd rvz z3ds)' \
1026
1029
  '--format=[Output format, such as zip, 7z, chd, rvz, or z3ds \[default\: from the --output extension\]]:FORMAT:(zip 7z chd rvz z3ds)' \
1027
1030
  '*--codec=[Compression method to use, as codec or codec\:level (repeatable, comma-separable)]:CODEC:(store deflate zstd lzma lzma2 zlib huff flac cdzs cdlz cdzl cdfl avhuff)' \
@@ -1130,7 +1133,7 @@ _arguments "${_arguments_options[@]}" : \
1130
1133
  '*--expect-out=[Fail unless the patched ROM has this checksum, as in sha1=abc... (repeatable, comma-separable)]:ALGO=HEX:_default' \
1131
1134
  '*--code=[Game Genie or GameShark/Pro Action Replay code to bake into the ROM. Repeat for each code]:CODES:_default' \
1132
1135
  '--code-system=[Console the --code values are for (nes, snes, genesis, 32x, sms, gamegear, sg1000, gameboy, gba, psx), when the ROM header does not say]:CODE_SYSTEM:_default' \
1133
- '--code-kind=[Which cheat scheme the --code values use\: auto, game-genie, gameshark/par, or xploder]:CODE_KIND:_default' \
1136
+ '--code-kind=[Cheat scheme\: auto, game-genie, gameshark/par, xploder, pro-action-rocky, gold-finger, game-shark-v1\[-raw\], or action-replay-v3\[-raw\]]:CODE_KIND:_default' \
1134
1137
  '*--cheat=[Database cheat to use, by record ID or exact description. Repeat for each cheat]:ID_OR_DESCRIPTION:_default' \
1135
1138
  '--cheat-database=[Directory holding manifest.json and the <system>.json cheat shards. Defaults to \$ROM_WEAVER_CHEAT_DATABASE, then the per-user data directory]:DIR:_files' \
1136
1139
  '--cheat-system=[Console the cheat shard is for (nes, snes, genesis, gameboy, gameboy-color, gba), when the ROM header does not say]:SYS:_default' \
@@ -1278,7 +1281,7 @@ _arguments "${_arguments_options[@]}" : \
1278
1281
  '*--expect-out=[Fail unless the patched ROM has this checksum, as in sha1=abc... (repeatable, comma-separable)]:ALGO=HEX:_default' \
1279
1282
  '*--code=[Game Genie or GameShark/Pro Action Replay code to bake into the ROM. Repeat for each code]:CODES:_default' \
1280
1283
  '--code-system=[Console the --code values are for (nes, snes, genesis, 32x, sms, gamegear, sg1000, gameboy, gba, psx), when the ROM header does not say]:CODE_SYSTEM:_default' \
1281
- '--code-kind=[Which cheat scheme the --code values use\: auto, game-genie, gameshark/par, or xploder]:CODE_KIND:_default' \
1284
+ '--code-kind=[Cheat scheme\: auto, game-genie, gameshark/par, xploder, pro-action-rocky, gold-finger, game-shark-v1\[-raw\], or action-replay-v3\[-raw\]]:CODE_KIND:_default' \
1282
1285
  '*--cheat=[Database cheat to use, by record ID or exact description. Repeat for each cheat]:ID_OR_DESCRIPTION:_default' \
1283
1286
  '--cheat-database=[Directory holding manifest.json and the <system>.json cheat shards. Defaults to \$ROM_WEAVER_CHEAT_DATABASE, then the per-user data directory]:DIR:_files' \
1284
1287
  '--cheat-system=[Console the cheat shard is for (nes, snes, genesis, gameboy, gameboy-color, gba), when the ROM header does not say]:SYS:_default' \
@@ -1350,7 +1353,7 @@ _arguments "${_arguments_options[@]}" : \
1350
1353
  '*--expect-out=[Fail unless the patched ROM has this checksum, as in sha1=abc... (repeatable, comma-separable)]:ALGO=HEX:_default' \
1351
1354
  '*--code=[Game Genie or GameShark/Pro Action Replay code to bake into the ROM. Repeat for each code]:CODES:_default' \
1352
1355
  '--code-system=[Console the --code values are for (nes, snes, genesis, 32x, sms, gamegear, sg1000, gameboy, gba, psx), when the ROM header does not say]:CODE_SYSTEM:_default' \
1353
- '--code-kind=[Which cheat scheme the --code values use\: auto, game-genie, gameshark/par, or xploder]:CODE_KIND:_default' \
1356
+ '--code-kind=[Cheat scheme\: auto, game-genie, gameshark/par, xploder, pro-action-rocky, gold-finger, game-shark-v1\[-raw\], or action-replay-v3\[-raw\]]:CODE_KIND:_default' \
1354
1357
  '*--cheat=[Database cheat to use, by record ID or exact description. Repeat for each cheat]:ID_OR_DESCRIPTION:_default' \
1355
1358
  '--cheat-database=[Directory holding manifest.json and the <system>.json cheat shards. Defaults to \$ROM_WEAVER_CHEAT_DATABASE, then the per-user data directory]:DIR:_files' \
1356
1359
  '--cheat-system=[Console the cheat shard is for (nes, snes, genesis, gameboy, gameboy-color, gba), when the ROM header does not say]:SYS:_default' \
@@ -1400,7 +1403,7 @@ _arguments "${_arguments_options[@]}" : \
1400
1403
  '*--assume-in=[Take the original ROM'\''s checksum on trust rather than reading the file, as in crc32=1234abcd (repeatable, comma-separable)]:ALGO=HEX:_default' \
1401
1404
  '*--code=[Build the patch from a Game Genie or GameShark/Pro Action Replay code instead of a second ROM. Repeat for each code; cannot be used with --modified]:CODES:_default' \
1402
1405
  '--code-system=[Console the --code values are for (nes, snes, genesis, 32x, sms, gamegear, sg1000, gameboy, gba, psx), when the ROM header does not say]:CODE_SYSTEM:_default' \
1403
- '--code-kind=[Which cheat scheme the --code values use\: auto, game-genie, gameshark/par, or xploder]:CODE_KIND:_default' \
1406
+ '--code-kind=[Cheat scheme\: auto, game-genie, gameshark/par, xploder, pro-action-rocky, gold-finger, game-shark-v1\[-raw\], or action-replay-v3\[-raw\]]:CODE_KIND:_default' \
1404
1407
  '*--cheat=[Database cheat to use, by record ID or exact description. Repeat for each cheat]:ID_OR_DESCRIPTION:_default' \
1405
1408
  '--cheat-database=[Directory holding manifest.json and the <system>.json cheat shards. Defaults to \$ROM_WEAVER_CHEAT_DATABASE, then the per-user data directory]:DIR:_files' \
1406
1409
  '--cheat-system=[Console the cheat shard is for (nes, snes, genesis, gameboy, gameboy-color, gba), when the ROM header does not say]:SYS:_default' \
@@ -1511,7 +1514,59 @@ _arguments "${_arguments_options[@]}" : \
1511
1514
  (( CURRENT += 1 ))
1512
1515
  curcontext="${curcontext%:*:*}:rom-weaver-save-command-$line[1]:"
1513
1516
  case $line[1] in
1514
- (identify)
1517
+ (list-games)
1518
+ _arguments "${_arguments_options[@]}" : \
1519
+ '(-v --verbose --debug -q --quiet)--log-level=[How much rom-weaver logs to stderr. Separate from the normal output \[default\: warn\]]:LOG_LEVEL:(off error warn info debug trace)' \
1520
+ '-n[Plan the command without changing files or downloading data]' \
1521
+ '--dry-run[Plan the command without changing files or downloading data]' \
1522
+ '(--jsonl)--json[Print one complete JSON report; progress and diagnostics use stderr]' \
1523
+ '(--json)--jsonl[Stream JSON events, including progress, one object per line]' \
1524
+ '(--no-progress)--progress[Show progress on stderr (off by default; JSONL includes progress)]' \
1525
+ '(--progress)--no-progress[Hide progress]' \
1526
+ '(--log-level --debug)*-v[Show user diagnostics on stderr; repeat for developer detail (-vv debug, -vvv trace)]' \
1527
+ '(--log-level --debug)*--verbose[Show user diagnostics on stderr; repeat for developer detail (-vv debug, -vvv trace)]' \
1528
+ '(--log-level -v --verbose -q --quiet)--debug[Show developer diagnostics and trace events on stderr (same as -vvv)]' \
1529
+ '(--log-level --debug)-q[Hide optional diagnostics and progress; keep results, warnings, and errors]' \
1530
+ '(--log-level --debug)--quiet[Hide optional diagnostics and progress; keep results, warnings, and errors]' \
1531
+ '--dep-trace[Also log trace output from bundled libraries (for bug reports)]' \
1532
+ '(--no-color)--color[Keep colors even when output is piped]' \
1533
+ '(--color)--no-color[Turn colors off]' \
1534
+ '-y[Answer yes to every confirmation instead of asking. Does not choose between candidates]' \
1535
+ '--yes[Answer yes to every confirmation instead of asking. Does not choose between candidates]' \
1536
+ '-h[Print help]' \
1537
+ '--help[Print help]' \
1538
+ && ret=0
1539
+ ;;
1540
+ (create)
1541
+ _arguments "${_arguments_options[@]}" : \
1542
+ '--game=[Game to generate or use with a template]:GAME_ID:_default' \
1543
+ '--template=[Existing save to copy before setting fields]:SAVE:_files' \
1544
+ '-o+[Where to write the new save]:PATH:_files' \
1545
+ '--output=[Where to write the new save]:PATH:_files' \
1546
+ '(-v --verbose --debug -q --quiet)--log-level=[How much rom-weaver logs to stderr. Separate from the normal output \[default\: warn\]]:LOG_LEVEL:(off error warn info debug trace)' \
1547
+ '-n[Check the new save without writing it]' \
1548
+ '--dry-run[Check the new save without writing it]' \
1549
+ '--force[Replace an existing output file]' \
1550
+ '(--jsonl)--json[Print one complete JSON report; progress and diagnostics use stderr]' \
1551
+ '(--json)--jsonl[Stream JSON events, including progress, one object per line]' \
1552
+ '(--no-progress)--progress[Show progress on stderr (off by default; JSONL includes progress)]' \
1553
+ '(--progress)--no-progress[Hide progress]' \
1554
+ '(--log-level --debug)*-v[Show user diagnostics on stderr; repeat for developer detail (-vv debug, -vvv trace)]' \
1555
+ '(--log-level --debug)*--verbose[Show user diagnostics on stderr; repeat for developer detail (-vv debug, -vvv trace)]' \
1556
+ '(--log-level -v --verbose -q --quiet)--debug[Show developer diagnostics and trace events on stderr (same as -vvv)]' \
1557
+ '(--log-level --debug)-q[Hide optional diagnostics and progress; keep results, warnings, and errors]' \
1558
+ '(--log-level --debug)--quiet[Hide optional diagnostics and progress; keep results, warnings, and errors]' \
1559
+ '--dep-trace[Also log trace output from bundled libraries (for bug reports)]' \
1560
+ '(--no-color)--color[Keep colors even when output is piped]' \
1561
+ '(--color)--no-color[Turn colors off]' \
1562
+ '-y[Answer yes to every confirmation instead of asking. Does not choose between candidates]' \
1563
+ '--yes[Answer yes to every confirmation instead of asking. Does not choose between candidates]' \
1564
+ '-h[Print help]' \
1565
+ '--help[Print help]' \
1566
+ '*::assignments -- Save property to set in the new file:_default' \
1567
+ && ret=0
1568
+ ;;
1569
+ (identify)
1515
1570
  _arguments "${_arguments_options[@]}" : \
1516
1571
  '--game=[Force a game id instead of detecting one]:GAME_ID:_default' \
1517
1572
  '--rom-sha1=[SHA-1 of the matching ROM, used to pick a game]:SHA1:_default' \
@@ -1658,7 +1713,15 @@ _arguments "${_arguments_options[@]}" : \
1658
1713
  (( CURRENT += 1 ))
1659
1714
  curcontext="${curcontext%:*:*}:rom-weaver-save-help-command-$line[1]:"
1660
1715
  case $line[1] in
1661
- (identify)
1716
+ (list-games)
1717
+ _arguments "${_arguments_options[@]}" : \
1718
+ && ret=0
1719
+ ;;
1720
+ (create)
1721
+ _arguments "${_arguments_options[@]}" : \
1722
+ && ret=0
1723
+ ;;
1724
+ (identify)
1662
1725
  _arguments "${_arguments_options[@]}" : \
1663
1726
  && ret=0
1664
1727
  ;;
@@ -1977,7 +2040,15 @@ _arguments "${_arguments_options[@]}" : \
1977
2040
  (( CURRENT += 1 ))
1978
2041
  curcontext="${curcontext%:*:*}:rom-weaver-help-save-command-$line[1]:"
1979
2042
  case $line[1] in
1980
- (identify)
2043
+ (list-games)
2044
+ _arguments "${_arguments_options[@]}" : \
2045
+ && ret=0
2046
+ ;;
2047
+ (create)
2048
+ _arguments "${_arguments_options[@]}" : \
2049
+ && ret=0
2050
+ ;;
2051
+ (identify)
1981
2052
  _arguments "${_arguments_options[@]}" : \
1982
2053
  && ret=0
1983
2054
  ;;
@@ -2343,6 +2414,8 @@ _rom-weaver__subcmd__help__subcmd__probe_commands() {
2343
2414
  (( $+functions[_rom-weaver__subcmd__help__subcmd__save_commands] )) ||
2344
2415
  _rom-weaver__subcmd__help__subcmd__save_commands() {
2345
2416
  local commands; commands=(
2417
+ 'list-games:List supported games and fresh save generation support' \
2418
+ 'create:Create a fresh save or a copy of an existing save template' \
2346
2419
  'identify:Identify a supported game save without changing it' \
2347
2420
  'inspect:Show the sections and fields in a supported game save' \
2348
2421
  'get:Read one field from a supported game save' \
@@ -2351,6 +2424,11 @@ _rom-weaver__subcmd__help__subcmd__save_commands() {
2351
2424
  )
2352
2425
  _describe -t commands 'rom-weaver help save commands' commands "$@"
2353
2426
  }
2427
+ (( $+functions[_rom-weaver__subcmd__help__subcmd__save__subcmd__create_commands] )) ||
2428
+ _rom-weaver__subcmd__help__subcmd__save__subcmd__create_commands() {
2429
+ local commands; commands=()
2430
+ _describe -t commands 'rom-weaver help save create commands' commands "$@"
2431
+ }
2354
2432
  (( $+functions[_rom-weaver__subcmd__help__subcmd__save__subcmd__export-schema_commands] )) ||
2355
2433
  _rom-weaver__subcmd__help__subcmd__save__subcmd__export-schema_commands() {
2356
2434
  local commands; commands=()
@@ -2371,6 +2449,11 @@ _rom-weaver__subcmd__help__subcmd__save__subcmd__inspect_commands() {
2371
2449
  local commands; commands=()
2372
2450
  _describe -t commands 'rom-weaver help save inspect commands' commands "$@"
2373
2451
  }
2452
+ (( $+functions[_rom-weaver__subcmd__help__subcmd__save__subcmd__list-games_commands] )) ||
2453
+ _rom-weaver__subcmd__help__subcmd__save__subcmd__list-games_commands() {
2454
+ local commands; commands=()
2455
+ _describe -t commands 'rom-weaver help save list-games commands' commands "$@"
2456
+ }
2374
2457
  (( $+functions[_rom-weaver__subcmd__help__subcmd__save__subcmd__set_commands] )) ||
2375
2458
  _rom-weaver__subcmd__help__subcmd__save__subcmd__set_commands() {
2376
2459
  local commands; commands=()
@@ -2690,6 +2773,8 @@ _rom-weaver__subcmd__probe_commands() {
2690
2773
  (( $+functions[_rom-weaver__subcmd__save_commands] )) ||
2691
2774
  _rom-weaver__subcmd__save_commands() {
2692
2775
  local commands; commands=(
2776
+ 'list-games:List supported games and fresh save generation support' \
2777
+ 'create:Create a fresh save or a copy of an existing save template' \
2693
2778
  'identify:Identify a supported game save without changing it' \
2694
2779
  'inspect:Show the sections and fields in a supported game save' \
2695
2780
  'get:Read one field from a supported game save' \
@@ -2699,6 +2784,11 @@ _rom-weaver__subcmd__save_commands() {
2699
2784
  )
2700
2785
  _describe -t commands 'rom-weaver save commands' commands "$@"
2701
2786
  }
2787
+ (( $+functions[_rom-weaver__subcmd__save__subcmd__create_commands] )) ||
2788
+ _rom-weaver__subcmd__save__subcmd__create_commands() {
2789
+ local commands; commands=()
2790
+ _describe -t commands 'rom-weaver save create commands' commands "$@"
2791
+ }
2702
2792
  (( $+functions[_rom-weaver__subcmd__save__subcmd__export-schema_commands] )) ||
2703
2793
  _rom-weaver__subcmd__save__subcmd__export-schema_commands() {
2704
2794
  local commands; commands=()
@@ -2712,6 +2802,8 @@ _rom-weaver__subcmd__save__subcmd__get_commands() {
2712
2802
  (( $+functions[_rom-weaver__subcmd__save__subcmd__help_commands] )) ||
2713
2803
  _rom-weaver__subcmd__save__subcmd__help_commands() {
2714
2804
  local commands; commands=(
2805
+ 'list-games:List supported games and fresh save generation support' \
2806
+ 'create:Create a fresh save or a copy of an existing save template' \
2715
2807
  'identify:Identify a supported game save without changing it' \
2716
2808
  'inspect:Show the sections and fields in a supported game save' \
2717
2809
  'get:Read one field from a supported game save' \
@@ -2721,6 +2813,11 @@ _rom-weaver__subcmd__save__subcmd__help_commands() {
2721
2813
  )
2722
2814
  _describe -t commands 'rom-weaver save help commands' commands "$@"
2723
2815
  }
2816
+ (( $+functions[_rom-weaver__subcmd__save__subcmd__help__subcmd__create_commands] )) ||
2817
+ _rom-weaver__subcmd__save__subcmd__help__subcmd__create_commands() {
2818
+ local commands; commands=()
2819
+ _describe -t commands 'rom-weaver save help create commands' commands "$@"
2820
+ }
2724
2821
  (( $+functions[_rom-weaver__subcmd__save__subcmd__help__subcmd__export-schema_commands] )) ||
2725
2822
  _rom-weaver__subcmd__save__subcmd__help__subcmd__export-schema_commands() {
2726
2823
  local commands; commands=()
@@ -2746,6 +2843,11 @@ _rom-weaver__subcmd__save__subcmd__help__subcmd__inspect_commands() {
2746
2843
  local commands; commands=()
2747
2844
  _describe -t commands 'rom-weaver save help inspect commands' commands "$@"
2748
2845
  }
2846
+ (( $+functions[_rom-weaver__subcmd__save__subcmd__help__subcmd__list-games_commands] )) ||
2847
+ _rom-weaver__subcmd__save__subcmd__help__subcmd__list-games_commands() {
2848
+ local commands; commands=()
2849
+ _describe -t commands 'rom-weaver save help list-games commands' commands "$@"
2850
+ }
2749
2851
  (( $+functions[_rom-weaver__subcmd__save__subcmd__help__subcmd__set_commands] )) ||
2750
2852
  _rom-weaver__subcmd__save__subcmd__help__subcmd__set_commands() {
2751
2853
  local commands; commands=()
@@ -2761,6 +2863,11 @@ _rom-weaver__subcmd__save__subcmd__inspect_commands() {
2761
2863
  local commands; commands=()
2762
2864
  _describe -t commands 'rom-weaver save inspect commands' commands "$@"
2763
2865
  }
2866
+ (( $+functions[_rom-weaver__subcmd__save__subcmd__list-games_commands] )) ||
2867
+ _rom-weaver__subcmd__save__subcmd__list-games_commands() {
2868
+ local commands; commands=()
2869
+ _describe -t commands 'rom-weaver save list-games commands' commands "$@"
2870
+ }
2764
2871
  (( $+functions[_rom-weaver__subcmd__save__subcmd__set_commands] )) ||
2765
2872
  _rom-weaver__subcmd__save__subcmd__set_commands() {
2766
2873
  local commands; commands=()
@@ -205,6 +205,9 @@ _rom__weaver() {
205
205
  rom__weaver__subcmd__help__subcmd__patch,validate)
206
206
  cmd="rom__weaver__subcmd__help__subcmd__patch__subcmd__validate"
207
207
  ;;
208
+ rom__weaver__subcmd__help__subcmd__save,create)
209
+ cmd="rom__weaver__subcmd__help__subcmd__save__subcmd__create"
210
+ ;;
208
211
  rom__weaver__subcmd__help__subcmd__save,export-schema)
209
212
  cmd="rom__weaver__subcmd__help__subcmd__save__subcmd__export__subcmd__schema"
210
213
  ;;
@@ -217,6 +220,9 @@ _rom__weaver() {
217
220
  rom__weaver__subcmd__help__subcmd__save,inspect)
218
221
  cmd="rom__weaver__subcmd__help__subcmd__save__subcmd__inspect"
219
222
  ;;
223
+ rom__weaver__subcmd__help__subcmd__save,list-games)
224
+ cmd="rom__weaver__subcmd__help__subcmd__save__subcmd__list__subcmd__games"
225
+ ;;
220
226
  rom__weaver__subcmd__help__subcmd__save,set)
221
227
  cmd="rom__weaver__subcmd__help__subcmd__save__subcmd__set"
222
228
  ;;
@@ -349,6 +355,9 @@ _rom__weaver() {
349
355
  rom__weaver__subcmd__patch__subcmd__help,validate)
350
356
  cmd="rom__weaver__subcmd__patch__subcmd__help__subcmd__validate"
351
357
  ;;
358
+ rom__weaver__subcmd__save,create)
359
+ cmd="rom__weaver__subcmd__save__subcmd__create"
360
+ ;;
352
361
  rom__weaver__subcmd__save,export-schema)
353
362
  cmd="rom__weaver__subcmd__save__subcmd__export__subcmd__schema"
354
363
  ;;
@@ -364,9 +373,15 @@ _rom__weaver() {
364
373
  rom__weaver__subcmd__save,inspect)
365
374
  cmd="rom__weaver__subcmd__save__subcmd__inspect"
366
375
  ;;
376
+ rom__weaver__subcmd__save,list-games)
377
+ cmd="rom__weaver__subcmd__save__subcmd__list__subcmd__games"
378
+ ;;
367
379
  rom__weaver__subcmd__save,set)
368
380
  cmd="rom__weaver__subcmd__save__subcmd__set"
369
381
  ;;
382
+ rom__weaver__subcmd__save__subcmd__help,create)
383
+ cmd="rom__weaver__subcmd__save__subcmd__help__subcmd__create"
384
+ ;;
370
385
  rom__weaver__subcmd__save__subcmd__help,export-schema)
371
386
  cmd="rom__weaver__subcmd__save__subcmd__help__subcmd__export__subcmd__schema"
372
387
  ;;
@@ -382,6 +397,9 @@ _rom__weaver() {
382
397
  rom__weaver__subcmd__save__subcmd__help,inspect)
383
398
  cmd="rom__weaver__subcmd__save__subcmd__help__subcmd__inspect"
384
399
  ;;
400
+ rom__weaver__subcmd__save__subcmd__help,list-games)
401
+ cmd="rom__weaver__subcmd__save__subcmd__help__subcmd__list__subcmd__games"
402
+ ;;
385
403
  rom__weaver__subcmd__save__subcmd__help,set)
386
404
  cmd="rom__weaver__subcmd__save__subcmd__help__subcmd__set"
387
405
  ;;
@@ -874,12 +892,16 @@ _rom__weaver() {
874
892
  return 0
875
893
  ;;
876
894
  rom__subcmd__weaver__subcmd__compress)
877
- opts="-f -j -i -o -n -v -q -y -h --format --codec --level --force --threads --stdin-name --input --output --dry-run --json --jsonl --progress --no-progress --log-level --verbose --debug --quiet --dep-trace --color --no-color --yes --help"
895
+ opts="-f -j -i -o -n -v -q -y -h --entry-name --format --codec --level --force --threads --stdin-name --input --output --dry-run --json --jsonl --progress --no-progress --log-level --verbose --debug --quiet --dep-trace --color --no-color --yes --help"
878
896
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
879
897
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
880
898
  return 0
881
899
  fi
882
900
  case "${prev}" in
901
+ --entry-name)
902
+ COMPREPLY=($(compgen -f "${cur}"))
903
+ return 0
904
+ ;;
883
905
  --format)
884
906
  COMPREPLY=($(compgen -W "zip 7z chd rvz z3ds" -- "${cur}"))
885
907
  return 0
@@ -1458,7 +1480,7 @@ _rom__weaver() {
1458
1480
  return 0
1459
1481
  ;;
1460
1482
  rom__subcmd__weaver__subcmd__help__subcmd__save)
1461
- opts="identify inspect get export-schema set"
1483
+ opts="list-games create identify inspect get export-schema set"
1462
1484
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
1463
1485
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
1464
1486
  return 0
@@ -1471,6 +1493,20 @@ _rom__weaver() {
1471
1493
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
1472
1494
  return 0
1473
1495
  ;;
1496
+ rom__subcmd__weaver__subcmd__help__subcmd__save__subcmd__create)
1497
+ opts=""
1498
+ if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then
1499
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
1500
+ return 0
1501
+ fi
1502
+ case "${prev}" in
1503
+ *)
1504
+ COMPREPLY=()
1505
+ ;;
1506
+ esac
1507
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
1508
+ return 0
1509
+ ;;
1474
1510
  rom__subcmd__weaver__subcmd__help__subcmd__save__subcmd__export__subcmd__schema)
1475
1511
  opts=""
1476
1512
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then
@@ -1527,6 +1563,20 @@ _rom__weaver() {
1527
1563
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
1528
1564
  return 0
1529
1565
  ;;
1566
+ rom__subcmd__weaver__subcmd__help__subcmd__save__subcmd__list__subcmd__games)
1567
+ opts=""
1568
+ if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then
1569
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
1570
+ return 0
1571
+ fi
1572
+ case "${prev}" in
1573
+ *)
1574
+ COMPREPLY=()
1575
+ ;;
1576
+ esac
1577
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
1578
+ return 0
1579
+ ;;
1530
1580
  rom__subcmd__weaver__subcmd__help__subcmd__save__subcmd__set)
1531
1581
  opts=""
1532
1582
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then
@@ -2840,7 +2890,7 @@ _rom__weaver() {
2840
2890
  return 0
2841
2891
  ;;
2842
2892
  rom__subcmd__weaver__subcmd__probe)
2843
- opts="-s -i -n -v -q -y -h --select --filter --no-extract --no-ignore --input --dry-run --json --jsonl --progress --no-progress --log-level --verbose --debug --quiet --dep-trace --color --no-color --yes --help"
2893
+ opts="-s -i -n -v -q -y -h --select --filter --no-extract --no-ignore --split-bin --input --dry-run --json --jsonl --progress --no-progress --log-level --verbose --debug --quiet --dep-trace --color --no-color --yes --help"
2844
2894
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
2845
2895
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
2846
2896
  return 0
@@ -2878,7 +2928,7 @@ _rom__weaver() {
2878
2928
  return 0
2879
2929
  ;;
2880
2930
  rom__subcmd__weaver__subcmd__save)
2881
- opts="-n -v -q -y -h --dry-run --json --jsonl --progress --no-progress --log-level --verbose --debug --quiet --dep-trace --color --no-color --yes --help identify inspect get export-schema set help"
2931
+ opts="-n -v -q -y -h --dry-run --json --jsonl --progress --no-progress --log-level --verbose --debug --quiet --dep-trace --color --no-color --yes --help list-games create identify inspect get export-schema set help"
2882
2932
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then
2883
2933
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
2884
2934
  return 0
@@ -2895,6 +2945,40 @@ _rom__weaver() {
2895
2945
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
2896
2946
  return 0
2897
2947
  ;;
2948
+ rom__subcmd__weaver__subcmd__save__subcmd__create)
2949
+ opts="-o -n -v -q -y -h --game --template --output --dry-run --force --json --jsonl --progress --no-progress --log-level --verbose --debug --quiet --dep-trace --color --no-color --yes --help"
2950
+ if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
2951
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
2952
+ return 0
2953
+ fi
2954
+ case "${prev}" in
2955
+ --game)
2956
+ COMPREPLY=($(compgen -f "${cur}"))
2957
+ return 0
2958
+ ;;
2959
+ --template)
2960
+ COMPREPLY=($(compgen -f "${cur}"))
2961
+ return 0
2962
+ ;;
2963
+ --output)
2964
+ COMPREPLY=($(compgen -f "${cur}"))
2965
+ return 0
2966
+ ;;
2967
+ -o)
2968
+ COMPREPLY=($(compgen -f "${cur}"))
2969
+ return 0
2970
+ ;;
2971
+ --log-level)
2972
+ COMPREPLY=($(compgen -W "off error warn info debug trace" -- "${cur}"))
2973
+ return 0
2974
+ ;;
2975
+ *)
2976
+ COMPREPLY=()
2977
+ ;;
2978
+ esac
2979
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
2980
+ return 0
2981
+ ;;
2898
2982
  rom__subcmd__weaver__subcmd__save__subcmd__export__subcmd__schema)
2899
2983
  opts="-n -v -q -y -h --game --rom-sha1 --dry-run --json --jsonl --progress --no-progress --log-level --verbose --debug --quiet --dep-trace --color --no-color --yes --help"
2900
2984
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
@@ -2948,7 +3032,7 @@ _rom__weaver() {
2948
3032
  return 0
2949
3033
  ;;
2950
3034
  rom__subcmd__weaver__subcmd__save__subcmd__help)
2951
- opts="identify inspect get export-schema set help"
3035
+ opts="list-games create identify inspect get export-schema set help"
2952
3036
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
2953
3037
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
2954
3038
  return 0
@@ -2961,6 +3045,20 @@ _rom__weaver() {
2961
3045
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
2962
3046
  return 0
2963
3047
  ;;
3048
+ rom__subcmd__weaver__subcmd__save__subcmd__help__subcmd__create)
3049
+ opts=""
3050
+ if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then
3051
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
3052
+ return 0
3053
+ fi
3054
+ case "${prev}" in
3055
+ *)
3056
+ COMPREPLY=()
3057
+ ;;
3058
+ esac
3059
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
3060
+ return 0
3061
+ ;;
2964
3062
  rom__subcmd__weaver__subcmd__save__subcmd__help__subcmd__export__subcmd__schema)
2965
3063
  opts=""
2966
3064
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then
@@ -3031,6 +3129,20 @@ _rom__weaver() {
3031
3129
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
3032
3130
  return 0
3033
3131
  ;;
3132
+ rom__subcmd__weaver__subcmd__save__subcmd__help__subcmd__list__subcmd__games)
3133
+ opts=""
3134
+ if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then
3135
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
3136
+ return 0
3137
+ fi
3138
+ case "${prev}" in
3139
+ *)
3140
+ COMPREPLY=()
3141
+ ;;
3142
+ esac
3143
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
3144
+ return 0
3145
+ ;;
3034
3146
  rom__subcmd__weaver__subcmd__save__subcmd__help__subcmd__set)
3035
3147
  opts=""
3036
3148
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then
@@ -3097,6 +3209,24 @@ _rom__weaver() {
3097
3209
  COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
3098
3210
  return 0
3099
3211
  ;;
3212
+ rom__subcmd__weaver__subcmd__save__subcmd__list__subcmd__games)
3213
+ opts="-n -v -q -y -h --dry-run --json --jsonl --progress --no-progress --log-level --verbose --debug --quiet --dep-trace --color --no-color --yes --help"
3214
+ if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then
3215
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
3216
+ return 0
3217
+ fi
3218
+ case "${prev}" in
3219
+ --log-level)
3220
+ COMPREPLY=($(compgen -W "off error warn info debug trace" -- "${cur}"))
3221
+ return 0
3222
+ ;;
3223
+ *)
3224
+ COMPREPLY=()
3225
+ ;;
3226
+ esac
3227
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
3228
+ return 0
3229
+ ;;
3100
3230
  rom__subcmd__weaver__subcmd__save__subcmd__set)
3101
3231
  opts="-n -o -v -q -y -h --game --rom-sha1 --dry-run --force --output --json --jsonl --progress --no-progress --log-level --verbose --debug --quiet --dep-trace --color --no-color --yes --help"
3102
3232
  if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then