@switchbot/openapi-cli 3.2.0 → 3.2.1
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/dist/api/client.d.ts +31 -0
- package/dist/api/client.js +236 -0
- package/dist/api/client.js.map +1 -0
- package/dist/auth.d.ts +1 -0
- package/dist/auth.js +21 -0
- package/dist/auth.js.map +1 -0
- package/dist/commands/agent-bootstrap.d.ts +10 -0
- package/dist/commands/agent-bootstrap.js +200 -0
- package/dist/commands/agent-bootstrap.js.map +1 -0
- package/dist/commands/auth.d.ts +18 -0
- package/dist/commands/auth.js +355 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/batch.d.ts +2 -0
- package/dist/commands/batch.js +414 -0
- package/dist/commands/batch.js.map +1 -0
- package/dist/commands/cache.d.ts +2 -0
- package/dist/commands/cache.js +127 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/capabilities.d.ts +31 -0
- package/dist/commands/capabilities.js +383 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/catalog.d.ts +2 -0
- package/dist/commands/catalog.js +360 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/completion.d.ts +2 -0
- package/dist/commands/completion.js +386 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +21 -0
- package/dist/commands/config.js +377 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/daemon.d.ts +2 -0
- package/dist/commands/daemon.js +411 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/device-meta.d.ts +2 -0
- package/dist/commands/device-meta.js +160 -0
- package/dist/commands/device-meta.js.map +1 -0
- package/dist/commands/devices.d.ts +2 -0
- package/dist/commands/devices.js +949 -0
- package/dist/commands/devices.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.js +1016 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/events.d.ts +31 -0
- package/dist/commands/events.js +564 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/expand.d.ts +2 -0
- package/dist/commands/expand.js +131 -0
- package/dist/commands/expand.js.map +1 -0
- package/dist/commands/explain.d.ts +2 -0
- package/dist/commands/explain.js +140 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/health.d.ts +8 -0
- package/dist/commands/health.js +114 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/history.d.ts +2 -0
- package/dist/commands/history.js +321 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/identity.d.ts +45 -0
- package/dist/commands/identity.js +60 -0
- package/dist/commands/identity.js.map +1 -0
- package/dist/commands/install.d.ts +20 -0
- package/dist/commands/install.js +247 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/mcp.d.ts +14 -0
- package/dist/commands/mcp.js +2018 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/plan.d.ts +51 -0
- package/dist/commands/plan.js +654 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/policy.d.ts +24 -0
- package/dist/commands/policy.js +587 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/quota.d.ts +2 -0
- package/dist/commands/quota.js +79 -0
- package/dist/commands/quota.js.map +1 -0
- package/dist/commands/rules.d.ts +2 -0
- package/dist/commands/rules.js +876 -0
- package/dist/commands/rules.js.map +1 -0
- package/dist/commands/scenes.d.ts +2 -0
- package/dist/commands/scenes.js +265 -0
- package/dist/commands/scenes.js.map +1 -0
- package/dist/commands/schema.d.ts +2 -0
- package/dist/commands/schema.js +185 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/status-sync.d.ts +2 -0
- package/dist/commands/status-sync.js +132 -0
- package/dist/commands/status-sync.js.map +1 -0
- package/dist/commands/uninstall.d.ts +20 -0
- package/dist/commands/uninstall.js +238 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/upgrade-check.d.ts +2 -0
- package/dist/commands/upgrade-check.js +107 -0
- package/dist/commands/upgrade-check.js.map +1 -0
- package/dist/commands/watch.d.ts +2 -0
- package/dist/commands/watch.js +195 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/webhook.d.ts +2 -0
- package/dist/commands/webhook.js +183 -0
- package/dist/commands/webhook.js.map +1 -0
- package/dist/config.d.ts +57 -0
- package/dist/config.js +259 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials/backends/file.d.ts +18 -0
- package/dist/credentials/backends/file.js +102 -0
- package/dist/credentials/backends/file.js.map +1 -0
- package/dist/credentials/backends/linux.d.ts +16 -0
- package/dist/credentials/backends/linux.js +130 -0
- package/dist/credentials/backends/linux.js.map +1 -0
- package/dist/credentials/backends/macos.d.ts +18 -0
- package/dist/credentials/backends/macos.js +130 -0
- package/dist/credentials/backends/macos.js.map +1 -0
- package/dist/credentials/backends/windows.d.ts +23 -0
- package/dist/credentials/backends/windows.js +216 -0
- package/dist/credentials/backends/windows.js.map +1 -0
- package/dist/credentials/keychain.d.ts +83 -0
- package/dist/credentials/keychain.js +89 -0
- package/dist/credentials/keychain.js.map +1 -0
- package/dist/credentials/prime.d.ts +32 -0
- package/dist/credentials/prime.js +53 -0
- package/dist/credentials/prime.js.map +1 -0
- package/dist/devices/cache.d.ts +79 -0
- package/dist/devices/cache.js +294 -0
- package/dist/devices/cache.js.map +1 -0
- package/dist/devices/catalog.d.ts +138 -0
- package/dist/devices/catalog.js +768 -0
- package/dist/devices/catalog.js.map +1 -0
- package/dist/devices/device-meta.d.ts +15 -0
- package/dist/devices/device-meta.js +57 -0
- package/dist/devices/device-meta.js.map +1 -0
- package/dist/devices/history-agg.d.ts +37 -0
- package/dist/devices/history-agg.js +139 -0
- package/dist/devices/history-agg.js.map +1 -0
- package/dist/devices/history-query.d.ts +45 -0
- package/dist/devices/history-query.js +182 -0
- package/dist/devices/history-query.js.map +1 -0
- package/dist/devices/param-validator.d.ts +40 -0
- package/dist/devices/param-validator.js +434 -0
- package/dist/devices/param-validator.js.map +1 -0
- package/dist/devices/resources.d.ts +74 -0
- package/dist/devices/resources.js +271 -0
- package/dist/devices/resources.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +170 -56946
- package/dist/index.js.map +1 -0
- package/dist/install/default-steps.d.ts +66 -0
- package/dist/install/default-steps.js +258 -0
- package/dist/install/default-steps.js.map +1 -0
- package/dist/install/preflight.d.ts +60 -0
- package/dist/install/preflight.js +213 -0
- package/dist/install/preflight.js.map +1 -0
- package/dist/install/steps.d.ts +61 -0
- package/dist/install/steps.js +68 -0
- package/dist/install/steps.js.map +1 -0
- package/dist/lib/command-keywords.d.ts +5 -0
- package/dist/lib/command-keywords.js +18 -0
- package/dist/lib/command-keywords.js.map +1 -0
- package/dist/lib/daemon-state.d.ts +24 -0
- package/dist/lib/daemon-state.js +47 -0
- package/dist/lib/daemon-state.js.map +1 -0
- package/dist/lib/destructive-mode.d.ts +2 -0
- package/dist/lib/destructive-mode.js +13 -0
- package/dist/lib/destructive-mode.js.map +1 -0
- package/dist/lib/devices.d.ts +151 -0
- package/dist/lib/devices.js +383 -0
- package/dist/lib/devices.js.map +1 -0
- package/dist/lib/idempotency.d.ts +46 -0
- package/dist/lib/idempotency.js +107 -0
- package/dist/lib/idempotency.js.map +1 -0
- package/dist/lib/plan-store.d.ts +19 -0
- package/dist/lib/plan-store.js +69 -0
- package/dist/lib/plan-store.js.map +1 -0
- package/dist/lib/request-context.d.ts +7 -0
- package/dist/lib/request-context.js +13 -0
- package/dist/lib/request-context.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/logger.d.ts +4 -0
- package/dist/logger.js +17 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/device-history.d.ts +36 -0
- package/dist/mcp/device-history.js +146 -0
- package/dist/mcp/device-history.js.map +1 -0
- package/dist/mcp/events-subscription.d.ts +45 -0
- package/dist/mcp/events-subscription.js +214 -0
- package/dist/mcp/events-subscription.js.map +1 -0
- package/dist/mqtt/client.d.ts +25 -0
- package/dist/mqtt/client.js +181 -0
- package/dist/mqtt/client.js.map +1 -0
- package/dist/mqtt/credential.d.ts +16 -0
- package/dist/mqtt/credential.js +31 -0
- package/dist/mqtt/credential.js.map +1 -0
- package/dist/policy/add-rule.d.ts +21 -0
- package/dist/policy/add-rule.js +125 -0
- package/dist/policy/add-rule.js.map +1 -0
- package/dist/policy/diff.d.ts +21 -0
- package/dist/policy/diff.js +92 -0
- package/dist/policy/diff.js.map +1 -0
- package/dist/policy/format.d.ts +6 -0
- package/dist/policy/format.js +58 -0
- package/dist/policy/format.js.map +1 -0
- package/dist/policy/load.d.ts +32 -0
- package/dist/policy/load.js +62 -0
- package/dist/policy/load.js.map +1 -0
- package/dist/policy/migrate.d.ts +21 -0
- package/dist/policy/migrate.js +68 -0
- package/dist/policy/migrate.js.map +1 -0
- package/dist/policy/schema.d.ts +5 -0
- package/dist/policy/schema.js +19 -0
- package/dist/policy/schema.js.map +1 -0
- package/dist/policy/validate.d.ts +19 -0
- package/dist/policy/validate.js +263 -0
- package/dist/policy/validate.js.map +1 -0
- package/dist/rules/action.d.ts +65 -0
- package/dist/rules/action.js +217 -0
- package/dist/rules/action.js.map +1 -0
- package/dist/rules/audit-query.d.ts +51 -0
- package/dist/rules/audit-query.js +90 -0
- package/dist/rules/audit-query.js.map +1 -0
- package/dist/rules/conflict-analyzer.d.ts +57 -0
- package/dist/rules/conflict-analyzer.js +215 -0
- package/dist/rules/conflict-analyzer.js.map +1 -0
- package/dist/rules/cron-scheduler.d.ts +62 -0
- package/dist/rules/cron-scheduler.js +187 -0
- package/dist/rules/cron-scheduler.js.map +1 -0
- package/dist/rules/destructive.d.ts +20 -0
- package/dist/rules/destructive.js +53 -0
- package/dist/rules/destructive.js.map +1 -0
- package/dist/rules/engine.d.ts +193 -0
- package/dist/rules/engine.js +758 -0
- package/dist/rules/engine.js.map +1 -0
- package/dist/rules/matcher.d.ts +56 -0
- package/dist/rules/matcher.js +231 -0
- package/dist/rules/matcher.js.map +1 -0
- package/dist/rules/pid-file.d.ts +43 -0
- package/dist/rules/pid-file.js +96 -0
- package/dist/rules/pid-file.js.map +1 -0
- package/dist/rules/quiet-hours.d.ts +26 -0
- package/dist/rules/quiet-hours.js +46 -0
- package/dist/rules/quiet-hours.js.map +1 -0
- package/dist/rules/suggest.d.ts +20 -0
- package/dist/rules/suggest.js +96 -0
- package/dist/rules/suggest.js.map +1 -0
- package/dist/rules/throttle.d.ts +61 -0
- package/dist/rules/throttle.js +117 -0
- package/dist/rules/throttle.js.map +1 -0
- package/dist/rules/types.d.ts +117 -0
- package/dist/rules/types.js +35 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/webhook-listener.d.ts +63 -0
- package/dist/rules/webhook-listener.js +224 -0
- package/dist/rules/webhook-listener.js.map +1 -0
- package/dist/rules/webhook-token.d.ts +50 -0
- package/dist/rules/webhook-token.js +91 -0
- package/dist/rules/webhook-token.js.map +1 -0
- package/dist/schema/field-aliases.d.ts +34 -0
- package/dist/schema/field-aliases.js +132 -0
- package/dist/schema/field-aliases.js.map +1 -0
- package/dist/sinks/dispatcher.d.ts +7 -0
- package/dist/sinks/dispatcher.js +13 -0
- package/dist/sinks/dispatcher.js.map +1 -0
- package/dist/sinks/file.d.ts +6 -0
- package/dist/sinks/file.js +20 -0
- package/dist/sinks/file.js.map +1 -0
- package/dist/sinks/format.d.ts +20 -0
- package/dist/sinks/format.js +57 -0
- package/dist/sinks/format.js.map +1 -0
- package/dist/sinks/homeassistant.d.ts +18 -0
- package/dist/sinks/homeassistant.js +45 -0
- package/dist/sinks/homeassistant.js.map +1 -0
- package/dist/sinks/openclaw.d.ts +13 -0
- package/dist/sinks/openclaw.js +34 -0
- package/dist/sinks/openclaw.js.map +1 -0
- package/dist/sinks/stdout.d.ts +4 -0
- package/dist/sinks/stdout.js +6 -0
- package/dist/sinks/stdout.js.map +1 -0
- package/dist/sinks/telegram.d.ts +11 -0
- package/dist/sinks/telegram.js +29 -0
- package/dist/sinks/telegram.js.map +1 -0
- package/dist/sinks/types.d.ts +13 -0
- package/dist/sinks/types.js +2 -0
- package/dist/sinks/types.js.map +1 -0
- package/dist/sinks/webhook.d.ts +6 -0
- package/dist/sinks/webhook.js +23 -0
- package/dist/sinks/webhook.js.map +1 -0
- package/dist/status-sync/manager.d.ts +48 -0
- package/dist/status-sync/manager.js +269 -0
- package/dist/status-sync/manager.js.map +1 -0
- package/dist/utils/arg-parsers.d.ts +16 -0
- package/dist/utils/arg-parsers.js +67 -0
- package/dist/utils/arg-parsers.js.map +1 -0
- package/dist/utils/audit.d.ts +69 -0
- package/dist/utils/audit.js +122 -0
- package/dist/utils/audit.js.map +1 -0
- package/dist/utils/filter.d.ts +81 -0
- package/dist/utils/filter.js +190 -0
- package/dist/utils/filter.js.map +1 -0
- package/dist/utils/flags.d.ts +72 -0
- package/dist/utils/flags.js +187 -0
- package/dist/utils/flags.js.map +1 -0
- package/dist/utils/format.d.ts +9 -0
- package/dist/utils/format.js +118 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/health.d.ts +48 -0
- package/dist/utils/health.js +102 -0
- package/dist/utils/health.js.map +1 -0
- package/dist/utils/help-json.d.ts +39 -0
- package/dist/utils/help-json.js +55 -0
- package/dist/utils/help-json.js.map +1 -0
- package/dist/utils/name-resolver.d.ts +26 -0
- package/dist/utils/name-resolver.js +138 -0
- package/dist/utils/name-resolver.js.map +1 -0
- package/dist/utils/output.d.ts +73 -0
- package/dist/utils/output.js +405 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/quota.d.ts +61 -0
- package/dist/utils/quota.js +228 -0
- package/dist/utils/quota.js.map +1 -0
- package/dist/utils/redact.d.ts +23 -0
- package/dist/utils/redact.js +69 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/retry.d.ts +72 -0
- package/dist/utils/retry.js +141 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/string.d.ts +2 -0
- package/dist/utils/string.js +23 -0
- package/dist/utils/string.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `switchbot install` — one-command bootstrap (Phase 3B in-repo).
|
|
3
|
+
*
|
|
4
|
+
* Collapses the 7-step Quickstart (credentials → policy → skill link →
|
|
5
|
+
* doctor verify) into a single orchestrated command with automatic
|
|
6
|
+
* rollback on any step failure. The step library
|
|
7
|
+
* (`src/install/default-steps.ts`) does the heavy lifting; this file
|
|
8
|
+
* composes the steps based on user flags, drives the step runner, and
|
|
9
|
+
* formats the outcome.
|
|
10
|
+
*
|
|
11
|
+
* Design notes:
|
|
12
|
+
* - `switchbot install` assumes the CLI is already on PATH (the user
|
|
13
|
+
* ran `npm i -g @switchbot/openapi-cli` to get here). We do not
|
|
14
|
+
* re-install the CLI from inside itself.
|
|
15
|
+
* - Doctor verification is NOT a step — if it failed, an automatic
|
|
16
|
+
* rollback would destroy good state. Instead we print a "next: run
|
|
17
|
+
* `switchbot doctor`" hint after success.
|
|
18
|
+
*/
|
|
19
|
+
import { InvalidArgumentError } from 'commander';
|
|
20
|
+
import fs from 'node:fs';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
import { resolvePolicyPath } from '../policy/load.js';
|
|
23
|
+
import { runInstall } from '../install/steps.js';
|
|
24
|
+
import { runPreflight } from '../install/preflight.js';
|
|
25
|
+
import { stepPromptCredentials, stepWriteKeychain, stepScaffoldPolicy, stepSymlinkSkill, stepDoctorVerify, } from '../install/default-steps.js';
|
|
26
|
+
import { isJsonMode, printJson } from '../utils/output.js';
|
|
27
|
+
import { getActiveProfile } from '../lib/request-context.js';
|
|
28
|
+
import chalk from 'chalk';
|
|
29
|
+
const AGENT_VALUES = ['claude-code', 'cursor', 'copilot', 'none'];
|
|
30
|
+
function parseAgent(value) {
|
|
31
|
+
if (!value)
|
|
32
|
+
return 'claude-code';
|
|
33
|
+
if (!AGENT_VALUES.includes(value)) {
|
|
34
|
+
throw new InvalidArgumentError(`--agent must be one of ${AGENT_VALUES.join(', ')} (got "${value}")`);
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
function parseSkipList(value) {
|
|
39
|
+
if (!value)
|
|
40
|
+
return new Set();
|
|
41
|
+
return new Set(value
|
|
42
|
+
.split(',')
|
|
43
|
+
.map((s) => s.trim())
|
|
44
|
+
.filter(Boolean));
|
|
45
|
+
}
|
|
46
|
+
function printRecipe(ctx) {
|
|
47
|
+
if (!ctx.skillRecipePrinted)
|
|
48
|
+
return;
|
|
49
|
+
const lines = [];
|
|
50
|
+
lines.push('');
|
|
51
|
+
lines.push(chalk.bold(`Skill-install recipe for agent=${ctx.agent}:`));
|
|
52
|
+
switch (ctx.agent) {
|
|
53
|
+
case 'claude-code':
|
|
54
|
+
lines.push(' # re-run with --skill-path pointing at your local clone of openclaw-switchbot-skill', ' switchbot install --agent claude-code --skill-path /path/to/openclaw-switchbot-skill');
|
|
55
|
+
break;
|
|
56
|
+
case 'cursor':
|
|
57
|
+
lines.push(' # Cursor expects a rules file, not a skill directory. See:', ' # openclaw-switchbot-skill/docs/agents/cursor.md');
|
|
58
|
+
break;
|
|
59
|
+
case 'copilot':
|
|
60
|
+
lines.push(' # Copilot merges instructions into .github/copilot-instructions.md. See:', ' # openclaw-switchbot-skill/docs/agents/copilot.md');
|
|
61
|
+
break;
|
|
62
|
+
case 'none':
|
|
63
|
+
lines.push(' (none — skill step skipped)');
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
console.error(lines.join('\n'));
|
|
67
|
+
}
|
|
68
|
+
function printDryRun(steps, ctx) {
|
|
69
|
+
if (isJsonMode()) {
|
|
70
|
+
printJson({
|
|
71
|
+
dryRun: true,
|
|
72
|
+
profile: ctx.profile,
|
|
73
|
+
agent: ctx.agent,
|
|
74
|
+
skillPath: ctx.skillPath ?? null,
|
|
75
|
+
policyPath: ctx.policyPath,
|
|
76
|
+
steps: steps.map((s) => ({ name: s.name, description: s.description })),
|
|
77
|
+
});
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
console.log(chalk.bold('switchbot install — dry run'));
|
|
81
|
+
console.log(` profile: ${ctx.profile}`);
|
|
82
|
+
console.log(` agent: ${ctx.agent}`);
|
|
83
|
+
console.log(` skill: ${ctx.skillPath ?? '(none — recipe will be printed)'}`);
|
|
84
|
+
console.log(` policy: ${ctx.policyPath}`);
|
|
85
|
+
console.log('');
|
|
86
|
+
console.log(chalk.bold('Steps that would run (in order):'));
|
|
87
|
+
for (const s of steps) {
|
|
88
|
+
console.log(` • ${s.name}${s.description ? ` — ${s.description}` : ''}`);
|
|
89
|
+
}
|
|
90
|
+
console.log('');
|
|
91
|
+
console.log(chalk.dim('No changes made. Re-run without --dry-run to apply.'));
|
|
92
|
+
}
|
|
93
|
+
export function registerInstallCommand(program) {
|
|
94
|
+
program
|
|
95
|
+
.command('install')
|
|
96
|
+
.description('One-command bootstrap: credentials + policy + skill link (rolls back on failure)')
|
|
97
|
+
.option('--agent <name>', `target agent: ${AGENT_VALUES.join(' | ')} (default: claude-code)`)
|
|
98
|
+
.option('--skill-path <dir>', 'local clone of openclaw-switchbot-skill (enables auto-link)')
|
|
99
|
+
.option('--token-file <path>', 'two-line credential file (token, secret); read once and deleted on success')
|
|
100
|
+
.option('--skip <names>', 'comma-separated list of step names to skip (e.g. "scaffold-policy,symlink-skill")')
|
|
101
|
+
.option('--force', 'replace an existing skill symlink pointing at a different path; allow link even without SKILL.md')
|
|
102
|
+
.option('--verify', 'after a successful install, run `switchbot doctor --json` as a warn-only post-check')
|
|
103
|
+
.addHelpText('after', `
|
|
104
|
+
The global --dry-run flag previews the step list without making changes.
|
|
105
|
+
Global --json emits the install report as JSON to stdout.
|
|
106
|
+
|
|
107
|
+
Exit codes:
|
|
108
|
+
0 success
|
|
109
|
+
2 preflight check failed (nothing changed)
|
|
110
|
+
3 step failed; rollback completed
|
|
111
|
+
4 step failed; rollback had residue (see output)
|
|
112
|
+
|
|
113
|
+
Examples:
|
|
114
|
+
# Interactive install, Claude Code skill not linked (recipe printed):
|
|
115
|
+
switchbot install
|
|
116
|
+
|
|
117
|
+
# Full install with skill link:
|
|
118
|
+
switchbot install --skill-path ../openclaw-switchbot-skill
|
|
119
|
+
|
|
120
|
+
# Non-interactive (CI) install:
|
|
121
|
+
printf '%s\\n%s\\n' "$TOKEN" "$SECRET" > /tmp/sb-creds
|
|
122
|
+
switchbot install --token-file /tmp/sb-creds --skill-path ./skill
|
|
123
|
+
`)
|
|
124
|
+
.action(async (opts, command) => {
|
|
125
|
+
const agent = parseAgent(opts.agent);
|
|
126
|
+
const profile = getActiveProfile() ?? 'default';
|
|
127
|
+
const skip = parseSkipList(opts.skip);
|
|
128
|
+
const skillPath = opts.skillPath ? path.resolve(opts.skillPath) : undefined;
|
|
129
|
+
const tokenFile = opts.tokenFile ? path.resolve(opts.tokenFile) : undefined;
|
|
130
|
+
const force = Boolean(opts.force);
|
|
131
|
+
const verify = Boolean(opts.verify);
|
|
132
|
+
const globalOpts = command.parent?.opts() ?? {};
|
|
133
|
+
const dryRun = Boolean(globalOpts.dryRun);
|
|
134
|
+
// Pre-flight: read-only checks, never mutate anything.
|
|
135
|
+
const pf = await runPreflight({
|
|
136
|
+
agent,
|
|
137
|
+
expectSkillLink: agent === 'claude-code' && Boolean(skillPath),
|
|
138
|
+
});
|
|
139
|
+
if (!pf.ok) {
|
|
140
|
+
if (isJsonMode()) {
|
|
141
|
+
printJson({ ok: false, stage: 'preflight', preflight: pf });
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
console.error(chalk.red('✗ preflight failed — nothing changed'));
|
|
145
|
+
for (const c of pf.checks) {
|
|
146
|
+
const mark = c.status === 'fail' ? chalk.red('✗') : c.status === 'warn' ? chalk.yellow('!') : chalk.green('✓');
|
|
147
|
+
console.error(` ${mark} ${c.name}: ${c.message}`);
|
|
148
|
+
if (c.hint)
|
|
149
|
+
console.error(` hint: ${c.hint}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
process.exit(2);
|
|
153
|
+
}
|
|
154
|
+
const ctx = {
|
|
155
|
+
profile,
|
|
156
|
+
agent,
|
|
157
|
+
skillPath,
|
|
158
|
+
tokenFile,
|
|
159
|
+
policyPath: resolvePolicyPath(),
|
|
160
|
+
nonInteractive: !process.stdin.isTTY && !tokenFile,
|
|
161
|
+
};
|
|
162
|
+
const allSteps = [
|
|
163
|
+
stepPromptCredentials(),
|
|
164
|
+
stepWriteKeychain(),
|
|
165
|
+
stepScaffoldPolicy(),
|
|
166
|
+
stepSymlinkSkill({ force }),
|
|
167
|
+
];
|
|
168
|
+
const steps = allSteps.filter((s) => !skip.has(s.name));
|
|
169
|
+
if (dryRun) {
|
|
170
|
+
printDryRun(steps, ctx);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const report = await runInstall(steps, { context: ctx });
|
|
174
|
+
// Delete the token file now that credentials are committed.
|
|
175
|
+
if (report.ok && tokenFile) {
|
|
176
|
+
try {
|
|
177
|
+
fs.unlinkSync(tokenFile);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// non-fatal: credentials are already in the keychain
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// A7: opt-in post-install verification. Doctor is NEVER part of the
|
|
184
|
+
// rollback chain — a failing doctor after a good install would
|
|
185
|
+
// destroy working state. So we run it AFTER runInstall resolves, as
|
|
186
|
+
// a warn-only check. The outcome is reported but never flips the
|
|
187
|
+
// command's exit code.
|
|
188
|
+
if (report.ok && verify) {
|
|
189
|
+
const cliPath = process.argv[1] ?? '';
|
|
190
|
+
const step = stepDoctorVerify({ cliPath });
|
|
191
|
+
await step.execute(ctx);
|
|
192
|
+
}
|
|
193
|
+
if (isJsonMode()) {
|
|
194
|
+
printJson({
|
|
195
|
+
ok: report.ok,
|
|
196
|
+
profile: ctx.profile,
|
|
197
|
+
agent: ctx.agent,
|
|
198
|
+
report,
|
|
199
|
+
preflight: pf,
|
|
200
|
+
policyPath: ctx.policyPath,
|
|
201
|
+
policyScaffolded: ctx.policyScaffoldResult && !ctx.policyScaffoldResult.skipped,
|
|
202
|
+
skillLinkPath: ctx.skillLinkPath,
|
|
203
|
+
skillLinkCreated: Boolean(ctx.skillLinkCreated),
|
|
204
|
+
verify: verify ? { ok: ctx.doctorOk ?? null, report: ctx.doctorReport ?? null } : undefined,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
else if (report.ok) {
|
|
208
|
+
console.log(chalk.green('✓ install complete'));
|
|
209
|
+
if (ctx.skillLinkCreated)
|
|
210
|
+
console.log(` linked skill: ${ctx.skillLinkPath}`);
|
|
211
|
+
if (ctx.policyScaffoldResult?.skipped === false)
|
|
212
|
+
console.log(` wrote policy: ${ctx.policyScaffoldResult.policyPath}`);
|
|
213
|
+
printRecipe(ctx);
|
|
214
|
+
if (verify) {
|
|
215
|
+
if (ctx.doctorOk) {
|
|
216
|
+
console.log(chalk.green('✓ doctor --json: all green'));
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
console.log(chalk.yellow('! doctor --json reported issues — install is committed; run `switchbot doctor` to inspect'));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
console.log('');
|
|
223
|
+
console.log(chalk.bold('Next:'));
|
|
224
|
+
console.log(' switchbot doctor # verify the setup');
|
|
225
|
+
console.log(' switchbot devices list # smoke test');
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
console.error(chalk.red(`✗ install failed at step: ${report.failedAt}`));
|
|
229
|
+
const residue = report.outcomes.some((o) => o.status === 'rollback-failed');
|
|
230
|
+
for (const o of report.outcomes) {
|
|
231
|
+
const tag = o.status === 'succeeded' ? chalk.green('✓') :
|
|
232
|
+
o.status === 'failed' ? chalk.red('✗') :
|
|
233
|
+
o.status === 'rolled-back' ? chalk.yellow('↺') :
|
|
234
|
+
o.status === 'rollback-failed' ? chalk.red('!!') :
|
|
235
|
+
chalk.dim('·');
|
|
236
|
+
const msg = o.status === 'failed' || o.status === 'rollback-failed' ? ` — ${o.error}` : '';
|
|
237
|
+
console.error(` ${tag} ${o.step} [${o.status}]${msg}`);
|
|
238
|
+
}
|
|
239
|
+
if (residue) {
|
|
240
|
+
console.error(chalk.red('Rollback left residue. Run `switchbot uninstall` to clean up or review output above.'));
|
|
241
|
+
process.exit(4);
|
|
242
|
+
}
|
|
243
|
+
process.exit(3);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { EventSubscriptionManager } from '../mcp/events-subscription.js';
|
|
4
|
+
export declare function createSwitchBotMcpServer(options?: {
|
|
5
|
+
eventManager?: EventSubscriptionManager;
|
|
6
|
+
}): McpServer;
|
|
7
|
+
/**
|
|
8
|
+
* P10: list the tool names registered on an McpServer instance. Used by
|
|
9
|
+
* `doctor`'s dry-run check. The MCP SDK keeps `_registeredTools` private,
|
|
10
|
+
* so we reach through a narrow cast — safe because this only runs in
|
|
11
|
+
* diagnostic code and the shape is stable across SDK versions.
|
|
12
|
+
*/
|
|
13
|
+
export declare function listRegisteredTools(server: McpServer): string[];
|
|
14
|
+
export declare function registerMcpCommand(program: Command): void;
|