adb-ready 0.7.0 → 0.8.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/CHANGELOG.md CHANGED
@@ -9,6 +9,14 @@ breaking changes.
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [0.8.0] - 2026-09-29
13
+
14
+ ### Added
15
+
16
+ - Add deterministic, offline shell completion generation for Bash, zsh, fish,
17
+ PowerShell, and Nushell, covering both `adb-ready` and `adbr` without loading
18
+ project configuration or contacting ADB.
19
+
12
20
  ## [0.7.0] - 2026-09-27
13
21
 
14
22
  ### Added
@@ -499,7 +507,8 @@ breaking changes.
499
507
  explainable configuration precedence.
500
508
  - Human, plain, JSON, and NDJSON output across Node, Bun, and Deno entrypoints.
501
509
 
502
- [Unreleased]: https://github.com/Adam014/adb-ready/compare/v0.7.0...HEAD
510
+ [Unreleased]: https://github.com/Adam014/adb-ready/compare/v0.8.0...HEAD
511
+ [0.8.0]: https://github.com/Adam014/adb-ready/compare/v0.7.0...v0.8.0
503
512
  [0.7.0]: https://github.com/Adam014/adb-ready/compare/v0.6.0...v0.7.0
504
513
  [0.6.0]: https://github.com/Adam014/adb-ready/compare/v0.5.1...v0.6.0
505
514
  [0.5.1]: https://github.com/Adam014/adb-ready/compare/v0.5.0...v0.5.1
package/README.md CHANGED
@@ -284,6 +284,7 @@ Android transport backend.
284
284
  | Guide | Start here when you want to… |
285
285
  | --- | --- |
286
286
  | [Getting started](./docs/getting-started.md) | Reach the first ready development session. |
287
+ | [Shell completion](./docs/completions.md) | Enable command discovery in Bash, zsh, fish, PowerShell, or Nushell. |
287
288
  | [Development sessions](./docs/dev-sessions.md) | Configure frameworks, commands, ports, readiness, and cleanup. |
288
289
  | [Targets and Wireless debugging](./docs/targets-and-wireless.md) | Pair, connect, recover, or explicitly select a target. |
289
290
  | [Apps and evidence](./docs/apps-and-evidence.md) | Control the app and capture screenshots or recordings. |
package/dist/cli.js CHANGED
@@ -3304,7 +3304,7 @@ import process15 from "node:process";
3304
3304
  // package.json
