@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.
- package/README.md +174 -18
- package/dist/api/client.d.ts +7 -1
- package/dist/api/client.js +44 -8
- package/dist/api/client.js.map +1 -1
- package/dist/commands/batch.d.ts +2 -0
- package/dist/commands/batch.js +252 -0
- package/dist/commands/batch.js.map +1 -0
- package/dist/commands/cache.d.ts +2 -0
- package/dist/commands/cache.js +108 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/capabilities.d.ts +2 -0
- package/dist/commands/capabilities.js +91 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/catalog.d.ts +2 -0
- package/dist/commands/catalog.js +291 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/config.js +123 -10
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/devices.js +234 -112
- package/dist/commands/devices.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +147 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/events.d.ts +15 -0
- package/dist/commands/events.js +188 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/explain.d.ts +2 -0
- package/dist/commands/explain.js +137 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/history.d.ts +2 -0
- package/dist/commands/history.js +104 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/mcp.d.ts +4 -0
- package/dist/commands/mcp.js +386 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/plan.d.ts +37 -0
- package/dist/commands/plan.js +344 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/quota.d.ts +2 -0
- package/dist/commands/quota.js +77 -0
- package/dist/commands/quota.js.map +1 -0
- package/dist/commands/scenes.js +19 -13
- package/dist/commands/scenes.js.map +1 -1
- package/dist/commands/schema.d.ts +2 -0
- package/dist/commands/schema.js +77 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/watch.d.ts +2 -0
- package/dist/commands/watch.js +161 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/webhook.js +37 -22
- package/dist/commands/webhook.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.js +32 -6
- package/dist/config.js.map +1 -1
- package/dist/devices/cache.d.ts +75 -0
- package/dist/devices/cache.js +225 -0
- package/dist/devices/cache.js.map +1 -0
- package/dist/devices/catalog.d.ts +49 -0
- package/dist/devices/catalog.js +362 -92
- package/dist/devices/catalog.js.map +1 -1
- package/dist/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/devices.d.ts +144 -0
- package/dist/lib/devices.js +329 -0
- package/dist/lib/devices.js.map +1 -0
- package/dist/lib/scenes.d.ts +7 -0
- package/dist/lib/scenes.js +11 -0
- package/dist/lib/scenes.js.map +1 -0
- package/dist/utils/audit.d.ts +13 -0
- package/dist/utils/audit.js +43 -0
- package/dist/utils/audit.js.map +1 -0
- package/dist/utils/filter.d.ts +45 -0
- package/dist/utils/filter.js +96 -0
- package/dist/utils/filter.js.map +1 -0
- package/dist/utils/flags.d.ts +42 -0
- package/dist/utils/flags.js +108 -0
- package/dist/utils/flags.js.map +1 -1
- package/dist/utils/format.d.ts +9 -0
- package/dist/utils/format.js +109 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/output.d.ts +11 -0
- package/dist/utils/output.js +37 -6
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/quota.d.ts +48 -0
- package/dist/utils/quota.js +144 -0
- package/dist/utils/quota.js.map +1 -0
- package/dist/utils/retry.d.ts +23 -0
- package/dist/utils/retry.js +60 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +4 -1
package/dist/commands/config.js
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { saveConfig, showConfig, listProfiles } from '../config.js';
|
|
4
|
+
import { isJsonMode, printJson } from '../utils/output.js';
|
|
2
5
|
import chalk from 'chalk';
|
|
6
|
+
function parseEnvFile(file) {
|
|
7
|
+
const out = {};
|
|
8
|
+
const raw = fs.readFileSync(file, 'utf-8');
|
|
9
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
10
|
+
const trimmed = line.trim();
|
|
11
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
12
|
+
continue;
|
|
13
|
+
const eq = trimmed.indexOf('=');
|
|
14
|
+
if (eq === -1)
|
|
15
|
+
continue;
|
|
16
|
+
const key = trimmed.slice(0, eq).trim();
|
|
17
|
+
let val = trimmed.slice(eq + 1).trim();
|
|
18
|
+
if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
|
|
19
|
+
val = val.slice(1, -1);
|
|
20
|
+
}
|
|
21
|
+
if (key === 'SWITCHBOT_TOKEN')
|
|
22
|
+
out.token = val;
|
|
23
|
+
else if (key === 'SWITCHBOT_SECRET')
|
|
24
|
+
out.secret = val;
|
|
25
|
+
}
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
function readFromOp(ref) {
|
|
29
|
+
// 1Password CLI: `op read "op://vault/item/field"` → single line on stdout
|
|
30
|
+
const stdout = execFileSync('op', ['read', ref], { encoding: 'utf-8' });
|
|
31
|
+
return stdout.trim();
|
|
32
|
+
}
|
|
3
33
|
export function registerConfigCommand(program) {
|
|
4
34
|
const config = program
|
|
5
35
|
.command('config')
|
|
@@ -7,25 +37,92 @@ export function registerConfigCommand(program) {
|
|
|
7
37
|
.addHelpText('after', `
|
|
8
38
|
Credential priority:
|
|
9
39
|
1. Environment variables: SWITCHBOT_TOKEN and SWITCHBOT_SECRET
|
|
10
|
-
2.
|
|
40
|
+
2. --config <path> (explicit file override)
|
|
41
|
+
3. --profile <name> → ~/.switchbot/profiles/<name>.json
|
|
42
|
+
4. ~/.switchbot/config.json (default)
|
|
11
43
|
|
|
12
44
|
Obtain your token/secret from the SwitchBot mobile app:
|
|
13
45
|
Profile → Preferences → Developer Options → Get Token
|
|
14
46
|
`);
|
|
15
47
|
config
|
|
16
48
|
.command('set-token')
|
|
17
|
-
.description('Save token and secret
|
|
18
|
-
.argument('
|
|
19
|
-
.argument('
|
|
49
|
+
.description('Save token and secret (mode 0600). Use --profile to target a named profile.')
|
|
50
|
+
.argument('[token]', 'API token; omit when using --from-env-file / --from-op')
|
|
51
|
+
.argument('[secret]', 'API client secret; omit when using --from-env-file / --from-op')
|
|
52
|
+
.option('--from-env-file <path>', 'Read SWITCHBOT_TOKEN and SWITCHBOT_SECRET from a dotenv file')
|
|
53
|
+
.option('--from-op <tokenRef>', 'Read token via 1Password CLI (op read). Pair with --op-secret <ref>')
|
|
54
|
+
.option('--op-secret <secretRef>', '1Password reference for the secret, used with --from-op')
|
|
20
55
|
.addHelpText('after', `
|
|
21
|
-
|
|
22
|
-
$ switchbot config set-token
|
|
56
|
+
Examples:
|
|
57
|
+
$ switchbot config set-token <token> <secret>
|
|
58
|
+
$ switchbot --profile work config set-token <token> <secret>
|
|
59
|
+
$ switchbot config set-token --from-env-file ./.env
|
|
60
|
+
$ switchbot config set-token --from-op op://vault/switchbot/token --op-secret op://vault/switchbot/secret
|
|
23
61
|
|
|
24
|
-
|
|
62
|
+
Files are written with mode 0600. Profiles live under ~/.switchbot/profiles/<name>.json.
|
|
25
63
|
`)
|
|
26
|
-
.action((
|
|
64
|
+
.action(async (tokenArg, secretArg, options) => {
|
|
65
|
+
let token = tokenArg;
|
|
66
|
+
let secret = secretArg;
|
|
67
|
+
if (options.fromEnvFile) {
|
|
68
|
+
if (!fs.existsSync(options.fromEnvFile)) {
|
|
69
|
+
const msg = `--from-env-file: file not found: ${options.fromEnvFile}`;
|
|
70
|
+
if (isJsonMode()) {
|
|
71
|
+
console.error(JSON.stringify({ error: { code: 2, kind: 'usage', message: msg } }));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.error(msg);
|
|
75
|
+
}
|
|
76
|
+
process.exit(2);
|
|
77
|
+
}
|
|
78
|
+
const parsed = parseEnvFile(options.fromEnvFile);
|
|
79
|
+
token = token ?? parsed.token;
|
|
80
|
+
secret = secret ?? parsed.secret;
|
|
81
|
+
}
|
|
82
|
+
if (options.fromOp) {
|
|
83
|
+
if (!options.opSecret) {
|
|
84
|
+
const msg = '--from-op requires --op-secret <ref> for the secret reference.';
|
|
85
|
+
if (isJsonMode()) {
|
|
86
|
+
console.error(JSON.stringify({ error: { code: 2, kind: 'usage', message: msg } }));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.error(msg);
|
|
90
|
+
}
|
|
91
|
+
process.exit(2);
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
token = readFromOp(options.fromOp);
|
|
95
|
+
secret = readFromOp(options.opSecret);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
const msg = `1Password CLI read failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
99
|
+
if (isJsonMode()) {
|
|
100
|
+
console.error(JSON.stringify({ error: { code: 1, kind: 'runtime', message: msg, hint: 'Ensure the "op" CLI is installed and authenticated (op signin).' } }));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.error(msg);
|
|
104
|
+
console.error('Ensure the "op" CLI is installed and authenticated (op signin).');
|
|
105
|
+
}
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!token || !secret) {
|
|
110
|
+
const msg = 'Missing token/secret. Provide positional arguments or use --from-env-file / --from-op.';
|
|
111
|
+
if (isJsonMode()) {
|
|
112
|
+
console.error(JSON.stringify({ error: { code: 2, kind: 'usage', message: msg } }));
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.error(msg);
|
|
116
|
+
}
|
|
117
|
+
process.exit(2);
|
|
118
|
+
}
|
|
27
119
|
saveConfig(token, secret);
|
|
28
|
-
|
|
120
|
+
if (isJsonMode()) {
|
|
121
|
+
printJson({ ok: true, message: 'credentials saved' });
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
console.log(chalk.green('✓ Credentials saved'));
|
|
125
|
+
}
|
|
29
126
|
});
|
|
30
127
|
config
|
|
31
128
|
.command('show')
|
|
@@ -33,5 +130,21 @@ Note: the file is written with mode 0600 so only your user can read it.
|
|
|
33
130
|
.action(() => {
|
|
34
131
|
showConfig();
|
|
35
132
|
});
|
|
133
|
+
config
|
|
134
|
+
.command('list-profiles')
|
|
135
|
+
.description('List named profiles under ~/.switchbot/profiles/')
|
|
136
|
+
.action(() => {
|
|
137
|
+
const profiles = listProfiles();
|
|
138
|
+
if (isJsonMode()) {
|
|
139
|
+
printJson({ profiles });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (profiles.length === 0) {
|
|
143
|
+
console.log('No profiles. Create one with: switchbot --profile <name> config set-token ...');
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
for (const p of profiles)
|
|
147
|
+
console.log(p);
|
|
148
|
+
});
|
|
36
149
|
}
|
|
37
150
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|