espercli 0.0.16__tar.gz → 0.0.17__tar.gz

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.
Files changed (108) hide show
  1. {espercli-0.0.16 → espercli-0.0.17}/CHANGELOG.md +5 -1
  2. espercli-0.0.17/PKG-INFO +415 -0
  3. espercli-0.0.17/README.md +400 -0
  4. espercli-0.0.17/esper/cli/__init__.py +1 -0
  5. espercli-0.0.17/esper/cli/app.py +224 -0
  6. espercli-0.0.17/esper/cli/application.py +328 -0
  7. espercli-0.0.17/esper/cli/commandsv2.py +530 -0
  8. espercli-0.0.17/esper/cli/completions.py +174 -0
  9. espercli-0.0.17/esper/cli/configure.py +92 -0
  10. espercli-0.0.17/esper/cli/content.py +252 -0
  11. espercli-0.0.17/esper/cli/device.py +487 -0
  12. espercli-0.0.17/esper/cli/device_command.py +299 -0
  13. espercli-0.0.17/esper/cli/enterprise.py +128 -0
  14. espercli-0.0.17/esper/cli/execute.py +225 -0
  15. espercli-0.0.17/esper/cli/fleet.py +102 -0
  16. espercli-0.0.17/esper/cli/group.py +616 -0
  17. espercli-0.0.17/esper/cli/group_command.py +226 -0
  18. espercli-0.0.17/esper/cli/heartbeat.py +174 -0
  19. espercli-0.0.17/esper/cli/installs.py +103 -0
  20. espercli-0.0.17/esper/cli/location.py +164 -0
  21. espercli-0.0.17/esper/cli/operation.py +261 -0
  22. espercli-0.0.17/esper/cli/output.py +246 -0
  23. espercli-0.0.17/esper/cli/pipeline.py +217 -0
  24. espercli-0.0.17/esper/cli/policy.py +100 -0
  25. espercli-0.0.17/esper/cli/report_html.py +595 -0
  26. espercli-0.0.17/esper/cli/retry.py +73 -0
  27. espercli-0.0.17/esper/cli/secureadb.py +171 -0
  28. espercli-0.0.17/esper/cli/stage.py +196 -0
  29. espercli-0.0.17/esper/cli/state.py +154 -0
  30. espercli-0.0.17/esper/cli/status.py +107 -0
  31. espercli-0.0.17/esper/cli/telemetry.py +133 -0
  32. espercli-0.0.17/esper/cli/token.py +129 -0
  33. espercli-0.0.17/esper/cli/user.py +118 -0
  34. espercli-0.0.17/esper/cli/version.py +283 -0
  35. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/secureadb/secureadb.py +9 -0
  36. {espercli-0.0.16 → espercli-0.0.17}/esper/core/version.py +1 -1
  37. espercli-0.0.17/esper/ext/api_rest.py +55 -0
  38. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/remoteadb_api.py +88 -2
  39. {espercli-0.0.16 → espercli-0.0.17}/esper/main.py +2 -0
  40. espercli-0.0.17/espercli.egg-info/PKG-INFO +415 -0
  41. {espercli-0.0.16 → espercli-0.0.17}/espercli.egg-info/SOURCES.txt +35 -1
  42. espercli-0.0.17/espercli.egg-info/entry_points.txt +4 -0
  43. espercli-0.0.17/espercli.egg-info/requires.txt +12 -0
  44. {espercli-0.0.16 → espercli-0.0.17}/requirements.txt +3 -4
  45. {espercli-0.0.16 → espercli-0.0.17}/setup.py +8 -10
  46. espercli-0.0.17/tests/test_configure.py +89 -0
  47. espercli-0.0.17/tests/test_main.py +16 -0
  48. espercli-0.0.16/PKG-INFO +0 -2464
  49. espercli-0.0.16/README.md +0 -2452
  50. espercli-0.0.16/espercli.egg-info/PKG-INFO +0 -2464
  51. espercli-0.0.16/espercli.egg-info/entry_points.txt +0 -2
  52. espercli-0.0.16/espercli.egg-info/requires.txt +0 -14
  53. {espercli-0.0.16 → espercli-0.0.17}/LICENSE +0 -0
  54. {espercli-0.0.16 → espercli-0.0.17}/LICENSE.md +0 -0
  55. {espercli-0.0.16 → espercli-0.0.17}/MANIFEST.in +0 -0
  56. {espercli-0.0.16 → espercli-0.0.17}/esper/__init__.py +0 -0
  57. {espercli-0.0.16 → espercli-0.0.17}/esper/bootstrap.py +0 -0
  58. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/__init__.py +0 -0
  59. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/application/__init__.py +0 -0
  60. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/application/application.py +0 -0
  61. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/application/version.py +0 -0
  62. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/base.py +0 -0
  63. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/commandsV2/__init__.py +0 -0
  64. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/commandsV2/commandsV2.py +0 -0
  65. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/configure.py +0 -0
  66. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/content/__init__.py +0 -0
  67. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/content/content.py +0 -0
  68. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/device/__init__.py +0 -0
  69. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/device/command.py +0 -0
  70. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/device/device.py +0 -0
  71. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/device/group_command.py +0 -0
  72. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/device/install.py +0 -0
  73. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/device/status.py +0 -0
  74. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/enterprise/__init__.py +0 -0
  75. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/enterprise/enterprise.py +0 -0
  76. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/enterprise/group.py +0 -0
  77. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/enums.py +0 -0
  78. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/pipeline/__init__.py +0 -0
  79. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/pipeline/execute.py +0 -0
  80. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/pipeline/operation.py +0 -0
  81. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/pipeline/pipeline.py +0 -0
  82. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/pipeline/stage.py +0 -0
  83. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/secureadb/__init__.py +0 -0
  84. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/telemetry/__init__.py +0 -0
  85. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/telemetry/telemetry.py +0 -0
  86. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/token/__init__.py +0 -0
  87. {espercli-0.0.16 → espercli-0.0.17}/esper/controllers/token/token.py +0 -0
  88. {espercli-0.0.16 → espercli-0.0.17}/esper/core/__init__.py +0 -0
  89. {espercli-0.0.16 → espercli-0.0.17}/esper/core/exc.py +0 -0
  90. {espercli-0.0.16 → espercli-0.0.17}/esper/core/output_handler.py +0 -0
  91. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/__init__.py +0 -0
  92. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/api_client.py +0 -0
  93. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/certs.py +0 -0
  94. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/db_wrapper.py +0 -0
  95. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/forwarder.py +0 -0
  96. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/mediator.py +0 -0
  97. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/pipeline_api.py +0 -0
  98. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/relay.py +0 -0
  99. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/telemetry_api.py +0 -0
  100. {espercli-0.0.16 → espercli-0.0.17}/esper/ext/utils.py +0 -0
  101. {espercli-0.0.16 → espercli-0.0.17}/esper/plugins/__init__.py +0 -0
  102. {espercli-0.0.16 → espercli-0.0.17}/esper/templates/__init__.py +0 -0
  103. {espercli-0.0.16 → espercli-0.0.17}/esper/templates/command1.jinja2 +0 -0
  104. {espercli-0.0.16 → espercli-0.0.17}/esper/templates/creds.jinja2 +0 -0
  105. {espercli-0.0.16 → espercli-0.0.17}/espercli.egg-info/dependency_links.txt +0 -0
  106. {espercli-0.0.16 → espercli-0.0.17}/espercli.egg-info/top_level.txt +0 -0
  107. {espercli-0.0.16 → espercli-0.0.17}/requirements-dev.txt +0 -0
  108. {espercli-0.0.16 → espercli-0.0.17}/setup.cfg +0 -0
