workos 0.15.2 → 0.16.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 +37 -11
- package/dist/bin.js +1439 -1257
- package/dist/bin.js.map +1 -1
- package/dist/cli.config.d.ts +1 -0
- package/dist/cli.config.js +1 -0
- package/dist/cli.config.js.map +1 -1
- package/dist/commands/api/index.js +7 -2
- package/dist/commands/api/index.js.map +1 -1
- package/dist/commands/api/interactive.js +9 -3
- package/dist/commands/api/interactive.js.map +1 -1
- package/dist/commands/debug.d.ts +2 -1
- package/dist/commands/debug.js +43 -3
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/dev.js +5 -4
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.js +13 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/emulate.js +2 -2
- package/dist/commands/emulate.js.map +1 -1
- package/dist/commands/env.js +5 -4
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/install-skill.js +4 -3
- package/dist/commands/install-skill.js.map +1 -1
- package/dist/commands/install.js +2 -2
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.js +3 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/migrations.d.ts +1 -1
- package/dist/commands/migrations.js +4 -1
- package/dist/commands/migrations.js.map +1 -1
- package/dist/commands/telemetry.d.ts +3 -0
- package/dist/commands/telemetry.js +88 -0
- package/dist/commands/telemetry.js.map +1 -0
- package/dist/commands/uninstall-skill.js +3 -2
- package/dist/commands/uninstall-skill.js.map +1 -1
- package/dist/commands/vault-run.d.ts +13 -0
- package/dist/commands/vault-run.js +194 -0
- package/dist/commands/vault-run.js.map +1 -0
- package/dist/commands/vault.d.ts +3 -2
- package/dist/commands/vault.js +41 -8
- package/dist/commands/vault.js.map +1 -1
- package/dist/lib/api-error-handler.d.ts +15 -3
- package/dist/lib/api-error-handler.js +52 -34
- package/dist/lib/api-error-handler.js.map +1 -1
- package/dist/lib/command-aliases.d.ts +8 -0
- package/dist/lib/command-aliases.js +12 -0
- package/dist/lib/command-aliases.js.map +1 -0
- package/dist/lib/constants.d.ts +0 -1
- package/dist/lib/constants.js +0 -1
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/device-id.d.ts +25 -0
- package/dist/lib/device-id.js +102 -0
- package/dist/lib/device-id.js.map +1 -0
- package/dist/lib/preferences.d.ts +101 -0
- package/dist/lib/preferences.js +198 -0
- package/dist/lib/preferences.js.map +1 -0
- package/dist/lib/run-with-core.js +15 -15
- package/dist/lib/run-with-core.js.map +1 -1
- package/dist/lib/settings.d.ts +6 -0
- package/dist/lib/settings.js +7 -0
- package/dist/lib/settings.js.map +1 -1
- package/dist/lib/telemetry-notice.d.ts +25 -0
- package/dist/lib/telemetry-notice.js +56 -0
- package/dist/lib/telemetry-notice.js.map +1 -0
- package/dist/test/force-insecure-storage.d.ts +1 -0
- package/dist/test/force-insecure-storage.js +9 -0
- package/dist/test/force-insecure-storage.js.map +1 -0
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.js +38 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/utils/analytics.d.ts +41 -0
- package/dist/utils/analytics.js +199 -12
- package/dist/utils/analytics.js.map +1 -1
- package/dist/utils/box.d.ts +29 -1
- package/dist/utils/box.js +92 -4
- package/dist/utils/box.js.map +1 -1
- package/dist/utils/cli-exit.d.ts +15 -0
- package/dist/utils/cli-exit.js +11 -0
- package/dist/utils/cli-exit.js.map +1 -0
- package/dist/utils/cli-symbols.d.ts +1 -1
- package/dist/utils/command-telemetry.d.ts +17 -0
- package/dist/utils/command-telemetry.js +67 -0
- package/dist/utils/command-telemetry.js.map +1 -0
- package/dist/utils/crash-reporter.d.ts +13 -0
- package/dist/utils/crash-reporter.js +91 -0
- package/dist/utils/crash-reporter.js.map +1 -0
- package/dist/utils/debug.d.ts +1 -0
- package/dist/utils/debug.js +4 -1
- package/dist/utils/debug.js.map +1 -1
- package/dist/utils/exit-codes.d.ts +5 -0
- package/dist/utils/exit-codes.js +30 -1
- package/dist/utils/exit-codes.js.map +1 -1
- package/dist/utils/help-json.d.ts +6 -0
- package/dist/utils/help-json.js +87 -10
- package/dist/utils/help-json.js.map +1 -1
- package/dist/utils/output.d.ts +7 -2
- package/dist/utils/output.js +9 -2
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/telemetry-client.d.ts +30 -2
- package/dist/utils/telemetry-client.js +122 -12
- package/dist/utils/telemetry-client.js.map +1 -1
- package/dist/utils/telemetry-store-forward.d.ts +11 -0
- package/dist/utils/telemetry-store-forward.js +94 -0
- package/dist/utils/telemetry-store-forward.js.map +1 -0
- package/dist/utils/telemetry-types.d.ts +58 -9
- package/dist/utils/telemetry-types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { envTelemetryOverride, getTelemetrySource, isTelemetryEnabled, isTelemetryOptedOut, setTelemetryOptedOut, } from '../lib/preferences.js';
|
|
3
|
+
import { isJsonMode, outputJson, exitWithError } from '../utils/output.js';
|
|
4
|
+
import { formatWorkOSCommand } from '../utils/command-invocation.js';
|
|
5
|
+
/**
|
|
6
|
+
* Persist an opt-out/opt-in change, surfacing a clear error if the write fails
|
|
7
|
+
* (read-only FS, permission denied). Unlike the read path, the command path
|
|
8
|
+
* must NOT swallow a write failure — otherwise the user believes their
|
|
9
|
+
* preference persisted when it did not.
|
|
10
|
+
*/
|
|
11
|
+
function persistOptedOut(value) {
|
|
12
|
+
try {
|
|
13
|
+
setTelemetryOptedOut(value);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
exitWithError({
|
|
17
|
+
code: 'internal_error',
|
|
18
|
+
message: `Could not save telemetry preference to disk. Your preference was NOT persisted.`,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function runTelemetryOptOut() {
|
|
23
|
+
const alreadyOptedOut = isTelemetryOptedOut();
|
|
24
|
+
persistOptedOut(true);
|
|
25
|
+
if (isJsonMode()) {
|
|
26
|
+
outputJson({ status: 'ok', optedOut: true, alreadyOptedOut });
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (alreadyOptedOut) {
|
|
30
|
+
console.log(chalk.green('Telemetry collection is already opted out.'));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.log(chalk.green('Telemetry collection disabled. No further events will be sent.'));
|
|
34
|
+
}
|
|
35
|
+
console.log(chalk.dim(`Re-enable any time with \`${formatWorkOSCommand('telemetry opt-in')}\`.`));
|
|
36
|
+
}
|
|
37
|
+
export async function runTelemetryOptIn() {
|
|
38
|
+
const wasOptedOut = isTelemetryOptedOut();
|
|
39
|
+
persistOptedOut(false);
|
|
40
|
+
if (isJsonMode()) {
|
|
41
|
+
outputJson({ status: 'ok', optedOut: false, alreadyOptedIn: !wasOptedOut });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (wasOptedOut) {
|
|
45
|
+
console.log(chalk.green('Telemetry collection re-enabled.'));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log(chalk.green('Telemetry collection is already enabled.'));
|
|
49
|
+
}
|
|
50
|
+
console.log(chalk.dim(`Opt out any time with \`${formatWorkOSCommand('telemetry opt-out')}\`.`));
|
|
51
|
+
}
|
|
52
|
+
function describeSource(source) {
|
|
53
|
+
switch (source) {
|
|
54
|
+
case 'env':
|
|
55
|
+
return 'WORKOS_TELEMETRY environment variable';
|
|
56
|
+
case 'preference':
|
|
57
|
+
return 'saved preference';
|
|
58
|
+
case 'default':
|
|
59
|
+
return 'default';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function runTelemetryStatus() {
|
|
63
|
+
const enabled = isTelemetryEnabled();
|
|
64
|
+
const optedOut = isTelemetryOptedOut();
|
|
65
|
+
const source = getTelemetrySource();
|
|
66
|
+
const override = envTelemetryOverride();
|
|
67
|
+
if (isJsonMode()) {
|
|
68
|
+
outputJson({
|
|
69
|
+
enabled,
|
|
70
|
+
optedOut,
|
|
71
|
+
source,
|
|
72
|
+
envOverride: override ?? null,
|
|
73
|
+
});
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const stateLine = enabled
|
|
77
|
+
? chalk.green('Telemetry collection is enabled.')
|
|
78
|
+
: chalk.yellow('Telemetry collection is disabled.');
|
|
79
|
+
console.log(stateLine);
|
|
80
|
+
console.log(chalk.dim(`Source: ${describeSource(source)}.`));
|
|
81
|
+
if (enabled) {
|
|
82
|
+
console.log(chalk.dim(`Opt out with \`${formatWorkOSCommand('telemetry opt-out')}\`.`));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.log(chalk.dim(`Re-enable with \`${formatWorkOSCommand('telemetry opt-in')}\`.`));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE;;;;;GAKG;AACH,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC;QACH,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,CAAC;YACZ,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,iFAAiF;SAC3F,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,eAAe,GAAG,mBAAmB,EAAE,CAAC;IAC9C,eAAe,CAAC,IAAI,CAAC,CAAC;IAEtB,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,mBAAmB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;IAC1C,eAAe,CAAC,KAAK,CAAC,CAAC;IAEvB,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,mBAAmB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,cAAc,CAAC,MAAuB;IAC7C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,uCAAuC,CAAC;QACjD,KAAK,YAAY;YACf,OAAO,kBAAkB,CAAC;QAC5B,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IAExC,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,UAAU,CAAC;YACT,OAAO;YACP,QAAQ;YACR,MAAM;YACN,WAAW,EAAE,QAAQ,IAAI,IAAI;SAC9B,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,OAAO;QACvB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC;QACjD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,mBAAmB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,mBAAmB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC","sourcesContent":["import chalk from 'chalk';\nimport {\n envTelemetryOverride,\n getTelemetrySource,\n isTelemetryEnabled,\n isTelemetryOptedOut,\n setTelemetryOptedOut,\n type TelemetrySource,\n} from '../lib/preferences.js';\nimport { isJsonMode, outputJson, exitWithError } from '../utils/output.js';\nimport { formatWorkOSCommand } from '../utils/command-invocation.js';\n\n/**\n * Persist an opt-out/opt-in change, surfacing a clear error if the write fails\n * (read-only FS, permission denied). Unlike the read path, the command path\n * must NOT swallow a write failure — otherwise the user believes their\n * preference persisted when it did not.\n */\nfunction persistOptedOut(value: boolean): void {\n try {\n setTelemetryOptedOut(value);\n } catch {\n exitWithError({\n code: 'internal_error',\n message: `Could not save telemetry preference to disk. Your preference was NOT persisted.`,\n });\n }\n}\n\nexport async function runTelemetryOptOut(): Promise<void> {\n const alreadyOptedOut = isTelemetryOptedOut();\n persistOptedOut(true);\n\n if (isJsonMode()) {\n outputJson({ status: 'ok', optedOut: true, alreadyOptedOut });\n return;\n }\n\n if (alreadyOptedOut) {\n console.log(chalk.green('Telemetry collection is already opted out.'));\n } else {\n console.log(chalk.green('Telemetry collection disabled. No further events will be sent.'));\n }\n console.log(chalk.dim(`Re-enable any time with \\`${formatWorkOSCommand('telemetry opt-in')}\\`.`));\n}\n\nexport async function runTelemetryOptIn(): Promise<void> {\n const wasOptedOut = isTelemetryOptedOut();\n persistOptedOut(false);\n\n if (isJsonMode()) {\n outputJson({ status: 'ok', optedOut: false, alreadyOptedIn: !wasOptedOut });\n return;\n }\n\n if (wasOptedOut) {\n console.log(chalk.green('Telemetry collection re-enabled.'));\n } else {\n console.log(chalk.green('Telemetry collection is already enabled.'));\n }\n console.log(chalk.dim(`Opt out any time with \\`${formatWorkOSCommand('telemetry opt-out')}\\`.`));\n}\n\nfunction describeSource(source: TelemetrySource): string {\n switch (source) {\n case 'env':\n return 'WORKOS_TELEMETRY environment variable';\n case 'preference':\n return 'saved preference';\n case 'default':\n return 'default';\n }\n}\n\nexport async function runTelemetryStatus(): Promise<void> {\n const enabled = isTelemetryEnabled();\n const optedOut = isTelemetryOptedOut();\n const source = getTelemetrySource();\n const override = envTelemetryOverride();\n\n if (isJsonMode()) {\n outputJson({\n enabled,\n optedOut,\n source,\n envOverride: override ?? null,\n });\n return;\n }\n\n const stateLine = enabled\n ? chalk.green('Telemetry collection is enabled.')\n : chalk.yellow('Telemetry collection is disabled.');\n console.log(stateLine);\n console.log(chalk.dim(`Source: ${describeSource(source)}.`));\n\n if (enabled) {\n console.log(chalk.dim(`Opt out with \\`${formatWorkOSCommand('telemetry opt-out')}\\`.`));\n } else {\n console.log(chalk.dim(`Re-enable with \\`${formatWorkOSCommand('telemetry opt-in')}\\`.`));\n }\n}\n"]}
|
|
@@ -6,6 +6,7 @@ import chalk from 'chalk';
|
|
|
6
6
|
import { logError, logInfo, logWarn } from '../utils/debug.js';
|
|
7
7
|
import { exitWithError, isJsonMode, outputJson } from '../utils/output.js';
|
|
8
8
|
import { createAgents, detectAgents, discoverSkills, getSkillsDir } from './install-skill.js';
|
|
9
|
+
import { ExitCode, exitWithCode } from '../utils/exit-codes.js';
|
|
9
10
|
export function findInstalledSkills(knownSkills, agent) {
|
|
10
11
|
return knownSkills.filter((name) => existsSync(join(agent.globalSkillsDir, name, 'SKILL.md')));
|
|
11
12
|
}
|
|
@@ -89,7 +90,7 @@ export async function runUninstallSkill(options) {
|
|
|
89
90
|
if (isJsonMode()) {
|
|
90
91
|
outputJson({ removed, skipped, failed });
|
|
91
92
|
if (failed.length > 0) {
|
|
92
|
-
|
|
93
|
+
exitWithCode(ExitCode.GENERAL_ERROR);
|
|
93
94
|
}
|
|
94
95
|
return;
|
|
95
96
|
}
|
|
@@ -109,7 +110,7 @@ export async function runUninstallSkill(options) {
|
|
|
109
110
|
for (const r of failed) {
|
|
110
111
|
console.log(` ${r.skill} ← ${r.agent}: ${chalk.dim(r.error)}`);
|
|
111
112
|
}
|
|
112
|
-
|
|
113
|
+
exitWithCode(ExitCode.GENERAL_ERROR);
|
|
113
114
|
}
|
|
114
115
|
console.log(chalk.green('\nDone!'));
|
|
115
116
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall-skill.js","sourceRoot":"","sources":["../../src/commands/uninstall-skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'fs';\nimport { rm } from 'fs/promises';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport { logError, logInfo, logWarn } from '../utils/debug.js';\nimport { exitWithError, isJsonMode, outputJson } from '../utils/output.js';\nimport { createAgents, detectAgents, discoverSkills, getSkillsDir, type AgentConfig } from './install-skill.js';\n\nexport interface UninstallSkillOptions {\n skill?: string[];\n agent?: string[];\n}\n\nexport function findInstalledSkills(knownSkills: string[], agent: AgentConfig): string[] {\n return knownSkills.filter((name) => existsSync(join(agent.globalSkillsDir, name, 'SKILL.md')));\n}\n\nexport async function uninstallSkill(\n skillName: string,\n agent: AgentConfig,\n): Promise<{ success: boolean; error?: string }> {\n const targetDir = join(agent.globalSkillsDir, skillName);\n try {\n await rm(targetDir, { recursive: true, force: true });\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logError(`Failed to remove skill \"${skillName}\" for ${agent.displayName} at ${targetDir}:`, message);\n return { success: false, error: message };\n }\n}\n\nexport async function runUninstallSkill(options: UninstallSkillOptions): Promise<void> {\n const home = homedir();\n const agents = createAgents(home);\n const skillsDir = getSkillsDir();\n\n let knownSkills: string[];\n try {\n knownSkills = await discoverSkills(skillsDir);\n } catch (error) {\n logError('Failed to read skills directory:', error);\n exitWithError({\n code: 'SKILLS_DIR_READ_FAILED',\n message: `Could not read skills directory at ${skillsDir}. Your WorkOS CLI installation may be corrupted. Try reinstalling with \\`npm install -g @workos-inc/cli\\`.`,\n });\n }\n\n const targetAgents = detectAgents(agents, options.agent);\n\n if (targetAgents.length === 0) {\n const message = options.agent ? 'Specified agents not found.' : 'No coding agents detected.';\n logWarn(message, 'Supported agents:', Object.keys(agents).join(', '));\n exitWithError({\n code: 'NO_AGENTS_FOUND',\n message: `${message} Supported agents: ${Object.keys(agents).join(', ')}`,\n });\n }\n\n const targetSkillNames = options.skill ? knownSkills.filter((s) => options.skill!.includes(s)) : knownSkills;\n\n if (options.skill) {\n const unrecognized = options.skill.filter((s) => !knownSkills.includes(s));\n if (unrecognized.length > 0) {\n logWarn('Unrecognized skill names requested for uninstall:', unrecognized);\n if (!isJsonMode()) {\n console.warn(chalk.yellow(`Unknown skills (ignored): ${unrecognized.join(', ')}`));\n }\n }\n }\n\n if (options.skill && targetSkillNames.length === 0) {\n logError('No matching skills found. Known skills:', knownSkills.join(', '));\n exitWithError({\n code: 'SKILL_NOT_FOUND',\n message: `No matching skills found. Known skills: ${knownSkills.join(', ')}`,\n });\n }\n\n logInfo(\n 'Uninstalling skills:',\n targetSkillNames.join(', '),\n 'for agents:',\n targetAgents.map((a) => a.displayName).join(', '),\n );\n\n if (!isJsonMode()) {\n console.log(chalk.bold('\\nUninstalling skills...\\n'));\n }\n\n const results: Array<{\n skill: string;\n agent: string;\n success: boolean;\n skipped: boolean;\n error?: string;\n }> = [];\n\n for (const skill of targetSkillNames) {\n for (const agent of targetAgents) {\n const installed = findInstalledSkills([skill], agent);\n if (installed.length === 0) {\n results.push({ skill, agent: agent.displayName, success: true, skipped: true });\n continue;\n }\n const result = await uninstallSkill(skill, agent);\n results.push({\n skill,\n agent: agent.displayName,\n skipped: false,\n ...result,\n });\n }\n }\n\n const removed = results.filter((r) => r.success && !r.skipped);\n const skipped = results.filter((r) => r.skipped);\n const failed = results.filter((r) => !r.success);\n\n if (isJsonMode()) {\n outputJson({ removed, skipped, failed });\n if (failed.length > 0) {\n process.exit(1);\n }\n return;\n }\n\n if (removed.length > 0) {\n logInfo(`Removed ${removed.length} skill(s)`);\n console.log(chalk.green(`✓ Removed ${removed.length} skill(s):\\n`));\n for (const r of removed) {\n console.log(` ${chalk.cyan(r.skill)} ← ${chalk.dim(r.agent)}`);\n }\n }\n\n if (skipped.length > 0 && removed.length === 0 && failed.length === 0) {\n console.log(chalk.dim('No WorkOS skills were installed.'));\n }\n\n if (failed.length > 0) {\n logError(`Failed to remove ${failed.length} skill(s)`);\n console.log(chalk.red(`\\n✗ Failed to remove ${failed.length}:\\n`));\n for (const r of failed) {\n console.log(` ${r.skill} ← ${r.agent}: ${chalk.dim(r.error)}`);\n }\n process.exit(1);\n }\n\n console.log(chalk.green('\\nDone!'));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"uninstall-skill.js","sourceRoot":"","sources":["../../src/commands/uninstall-skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'fs';\nimport { rm } from 'fs/promises';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport { logError, logInfo, logWarn } from '../utils/debug.js';\nimport { exitWithError, isJsonMode, outputJson } from '../utils/output.js';\nimport { createAgents, detectAgents, discoverSkills, getSkillsDir, type AgentConfig } from './install-skill.js';\nimport { ExitCode, exitWithCode } from '../utils/exit-codes.js';\n\nexport interface UninstallSkillOptions {\n skill?: string[];\n agent?: string[];\n}\n\nexport function findInstalledSkills(knownSkills: string[], agent: AgentConfig): string[] {\n return knownSkills.filter((name) => existsSync(join(agent.globalSkillsDir, name, 'SKILL.md')));\n}\n\nexport async function uninstallSkill(\n skillName: string,\n agent: AgentConfig,\n): Promise<{ success: boolean; error?: string }> {\n const targetDir = join(agent.globalSkillsDir, skillName);\n try {\n await rm(targetDir, { recursive: true, force: true });\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logError(`Failed to remove skill \"${skillName}\" for ${agent.displayName} at ${targetDir}:`, message);\n return { success: false, error: message };\n }\n}\n\nexport async function runUninstallSkill(options: UninstallSkillOptions): Promise<void> {\n const home = homedir();\n const agents = createAgents(home);\n const skillsDir = getSkillsDir();\n\n let knownSkills: string[];\n try {\n knownSkills = await discoverSkills(skillsDir);\n } catch (error) {\n logError('Failed to read skills directory:', error);\n exitWithError({\n code: 'SKILLS_DIR_READ_FAILED',\n message: `Could not read skills directory at ${skillsDir}. Your WorkOS CLI installation may be corrupted. Try reinstalling with \\`npm install -g @workos-inc/cli\\`.`,\n });\n }\n\n const targetAgents = detectAgents(agents, options.agent);\n\n if (targetAgents.length === 0) {\n const message = options.agent ? 'Specified agents not found.' : 'No coding agents detected.';\n logWarn(message, 'Supported agents:', Object.keys(agents).join(', '));\n exitWithError({\n code: 'NO_AGENTS_FOUND',\n message: `${message} Supported agents: ${Object.keys(agents).join(', ')}`,\n });\n }\n\n const targetSkillNames = options.skill ? knownSkills.filter((s) => options.skill!.includes(s)) : knownSkills;\n\n if (options.skill) {\n const unrecognized = options.skill.filter((s) => !knownSkills.includes(s));\n if (unrecognized.length > 0) {\n logWarn('Unrecognized skill names requested for uninstall:', unrecognized);\n if (!isJsonMode()) {\n console.warn(chalk.yellow(`Unknown skills (ignored): ${unrecognized.join(', ')}`));\n }\n }\n }\n\n if (options.skill && targetSkillNames.length === 0) {\n logError('No matching skills found. Known skills:', knownSkills.join(', '));\n exitWithError({\n code: 'SKILL_NOT_FOUND',\n message: `No matching skills found. Known skills: ${knownSkills.join(', ')}`,\n });\n }\n\n logInfo(\n 'Uninstalling skills:',\n targetSkillNames.join(', '),\n 'for agents:',\n targetAgents.map((a) => a.displayName).join(', '),\n );\n\n if (!isJsonMode()) {\n console.log(chalk.bold('\\nUninstalling skills...\\n'));\n }\n\n const results: Array<{\n skill: string;\n agent: string;\n success: boolean;\n skipped: boolean;\n error?: string;\n }> = [];\n\n for (const skill of targetSkillNames) {\n for (const agent of targetAgents) {\n const installed = findInstalledSkills([skill], agent);\n if (installed.length === 0) {\n results.push({ skill, agent: agent.displayName, success: true, skipped: true });\n continue;\n }\n const result = await uninstallSkill(skill, agent);\n results.push({\n skill,\n agent: agent.displayName,\n skipped: false,\n ...result,\n });\n }\n }\n\n const removed = results.filter((r) => r.success && !r.skipped);\n const skipped = results.filter((r) => r.skipped);\n const failed = results.filter((r) => !r.success);\n\n if (isJsonMode()) {\n outputJson({ removed, skipped, failed });\n if (failed.length > 0) {\n exitWithCode(ExitCode.GENERAL_ERROR);\n }\n return;\n }\n\n if (removed.length > 0) {\n logInfo(`Removed ${removed.length} skill(s)`);\n console.log(chalk.green(`✓ Removed ${removed.length} skill(s):\\n`));\n for (const r of removed) {\n console.log(` ${chalk.cyan(r.skill)} ← ${chalk.dim(r.agent)}`);\n }\n }\n\n if (skipped.length > 0 && removed.length === 0 && failed.length === 0) {\n console.log(chalk.dim('No WorkOS skills were installed.'));\n }\n\n if (failed.length > 0) {\n logError(`Failed to remove ${failed.length} skill(s)`);\n console.log(chalk.red(`\\n✗ Failed to remove ${failed.length}:\\n`));\n for (const r of failed) {\n console.log(` ${r.skill} ← ${r.agent}: ${chalk.dim(r.error)}`);\n }\n exitWithCode(ExitCode.GENERAL_ERROR);\n }\n\n console.log(chalk.green('\\nDone!'));\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface SecretMapping {
|
|
2
|
+
envVar: string;
|
|
3
|
+
vaultName: string;
|
|
4
|
+
}
|
|
5
|
+
export interface VaultRunOptions {
|
|
6
|
+
secrets: string[];
|
|
7
|
+
command: string[];
|
|
8
|
+
env?: string;
|
|
9
|
+
dryRun?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseSecretMappings(secrets: string[]): SecretMapping[];
|
|
12
|
+
export declare function fetchSecrets(mappings: SecretMapping[], apiKey: string, baseUrl?: string): Promise<Map<string, string>>;
|
|
13
|
+
export declare function runVaultRun(options: VaultRunOptions, flagApiKey?: string): Promise<number | void>;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { createWorkOSClient } from '../lib/workos-client.js';
|
|
4
|
+
import { createApiErrorHandler } from '../lib/api-error-handler.js';
|
|
5
|
+
import { isJsonMode, outputJson, exitWithError } from '../utils/output.js';
|
|
6
|
+
import { formatTable } from '../utils/table.js';
|
|
7
|
+
import { SPAWN_OPTS, IS_WINDOWS } from '../utils/platform.js';
|
|
8
|
+
const handleApiError = createApiErrorHandler('Vault');
|
|
9
|
+
export function parseSecretMappings(secrets) {
|
|
10
|
+
if (!secrets || secrets.length === 0) {
|
|
11
|
+
exitWithError({
|
|
12
|
+
code: 'missing_secrets',
|
|
13
|
+
message: 'At least one --secret ENV=name mapping is required',
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const result = [];
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
for (const raw of secrets) {
|
|
19
|
+
const eqIndex = raw.indexOf('=');
|
|
20
|
+
if (eqIndex <= 0 || eqIndex === raw.length - 1) {
|
|
21
|
+
exitWithError({
|
|
22
|
+
code: 'invalid_secret_format',
|
|
23
|
+
message: `Invalid secret mapping '${raw}'. Expected format: ENV_VAR=vault-name`,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const envVar = raw.slice(0, eqIndex);
|
|
27
|
+
const vaultName = raw.slice(eqIndex + 1);
|
|
28
|
+
if (seen.has(envVar)) {
|
|
29
|
+
exitWithError({
|
|
30
|
+
code: 'duplicate_env_var',
|
|
31
|
+
message: `Duplicate environment variable '${envVar}' in --secret mappings`,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
seen.add(envVar);
|
|
35
|
+
result.push({ envVar, vaultName });
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
export async function fetchSecrets(mappings, apiKey, baseUrl) {
|
|
40
|
+
const client = createWorkOSClient(apiKey, baseUrl);
|
|
41
|
+
const entries = await Promise.all(mappings.map(async ({ envVar, vaultName }) => {
|
|
42
|
+
let obj;
|
|
43
|
+
try {
|
|
44
|
+
obj = await client.sdk.vault.readObjectByName(vaultName);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
return handleApiError(error, vaultName);
|
|
48
|
+
}
|
|
49
|
+
if (typeof obj.value !== 'string') {
|
|
50
|
+
exitWithError({
|
|
51
|
+
code: 'vault_value_missing',
|
|
52
|
+
message: `Vault object '${vaultName}' has no readable value`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return [envVar, obj.value];
|
|
56
|
+
}));
|
|
57
|
+
return new Map(entries);
|
|
58
|
+
}
|
|
59
|
+
async function resolveRunApiKey(envName, flagApiKey) {
|
|
60
|
+
if (!envName) {
|
|
61
|
+
const { resolveApiKey } = await import('../lib/api-key.js');
|
|
62
|
+
return resolveApiKey({ apiKey: flagApiKey });
|
|
63
|
+
}
|
|
64
|
+
const { getConfig } = await import('../lib/config-store.js');
|
|
65
|
+
const config = getConfig();
|
|
66
|
+
const env = config?.environments[envName];
|
|
67
|
+
if (!env || !env.apiKey) {
|
|
68
|
+
exitWithError({
|
|
69
|
+
code: 'env_not_found',
|
|
70
|
+
message: `Environment '${envName}' not found or has no API key. Run 'workos env list' to see available environments.`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return env.apiKey;
|
|
74
|
+
}
|
|
75
|
+
async function resolveRunBaseUrl(envName) {
|
|
76
|
+
if (envName) {
|
|
77
|
+
const { getConfig } = await import('../lib/config-store.js');
|
|
78
|
+
const config = getConfig();
|
|
79
|
+
const env = config?.environments[envName];
|
|
80
|
+
// Use the named env's endpoint, or the default. Never fall through to
|
|
81
|
+
// the active env's endpoint -- that would send the wrong API key to
|
|
82
|
+
// the wrong host when active != selected.
|
|
83
|
+
return env?.endpoint ?? 'https://api.workos.com';
|
|
84
|
+
}
|
|
85
|
+
const { resolveApiBaseUrl } = await import('../lib/api-key.js');
|
|
86
|
+
return resolveApiBaseUrl();
|
|
87
|
+
}
|
|
88
|
+
function printDryRun(mappings, envName) {
|
|
89
|
+
if (isJsonMode()) {
|
|
90
|
+
outputJson({
|
|
91
|
+
dryRun: true,
|
|
92
|
+
env: envName ?? null,
|
|
93
|
+
mappings: mappings.map(({ envVar, vaultName }) => ({ envVar, vaultName })),
|
|
94
|
+
});
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
console.log(chalk.dim('Dry run (no secrets will be fetched and no child process will be spawned).'));
|
|
98
|
+
if (envName)
|
|
99
|
+
console.log(chalk.dim(`Environment: ${envName}`));
|
|
100
|
+
console.log();
|
|
101
|
+
const rows = mappings.map(({ envVar, vaultName }) => [envVar, vaultName]);
|
|
102
|
+
console.log(formatTable([{ header: 'Environment Variable' }, { header: 'Vault Object' }], rows));
|
|
103
|
+
}
|
|
104
|
+
function spawnChild(command, args, childEnv) {
|
|
105
|
+
return new Promise((resolve, reject) => {
|
|
106
|
+
let child;
|
|
107
|
+
try {
|
|
108
|
+
child = spawn(command, args, {
|
|
109
|
+
stdio: 'inherit',
|
|
110
|
+
env: childEnv,
|
|
111
|
+
...SPAWN_OPTS,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
116
|
+
exitWithError({
|
|
117
|
+
code: 'spawn_failed',
|
|
118
|
+
message: `Failed to start: ${command}: ${message}`,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
child.on('error', (err) => {
|
|
122
|
+
try {
|
|
123
|
+
const code = err.code;
|
|
124
|
+
if (code === 'ENOENT') {
|
|
125
|
+
exitWithError({ code: 'command_not_found', message: `Command not found: ${command}` });
|
|
126
|
+
}
|
|
127
|
+
exitWithError({ code: 'spawn_error', message: `Failed to start: ${command}: ${err.message}` });
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
reject(e);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
const forward = (signal) => {
|
|
134
|
+
if (!child.killed)
|
|
135
|
+
child.kill(signal);
|
|
136
|
+
};
|
|
137
|
+
process.once('SIGINT', () => forward('SIGINT'));
|
|
138
|
+
process.once('SIGTERM', () => forward('SIGTERM'));
|
|
139
|
+
if (IS_WINDOWS) {
|
|
140
|
+
process.once('SIGBREAK', () => forward('SIGINT'));
|
|
141
|
+
}
|
|
142
|
+
child.on('exit', (code, signal) => {
|
|
143
|
+
if (signal) {
|
|
144
|
+
const num = signalToNumber(signal);
|
|
145
|
+
resolve(num ? 128 + num : 1);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
resolve(code ?? 0);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function signalToNumber(signal) {
|
|
154
|
+
const map = {
|
|
155
|
+
SIGHUP: 1,
|
|
156
|
+
SIGINT: 2,
|
|
157
|
+
SIGQUIT: 3,
|
|
158
|
+
SIGKILL: 9,
|
|
159
|
+
SIGTERM: 15,
|
|
160
|
+
};
|
|
161
|
+
return map[signal] ?? 0;
|
|
162
|
+
}
|
|
163
|
+
export async function runVaultRun(options, flagApiKey) {
|
|
164
|
+
const mappings = parseSecretMappings(options.secrets);
|
|
165
|
+
if (options.dryRun) {
|
|
166
|
+
printDryRun(mappings, options.env);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (!options.command || options.command.length === 0) {
|
|
170
|
+
exitWithError({
|
|
171
|
+
code: 'missing_command',
|
|
172
|
+
message: 'No command specified. Usage: workos vault run --secret ENV=name -- command',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
const apiKey = await resolveRunApiKey(options.env, flagApiKey);
|
|
176
|
+
const baseUrl = await resolveRunBaseUrl(options.env);
|
|
177
|
+
const secretValues = await fetchSecrets(mappings, apiKey, baseUrl);
|
|
178
|
+
// Metadata to stderr so the child process owns stdout.
|
|
179
|
+
if (isJsonMode()) {
|
|
180
|
+
console.error(JSON.stringify({
|
|
181
|
+
status: 'ok',
|
|
182
|
+
message: 'Injected secrets into child process',
|
|
183
|
+
env: options.env ?? null,
|
|
184
|
+
injected: mappings.map(({ envVar, vaultName }) => ({ envVar, vaultName })),
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
const childEnv = { ...process.env };
|
|
188
|
+
for (const [envVar, value] of secretValues) {
|
|
189
|
+
childEnv[envVar] = value;
|
|
190
|
+
}
|
|
191
|
+
const [cmd, ...args] = options.command;
|
|
192
|
+
return spawnChild(cmd, args, childEnv);
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=vault-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-run.js","sourceRoot":"","sources":["../../src/commands/vault-run.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, type ChildProcess } from 'node:child_process';\nimport chalk from 'chalk';\nimport { createWorkOSClient } from '../lib/workos-client.js';\nimport { createApiErrorHandler } from '../lib/api-error-handler.js';\nimport { isJsonMode, outputJson, exitWithError } from '../utils/output.js';\nimport { formatTable } from '../utils/table.js';\nimport { SPAWN_OPTS, IS_WINDOWS } from '../utils/platform.js';\n\nconst handleApiError = createApiErrorHandler('Vault');\n\nexport interface SecretMapping {\n envVar: string;\n vaultName: string;\n}\n\nexport interface VaultRunOptions {\n secrets: string[];\n command: string[];\n env?: string;\n dryRun?: boolean;\n}\n\nexport function parseSecretMappings(secrets: string[]): SecretMapping[] {\n if (!secrets || secrets.length === 0) {\n exitWithError({\n code: 'missing_secrets',\n message: 'At least one --secret ENV=name mapping is required',\n });\n }\n\n const result: SecretMapping[] = [];\n const seen = new Set<string>();\n\n for (const raw of secrets) {\n const eqIndex = raw.indexOf('=');\n if (eqIndex <= 0 || eqIndex === raw.length - 1) {\n exitWithError({\n code: 'invalid_secret_format',\n message: `Invalid secret mapping '${raw}'. Expected format: ENV_VAR=vault-name`,\n });\n }\n\n const envVar = raw.slice(0, eqIndex);\n const vaultName = raw.slice(eqIndex + 1);\n\n if (seen.has(envVar)) {\n exitWithError({\n code: 'duplicate_env_var',\n message: `Duplicate environment variable '${envVar}' in --secret mappings`,\n });\n }\n seen.add(envVar);\n\n result.push({ envVar, vaultName });\n }\n\n return result;\n}\n\nexport async function fetchSecrets(\n mappings: SecretMapping[],\n apiKey: string,\n baseUrl?: string,\n): Promise<Map<string, string>> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n const entries = await Promise.all(\n mappings.map(async ({ envVar, vaultName }): Promise<[string, string]> => {\n let obj: { value?: unknown };\n try {\n obj = await client.sdk.vault.readObjectByName(vaultName);\n } catch (error) {\n return handleApiError(error, vaultName);\n }\n if (typeof obj.value !== 'string') {\n exitWithError({\n code: 'vault_value_missing',\n message: `Vault object '${vaultName}' has no readable value`,\n });\n }\n return [envVar, obj.value];\n }),\n );\n\n return new Map(entries);\n}\n\nasync function resolveRunApiKey(envName: string | undefined, flagApiKey?: string): Promise<string> {\n if (!envName) {\n const { resolveApiKey } = await import('../lib/api-key.js');\n return resolveApiKey({ apiKey: flagApiKey });\n }\n\n const { getConfig } = await import('../lib/config-store.js');\n const config = getConfig();\n const env = config?.environments[envName];\n if (!env || !env.apiKey) {\n exitWithError({\n code: 'env_not_found',\n message: `Environment '${envName}' not found or has no API key. Run 'workos env list' to see available environments.`,\n });\n }\n return env.apiKey;\n}\n\nasync function resolveRunBaseUrl(envName: string | undefined): Promise<string> {\n if (envName) {\n const { getConfig } = await import('../lib/config-store.js');\n const config = getConfig();\n const env = config?.environments[envName];\n // Use the named env's endpoint, or the default. Never fall through to\n // the active env's endpoint -- that would send the wrong API key to\n // the wrong host when active != selected.\n return env?.endpoint ?? 'https://api.workos.com';\n }\n const { resolveApiBaseUrl } = await import('../lib/api-key.js');\n return resolveApiBaseUrl();\n}\n\nfunction printDryRun(mappings: SecretMapping[], envName?: string): void {\n if (isJsonMode()) {\n outputJson({\n dryRun: true,\n env: envName ?? null,\n mappings: mappings.map(({ envVar, vaultName }) => ({ envVar, vaultName })),\n });\n return;\n }\n\n console.log(chalk.dim('Dry run (no secrets will be fetched and no child process will be spawned).'));\n if (envName) console.log(chalk.dim(`Environment: ${envName}`));\n console.log();\n const rows = mappings.map(({ envVar, vaultName }) => [envVar, vaultName]);\n console.log(formatTable([{ header: 'Environment Variable' }, { header: 'Vault Object' }], rows));\n}\n\nfunction spawnChild(command: string, args: string[], childEnv: NodeJS.ProcessEnv): Promise<number> {\n return new Promise((resolve, reject) => {\n let child: ChildProcess;\n try {\n child = spawn(command, args, {\n stdio: 'inherit',\n env: childEnv,\n ...SPAWN_OPTS,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n exitWithError({\n code: 'spawn_failed',\n message: `Failed to start: ${command}: ${message}`,\n });\n }\n\n child.on('error', (err) => {\n try {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n exitWithError({ code: 'command_not_found', message: `Command not found: ${command}` });\n }\n exitWithError({ code: 'spawn_error', message: `Failed to start: ${command}: ${err.message}` });\n } catch (e) {\n reject(e);\n }\n });\n\n const forward = (signal: NodeJS.Signals) => {\n if (!child.killed) child.kill(signal);\n };\n process.once('SIGINT', () => forward('SIGINT'));\n process.once('SIGTERM', () => forward('SIGTERM'));\n if (IS_WINDOWS) {\n process.once('SIGBREAK', () => forward('SIGINT'));\n }\n\n child.on('exit', (code, signal) => {\n if (signal) {\n const num = signalToNumber(signal);\n resolve(num ? 128 + num : 1);\n } else {\n resolve(code ?? 0);\n }\n });\n });\n}\n\nfunction signalToNumber(signal: NodeJS.Signals): number {\n const map: Record<string, number> = {\n SIGHUP: 1,\n SIGINT: 2,\n SIGQUIT: 3,\n SIGKILL: 9,\n SIGTERM: 15,\n };\n return map[signal] ?? 0;\n}\n\nexport async function runVaultRun(options: VaultRunOptions, flagApiKey?: string): Promise<number | void> {\n const mappings = parseSecretMappings(options.secrets);\n\n if (options.dryRun) {\n printDryRun(mappings, options.env);\n return;\n }\n\n if (!options.command || options.command.length === 0) {\n exitWithError({\n code: 'missing_command',\n message: 'No command specified. Usage: workos vault run --secret ENV=name -- command',\n });\n }\n\n const apiKey = await resolveRunApiKey(options.env, flagApiKey);\n const baseUrl = await resolveRunBaseUrl(options.env);\n const secretValues = await fetchSecrets(mappings, apiKey, baseUrl);\n\n // Metadata to stderr so the child process owns stdout.\n if (isJsonMode()) {\n console.error(\n JSON.stringify({\n status: 'ok',\n message: 'Injected secrets into child process',\n env: options.env ?? null,\n injected: mappings.map(({ envVar, vaultName }) => ({ envVar, vaultName })),\n }),\n );\n }\n\n const childEnv: NodeJS.ProcessEnv = { ...process.env };\n for (const [envVar, value] of secretValues) {\n childEnv[envVar] = value;\n }\n\n const [cmd, ...args] = options.command;\n return spawnChild(cmd, args, childEnv);\n}\n"]}
|
package/dist/commands/vault.d.ts
CHANGED
|
@@ -5,8 +5,8 @@ export interface VaultListOptions {
|
|
|
5
5
|
order?: string;
|
|
6
6
|
}
|
|
7
7
|
export declare function runVaultList(options: VaultListOptions, apiKey: string, baseUrl?: string): Promise<void>;
|
|
8
|
-
export declare function runVaultGet(id: string, apiKey: string, baseUrl?: string): Promise<void>;
|
|
9
|
-
export declare function runVaultGetByName(name: string, apiKey: string, baseUrl?: string): Promise<void>;
|
|
8
|
+
export declare function runVaultGet(id: string, decrypt: boolean, apiKey: string, baseUrl?: string): Promise<void>;
|
|
9
|
+
export declare function runVaultGetByName(name: string, decrypt: boolean, apiKey: string, baseUrl?: string): Promise<void>;
|
|
10
10
|
export interface VaultCreateOptions {
|
|
11
11
|
name: string;
|
|
12
12
|
value: string;
|
|
@@ -22,3 +22,4 @@ export declare function runVaultUpdate(options: VaultUpdateOptions, apiKey: stri
|
|
|
22
22
|
export declare function runVaultDelete(id: string, apiKey: string, baseUrl?: string): Promise<void>;
|
|
23
23
|
export declare function runVaultDescribe(id: string, apiKey: string, baseUrl?: string): Promise<void>;
|
|
24
24
|
export declare function runVaultListVersions(id: string, apiKey: string, baseUrl?: string): Promise<void>;
|
|
25
|
+
export declare function readValueFromStdin(): Promise<string>;
|
package/dist/commands/vault.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { createWorkOSClient } from '../lib/workos-client.js';
|
|
3
3
|
import { formatTable } from '../utils/table.js';
|
|
4
|
-
import { outputSuccess, outputJson, isJsonMode } from '../utils/output.js';
|
|
4
|
+
import { outputSuccess, outputJson, isJsonMode, exitWithError } from '../utils/output.js';
|
|
5
5
|
import { createApiErrorHandler } from '../lib/api-error-handler.js';
|
|
6
6
|
const handleApiError = createApiErrorHandler('Vault');
|
|
7
7
|
export async function runVaultList(options, apiKey, baseUrl) {
|
|
@@ -38,34 +38,51 @@ export async function runVaultList(options, apiKey, baseUrl) {
|
|
|
38
38
|
handleApiError(error);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
export async function runVaultGet(id, apiKey, baseUrl) {
|
|
41
|
+
export async function runVaultGet(id, decrypt, apiKey, baseUrl) {
|
|
42
42
|
const client = createWorkOSClient(apiKey, baseUrl);
|
|
43
43
|
try {
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
if (decrypt) {
|
|
45
|
+
const result = await client.sdk.vault.readObject({ id });
|
|
46
|
+
outputJson(result);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const result = await client.sdk.vault.describeObject({ id });
|
|
50
|
+
outputJson(result);
|
|
51
|
+
}
|
|
46
52
|
}
|
|
47
53
|
catch (error) {
|
|
48
54
|
handleApiError(error);
|
|
49
55
|
}
|
|
50
56
|
}
|
|
51
|
-
export async function runVaultGetByName(name, apiKey, baseUrl) {
|
|
57
|
+
export async function runVaultGetByName(name, decrypt, apiKey, baseUrl) {
|
|
52
58
|
const client = createWorkOSClient(apiKey, baseUrl);
|
|
53
59
|
try {
|
|
54
60
|
const result = await client.sdk.vault.readObjectByName(name);
|
|
55
|
-
|
|
61
|
+
if (decrypt) {
|
|
62
|
+
outputJson(result);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const { value: _stripped, ...metadata } = result;
|
|
66
|
+
outputJson(metadata);
|
|
67
|
+
}
|
|
56
68
|
}
|
|
57
69
|
catch (error) {
|
|
58
70
|
handleApiError(error);
|
|
59
71
|
}
|
|
60
72
|
}
|
|
61
73
|
export async function runVaultCreate(options, apiKey, baseUrl) {
|
|
74
|
+
if (!options.org) {
|
|
75
|
+
exitWithError({
|
|
76
|
+
code: 'missing_org',
|
|
77
|
+
message: 'The --org flag is required. Vault objects must be scoped to an organization.',
|
|
78
|
+
});
|
|
79
|
+
}
|
|
62
80
|
const client = createWorkOSClient(apiKey, baseUrl);
|
|
63
81
|
try {
|
|
64
|
-
const context = options.org ? { organizationId: options.org } : {};
|
|
65
82
|
const result = await client.sdk.vault.createObject({
|
|
66
83
|
name: options.name,
|
|
67
84
|
value: options.value,
|
|
68
|
-
context,
|
|
85
|
+
context: { organizationId: options.org },
|
|
69
86
|
});
|
|
70
87
|
outputSuccess('Created vault object', result);
|
|
71
88
|
}
|
|
@@ -117,4 +134,20 @@ export async function runVaultListVersions(id, apiKey, baseUrl) {
|
|
|
117
134
|
handleApiError(error);
|
|
118
135
|
}
|
|
119
136
|
}
|
|
137
|
+
export async function readValueFromStdin() {
|
|
138
|
+
const chunks = [];
|
|
139
|
+
for await (const chunk of process.stdin) {
|
|
140
|
+
chunks.push(chunk);
|
|
141
|
+
}
|
|
142
|
+
const value = Buffer.concat(chunks)
|
|
143
|
+
.toString('utf-8')
|
|
144
|
+
.replace(/\r?\n$/, '');
|
|
145
|
+
if (value.length === 0) {
|
|
146
|
+
exitWithError({
|
|
147
|
+
code: 'empty_stdin',
|
|
148
|
+
message: 'No value provided on stdin. Pipe a value or pass --value directly.',
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
120
153
|
//# sourceMappingURL=vault.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/commands/vault.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { createWorkOSClient } from '../lib/workos-client.js';\nimport { formatTable } from '../utils/table.js';\nimport { outputSuccess, outputJson, isJsonMode } from '../utils/output.js';\nimport { createApiErrorHandler } from '../lib/api-error-handler.js';\n\nconst handleApiError = createApiErrorHandler('Vault');\n\nexport interface VaultListOptions {\n limit?: number;\n before?: string;\n after?: string;\n order?: string;\n}\n\nexport async function runVaultList(options: VaultListOptions, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.listObjects({\n limit: options.limit,\n before: options.before,\n after: options.after,\n order: options.order as 'asc' | 'desc' | undefined,\n });\n\n if (isJsonMode()) {\n outputJson({ data: result.data, listMetadata: result.listMetadata });\n return;\n }\n\n if (result.data.length === 0) {\n console.log('No vault objects found.');\n return;\n }\n\n const rows = result.data.map((obj) => [obj.id, obj.name, obj.updatedAt ? String(obj.updatedAt) : chalk.dim('-')]);\n\n console.log(formatTable([{ header: 'ID' }, { header: 'Name' }, { header: 'Updated At' }], rows));\n\n const { before, after } = result.listMetadata;\n if (before && after) {\n console.log(chalk.dim(`Before: ${before} After: ${after}`));\n } else if (before) {\n console.log(chalk.dim(`Before: ${before}`));\n } else if (after) {\n console.log(chalk.dim(`After: ${after}`));\n }\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultGet(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.readObject({ id });\n outputJson(result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultGetByName(name: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.readObjectByName(name);\n outputJson(result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport interface VaultCreateOptions {\n name: string;\n value: string;\n org?: string;\n}\n\nexport async function runVaultCreate(options: VaultCreateOptions, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const context = options.org ? { organizationId: options.org } : {};\n const result = await client.sdk.vault.createObject({\n name: options.name,\n value: options.value,\n context,\n });\n outputSuccess('Created vault object', result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport interface VaultUpdateOptions {\n id: string;\n value: string;\n versionCheck?: string;\n}\n\nexport async function runVaultUpdate(options: VaultUpdateOptions, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.updateObject({\n id: options.id,\n value: options.value,\n ...(options.versionCheck && { versionCheck: options.versionCheck }),\n });\n outputSuccess('Updated vault object', result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultDelete(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n await client.sdk.vault.deleteObject({ id });\n outputSuccess('Deleted vault object', { id });\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultDescribe(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.describeObject({ id });\n outputJson(result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultListVersions(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.listObjectVersions({ id });\n outputJson(result);\n } catch (error) {\n handleApiError(error);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/commands/vault.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { createWorkOSClient } from '../lib/workos-client.js';\nimport { formatTable } from '../utils/table.js';\nimport { outputSuccess, outputJson, isJsonMode, exitWithError } from '../utils/output.js';\nimport { createApiErrorHandler } from '../lib/api-error-handler.js';\n\nconst handleApiError = createApiErrorHandler('Vault');\n\nexport interface VaultListOptions {\n limit?: number;\n before?: string;\n after?: string;\n order?: string;\n}\n\nexport async function runVaultList(options: VaultListOptions, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.listObjects({\n limit: options.limit,\n before: options.before,\n after: options.after,\n order: options.order as 'asc' | 'desc' | undefined,\n });\n\n if (isJsonMode()) {\n outputJson({ data: result.data, listMetadata: result.listMetadata });\n return;\n }\n\n if (result.data.length === 0) {\n console.log('No vault objects found.');\n return;\n }\n\n const rows = result.data.map((obj) => [obj.id, obj.name, obj.updatedAt ? String(obj.updatedAt) : chalk.dim('-')]);\n\n console.log(formatTable([{ header: 'ID' }, { header: 'Name' }, { header: 'Updated At' }], rows));\n\n const { before, after } = result.listMetadata;\n if (before && after) {\n console.log(chalk.dim(`Before: ${before} After: ${after}`));\n } else if (before) {\n console.log(chalk.dim(`Before: ${before}`));\n } else if (after) {\n console.log(chalk.dim(`After: ${after}`));\n }\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultGet(id: string, decrypt: boolean, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n if (decrypt) {\n const result = await client.sdk.vault.readObject({ id });\n outputJson(result);\n } else {\n const result = await client.sdk.vault.describeObject({ id });\n outputJson(result);\n }\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultGetByName(\n name: string,\n decrypt: boolean,\n apiKey: string,\n baseUrl?: string,\n): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.readObjectByName(name);\n if (decrypt) {\n outputJson(result);\n } else {\n const { value: _stripped, ...metadata } = result;\n outputJson(metadata);\n }\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport interface VaultCreateOptions {\n name: string;\n value: string;\n org?: string;\n}\n\nexport async function runVaultCreate(options: VaultCreateOptions, apiKey: string, baseUrl?: string): Promise<void> {\n if (!options.org) {\n exitWithError({\n code: 'missing_org',\n message: 'The --org flag is required. Vault objects must be scoped to an organization.',\n });\n }\n\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.createObject({\n name: options.name,\n value: options.value,\n context: { organizationId: options.org },\n });\n outputSuccess('Created vault object', result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport interface VaultUpdateOptions {\n id: string;\n value: string;\n versionCheck?: string;\n}\n\nexport async function runVaultUpdate(options: VaultUpdateOptions, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.updateObject({\n id: options.id,\n value: options.value,\n ...(options.versionCheck && { versionCheck: options.versionCheck }),\n });\n outputSuccess('Updated vault object', result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultDelete(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n await client.sdk.vault.deleteObject({ id });\n outputSuccess('Deleted vault object', { id });\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultDescribe(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.describeObject({ id });\n outputJson(result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function runVaultListVersions(id: string, apiKey: string, baseUrl?: string): Promise<void> {\n const client = createWorkOSClient(apiKey, baseUrl);\n\n try {\n const result = await client.sdk.vault.listObjectVersions({ id });\n outputJson(result);\n } catch (error) {\n handleApiError(error);\n }\n}\n\nexport async function readValueFromStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n const value = Buffer.concat(chunks)\n .toString('utf-8')\n .replace(/\\r?\\n$/, '');\n if (value.length === 0) {\n exitWithError({\n code: 'empty_stdin',\n message: 'No value provided on stdin. Pipe a value or pass --value directly.',\n });\n }\n return value;\n}\n"]}
|
|
@@ -1,6 +1,18 @@
|
|
|
1
|
+
export declare function isSdkException(error: unknown): error is {
|
|
2
|
+
status: number;
|
|
3
|
+
message: string;
|
|
4
|
+
requestID: string;
|
|
5
|
+
code?: string;
|
|
6
|
+
errors?: Array<{
|
|
7
|
+
message: string;
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
1
10
|
/**
|
|
2
11
|
* Create a resource-specific API error handler.
|
|
3
|
-
* Handles
|
|
4
|
-
*
|
|
12
|
+
* Handles raw fetch errors (WorkOSApiError), SDK exceptions, and the SDK's
|
|
13
|
+
* "errors is not iterable" TypeError from malformed 422 responses.
|
|
14
|
+
*
|
|
15
|
+
* `context` optionally names the specific resource instance (e.g. a vault
|
|
16
|
+
* object name) so 404 messages can be more specific.
|
|
5
17
|
*/
|
|
6
|
-
export declare function createApiErrorHandler(resourceName: string): (error: unknown) => never;
|
|
18
|
+
export declare function createApiErrorHandler(resourceName: string): (error: unknown, context?: string) => never;
|