@keystrokehq/cli 0.0.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.
Files changed (122) hide show
  1. package/AGENTS-blurb.md +123 -0
  2. package/LICENSE +42 -0
  3. package/README.md +177 -0
  4. package/THIRD_PARTY_NOTICES.md +16 -0
  5. package/bin/keystroke.mjs +107 -0
  6. package/dist/_manifest-JSRE3H8k.mjs +385 -0
  7. package/dist/agent-bundle-package-DWV6B_5q-BtV7Xycc.mjs +2344 -0
  8. package/dist/agent-manifest-CDnbkR2f.mjs +245 -0
  9. package/dist/agents-CZJGxVqV.mjs +228 -0
  10. package/dist/api-keys-D2lgguuY.mjs +40 -0
  11. package/dist/auth-DN2VusyU.mjs +59 -0
  12. package/dist/auth.handler-CT1BQUvu.mjs +340 -0
  13. package/dist/browser-qwFrUH82.mjs +24 -0
  14. package/dist/build-agents-BmM_AsSd-BGi9wtzt.mjs +514 -0
  15. package/dist/build-metadata-BWS7uhd_-DR8gJjTX.mjs +1422 -0
  16. package/dist/build-progress-DgYKb4hB.mjs +183 -0
  17. package/dist/build-tasks-CdihpudT-D5r5HUHe.mjs +91 -0
  18. package/dist/build-workflows-CfxBnIWh-CdYPv8w2.mjs +370 -0
  19. package/dist/build.handler-4799CjWH.mjs +36 -0
  20. package/dist/chunk-CH6r78ws.mjs +37 -0
  21. package/dist/clear-cache.handler-B9tqSoSM.mjs +11 -0
  22. package/dist/clear.handler-BTIXXPTJ.mjs +42 -0
  23. package/dist/clear.handler-BydlX-zE.mjs +11 -0
  24. package/dist/commander-DfTVqQ-3.mjs +133 -0
  25. package/dist/concurrency-gXn9Rw8x-DNl2YtrS.mjs +20 -0
  26. package/dist/connect-BUXkeH0F.mjs +43 -0
  27. package/dist/connect.handler-CYel9cy6.mjs +430 -0
  28. package/dist/constants-CPpPdSNg.mjs +8 -0
  29. package/dist/context-T7HZuB97.mjs +138 -0
  30. package/dist/credential-env-map-CI8yWHVy.mjs +28 -0
  31. package/dist/credential-schema-mismatch-BKo5PjcQ.mjs +76 -0
  32. package/dist/credentials-CvmjU0lK.mjs +171 -0
  33. package/dist/credentials-OfVHOtG3.mjs +151216 -0
  34. package/dist/current-deployment-workflow-poHt27i3.mjs +94 -0
  35. package/dist/current.handler-B8zKzfPp.mjs +21 -0
  36. package/dist/delete.handler-bAu1iXVQ.mjs +17 -0
  37. package/dist/deploy-7Jjls436.mjs +26 -0
  38. package/dist/deploy-BOPIpRWm.mjs +74 -0
  39. package/dist/deploy-progress-BmGUNFKg.mjs +70 -0
  40. package/dist/deploy.handler-BAzgiNhd.mjs +370 -0
  41. package/dist/detect-env-access-CwkOYeYM-D_BCZqV6.mjs +209 -0
  42. package/dist/diff-utils-NEfcjqxt.mjs +185 -0
  43. package/dist/diff.handler-Du7SY8K4.mjs +47 -0
  44. package/dist/dist-BkJUoBiG.mjs +1116 -0
  45. package/dist/dist-CUK7yBM0.mjs +308 -0
  46. package/dist/env-91KwMKov.mjs +140 -0
  47. package/dist/env.handler-BAzBuMzQ.mjs +277 -0
  48. package/dist/error-boundary-VL-JLfIa.mjs +34 -0
  49. package/dist/file-metadata-D1vm-XY2.mjs +191 -0
  50. package/dist/get-intrinsic-zLxwtrLK.mjs +658 -0
  51. package/dist/import-module-CV84H5fZ-B_CBCmb4.mjs +1747 -0
  52. package/dist/init-DpMCotSK.mjs +45 -0
  53. package/dist/init.handler-CPRnif52.mjs +585 -0
  54. package/dist/inspect.handler-DT_cD036.mjs +146 -0
  55. package/dist/integration-catalog-Bt-L3GjF.mjs +104 -0
  56. package/dist/integrations-DlatPK4W.mjs +79 -0
  57. package/dist/keystroke.d.mts +3 -0
  58. package/dist/keystroke.mjs +707 -0
  59. package/dist/layout-CbMtQ2tm.mjs +67 -0
  60. package/dist/list-enrichment-y-cwizLr.mjs +189 -0
  61. package/dist/list.handler-BTWvCyjA.mjs +52 -0
  62. package/dist/list.handler-CWF_Dj15.mjs +24 -0
  63. package/dist/list.handler-CZ6G2x_G.mjs +75 -0
  64. package/dist/list.handler-DWaQkJaR.mjs +51 -0
  65. package/dist/list.handler-DqbFcBW7.mjs +180 -0
  66. package/dist/list.handler-lq3ZGAn4.mjs +104 -0
  67. package/dist/logs-BEg9L5l8.mjs +28 -0
  68. package/dist/logs.handler-6hoMBzqw.mjs +35 -0
  69. package/dist/logs.handler-BD_dXiL1.mjs +231 -0
  70. package/dist/metadata-layout-GUYIUo0i-_aG2zjue.mjs +5877 -0
  71. package/dist/normalize-path-CojS-CgQ-DLCOvnD1.mjs +20 -0
  72. package/dist/options-CeaTcFxP.mjs +43 -0
  73. package/dist/org-xLzBtt2_.mjs +41 -0
  74. package/dist/output-DM4b7KgY.mjs +72 -0
  75. package/dist/oxc-B3KI3rf_-n9d1hKNq.mjs +119 -0
  76. package/dist/paused.handler-BMFm9Cff.mjs +94 -0
  77. package/dist/project-config-D1qsQlO7.mjs +107 -0
  78. package/dist/projects-CHkRE9rS.mjs +1574 -0
  79. package/dist/projects-Cjb7sovS.mjs +30 -0
  80. package/dist/read-credential-keys-77a91T8M-KA0Iw0Z1.mjs +9 -0
  81. package/dist/register.handler-BPCdor1_.mjs +86 -0
  82. package/dist/requirements.handler-DPXdSks3.mjs +201 -0
  83. package/dist/resolve-project-DDJ29sCF.mjs +35 -0
  84. package/dist/rolldown-runtime-twds-ZHy-BWWzu8VG.mjs +15 -0
  85. package/dist/run-polling-CAgFRdK3.mjs +20 -0
  86. package/dist/runs-D9hNLb9A.mjs +259 -0
  87. package/dist/schedule-BXx3uXwr.mjs +1142 -0
  88. package/dist/schema-17qMfNyI.mjs +18 -0
  89. package/dist/schema-display-CgmeKigW.mjs +130 -0
  90. package/dist/schemas-CDib1RhE.mjs +125 -0
  91. package/dist/skills-sync.handler-DIy8GR16.mjs +34 -0
  92. package/dist/skills.command-CrjI2dN9.mjs +35 -0
  93. package/dist/skills.handler-Bz8bJKql.mjs +9 -0
  94. package/dist/source-analysis-Cj-ADyu--BJQcFPCG.mjs +144 -0
  95. package/dist/spinner-progress-DMVwgqO9.mjs +173 -0
  96. package/dist/src-C0X6u_Mw.mjs +1340 -0
  97. package/dist/src-eHwu-Gfw.mjs +369 -0
  98. package/dist/status.handler-BO4nwvWn.mjs +101 -0
  99. package/dist/switch.handler-D_9213Vf.mjs +51 -0
  100. package/dist/sync-BL_Mo5st.mjs +39 -0
  101. package/dist/sync-keystroke-agent-skills-Kx_H7UTd.mjs +70 -0
  102. package/dist/sync.handler-BUFPdzWz.mjs +82 -0
  103. package/dist/task-B2sZMaZu.mjs +8 -0
  104. package/dist/task-target-build-CBeCKbu2.mjs +432 -0
  105. package/dist/task-target-deploy-C5X-USeR.mjs +4 -0
  106. package/dist/task-target-deploy-CA6elFpF-BEr4gkol.mjs +271 -0
  107. package/dist/task-target-deploy-runner.d.mts +3 -0
  108. package/dist/task-target-deploy-runner.mjs +202 -0
  109. package/dist/test-BHTgR3UA.mjs +698 -0
  110. package/dist/test.handler-BcPQ8b74.mjs +13 -0
  111. package/dist/trigger-artifacts-DQPbQNqC-B4yeeFBY.mjs +239 -0
  112. package/dist/trigger-manifest-CY7brZeg.mjs +30 -0
  113. package/dist/try-deploy.handler-DqybNhXx.mjs +490 -0
  114. package/dist/upload-CkU--iDC.mjs +207 -0
  115. package/dist/upload.handler-DCtiznQp.mjs +441 -0
  116. package/dist/utils-CywxCDM7.mjs +14 -0
  117. package/dist/validate.handler-DOcTaJL0.mjs +280 -0
  118. package/dist/workflow-build-DBQaBfnn.mjs +1819 -0
  119. package/dist/workflow-bundler-BPiqVscj-X1PFFAuP.mjs +167 -0
  120. package/dist/workflows-g9z87AJJ.mjs +799 -0
  121. package/dist/writer-BG8poUm3-BbXlU2kI.mjs +426 -0
  122. package/package.json +87 -0
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { D as throwReportedCliExit, h as toErrorMessage, o as ANSI, s as style, t as ui } from "./keystroke.mjs";
4
+ import { d as trackProject } from "./dist-CUK7yBM0.mjs";
5
+ import { i as writeJson } from "./output-DM4b7KgY.mjs";
6
+ import { i as resolveTypeHint } from "./schema-display-CgmeKigW.mjs";
7
+ import { i as requireClient, t as assertProjectConfigMatchesAuthenticatedOrg } from "./context-T7HZuB97.mjs";
8
+ import { n as resolveLocalWorkflowManifest, r as resolveProjectContext, t as lookupCurrentDeploymentWorkflow } from "./current-deployment-workflow-poHt27i3.mjs";
9
+ import dayjs from "dayjs";
10
+ //#region src/commands/workflows/inspect/inspect-display.ts
11
+ function formatBuildTimestamp(iso) {
12
+ if (!iso) return "unknown";
13
+ const d = dayjs(iso);
14
+ return d.isValid() ? d.format("MMM D, YYYY [at] h:mm A") : iso;
15
+ }
16
+ function renderManifestInspect(manifest, source, version) {
17
+ if (source === "deployed" && version !== void 0) {
18
+ ui.text(style(` Deployed v${version}`, ANSI.dim));
19
+ ui.br();
20
+ }
21
+ ui.text(style(` ${manifest.name}`, `${ANSI.bold}${ANSI.cyan}`));
22
+ if (manifest.description) ui.text(style(` ${manifest.description}`, ANSI.dim));
23
+ ui.br();
24
+ ui.text(style(" Input", ANSI.bold));
25
+ const inputFields = formatSchemaFields(manifest.workflowSchemas?.input);
26
+ if (inputFields) ui.text(inputFields);
27
+ else ui.text(style(" (none)", ANSI.dim));
28
+ ui.br();
29
+ ui.text(style(" Output", ANSI.bold));
30
+ const outputFields = formatSchemaFields(manifest.workflowSchemas?.output);
31
+ if (outputFields) ui.text(outputFields);
32
+ else ui.text(style(" (none)", ANSI.dim));
33
+ ui.br();
34
+ ui.text(style(" Steps", ANSI.bold));
35
+ const stepsText = formatSteps(manifest.steps ?? {});
36
+ if (stepsText) ui.text(stepsText);
37
+ else ui.text(style(" (none)", ANSI.dim));
38
+ ui.br();
39
+ const credentialsText = formatCredentials(manifest.credentials);
40
+ if (credentialsText) {
41
+ ui.text(style(" Integrations Required", ANSI.bold));
42
+ ui.text(credentialsText);
43
+ ui.br();
44
+ }
45
+ if (source === "local" && manifest.buildInfo) {
46
+ const builtAt = formatBuildTimestamp(manifest.buildInfo.timestamp);
47
+ const versionStr = `local-build v${manifest.buildInfo.builderVersion ?? "unknown"}`;
48
+ ui.text(style(` Built ${builtAt} · ${versionStr}`, ANSI.dim));
49
+ }
50
+ }
51
+ function formatSchemaFields(schema) {
52
+ if (!schema || typeof schema !== "object") return "";
53
+ const props = schema.properties;
54
+ if (!props || Object.keys(props).length === 0) return "";
55
+ const required = schema.required ?? [];
56
+ const requiredSet = new Set(required);
57
+ const lines = [];
58
+ for (const [name, fieldSchema] of Object.entries(props)) {
59
+ const typeHint = resolveTypeHint(fieldSchema);
60
+ const req = requiredSet.has(name) ? style(" required", ANSI.dim) : "";
61
+ const desc = typeof fieldSchema.description === "string" ? `\n ${style(fieldSchema.description, ANSI.dim)}` : "";
62
+ lines.push(` ${name} ${style(typeHint, ANSI.dim)}${req}${desc}`);
63
+ }
64
+ return lines.join("\n");
65
+ }
66
+ function formatCredentials(credentials) {
67
+ if (!credentials) return "";
68
+ const lines = [];
69
+ if (credentials.required?.length) for (const id of credentials.required) lines.push(` ${id}`);
70
+ if (credentials.byStep && Object.keys(credentials.byStep).length > 0) {
71
+ lines.push("");
72
+ for (const [stepNodeId, stepCreds] of Object.entries(credentials.byStep)) {
73
+ const entries = Array.isArray(stepCreds) ? stepCreds : [];
74
+ for (const e of entries) {
75
+ const scope = e.scope ? ` (${e.scope})` : "";
76
+ lines.push(` ${stepNodeId} → ${e.credentialSetId}${scope}`);
77
+ }
78
+ }
79
+ }
80
+ return lines.join("\n");
81
+ }
82
+ function formatSteps(steps) {
83
+ const workflowSteps = Object.values(steps).filter((s) => s.callKind === "workflow-step");
84
+ if (workflowSteps.length === 0) return "";
85
+ const lines = [];
86
+ workflowSteps.forEach((step, i) => {
87
+ lines.push(` ${i + 1}. ${step.label ?? step.stepName}`);
88
+ lines.push(` ${style(step.stepName, ANSI.dim)} (${step.callKind})`);
89
+ if (step.credentialSets && step.credentialSets.length > 0) for (const credentialSet of step.credentialSets) {
90
+ const scope = credentialSet.scope ? ` (${credentialSet.scope})` : "";
91
+ lines.push(` ${style(`→ ${credentialSet.resolvedId}${scope}`, ANSI.dim)}`);
92
+ }
93
+ });
94
+ const otherCount = Object.values(steps).length - workflowSteps.length;
95
+ if (otherCount > 0) lines.push(` ${style(`+ ${otherCount} other node type(s)`, ANSI.dim)}`);
96
+ return lines.join("\n");
97
+ }
98
+ //#endregion
99
+ //#region src/commands/workflows/inspect/inspect.handler.ts
100
+ async function handleWorkflowsInspect(options, ctx) {
101
+ if (options.deployed) return handleInspectDeployed(options, ctx);
102
+ return handleInspectLocal(options, ctx);
103
+ }
104
+ async function handleInspectLocal(options, ctx) {
105
+ const resolved = await resolveLocalWorkflowManifest(options.workflow, options.path, { jsonMode: ctx.jsonMode });
106
+ const workflowsDir = resolved.workflowsDir;
107
+ trackProject(workflowsDir);
108
+ if (ctx.jsonMode) {
109
+ writeJson(resolved.manifest);
110
+ return;
111
+ }
112
+ renderManifestInspect(resolved.manifest, "local");
113
+ }
114
+ async function handleInspectDeployed(options, ctx) {
115
+ const resolved = await resolveProjectContext(options.workflow, options.path, { jsonMode: ctx.jsonMode });
116
+ trackProject(resolved.workflowsDir);
117
+ const client = requireClient(ctx);
118
+ await assertProjectConfigMatchesAuthenticatedOrg(client, { organizationId: resolved.organizationId });
119
+ let deploymentLookup;
120
+ try {
121
+ deploymentLookup = await lookupCurrentDeploymentWorkflow(client, {
122
+ projectId: resolved.projectId,
123
+ authoredWorkflowId: resolved.authoredWorkflowId
124
+ });
125
+ } catch (error) {
126
+ ui.error(`Failed to inspect current deployment workflow: ${toErrorMessage(error)}`);
127
+ throwReportedCliExit(`Failed to inspect current deployment workflow: ${toErrorMessage(error)}`, { cause: error });
128
+ }
129
+ if (deploymentLookup.status === "missingCurrentDeployment") {
130
+ ui.error("This project has no current deployment.");
131
+ ui.hint("Run `keystroke deploy` to create the current deployment, then try again.");
132
+ throwReportedCliExit("This project has no current deployment.");
133
+ }
134
+ if (deploymentLookup.status === "missingWorkflow") {
135
+ ui.error(`Workflow "${options.workflow}" is not part of the current deployment.`);
136
+ ui.hint("Run `keystroke deploy` to include it in the current deployment, then try again.");
137
+ throwReportedCliExit(`Workflow "${options.workflow}" is not part of the current deployment.`);
138
+ }
139
+ if (ctx.jsonMode) {
140
+ writeJson(deploymentLookup.workflow.manifest);
141
+ return;
142
+ }
143
+ renderManifestInspect(deploymentLookup.workflow.manifest, "deployed");
144
+ }
145
+ //#endregion
146
+ export { handleWorkflowsInspect };
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { C as CliExitError, D as throwReportedCliExit, h as toErrorMessage, m as isNetworkError, p as isAuthError, t as ui, u as REAUTH_HINT } from "./keystroke.mjs";
4
+ import { a as writeJsonError } from "./output-DM4b7KgY.mjs";
5
+ import { i as requireClient } from "./context-T7HZuB97.mjs";
6
+ //#region src/lib/integration-catalog.ts
7
+ const catalogCache = /* @__PURE__ */ new WeakMap();
8
+ function buildView(entries) {
9
+ const byPublicId = /* @__PURE__ */ new Map();
10
+ const byResolvedCredentialSetId = /* @__PURE__ */ new Map();
11
+ const oauthPublicIds = [];
12
+ for (const entry of entries) {
13
+ for (const alias of entry.aliases) byPublicId.set(alias.toLowerCase(), entry);
14
+ byPublicId.set(entry.publicId.toLowerCase(), entry);
15
+ byResolvedCredentialSetId.set(entry.credentialSet.resolvedCredentialSetId, {
16
+ label: entry.name,
17
+ integrationPublicId: entry.publicId,
18
+ role: "connection",
19
+ connectionKind: entry.connectionKind
20
+ });
21
+ for (const internal of entry.internalCredentialSets) byResolvedCredentialSetId.set(internal.resolvedCredentialSetId, {
22
+ label: internal.displayName,
23
+ integrationPublicId: entry.publicId,
24
+ role: internal.role
25
+ });
26
+ if (entry.connectionKind === "oauth") oauthPublicIds.push(entry.publicId);
27
+ }
28
+ function lookupByPublicId(id) {
29
+ if (!id) return void 0;
30
+ return byPublicId.get(id.trim().toLowerCase());
31
+ }
32
+ return {
33
+ integrations: entries,
34
+ byPublicId,
35
+ byResolvedCredentialSetId,
36
+ oauthPublicIds,
37
+ lookupByPublicId
38
+ };
39
+ }
40
+ /**
41
+ * Maps an SDK error from the catalog fetch into a reported `CliExitError` so
42
+ * the caller can simply `throw` it through the existing CLI error-handling
43
+ * machinery. Preserves the familiar error messages for auth and network
44
+ * failure paths and preserves the underlying `cause` on the thrown error
45
+ * chain regardless of `jsonMode`.
46
+ */
47
+ function reportCatalogFetchFailure(ctx, error) {
48
+ if (error instanceof CliExitError) throw error;
49
+ if (isAuthError(error)) {
50
+ const message = `Not authenticated. ${REAUTH_HINT}`;
51
+ if (ctx.jsonMode) writeJsonError(message, {
52
+ code: "AUTH_ERROR",
53
+ hint: REAUTH_HINT,
54
+ cause: error
55
+ });
56
+ ui.error(message);
57
+ throwReportedCliExit(message, { cause: error });
58
+ }
59
+ if (isNetworkError(error)) {
60
+ const url = ctx.baseUrl ?? "the Keystroke server";
61
+ const message = `Could not reach ${url} to load the integration catalog.`;
62
+ const hint = `Check that your local services are running and that the CLI is pointed at ${url}.`;
63
+ if (ctx.jsonMode) writeJsonError(message, {
64
+ code: "NETWORK_ERROR",
65
+ hint,
66
+ cause: error
67
+ });
68
+ ui.error(message);
69
+ ui.hint(hint);
70
+ throwReportedCliExit(message, { cause: error });
71
+ }
72
+ const message = `Failed to load the integration catalog: ${toErrorMessage(error)}`;
73
+ if (ctx.jsonMode) writeJsonError(message, {
74
+ code: "CATALOG_ERROR",
75
+ cause: error
76
+ });
77
+ ui.error(message);
78
+ throwReportedCliExit(message, { cause: error });
79
+ }
80
+ /**
81
+ * Returns the integration catalog view for the current invocation.
82
+ *
83
+ * Memoized per `CliContext`: repeated calls in the same invocation share a
84
+ * single in-flight HTTP request and then a single resolved view. Cross-
85
+ * invocation caching is deliberately out of scope — a new process gets a
86
+ * fresh catalog so CLI behavior cannot lag a server-side integration change.
87
+ */
88
+ function getIntegrationCatalog(ctx) {
89
+ const cached = catalogCache.get(ctx);
90
+ if (cached) return cached;
91
+ const promise = (async () => {
92
+ const client = requireClient(ctx);
93
+ try {
94
+ return buildView((await client.integrations.list({ includeInternal: true })).integrations);
95
+ } catch (error) {
96
+ catalogCache.delete(ctx);
97
+ reportCatalogFetchFailure(ctx, error);
98
+ }
99
+ })();
100
+ catalogCache.set(ctx, promise);
101
+ return promise;
102
+ }
103
+ //#endregion
104
+ export { getIntegrationCatalog as t };
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { n as JsonOptionSchema, t as JSON_OPTION_CONFIG } from "./output-DM4b7KgY.mjs";
4
+ import { t as createTypedCommand } from "./commander-DfTVqQ-3.mjs";
5
+ import { z } from "zod";
6
+ //#region src/commands/integrations/integrations.command.ts
7
+ const IntegrationsListOptionsSchema = JsonOptionSchema.extend({
8
+ kind: z.enum(["oauth", "manual"]).optional(),
9
+ search: z.string().optional(),
10
+ connected: z.boolean().optional()
11
+ });
12
+ const INTEGRATIONS_LIST_OPTIONS_CONFIG = {
13
+ ...JSON_OPTION_CONFIG,
14
+ kind: {
15
+ flag: "--kind <kind>",
16
+ description: "Filter by connection kind: oauth or manual"
17
+ },
18
+ search: {
19
+ flag: "--search <query>",
20
+ description: "Case-insensitive substring match against publicId, name, and aliases"
21
+ },
22
+ connected: {
23
+ flag: "--connected",
24
+ description: "Only show integrations with at least one configured connection in the current org"
25
+ }
26
+ };
27
+ const IntegrationsRegisterOptionsSchema = JsonOptionSchema.extend({
28
+ integrationId: z.string().optional(),
29
+ clientApp: z.string().optional().describe("Internal credential set id holding clientId + clientSecret"),
30
+ displayName: z.string().optional().describe("Human-readable display name for the workspace integration")
31
+ });
32
+ const INTEGRATIONS_REGISTER_OPTIONS_CONFIG = {
33
+ ...JSON_OPTION_CONFIG,
34
+ clientApp: {
35
+ flag: "--client-app <credentialSetId>",
36
+ description: "Internal credential set id holding clientId + clientSecret (required)"
37
+ },
38
+ displayName: {
39
+ flag: "--display-name <name>",
40
+ description: "Human-readable display name for the workspace integration"
41
+ }
42
+ };
43
+ function createIntegrationsCommand() {
44
+ return createTypedCommand({
45
+ name: "integrations",
46
+ description: "List Keystroke integrations available to your organization",
47
+ schema: IntegrationsListOptionsSchema,
48
+ optionsConfig: INTEGRATIONS_LIST_OPTIONS_CONFIG,
49
+ loadHandler: async () => (await import("./list.handler-lq3ZGAn4.mjs")).handleIntegrationsList,
50
+ subcommands: [createTypedCommand({
51
+ name: "list",
52
+ description: "List Keystroke integrations available to your organization",
53
+ schema: IntegrationsListOptionsSchema,
54
+ optionsConfig: INTEGRATIONS_LIST_OPTIONS_CONFIG,
55
+ loadHandler: async () => (await import("./list.handler-lq3ZGAn4.mjs")).handleIntegrationsList
56
+ }), createTypedCommand({
57
+ name: "register",
58
+ description: "Register a workspace provider app for future workspace-authored OAuth support",
59
+ schema: IntegrationsRegisterOptionsSchema,
60
+ optionsConfig: INTEGRATIONS_REGISTER_OPTIONS_CONFIG,
61
+ handler: async (opts, ctx) => {
62
+ const { handleIntegrationsRegister } = await import("./register.handler-BPCdor1_.mjs");
63
+ await handleIntegrationsRegister({
64
+ integrationId: opts.integrationId,
65
+ clientAppCredentialSetId: opts.clientApp,
66
+ displayName: opts.displayName,
67
+ json: opts.json
68
+ }, ctx);
69
+ },
70
+ argument: {
71
+ name: "integrationId",
72
+ description: "Workspace integration id to register (e.g., acmeCrm)",
73
+ key: "integrationId"
74
+ }
75
+ })]
76
+ });
77
+ }
78
+ //#endregion
79
+ export { createIntegrationsCommand };
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ export { };