@switchbot/openapi-cli 3.2.1 → 3.2.2
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 +3 -1
- package/dist/index.js +57349 -170
- package/package.json +9 -5
- package/dist/api/client.d.ts +0 -31
- package/dist/api/client.js +0 -236
- package/dist/api/client.js.map +0 -1
- package/dist/auth.d.ts +0 -1
- package/dist/auth.js +0 -21
- package/dist/auth.js.map +0 -1
- package/dist/commands/agent-bootstrap.d.ts +0 -10
- package/dist/commands/agent-bootstrap.js +0 -200
- package/dist/commands/agent-bootstrap.js.map +0 -1
- package/dist/commands/auth.d.ts +0 -18
- package/dist/commands/auth.js +0 -355
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/batch.d.ts +0 -2
- package/dist/commands/batch.js +0 -414
- package/dist/commands/batch.js.map +0 -1
- package/dist/commands/cache.d.ts +0 -2
- package/dist/commands/cache.js +0 -127
- package/dist/commands/cache.js.map +0 -1
- package/dist/commands/capabilities.d.ts +0 -31
- package/dist/commands/capabilities.js +0 -383
- package/dist/commands/capabilities.js.map +0 -1
- package/dist/commands/catalog.d.ts +0 -2
- package/dist/commands/catalog.js +0 -360
- package/dist/commands/catalog.js.map +0 -1
- package/dist/commands/completion.d.ts +0 -2
- package/dist/commands/completion.js +0 -386
- package/dist/commands/completion.js.map +0 -1
- package/dist/commands/config.d.ts +0 -21
- package/dist/commands/config.js +0 -377
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/daemon.d.ts +0 -2
- package/dist/commands/daemon.js +0 -411
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/device-meta.d.ts +0 -2
- package/dist/commands/device-meta.js +0 -160
- package/dist/commands/device-meta.js.map +0 -1
- package/dist/commands/devices.d.ts +0 -2
- package/dist/commands/devices.js +0 -949
- package/dist/commands/devices.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -3
- package/dist/commands/doctor.js +0 -1016
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/events.d.ts +0 -31
- package/dist/commands/events.js +0 -564
- package/dist/commands/events.js.map +0 -1
- package/dist/commands/expand.d.ts +0 -2
- package/dist/commands/expand.js +0 -131
- package/dist/commands/expand.js.map +0 -1
- package/dist/commands/explain.d.ts +0 -2
- package/dist/commands/explain.js +0 -140
- package/dist/commands/explain.js.map +0 -1
- package/dist/commands/health.d.ts +0 -8
- package/dist/commands/health.js +0 -114
- package/dist/commands/health.js.map +0 -1
- package/dist/commands/history.d.ts +0 -2
- package/dist/commands/history.js +0 -321
- package/dist/commands/history.js.map +0 -1
- package/dist/commands/identity.d.ts +0 -45
- package/dist/commands/identity.js +0 -60
- package/dist/commands/identity.js.map +0 -1
- package/dist/commands/install.d.ts +0 -20
- package/dist/commands/install.js +0 -247
- package/dist/commands/install.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -14
- package/dist/commands/mcp.js +0 -2018
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/plan.d.ts +0 -51
- package/dist/commands/plan.js +0 -654
- package/dist/commands/plan.js.map +0 -1
- package/dist/commands/policy.d.ts +0 -24
- package/dist/commands/policy.js +0 -587
- package/dist/commands/policy.js.map +0 -1
- package/dist/commands/quota.d.ts +0 -2
- package/dist/commands/quota.js +0 -79
- package/dist/commands/quota.js.map +0 -1
- package/dist/commands/rules.d.ts +0 -2
- package/dist/commands/rules.js +0 -876
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/scenes.d.ts +0 -2
- package/dist/commands/scenes.js +0 -265
- package/dist/commands/scenes.js.map +0 -1
- package/dist/commands/schema.d.ts +0 -2
- package/dist/commands/schema.js +0 -185
- package/dist/commands/schema.js.map +0 -1
- package/dist/commands/status-sync.d.ts +0 -2
- package/dist/commands/status-sync.js +0 -132
- package/dist/commands/status-sync.js.map +0 -1
- package/dist/commands/uninstall.d.ts +0 -20
- package/dist/commands/uninstall.js +0 -238
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/upgrade-check.d.ts +0 -2
- package/dist/commands/upgrade-check.js +0 -107
- package/dist/commands/upgrade-check.js.map +0 -1
- package/dist/commands/watch.d.ts +0 -2
- package/dist/commands/watch.js +0 -195
- package/dist/commands/watch.js.map +0 -1
- package/dist/commands/webhook.d.ts +0 -2
- package/dist/commands/webhook.js +0 -183
- package/dist/commands/webhook.js.map +0 -1
- package/dist/config.d.ts +0 -57
- package/dist/config.js +0 -259
- package/dist/config.js.map +0 -1
- package/dist/credentials/backends/file.d.ts +0 -18
- package/dist/credentials/backends/file.js +0 -102
- package/dist/credentials/backends/file.js.map +0 -1
- package/dist/credentials/backends/linux.d.ts +0 -16
- package/dist/credentials/backends/linux.js +0 -130
- package/dist/credentials/backends/linux.js.map +0 -1
- package/dist/credentials/backends/macos.d.ts +0 -18
- package/dist/credentials/backends/macos.js +0 -130
- package/dist/credentials/backends/macos.js.map +0 -1
- package/dist/credentials/backends/windows.d.ts +0 -23
- package/dist/credentials/backends/windows.js +0 -216
- package/dist/credentials/backends/windows.js.map +0 -1
- package/dist/credentials/keychain.d.ts +0 -83
- package/dist/credentials/keychain.js +0 -89
- package/dist/credentials/keychain.js.map +0 -1
- package/dist/credentials/prime.d.ts +0 -32
- package/dist/credentials/prime.js +0 -53
- package/dist/credentials/prime.js.map +0 -1
- package/dist/devices/cache.d.ts +0 -79
- package/dist/devices/cache.js +0 -294
- package/dist/devices/cache.js.map +0 -1
- package/dist/devices/catalog.d.ts +0 -138
- package/dist/devices/catalog.js +0 -768
- package/dist/devices/catalog.js.map +0 -1
- package/dist/devices/device-meta.d.ts +0 -15
- package/dist/devices/device-meta.js +0 -57
- package/dist/devices/device-meta.js.map +0 -1
- package/dist/devices/history-agg.d.ts +0 -37
- package/dist/devices/history-agg.js +0 -139
- package/dist/devices/history-agg.js.map +0 -1
- package/dist/devices/history-query.d.ts +0 -45
- package/dist/devices/history-query.js +0 -182
- package/dist/devices/history-query.js.map +0 -1
- package/dist/devices/param-validator.d.ts +0 -40
- package/dist/devices/param-validator.js +0 -434
- package/dist/devices/param-validator.js.map +0 -1
- package/dist/devices/resources.d.ts +0 -74
- package/dist/devices/resources.js +0 -271
- package/dist/devices/resources.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js.map +0 -1
- package/dist/install/default-steps.d.ts +0 -66
- package/dist/install/default-steps.js +0 -258
- package/dist/install/default-steps.js.map +0 -1
- package/dist/install/preflight.d.ts +0 -60
- package/dist/install/preflight.js +0 -213
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/steps.d.ts +0 -61
- package/dist/install/steps.js +0 -68
- package/dist/install/steps.js.map +0 -1
- package/dist/lib/command-keywords.d.ts +0 -5
- package/dist/lib/command-keywords.js +0 -18
- package/dist/lib/command-keywords.js.map +0 -1
- package/dist/lib/daemon-state.d.ts +0 -24
- package/dist/lib/daemon-state.js +0 -47
- package/dist/lib/daemon-state.js.map +0 -1
- package/dist/lib/destructive-mode.d.ts +0 -2
- package/dist/lib/destructive-mode.js +0 -13
- package/dist/lib/destructive-mode.js.map +0 -1
- package/dist/lib/devices.d.ts +0 -151
- package/dist/lib/devices.js +0 -383
- package/dist/lib/devices.js.map +0 -1
- package/dist/lib/idempotency.d.ts +0 -46
- package/dist/lib/idempotency.js +0 -107
- package/dist/lib/idempotency.js.map +0 -1
- package/dist/lib/plan-store.d.ts +0 -19
- package/dist/lib/plan-store.js +0 -69
- package/dist/lib/plan-store.js.map +0 -1
- package/dist/lib/request-context.d.ts +0 -7
- package/dist/lib/request-context.js +0 -13
- package/dist/lib/request-context.js.map +0 -1
- package/dist/lib/scenes.d.ts +0 -7
- package/dist/lib/scenes.js +0 -11
- package/dist/lib/scenes.js.map +0 -1
- package/dist/logger.d.ts +0 -4
- package/dist/logger.js +0 -17
- package/dist/logger.js.map +0 -1
- package/dist/mcp/device-history.d.ts +0 -36
- package/dist/mcp/device-history.js +0 -146
- package/dist/mcp/device-history.js.map +0 -1
- package/dist/mcp/events-subscription.d.ts +0 -45
- package/dist/mcp/events-subscription.js +0 -214
- package/dist/mcp/events-subscription.js.map +0 -1
- package/dist/mqtt/client.d.ts +0 -25
- package/dist/mqtt/client.js +0 -181
- package/dist/mqtt/client.js.map +0 -1
- package/dist/mqtt/credential.d.ts +0 -16
- package/dist/mqtt/credential.js +0 -31
- package/dist/mqtt/credential.js.map +0 -1
- package/dist/policy/add-rule.d.ts +0 -21
- package/dist/policy/add-rule.js +0 -125
- package/dist/policy/add-rule.js.map +0 -1
- package/dist/policy/diff.d.ts +0 -21
- package/dist/policy/diff.js +0 -92
- package/dist/policy/diff.js.map +0 -1
- package/dist/policy/format.d.ts +0 -6
- package/dist/policy/format.js +0 -58
- package/dist/policy/format.js.map +0 -1
- package/dist/policy/load.d.ts +0 -32
- package/dist/policy/load.js +0 -62
- package/dist/policy/load.js.map +0 -1
- package/dist/policy/migrate.d.ts +0 -21
- package/dist/policy/migrate.js +0 -68
- package/dist/policy/migrate.js.map +0 -1
- package/dist/policy/schema.d.ts +0 -5
- package/dist/policy/schema.js +0 -19
- package/dist/policy/schema.js.map +0 -1
- package/dist/policy/validate.d.ts +0 -19
- package/dist/policy/validate.js +0 -263
- package/dist/policy/validate.js.map +0 -1
- package/dist/rules/action.d.ts +0 -65
- package/dist/rules/action.js +0 -217
- package/dist/rules/action.js.map +0 -1
- package/dist/rules/audit-query.d.ts +0 -51
- package/dist/rules/audit-query.js +0 -90
- package/dist/rules/audit-query.js.map +0 -1
- package/dist/rules/conflict-analyzer.d.ts +0 -57
- package/dist/rules/conflict-analyzer.js +0 -215
- package/dist/rules/conflict-analyzer.js.map +0 -1
- package/dist/rules/cron-scheduler.d.ts +0 -62
- package/dist/rules/cron-scheduler.js +0 -187
- package/dist/rules/cron-scheduler.js.map +0 -1
- package/dist/rules/destructive.d.ts +0 -20
- package/dist/rules/destructive.js +0 -53
- package/dist/rules/destructive.js.map +0 -1
- package/dist/rules/engine.d.ts +0 -193
- package/dist/rules/engine.js +0 -758
- package/dist/rules/engine.js.map +0 -1
- package/dist/rules/matcher.d.ts +0 -56
- package/dist/rules/matcher.js +0 -231
- package/dist/rules/matcher.js.map +0 -1
- package/dist/rules/pid-file.d.ts +0 -43
- package/dist/rules/pid-file.js +0 -96
- package/dist/rules/pid-file.js.map +0 -1
- package/dist/rules/quiet-hours.d.ts +0 -26
- package/dist/rules/quiet-hours.js +0 -46
- package/dist/rules/quiet-hours.js.map +0 -1
- package/dist/rules/suggest.d.ts +0 -20
- package/dist/rules/suggest.js +0 -96
- package/dist/rules/suggest.js.map +0 -1
- package/dist/rules/throttle.d.ts +0 -61
- package/dist/rules/throttle.js +0 -117
- package/dist/rules/throttle.js.map +0 -1
- package/dist/rules/types.d.ts +0 -117
- package/dist/rules/types.js +0 -35
- package/dist/rules/types.js.map +0 -1
- package/dist/rules/webhook-listener.d.ts +0 -63
- package/dist/rules/webhook-listener.js +0 -224
- package/dist/rules/webhook-listener.js.map +0 -1
- package/dist/rules/webhook-token.d.ts +0 -50
- package/dist/rules/webhook-token.js +0 -91
- package/dist/rules/webhook-token.js.map +0 -1
- package/dist/schema/field-aliases.d.ts +0 -34
- package/dist/schema/field-aliases.js +0 -132
- package/dist/schema/field-aliases.js.map +0 -1
- package/dist/sinks/dispatcher.d.ts +0 -7
- package/dist/sinks/dispatcher.js +0 -13
- package/dist/sinks/dispatcher.js.map +0 -1
- package/dist/sinks/file.d.ts +0 -6
- package/dist/sinks/file.js +0 -20
- package/dist/sinks/file.js.map +0 -1
- package/dist/sinks/format.d.ts +0 -20
- package/dist/sinks/format.js +0 -57
- package/dist/sinks/format.js.map +0 -1
- package/dist/sinks/homeassistant.d.ts +0 -18
- package/dist/sinks/homeassistant.js +0 -45
- package/dist/sinks/homeassistant.js.map +0 -1
- package/dist/sinks/openclaw.d.ts +0 -13
- package/dist/sinks/openclaw.js +0 -34
- package/dist/sinks/openclaw.js.map +0 -1
- package/dist/sinks/stdout.d.ts +0 -4
- package/dist/sinks/stdout.js +0 -6
- package/dist/sinks/stdout.js.map +0 -1
- package/dist/sinks/telegram.d.ts +0 -11
- package/dist/sinks/telegram.js +0 -29
- package/dist/sinks/telegram.js.map +0 -1
- package/dist/sinks/types.d.ts +0 -13
- package/dist/sinks/types.js +0 -2
- package/dist/sinks/types.js.map +0 -1
- package/dist/sinks/webhook.d.ts +0 -6
- package/dist/sinks/webhook.js +0 -23
- package/dist/sinks/webhook.js.map +0 -1
- package/dist/status-sync/manager.d.ts +0 -48
- package/dist/status-sync/manager.js +0 -269
- package/dist/status-sync/manager.js.map +0 -1
- package/dist/utils/arg-parsers.d.ts +0 -16
- package/dist/utils/arg-parsers.js +0 -67
- package/dist/utils/arg-parsers.js.map +0 -1
- package/dist/utils/audit.d.ts +0 -69
- package/dist/utils/audit.js +0 -122
- package/dist/utils/audit.js.map +0 -1
- package/dist/utils/filter.d.ts +0 -81
- package/dist/utils/filter.js +0 -190
- package/dist/utils/filter.js.map +0 -1
- package/dist/utils/flags.d.ts +0 -72
- package/dist/utils/flags.js +0 -187
- package/dist/utils/flags.js.map +0 -1
- package/dist/utils/format.d.ts +0 -9
- package/dist/utils/format.js +0 -118
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/health.d.ts +0 -48
- package/dist/utils/health.js +0 -102
- package/dist/utils/health.js.map +0 -1
- package/dist/utils/help-json.d.ts +0 -39
- package/dist/utils/help-json.js +0 -55
- package/dist/utils/help-json.js.map +0 -1
- package/dist/utils/name-resolver.d.ts +0 -26
- package/dist/utils/name-resolver.js +0 -138
- package/dist/utils/name-resolver.js.map +0 -1
- package/dist/utils/output.d.ts +0 -73
- package/dist/utils/output.js +0 -405
- package/dist/utils/output.js.map +0 -1
- package/dist/utils/quota.d.ts +0 -61
- package/dist/utils/quota.js +0 -228
- package/dist/utils/quota.js.map +0 -1
- package/dist/utils/redact.d.ts +0 -23
- package/dist/utils/redact.js +0 -69
- package/dist/utils/redact.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -72
- package/dist/utils/retry.js +0 -141
- package/dist/utils/retry.js.map +0 -1
- package/dist/utils/string.d.ts +0 -2
- package/dist/utils/string.js +0 -23
- package/dist/utils/string.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.js +0 -5
- package/dist/version.js.map +0 -1
package/dist/commands/config.js
DELETED
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import readline from 'node:readline';
|
|
5
|
-
import { execFileSync } from 'node:child_process';
|
|
6
|
-
import { stringArg } from '../utils/arg-parsers.js';
|
|
7
|
-
import { intArg } from '../utils/arg-parsers.js';
|
|
8
|
-
import { saveConfig, showConfig, getConfigSummary, listProfiles, readProfileMeta } from '../config.js';
|
|
9
|
-
import { isJsonMode, printJson, exitWithError } from '../utils/output.js';
|
|
10
|
-
import chalk from 'chalk';
|
|
11
|
-
function parseEnvFile(file) {
|
|
12
|
-
const out = {};
|
|
13
|
-
const raw = fs.readFileSync(file, 'utf-8');
|
|
14
|
-
for (const line of raw.split(/\r?\n/)) {
|
|
15
|
-
const trimmed = line.trim();
|
|
16
|
-
if (!trimmed || trimmed.startsWith('#'))
|
|
17
|
-
continue;
|
|
18
|
-
const eq = trimmed.indexOf('=');
|
|
19
|
-
if (eq === -1)
|
|
20
|
-
continue;
|
|
21
|
-
const key = trimmed.slice(0, eq).trim();
|
|
22
|
-
let val = trimmed.slice(eq + 1).trim();
|
|
23
|
-
if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
|
|
24
|
-
val = val.slice(1, -1);
|
|
25
|
-
}
|
|
26
|
-
if (key === 'SWITCHBOT_TOKEN')
|
|
27
|
-
out.token = val;
|
|
28
|
-
else if (key === 'SWITCHBOT_SECRET')
|
|
29
|
-
out.secret = val;
|
|
30
|
-
}
|
|
31
|
-
return out;
|
|
32
|
-
}
|
|
33
|
-
function readFromOp(ref) {
|
|
34
|
-
// 1Password CLI: `op read "op://vault/item/field"` → single line on stdout
|
|
35
|
-
const stdout = execFileSync('op', ['read', ref], { encoding: 'utf-8' });
|
|
36
|
-
return stdout.trim();
|
|
37
|
-
}
|
|
38
|
-
// Replace raw token/secret positional slots in process.argv with "***" so
|
|
39
|
-
// neither verbose traces nor crash dumps nor any later inspector observe them.
|
|
40
|
-
function scrubArgvCredentials() {
|
|
41
|
-
const argv = process.argv;
|
|
42
|
-
for (let i = 2; i < argv.length - 2; i++) {
|
|
43
|
-
if (argv[i] === 'config' && argv[i + 1] === 'set-token') {
|
|
44
|
-
// Slots i+2 and i+3 (if not option flags) are token/secret.
|
|
45
|
-
for (const off of [2, 3]) {
|
|
46
|
-
const slot = i + off;
|
|
47
|
-
if (slot < argv.length && !argv[slot].startsWith('-')) {
|
|
48
|
-
argv[slot] = '***';
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
async function promptSecret(question) {
|
|
56
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stderr, terminal: true });
|
|
57
|
-
const stdoutAny = process.stdout;
|
|
58
|
-
const mutableStdout = process.stderr;
|
|
59
|
-
return new Promise((resolve) => {
|
|
60
|
-
process.stderr.write(question);
|
|
61
|
-
const stdin = process.stdin;
|
|
62
|
-
let answer = '';
|
|
63
|
-
const onData = (chunk) => {
|
|
64
|
-
const s = chunk.toString('utf-8');
|
|
65
|
-
for (const ch of s) {
|
|
66
|
-
if (ch === '\r' || ch === '\n') {
|
|
67
|
-
stdin.removeListener('data', onData);
|
|
68
|
-
if (stdin.setRawMode)
|
|
69
|
-
stdin.setRawMode(false);
|
|
70
|
-
stdin.pause();
|
|
71
|
-
process.stderr.write('\n');
|
|
72
|
-
rl.close();
|
|
73
|
-
resolve(answer);
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
if (ch === '\u0003') {
|
|
77
|
-
process.exit(130);
|
|
78
|
-
}
|
|
79
|
-
if (ch === '\u007f' || ch === '\b') {
|
|
80
|
-
answer = answer.slice(0, -1);
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
answer += ch;
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
if (stdin.setRawMode)
|
|
87
|
-
stdin.setRawMode(true);
|
|
88
|
-
stdin.resume();
|
|
89
|
-
stdin.on('data', onData);
|
|
90
|
-
void stdoutAny;
|
|
91
|
-
void mutableStdout;
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Interactive echo-off prompt for token + secret. Used by both
|
|
96
|
-
* `switchbot config set-token` and the install orchestrator. Throws if
|
|
97
|
-
* stdin is not a TTY.
|
|
98
|
-
*/
|
|
99
|
-
export async function promptTokenAndSecret() {
|
|
100
|
-
if (!process.stdin.isTTY) {
|
|
101
|
-
throw new Error('interactive prompt requires a TTY');
|
|
102
|
-
}
|
|
103
|
-
const token = (await promptSecret('Token: ')).trim();
|
|
104
|
-
const secret = (await promptSecret('Secret: ')).trim();
|
|
105
|
-
if (!token || !secret) {
|
|
106
|
-
throw new Error('token and secret are both required');
|
|
107
|
-
}
|
|
108
|
-
return { token, secret };
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Read a two-line credential file (line 1 = token, line 2 = secret)
|
|
112
|
-
* and unlink it on success. The installer's `--token-file` escape
|
|
113
|
-
* hatch uses this; keeps credentials off the command line and shell
|
|
114
|
-
* history for CI-style installs.
|
|
115
|
-
*/
|
|
116
|
-
export function readCredentialsFile(filePath) {
|
|
117
|
-
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
118
|
-
const lines = raw.split(/\r?\n/).filter((l) => l.length > 0);
|
|
119
|
-
if (lines.length < 2) {
|
|
120
|
-
throw new Error(`credential file ${filePath} must contain two lines: token, then secret`);
|
|
121
|
-
}
|
|
122
|
-
return { token: lines[0].trim(), secret: lines[1].trim() };
|
|
123
|
-
}
|
|
124
|
-
export function registerConfigCommand(program) {
|
|
125
|
-
const config = program
|
|
126
|
-
.command('config')
|
|
127
|
-
.description('Manage SwitchBot API credentials')
|
|
128
|
-
.addHelpText('after', `
|
|
129
|
-
Credential priority:
|
|
130
|
-
1. Environment variables: SWITCHBOT_TOKEN and SWITCHBOT_SECRET
|
|
131
|
-
2. --config <path> (explicit file override)
|
|
132
|
-
3. --profile <name> → ~/.switchbot/profiles/<name>.json
|
|
133
|
-
4. ~/.switchbot/config.json (default)
|
|
134
|
-
|
|
135
|
-
Obtain your token/secret from the SwitchBot mobile app:
|
|
136
|
-
Profile → Preferences → Developer Options → Get Token
|
|
137
|
-
`);
|
|
138
|
-
config
|
|
139
|
-
.command('set-token')
|
|
140
|
-
.description('Save token and secret (mode 0600). Use --profile to target a named profile.')
|
|
141
|
-
.argument('[token]', 'API token; omit when using --from-env-file / --from-op')
|
|
142
|
-
.argument('[secret]', 'API client secret; omit when using --from-env-file / --from-op')
|
|
143
|
-
.option('--from-env-file <path>', 'Read SWITCHBOT_TOKEN and SWITCHBOT_SECRET from a dotenv file', stringArg('--from-env-file'))
|
|
144
|
-
.option('--from-op <tokenRef>', 'Read token via 1Password CLI (op read). Pair with --op-secret <ref>', stringArg('--from-op'))
|
|
145
|
-
.option('--op-secret <secretRef>', '1Password reference for the secret, used with --from-op', stringArg('--op-secret'))
|
|
146
|
-
.option('--label <text>', 'Human-friendly label for this profile (shown in config show / list-profiles)', stringArg('--label'))
|
|
147
|
-
.option('--description <text>', 'Longer description, e.g. "home account" or "work devices"', stringArg('--description'))
|
|
148
|
-
.option('--daily-cap <n>', 'Local cap on SwitchBot API calls per UTC day for this profile', intArg('--daily-cap', { min: 1 }))
|
|
149
|
-
.option('--default-flags <csv>', 'Comma-separated flags auto-applied for this profile (e.g. "--audit-log")', stringArg('--default-flags'))
|
|
150
|
-
.addHelpText('after', `
|
|
151
|
-
Examples:
|
|
152
|
-
# Interactive (recommended) — credentials never touch shell history / ps listing
|
|
153
|
-
$ switchbot config set-token
|
|
154
|
-
Token: ****
|
|
155
|
-
Secret: ****
|
|
156
|
-
|
|
157
|
-
# Import from dotenv / 1Password (non-interactive, still safe)
|
|
158
|
-
$ switchbot config set-token --from-env-file ./.env
|
|
159
|
-
$ switchbot config set-token --from-op op://vault/switchbot/token --op-secret op://vault/switchbot/secret
|
|
160
|
-
|
|
161
|
-
# Advanced / non-interactive (DISCOURAGED — leaks to shell history)
|
|
162
|
-
$ switchbot config set-token <token> <secret>
|
|
163
|
-
$ switchbot --profile work config set-token <token> <secret>
|
|
164
|
-
|
|
165
|
-
Files are written with mode 0600. Profiles live under ~/.switchbot/profiles/<name>.json.
|
|
166
|
-
`)
|
|
167
|
-
.action(async (tokenArg, secretArg, options) => {
|
|
168
|
-
let token = tokenArg;
|
|
169
|
-
let secret = secretArg;
|
|
170
|
-
const hadPositional = tokenArg !== undefined && secretArg !== undefined;
|
|
171
|
-
// Scrub early: commander has already parsed the values, so we can safely
|
|
172
|
-
// rewrite argv before anything else (verbose trace, crash dumps, …) sees it.
|
|
173
|
-
if (hadPositional) {
|
|
174
|
-
scrubArgvCredentials();
|
|
175
|
-
console.error('⚠ Passing token/secret as positional arguments is discouraged — they may be persisted in shell history, process listings, and agent logs.');
|
|
176
|
-
console.error(' Prefer: switchbot config set-token (interactive), --from-env-file, or --from-op.');
|
|
177
|
-
}
|
|
178
|
-
if (options.fromEnvFile) {
|
|
179
|
-
if (!fs.existsSync(options.fromEnvFile)) {
|
|
180
|
-
exitWithError({
|
|
181
|
-
code: 2,
|
|
182
|
-
kind: 'usage',
|
|
183
|
-
message: `--from-env-file: file not found: ${options.fromEnvFile}`,
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
const parsed = parseEnvFile(options.fromEnvFile);
|
|
187
|
-
token = token ?? parsed.token;
|
|
188
|
-
secret = secret ?? parsed.secret;
|
|
189
|
-
}
|
|
190
|
-
if (options.fromOp) {
|
|
191
|
-
if (!options.opSecret) {
|
|
192
|
-
exitWithError({
|
|
193
|
-
code: 2,
|
|
194
|
-
kind: 'usage',
|
|
195
|
-
message: '--from-op requires --op-secret <ref> for the secret reference.',
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
try {
|
|
199
|
-
token = readFromOp(options.fromOp);
|
|
200
|
-
secret = readFromOp(options.opSecret);
|
|
201
|
-
}
|
|
202
|
-
catch (err) {
|
|
203
|
-
exitWithError({
|
|
204
|
-
code: 1,
|
|
205
|
-
kind: 'runtime',
|
|
206
|
-
message: `1Password CLI read failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
207
|
-
hint: 'Ensure the "op" CLI is installed and authenticated (op signin).',
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
// No credentials yet and stdin is a TTY → interactive prompt (safest path).
|
|
212
|
-
if ((!token || !secret) && !options.fromEnvFile && !options.fromOp && process.stdin.isTTY) {
|
|
213
|
-
if (isJsonMode()) {
|
|
214
|
-
exitWithError({
|
|
215
|
-
code: 2,
|
|
216
|
-
kind: 'usage',
|
|
217
|
-
message: 'Interactive mode cannot run under --json. Provide token/secret via --from-env-file, --from-op, or positional args.',
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
try {
|
|
221
|
-
if (!token)
|
|
222
|
-
token = (await promptSecret('Token: ')).trim();
|
|
223
|
-
if (!secret)
|
|
224
|
-
secret = (await promptSecret('Secret: ')).trim();
|
|
225
|
-
}
|
|
226
|
-
catch {
|
|
227
|
-
console.error('Interactive prompt failed.');
|
|
228
|
-
process.exit(1);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
if (!token || !secret) {
|
|
232
|
-
exitWithError({
|
|
233
|
-
code: 2,
|
|
234
|
-
kind: 'usage',
|
|
235
|
-
message: 'Missing token/secret. Run interactively, or use --from-env-file / --from-op, or pass positional arguments (discouraged).',
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
saveConfig(token, secret, {
|
|
239
|
-
label: options.label,
|
|
240
|
-
description: options.description,
|
|
241
|
-
limits: options.dailyCap ? { dailyCap: Number.parseInt(options.dailyCap, 10) } : undefined,
|
|
242
|
-
defaults: options.defaultFlags
|
|
243
|
-
? {
|
|
244
|
-
flags: options.defaultFlags
|
|
245
|
-
.split(',')
|
|
246
|
-
.map((s) => s.trim())
|
|
247
|
-
.filter(Boolean),
|
|
248
|
-
}
|
|
249
|
-
: undefined,
|
|
250
|
-
});
|
|
251
|
-
if (isJsonMode()) {
|
|
252
|
-
printJson({ ok: true, message: 'credentials saved' });
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
console.log(chalk.green('✓ Credentials saved'));
|
|
256
|
-
// Keychain-first hint: proactively suggest storing in OS keychain when
|
|
257
|
-
// the user is on a supported platform and saved to file (default path).
|
|
258
|
-
try {
|
|
259
|
-
const { selectCredentialStore } = await import('../credentials/keychain.js');
|
|
260
|
-
const store = await selectCredentialStore();
|
|
261
|
-
if (store.describe().backend === 'file') {
|
|
262
|
-
const platform = process.platform;
|
|
263
|
-
if (platform === 'darwin' || platform === 'win32') {
|
|
264
|
-
console.error(chalk.grey('Tip: Your OS supports a native keychain. Run `switchbot auth keychain store` to move credentials off the plain config file for better security.'));
|
|
265
|
-
}
|
|
266
|
-
else if (platform === 'linux') {
|
|
267
|
-
console.error(chalk.grey('Tip: If you have GNOME Keyring (secret-tool) installed, run `switchbot auth keychain store` to store credentials more securely.'));
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
catch {
|
|
272
|
-
// Keychain probe failed — silently skip the tip
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
config
|
|
277
|
-
.command('show')
|
|
278
|
-
.description('Show the current credential source and a masked secret')
|
|
279
|
-
.action(() => {
|
|
280
|
-
if (isJsonMode()) {
|
|
281
|
-
printJson(getConfigSummary());
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
showConfig();
|
|
285
|
-
});
|
|
286
|
-
config
|
|
287
|
-
.command('list-profiles')
|
|
288
|
-
.description('List named profiles under ~/.switchbot/profiles/ (with labels and daily caps)')
|
|
289
|
-
.action(() => {
|
|
290
|
-
const profiles = listProfiles();
|
|
291
|
-
const enriched = profiles.map((p) => {
|
|
292
|
-
const meta = readProfileMeta(p);
|
|
293
|
-
return {
|
|
294
|
-
name: p,
|
|
295
|
-
label: meta?.label,
|
|
296
|
-
description: meta?.description,
|
|
297
|
-
dailyCap: meta?.limits?.dailyCap,
|
|
298
|
-
};
|
|
299
|
-
});
|
|
300
|
-
if (isJsonMode()) {
|
|
301
|
-
printJson({ profiles: enriched });
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
if (profiles.length === 0) {
|
|
305
|
-
console.log('No profiles. Create one with: switchbot --profile <name> config set-token ...');
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
for (const p of enriched) {
|
|
309
|
-
const bits = [p.name];
|
|
310
|
-
if (p.label)
|
|
311
|
-
bits.push(`— ${p.label}`);
|
|
312
|
-
if (p.dailyCap)
|
|
313
|
-
bits.push(`[dailyCap=${p.dailyCap}]`);
|
|
314
|
-
console.log(bits.join(' '));
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
// switchbot config agent-profile [--write]
|
|
318
|
-
config
|
|
319
|
-
.command('agent-profile')
|
|
320
|
-
.description('Emit (or write) an agent-safe profile template with conservative rate limits and audit logging.')
|
|
321
|
-
.option('--write', 'Write the template to ~/.switchbot/profiles/agent.json (requires --profile agent config set-token to add credentials).')
|
|
322
|
-
.option('--force', 'Overwrite an existing agent.json when used with --write.')
|
|
323
|
-
.addHelpText('after', `
|
|
324
|
-
Outputs a starter profile.json suitable for AI agent / MCP integration:
|
|
325
|
-
- dailyCap: 100 (conservative; prevents runaway automation)
|
|
326
|
-
- label: "agent"
|
|
327
|
-
- description: "AI agent profile — conservative limits + audit enabled"
|
|
328
|
-
- defaults: { auditLog: true } (enables audit logging by default)
|
|
329
|
-
|
|
330
|
-
After writing, add credentials:
|
|
331
|
-
$ switchbot --profile agent config set-token <token> <secret>
|
|
332
|
-
|
|
333
|
-
Then use the profile:
|
|
334
|
-
$ switchbot --profile agent devices list
|
|
335
|
-
`)
|
|
336
|
-
.action((opts) => {
|
|
337
|
-
const template = {
|
|
338
|
-
label: 'agent',
|
|
339
|
-
description: 'AI agent profile — conservative limits + audit enabled',
|
|
340
|
-
limits: {
|
|
341
|
-
dailyCap: 100,
|
|
342
|
-
},
|
|
343
|
-
defaults: {
|
|
344
|
-
auditLog: true,
|
|
345
|
-
},
|
|
346
|
-
};
|
|
347
|
-
if (opts.write) {
|
|
348
|
-
const dir = path.join(os.homedir(), '.switchbot', 'profiles');
|
|
349
|
-
const dest = path.join(dir, 'agent.json');
|
|
350
|
-
if (!opts.force && fs.existsSync(dest)) {
|
|
351
|
-
exitWithError({ code: 2, kind: 'usage', message: `Agent profile already exists: ${dest}. Use --force to overwrite.` });
|
|
352
|
-
}
|
|
353
|
-
if (!fs.existsSync(dir)) {
|
|
354
|
-
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
355
|
-
}
|
|
356
|
-
fs.writeFileSync(dest, JSON.stringify(template, null, 2), { mode: 0o600 });
|
|
357
|
-
if (isJsonMode()) {
|
|
358
|
-
printJson({ ok: true, path: dest, template });
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
console.log(`Agent profile written: ${dest}`);
|
|
362
|
-
console.log(`Next: switchbot --profile agent config set-token <token> <secret>`);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
if (isJsonMode()) {
|
|
367
|
-
printJson(template);
|
|
368
|
-
}
|
|
369
|
-
else {
|
|
370
|
-
console.log(JSON.stringify(template, null, 2));
|
|
371
|
-
console.log('');
|
|
372
|
-
console.log('Write with: switchbot config agent-profile --write');
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|