@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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default install steps used by `switchbot install` (Phase 3B in-repo).
|
|
3
|
+
*
|
|
4
|
+
* Each factory returns an `InstallStep<InstallContext>` whose `execute`
|
|
5
|
+
* and `undo` both operate on the shared context. Steps are intentionally
|
|
6
|
+
* small — each one either mutates one system (keychain / filesystem /
|
|
7
|
+
* symlink) or captures input, never a mix. The orchestrator composes
|
|
8
|
+
* them in `src/commands/install.ts`.
|
|
9
|
+
*
|
|
10
|
+
* The step runner (`src/install/steps.ts`) handles rollback on failure;
|
|
11
|
+
* these factories just make sure every `execute` records what it needs
|
|
12
|
+
* into the context so the matching `undo` can unwind it.
|
|
13
|
+
*/
|
|
14
|
+
import type { InstallStep } from './steps.js';
|
|
15
|
+
import { type ScaffoldPolicyResult } from '../commands/policy.js';
|
|
16
|
+
import { type CredentialStore, type CredentialBundle } from '../credentials/keychain.js';
|
|
17
|
+
export type AgentName = 'claude-code' | 'cursor' | 'copilot' | 'none';
|
|
18
|
+
export interface InstallContext {
|
|
19
|
+
/** Profile to write credentials under (default `default`). */
|
|
20
|
+
profile: string;
|
|
21
|
+
/** Which agent to link the skill for. `none` → skip skill step. */
|
|
22
|
+
agent: AgentName;
|
|
23
|
+
/** Absolute path to a local clone of openclaw-switchbot-skill, or undefined. */
|
|
24
|
+
skillPath?: string;
|
|
25
|
+
/** Policy file path (default: from resolvePolicyPath()). */
|
|
26
|
+
policyPath: string;
|
|
27
|
+
/** Non-interactive credential file, read once and unlinked on success. */
|
|
28
|
+
tokenFile?: string;
|
|
29
|
+
/** True if stdout is not a TTY; forbids interactive prompting. */
|
|
30
|
+
nonInteractive?: boolean;
|
|
31
|
+
credentials?: CredentialBundle;
|
|
32
|
+
credentialStore?: CredentialStore;
|
|
33
|
+
credentialsWereStored?: boolean;
|
|
34
|
+
previousCredentials?: CredentialBundle | null;
|
|
35
|
+
policyScaffoldResult?: ScaffoldPolicyResult;
|
|
36
|
+
skillLinkPath?: string;
|
|
37
|
+
skillLinkCreated?: boolean;
|
|
38
|
+
skillRecipePrinted?: boolean;
|
|
39
|
+
doctorOk?: boolean;
|
|
40
|
+
doctorReport?: unknown;
|
|
41
|
+
}
|
|
42
|
+
export declare function stepPromptCredentials(): InstallStep<InstallContext>;
|
|
43
|
+
export declare function stepWriteKeychain(): InstallStep<InstallContext>;
|
|
44
|
+
export declare function stepScaffoldPolicy(): InstallStep<InstallContext>;
|
|
45
|
+
/**
|
|
46
|
+
* Compute the on-disk location where an agent expects to find this skill.
|
|
47
|
+
* Only `claude-code` has an automation path today; others are informational
|
|
48
|
+
* (the installer will print a recipe instead of creating anything).
|
|
49
|
+
*/
|
|
50
|
+
export declare function skillLinkPathFor(agent: AgentName, home?: string): string | null;
|
|
51
|
+
export interface SymlinkSkillOptions {
|
|
52
|
+
/** When true, replace an existing symlink even if it points elsewhere. */
|
|
53
|
+
force?: boolean;
|
|
54
|
+
}
|
|
55
|
+
export declare function stepSymlinkSkill(opts?: SymlinkSkillOptions): InstallStep<InstallContext>;
|
|
56
|
+
export interface DoctorSpawnResult {
|
|
57
|
+
ok: boolean;
|
|
58
|
+
exitCode: number | null;
|
|
59
|
+
stdout: string;
|
|
60
|
+
stderr: string;
|
|
61
|
+
}
|
|
62
|
+
export type DoctorSpawner = (cliPath: string, profile: string) => DoctorSpawnResult;
|
|
63
|
+
export declare function stepDoctorVerify(opts?: {
|
|
64
|
+
cliPath: string;
|
|
65
|
+
spawner?: DoctorSpawner;
|
|
66
|
+
}): InstallStep<InstallContext>;
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default install steps used by `switchbot install` (Phase 3B in-repo).
|
|
3
|
+
*
|
|
4
|
+
* Each factory returns an `InstallStep<InstallContext>` whose `execute`
|
|
5
|
+
* and `undo` both operate on the shared context. Steps are intentionally
|
|
6
|
+
* small — each one either mutates one system (keychain / filesystem /
|
|
7
|
+
* symlink) or captures input, never a mix. The orchestrator composes
|
|
8
|
+
* them in `src/commands/install.ts`.
|
|
9
|
+
*
|
|
10
|
+
* The step runner (`src/install/steps.ts`) handles rollback on failure;
|
|
11
|
+
* these factories just make sure every `execute` records what it needs
|
|
12
|
+
* into the context so the matching `undo` can unwind it.
|
|
13
|
+
*/
|
|
14
|
+
import fs from 'node:fs';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import os from 'node:os';
|
|
17
|
+
import { spawnSync } from 'node:child_process';
|
|
18
|
+
import { scaffoldPolicyFile, PolicyFileExistsError, } from '../commands/policy.js';
|
|
19
|
+
import { promptTokenAndSecret, readCredentialsFile } from '../commands/config.js';
|
|
20
|
+
import { selectCredentialStore } from '../credentials/keychain.js';
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Step 1: capture credentials (memory only — no side effects until step 2)
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
export function stepPromptCredentials() {
|
|
25
|
+
return {
|
|
26
|
+
name: 'prompt-credentials',
|
|
27
|
+
description: 'Collect SwitchBot token + secret (interactive unless --token-file)',
|
|
28
|
+
async execute(ctx) {
|
|
29
|
+
if (ctx.credentials)
|
|
30
|
+
return; // already provided via API consumer
|
|
31
|
+
if (ctx.tokenFile) {
|
|
32
|
+
const creds = readCredentialsFile(ctx.tokenFile);
|
|
33
|
+
ctx.credentials = creds;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (ctx.nonInteractive) {
|
|
37
|
+
throw new Error('no --token-file and stdin is not a TTY; pass --token-file <path> to install non-interactively');
|
|
38
|
+
}
|
|
39
|
+
ctx.credentials = await promptTokenAndSecret();
|
|
40
|
+
},
|
|
41
|
+
undo() {
|
|
42
|
+
// No disk state created; clearing memory is enough.
|
|
43
|
+
// The calling process will exit shortly after rollback, but null
|
|
44
|
+
// the field for defence-in-depth.
|
|
45
|
+
return;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Step 2: write credentials to keychain (or file fallback)
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
export function stepWriteKeychain() {
|
|
53
|
+
return {
|
|
54
|
+
name: 'write-keychain',
|
|
55
|
+
description: 'Store credentials in the OS keychain (falls back to ~/.switchbot/config.json)',
|
|
56
|
+
async execute(ctx) {
|
|
57
|
+
if (!ctx.credentials) {
|
|
58
|
+
throw new Error('internal: credentials missing at write-keychain; prompt step must run first');
|
|
59
|
+
}
|
|
60
|
+
const store = await selectCredentialStore();
|
|
61
|
+
const previous = await store.get(ctx.profile);
|
|
62
|
+
ctx.previousCredentials = previous;
|
|
63
|
+
await store.set(ctx.profile, ctx.credentials);
|
|
64
|
+
ctx.credentialStore = store;
|
|
65
|
+
ctx.credentialsWereStored = true;
|
|
66
|
+
},
|
|
67
|
+
async undo(ctx) {
|
|
68
|
+
if (!ctx.credentialsWereStored || !ctx.credentialStore)
|
|
69
|
+
return;
|
|
70
|
+
try {
|
|
71
|
+
if (ctx.previousCredentials) {
|
|
72
|
+
await ctx.credentialStore.set(ctx.profile, ctx.previousCredentials);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
await ctx.credentialStore.delete(ctx.profile);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
ctx.credentialsWereStored = false;
|
|
80
|
+
ctx.previousCredentials = undefined;
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Step 3: scaffold policy.yaml if missing (skip if present, don't clobber)
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
export function stepScaffoldPolicy() {
|
|
89
|
+
return {
|
|
90
|
+
name: 'scaffold-policy',
|
|
91
|
+
description: 'Create a starter policy.yaml (only if none exists)',
|
|
92
|
+
execute(ctx) {
|
|
93
|
+
try {
|
|
94
|
+
const result = scaffoldPolicyFile(ctx.policyPath, { skipExisting: true });
|
|
95
|
+
ctx.policyScaffoldResult = result;
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
if (err instanceof PolicyFileExistsError) {
|
|
99
|
+
// skipExisting is true → this branch is unreachable, but be
|
|
100
|
+
// defensive against future changes.
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
undo(ctx) {
|
|
107
|
+
const r = ctx.policyScaffoldResult;
|
|
108
|
+
if (!r || r.skipped)
|
|
109
|
+
return;
|
|
110
|
+
// Only remove the file if WE created it (skipped === false means
|
|
111
|
+
// we wrote fresh content to a path that did not exist before).
|
|
112
|
+
try {
|
|
113
|
+
fs.unlinkSync(r.policyPath);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// best-effort; do not fail rollback on cleanup
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Step 4: install skill into the agent's skills directory
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
/**
|
|
125
|
+
* Compute the on-disk location where an agent expects to find this skill.
|
|
126
|
+
* Only `claude-code` has an automation path today; others are informational
|
|
127
|
+
* (the installer will print a recipe instead of creating anything).
|
|
128
|
+
*/
|
|
129
|
+
export function skillLinkPathFor(agent, home = os.homedir()) {
|
|
130
|
+
if (agent === 'claude-code') {
|
|
131
|
+
return path.join(home, '.claude', 'skills', 'switchbot');
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
export function stepSymlinkSkill(opts = {}) {
|
|
136
|
+
return {
|
|
137
|
+
name: 'symlink-skill',
|
|
138
|
+
description: 'Link the skill into ~/.claude/skills/switchbot (Claude Code)',
|
|
139
|
+
execute(ctx) {
|
|
140
|
+
if (ctx.agent === 'none')
|
|
141
|
+
return;
|
|
142
|
+
if (!ctx.skillPath) {
|
|
143
|
+
// Informational path: print the recipe, do not fail. Undo can
|
|
144
|
+
// safely no-op in this branch.
|
|
145
|
+
ctx.skillRecipePrinted = true;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const target = path.resolve(ctx.skillPath);
|
|
149
|
+
if (!fs.existsSync(target)) {
|
|
150
|
+
throw new Error(`--skill-path does not exist: ${target}`);
|
|
151
|
+
}
|
|
152
|
+
const stat = fs.statSync(target);
|
|
153
|
+
if (!stat.isDirectory()) {
|
|
154
|
+
throw new Error(`--skill-path is not a directory: ${target}`);
|
|
155
|
+
}
|
|
156
|
+
const linkPath = skillLinkPathFor(ctx.agent);
|
|
157
|
+
if (!linkPath) {
|
|
158
|
+
// Non-automating agent: print a recipe instead of creating state.
|
|
159
|
+
ctx.skillRecipePrinted = true;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// A2: require a SKILL.md only when we are about to create a link.
|
|
163
|
+
// Non-automating agents (cursor/copilot) print a recipe and return
|
|
164
|
+
// above, so they are never blocked by this check.
|
|
165
|
+
if (!opts.force && !fs.existsSync(path.join(target, 'SKILL.md'))) {
|
|
166
|
+
throw new Error(`${target} does not look like a skill (no SKILL.md at the root). ` +
|
|
167
|
+
'Pass --force if you really mean to link this directory.');
|
|
168
|
+
}
|
|
169
|
+
if (fs.existsSync(linkPath)) {
|
|
170
|
+
const st = fs.lstatSync(linkPath);
|
|
171
|
+
if (st.isSymbolicLink()) {
|
|
172
|
+
// A3: tolerate an existing link only when it points at the same
|
|
173
|
+
// target; otherwise the user is likely trying to repoint and we
|
|
174
|
+
// should not silently pretend success. --force replaces it.
|
|
175
|
+
let existingTarget = null;
|
|
176
|
+
try {
|
|
177
|
+
existingTarget = path.resolve(path.dirname(linkPath), fs.readlinkSync(linkPath));
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
existingTarget = null;
|
|
181
|
+
}
|
|
182
|
+
if (existingTarget === target) {
|
|
183
|
+
ctx.skillLinkPath = linkPath;
|
|
184
|
+
ctx.skillLinkCreated = false;
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (!opts.force) {
|
|
188
|
+
throw new Error(`${linkPath} already links to ${existingTarget ?? '(unreadable)'}; ` +
|
|
189
|
+
'pass --force to replace it, or run `switchbot uninstall` first.');
|
|
190
|
+
}
|
|
191
|
+
fs.unlinkSync(linkPath);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
throw new Error(`${linkPath} exists and is not a symlink; refusing to clobber (move it aside and re-run)`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
fs.mkdirSync(path.dirname(linkPath), { recursive: true });
|
|
198
|
+
// Windows: regular symlinks require admin or Developer Mode. A
|
|
199
|
+
// directory junction works for any user and is transparent to
|
|
200
|
+
// most tools. Unix: plain symlink.
|
|
201
|
+
const linkType = process.platform === 'win32' ? 'junction' : 'dir';
|
|
202
|
+
fs.symlinkSync(target, linkPath, linkType);
|
|
203
|
+
ctx.skillLinkPath = linkPath;
|
|
204
|
+
ctx.skillLinkCreated = true;
|
|
205
|
+
},
|
|
206
|
+
undo(ctx) {
|
|
207
|
+
if (!ctx.skillLinkCreated || !ctx.skillLinkPath)
|
|
208
|
+
return;
|
|
209
|
+
try {
|
|
210
|
+
fs.unlinkSync(ctx.skillLinkPath);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// best-effort
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
function defaultDoctorSpawner(cliPath, profile) {
|
|
219
|
+
const args = profile === 'default' ? [cliPath, 'doctor', '--json'] : [cliPath, '--profile', profile, 'doctor', '--json'];
|
|
220
|
+
const r = spawnSync(process.execPath, args, { encoding: 'utf-8' });
|
|
221
|
+
return {
|
|
222
|
+
ok: r.status === 0,
|
|
223
|
+
exitCode: r.status,
|
|
224
|
+
stdout: r.stdout ?? '',
|
|
225
|
+
stderr: r.stderr ?? '',
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
export function stepDoctorVerify(opts = { cliPath: '' }) {
|
|
229
|
+
const spawner = opts.spawner ?? defaultDoctorSpawner;
|
|
230
|
+
const cliPath = opts.cliPath;
|
|
231
|
+
return {
|
|
232
|
+
name: 'doctor-verify',
|
|
233
|
+
description: 'Verify the install with switchbot doctor --json',
|
|
234
|
+
execute(ctx) {
|
|
235
|
+
if (!cliPath) {
|
|
236
|
+
// Fail closed: without a known CLI path we cannot spawn doctor.
|
|
237
|
+
// Mark not-ok but still succeed (no rollback).
|
|
238
|
+
ctx.doctorOk = false;
|
|
239
|
+
ctx.doctorReport = { skipped: true, reason: 'no cliPath provided' };
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const r = spawner(cliPath, ctx.profile);
|
|
243
|
+
ctx.doctorOk = r.ok;
|
|
244
|
+
try {
|
|
245
|
+
ctx.doctorReport = r.stdout ? JSON.parse(r.stdout) : { exitCode: r.exitCode, stderr: r.stderr };
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
ctx.doctorReport = { exitCode: r.exitCode, stdout: r.stdout, stderr: r.stderr };
|
|
249
|
+
}
|
|
250
|
+
// NOTE: never throw here. Doctor failure is reported; rollback is
|
|
251
|
+
// opt-in by the user via `switchbot uninstall`.
|
|
252
|
+
},
|
|
253
|
+
undo() {
|
|
254
|
+
return;
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=default-steps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-steps.js","sourceRoot":"","sources":["../../src/install/default-steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install-orchestrator pre-flight (Phase 3A · F5).
|
|
3
|
+
*
|
|
4
|
+
* Pure library — no CLI entry. Consumers (e.g. a future
|
|
5
|
+
* `openclaw plugins install` command) call `runPreflight()` and decide
|
|
6
|
+
* whether to proceed based on the returned result. Nothing here mutates
|
|
7
|
+
* user state: every check is read-only.
|
|
8
|
+
*
|
|
9
|
+
* The check list mirrors `docs/design/phase3-install.md` step 1 minus
|
|
10
|
+
* the bits that require external services (npm registry / SwitchBot API
|
|
11
|
+
* reachability are left for the installer itself to probe when it has
|
|
12
|
+
* a plan to retry, since they are the flakiest of the lot).
|
|
13
|
+
*/
|
|
14
|
+
export type PreflightStatus = 'ok' | 'warn' | 'fail';
|
|
15
|
+
export interface PreflightCheck {
|
|
16
|
+
name: string;
|
|
17
|
+
status: PreflightStatus;
|
|
18
|
+
message: string;
|
|
19
|
+
hint?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface PreflightResult {
|
|
22
|
+
checks: PreflightCheck[];
|
|
23
|
+
/** True when no check is at 'fail'. Warnings are informational. */
|
|
24
|
+
ok: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface PreflightOptions {
|
|
27
|
+
/**
|
|
28
|
+
* Minimum required major version of Node.js. Defaults to 18 (current
|
|
29
|
+
* package.json "engines.node" floor).
|
|
30
|
+
*/
|
|
31
|
+
minNodeMajor?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Override process.version for deterministic tests.
|
|
34
|
+
*/
|
|
35
|
+
nodeVersion?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Override process.platform for tests.
|
|
38
|
+
*/
|
|
39
|
+
platform?: NodeJS.Platform;
|
|
40
|
+
/**
|
|
41
|
+
* Target agent. When set to `claude-code` the preflight probes that
|
|
42
|
+
* `~/.claude/` (or the skills directory underneath it) is writable, so
|
|
43
|
+
* the later symlink-skill step fails fast with a clear message.
|
|
44
|
+
* Unset (or `none`/`cursor`/`copilot`) skips the check.
|
|
45
|
+
*/
|
|
46
|
+
agent?: 'claude-code' | 'cursor' | 'copilot' | 'none';
|
|
47
|
+
/**
|
|
48
|
+
* Whether this install run will actually attempt to create the Claude
|
|
49
|
+
* skill link. When false, the agent-skills-dir check is skipped even if
|
|
50
|
+
* agent is `claude-code` (e.g. recipe-only installs without --skill-path).
|
|
51
|
+
*
|
|
52
|
+
* Defaults to true for backward compatibility when `agent=claude-code`.
|
|
53
|
+
*/
|
|
54
|
+
expectSkillLink?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Run every pre-flight check and return a combined result. Safe to
|
|
58
|
+
* call multiple times; no state is cached.
|
|
59
|
+
*/
|
|
60
|
+
export declare function runPreflight(options?: PreflightOptions): Promise<PreflightResult>;
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install-orchestrator pre-flight (Phase 3A · F5).
|
|
3
|
+
*
|
|
4
|
+
* Pure library — no CLI entry. Consumers (e.g. a future
|
|
5
|
+
* `openclaw plugins install` command) call `runPreflight()` and decide
|
|
6
|
+
* whether to proceed based on the returned result. Nothing here mutates
|
|
7
|
+
* user state: every check is read-only.
|
|
8
|
+
*
|
|
9
|
+
* The check list mirrors `docs/design/phase3-install.md` step 1 minus
|
|
10
|
+
* the bits that require external services (npm registry / SwitchBot API
|
|
11
|
+
* reachability are left for the installer itself to probe when it has
|
|
12
|
+
* a plan to retry, since they are the flakiest of the lot).
|
|
13
|
+
*/
|
|
14
|
+
import fs from 'node:fs';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import os from 'node:os';
|
|
17
|
+
import { resolvePolicyPath, loadPolicyFile, PolicyFileNotFoundError } from '../policy/load.js';
|
|
18
|
+
import { validateLoadedPolicy } from '../policy/validate.js';
|
|
19
|
+
import { selectCredentialStore } from '../credentials/keychain.js';
|
|
20
|
+
function parseMajor(version) {
|
|
21
|
+
const m = /^v?(\d+)\./.exec(version);
|
|
22
|
+
if (!m)
|
|
23
|
+
return null;
|
|
24
|
+
const n = Number(m[1]);
|
|
25
|
+
return Number.isFinite(n) ? n : null;
|
|
26
|
+
}
|
|
27
|
+
function checkNodeVersion(opts) {
|
|
28
|
+
const required = opts.minNodeMajor ?? 18;
|
|
29
|
+
const version = opts.nodeVersion ?? process.version;
|
|
30
|
+
const major = parseMajor(version);
|
|
31
|
+
if (major === null) {
|
|
32
|
+
return {
|
|
33
|
+
name: 'node',
|
|
34
|
+
status: 'fail',
|
|
35
|
+
message: `unrecognised Node.js version string: ${version}`,
|
|
36
|
+
hint: 'reinstall Node.js from https://nodejs.org',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (major < required) {
|
|
40
|
+
return {
|
|
41
|
+
name: 'node',
|
|
42
|
+
status: 'fail',
|
|
43
|
+
message: `Node.js ${version} < required v${required}`,
|
|
44
|
+
hint: `upgrade Node.js to v${required} or later`,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return { name: 'node', status: 'ok', message: `Node.js ${version}` };
|
|
48
|
+
}
|
|
49
|
+
function checkPolicy() {
|
|
50
|
+
const policyPath = resolvePolicyPath();
|
|
51
|
+
try {
|
|
52
|
+
const loaded = loadPolicyFile(policyPath);
|
|
53
|
+
const result = validateLoadedPolicy(loaded);
|
|
54
|
+
if (result.valid) {
|
|
55
|
+
return {
|
|
56
|
+
name: 'policy',
|
|
57
|
+
status: 'ok',
|
|
58
|
+
message: `policy at ${policyPath} validates (v${result.schemaVersion ?? '?'})`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
name: 'policy',
|
|
63
|
+
status: 'warn',
|
|
64
|
+
message: `policy at ${policyPath} has ${result.errors.length} validation error(s)`,
|
|
65
|
+
hint: 'run "switchbot policy validate" to see details before installing',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
if (err instanceof PolicyFileNotFoundError) {
|
|
70
|
+
return {
|
|
71
|
+
name: 'policy',
|
|
72
|
+
status: 'ok',
|
|
73
|
+
message: `no policy at ${policyPath} (installer will scaffold one)`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
name: 'policy',
|
|
78
|
+
status: 'warn',
|
|
79
|
+
message: `policy at ${policyPath} is unreadable: ${err instanceof Error ? err.message : String(err)}`,
|
|
80
|
+
hint: 'move the file aside, then re-run — the installer will scaffold a fresh copy',
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function checkKeychain() {
|
|
85
|
+
try {
|
|
86
|
+
const store = await selectCredentialStore();
|
|
87
|
+
const desc = store.describe();
|
|
88
|
+
if (desc.writable) {
|
|
89
|
+
return {
|
|
90
|
+
name: 'keychain',
|
|
91
|
+
status: 'ok',
|
|
92
|
+
message: `credential backend: ${desc.backend}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
name: 'keychain',
|
|
97
|
+
status: 'warn',
|
|
98
|
+
message: `credential backend ${desc.backend} is not writable — will fall back to file`,
|
|
99
|
+
hint: desc.notes ?? 'install the OS keychain helper to get native credential storage',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
return {
|
|
104
|
+
name: 'keychain',
|
|
105
|
+
status: 'warn',
|
|
106
|
+
message: `keychain probe failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
107
|
+
hint: 'the installer will fall back to the file backend',
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function checkHomeDirWritable() {
|
|
112
|
+
const home = os.homedir();
|
|
113
|
+
const switchbotDir = path.join(home, '.switchbot');
|
|
114
|
+
try {
|
|
115
|
+
const homeStat = fs.statSync(home);
|
|
116
|
+
if (!homeStat.isDirectory()) {
|
|
117
|
+
return {
|
|
118
|
+
name: 'home',
|
|
119
|
+
status: 'fail',
|
|
120
|
+
message: `home path is not a directory: ${home}`,
|
|
121
|
+
hint: 'check your HOME/USERPROFILE environment configuration',
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
if (fs.existsSync(switchbotDir)) {
|
|
125
|
+
const sbStat = fs.statSync(switchbotDir);
|
|
126
|
+
if (!sbStat.isDirectory()) {
|
|
127
|
+
return {
|
|
128
|
+
name: 'home',
|
|
129
|
+
status: 'fail',
|
|
130
|
+
message: `${switchbotDir} exists but is not a directory`,
|
|
131
|
+
hint: 'move the file aside and re-run install',
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
fs.accessSync(switchbotDir, fs.constants.W_OK);
|
|
135
|
+
return { name: 'home', status: 'ok', message: `writable: ${switchbotDir}` };
|
|
136
|
+
}
|
|
137
|
+
fs.accessSync(home, fs.constants.W_OK);
|
|
138
|
+
return { name: 'home', status: 'ok', message: `writable: ${home}` };
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
return {
|
|
142
|
+
name: 'home',
|
|
143
|
+
status: 'fail',
|
|
144
|
+
message: `cannot write under ${home}: ${err instanceof Error ? err.message : String(err)}`,
|
|
145
|
+
hint: 'check ownership and permissions on your home directory',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function nearestExistingPath(target) {
|
|
150
|
+
let cur = target;
|
|
151
|
+
while (true) {
|
|
152
|
+
if (fs.existsSync(cur))
|
|
153
|
+
return cur;
|
|
154
|
+
const parent = path.dirname(cur);
|
|
155
|
+
if (parent === cur)
|
|
156
|
+
return null;
|
|
157
|
+
cur = parent;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function checkAgentSkillDirWritable(opts) {
|
|
161
|
+
const shouldCheck = opts.agent === 'claude-code' && (opts.expectSkillLink ?? true);
|
|
162
|
+
if (!shouldCheck)
|
|
163
|
+
return null;
|
|
164
|
+
const home = os.homedir();
|
|
165
|
+
const target = path.join(home, '.claude', 'skills');
|
|
166
|
+
try {
|
|
167
|
+
const existing = nearestExistingPath(target);
|
|
168
|
+
if (!existing) {
|
|
169
|
+
return {
|
|
170
|
+
name: 'agent-skills-dir',
|
|
171
|
+
status: 'fail',
|
|
172
|
+
message: `cannot resolve an existing parent for ${target}`,
|
|
173
|
+
hint: 'check your home directory path and permissions',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
const stat = fs.statSync(existing);
|
|
177
|
+
if (!stat.isDirectory()) {
|
|
178
|
+
return {
|
|
179
|
+
name: 'agent-skills-dir',
|
|
180
|
+
status: 'fail',
|
|
181
|
+
message: `path component is not a directory: ${existing}`,
|
|
182
|
+
hint: 'move the blocking file aside and re-run install',
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
fs.accessSync(existing, fs.constants.W_OK);
|
|
186
|
+
return { name: 'agent-skills-dir', status: 'ok', message: `writable: ${target}` };
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
return {
|
|
190
|
+
name: 'agent-skills-dir',
|
|
191
|
+
status: 'fail',
|
|
192
|
+
message: `cannot write to ${target}: ${err instanceof Error ? err.message : String(err)}`,
|
|
193
|
+
hint: 'open Claude Code once (it will create ~/.claude) or create the directory manually',
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Run every pre-flight check and return a combined result. Safe to
|
|
199
|
+
* call multiple times; no state is cached.
|
|
200
|
+
*/
|
|
201
|
+
export async function runPreflight(options = {}) {
|
|
202
|
+
const checks = [];
|
|
203
|
+
checks.push(checkNodeVersion(options));
|
|
204
|
+
checks.push(checkPolicy());
|
|
205
|
+
checks.push(await checkKeychain());
|
|
206
|
+
checks.push(checkHomeDirWritable());
|
|
207
|
+
const agentCheck = checkAgentSkillDirWritable(options);
|
|
208
|
+
if (agentCheck)
|
|
209
|
+
checks.push(agentCheck);
|
|
210
|
+
const ok = checks.every((c) => c.status !== 'fail');
|
|
211
|
+
return { checks, ok };
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/install/preflight.ts"],"names":[],"mappings":"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"}
|