@keystrokehq/cli 0.0.31 → 0.0.37

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 (148) hide show
  1. package/README.md +25 -4
  2. package/dist/{accept.handler-DNfIXPSP.mjs → accept.handler-DCsud1s5.mjs} +4 -4
  3. package/dist/{admin-CJp8XksD.mjs → admin-BaOtHeZ2.mjs} +10 -10
  4. package/dist/{agent-manifest-De5TCxZq.mjs → agent-manifest-DfWD5tvv.mjs} +17 -27
  5. package/dist/{agents-G37PM35Z.mjs → agents-BVAVfMR_.mjs} +9 -9
  6. package/dist/{api-keys-4igNHJ_W.mjs → api-keys-BhEEsHUh.mjs} +6 -6
  7. package/dist/{api-BK3EhPvs.mjs → api-sWkB_Wta.mjs} +1 -1
  8. package/dist/{auth-CIOmmV4x.mjs → auth-BnsitjzT.mjs} +6 -6
  9. package/dist/{auth.handler-CznN_vfz.mjs → auth.handler-W_xk14TL.mjs} +3 -3
  10. package/dist/authored-workflow-ref-fkHEEVnd.mjs +113 -0
  11. package/dist/{build-agents-DseUtzd4-CSGpNXur.mjs → build-agents-CUzBnlAG-3ePFZiJ6.mjs} +12 -11
  12. package/dist/{build-progress-DLM1Bt4T.mjs → build-progress-CM-b6Bby.mjs} +2 -2
  13. package/dist/{build-tasks-C09SdfjC-BmAVLTtQ.mjs → build-tasks-5eOvI19S-tbN6CRx9.mjs} +4 -4
  14. package/dist/{build-workflows-BZ_m97Pr-BiyptCrn.mjs → build-workflows-C-gQM3l5-_zcBHE3M.mjs} +14 -9
  15. package/dist/{build.handler-zHimoO7c.mjs → build.handler-CpAsAsBc.mjs} +12 -9
  16. package/dist/{clear-cache.handler-BP0K1-uN.mjs → clear-cache.handler-gJpwslkK.mjs} +2 -2
  17. package/dist/{clear.handler-T27GpgSu.mjs → clear.handler-CDyG6-dk.mjs} +1 -1
  18. package/dist/{clear.handler-PsA5QKHx.mjs → clear.handler-_sR33Hp8.mjs} +2 -2
  19. package/dist/{commander-BlrSdFcu.mjs → commander-C6SSTQJ2.mjs} +22 -3
  20. package/dist/{connect-BbLJhlIA.mjs → connect-27EgnljZ.mjs} +3 -3
  21. package/dist/{connect.handler-BthE-7Wg.mjs → connect.handler-COM1LnNg.mjs} +5 -5
  22. package/dist/{context-sgKhRc5v.mjs → context-ebZssGCY.mjs} +4 -4
  23. package/dist/{create.handler-BovbO_g0.mjs → create.handler-CAWJAGzQ.mjs} +3 -3
  24. package/dist/{credential-env-map-CRs0llf0.mjs → credential-env-map-5a41jLwM.mjs} +1 -1
  25. package/dist/{credential-requirements-D0mavK8j-CFMf0Xwu.mjs → credential-requirements-B5Alhu1v-DanlSKnT.mjs} +3 -3
  26. package/dist/{credential-schema-mismatch-ClQgEVtO.mjs → credential-schema-mismatch-c17ktoNU.mjs} +1 -1
  27. package/dist/{credentials-CsncZ52a.mjs → credentials-C0ssbMlp.mjs} +10 -10
  28. package/dist/{credentials-DKrSaaLw.mjs → credentials-DtwLbee6.mjs} +1 -1
  29. package/dist/current-deployment-workflow-C6x65imE.mjs +20 -0
  30. package/dist/current.handler-DP1L_hm3.mjs +19 -0
  31. package/dist/{delete.handler-DkAK396w.mjs → delete.handler-C-5XFkgN.mjs} +2 -2
  32. package/dist/{deploy-DvPfR9fC.mjs → deploy-BcVQJza8.mjs} +2 -2
  33. package/dist/{deploy-progress-BsUH7fGE.mjs → deploy-progress-Bt86Yc1r.mjs} +2 -2
  34. package/dist/{deploy.handler-BW3f2N2G.mjs → deploy.handler-GPS9lxGk.mjs} +16 -16
  35. package/dist/{diff-utils-Bs--xmoV.mjs → diff-utils-YEUYtSRs.mjs} +1 -1
  36. package/dist/{diff.handler-BwhsoAg0.mjs → diff.handler-DkM5dhaN.mjs} +15 -9
  37. package/dist/{dist-Dw7gCE7y.mjs → dist-B5jy238v.mjs} +37 -11
  38. package/dist/{dist-CTEtWDW4.mjs → dist-BmbFJq8U.mjs} +8 -27
  39. package/dist/{env.handler-Dks6ZQh-.mjs → env.handler-V_isbSi2.mjs} +52 -29
  40. package/dist/{error-boundary-0veZ_RDS.mjs → error-boundary-BRxUsPi7.mjs} +3 -3
  41. package/dist/{iam-command-utils-CSZj4XlH.mjs → iam-command-utils-DNDN0wT6.mjs} +3 -13
  42. package/dist/{import-module-y0glInUe-DV_3dsU0.mjs → import-module-y0glInUe-EuAWaw9g.mjs} +506 -128
  43. package/dist/{init-DX08T87c.mjs → init-D1OmmclX.mjs} +8 -3
  44. package/dist/{init.handler-CzlmkNXi.mjs → init.handler-CUbYlUgP.mjs} +57 -14
  45. package/dist/{inspect.handler-v9snxDLi.mjs → inspect.handler-BE6coOuW.mjs} +24 -13
  46. package/dist/{integration-catalog-CiZ62hb_.mjs → integration-catalog-pSmWHFLQ.mjs} +3 -3
  47. package/dist/{integrations-MEExmqcg.mjs → integrations-DZD5t8n2.mjs} +7 -7
  48. package/dist/{invites-BuatfJmN.mjs → invites-BuR1H-tA.mjs} +5 -5
  49. package/dist/{invites.list.handler-CK6mL10z.mjs → invites.list.handler-Dj4a6XOg.mjs} +6 -5
  50. package/dist/{invites.resend.handler-CKZouK1Z.mjs → invites.resend.handler-DEGF4vlB.mjs} +6 -5
  51. package/dist/{invites.revoke.handler-H0VI-3sp.mjs → invites.revoke.handler-Dg4ZvlFS.mjs} +6 -5
  52. package/dist/keystroke.mjs +122 -77
  53. package/dist/{list-enrichment-DP1wEyBZ.mjs → list-enrichment-dqbkXJzy.mjs} +2 -2
  54. package/dist/{list.handler-LxZInip2.mjs → list.handler-2g1CZAvB.mjs} +4 -4
  55. package/dist/{list.handler-BKfGLkFu.mjs → list.handler-7MkJfkak.mjs} +5 -5
  56. package/dist/list.handler-BTYVIn6z.mjs +39 -0
  57. package/dist/{list.handler-BiY5NFWd.mjs → list.handler-Bchcr3-e.mjs} +3 -3
  58. package/dist/list.handler-Choc4SZz.mjs +64 -0
  59. package/dist/{list.handler-Jk_vK66s.mjs → list.handler-D47C1z3m.mjs} +4 -4
  60. package/dist/{list.handler-DVnFrlis.mjs → list.handler-DYE48apa.mjs} +7 -7
  61. package/dist/{list.handler-DIMWZx78.mjs → list.handler-KcCaG3PZ.mjs} +4 -4
  62. package/dist/list2.handler-BIaIyrQf.mjs +99 -0
  63. package/dist/{listen-C_7Rgwkb.mjs → listen-CVY-_F29.mjs} +3 -3
  64. package/dist/{listen.handler-dJgorIzr.mjs → listen.handler-D_nEvXRn.mjs} +4 -4
  65. package/dist/{logs-B9YMhUGt.mjs → logs-CZ2qnsSH.mjs} +3 -3
  66. package/dist/{logs.handler-BfjCsAyq.mjs → logs.handler-BRUzZC9Z.mjs} +26 -29
  67. package/dist/{logs.handler-DGGVPMOX.mjs → logs.handler-Wk6mYyAZ.mjs} +1 -1
  68. package/dist/{members.add.handler-DSRCRxsI.mjs → members.add.handler-BJ0wr6rP.mjs} +6 -5
  69. package/dist/{members.invite.handler-BNpHn1dY.mjs → members.invite.handler-DyveDMuq.mjs} +6 -5
  70. package/dist/{members.list.handler-Bn9LJEPG.mjs → members.list.handler-CyQxH_zS.mjs} +6 -5
  71. package/dist/{members.remove.handler-Dkr2t_tX.mjs → members.remove.handler-Dtv9PooY.mjs} +6 -5
  72. package/dist/{members.update.handler-DBtUYuAY.mjs → members.update.handler-CeK-tCjT.mjs} +6 -5
  73. package/dist/{operations-AWMLs6mE.mjs → operations-CxQlt0S0.mjs} +5 -5
  74. package/dist/{org-DOH7YHk2.mjs → org-B8MPHJJu.mjs} +35 -28
  75. package/dist/org-context-BI9OSpbb.mjs +112 -0
  76. package/dist/org-output-DffU7DKn.mjs +64 -0
  77. package/dist/{orgs.create.handler-BO70zIdp.mjs → orgs.create.handler-BKvSmkU3.mjs} +4 -4
  78. package/dist/{orgs.get.handler-BuGg5bc9.mjs → orgs.get.handler-BA-CexIY.mjs} +4 -4
  79. package/dist/{orgs.list.handler--5HutMkl.mjs → orgs.list.handler-eCEg5kC1.mjs} +4 -4
  80. package/dist/{output-BWcVRt-T.mjs → output-DnIFEmi5.mjs} +1 -1
  81. package/dist/package-manager-BP3-q8hh.mjs +162 -0
  82. package/dist/{paused.handler-DHvxz-cC.mjs → paused.handler-4wKMTKZ-.mjs} +20 -33
  83. package/dist/{projects-C5GZ5Jrf.mjs → projects-Wu_2fB_x.mjs} +11 -9
  84. package/dist/{register.handler-CePNU3sP.mjs → register.handler-BvAkXCwE.mjs} +2 -2
  85. package/dist/{render-credential-Bn15FEUC.mjs → render-credential-D-H1ECDt.mjs} +1 -1
  86. package/dist/{render-operation-Bc7Wu1sP.mjs → render-operation-VdEPhoII.mjs} +2 -2
  87. package/dist/{requirements.handler-B5rqCjMu.mjs → requirements.handler-Bab4kBtw.mjs} +7 -7
  88. package/dist/{resolve-cli-credentials-CAOSVMJP.mjs → resolve-cli-credentials-GVOOedoQ.mjs} +1 -1
  89. package/dist/{resolve-project-E9mrh_el.mjs → resolve-project-DLKlAy0z.mjs} +24 -8
  90. package/dist/{run-polling-DawiBus-.mjs → run-polling-C5fI7xTp.mjs} +97 -14
  91. package/dist/{run.handler-BG7xitEK.mjs → run.handler-BKD5Xu0A.mjs} +42 -30
  92. package/dist/{runs-swYYBT6C.mjs → runs-CT31dczt.mjs} +4 -4
  93. package/dist/{schema-display-FvI8QjOQ.mjs → schema-display-sZ6ConJd.mjs} +33 -26
  94. package/dist/schemas-ClAIoIrX.mjs +281 -0
  95. package/dist/{search-BEfy2fG9.mjs → search-BeQW_pf4.mjs} +3 -3
  96. package/dist/{search.handler-V7ObLGjN.mjs → search.handler-BJ-ZlDL4.mjs} +6 -6
  97. package/dist/{show.handler-C_VDYU91.mjs → show.handler-BrIHUH28.mjs} +4 -4
  98. package/dist/{show.handler-CsidInW8.mjs → show.handler-Cqe_hCqU.mjs} +5 -5
  99. package/dist/{show.handler-Wmv0tkxx.mjs → show.handler-DB8xl5FU.mjs} +6 -6
  100. package/dist/{skill-installer-D6j9IA3Z.mjs → skill-installer-DuMhavmM.mjs} +3 -1
  101. package/dist/{skills-sync.handler-BAATdT6N.mjs → skills-sync.handler-BGs-_YD9.mjs} +13 -7
  102. package/dist/{skills.command-0-E8mcYE.mjs → skills.command-DUWn6FbL.mjs} +5 -5
  103. package/dist/skills.handler-DqLXJepA.mjs +9 -0
  104. package/dist/{spinner-progress-lrKDs4YF.mjs → spinner-progress-BYxlr3lY.mjs} +1 -1
  105. package/dist/status.handler-DAId4bVU.mjs +72 -0
  106. package/dist/{switch.handler-BwYndsP-.mjs → switch.handler-Cd4Yg2n8.mjs} +17 -4
  107. package/dist/{sync-6fZkIUtn.mjs → sync-DgC4lcxh.mjs} +2 -2
  108. package/dist/{sync.handler-Ctr-cN9X.mjs → sync.handler-Cm_WtGmH.mjs} +8 -8
  109. package/dist/{task-BWuIKWh4.mjs → task-DTvLzUkA.mjs} +2 -88
  110. package/dist/{task-target-build-QllcCfoN.mjs → task-target-build-CtvRyVjH.mjs} +5 -5
  111. package/dist/task-target-deploy-runner.mjs +6 -6
  112. package/dist/{test-C8VIZe9V.mjs → test-4V7nh67i.mjs} +5 -5
  113. package/dist/{test.handler-BCW0YBPd.mjs → test.handler-BdCYcwR4.mjs} +2 -2
  114. package/dist/{test.handler-DLaxrJ9V.mjs → test.handler-Bo4YTs2Z.mjs} +19 -16
  115. package/dist/{tool.handler-8qNmgdRe.mjs → tool.handler-CPCrSDq2.mjs} +12 -12
  116. package/dist/{trigger-artifacts-BcRScRSp-BiD2h6do.mjs → trigger-artifacts-BcRScRSp-BRpU-He5.mjs} +2 -2
  117. package/dist/{trigger-manifest-C07EM-b2.mjs → trigger-manifest-BVqjDhxU.mjs} +1 -1
  118. package/dist/{upgrade-DgOcc8IT.mjs → upgrade-2qUOcjxb.mjs} +4 -8
  119. package/dist/upgrade.handler-PqlKSuUE.mjs +99 -0
  120. package/dist/{upload.handler-B7xle1oX.mjs → upload.handler-CS-vLpzC.mjs} +9 -9
  121. package/dist/{users.get.handler-C4t1vXwi.mjs → users.get.handler-CH1c6Lnj.mjs} +4 -4
  122. package/dist/{users.list.handler-Dvl90grq.mjs → users.list.handler-CxbZFgjO.mjs} +4 -4
  123. package/dist/{users.set-role.handler-Djw1_VGf.mjs → users.set-role.handler-CBRE-Ws6.mjs} +4 -4
  124. package/dist/{validate.handler-Drf_lssw.mjs → validate.handler-1d-UmtXB.mjs} +171 -26
  125. package/dist/{workflow-build-Begvjfq8.mjs → workflow-build-Bm8JoVv4.mjs} +234 -32
  126. package/dist/{workflow-build-manifest-1sC52TIG.mjs → workflow-build-manifest-CV6bBmDO.mjs} +1 -1
  127. package/dist/{workflow-bundler-BzHk73PM-muPv1yGG.mjs → workflow-bundler-Bs3zQNQv-Dy7lXxy3.mjs} +15 -4
  128. package/dist/{workflows-DjMlxuBX.mjs → workflows-ny7rOdeH.mjs} +34 -37
  129. package/dist/{writer-byNNUjRm-B-on1n6c.mjs → writer-BLg0RuZa-Y6ExdYH9.mjs} +6 -4
  130. package/package.json +11 -11
  131. package/dist/current-deployment-workflow-B1VQCYC-.mjs +0 -94
  132. package/dist/current.handler-BaGaCLzB.mjs +0 -21
  133. package/dist/list.handler-BEMj3FyH.mjs +0 -76
  134. package/dist/list.handler-Cq_oQY5B.mjs +0 -52
  135. package/dist/list.handler-htR9TeiS.mjs +0 -24
  136. package/dist/package-manager-DT1EhOkS.mjs +0 -61
  137. package/dist/schemas-D2zfmyC-.mjs +0 -671
  138. package/dist/skills.handler-DYIQK0Vu.mjs +0 -9
  139. package/dist/status.handler-Ch_DtyBp.mjs +0 -109
  140. package/dist/upgrade.handler-DSZuw7-9.mjs +0 -80
  141. /package/dist/{build-metadata-BB_L45ZS-DSJL7dTy.mjs → build-metadata-BB_L45ZS-DRQsV6JK.mjs} +0 -0
  142. /package/dist/{deploy-DhCbYFc7.mjs → deploy-BiKBH25R.mjs} +0 -0
  143. /package/dist/{detect-env-access-CwkOYeYM-COq4U-4Y.mjs → detect-env-access-CwkOYeYM-r4aynBU0.mjs} +0 -0
  144. /package/dist/{read-credential-keys-77a91T8M-DGK5XTQp.mjs → read-credential-keys-77a91T8M-I07NYwfH.mjs} +0 -0
  145. /package/dist/{run-polling-fBouPjJ2.mjs → run-polling-1c0ckC1A.mjs} +0 -0
  146. /package/dist/{schemas-4Mq_bxob.mjs → schemas-8nhXlXWh.mjs} +0 -0
  147. /package/dist/{task-target-deploy-B_3HPSo2.mjs → task-target-deploy-m9LfE488.mjs} +0 -0
  148. /package/dist/{types-AlA-ifK9.mjs → types-Cb0eWmUU.mjs} +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { t as createTypedCommand } from "./commander-BlrSdFcu.mjs";
