@switchbot/openapi-cli 1.0.1 → 1.2.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.
Files changed (90) hide show
  1. package/README.md +174 -18
  2. package/dist/api/client.d.ts +7 -1
  3. package/dist/api/client.js +44 -8
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/commands/batch.d.ts +2 -0
  6. package/dist/commands/batch.js +252 -0
  7. package/dist/commands/batch.js.map +1 -0
  8. package/dist/commands/cache.d.ts +2 -0
  9. package/dist/commands/cache.js +108 -0
  10. package/dist/commands/cache.js.map +1 -0
  11. package/dist/commands/capabilities.d.ts +2 -0
  12. package/dist/commands/capabilities.js +91 -0
  13. package/dist/commands/capabilities.js.map +1 -0
  14. package/dist/commands/catalog.d.ts +2 -0
  15. package/dist/commands/catalog.js +291 -0
  16. package/dist/commands/catalog.js.map +1 -0
  17. package/dist/commands/config.js +123 -10
  18. package/dist/commands/config.js.map +1 -1
  19. package/dist/commands/devices.js +234 -112
  20. package/dist/commands/devices.js.map +1 -1
  21. package/dist/commands/doctor.d.ts +2 -0
  22. package/dist/commands/doctor.js +147 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/events.d.ts +15 -0
  25. package/dist/commands/events.js +188 -0
  26. package/dist/commands/events.js.map +1 -0
  27. package/dist/commands/explain.d.ts +2 -0
  28. package/dist/commands/explain.js +137 -0
  29. package/dist/commands/explain.js.map +1 -0
  30. package/dist/commands/history.d.ts +2 -0
  31. package/dist/commands/history.js +104 -0
  32. package/dist/commands/history.js.map +1 -0
  33. package/dist/commands/mcp.d.ts +4 -0
  34. package/dist/commands/mcp.js +386 -0
  35. package/dist/commands/mcp.js.map +1 -0
  36. package/dist/commands/plan.d.ts +37 -0
  37. package/dist/commands/plan.js +344 -0
  38. package/dist/commands/plan.js.map +1 -0
  39. package/dist/commands/quota.d.ts +2 -0
  40. package/dist/commands/quota.js +77 -0
  41. package/dist/commands/quota.js.map +1 -0
  42. package/dist/commands/scenes.js +19 -13
  43. package/dist/commands/scenes.js.map +1 -1
  44. package/dist/commands/schema.d.ts +2 -0
  45. package/dist/commands/schema.js +77 -0
  46. package/dist/commands/schema.js.map +1 -0
  47. package/dist/commands/watch.d.ts +2 -0
  48. package/dist/commands/watch.js +161 -0
  49. package/dist/commands/watch.js.map +1 -0
  50. package/dist/commands/webhook.js +37 -22
  51. package/dist/commands/webhook.js.map +1 -1
  52. package/dist/config.d.ts +11 -0
  53. package/dist/config.js +32 -6
  54. package/dist/config.js.map +1 -1
  55. package/dist/devices/cache.d.ts +75 -0
  56. package/dist/devices/cache.js +225 -0
  57. package/dist/devices/cache.js.map +1 -0
  58. package/dist/devices/catalog.d.ts +49 -0
  59. package/dist/devices/catalog.js +362 -92
  60. package/dist/devices/catalog.js.map +1 -1
  61. package/dist/index.js +31 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/lib/devices.d.ts +144 -0
  64. package/dist/lib/devices.js +329 -0
  65. package/dist/lib/devices.js.map +1 -0
  66. package/dist/lib/scenes.d.ts +7 -0
  67. package/dist/lib/scenes.js +11 -0
  68. package/dist/lib/scenes.js.map +1 -0
  69. package/dist/utils/audit.d.ts +13 -0
  70. package/dist/utils/audit.js +43 -0
  71. package/dist/utils/audit.js.map +1 -0
  72. package/dist/utils/filter.d.ts +45 -0
  73. package/dist/utils/filter.js +96 -0
  74. package/dist/utils/filter.js.map +1 -0
  75. package/dist/utils/flags.d.ts +42 -0
  76. package/dist/utils/flags.js +108 -0
  77. package/dist/utils/flags.js.map +1 -1
  78. package/dist/utils/format.d.ts +9 -0
  79. package/dist/utils/format.js +109 -0
  80. package/dist/utils/format.js.map +1 -0
  81. package/dist/utils/output.d.ts +11 -0
  82. package/dist/utils/output.js +37 -6
  83. package/dist/utils/output.js.map +1 -1
  84. package/dist/utils/quota.d.ts +48 -0
  85. package/dist/utils/quota.js +144 -0
  86. package/dist/utils/quota.js.map +1 -0
  87. package/dist/utils/retry.d.ts +23 -0
  88. package/dist/utils/retry.js +60 -0
  89. package/dist/utils/retry.js.map +1 -0
  90. package/package.json +4 -1