@@ -29,4 +29,8 @@ Updated dependencies
29
29
 
30
30
  ## 0.0.16
31
31
 
32
- - Updated requirements.txt (esperclient==0.1.3)
32
+ - Updated requirements.txt (esperclient==0.1.3)
33
+
34
+ ## 0.0.17
35
+
36
+ - Added support for forwarding the client's ADB public key (`~/.android/adbkey.pub`) when initiating a Remote ADB session, enabling pre-authorization of the key on the device
@@ -0,0 +1,415 @@
1
+ Metadata-Version: 2.1
2
+ Name: espercli
3
+ Version: 0.0.17
4
+ Summary: Esper CLI is Command line tool for the Esper APIs
5
+ Home-page: https://github.com/esper-io/esper-cli/
6
+ Author: Esper
7
+ Author-email: developer@esper.io
8
+ License: Apache 2.0
9
+ Platform: UNKNOWN
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ License-File: LICENSE.md
13
+
14
+ # espercli
15
+
16
+ A command-line tool for the [Esper](https://esper.io) API — manage devices, applications, groups, pipelines, and more from your terminal.
17
+
18
+ Built with [Typer](https://typer.tiangolo.com) and [Rich](https://github.com/Textualize/rich) for a modern CLI experience: colour-coded output, tab-completion, inline help on errors, and auto-pagination.
19
+
20
+ Also ships a **Claude Code skill** (`/esper`) so you can manage your fleet in plain English directly from your AI coding session — no syntax required.
21
+
22
+ ---
23
+
24
+ ## Requirements
25
+
26
+ - Python 3.8+
27
+ - An Esper account with an API key ([generate one here](https://docs.esper.io/home/module/genapikey.html))
28
+
29
+ ---
30
+
31
+ ## Installation
32
+
33
+ **Recommended — pipx** (isolated, no venv management needed):
34
+
35
+ ```sh
36
+ pipx install git+https://github.com/avidan/esper-cli.git
37
+ ```
38
+
39
+ **From source:**
40
+
41
+ ```sh
42
+ git clone https://github.com/avidan/esper-cli.git
43
+ cd esper-cli
44
+ pipx install -e .
45
+ ```
46
+
47
+ **Plain pip** (inside a virtualenv):
48
+
49
+ ```sh
50
+ pip install git+https://github.com/avidan/esper-cli.git
51
+ ```
52
+
53
+ ---
54
+
55
+ ## Quick start
56
+
57
+ ```sh
58
+ # 1. Configure credentials (run once)
59
+ espercli configure
60
+
61
+ # 2. Check your active context at any time
62
+ espercli context
63
+
64
+ # 3. List your devices
65
+ espercli device list
66
+
67
+ # 4. Set a device as active for subsequent commands
68
+ espercli device show <name> --active
69
+
70
+ # 5. Explore any command with --help
71
+ espercli device --help
72
+ espercli device list --help
73
+ ```
74
+
75
+ ---
76
+
77
+ ## Tab completion
78
+
79
+ Install once and restart your terminal:
80
+
81
+ ```sh
82
+ espercli completion zsh # zsh
83
+ espercli completion bash # bash
84
+ espercli completion fish # fish
85
+ espercli completion powershell # PowerShell
86
+ ```
87
+
88
+ After installing, pressing `<Tab>` completes:
89
+
90
+ - **Sub-commands** — `espercli dev<TAB>` → `device`
91
+ - **Enum values** — `espercli device list --state <TAB>` → `active`, `inactive`, `disabled`, …
92
+ - **Device names** — `espercli device show <TAB>` → live names from your enterprise
93
+ - **Group names** — `espercli group-command reboot --group <TAB>`
94
+ - **Application IDs** — `espercli version list --app <TAB>` (shows app name as hint)
95
+ - **Command names, schedule types, days, and more**
96
+
97
+ ---
98
+
99
+ ## Commands
100
+
101
+ ### `configure`
102
+ Set credentials (environment name and API key). Run this first.
103
+
104
+ ```sh
105
+ espercli configure
106
+ ```
107
+
108
+ ---
109
+
110
+ ### `device`
111
+ ```sh
112
+ espercli device list # list all devices (paginated)
113
+ espercli device list --state active # filter by state
114
+ espercli device list --group "Warehouse" # filter by group
115
+ espercli device list --all # fetch every device (auto-paginate)
116
+
117
+ espercli device show <name> # show device details
118
+ espercli device show <name> --active # show + set as active device
119
+
120
+ espercli device set-active --name <name> # set active device
121
+ espercli device unset-active # clear active device
122
+
123
+ espercli device report <name> # HTML dashboard (opens in browser)
124
+ espercli device report <name> --output ./report.html # write to specific path
125
+ espercli device report <name> --no-open # write file without opening browser
126
+ ```
127
+
128
+ ---
129
+
130
+ ### `device-command`
131
+ Fire commands at a single device (uses the active device if `--device` is omitted).
132
+
133
+ ```sh
134
+ espercli device-command ping
135
+ espercli device-command lock --device <name>
136
+ espercli device-command reboot --device <name>
137
+ espercli device-command wipe --device <name> # requires confirmation
138
+ espercli device-command install --device <name> --version <version-id>
139
+ espercli device-command uninstall --device <name> --version <version-id>
140
+ espercli device-command clear-app-data --device <name> --package-name com.example.app
141
+ espercli device-command show <command-id>
142
+ ```
143
+
144
+ ---
145
+
146
+ ### `group`
147
+ ```sh
148
+ espercli group list
149
+ espercli group list --all # auto-paginate
150
+ espercli group show <name>
151
+ espercli group show <name> --active # set as active group
152
+ espercli group create <name>
153
+ espercli group update <name> --name <new-name>
154
+ espercli group delete <name> # requires confirmation
155
+ espercli group devices # list devices in active group
156
+ espercli group add --group <name> --device <device-name>
157
+ espercli group remove --group <name> --device <device-name>
158
+ espercli group move --group <name> --parent <parent-name>
159
+ ```
160
+
161
+ ---
162
+
163
+ ### `group-command`
164
+ Fire commands at every device in a group.
165
+
166
+ ```sh
167
+ espercli group-command ping --group <name>
168
+ espercli group-command lock --group <name>
169
+ espercli group-command reboot --group <name>
170
+ espercli group-command install --group <name> --version <version-id>
171
+ espercli group-command show <command-id>
172
+ ```
173
+
174
+ ---
175
+
176
+ ### `app`
177
+ ```sh
178
+ espercli app list
179
+ espercli app list --name "MyApp"
180
+ espercli app list --all # auto-paginate
181
+ espercli app show <app-id>
182
+ espercli app show <app-id> --active # set as active application
183
+ espercli app upload <path/to/app.apk>
184
+ espercli app download <version-id> --dest ./app.apk
185
+ espercli app delete <app-id> # requires confirmation
186
+ espercli app set-active --id <app-id>
187
+ espercli app unset-active
188
+ ```
189
+
190
+ ---
191
+
192
+ ### `version`
193
+ Manage versions of the active (or specified) application.
194
+
195
+ ```sh
196
+ espercli version list
197
+ espercli version list --app <app-id>
198
+ espercli version list --legacy-format false # show version_name instead of build_number
199
+ espercli version show <version-id>
200
+ espercli version delete <version-id> # requires confirmation
201
+ espercli version devices <version-id> # list devices with this version installed
202
+ ```
203
+
204
+ ---
205
+
206
+ ### `installs`
207
+ ```sh
208
+ espercli installs list # installs for active device
209
+ espercli installs list --device <name>
210
+ espercli installs show <install-id>
211
+ ```
212
+
213
+ ---
214
+
215
+ ### `status`
216
+ ```sh
217
+ espercli status show # status for active device
218
+ espercli status show --device <name>
219
+ espercli status list
220
+ ```
221
+
222
+ ---
223
+
224
+ ### `commandsV2`
225
+ Multi-device / group command requests (V2 API).
226
+
227
+ ```sh
228
+ # List recent requests
229
+ espercli commandsV2 list
230
+ espercli commandsV2 list --command reboot --command-type device
231
+
232
+ # Fire a command
233
+ espercli commandsV2 command \
234
+ --command-type device \
235
+ --devices "device-name-1 device-name-2" \
236
+ --command reboot
237
+
238
+ # Check status / history
239
+ espercli commandsV2 status --request <request-id>
240
+ espercli commandsV2 history --device <name>
241
+ ```
242
+
243
+ ---
244
+
245
+ ### `pipeline`
246
+ ```sh
247
+ espercli pipeline list
248
+ espercli pipeline show <pipeline-id>
249
+ espercli pipeline create --name "Nightly Deploy" --no-of-stages 3
250
+ espercli pipeline edit <pipeline-id> --name "New Name"
251
+ espercli pipeline delete <pipeline-id>
252
+
253
+ # Stages
254
+ espercli pipeline stage list --pipeline <id>
255
+ espercli pipeline stage create --pipeline <id> --name "Stage 1"
256
+
257
+ # Operations
258
+ espercli pipeline stage operation create --stage <id> --action APP_INSTALL
259
+
260
+ # Execution
261
+ espercli pipeline execute start --pipeline <id>
262
+ espercli pipeline execute stop --pipeline <id>
263
+ espercli pipeline execute show --pipeline <id>
264
+ ```
265
+
266
+ ---
267
+
268
+ ### `content`
269
+ ```sh
270
+ espercli content list
271
+ espercli content show <content-id>
272
+ espercli content upload <path/to/file>
273
+ espercli content modify <content-id> --tags "tag1 tag2" --description "..."
274
+ espercli content delete <content-id> # requires confirmation
275
+ ```
276
+
277
+ ---
278
+
279
+ ### `token`
280
+ ```sh
281
+ espercli token show
282
+ espercli token renew
283
+ ```
284
+
285
+ ---
286
+
287
+ ### `enterprise`
288
+ ```sh
289
+ espercli enterprise show
290
+ espercli enterprise set-active
291
+ ```
292
+
293
+ ---
294
+
295
+ ### `telemetry`
296
+ ```sh
297
+ espercli telemetry get-data \
298
+ --device <name> \
299
+ --metric battery-level \
300
+ --last 24 \
301
+ --period hour \
302
+ --statistic avg
303
+ ```
304
+
305
+ ---
306
+
307
+ ### `secureadb`
308
+ ```sh
309
+ espercli secureadb connect --device <name>
310
+ ```
311
+
312
+ ---
313
+
314
+ ### Utility commands
315
+
316
+ ```sh
317
+ espercli context # show active environment, enterprise, device, app, group
318
+ espercli about # show CLI version
319
+ espercli completion zsh # install tab-completion
320
+ ```
321
+
322
+ ---
323
+
324
+ ## Global flags
325
+
326
+ | Flag | Short | Description |
327
+ |---|---|---|
328
+ | `--verbose` | `-v` | Enable debug logging |
329
+ | `--no-color` | | Disable colour output (useful for piping / CI) |
330
+
331
+ ---
332
+
333
+ ## Output formats
334
+
335
+ Every listing and detail command supports `--json` / `-j` for machine-readable output:
336
+
337
+ ```sh
338
+ espercli device list --json | jq '.[].id'
339
+ espercli app show <id> --json
340
+ ```
341
+
342
+ ---
343
+
344
+ ## Error messages
345
+
346
+ Mistyped a command? The CLI shows the relevant help page inline — no need to re-run with `--help`:
347
+
348
+ ```
349
+ $ espercli device lst
350
+
351
+ ╭─ Error ────────────────────────────────────╮
352
+ │ ✗ No such command 'lst'. Did you mean 'list'? │
353
+ ╰────────────────────────────────────────────╯
354
+
355
+ Usage: espercli device [OPTIONS] COMMAND [ARGS]...
356
+
357
+ ╭─ Commands ─────────────────────────╮
358
+ │ list List devices │
359
+ │ show Show device details │
360
+ │ set-active Set active device │
361
+ │ unset-active Clear active device │
362
+ ╰────────────────────────────────────╯
363
+ ```
364
+
365
+ ---
366
+
367
+ ## Claude Code skill (`/esper`)
368
+
369
+ The repo includes a [Claude Code](https://claude.ai/code) slash command that gives you a natural-language interface to your Esper fleet. Instead of remembering CLI syntax, just describe what you want.
370
+
371
+ ### Setup
372
+
373
+ **Option A — project skill (automatic when you clone):**
374
+
375
+ The skill is already at `.claude/commands/esper.md` in this repo. Open the project in Claude Code and `/esper` is available immediately — no install step.
376
+
377
+ **Option B — user skill (available in every project):**
378
+
379
+ Copy the skill to your global commands directory so it works outside this repo too:
380
+
381
+ ```sh
382
+ mkdir -p ~/.claude/commands
383
+ cp .claude/commands/esper.md ~/.claude/commands/esper.md
384
+ ```
385
+
386
+ ### Usage
387
+
388
+ Type `/esper` in Claude Code followed by what you want in plain English:
389
+
390
+ ```
391
+ /esper show me all inactive devices
392
+ /esper reboot the warehouse group
393
+ /esper what apps are installed on ezra pixel
394
+ /esper upload build/app-release.apk and set it as the active app
395
+ /esper show battery telemetry for ezra pixel over the last 24 hours
396
+ /esper which devices have version abc-123 installed
397
+ ```
398
+
399
+ Or just `/esper` with no argument — it checks your active context and waits for direction.
400
+
401
+ ### What it does
402
+
403
+ - Runs `espercli context` first so it knows your active environment, device, and group
404
+ - Translates natural language into the right `espercli` commands and runs them
405
+ - Presents results as a clean summary, not raw CLI output
406
+ - Asks for confirmation before any destructive action (wipe, delete) regardless of how you phrase the request
407
+ - Asks a clarifying question if the target is ambiguous rather than guessing
408
+
409
+ ---
410
+
411
+ ## License
412
+
413
+ Apache 2.0 — see [LICENSE](LICENSE).
414
+
415
+