3305
3305
  var package_default = {
3306
3306
  name: "adb-ready",
3307
- version: "0.7.0",
3307
+ version: "0.8.0",
3308
3308
  description: "Agent-ready Android CLI for reliable ADB sessions, app automation, and verified evidence.",
3309
3309
  private: false,
3310
3310
  type: "module",
@@ -3403,7 +3403,7 @@ var package_default = {
3403
3403
  "@yarnpkg/cli-dist": "4.18.0",
3404
3404
  npm: "12.0.2",
3405
3405
  publint: "0.3.24",
3406
- runpalette: "0.3.0",
3406
+ runpalette: "0.5.0",
3407
3407
  tinyexec: "1.3.1",
3408
3408
  typescript: "7.0.2",
3409
3409
  yarn: "1.22.22"
@@ -57732,12 +57732,259 @@ function resolveTerminalCapabilities(preferences) {
57732
57732
  };
57733
57733
  }
57734
57734
 
57735
+ // src/cli/completion.ts
57736
+ var COMPLETION_SHELLS = ["bash", "zsh", "fish", "powershell", "nushell"];
57737
+ var COMMANDS = [
57738
+ { name: "agent", description: "Configure a project-local AI agent bridge", values: ["setup"] },
57739
+ {
57740
+ name: "app",
57741
+ description: "Resolve, inspect, install, or control one app",
57742
+ values: ["resolve", "info", "install", "launch", "stop", "restart", "clear-data", "uninstall"]
57743
+ },
57744
+ { name: "apps", description: "List packages on one Android target", values: ["list"] },
57745
+ {
57746
+ name: "capture",
57747
+ description: "Capture verified device evidence",
57748
+ values: ["screenshot", "screen-record"]
57749
+ },
57750
+ { name: "completion", description: "Generate shell completion", values: COMPLETION_SHELLS },
57751
+ {
57752
+ name: "config",
57753
+ description: "Validate or explain configuration",
57754
+ values: ["validate", "explain"]
57755
+ },
57756
+ { name: "connect", description: "Connect a wireless Android target" },
57757
+ { name: "context", description: "Export bounded AI-ready context" },
57758
+ { name: "dev", description: "Start a target-bound development session" },
57759
+ { name: "devices", description: "List visible Android targets" },
57760
+ { name: "doctor", description: "Inspect the local ADB environment" },
57761
+ { name: "help", description: "Show command help" },
57762
+ { name: "init", description: "Create detected project configuration" },
57763
+ {
57764
+ name: "inspect",
57765
+ description: "Build bounded device evidence",
57766
+ values: ["app", "failures", "ui"]
57767
+ },
57768
+ { name: "logs", description: "Stream focused target logs" },
57769
+ { name: "mcp", description: "Serve typed tools over local stdio" },
57770
+ { name: "open", description: "Open a deep link or web URL" },
57771
+ { name: "pair", description: "Pair through Wireless debugging" },
57772
+ { name: "ports", description: "Manage verified TCP mappings", values: ["forward", "reverse"] },
57773
+ { name: "problems", description: "Show saved session problems" },
57774
+ { name: "run", description: "Run one bounded verification job" },
57775
+ { name: "sessions", description: "Inspect saved sessions", values: ["list", "show", "events"] },
57776
+ { name: "test", description: "Run managed Android tests", values: ["gradle", "firebase"] },
57777
+ {
57778
+ name: "ui",
57779
+ description: "Perform a bounded verified UI action",
57780
+ values: [
57781
+ "audit",
57782
+ "find",
57783
+ "get",
57784
+ "assert",
57785
+ "compare",
57786
+ "tap",
57787
+ "long-press",
57788
+ "scroll",
57789
+ "swipe",
57790
+ "fill",
57791
+ "clear",
57792
+ "type",
57793
+ "press",
57794
+ "keyboard",
57795
+ "permission",
57796
+ "wait"
57797
+ ]
57798
+ },
57799
+ { name: "version", description: "Show version" }
57800
+ ];
57801
+ var GLOBAL_OPTIONS = [
57802
+ "--help",
57803
+ "-h",
57804
+ "--version",
57805
+ "-V",
57806
+ "--format",
57807
+ "--json",
57808
+ "--quiet",
57809
+ "--verbose",
57810
+ "--color",
57811
+ "--no-color",
57812
+ "--unicode",
57813
+ "--no-unicode",
57814
+ "--animation",
57815
+ "--no-animation",
57816
+ "--non-interactive",
57817
+ "--timeout",
57818
+ "--adb",
57819
+ "--adb-host",
57820
+ "--adb-port",
57821
+ "--config",
57822
+ "--profile",
57823
+ "--select",
57824
+ "--device",
57825
+ "--serial",
57826
+ "-s",
57827
+ "--transport-id",
57828
+ "--last",
57829
+ "--dry-run"
57830
+ ];
57831
+ var commandNames = () => COMMANDS.map(({ name }) => name).join(" ");
57832
+ var optionNames = () => GLOBAL_OPTIONS.join(" ");
57833
+ function bash() {
57834
+ const cases = COMMANDS.filter(({ values: values2 }) => values2 !== undefined).map(({ name, values: values2 }) => ` ${name}) candidates="${values2?.join(" ")}" ;;`).join(`
57835
+ `);
57836
+ return `# Generated by adb-ready. Source this file from ~/.bashrc.
57837
+ _adb_ready_complete() {
57838
+ local current command candidates
57839
+ COMPREPLY=()
57840
+ current="\${COMP_WORDS[COMP_CWORD]}"
57841
+ command="\${COMP_WORDS[1]}"
57842
+ if [[ \${COMP_CWORD} -eq 1 ]]; then
57843
+ candidates="${commandNames()} ${optionNames()}"
57844
+ elif [[ \${COMP_CWORD} -eq 2 ]]; then
57845
+ case "\${command}" in
57846
+ ${cases}
57847
+ help) candidates="${commandNames()}" ;;
57848
+ *) candidates="${optionNames()}" ;;
57849
+ esac
57850
+ else
57851
+ candidates="${optionNames()}"
57852
+ fi
57853
+ COMPREPLY=( $(compgen -W "\${candidates}" -- "\${current}") )
57854
+ }
57855
+ complete -F _adb_ready_complete adb-ready adbr
57856
+ `;
57857
+ }
57858
+ function zsh() {
57859
+ const commands = COMMANDS.map(({ name, description }) => ` '${name}:${description.replaceAll("'", "'\\''")}'`).join(`
57860
+ `);
57861
+ const cases = COMMANDS.filter(({ values: values2 }) => values2 !== undefined).map(({ name, values: values2 }) => ` ${name}) _values 'action' ${values2?.join(" ")} ;;`).join(`
57862
+ `);
57863
+ return `#compdef adb-ready adbr
57864
+ # Generated by adb-ready. Add its directory to fpath, then run compinit.
57865
+ _adb_ready() {
57866
+ local -a commands
57867
+ commands=(
57868
+ ${commands}
57869
+ )
57870
+ _arguments -C \\
57871
+ '(-h --help)'{-h,--help}'[show help]' \\
57872
+ '(-V --version)'{-V,--version}'[show version]' \\
57873
+ '--format[select output format]:format:(human plain json ndjson)' \\
57874
+ '--json[emit JSON]' \\
57875
+ '--non-interactive[never prompt]' \\
57876
+ '1:command:->command' \\
57877
+ '*::argument:->argument'
57878
+ case $state in
57879
+ command) _describe 'command' commands ;;
57880
+ argument)
57881
+ case $words[2] in
57882
+ ${cases}
57883
+ help) _describe 'command' commands ;;
57884
+ esac
57885
+ ;;
57886
+ esac
57887
+ }
57888
+ _adb_ready "$@"
57889
+ `;
57890
+ }
57891
+ function fish() {
57892
+ const lines = [
57893
+ "# Generated by adb-ready. Save as ~/.config/fish/completions/adb-ready.fish."
57894
+ ];
57895
+ for (const binary of ["adb-ready", "adbr"]) {
57896
+ for (const { name, description } of COMMANDS) {
57897
+ const safeDescription = description.replaceAll("'", "\\'");
57898
+ lines.push(`complete -c ${binary} -f -n '__fish_use_subcommand' -a '${name}' -d '${safeDescription}'`);
57899
+ }
57900
+ for (const { name, values: values2 } of COMMANDS) {
57901
+ if (values2 === undefined)
57902
+ continue;
57903
+ lines.push(`complete -c ${binary} -f -n '__fish_seen_subcommand_from ${name}' -a '${values2.join(" ")}'`);
57904
+ }
57905
+ lines.push(`complete -c ${binary} -s h -l help -d 'Show help'`, `complete -c ${binary} -s V -l version -d 'Show version'`, `complete -c ${binary} -l json -d 'Emit JSON'`, `complete -c ${binary} -l non-interactive -d 'Never prompt'`, `complete -c ${binary} -l dry-run -d 'Plan without mutation'`);
57906
+ }
57907
+ return `${lines.join(`
57908
+ `)}
57909
+ `;
57910
+ }
57911
+ function powershell() {
57912
+ const map = COMMANDS.filter(({ values: values2 }) => values2 !== undefined).map(({ name, values: values2 }) => ` '${name}' = @('${values2?.join("','")}')`).join(`
57913
+ `);
57914
+ return `# Generated by adb-ready. Add this script to your PowerShell profile.
57915
+ $AdbReadyCommands = @('${commandNames().replaceAll(" ", "','")}')
57916
+ $AdbReadyOptions = @('${optionNames().replaceAll(" ", "','")}')
57917
+ $AdbReadyActions = @{
57918
+ ${map}
57919
+ }
57920
+ Register-ArgumentCompleter -Native -CommandName adb-ready,adbr -ScriptBlock {
57921
+ param($wordToComplete, $commandAst, $cursorPosition)
57922
+ $words = $commandAst.CommandElements | ForEach-Object { $_.Extent.Text }
57923
+ $candidates = if ($words.Count -le 1) {
57924
+ $AdbReadyCommands + $AdbReadyOptions
57925
+ } elseif ($words.Count -eq 2 -and $AdbReadyActions.ContainsKey($words[1])) {
57926
+ $AdbReadyActions[$words[1]] + $AdbReadyOptions
57927
+ } elseif ($words[1] -eq 'help') {
57928
+ $AdbReadyCommands
57929
+ } else {
57930
+ $AdbReadyOptions
57931
+ }
57932
+ $candidates | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object {
57933
+ [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
57934
+ }
57935
+ }
57936
+ `;
57937
+ }
57938
+ function nushellExtern(binary) {
57939
+ return `export extern "${binary}" [
57940
+ command?: string@"nu-complete adb-ready commands"
57941
+ ...args: string
57942
+ --help(-h)
57943
+ --version(-V)
57944
+ --json
57945
+ --quiet
57946
+ --verbose
57947
+ --non-interactive
57948
+ --dry-run
57949
+ ]`;
57950
+ }
57951
+ function nushell() {
57952
+ const records = COMMANDS.map(({ name, description }) => ` { value: "${name}", description: "${description}" }`).join(`
57953
+ `);
57954
+ return `# Generated by adb-ready. Source this file from config.nu.
57955
+ def "nu-complete adb-ready commands" [] {
57956
+ [
57957
+ ${records}
57958
+ ]
57959
+ }
57960
+
57961
+ ${nushellExtern("adb-ready")}
57962
+
57963
+ ${nushellExtern("adbr")}
57964
+ `;
57965
+ }
57966
+ function generateCompletion(shell) {
57967
+ switch (shell) {
57968
+ case "bash":
57969
+ return bash();
57970
+ case "zsh":
57971
+ return zsh();
57972
+ case "fish":
57973
+ return fish();
57974
+ case "powershell":
57975
+ return powershell();
57976
+ case "nushell":
57977
+ return nushell();
57978
+ }
57979
+ }
57980
+
57735
57981
  // src/cli/arguments.ts
57736
- var COMMANDS = new Set([
57982
+ var COMMANDS2 = new Set([
57737
57983
  "agent",
57738
57984
  "app",
57739
57985
  "apps",
57740
57986
  "capture",
57987
+ "completion",
57741
57988
  "config",
57742
57989
  "connect",
57743
57990
  "context",
@@ -57887,6 +58134,7 @@ function splitLongOption(argument) {
57887
58134
  function parseArguments(argv) {
57888
58135
  let command;
57889
58136
  let helpTarget;
58137
+ let completionShell;
57890
58138
  let format = "human";
57891
58139
  let quiet = false;
57892
58140
  let verbose = false;
@@ -58024,17 +58272,17 @@ function parseArguments(argv) {
58024
58272
  }
58025
58273
  if (!argument.startsWith("-")) {
58026
58274
  if (command === undefined) {
58027
- if (!COMMANDS.has(argument)) {
58028
- const hint = suggestion(argument, COMMANDS);
58275
+ if (!COMMANDS2.has(argument)) {
58276
+ const hint = suggestion(argument, COMMANDS2);
58029
58277
  return failure4("CLI_USAGE", `Unknown command: ${argument}${hint === "" ? "" : `. ${hint}`}`);
58030
58278
  }
58031
58279
  const candidate = argument;
58032
58280
  command = candidate;
58033
58281
  continue;
58034
58282
  }
58035
- if (command === "help" && COMMANDS.has(argument)) {
58283
+ if (command === "help" && COMMANDS2.has(argument)) {
58036
58284
  const candidate = argument;
58037
- if (candidate === "agent" || candidate === "app" || candidate === "apps" || candidate === "capture" || candidate === "connect" || candidate === "config" || candidate === "context" || candidate === "dev" || candidate === "devices" || candidate === "doctor" || candidate === "logs" || candidate === "mcp" || candidate === "open" || candidate === "init" || candidate === "inspect" || candidate === "pair" || candidate === "ports" || candidate === "problems" || candidate === "run" || candidate === "sessions" || candidate === "test" || candidate === "ui" || candidate === "version") {
58285
+ if (candidate === "agent" || candidate === "app" || candidate === "apps" || candidate === "capture" || candidate === "completion" || candidate === "connect" || candidate === "config" || candidate === "context" || candidate === "dev" || candidate === "devices" || candidate === "doctor" || candidate === "logs" || candidate === "mcp" || candidate === "open" || candidate === "init" || candidate === "inspect" || candidate === "pair" || candidate === "ports" || candidate === "problems" || candidate === "run" || candidate === "sessions" || candidate === "test" || candidate === "ui" || candidate === "version") {
58038
58286
  helpTarget = candidate;
58039
58287
  continue;
58040
58288
  }
@@ -58043,6 +58291,13 @@ function parseArguments(argv) {
58043
58291
  endpoint = argument;
58044
58292
  continue;
58045
58293
  }
58294
+ if (command === "completion" && completionShell === undefined) {
58295
+ if (!COMPLETION_SHELLS.includes(argument)) {
58296
+ return failure4("CLI_INVALID_VALUE", `Invalid completion shell: ${argument}. Expected bash, zsh, fish, powershell, or nushell.`);
58297
+ }
58298
+ completionShell = argument;
58299
+ continue;
58300
+ }
58046
58301
  if (command === "agent" && argument === "setup" && !agentSetupSeen) {
58047
58302
  agentSetupSeen = true;
58048
58303
  continue;
@@ -58927,6 +59182,12 @@ function parseArguments(argv) {
58927
59182
  if (command === "capture" && captureKind === undefined) {
58928
59183
  return failure4("CLI_USAGE", "capture requires screenshot or screen-record.");
58929
59184
  }
59185
+ if (command === "completion" && completionShell === undefined) {
59186
+ return failure4("CLI_USAGE", "completion requires bash, zsh, fish, powershell, or nushell.");
59187
+ }
59188
+ if (command === "completion" && argv.some((argument) => argument !== "completion" && argument !== completionShell)) {
59189
+ return failure4("CLI_USAGE", "completion accepts only one shell name; redirect its exact script output to a file.");
59190
+ }
58930
59191
  if (command === "inspect" && inspectKind === undefined) {
58931
59192
  return failure4("CLI_USAGE", "inspect requires app, failures, or ui.");
58932
59193
  }
@@ -59232,6 +59493,7 @@ function parseArguments(argv) {
59232
59493
  options: {
59233
59494
  command,
59234
59495
  ...helpTarget === undefined ? {} : { helpTarget },
59496
+ ...completionShell === undefined ? {} : { completionShell },
59235
59497
  format,
59236
59498
  quiet,
59237
59499
  verbose,
@@ -59360,6 +59622,7 @@ Commands:
59360
59622
  app ACTION [APP_ID] Resolve, inspect, install, or control one app
59361
59623
  apps list List packages on one Android target
59362
59624
  capture ACTION Save a verified screenshot or bounded screen recording
59625
+ completion SHELL Generate completion for bash, zsh, fish, PowerShell, or Nushell
59363
59626
  config ACTION Validate or explain resolved configuration
59364
59627
  connect [HOST:PORT] Connect and verify a wireless Android target
59365
59628
  context [SESSION] Export bounded AI-ready diagnostic context
@@ -59466,6 +59729,12 @@ Writes verified binary evidence inside the current project. Existing files are
59466
59729
  never replaced unless --force is explicit. Recordings are bounded to 180s.
59467
59730
  Screenshot crops use source pixels. Dimension limits preserve aspect ratio and
59468
59731
  never upscale the image. The CLI keeps full resolution unless limits are set.
59732
+ `,
59733
+ completion: `Usage: adb-ready completion bash|zsh|fish|powershell|nushell
59734
+
59735
+ Prints a static completion script for both adb-ready and adbr. Generation is
59736
+ offline, deterministic, and never loads project configuration or contacts ADB.
59737
+ See docs/completions.md for one-time installation instructions.
59469
59738
  `,
59470
59739
  config: `Usage:
59471
59740
  adb-ready config validate [options]
@@ -60225,6 +60494,10 @@ async function runCliInternal(argv, io, dependencies = {}, signal) {
60225
60494
  });
60226
60495
  return 0 /* Success */;
60227
60496
  }
60497
+ if (options.command === "completion") {
60498
+ io.output.write(generateCompletion(options.completionShell ?? "bash"));
60499
+ return 0 /* Success */;
60500
+ }
60228
60501
  if (options.command === "mcp") {
60229
60502
  const explicitRoot = io.env.ADB_READY_MCP_PROJECT_ROOT?.trim();
60230
60503
  await runMcpStdio({
@@ -61355,4 +61628,4 @@ try {
61355
61628
  process16.removeListener("SIGTERM", abort);
61356
61629
  }
61357
61630
 
61358
- //# debugId=8986C9014073E12364756E2164756E21
61631
+ //# debugId=2AD0AEC355B9989464756E2164756E21
@@ -0,0 +1,61 @@
1
+ # Shell completion
2
+
3
+ ADB Ready generates static tab-completion scripts for both `adb-ready` and its
4
+ short alias, `adbr`. Generation is instant and offline: it does not load project
5
+ configuration, start ADB, or inspect a device.
6
+
7
+ ## Bash
8
+
9
+ ```bash
10
+ mkdir -p ~/.local/share/bash-completion/completions
11
+ adb-ready completion bash > ~/.local/share/bash-completion/completions/adb-ready
12
+ ```
13
+
14
+ Start a new shell. If the user completion directory is not loaded by your Bash
15
+ installation, source the generated file from `~/.bashrc`.
16
+
17
+ ## zsh
18
+
19
+ ```zsh
20
+ mkdir -p ~/.zfunc
21
+ adb-ready completion zsh > ~/.zfunc/_adb-ready
22
+ ```
23
+
24
+ Add the directory before `compinit` in `~/.zshrc`:
25
+
26
+ ```zsh
27
+ fpath=(~/.zfunc $fpath)
28
+ autoload -Uz compinit && compinit
29
+ ```
30
+
31
+ ## fish
32
+
33
+ ```fish
34
+ mkdir -p ~/.config/fish/completions
35
+ adb-ready completion fish > ~/.config/fish/completions/adb-ready.fish
36
+ ```
37
+
38
+ fish loads the file automatically in new shell sessions.
39
+
40
+ ## PowerShell
41
+
42
+ ```powershell
43
+ New-Item -ItemType Directory -Force (Split-Path $PROFILE) | Out-Null
44
+ adb-ready completion powershell | Out-File -Append -Encoding utf8 $PROFILE
45
+ ```
46
+
47
+ Reload the profile with `. $PROFILE` or open a new PowerShell session.
48
+
49
+ ## Nushell
50
+
51
+ ```nu
52
+ mkdir ($nu.data-dir | path join "vendor" "autoload")
53
+ adb-ready completion nushell | save --force ($nu.data-dir | path join "vendor" "autoload" "adb-ready.nu")
54
+ ```
55
+
56
+ Nushell loads vendor autoload files in new sessions. The generated declarations
57
+ complete public commands while preserving ordinary file completion for command
58
+ arguments.
59
+
60
+ Regenerate the script after upgrading ADB Ready so newly added commands become
61
+ available to the shell.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adb-ready",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Agent-ready Android CLI for reliable ADB sessions, app automation, and verified evidence.",
5
5
  "private": false,
6
6
  "type": "module",
@@ -99,7 +99,7 @@
99
99
  "@yarnpkg/cli-dist": "4.18.0",
100
100
  "npm": "12.0.2",
101
101
  "publint": "0.3.24",
102
- "runpalette": "0.3.0",
102
+ "runpalette": "0.5.0",
103
103
  "tinyexec": "1.3.1",
104
104
  "typescript": "7.0.2",
105
105
  "yarn": "1.22.22"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "title": "ADB Ready agent tool contract",
3
3
  "schemaVersion": 1,
4
- "packageVersion": "0.7.0",
4
+ "packageVersion": "0.8.0",
5
5
  "protocolVersion": "2025-11-25",
6
6
  "transport": "stdio",
7
7
  "tools": [
@@ -3,7 +3,7 @@ name: adb-ready
3
3
  description: Prepare, automate, debug, and verify one Android target through the ADB Ready MCP server. Use for Android development sessions, app lifecycle work, UI automation, failure evidence, screenshots, and agent-driven device checks.
4
4
  ---
5
5
 
6
- <!-- Generated by adb-ready 0.7.0; do not edit. -->
6
+ <!-- Generated by adb-ready 0.8.0; do not edit. -->
7
7
 
8
8
  # ADB Ready
9
9
 
@@ -51,4 +51,4 @@ Use the typed `adb-ready` MCP tools. Do not replace them with generic shell or r
51
51
  - `session`: 12 tools
52
52
  - `ui`: 29 tools
53
53
 
54
- Contract: ADB Ready 0.7.0, agent schema v1.
54
+ Contract: ADB Ready 0.8.0, agent schema v1.