@keystrokehq/cli 0.0.14 → 0.0.16

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 (101) hide show
  1. package/README.md +14 -4
  2. package/dist/{admin-CXQezpQA.mjs → admin-Bb9Hx-gO.mjs} +1 -1
  3. package/dist/{agents-BdzwXAI1.mjs → agents-CbmvvOAx.mjs} +6 -6
  4. package/dist/{api-Sf7A0I5T.mjs → api-jkf0TTgD.mjs} +1 -1
  5. package/dist/{api-keys-BZmUiIEr.mjs → api-keys-DJlyIf10.mjs} +1 -1
  6. package/dist/{auth-CGBgi6PG.mjs → auth-DpDEkJz7.mjs} +1 -1
  7. package/dist/{build-agents-DseUtzd4-DBQ82ErJ.mjs → build-agents-DseUtzd4-VYWtIZy9.mjs} +2 -2
  8. package/dist/{build-metadata-qebrtraZ-BL-fo8HW.mjs → build-metadata-C8Ra_Gi--BdoyLQMl.mjs} +4 -4
  9. package/dist/{build-progress-BataNqG-.mjs → build-progress-BZivcVz4.mjs} +1 -1
  10. package/dist/{build-tasks-GVuMLS0h-CWrrj8SF.mjs → build-tasks-GVuMLS0h-p08mMOyK.mjs} +2 -2
  11. package/dist/{build-workflows-Dmzay1vP-CAhb0BSk.mjs → build-workflows-CV4tBo6S-knCnBKTc.mjs} +5 -5
  12. package/dist/{build.handler-DTKBdDzF.mjs → build.handler-BNSC_zhQ.mjs} +3 -3
  13. package/dist/{commander-i-7LgOyc.mjs → commander-D15UZVjp.mjs} +1 -1
  14. package/dist/{connect-BcTkRZ10.mjs → connect-DzSNDSmI.mjs} +2 -2
  15. package/dist/{connect.handler-DilOwhlW.mjs → connect.handler-DRO05ak3.mjs} +1 -1
  16. package/dist/{credentials-BsEHWMBh.mjs → credentials-VidBoOd7.mjs} +6 -6
  17. package/dist/{current-deployment-workflow-Biw1zV7S.mjs → current-deployment-workflow-BRUEdPrN.mjs} +5 -5
  18. package/dist/{deploy-DVE7Mx_X.mjs → deploy-eshEEiP-.mjs} +2 -2
  19. package/dist/{deploy-progress-7qj5ek8b.mjs → deploy-progress-DJHph1Fz.mjs} +1 -1
  20. package/dist/{deploy.handler-B3E7uX-x.mjs → deploy.handler-BxxWI7nV.mjs} +12 -12
  21. package/dist/{diff.handler-BMNZ_3J_.mjs → diff.handler-CzrKCj7N.mjs} +1 -1
  22. package/dist/{dist-BVD3Ga_l.mjs → dist-FQYQ2FLm.mjs} +3 -3
  23. package/dist/{env.handler-BUBsjm1k.mjs → env.handler-B3YDQIVE.mjs} +3 -3
  24. package/dist/{import-module-DEI7R8Yh-L32hhSoh.mjs → import-module--8x5SLum-DaUNACER.mjs} +2 -2
  25. package/dist/{init-CxMQ2ysa.mjs → init-PTwX63_P.mjs} +15 -3
  26. package/dist/{init.handler-BPKxeGZS.mjs → init.handler-CdytFiFt.mjs} +61 -67
  27. package/dist/{inspect.handler-CJ7e6iFB.mjs → inspect.handler-umc7of-r.mjs} +2 -2
  28. package/dist/{integrations-DUlJhGUS.mjs → integrations-B0Gv-L0s.mjs} +5 -5
  29. package/dist/{invites-BlB-hKUE.mjs → invites-Cqi7iyIN.mjs} +4 -4
  30. package/dist/keystroke.mjs +21 -21
  31. package/dist/{list.handler-DhFni3rk.mjs → list.handler-D-YFoKLU.mjs} +2 -2
  32. package/dist/{list.handler-VGPaJzl-.mjs → list.handler-c-8RpgB9.mjs} +1 -1
  33. package/dist/{list.handler-K3x71Y4Z.mjs → list2.handler-T5v4EK20.mjs} +4 -4
  34. package/dist/{listen-drcHFcKq.mjs → listen-rHLiCWbn.mjs} +2 -2
  35. package/dist/{listen.handler-DjK6RlLf.mjs → listen.handler-B9T58yAj.mjs} +1 -1
  36. package/dist/{logs-NI-DyeFY.mjs → logs-DUwdYZB-.mjs} +3 -3
  37. package/dist/{logs.handler-PRYGI57p.mjs → logs.handler-DGcGN2qb.mjs} +1 -1
  38. package/dist/{metadata-layout-C6ed-9dl-DCTTsjiG.mjs → metadata-layout-Bv-B0nHj-CqlcZz_g.mjs} +1 -1
  39. package/dist/{org-8bkIZAJ4.mjs → org-DUCts2MV.mjs} +15 -15
  40. package/dist/{project-config-CJGSh2RQ.mjs → project-config-CsBMT4TL.mjs} +1 -13
  41. package/dist/{projects-Pp5ENoyh.mjs → projects-CbquwUlm.mjs} +4 -4
  42. package/dist/{requirements.handler-CZ53jJ_5.mjs → requirements.handler-D5dFi7XZ.mjs} +2 -2
  43. package/dist/{resolve-project-CI_PxRXi.mjs → resolve-project-CURYMjex.mjs} +1 -1
  44. package/dist/{run-polling-7YWCL6c-.mjs → run-polling-BWcLQvm0.mjs} +3 -3
  45. package/dist/{run-polling-BPmB5N5A.mjs → run-polling-CwlzB5-9.mjs} +1 -1
  46. package/dist/{run.handler-BNrAIXDG.mjs → run.handler-BiBDLoeH.mjs} +4 -4
  47. package/dist/{runs-Bs8VzL8P.mjs → runs-Bc3zjk7V.mjs} +1 -1
  48. package/dist/{schema-display-B0LmISCe.mjs → schema-display-CNqiYBIb.mjs} +4 -4
  49. package/dist/skill-installer-DkRJ6oLi.mjs +506 -0
  50. package/dist/{skills-sync.handler-DXF6IgEX.mjs → skills-sync.handler-C4ztv1Vu.mjs} +20 -7
  51. package/dist/skills.command-DuL4kLUi.mjs +49 -0
  52. package/dist/{skills.handler-CPKCf9ZK.mjs → skills.handler-R5KAbioE.mjs} +1 -1
  53. package/dist/{source-analysis-DTnwNwKq-BqHdBGtw.mjs → source-analysis-BBg2E_6G-BQqm16RR.mjs} +3 -3
  54. package/dist/{spinner-progress-DpL68vYK.mjs → spinner-progress-DfkMzwGx.mjs} +1 -1
  55. package/dist/spinner-worker.d.mts +3 -0
  56. package/dist/spinner-worker.mjs +203 -0
  57. package/dist/{sync-BSL1s6PR.mjs → sync-Pssitj6K.mjs} +2 -2
  58. package/dist/{sync.handler-BN9oDWVx.mjs → sync.handler-Be0U3x-n.mjs} +5 -5
  59. package/dist/{task-target-build-Du0ObGbb.mjs → task-target-build-BG6cC3bz.mjs} +3 -3
  60. package/dist/task-target-deploy-runner.mjs +5 -5
  61. package/dist/test-BISghlKg.mjs +74 -0
  62. package/dist/{try-deploy.handler-A16ahnCF.mjs → test.handler-DkizZhVu.mjs} +13 -15
  63. package/dist/{test-BIz-oBxy.mjs → tool.handler-Bu130Vcz.mjs} +8 -90
  64. package/dist/{trigger-artifacts-RizI57RC-abdkW8-z.mjs → trigger-artifacts-RizI57RC-CxHwCkQ_.mjs} +2 -2
  65. package/dist/types-D04ah3uY.mjs +6 -0
  66. package/dist/{upgrade-f97U8Rll.mjs → upgrade-cH9I_pZq.mjs} +1 -1
  67. package/dist/{upload.handler-CUtfr3hY.mjs → upload.handler-CpKuAaQ_.mjs} +3 -3
  68. package/dist/{utils-LlH3l_yT.mjs → utils-VC0Vl_pm.mjs} +2 -2
  69. package/dist/{validate.handler-CUP3SjzC.mjs → validate.handler-I8LY-UkG.mjs} +3 -3
  70. package/dist/{workflow-build-C_qkq7jk.mjs → workflow-build-C9rQQ4qU.mjs} +14 -14
  71. package/dist/{workflow-bundler-BzHk73PM-CRcJvu9a.mjs → workflow-bundler-BzHk73PM-AIB4-u4Y.mjs} +1 -1
  72. package/dist/{workflows-ixllXKLo.mjs → workflows-CL1jYSLR.mjs} +55 -17
  73. package/dist/{writer-CtvttJdP-BEJHbiLs.mjs → writer-B-SpZ0G2-olEAgSLc.mjs} +5 -5
  74. package/package.json +7 -7
  75. package/dist/options-BsIkm0Bb.mjs +0 -43
  76. package/dist/skills.command-B8yExFCn.mjs +0 -35
  77. package/dist/sync-keystroke-agent-skills-ChUj1LnK.mjs +0 -66
  78. /package/dist/{accept.handler-BsZQqmzU.mjs → accept.handler-BPwp_UAE.mjs} +0 -0
  79. /package/dist/{clear-cache.handler-Bkt6GKnF.mjs → clear-cache.handler-gr5VmEYB.mjs} +0 -0
  80. /package/dist/{clear.handler-BieI9Oix.mjs → clear.handler-CtOZ4aRn.mjs} +0 -0
  81. /package/dist/{current.handler-C48q2mBd.mjs → current.handler-QZQ-l84v.mjs} +0 -0
  82. /package/dist/{deploy-D4ILrWpx.mjs → deploy-CJbVB7e2.mjs} +0 -0
  83. /package/dist/{detect-env-access-CwkOYeYM-BLtKepjx.mjs → detect-env-access-CwkOYeYM-CZIixHeR.mjs} +0 -0
  84. /package/dist/{invites.list.handler-DmeMcezN.mjs → invites.list.handler-CErgY35S.mjs} +0 -0
  85. /package/dist/{invites.resend.handler-pJTPtKHE.mjs → invites.resend.handler-DRCRIA4F.mjs} +0 -0
  86. /package/dist/{invites.revoke.handler-4NgnnfiU.mjs → invites.revoke.handler-C0FZdAR0.mjs} +0 -0
  87. /package/dist/{layout-DaoP8bcD.mjs → layout-CXkZEsXI.mjs} +0 -0
  88. /package/dist/{list.handler-C7AChEPW.mjs → list.handler-BjutlIkE.mjs} +0 -0
  89. /package/dist/{list.handler-BuX-bb2y.mjs → list.handler-Cr_DFAae.mjs} +0 -0
  90. /package/dist/{list.handler-BSyrxCma.mjs → list.handler-FlchXrKz.mjs} +0 -0
  91. /package/dist/{logs.handler-BqmZ4eLx.mjs → logs.handler-dcRq-zoc.mjs} +0 -0
  92. /package/dist/{members.add.handler-B4H8Hn6x.mjs → members.add.handler-DmYI43rZ.mjs} +0 -0
  93. /package/dist/{members.invite.handler-D8ONlt4Y.mjs → members.invite.handler-B_KVxv5m.mjs} +0 -0
  94. /package/dist/{members.list.handler-BHJTMMiA.mjs → members.list.handler-BtuuIgQS.mjs} +0 -0
  95. /package/dist/{members.remove.handler-_hKd_sFd.mjs → members.remove.handler-Lvg-CqVv.mjs} +0 -0
  96. /package/dist/{members.update.handler-CC7J0k8n.mjs → members.update.handler-D-8izeso.mjs} +0 -0
  97. /package/dist/{read-credential-keys-77a91T8M-COvwpok_.mjs → read-credential-keys-77a91T8M-DMmY6oDW.mjs} +0 -0
  98. /package/dist/{register.handler-CttgzybN.mjs → register.handler-BAx0IC-u.mjs} +0 -0
  99. /package/dist/{schema-BjH_e4Fo.mjs → schema-O9xTWad_.mjs} +0 -0
  100. /package/dist/{switch.handler-BFBM8rSi.mjs → switch.handler-CTwhIcaQ.mjs} +0 -0
  101. /package/dist/{task-target-deploy-OyxLvh3a.mjs → task-target-deploy-gMQC8kXU.mjs} +0 -0