@@ -1,6 +1,12 @@
1
- import { createClient } from '../api/client.js';
2
- import { printTable, printKeyValue, printJson, isJsonMode, handleError } from '../utils/output.js';
3
- import { DEVICE_CATALOG, findCatalogEntry } from '../devices/catalog.js';
1
+ import { printTable, printKeyValue, printJson, isJsonMode, handleError, UsageError } from '../utils/output.js';
2
+ import { resolveFormat, resolveFields, renderRows } from '../utils/format.js';
3
+ import { findCatalogEntry, getEffectiveCatalog } from '../devices/catalog.js';
4
+ import { getCachedDevice } from '../devices/cache.js';
5
+ import { fetchDeviceList, fetchDeviceStatus, executeCommand, describeDevice, validateCommand, isDestructiveCommand, getDestructiveReason, buildHubLocationMap, DeviceNotFoundError, } from '../lib/devices.js';
6
+ import { registerBatchCommand } from './batch.js';
7
+ import { registerWatchCommand } from './watch.js';
8
+ import { registerExplainCommand } from './explain.js';
9
+ import { isDryRun } from '../utils/flags.js';
4
10
  export function registerDevicesCommand(program) {
5
11
  const devices = program
6
12
  .command('devices')
@@ -30,9 +36,12 @@ Run any subcommand with --help for its own flags and examples.
30
36
  .command('list')
31
37
  .description('List all physical devices and IR remote devices on the account')
32
38
  .addHelpText('after', `
33
- Output columns: deviceId, deviceName, type, controlType, family, roomID, room, hub, cloud
39
+ Default columns: deviceId, deviceName, type, category
40
+ Pass --wide for the full operator view: + controlType, family, roomID, room, hub, cloud
41
+ --fields accepts any subset of all column names (exit 2 on unknown names).
34
42
 
35
- type - physical deviceType (e.g. "Bot", "Curtain") or "[IR] <remoteType>"
43
+ type - physical deviceType (e.g. "Bot", "Curtain") or IR remoteType (e.g. "TV")
44
+ category - "physical" or "ir"
36
45
  controlType - functional classification from the API (e.g. "Bot", "Switch",
37
46
  "TV") — may differ from 'type' and groups devices by behavior
38
47
  family - home/family name (IR remotes inherit this from their bound Hub)
@@ -49,25 +58,33 @@ the table; --json returns the raw API body unchanged.)
49
58
 
50
59
  Examples:
51
60
  $ switchbot devices list
61
+ $ switchbot devices list --wide
62
+ $ switchbot devices list --format tsv --fields deviceId,deviceName,type,category
52
63
  $ switchbot devices list --json | jq '.deviceList[] | select(.familyName == "家里")'
53
64
  $ switchbot devices list --json | jq '[.deviceList[], .infraredRemoteList[]] | group_by(.familyName)'
54
65
  `)
55
- .action(async () => {
66
+ .option('--wide', 'Show all columns (controlType, family, roomID, room, hub, cloud)')
67
+ .action(async (options) => {
56
68
  try {
57
- const client = createClient();
58
- const res = await client.get('/v1.1/devices');
59
- const { deviceList, infraredRemoteList } = res.data.body;
60
- if (isJsonMode()) {
61
- printJson(res.data.body);
69
+ const body = await fetchDeviceList();
70
+ const { deviceList, infraredRemoteList } = body;
71
+ const fmt = resolveFormat();
72
+ if (fmt === 'json' && process.argv.includes('--json')) {
73
+ printJson(body);
62
74
  return;
63
75
  }
64
76
  const hubLocation = buildHubLocationMap(deviceList);
77
+ const narrowHeaders = ['deviceId', 'deviceName', 'type', 'category'];
78
+ const wideHeaders = ['deviceId', 'deviceName', 'type', 'category', 'controlType', 'family', 'roomID', 'room', 'hub', 'cloud'];
79
+ const userFields = resolveFields();
80
+ const headers = userFields ? wideHeaders : (options.wide ? wideHeaders : narrowHeaders);
65
81
  const rows = [];
66
82
  for (const d of deviceList) {
67
83
  rows.push([
68
84
  d.deviceId,
69
85
  d.deviceName,
70
86
  d.deviceType || '—',
87
+ 'physical',
71
88
  d.controlType || '—',
72
89
  d.familyName || '—',
73
90
  d.roomID || '—',
@@ -81,7 +98,8 @@ Examples:
81
98
  rows.push([
82
99
  d.deviceId,
83
100
  d.deviceName,
84
- `[IR] ${d.remoteType}`,
101
+ d.remoteType,
102
+ 'ir',
85
103
  d.controlType || '—',
86
104
  inherited?.family || '—',
87
105
  inherited?.roomID || '—',
@@ -90,13 +108,15 @@ Examples:
90
108
  null,
91
109
  ]);
92
110
  }
93
- if (rows.length === 0) {
111
+ if (rows.length === 0 && fmt === 'table') {
94
112
  console.log('No devices found');
95
113
  return;
96
114
  }
97
- printTable(['deviceId', 'deviceName', 'type', 'controlType', 'family', 'roomID', 'room', 'hub', 'cloud'], rows);
98
- console.log(`\nTotal: ${deviceList.length} physical device(s), ${infraredRemoteList.length} IR remote device(s)`);
99
- console.log(`Tip: 'switchbot devices describe <deviceId>' shows a device's supported commands.`);
115
+ renderRows(wideHeaders, rows, fmt, userFields ?? (options.wide ? undefined : narrowHeaders));
116
+ if (fmt === 'table') {
117
+ console.log(`\nTotal: ${deviceList.length} physical device(s), ${infraredRemoteList.length} IR remote device(s)`);
118
+ console.log(`Tip: 'switchbot devices describe <deviceId>' shows a device's supported commands.`);
119
+ }
100
120
  }
101
121
  catch (error) {
102
122
  handleError(error);
@@ -108,33 +128,36 @@ Examples:
108
128
  .description('Query the real-time status of a specific device')
109
129
  .argument('<deviceId>', 'Device ID from "devices list" (physical devices only; IR remotes have no status)')
110
130
  .addHelpText('after', `
111
- Returned fields vary by device type e.g. Bot returns power/battery, Meter
112
- returns temperature/humidity/battery, Curtain returns slidePosition/moving,
113
- Color Bulb returns brightness/color/colorTemperature, etc.
131
+ Status fields vary by device type. To discover them without a live call:
114
132
 
115
- To see exactly which status fields a given type returns BEFORE calling the
116
- API, use the offline catalog:
133
+ switchbot devices commands <type> (prints the "Status fields" section)
117
134
 
118
- switchbot devices commands <type> (prints the "Status fields" section)
119
-
120
- IR remote devices cannot be queried — the SwitchBot API returns no status
121
- channel for them. Use 'devices list' to confirm a deviceId is a physical
122
- device (not in the 'infraredRemoteList').
135
+ For --fields: run the command once with --format yaml (no --fields) to see
136
+ all field names returned by your specific device, then narrow with --fields.
123
137
 
124
138
  Examples:
125
139
  $ switchbot devices status ABC123DEF456
126
140
  $ switchbot devices status ABC123DEF456 --json
141
+ $ switchbot devices status ABC123DEF456 --format yaml
142
+ $ switchbot devices status ABC123DEF456 --format tsv --fields power,battery
127
143
  $ switchbot devices status ABC123DEF456 --json | jq '.battery'
128
144
  `)
129
145
  .action(async (deviceId) => {
130
146
  try {
131
- const client = createClient();
132
- const res = await client.get(`/v1.1/devices/${deviceId}/status`);
133
- if (isJsonMode()) {
134
- printJson(res.data.body);
147
+ const body = await fetchDeviceStatus(deviceId);
148
+ const fmt = resolveFormat();
149
+ if (fmt === 'json' && process.argv.includes('--json')) {
150
+ printJson(body);
135
151
  return;
136
152
  }
137
- printKeyValue(res.data.body);
153
+ if (fmt !== 'table') {
154
+ const allHeaders = Object.keys(body);
155
+ const allRows = [Object.values(body)];
156
+ const fields = resolveFields();
157
+ renderRows(allHeaders, allRows, fmt, fields);
158
+ return;
159
+ }
160
+ printKeyValue(body);
138
161
  }
139
162
  catch (error) {
140
163
  handleError(error);
@@ -148,6 +171,7 @@ Examples:
148
171
  .argument('<cmd>', 'Command name, e.g. turnOn, turnOff, setColor, setBrightness, setAll, startClean')
149
172
  .argument('[parameter]', 'Command parameter. Omit for commands like turnOn/turnOff (defaults to "default"). Format depends on the command (see below).')
150
173
  .option('--type <commandType>', 'Command type: "command" for built-in commands (default), "customize" for user-defined IR buttons', 'command')
174
+ .option('--yes', 'Confirm a destructive command (Smart Lock unlock, Garage open, …). --dry-run is always allowed without --yes.')
151
175
  .addHelpText('after', `
152
176
  ────────────────────────────────────────────────────────────────────────
153
177
  For the full list of commands a specific device supports — and their
@@ -180,16 +204,72 @@ Common errors:
180
204
  161 device offline (BLE devices need a Hub bridge)
181
205
  171 hub offline
182
206
 
207
+ Safety:
208
+ Destructive commands (Smart Lock unlock, Garage Door Opener turnOn/turnOff,
209
+ Keypad createKey/deleteKey, …) are blocked by default. Pass --yes to confirm,
210
+ or --dry-run to preview without sending.
211
+
183
212
  Examples:
184
213
  $ switchbot devices command ABC123 turnOn
185
214
  $ switchbot devices command ABC123 setColor "255:0:0"
186
215
  $ switchbot devices command ABC123 setAll "26,1,3,on"
187
216
  $ switchbot devices command ABC123 startClean '{"action":"sweep","param":{"fanLevel":2,"times":1}}'
188
217
  $ switchbot devices command ABC123 "MyButton" --type customize
218
+ $ switchbot devices command <lockId> unlock --yes
189
219
  `)
190
220
  .action(async (deviceId, cmd, parameter, options) => {
221
+ const validation = validateCommand(deviceId, cmd, parameter, options.type);
222
+ if (!validation.ok) {
223
+ const err = validation.error;
224
+ if (isJsonMode()) {
225
+ const obj = { code: 2, kind: 'usage', message: err.message };
226
+ if (err.hint)
227
+ obj.hint = err.hint;
228
+ obj.context = { validationKind: err.kind };
229
+ console.error(JSON.stringify({ error: obj }));
230
+ }
231
+ else {
232
+ console.error(`Error: ${err.message}`);
233
+ if (err.hint)
234
+ console.error(err.hint);
235
+ if (err.kind === 'unknown-command') {
236
+ const cached = getCachedDevice(deviceId);
237
+ if (cached) {
238
+ console.error(`Run 'switchbot devices commands ${JSON.stringify(cached.type)}' for parameter formats and descriptions.`);
239
+ console.error(`(If the catalog is out of date, run 'switchbot devices list' to refresh the local cache, or pass --type customize for custom IR buttons.)`);
240
+ }
241
+ }
242
+ }
243
+ process.exit(2);
244
+ }
245
+ const cachedForGuard = getCachedDevice(deviceId);
246
+ if (!options.yes &&
247
+ !isDryRun() &&
248
+ isDestructiveCommand(cachedForGuard?.type, cmd, options.type)) {
249
+ const typeLabel = cachedForGuard?.type ?? 'unknown';
250
+ const reason = getDestructiveReason(cachedForGuard?.type, cmd, options.type);
251
+ if (isJsonMode()) {
252
+ console.error(JSON.stringify({
253
+ error: {
254
+ code: 2,
255
+ kind: 'guard',
256
+ message: `"${cmd}" on ${typeLabel} is destructive and requires --yes.`,
257
+ hint: reason
258
+ ? `Re-run with --yes to confirm. Reason: ${reason}`
259
+ : 'Re-run with --yes to confirm, or --dry-run to preview without sending.',
260
+ context: { command: cmd, deviceType: typeLabel, deviceId, ...(reason ? { destructiveReason: reason } : {}) },
261
+ },
262
+ }));
263
+ }
264
+ else {
265
+ console.error(`Refusing to run destructive command "${cmd}" on ${typeLabel} without --yes.`);
266
+ if (reason)
267
+ console.error(`Reason: ${reason}`);
268
+ console.error(`Re-run with --yes to confirm, or --dry-run to preview without sending.`);
269
+ }
270
+ process.exit(2);
271
+ }
191
272
  try {
192
- const client = createClient();
193
273
  // parameter may be a JSON object string (e.g. S10 startClean) or a plain string
194
274
  let parsedParam = parameter ?? 'default';
195
275
  if (parameter) {
@@ -200,19 +280,14 @@ Examples:
200
280
  // keep as string
201
281
  }
202
282
  }
203
- const body = {
204
- command: cmd,
205
- parameter: parsedParam,
206
- commandType: options.type,
207
- };
208
- const res = await client.post(`/v1.1/devices/${deviceId}/commands`, body);
283
+ const body = await executeCommand(deviceId, cmd, parsedParam, options.type);
209
284
  if (isJsonMode()) {
210
- printJson(res.data.body);
285
+ printJson(body);
211
286
  return;
212
287
  }
213
288
  console.log(`✓ Command sent: ${cmd}`);
214
- if (res.data.body && typeof res.data.body === 'object' && Object.keys(res.data.body).length > 0) {
215
- printKeyValue(res.data.body);
289
+ if (body && typeof body === 'object' && Object.keys(body).length > 0) {
290
+ printKeyValue(body);
216
291
  }
217
292
  }
218
293
  catch (error) {
@@ -232,18 +307,28 @@ Examples:
232
307
  $ switchbot devices types --json
233
308
  `)
234
309
  .action(() => {
235
- if (isJsonMode()) {
236
- printJson(DEVICE_CATALOG);
237
- return;
310
+ try {
311
+ const catalog = getEffectiveCatalog();
312
+ const fmt = resolveFormat();
313
+ if (fmt === 'json') {
314
+ printJson(catalog);
315
+ return;
316
+ }
317
+ const headers = ['type', 'category', 'commands', 'aliases'];
318
+ const rows = catalog.map((e) => [
319
+ e.type,
320
+ e.category,
321
+ String(e.commands.length),
322
+ (e.aliases ?? []).join(', ') || '—',
323
+ ]);
324
+ renderRows(headers, rows, fmt, resolveFields());
325
+ if (fmt === 'table') {
326
+ console.log(`\nTotal: ${catalog.length} device type(s)`);
327
+ }
328
+ }
329
+ catch (error) {
330
+ handleError(error);
238
331
  }
239
- const rows = DEVICE_CATALOG.map((e) => [
240
- e.type,
241
- e.category,
242
- String(e.commands.length),
243
- (e.aliases ?? []).join(', ') || '—',
244
- ]);
245
- printTable(['type', 'category', 'commands', 'aliases'], rows);
246
- console.log(`\nTotal: ${DEVICE_CATALOG.length} device type(s)`);
247
332
  });
248
333
  // switchbot devices commands <type>
249
334
  devices
@@ -267,64 +352,76 @@ Examples:
267
352
  `)
268
353
  .action((typeParts) => {
269
354
  const type = typeParts.join(' ');
270
- const match = findCatalogEntry(type);
271
- if (!match) {
272
- console.error(`No device type matches "${type}".`);
273
- console.error(`Try 'switchbot devices types' to see the full list.`);
274
- process.exit(2);
275
- }
276
- if (Array.isArray(match)) {
277
- console.error(`"${type}" matches multiple types. Be more specific:`);
278
- for (const m of match)
279
- console.error(` • ${m.type}`);
280
- process.exit(2);
355
+ try {
356
+ const match = findCatalogEntry(type);
357
+ if (!match) {
358
+ throw new UsageError(`No device type matches "${type}". Try 'switchbot devices types' to see the full list.`);
359
+ }
360
+ if (Array.isArray(match)) {
361
+ const types = match.map((m) => m.type).join(', ');
362
+ throw new UsageError(`"${type}" matches multiple types: ${types}. Be more specific.`);
363
+ }
364
+ if (isJsonMode()) {
365
+ printJson(match);
366
+ return;
367
+ }
368
+ renderCatalogEntry(match);
281
369
  }
282
- if (isJsonMode()) {
283
- printJson(match);
284
- return;
370
+ catch (error) {
371
+ handleError(error);
285
372
  }
286
- renderCatalogEntry(match);
287
373
  });
288
374
  // switchbot devices describe <deviceId>
289
375
  devices
290
376
  .command('describe')
291
377
  .description('Describe a device by ID: metadata + supported commands + status fields (1 API call)')
292
378
  .argument('<deviceId>', 'Target device ID from "devices list"')
379
+ .option('--live', 'Also fetch live status values and merge them into capabilities (costs 1 extra API call)')
293
380
  .addHelpText('after', `
294
- Makes a single GET /v1.1/devices call to look up the device's type, then
295
- prints its metadata alongside the matching catalog entry (supported
296
- commands + parameter formats + status field names).
381
+ Makes a GET /v1.1/devices call to look up the device's type, then prints its
382
+ metadata alongside the matching catalog entry (supported commands + parameter
383
+ formats + status field names). With --live, makes a second call to fetch the
384
+ current status values and merges them into the output.
297
385
 
298
- Does NOT fetch live status values. Use 'switchbot devices status <id>' for that.
386
+ JSON output shape (--json):
387
+ {
388
+ device: <raw API fields>,
389
+ controlType: <string|null>,
390
+ catalog: <catalog entry, or null>,
391
+ capabilities: {
392
+ role: <functional role>,
393
+ readOnly: <boolean>,
394
+ commands: [{command, parameter, description, idempotent?, destructive?, exampleParams?}],
395
+ statusFields: [<name>],
396
+ liveStatus: <status payload when --live was passed>
397
+ },
398
+ source: "catalog" | "live" | "catalog+live" | "none",
399
+ suggestedActions: [{command, parameter?, description}]
400
+ }
299
401
 
300
402
  Examples:
301
403
  $ switchbot devices describe ABC123DEF456
404
+ $ switchbot devices describe ABC123DEF456 --live
302
405
  $ switchbot devices describe ABC123DEF456 --json
406
+ $ switchbot devices describe <lockId> --json | jq '.capabilities.commands[] | select(.destructive)'
303
407
  `)
304
- .action(async (deviceId) => {
408
+ .action(async (deviceId, options) => {
305
409
  try {
306
- const client = createClient();
307
- const res = await client.get('/v1.1/devices');
308
- const { deviceList, infraredRemoteList } = res.data.body;
309
- const physical = deviceList.find((d) => d.deviceId === deviceId);
310
- const ir = infraredRemoteList.find((d) => d.deviceId === deviceId);
311
- if (!physical && !ir) {
312
- console.error(`No device with id "${deviceId}" found on this account.`);
313
- console.error(`Try 'switchbot devices list' to see the full list.`);
314
- process.exit(1);
315
- }
316
- const typeName = physical ? (physical.deviceType ?? '') : ir.remoteType;
317
- const match = typeName ? findCatalogEntry(typeName) : null;
318
- const catalogEntry = !match || Array.isArray(match) ? null : match;
410
+ const result = await describeDevice(deviceId, options);
411
+ const { device, isPhysical, typeName, controlType, catalog, capabilities, source, suggestedActions: picks } = result;
319
412
  if (isJsonMode()) {
320
413
  printJson({
321
- device: physical ?? ir,
322
- controlType: (physical?.controlType ?? ir?.controlType) ?? null,
323
- catalog: catalogEntry,
414
+ device,
415
+ controlType,
416
+ catalog,
417
+ capabilities,
418
+ source,
419
+ suggestedActions: picks,
324
420
  });
325
421
  return;
326
422
  }
327
- if (physical) {
423
+ if (isPhysical) {
424
+ const physical = device;
328
425
  printKeyValue({
329
426
  deviceId: physical.deviceId,
330
427
  deviceName: physical.deviceName,
@@ -337,8 +434,9 @@ Examples:
337
434
  cloudService: physical.enableCloudService,
338
435
  });
339
436
  }
340
- else if (ir) {
341
- const inherited = buildHubLocationMap(deviceList).get(ir.hubDeviceId);
437
+ else {
438
+ const ir = device;
439
+ const inherited = result.inheritedLocation;
342
440
  printKeyValue({
343
441
  deviceId: ir.deviceId,
344
442
  deviceName: ir.deviceName,
@@ -350,35 +448,51 @@ Examples:
350
448
  hub: ir.hubDeviceId || '—',
351
449
  });
352
450
  }
451
+ const liveStatus = capabilities && 'liveStatus' in capabilities ? capabilities.liveStatus : undefined;
353
452
  console.log('');
354
- if (!catalogEntry) {
453
+ if (!catalog) {
355
454
  console.log(`(Type "${typeName}" is not in the built-in catalog — no command reference available.)`);
356
- console.log(`Send custom IR buttons with: switchbot devices command ${deviceId} "<buttonName>" --type customize`);
455
+ if (isPhysical) {
456
+ console.log(`Try 'switchbot devices status ${deviceId}' to see what this device reports.`);
457
+ }
458
+ else {
459
+ console.log(`Send custom IR buttons with: switchbot devices command ${deviceId} "<buttonName>" --type customize`);
460
+ }
461
+ if (liveStatus) {
462
+ console.log('\nLive status:');
463
+ printKeyValue(liveStatus);
464
+ }
357
465
  return;
358
466
  }
359
- renderCatalogEntry(catalogEntry);
467
+ renderCatalogEntry(catalog);
468
+ if (liveStatus) {
469
+ console.log('\nLive status:');
470
+ printKeyValue(liveStatus);
471
+ }
360
472
  }
361
473
  catch (error) {
474
+ if (error instanceof DeviceNotFoundError) {
475
+ console.error(error.message);
476
+ console.error(`Try 'switchbot devices list' to see the full list.`);
477
+ process.exit(1);
478
+ }
362
479
  handleError(error);
363
480
  }
364
481
  });
365
- }
366
- function buildHubLocationMap(deviceList) {
367
- const map = new Map();
368
- for (const d of deviceList) {
369
- if (!d.deviceId)
370
- continue;
371
- map.set(d.deviceId, {
372
- family: d.familyName ?? undefined,
373
- room: d.roomName ?? undefined,
374
- roomID: d.roomID ?? undefined,
375
- });
376
- }
377
- return map;
482
+ // switchbot devices batch <command> ...
483
+ registerBatchCommand(devices);
484
+ // switchbot devices watch <id...>
485
+ registerWatchCommand(devices);
486
+ // switchbot devices explain <id>
487
+ registerExplainCommand(devices);
378
488
  }
379
489
  function renderCatalogEntry(entry) {
380
490
  console.log(`Type: ${entry.type}`);
381
491
  console.log(`Category: ${entry.category === 'ir' ? 'IR remote' : 'Physical device'}`);
492
+ if (entry.role)
493
+ console.log(`Role: ${entry.role}`);
494
+ if (entry.readOnly)
495
+ console.log(`ReadOnly: yes (status-only device, no control commands)`);
382
496
  if (entry.aliases && entry.aliases.length > 0) {
383
497
  console.log(`Aliases: ${entry.aliases.join(', ')}`);
384
498
  }
@@ -387,12 +501,20 @@ function renderCatalogEntry(entry) {
387
501
  }
388
502
  else {
389
503
  console.log('\nCommands:');
390
- const rows = entry.commands.map((c) => [
391
- c.commandType === 'customize' ? `${c.command} [customize]` : c.command,
392
- c.parameter,
393
- c.description,
394
- ]);
504
+ const rows = entry.commands.map((c) => {
505
+ const flags = [];
506
+ if (c.commandType === 'customize')
507
+ flags.push('customize');
508
+ if (c.destructive)
509
+ flags.push('!destructive');
510
+ const label = flags.length > 0 ? `${c.command} [${flags.join(', ')}]` : c.command;
511
+ return [label, c.parameter, c.description];
512
+ });
395
513
  printTable(['command', 'parameter', 'description'], rows);
514
+ const hasDestructive = entry.commands.some((c) => c.destructive);
515
+ if (hasDestructive) {
516
+ console.log('\n[!destructive] commands have hard-to-reverse real-world effects — confirm before issuing.');
517
+ }
396
518
  }
397
519
  if (entry.statusFields && entry.statusFields.length > 0) {
398
520
  console.log('\nStatus fields (from "devices status"):');
@@ -1 +1 @@
1
- {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/commands/devices.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/commands/devices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerDoctorCommand(program: Command): void;