4
- import { t as SKILL_INSTALL_METHODS } from "./types-AlA-ifK9.mjs";
3
+ import { t as createTypedCommand } from "./commander-C6SSTQJ2.mjs";
4
+ import { t as SKILL_INSTALL_METHODS } from "./types-Cb0eWmUU.mjs";
5
5
  import { z } from "zod";
6
6
  //#region src/commands/init/init.command.ts
7
7
  const InitOptionsSchema = z.object({
@@ -9,6 +9,7 @@ const InitOptionsSchema = z.object({
9
9
  name: z.string().optional().describe("Project name (skips prompt; default: directory basename)"),
10
10
  description: z.string().optional().describe("Project description for the API (skips prompt when creating a new project)"),
11
11
  scaffold: z.boolean().default(true).describe("Scaffold project files (package.json, vitest.config.ts, etc.)"),
12
+ install: z.boolean().default(true).describe("Install scaffold dependencies after writing project files"),
12
13
  agent: z.array(z.string()).optional().describe("Agent target to install Keystroke skills for. Repeat for multiple agents; '*' selects all."),
13
14
  method: z.enum(SKILL_INSTALL_METHODS).optional().describe("Skill install method for agent-specific targets")
14
15
  });
@@ -29,6 +30,10 @@ const INIT_OPTIONS_CONFIG = {
29
30
  flag: "--no-scaffold",
30
31
  description: "Skip scaffolding project files (package.json, vitest.config.ts, etc.)"
31
32
  },
33
+ install: {
34
+ flag: "--no-install",
35
+ description: "Skip installing scaffold dependencies after writing project files"
36
+ },
32
37
  agent: {
33
38
  flag: "--agent <agent>",
34
39
  description: "Install Keystroke skills for an agent target. Repeat for multiple agents; '*' selects all.",
@@ -45,7 +50,7 @@ function createInitCommand() {
45
50
  description: "Initialize a Keystroke project (creates keystroke.config.ts)",
46
51
  schema: InitOptionsSchema,
47
52
  optionsConfig: INIT_OPTIONS_CONFIG,
48
- loadHandler: async () => (await import("./init.handler-CzlmkNXi.mjs")).handleInit
53
+ loadHandler: async () => (await import("./init.handler-CUbYlUgP.mjs")).handleInit
49
54
  });
50
55
  }
51
56
  //#endregion
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { D as CliExitError, a as ui, i as fetchLatestNpmPackageVersion } from "./keystroke.mjs";
4
- import { i as projects } from "./dist-Dw7gCE7y.mjs";
3
+ import { N as throwReportedCliExit, i as fetchLatestNpmPackageVersion, k as CliExitError, p as ui } from "./keystroke.mjs";
4
+ import { i as projects } from "./dist-B5jy238v.mjs";
5
5
  import { a as writeProjectConfig, i as readProjectConfig, r as getProjectConfigPath } from "./project-config-DudGRFPO.mjs";
6
- import { i as requireClient } from "./context-sgKhRc5v.mjs";
7
- import { i as UnknownSkillAgentError, n as resolveSkillInstallChoices, r as installKeystrokeAgentSkills, t as summarizeSkillInstall } from "./skill-installer-D6j9IA3Z.mjs";
6
+ import { i as requireClient } from "./context-ebZssGCY.mjs";
7
+ import { n as buildProjectInstallCommand, o as resolvePackageManagerResolution, s as runProjectInstall } from "./package-manager-BP3-q8hh.mjs";
8
+ import { i as UnknownSkillAgentError, n as resolveSkillInstallChoices, r as installKeystrokeAgentSkills, t as summarizeSkillInstall } from "./skill-installer-DuMhavmM.mjs";
8
9
  import { createRequire } from "node:module";
9
10
  import path from "node:path";
10
11
  import { access, mkdir, readFile, writeFile } from "node:fs/promises";
@@ -14,6 +15,7 @@ import { cancel, isCancel, text } from "@clack/prompts";
14
15
  const WORKFLOW_CORE_PACKAGE_NAME = "@keystrokehq/core";
15
16
  const CONFIG_PACKAGE_NAME = "@keystrokehq/config";
16
17
  const RUNTIME_PACKAGE_NAME = "@keystrokehq/runtime";
18
+ const TESTING_PACKAGE_NAME = "@keystrokehq/testing";
17
19
  const FALLBACK_SCAFFOLD_VERSION_RANGE = "latest";
18
20
  const DEFAULT_TIMEOUT_MS = 750;
19
21
  /**
@@ -41,6 +43,13 @@ async function runtimeScaffoldVersionRange(options = {}) {
41
43
  readLocalVersion: options.readLocalRuntimeVersion ?? readLocalRuntimeVersion
42
44
  });
43
45
  }
46
+ async function testingScaffoldVersionRange(options = {}) {
47
+ return packageScaffoldVersionRange({
48
+ packageName: TESTING_PACKAGE_NAME,
49
+ timeoutMs: options.timeoutMs,
50
+ readLocalVersion: options.readLocalTestingVersion ?? readLocalTestingVersion
51
+ });
52
+ }
44
53
  async function packageScaffoldVersionRange(options) {
45
54
  const latestVersion = await fetchLatestNpmPackageVersion({
46
55
  packageName: options.packageName,
@@ -75,6 +84,14 @@ function readLocalRuntimeVersion() {
75
84
  } catch {}
76
85
  return null;
77
86
  }
87
+ function readLocalTestingVersion() {
88
+ try {
89
+ const raw = readFileSync(createRequire(import.meta.url).resolve(`${TESTING_PACKAGE_NAME}/package.json`), "utf-8");
90
+ const version = JSON.parse(raw).version?.trim();
91
+ if (version) return version;
92
+ } catch {}
93
+ return null;
94
+ }
78
95
  //#endregion
79
96
  //#region src/commands/init/templates/biome-config.ts
80
97
  /**
@@ -206,6 +223,8 @@ describe('hello workflow', () => {
206
223
  }
207
224
  //#endregion
208
225
  //#region src/commands/init/templates/package-json.ts
226
+ /** Matches the Keystroke monorepo; Corepack uses this for `pnpm install`. */
227
+ const SCAFFOLD_PNPM_PACKAGE_MANAGER = "pnpm@11.1.1";
209
228
  /**
210
229
  * Template for generating a package.json for a new Keystroke project.
211
230
  */
@@ -214,6 +233,7 @@ function createPackageJsonContent(projectName, options) {
214
233
  name: projectName,
215
234
  private: true,
216
235
  type: "module",
236
+ ...options.packageManagerField ? { packageManager: options.packageManagerField } : {},
217
237
  scripts: {
218
238
  test: "vitest run",
219
239
  typecheck: "tsc --noEmit",
@@ -227,7 +247,7 @@ function createPackageJsonContent(projectName, options) {
227
247
  devDependencies: {
228
248
  "@biomejs/biome": "2.4.13",
229
249
  "@keystrokehq/runtime": options.runtimeVersionRange,
230
- "@keystrokehq/testing": options.workflowCoreVersionRange,
250
+ "@keystrokehq/testing": options.testingVersionRange,
231
251
  vitest: "^4.0.18",
232
252
  typescript: "^5.9.3"
233
253
  }
@@ -329,7 +349,7 @@ async function promptProjectDescription(options) {
329
349
  const t = typeof answer === "string" ? answer.trim() : "";
330
350
  return t.length > 0 ? t : void 0;
331
351
  }
332
- async function ensureScaffoldPackageJson(targetDir, projectName, workflowCoreRange, configRange, runtimeRange) {
352
+ async function ensureScaffoldPackageJson(targetDir, projectName, workflowCoreRange, configRange, runtimeRange, testingRange, packageManagerField) {
333
353
  const pkgPath = path.join(targetDir, "package.json");
334
354
  try {
335
355
  const raw = await readFile(pkgPath, "utf-8");
@@ -340,7 +360,7 @@ async function ensureScaffoldPackageJson(targetDir, projectName, workflowCoreRan
340
360
  pkg.dependencies.zod = pkg.dependencies.zod ?? "^4.3.6";
341
361
  pkg.devDependencies = pkg.devDependencies ?? {};
342
362
  pkg.devDependencies["@keystrokehq/runtime"] = runtimeRange;
343
- pkg.devDependencies["@keystrokehq/testing"] = workflowCoreRange;
363
+ pkg.devDependencies["@keystrokehq/testing"] = testingRange;
344
364
  pkg.devDependencies.vitest = pkg.devDependencies.vitest ?? "^4.0.18";
345
365
  pkg.devDependencies.typescript = pkg.devDependencies.typescript ?? "^5.9.3";
346
366
  if (!pkg.name) pkg.name = projectName;
@@ -349,7 +369,9 @@ async function ensureScaffoldPackageJson(targetDir, projectName, workflowCoreRan
349
369
  } catch {
350
370
  await writeFile(pkgPath, `${createPackageJsonContent(projectName, {
351
371
  configVersionRange: configRange,
372
+ packageManagerField,
352
373
  runtimeVersionRange: runtimeRange,
374
+ testingVersionRange: testingRange,
353
375
  workflowCoreVersionRange: workflowCoreRange
354
376
  })}\n`, "utf-8");
355
377
  return "created";
@@ -427,12 +449,13 @@ async function handleInit(options, ctx) {
427
449
  await projects.track(targetDir, { name: projectName });
428
450
  await installAgentSkillsForInit(targetDir, options);
429
451
  if (options.scaffold) {
430
- const [workflowCoreVersionRange, configVersionRange, runtimeVersionRange] = await Promise.all([
452
+ const [workflowCoreVersionRange, configVersionRange, runtimeVersionRange, testingVersionRange] = await Promise.all([
431
453
  workflowCoreScaffoldVersionRange(),
432
454
  configScaffoldVersionRange(),
433
- runtimeScaffoldVersionRange()
455
+ runtimeScaffoldVersionRange(),
456
+ testingScaffoldVersionRange()
434
457
  ]);
435
- await scaffoldProject(targetDir, projectName, workflowCoreVersionRange, configVersionRange, runtimeVersionRange);
458
+ await scaffoldProject(targetDir, projectName, workflowCoreVersionRange, configVersionRange, runtimeVersionRange, testingVersionRange, options.install !== false);
436
459
  }
437
460
  }
438
461
  /** Write a file only if it does not already exist. Returns true if written. */
@@ -445,9 +468,11 @@ async function writeIfMissing(filePath, content) {
445
468
  return true;
446
469
  }
447
470
  }
448
- async function scaffoldProject(targetDir, projectName, workflowCoreVersionRange, configVersionRange, runtimeVersionRange) {
449
- const pkgAction = await ensureScaffoldPackageJson(targetDir, projectName, workflowCoreVersionRange, configVersionRange, runtimeVersionRange);
450
- ui.success(pkgAction === "created" ? `Created package.json (@keystrokehq/core ${workflowCoreVersionRange}, @keystrokehq/config ${configVersionRange}, @keystrokehq/runtime ${runtimeVersionRange})` : `Updated package.json (Keystroke deps -> core ${workflowCoreVersionRange}, config ${configVersionRange}, runtime ${runtimeVersionRange})`);
471
+ async function scaffoldProject(targetDir, projectName, workflowCoreVersionRange, configVersionRange, runtimeVersionRange, testingVersionRange, shouldInstall) {
472
+ const packageManagerResolution = await resolvePackageManagerResolution({ cwd: targetDir });
473
+ const { packageManager } = packageManagerResolution;
474
+ const pkgAction = await ensureScaffoldPackageJson(targetDir, projectName, workflowCoreVersionRange, configVersionRange, runtimeVersionRange, testingVersionRange, packageManager === "pnpm" && packageManagerResolution.source === "preferred" ? SCAFFOLD_PNPM_PACKAGE_MANAGER : void 0);
475
+ ui.success(pkgAction === "created" ? `Created package.json (@keystrokehq/core ${workflowCoreVersionRange}, @keystrokehq/config ${configVersionRange}, @keystrokehq/runtime ${runtimeVersionRange}, @keystrokehq/testing ${testingVersionRange})` : `Updated package.json (Keystroke deps -> core ${workflowCoreVersionRange}, config ${configVersionRange}, runtime ${runtimeVersionRange}, testing ${testingVersionRange})`);
451
476
  const files = [
452
477
  {
453
478
  rel: "vitest.config.ts",
@@ -498,7 +523,25 @@ async function scaffoldProject(targetDir, projectName, workflowCoreVersionRange,
498
523
  }
499
524
  if (created.length > 0) ui.success(`Scaffolded ${created.length} file(s): ${created.join(", ")}`);
500
525
  else ui.hint("Scaffold files already exist — skipped (package.json was still updated).");
501
- ui.hint("Run `pnpm install` to install dependencies, then `pnpm test` to run tests (or use your lockfile's package manager).");
526
+ if (shouldInstall) await installScaffoldDependencies(targetDir, packageManager);
527
+ else {
528
+ const installCommand = buildProjectInstallCommand(packageManager);
529
+ const renderedCommand = [installCommand.command, ...installCommand.args].join(" ");
530
+ ui.hint(`Skipped dependency install. Run \`${renderedCommand}\` when ready.`);
531
+ }
532
+ }
533
+ async function installScaffoldDependencies(targetDir, packageManager) {
534
+ const installCommand = buildProjectInstallCommand(packageManager);
535
+ const renderedCommand = [installCommand.command, ...installCommand.args].join(" ");
536
+ ui.header(`Installing dependencies with ${packageManager}...`);
537
+ ui.hint(renderedCommand);
538
+ const exitCode = await runProjectInstall({
539
+ cwd: targetDir,
540
+ packageManager
541
+ });
542
+ if (exitCode !== 0) throwReportedCliExit(`Dependency install failed with exit code ${exitCode}.`);
543
+ ui.success("Dependencies installed.");
544
+ ui.hint(`Run \`${packageManager} test\` to run the scaffolded workflow tests.`);
502
545
  }
503
546
  //#endregion
504
547
  export { handleInit };
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { a as ui, j as throwReportedCliExit, n as style, t as ANSI, y as toErrorMessage } from "./keystroke.mjs";
4
- import { i as projects } from "./dist-Dw7gCE7y.mjs";
5
- import { i as writeJson } from "./output-BWcVRt-T.mjs";
6
- import { i as requireClient, t as assertProjectConfigMatchesAuthenticatedOrg } from "./context-sgKhRc5v.mjs";
7
- import { a as resolveTypeHint } from "./schema-display-FvI8QjOQ.mjs";
8
- import { n as resolveLocalWorkflowManifest, r as resolveProjectContext, t as lookupCurrentDeploymentWorkflow } from "./current-deployment-workflow-B1VQCYC-.mjs";
3
+ import { N as throwReportedCliExit, n as style, p as ui, t as ANSI, x as toErrorMessage } from "./keystroke.mjs";
4
+ import { i as projects } from "./dist-B5jy238v.mjs";
5
+ import { i as writeJson } from "./output-DnIFEmi5.mjs";
6
+ import { i as requireClient, t as assertProjectConfigMatchesAuthenticatedOrg } from "./context-ebZssGCY.mjs";
7
+ import { s as resolveTypeHint } from "./schema-display-sZ6ConJd.mjs";
8
+ import { t as lookupCurrentDeploymentWorkflow } from "./current-deployment-workflow-C6x65imE.mjs";
9
+ import { r as requireLocalWorkflowManifest, t as WORKFLOW_ID_COMMANDS } from "./authored-workflow-ref-fkHEEVnd.mjs";
9
10
  import dayjs from "dayjs";
10
11
  //#region src/commands/workflows/inspect/inspect-display.ts
11
12
  function formatBuildTimestamp(iso) {
@@ -19,6 +20,7 @@ function renderManifestInspect(manifest, source, version) {
19
20
  ui.br();
20
21
  }
21
22
  ui.text(style(` ${manifest.name}`, `${ANSI.bold}${ANSI.cyan}`));
23
+ if (manifest.id) ui.text(style(` id: ${manifest.id}`, ANSI.dim));
22
24
  if (manifest.description) ui.text(style(` ${manifest.description}`, ANSI.dim));
23
25
  ui.br();
24
26
  ui.text(style(" Input", ANSI.bold));
@@ -102,9 +104,13 @@ async function handleWorkflowsInspect(options, ctx) {
102
104
  return handleInspectLocal(options, ctx);
103
105
  }
104
106
  async function handleInspectLocal(options, ctx) {
105
- const resolved = await resolveLocalWorkflowManifest(options.workflow, options.path, { jsonMode: ctx.jsonMode });
106
- const workflowsDir = resolved.workflowsDir;
107
- projects.track(workflowsDir);
107
+ const resolved = await requireLocalWorkflowManifest({
108
+ authoredWorkflowId: options.workflow,
109
+ path: options.path,
110
+ command: WORKFLOW_ID_COMMANDS.inspect,
111
+ jsonMode: ctx.jsonMode
112
+ });
113
+ projects.track(resolved.workflowsDir);
108
114
  if (ctx.jsonMode) {
109
115
  writeJson(resolved.manifest);
110
116
  return;
@@ -112,7 +118,12 @@ async function handleInspectLocal(options, ctx) {
112
118
  renderManifestInspect(resolved.manifest, "local");
113
119
  }
114
120
  async function handleInspectDeployed(options, ctx) {
115
- const resolved = await resolveProjectContext(options.workflow, options.path, { jsonMode: ctx.jsonMode });
121
+ const resolved = await requireLocalWorkflowManifest({
122
+ authoredWorkflowId: options.workflow,
123
+ path: options.path,
124
+ command: WORKFLOW_ID_COMMANDS.inspectDeployed,
125
+ jsonMode: ctx.jsonMode
126
+ });
116
127
  projects.track(resolved.workflowsDir);
117
128
  const client = requireClient(ctx);
118
129
  await assertProjectConfigMatchesAuthenticatedOrg(client, { organizationId: resolved.organizationId });
@@ -132,15 +143,15 @@ async function handleInspectDeployed(options, ctx) {
132
143
  throwReportedCliExit("This project has no current deployment.");
133
144
  }
134
145
  if (deploymentLookup.status === "missingWorkflow") {
135
- ui.error(`Workflow "${options.workflow}" is not part of the current deployment.`);
146
+ ui.error(`Workflow "${resolved.authoredWorkflowId}" is not part of the current deployment.`);
136
147
  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.`);
148
+ throwReportedCliExit(`Workflow "${resolved.authoredWorkflowId}" is not part of the current deployment.`);
138
149
  }
139
150
  if (ctx.jsonMode) {
140
151
  writeJson(deploymentLookup.workflow.manifest);
141
152
  return;
142
153
  }
143
- renderManifestInspect(deploymentLookup.workflow.manifest, "deployed");
154
+ renderManifestInspect(deploymentLookup.workflow.manifest, "deployed", deploymentLookup.workflow.deploymentNumber);
144
155
  }
145
156
  //#endregion
146
157
  export { handleWorkflowsInspect };
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { D as CliExitError, _ as isAuthError, a as ui, j as throwReportedCliExit, m as REAUTH_HINT, v as isNetworkError, y as toErrorMessage } from "./keystroke.mjs";
4
- import { a as writeJsonError } from "./output-BWcVRt-T.mjs";
5
- import { i as requireClient } from "./context-sgKhRc5v.mjs";
3
+ import { N as throwReportedCliExit, b as isNetworkError, g as REAUTH_HINT, k as CliExitError, p as ui, x as toErrorMessage, y as isAuthError } from "./keystroke.mjs";
4
+ import { a as writeJsonError } from "./output-DnIFEmi5.mjs";
5
+ import { i as requireClient } from "./context-ebZssGCY.mjs";
6
6
  //#region src/lib/integration-catalog.ts
7
7
  const catalogCache = /* @__PURE__ */ new WeakMap();
8
8
  function buildView(entries) {
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { n as JsonOptionSchema, t as JSON_OPTION_CONFIG } from "./output-BWcVRt-T.mjs";
4
- import { t as createTypedCommand } from "./commander-BlrSdFcu.mjs";
5
- import { t as ConnectionKindValues } from "./api-BK3EhPvs.mjs";
3
+ import { n as JsonOptionSchema, t as JSON_OPTION_CONFIG } from "./output-DnIFEmi5.mjs";
4
+ import { t as createTypedCommand } from "./commander-C6SSTQJ2.mjs";
5
+ import { t as ConnectionKindValues } from "./api-sWkB_Wta.mjs";
6
6
  import { z } from "zod";
7
7
  //#region ../../packages/shared-types/src/official-providers/index.ts
8
8
  const officialProviderRegistry = {
@@ -158,14 +158,14 @@ function createIntegrationsCommand() {
158
158
  description: "List Keystroke integrations available to your organization",
159
159
  schema: IntegrationsListOptionsSchema,
160
160
  optionsConfig: INTEGRATIONS_LIST_OPTIONS_CONFIG,
161
- loadHandler: async () => (await import("./list.handler-Jk_vK66s.mjs")).handleIntegrationsList,
161
+ loadHandler: async () => (await import("./list.handler-D47C1z3m.mjs")).handleIntegrationsList,
162
162
  subcommands: [
163
163
  createTypedCommand({
164
164
  name: "list",
165
165
  description: "List Keystroke integrations available to your organization",
166
166
  schema: IntegrationsListOptionsSchema,
167
167
  optionsConfig: INTEGRATIONS_LIST_OPTIONS_CONFIG,
168
- loadHandler: async () => (await import("./list.handler-Jk_vK66s.mjs")).handleIntegrationsList
168
+ loadHandler: async () => (await import("./list.handler-D47C1z3m.mjs")).handleIntegrationsList
169
169
  }),
170
170
  createTypedCommand({
171
171
  name: "show",
@@ -177,7 +177,7 @@ function createIntegrationsCommand() {
177
177
  description: "Integration id, e.g. aws-s3",
178
178
  key: "id"
179
179
  },
180
- loadHandler: async () => (await import("./show.handler-C_VDYU91.mjs")).handleIntegrationShow
180
+ loadHandler: async () => (await import("./show.handler-BrIHUH28.mjs")).handleIntegrationShow
181
181
  }),
182
182
  createTypedCommand({
183
183
  name: "register",
@@ -185,7 +185,7 @@ function createIntegrationsCommand() {
185
185
  schema: IntegrationsRegisterOptionsSchema,
186
186
  optionsConfig: INTEGRATIONS_REGISTER_OPTIONS_CONFIG,
187
187
  handler: async (opts, ctx) => {
188
- const { handleIntegrationsRegister } = await import("./register.handler-CePNU3sP.mjs");
188
+ const { handleIntegrationsRegister } = await import("./register.handler-BvAkXCwE.mjs");
189
189
  await handleIntegrationsRegister({
190
190
  integrationId: opts.integrationId,
191
191
  clientAppCredentialSetId: opts.clientApp,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { n as JsonOptionSchema, t as JSON_OPTION_CONFIG } from "./output-BWcVRt-T.mjs";
4
- import { t as createTypedCommand } from "./commander-BlrSdFcu.mjs";
3
+ import { n as JsonOptionSchema, t as JSON_OPTION_CONFIG } from "./output-DnIFEmi5.mjs";
4
+ import { t as createTypedCommand } from "./commander-C6SSTQJ2.mjs";
5
5
  import { z } from "zod";
6
6
  //#region src/commands/invites/invites.command.ts
7
7
  const InvitesListOptionsSchema = JsonOptionSchema;
@@ -19,13 +19,13 @@ function createInvitesCommand() {
19
19
  description: "Manage invitations for the current user",
20
20
  schema: InvitesListOptionsSchema,
21
21
  optionsConfig: { ...JSON_OPTION_CONFIG },
22
- loadHandler: async () => (await import("./list.handler-LxZInip2.mjs")).handleInvitesList,
22
+ loadHandler: async () => (await import("./list.handler-2g1CZAvB.mjs")).handleInvitesList,
23
23
  subcommands: [createTypedCommand({
24
24
  name: "list",
25
25
  description: "List pending invites for the current user",
26
26
  schema: InvitesListOptionsSchema,
27
27
  optionsConfig: { ...JSON_OPTION_CONFIG },
28
- loadHandler: async () => (await import("./list.handler-LxZInip2.mjs")).handleInvitesList
28
+ loadHandler: async () => (await import("./list.handler-2g1CZAvB.mjs")).handleInvitesList
29
29
  }), createTypedCommand({
30
30
  name: "accept",
31
31
  description: "Accept a pending invite",
@@ -36,7 +36,7 @@ function createInvitesCommand() {
36
36
  description: "Invite ID to accept",
37
37
  key: "inviteId"
38
38
  },
39
- loadHandler: async () => (await import("./accept.handler-DNfIXPSP.mjs")).handleInvitesAccept
39
+ loadHandler: async () => (await import("./accept.handler-DCsud1s5.mjs")).handleInvitesAccept
40
40
  })]
41
41
  });
42
42
  }
@@ -1,14 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { a as ui } from "./keystroke.mjs";
4
- import { i as writeJson } from "./output-BWcVRt-T.mjs";
5
- import { i as requireClient } from "./context-sgKhRc5v.mjs";
6
- import { i as requireOrganizationId, n as isIamJsonMode, t as handleIamError } from "./iam-command-utils-CSZj4XlH.mjs";
3
+ import { p as ui } from "./keystroke.mjs";
4
+ import { i as writeJson } from "./output-DnIFEmi5.mjs";
5
+ import { i as requireClient } from "./context-ebZssGCY.mjs";
6
+ import { n as isIamJsonMode, t as handleIamError } from "./iam-command-utils-DNDN0wT6.mjs";
7
+ import { s as requireOrganizationId } from "./org-context-BI9OSpbb.mjs";
7
8
  import Table from "cli-table3";
8
9
  //#region src/commands/org/invites.list.handler.ts
9
10
  async function handleOrgInvitesList(_options, ctx) {
10
11
  const client = requireClient(ctx);
11
- const organizationId = requireOrganizationId(ctx);
12
+ const organizationId = await requireOrganizationId(ctx);
12
13
  try {
13
14
  const result = await client.organizations.invites.list(organizationId);
14
15
  if (isIamJsonMode(_options, ctx)) {
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { a as ui } from "./keystroke.mjs";
4
- import { i as writeJson } from "./output-BWcVRt-T.mjs";
5
- import { i as requireClient } from "./context-sgKhRc5v.mjs";
6
- import { i as requireOrganizationId, n as isIamJsonMode, t as handleIamError } from "./iam-command-utils-CSZj4XlH.mjs";
3
+ import { p as ui } from "./keystroke.mjs";
4
+ import { i as writeJson } from "./output-DnIFEmi5.mjs";
5
+ import { i as requireClient } from "./context-ebZssGCY.mjs";
6
+ import { n as isIamJsonMode, t as handleIamError } from "./iam-command-utils-DNDN0wT6.mjs";
7
+ import { s as requireOrganizationId } from "./org-context-BI9OSpbb.mjs";
7
8
  //#region src/commands/org/invites.resend.handler.ts
8
9
  async function handleOrgInvitesResend(options, ctx) {
9
10
  const client = requireClient(ctx);
10
- const organizationId = requireOrganizationId(ctx);
11
+ const organizationId = await requireOrganizationId(ctx);
11
12
  try {
12
13
  const result = await client.organizations.invites.resend(organizationId, options.inviteId);
13
14
  if (isIamJsonMode(options, ctx)) {
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { a as ui } from "./keystroke.mjs";
4
- import { i as writeJson } from "./output-BWcVRt-T.mjs";
5
- import { i as requireClient } from "./context-sgKhRc5v.mjs";
6
- import { i as requireOrganizationId, n as isIamJsonMode, r as requireConfirmation, t as handleIamError } from "./iam-command-utils-CSZj4XlH.mjs";
3
+ import { p as ui } from "./keystroke.mjs";
4
+ import { i as writeJson } from "./output-DnIFEmi5.mjs";
5
+ import { i as requireClient } from "./context-ebZssGCY.mjs";
6
+ import { n as isIamJsonMode, r as requireConfirmation, t as handleIamError } from "./iam-command-utils-DNDN0wT6.mjs";
7
+ import { s as requireOrganizationId } from "./org-context-BI9OSpbb.mjs";
7
8
  //#region src/commands/org/invites.revoke.handler.ts
8
9
  async function handleOrgInvitesRevoke(options, ctx) {
9
10
  const client = requireClient(ctx);
10
- const organizationId = requireOrganizationId(ctx);
11
+ const organizationId = await requireOrganizationId(ctx);
11
12
  requireConfirmation({
12
13
  confirmed: options.confirm,
13
14
  message: "Revoking an invite prevents it from being accepted.",