@@ -2,18 +2,17 @@
2
2
 
3
3
  import { k as CliExitError, n as ui, t as fetchLatestNpmPackageVersion } from "./keystroke.mjs";
4
4
  import { d as trackProject } from "./dist-BF6r1hfv.mjs";
5
- import { a as writeProjectConfig, i as readProjectConfig, r as getProjectConfigPath } from "./project-config-CJGSh2RQ.mjs";
5
+ import { a as writeProjectConfig, i as readProjectConfig, r as getProjectConfigPath } from "./project-config-CsBMT4TL.mjs";
6
6
  import { i as requireClient } from "./context-B1L8pZsH.mjs";
7
- import { t as syncKeystrokeAgentSkills } from "./sync-keystroke-agent-skills-ChUj1LnK.mjs";
7
+ import { i as UnknownSkillAgentError, n as resolveSkillInstallChoices, r as installKeystrokeAgentSkills, t as summarizeSkillInstall } from "./skill-installer-DkRJ6oLi.mjs";
8
8
  import { createRequire } from "node:module";
9
9
  import { readFileSync } from "node:fs";
10
10
  import { access, mkdir, readFile, writeFile } from "node:fs/promises";
11
- import * as path$1 from "node:path";
12
11
  import path from "node:path";
13
- import { fileURLToPath } from "node:url";
14
12
  import { cancel, isCancel, text } from "@clack/prompts";
15
13
  //#region src/lib/keystroke-scaffold-version-ranges.ts
16
14
  const WORKFLOW_CORE_PACKAGE_NAME = "@keystrokehq/core";
15
+ const CONFIG_PACKAGE_NAME = "@keystrokehq/config";
17
16
  const FALLBACK_WORKFLOW_CORE_VERSION_RANGE = "latest";
18
17
  const DEFAULT_TIMEOUT_MS = 750;
19
18
  /**
@@ -21,12 +20,26 @@ const DEFAULT_TIMEOUT_MS = 750;
21
20
  * `@keystrokehq/core` version so new projects start with current primitives.
22
21
  */
23
22
  async function workflowCoreScaffoldVersionRange(options = {}) {
24
- const latestVersion = await fetchLatestNpmPackageVersion({
23
+ return packageScaffoldVersionRange({
25
24
  packageName: WORKFLOW_CORE_PACKAGE_NAME,
25
+ timeoutMs: options.timeoutMs,
26
+ readLocalVersion: options.readLocalCoreVersion ?? readLocalWorkflowCoreVersion
27
+ });
28
+ }
29
+ async function configScaffoldVersionRange(options = {}) {
30
+ return packageScaffoldVersionRange({
31
+ packageName: CONFIG_PACKAGE_NAME,
32
+ timeoutMs: options.timeoutMs,
33
+ readLocalVersion: options.readLocalConfigVersion ?? readLocalConfigVersion
34
+ });
35
+ }
36
+ async function packageScaffoldVersionRange(options) {
37
+ const latestVersion = await fetchLatestNpmPackageVersion({
38
+ packageName: options.packageName,
26
39
  timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS
27
40
  });
28
41
  if (latestVersion) return `^${latestVersion}`;
29
- const localVersion = (options.readLocalCoreVersion ?? readLocalWorkflowCoreVersion)();
42
+ const localVersion = options.readLocalVersion();
30
43
  if (localVersion) return `^${localVersion}`;
31
44
  return FALLBACK_WORKFLOW_CORE_VERSION_RANGE;
32
45
  }
@@ -38,53 +51,13 @@ function readLocalWorkflowCoreVersion() {
38
51
  } catch {}
39
52
  return null;
40
53
  }
41
- //#endregion
42
- //#region src/commands/init/agents-md.ts
43
- const AGENTS_FILENAME = "AGENTS.md";
44
- const AGENTS_BLURB_PACKAGE_PATH = "AGENTS-blurb.md";
45
- function normalizeLineEndings(value) {
46
- return value.replace(/\r\n/g, "\n");
47
- }
48
- function normalizeBlurb(value) {
49
- return `${normalizeLineEndings(value).trim()}\n`;
50
- }
51
- function resolveMonorepoSkillsBlurbPath() {
52
- return fileURLToPath(new URL("../../../../../packages/skills/AGENTS-blurb.md", import.meta.url));
53
- }
54
- function resolveCliPackageSkillsBlurbPath() {
55
- const relativePath = import.meta.url.includes("/dist/") ? "../AGENTS-blurb.md" : "../../../AGENTS-blurb.md";
56
- return fileURLToPath(new URL(relativePath, import.meta.url));
57
- }
58
- function resolveBundledKeystrokeAgentsBlurbPath() {
59
- const require = createRequire(import.meta.url);
54
+ function readLocalConfigVersion() {
60
55
  try {
61
- const skillsPackageJsonPath = require.resolve("@keystrokehq/skills/package.json");
62
- return path$1.join(path$1.dirname(skillsPackageJsonPath), AGENTS_BLURB_PACKAGE_PATH);
63
- } catch {}
64
- try {
65
- return resolveCliPackageSkillsBlurbPath();
56
+ const raw = readFileSync(createRequire(import.meta.url).resolve(`${CONFIG_PACKAGE_NAME}/package.json`), "utf-8");
57
+ const version = JSON.parse(raw).version?.trim();
58
+ if (version) return version;
66
59
  } catch {}
67
- return resolveMonorepoSkillsBlurbPath();
68
- }
69
- async function loadKeystrokeAgentsBlurb() {
70
- try {
71
- return normalizeBlurb(await readFile(resolveBundledKeystrokeAgentsBlurbPath(), "utf-8"));
72
- } catch (error) {
73
- throw new CliExitError("Could not load the bundled Keystroke AGENTS.md blurb. Reinstall the CLI or republish @keystrokehq/cli with AGENTS-blurb.md.", { cause: error });
74
- }
75
- }
76
- async function ensureAgentsMarkdown(targetDir, blurb) {
77
- const agentsFilePath = path$1.join(targetDir, AGENTS_FILENAME);
78
- const normalizedBlurb = normalizeBlurb(blurb);
79
- try {
80
- const normalizedExisting = normalizeLineEndings(await readFile(agentsFilePath, "utf-8"));
81
- if (normalizedExisting.includes(normalizedBlurb.trim())) return "skipped";
82
- await writeFile(agentsFilePath, normalizedExisting.trim().length > 0 ? `${normalizedExisting.trimEnd()}\n\n${normalizedBlurb}` : normalizedBlurb, "utf-8");
83
- return "updated";
84
- } catch {
85
- await writeFile(agentsFilePath, normalizedBlurb, "utf-8");
86
- return "created";
87
- }
60
+ return null;
88
61
  }
89
62
  //#endregion
90
63
  //#region src/commands/init/templates/biome-config.ts
@@ -231,6 +204,7 @@ function createPackageJsonContent(projectName, options) {
231
204
  lint: "biome check ."
232
205
  },
233
206
  dependencies: {
207
+ "@keystrokehq/config": options.configVersionRange,
234
208
  "@keystrokehq/core": options.workflowCoreVersionRange,
235
209
  zod: "^4.3.6"
236
210
  },
@@ -337,12 +311,13 @@ async function promptProjectDescription(options) {
337
311
  const t = typeof answer === "string" ? answer.trim() : "";
338
312
  return t.length > 0 ? t : void 0;
339
313
  }
340
- async function ensureScaffoldPackageJson(targetDir, projectName, workflowCoreRange) {
314
+ async function ensureScaffoldPackageJson(targetDir, projectName, workflowCoreRange, configRange) {
341
315
  const pkgPath = path.join(targetDir, "package.json");
342
316
  try {
343
317
  const raw = await readFile(pkgPath, "utf-8");
344
318
  const pkg = JSON.parse(raw);
345
319
  pkg.dependencies = pkg.dependencies ?? {};
320
+ pkg.dependencies["@keystrokehq/config"] = configRange;
346
321
  pkg.dependencies["@keystrokehq/core"] = workflowCoreRange;
347
322
  pkg.dependencies.zod = pkg.dependencies.zod ?? "^4.3.6";
348
323
  pkg.devDependencies = pkg.devDependencies ?? {};
@@ -352,10 +327,35 @@ async function ensureScaffoldPackageJson(targetDir, projectName, workflowCoreRan
352
327
  await writeFile(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf-8");
353
328
  return "updated";
354
329
  } catch {
355
- await writeFile(pkgPath, `${createPackageJsonContent(projectName, { workflowCoreVersionRange: workflowCoreRange })}\n`, "utf-8");
330
+ await writeFile(pkgPath, `${createPackageJsonContent(projectName, {
331
+ configVersionRange: configRange,
332
+ workflowCoreVersionRange: workflowCoreRange
333
+ })}\n`, "utf-8");
356
334
  return "created";
357
335
  }
358
336
  }
337
+ async function installAgentSkillsForInit(targetDir, options) {
338
+ try {
339
+ const choices = await resolveSkillInstallChoices({
340
+ agentSlugs: options.agent,
341
+ method: options.method
342
+ });
343
+ const result = await installKeystrokeAgentSkills({
344
+ projectDir: targetDir,
345
+ agentSlugs: choices.agentSlugs,
346
+ method: choices.method
347
+ });
348
+ if (result.ok) {
349
+ summarizeSkillInstall(result, "Installed");
350
+ return;
351
+ }
352
+ if (result.reason === "not_installed") throw new CliExitError("Could not resolve @keystrokehq/skills from the installed CLI. Reinstall the CLI, then run `keystroke skills sync`.");
353
+ throw new CliExitError(`@keystrokehq/skills is installed at ${result.packageRoot} but no skill directories with SKILL.md were found.`);
354
+ } catch (error) {
355
+ if (error instanceof UnknownSkillAgentError) throw new CliExitError(error.message, { cause: error });
356
+ throw error;
357
+ }
358
+ }
359
359
  async function handleInit(options, ctx) {
360
360
  const targetDir = path.resolve(options.path ?? process.cwd());
361
361
  const client = requireClient(ctx);
@@ -404,10 +404,11 @@ async function handleInit(options, ctx) {
404
404
  ui.hint(`Project "${projectName}" is now tracked.`);
405
405
  ui.hint(`Project ID: ${projectId}`);
406
406
  await trackProject(targetDir, { name: projectName });
407
- const agentsAction = await ensureAgentsMarkdown(targetDir, await loadKeystrokeAgentsBlurb());
408
- if (agentsAction === "created") ui.success("Created AGENTS.md with Keystroke project guidance.");
409
- else if (agentsAction === "updated") ui.success("Updated AGENTS.md with Keystroke project guidance.");
410
- if (options.scaffold) await scaffoldProject(targetDir, projectName, await workflowCoreScaffoldVersionRange());
407
+ await installAgentSkillsForInit(targetDir, options);
408
+ if (options.scaffold) {
409
+ const [workflowCoreVersionRange, configVersionRange] = await Promise.all([workflowCoreScaffoldVersionRange(), configScaffoldVersionRange()]);
410
+ await scaffoldProject(targetDir, projectName, workflowCoreVersionRange, configVersionRange);
411
+ }
411
412
  }
412
413
  /** Write a file only if it does not already exist. Returns true if written. */
413
414
  async function writeIfMissing(filePath, content) {
@@ -419,15 +420,9 @@ async function writeIfMissing(filePath, content) {
419
420
  return true;
420
421
  }
421
422
  }
422
- async function trySyncAgentSkillsAfterScaffold(targetDir) {
423
- const syncResult = await syncKeystrokeAgentSkills(targetDir);
424
- if (syncResult.ok) ui.success(`Synced ${syncResult.copied.length} skill(s) to .cursor/skills and .claude/skills: ${syncResult.copied.join(", ")}`);
425
- else if (syncResult.reason === "not_installed") ui.hint("After install completes, run `keystroke skills sync` to copy @keystrokehq/skills for Cursor / Claude Code.");
426
- else ui.warn(`@keystrokehq/skills is installed at ${syncResult.packageRoot} but no skill directories with SKILL.md were found.`);
427
- }
428
- async function scaffoldProject(targetDir, projectName, workflowCoreVersionRange) {
429
- const pkgAction = await ensureScaffoldPackageJson(targetDir, projectName, workflowCoreVersionRange);
430
- ui.success(pkgAction === "created" ? `Created package.json (@keystrokehq/core ${workflowCoreVersionRange})` : `Updated package.json (Keystroke deps -> core ${workflowCoreVersionRange})`);
423
+ async function scaffoldProject(targetDir, projectName, workflowCoreVersionRange, configVersionRange) {
424
+ const pkgAction = await ensureScaffoldPackageJson(targetDir, projectName, workflowCoreVersionRange, configVersionRange);
425
+ ui.success(pkgAction === "created" ? `Created package.json (@keystrokehq/core ${workflowCoreVersionRange}, @keystrokehq/config ${configVersionRange})` : `Updated package.json (Keystroke deps -> core ${workflowCoreVersionRange}, config ${configVersionRange})`);
431
426
  const files = [
432
427
  {
433
428
  rel: "vitest.config.ts",
@@ -479,7 +474,6 @@ async function scaffoldProject(targetDir, projectName, workflowCoreVersionRange)
479
474
  if (created.length > 0) ui.success(`Scaffolded ${created.length} file(s): ${created.join(", ")}`);
480
475
  else ui.hint("Scaffold files already exist — skipped (package.json was still updated).");
481
476
  ui.hint("Run `pnpm install` to install dependencies, then `pnpm test` to run tests (or use your lockfile's package manager).");
482
- await trySyncAgentSkillsAfterScaffold(targetDir);
483
477
  }
484
478
  //#endregion
485
479
  export { handleInit };
@@ -4,8 +4,8 @@ import { N as throwReportedCliExit, f as ANSI, n as ui, p as style, x as toError
4
4
  import { d as trackProject } from "./dist-BF6r1hfv.mjs";
5
5
  import { i as writeJson } from "./output-CGdYhH0p.mjs";
6
6
  import { i as requireClient, t as assertProjectConfigMatchesAuthenticatedOrg } from "./context-B1L8pZsH.mjs";
7
- import { i as resolveTypeHint } from "./schema-display-B0LmISCe.mjs";
8
- import { n as resolveLocalWorkflowManifest, r as resolveProjectContext, t as lookupCurrentDeploymentWorkflow } from "./current-deployment-workflow-Biw1zV7S.mjs";
7
+ import { i as resolveTypeHint } from "./schema-display-CNqiYBIb.mjs";
8
+ import { n as resolveLocalWorkflowManifest, r as resolveProjectContext, t as lookupCurrentDeploymentWorkflow } from "./current-deployment-workflow-BRUEdPrN.mjs";
9
9
  import dayjs from "dayjs";
10
10
  //#region src/commands/workflows/inspect/inspect-display.ts
11
11
  function formatBuildTimestamp(iso) {
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { n as JsonOptionSchema, t as JSON_OPTION_CONFIG } from "./output-CGdYhH0p.mjs";
4
- import { t as createTypedCommand } from "./commander-i-7LgOyc.mjs";
5
- import { t as ConnectionKindValues } from "./api-Sf7A0I5T.mjs";
4
+ import { t as createTypedCommand } from "./commander-D15UZVjp.mjs";
5
+ import { t as ConnectionKindValues } from "./api-jkf0TTgD.mjs";
6
6
  import { z } from "zod";
7
7
  //#region src/commands/integrations/integrations.command.ts
8
8
  const IntegrationsListOptionsSchema = JsonOptionSchema.extend({
@@ -47,20 +47,20 @@ function createIntegrationsCommand() {
47
47
  description: "List Keystroke integrations available to your organization",
48
48
  schema: IntegrationsListOptionsSchema,
49
49
  optionsConfig: INTEGRATIONS_LIST_OPTIONS_CONFIG,
50
- loadHandler: async () => (await import("./list.handler-C7AChEPW.mjs")).handleIntegrationsList,
50
+ loadHandler: async () => (await import("./list.handler-BjutlIkE.mjs")).handleIntegrationsList,
51
51
  subcommands: [createTypedCommand({
52
52
  name: "list",
53
53
  description: "List Keystroke integrations available to your organization",
54
54
  schema: IntegrationsListOptionsSchema,
55
55
  optionsConfig: INTEGRATIONS_LIST_OPTIONS_CONFIG,
56
- loadHandler: async () => (await import("./list.handler-C7AChEPW.mjs")).handleIntegrationsList
56
+ loadHandler: async () => (await import("./list.handler-BjutlIkE.mjs")).handleIntegrationsList
57
57
  }), createTypedCommand({
58
58
  name: "register",
59
59
  description: "Register a workspace provider app for future workspace-authored OAuth support",
60
60
  schema: IntegrationsRegisterOptionsSchema,
61
61
  optionsConfig: INTEGRATIONS_REGISTER_OPTIONS_CONFIG,
62
62
  handler: async (opts, ctx) => {
63
- const { handleIntegrationsRegister } = await import("./register.handler-CttgzybN.mjs");
63
+ const { handleIntegrationsRegister } = await import("./register.handler-BAx0IC-u.mjs");
64
64
  await handleIntegrationsRegister({
65
65
  integrationId: opts.integrationId,
66
66
  clientAppCredentialSetId: opts.clientApp,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { n as JsonOptionSchema, t as JSON_OPTION_CONFIG } from "./output-CGdYhH0p.mjs";
4
- import { t as createTypedCommand } from "./commander-i-7LgOyc.mjs";
4
+ import { t as createTypedCommand } from "./commander-D15UZVjp.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-BSyrxCma.mjs")).handleInvitesList,
22
+ loadHandler: async () => (await import("./list.handler-FlchXrKz.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-BSyrxCma.mjs")).handleInvitesList
28
+ loadHandler: async () => (await import("./list.handler-FlchXrKz.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-BsZQqmzU.mjs")).handleInvitesAccept
39
+ loadHandler: async () => (await import("./accept.handler-BPwp_UAE.mjs")).handleInvitesAccept
40
40
  })]
41
41
  });
42
42
  }
@@ -13,7 +13,7 @@ import { config } from "dotenv";
13
13
  import { z } from "zod";
14
14
  import { log } from "@clack/prompts";
15
15
  //#region package.json
16
- var version = "0.0.14";
16
+ var version = "0.0.16";
17
17
  //#endregion
18
18
  //#region src/command-registry.ts
19
19
  const ROOT_OPTIONS_WITH_VALUES$1 = new Set([
@@ -25,84 +25,84 @@ const ROOT_VERSION_FLAGS = new Set(["-V", "--version"]);
25
25
  const lazyCommandDefinitions = [
26
26
  {
27
27
  name: "agents",
28
- loadCommand: async () => (await import("./agents-BdzwXAI1.mjs")).createAgentsCommand()
28
+ loadCommand: async () => (await import("./agents-CbmvvOAx.mjs")).createAgentsCommand()
29
29
  },
30
30
  {
31
31
  name: "admin",
32
- loadCommand: async () => (await import("./admin-CXQezpQA.mjs")).createAdminCommand()
32
+ loadCommand: async () => (await import("./admin-Bb9Hx-gO.mjs")).createAdminCommand()
33
33
  },
34
34
  {
35
35
  name: "api-keys",
36
- loadCommand: async () => (await import("./api-keys-BZmUiIEr.mjs")).createApiKeysCommand()
36
+ loadCommand: async () => (await import("./api-keys-DJlyIf10.mjs")).createApiKeysCommand()
37
37
  },
38
38
  {
39
39
  name: "auth",
40
- loadCommand: async () => (await import("./auth-CGBgi6PG.mjs")).createAuthCommand()
40
+ loadCommand: async () => (await import("./auth-DpDEkJz7.mjs")).createAuthCommand()
41
41
  },
42
42
  {
43
43
  name: "connect",
44
- loadCommand: async () => (await import("./connect-BcTkRZ10.mjs")).createConnectCommand()
44
+ loadCommand: async () => (await import("./connect-DzSNDSmI.mjs")).createConnectCommand()
45
45
  },
46
46
  {
47
47
  name: "credentials",
48
- loadCommand: async () => (await import("./credentials-BsEHWMBh.mjs")).createCredentialsCommand(),
48
+ loadCommand: async () => (await import("./credentials-VidBoOd7.mjs")).createCredentialsCommand(),
49
49
  copyInheritedSettings: true
50
50
  },
51
51
  {
52
52
  name: "org",
53
- loadCommand: async () => (await import("./org-8bkIZAJ4.mjs")).createOrgCommand()
53
+ loadCommand: async () => (await import("./org-DUCts2MV.mjs")).createOrgCommand()
54
54
  },
55
55
  {
56
56
  name: "deploy",
57
- loadCommand: async () => (await import("./deploy-DVE7Mx_X.mjs")).createDeployCommand()
57
+ loadCommand: async () => (await import("./deploy-eshEEiP-.mjs")).createDeployCommand()
58
58
  },
59
59
  {
60
60
  name: "init",
61
- loadCommand: async () => (await import("./init-CxMQ2ysa.mjs")).createInitCommand()
61
+ loadCommand: async () => (await import("./init-PTwX63_P.mjs")).createInitCommand()
62
62
  },
63
63
  {
64
64
  name: "integrations",
65
- loadCommand: async () => (await import("./integrations-DUlJhGUS.mjs")).createIntegrationsCommand()
65
+ loadCommand: async () => (await import("./integrations-B0Gv-L0s.mjs")).createIntegrationsCommand()
66
66
  },
67
67
  {
68
68
  name: "invites",
69
- loadCommand: async () => (await import("./invites-BlB-hKUE.mjs")).createInvitesCommand()
69
+ loadCommand: async () => (await import("./invites-Cqi7iyIN.mjs")).createInvitesCommand()
70
70
  },
71
71
  {
72
72
  name: "logs",
73
- loadCommand: async () => (await import("./logs-NI-DyeFY.mjs")).createLogsCommand()
73
+ loadCommand: async () => (await import("./logs-DUwdYZB-.mjs")).createLogsCommand()
74
74
  },
75
75
  {
76
76
  name: "listen",
77
- loadCommand: async () => (await import("./listen-drcHFcKq.mjs")).createListenCommand()
77
+ loadCommand: async () => (await import("./listen-rHLiCWbn.mjs")).createListenCommand()
78
78
  },
79
79
  {
80
80
  name: "projects",
81
- loadCommand: async () => (await import("./projects-Pp5ENoyh.mjs")).createProjectsCommand()
81
+ loadCommand: async () => (await import("./projects-CbquwUlm.mjs")).createProjectsCommand()
82
82
  },
83
83
  {
84
84
  name: "runs",
85
- loadCommand: async () => (await import("./runs-Bs8VzL8P.mjs")).createRunsCommand()
85
+ loadCommand: async () => (await import("./runs-Bc3zjk7V.mjs")).createRunsCommand()
86
86
  },
87
87
  {
88
88
  name: "skills",
89
- loadCommand: async () => (await import("./skills.command-B8yExFCn.mjs")).createSkillsCommand()
89
+ loadCommand: async () => (await import("./skills.command-DuL4kLUi.mjs")).createSkillsCommand()
90
90
  },
91
91
  {
92
92
  name: "sync",
93
- loadCommand: async () => (await import("./sync-BSL1s6PR.mjs")).createSyncCommand()
93
+ loadCommand: async () => (await import("./sync-Pssitj6K.mjs")).createSyncCommand()
94
94
  },
95
95
  {
96
96
  name: "test",
97
- loadCommand: async () => (await import("./test-BIz-oBxy.mjs")).createTestCommand()
97
+ loadCommand: async () => (await import("./test-BISghlKg.mjs")).createTestCommand()
98
98
  },
99
99
  {
100
100
  name: "upgrade",
101
- loadCommand: async () => (await import("./upgrade-f97U8Rll.mjs")).createUpgradeCommand()
101
+ loadCommand: async () => (await import("./upgrade-cH9I_pZq.mjs")).createUpgradeCommand()
102
102
  },
103
103
  {
104
104
  name: "workflows",
105
- loadCommand: async () => (await import("./workflows-ixllXKLo.mjs")).createWorkflowsCommand()
105
+ loadCommand: async () => (await import("./workflows-CL1jYSLR.mjs")).createWorkflowsCommand()
106
106
  }
107
107
  ];
108
108
  function selectCommandRegistration(argv, commandNames = new Set(lazyCommandDefinitions.map((definition) => definition.name))) {
@@ -3,8 +3,8 @@
3
3
  import { N as throwReportedCliExit, a as getProcessEnv, n as ui } from "./keystroke.mjs";
4
4
  import { i as writeJson } from "./output-CGdYhH0p.mjs";
5
5
  import { i as requireClient } from "./context-B1L8pZsH.mjs";
6
- import { a as readManifestsFromOutDir } from "./dist-BVD3Ga_l.mjs";
7
- import { n as resolveWorkflowsDir } from "./resolve-project-CI_PxRXi.mjs";
6
+ import { a as readManifestsFromOutDir } from "./dist-FQYQ2FLm.mjs";
7
+ import { n as resolveWorkflowsDir } from "./resolve-project-CURYMjex.mjs";
8
8
  import { t as readCredentialEnvMap } from "./credential-env-map-B2nVJXPn.mjs";
9
9
  import { a as loadProjectDotenvFile, i as enrichServerCredentialRow, l as renderCredentialListBlocks, n as buildSyntheticNotOnServerRows, r as collectMergedManifestGroups, t as buildCredentialWorkflowConsumersByGroup } from "./list-enrichment-C6u5eI0j.mjs";
10
10
  import dayjs from "dayjs";
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { f as ANSI, n as ui, p as style } from "./keystroke.mjs";
4
4
  import { s as readStoredProjects } from "./dist-BF6r1hfv.mjs";
5
- import { i as readProjectConfig } from "./project-config-CJGSh2RQ.mjs";
5
+ import { i as readProjectConfig } from "./project-config-CsBMT4TL.mjs";
6
6
  import { i as writeJson } from "./output-CGdYhH0p.mjs";
7
7
  import { access } from "node:fs/promises";
8
8
  import Table from "cli-table3";
@@ -3,16 +3,16 @@
3
3
  import { N as throwReportedCliExit, f as ANSI, n as ui, p as style } from "./keystroke.mjs";
4
4
  import { d as trackProject } from "./dist-BF6r1hfv.mjs";
5
5
  import { i as writeJson } from "./output-CGdYhH0p.mjs";
6
- import { t as requireWorkflowsDir } from "./resolve-project-CI_PxRXi.mjs";
7
- import { t as createSpinnerProgress } from "./spinner-progress-DpL68vYK.mjs";
8
- import { a as runWorkflowBuild, n as renderBuildFailure } from "./workflow-build-C_qkq7jk.mjs";
6
+ import { t as requireWorkflowsDir } from "./resolve-project-CURYMjex.mjs";
7
+ import { t as createSpinnerProgress } from "./spinner-progress-DfkMzwGx.mjs";
8
+ import { a as runWorkflowBuild, n as renderBuildFailure } from "./workflow-build-C9rQQ4qU.mjs";
9
9
  //#region src/commands/workflows/list.handler.ts
10
10
  function formatWorkflow(artifact) {
11
11
  const name = style(artifact.manifest.name, `${ANSI.bold}${ANSI.cyan}`);
12
12
  const filePath = style(artifact.workflow.resolvedFilePath, ANSI.dim);
13
13
  const lines = [` ${name}`, ` ${filePath}`];
14
14
  if (artifact.manifest.description) lines.push(` ${artifact.manifest.description}`);
15
- lines.push(` ${style(`$ keystroke workflows try-deploy "${artifact.manifest.name}"`, ANSI.dim)}`);
15
+ lines.push(` ${style(`$ keystroke workflows test "${artifact.manifest.name}"`, ANSI.dim)}`);
16
16
  return lines.join("\n");
17
17
  }
18
18
  async function handleWorkflowsList(options, ctx) {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { n as JsonOptionSchema, t as JSON_OPTION_CONFIG } from "./output-CGdYhH0p.mjs";
4
- import { t as createTypedCommand } from "./commander-i-7LgOyc.mjs";
4
+ import { t as createTypedCommand } from "./commander-D15UZVjp.mjs";
5
5
  import { z } from "zod";
6
6
  //#region src/commands/listen/listen.command.ts
7
7
  const ListenOptionsSchema = JsonOptionSchema.extend({ timeout: z.coerce.number().int().min(1).default(300) });
@@ -18,7 +18,7 @@ function createListenCommand() {
18
18
  description: "Listen for one incoming request and print its body",
19
19
  schema: ListenOptionsSchema,
20
20
  optionsConfig: LISTEN_OPTIONS_CONFIG,
21
- loadHandler: async () => (await import("./listen.handler-DjK6RlLf.mjs")).handleListen
21
+ loadHandler: async () => (await import("./listen.handler-B9T58yAj.mjs")).handleListen
22
22
  });
23
23
  }
24
24
  //#endregion
@@ -3,7 +3,7 @@
3
3
  import { N as throwReportedCliExit, f as ANSI, k as CliExitError, n as ui, p as style, x as toErrorMessage } from "./keystroke.mjs";
4
4
  import { a as writeJsonError, i as writeJson } from "./output-CGdYhH0p.mjs";
5
5
  import { i as requireClient } from "./context-B1L8pZsH.mjs";
6
- import { n as sleep } from "./run-polling-BPmB5N5A.mjs";
6
+ import { n as sleep } from "./run-polling-CwlzB5-9.mjs";
7
7
  import { spawn } from "node:child_process";
8
8
  //#region src/lib/clipboard.ts
9
9
  function getClipboardCommands() {
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { t as createTypedCommand } from "./commander-i-7LgOyc.mjs";
3
+ import { t as createTypedCommand } from "./commander-D15UZVjp.mjs";
4
4
  import { z } from "zod";
5
5
  //#region src/commands/logs/logs.command.ts
6
6
  const LogsOptionsSchema = z.object({ count: z.coerce.number().int().min(1).max(1e3).default(100).describe("Number of log entries to display") });
@@ -14,13 +14,13 @@ function createLogsCommand() {
14
14
  description: "Display recent CLI log entries",
15
15
  schema: LogsOptionsSchema,
16
16
  optionsConfig: LOGS_OPTIONS_CONFIG,
17
- loadHandler: async () => (await import("./logs.handler-BqmZ4eLx.mjs")).handleLogs,
17
+ loadHandler: async () => (await import("./logs.handler-dcRq-zoc.mjs")).handleLogs,
18
18
  subcommands: [createTypedCommand({
19
19
  name: "clear",
20
20
  description: "Delete the CLI log file",
21
21
  schema: z.object({}),
22
22
  optionsConfig: {},
23
- loadHandler: async () => (await import("./clear.handler-BieI9Oix.mjs")).handleLogsClear
23
+ loadHandler: async () => (await import("./clear.handler-CtOZ4aRn.mjs")).handleLogsClear
24
24
  })]
25
25
  });
26
26
  }
@@ -3,7 +3,7 @@
3
3
  import { N as throwReportedCliExit, f as ANSI, n as ui, p as style, x as toErrorMessage } from "./keystroke.mjs";
4
4
  import { i as writeJson } from "./output-CGdYhH0p.mjs";
5
5
  import { i as requireClient } from "./context-B1L8pZsH.mjs";
6
- import { n as sleep, t as TERMINAL_STATUSES } from "./run-polling-BPmB5N5A.mjs";
6
+ import { n as sleep, t as TERMINAL_STATUSES } from "./run-polling-CwlzB5-9.mjs";
7
7
  import Table from "cli-table3";
8
8
  //#region src/commands/workflows/_shared/run-query.ts
9
9
  async function listRunsByWorkflowRef(client, options) {
@@ -5738,7 +5738,7 @@ var require_out = /* @__PURE__ */ __commonJSMin(((exports, module) => {
5738
5738
  module.exports = FastGlob;
5739
5739
  }));
5740
5740
  //#endregion
5741
- //#region ../../packages/workflow-builder/dist/metadata-layout-C6ed-9dl.mjs
5741
+ //#region ../../packages/workflow-builder/dist/metadata-layout-Bv-B0nHj.mjs
5742
5742
  var import_out = /* @__PURE__ */ __toESM(require_out(), 1);
5743
5743
  createRequire(import.meta.url);
5744
5744
  async function computeBuilderFingerprint(packageRoot) {