@keystrokehq/cli 0.0.15 → 0.0.17

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 (81) hide show
  1. package/README.md +11 -1
  2. package/dist/{admin-CXQezpQA.mjs → admin-Bb9Hx-gO.mjs} +1 -1
  3. package/dist/{agents-CWGz8CR-.mjs → agents-CbmvvOAx.mjs} +2 -2
  4. package/dist/{api-keys-BZmUiIEr.mjs → api-keys-DJlyIf10.mjs} +1 -1
  5. package/dist/{auth-CGBgi6PG.mjs → auth-DpDEkJz7.mjs} +1 -1
  6. package/dist/{build-agents-DseUtzd4-DBQ82ErJ.mjs → build-agents-DseUtzd4-VYWtIZy9.mjs} +2 -2
  7. package/dist/{build-tasks-GVuMLS0h-CWrrj8SF.mjs → build-tasks-GVuMLS0h-p08mMOyK.mjs} +2 -2
  8. package/dist/{build-workflows-CV4tBo6S-B4SPp86e.mjs → build-workflows-CV4tBo6S-knCnBKTc.mjs} +2 -2
  9. package/dist/{build.handler-DqnngAkl.mjs → build.handler-BNSC_zhQ.mjs} +1 -1
  10. package/dist/{commander-i-7LgOyc.mjs → commander-D15UZVjp.mjs} +1 -1
  11. package/dist/{connect-CS6sqNfA.mjs → connect-DzSNDSmI.mjs} +1 -1
  12. package/dist/{credentials-1CPFwx-k.mjs → credentials-VidBoOd7.mjs} +1 -1
  13. package/dist/{current-deployment-workflow-CUBHcdZl.mjs → current-deployment-workflow-BRUEdPrN.mjs} +1 -1
  14. package/dist/{deploy-DwRwyVwR.mjs → deploy-eshEEiP-.mjs} +2 -2
  15. package/dist/{deploy.handler-zMb-BHLo.mjs → deploy.handler-BxxWI7nV.mjs} +6 -6
  16. package/dist/{diff.handler-C-XqswH5.mjs → diff.handler-CzrKCj7N.mjs} +1 -1
  17. package/dist/{init-QhRFud0x.mjs → init-CWFJdKNs.mjs} +15 -3
  18. package/dist/{init.handler-Beu-vpIu.mjs → init.handler-BZSoM76V.mjs} +27 -62
  19. package/dist/{inspect.handler-ULT2jiVU.mjs → inspect.handler-umc7of-r.mjs} +1 -1
  20. package/dist/{integrations-6BiywCph.mjs → integrations-DKtl_aES.mjs} +10 -5
  21. package/dist/{invites-BlB-hKUE.mjs → invites-Cqi7iyIN.mjs} +4 -4
  22. package/dist/keystroke.mjs +21 -21
  23. package/dist/{list.handler-C7AChEPW.mjs → list.handler-DYdNWjgk.mjs} +55 -9
  24. package/dist/{list2.handler-L3BKR5ok.mjs → list2.handler-T5v4EK20.mjs} +1 -1
  25. package/dist/{listen-Tx2SrMyo.mjs → listen-rHLiCWbn.mjs} +2 -2
  26. package/dist/{listen.handler-C7AqsKLf.mjs → listen.handler-B9T58yAj.mjs} +1 -1
  27. package/dist/{logs-NI-DyeFY.mjs → logs-DUwdYZB-.mjs} +3 -3
  28. package/dist/{logs.handler-BGJU1p3H.mjs → logs.handler-DGcGN2qb.mjs} +1 -1
  29. package/dist/{org-8bkIZAJ4.mjs → org-DUCts2MV.mjs} +15 -15
  30. package/dist/{projects-B5MRnbHS.mjs → projects-CbquwUlm.mjs} +4 -4
  31. package/dist/{run-polling-BwyyKDwg.mjs → run-polling-BWcLQvm0.mjs} +1 -1
  32. package/dist/{run.handler-TJNyF_p_.mjs → run.handler-BiBDLoeH.mjs} +2 -2
  33. package/dist/{runs-Bs8VzL8P.mjs → runs-Bc3zjk7V.mjs} +1 -1
  34. package/dist/skill-installer-DkRJ6oLi.mjs +506 -0
  35. package/dist/{skills-sync.handler-DXF6IgEX.mjs → skills-sync.handler-C4ztv1Vu.mjs} +20 -7
  36. package/dist/skills.command-DuL4kLUi.mjs +49 -0
  37. package/dist/{skills.handler-CPKCf9ZK.mjs → skills.handler-R5KAbioE.mjs} +1 -1
  38. package/dist/{sync-BZj7Dkhq.mjs → sync-Pssitj6K.mjs} +2 -2
  39. package/dist/{sync.handler-Kk4R2lJ_.mjs → sync.handler-Be0U3x-n.mjs} +1 -1
  40. package/dist/{task-target-build-Du0ObGbb.mjs → task-target-build-BG6cC3bz.mjs} +3 -3
  41. package/dist/task-target-deploy-runner.mjs +4 -4
  42. package/dist/{test-CJ8Vx_h5.mjs → test-CKBpp1gg.mjs} +2 -2
  43. package/dist/{test.handler-BTn4NFmU.mjs → test.handler-DkizZhVu.mjs} +2 -2
  44. package/dist/{tool.handler-CuxoCstV.mjs → tool.handler--IzRGelu.mjs} +84 -84
  45. package/dist/{trigger-artifacts-RizI57RC-abdkW8-z.mjs → trigger-artifacts-RizI57RC-CxHwCkQ_.mjs} +2 -2
  46. package/dist/types-D04ah3uY.mjs +6 -0
  47. package/dist/{upgrade-CdA_Sw4F.mjs → upgrade-cH9I_pZq.mjs} +2 -2
  48. package/dist/{validate.handler-COJ53qWJ.mjs → validate.handler-I8LY-UkG.mjs} +1 -1
  49. package/dist/{workflow-build-kNNcU-R8.mjs → workflow-build-C9rQQ4qU.mjs} +5 -5
  50. package/dist/{workflow-bundler-BzHk73PM-CRcJvu9a.mjs → workflow-bundler-BzHk73PM-AIB4-u4Y.mjs} +1 -1
  51. package/dist/{workflows-D04CqpO-.mjs → workflows-CL1jYSLR.mjs} +12 -12
  52. package/package.json +6 -6
  53. package/dist/skills.command-B8yExFCn.mjs +0 -35
  54. package/dist/sync-keystroke-agent-skills-ChUj1LnK.mjs +0 -66
  55. /package/dist/{accept.handler-BsZQqmzU.mjs → accept.handler-BPwp_UAE.mjs} +0 -0
  56. /package/dist/{build-metadata-C8Ra_Gi--CTCBRjFA.mjs → build-metadata-C8Ra_Gi--BdoyLQMl.mjs} +0 -0
  57. /package/dist/{clear-cache.handler-Bkt6GKnF.mjs → clear-cache.handler-gr5VmEYB.mjs} +0 -0
  58. /package/dist/{clear.handler-BieI9Oix.mjs → clear.handler-CtOZ4aRn.mjs} +0 -0
  59. /package/dist/{current.handler-C48q2mBd.mjs → current.handler-QZQ-l84v.mjs} +0 -0
  60. /package/dist/{deploy-D4ILrWpx.mjs → deploy-CJbVB7e2.mjs} +0 -0
  61. /package/dist/{detect-env-access-CwkOYeYM-BLtKepjx.mjs → detect-env-access-CwkOYeYM-CZIixHeR.mjs} +0 -0
  62. /package/dist/{env.handler-DK3B7MLl.mjs → env.handler-B3YDQIVE.mjs} +0 -0
  63. /package/dist/{invites.list.handler-DmeMcezN.mjs → invites.list.handler-CErgY35S.mjs} +0 -0
  64. /package/dist/{invites.resend.handler-pJTPtKHE.mjs → invites.resend.handler-DRCRIA4F.mjs} +0 -0
  65. /package/dist/{invites.revoke.handler-4NgnnfiU.mjs → invites.revoke.handler-C0FZdAR0.mjs} +0 -0
  66. /package/dist/{list.handler-BuX-bb2y.mjs → list.handler-Cr_DFAae.mjs} +0 -0
  67. /package/dist/{list.handler-BSyrxCma.mjs → list.handler-FlchXrKz.mjs} +0 -0
  68. /package/dist/{list.handler-U9-KuVlh.mjs → list.handler-c-8RpgB9.mjs} +0 -0
  69. /package/dist/{logs.handler-BqmZ4eLx.mjs → logs.handler-dcRq-zoc.mjs} +0 -0
  70. /package/dist/{members.add.handler-B4H8Hn6x.mjs → members.add.handler-DmYI43rZ.mjs} +0 -0
  71. /package/dist/{members.invite.handler-D8ONlt4Y.mjs → members.invite.handler-B_KVxv5m.mjs} +0 -0
  72. /package/dist/{members.list.handler-BHJTMMiA.mjs → members.list.handler-BtuuIgQS.mjs} +0 -0
  73. /package/dist/{members.remove.handler-_hKd_sFd.mjs → members.remove.handler-Lvg-CqVv.mjs} +0 -0
  74. /package/dist/{members.update.handler-CC7J0k8n.mjs → members.update.handler-D-8izeso.mjs} +0 -0
  75. /package/dist/{paused.handler-9ND-i2EN.mjs → paused.handler-ST9dCe8E.mjs} +0 -0
  76. /package/dist/{read-credential-keys-77a91T8M-COvwpok_.mjs → read-credential-keys-77a91T8M-DMmY6oDW.mjs} +0 -0
  77. /package/dist/{register.handler-CttgzybN.mjs → register.handler-BAx0IC-u.mjs} +0 -0
  78. /package/dist/{run-polling-B4KvySvp.mjs → run-polling-CwlzB5-9.mjs} +0 -0
  79. /package/dist/{switch.handler-BFBM8rSi.mjs → switch.handler-CTwhIcaQ.mjs} +0 -0
  80. /package/dist/{task-target-deploy-OyxLvh3a.mjs → task-target-deploy-gMQC8kXU.mjs} +0 -0
  81. /package/dist/{upgrade.handler-C2eZ_tg3.mjs → upgrade.handler-CXEF4ue0.mjs} +0 -0
package/README.md CHANGED
@@ -87,7 +87,7 @@ keystroke --api-key sk_... --server-url https://api.example.com workflows list
87
87
  | `keystroke projects` | List or clear locally tracked projects. |
88
88
  | `keystroke runs inspect` | Inspect workflow and agent runs. |
89
89
  | `keystroke logs` | View or clear local CLI logs. |
90
- | `keystroke skills sync` | Sync installed Keystroke agent skills into editor skill folders. |
90
+ | `keystroke skills sync` | Sync bundled Keystroke agent skills into selected agent skill folders. |
91
91
  | `keystroke upgrade` | Upgrade the installed Keystroke CLI package. |
92
92
 
93
93
  Run `keystroke <command> --help` for exact arguments and flags.
@@ -106,8 +106,18 @@ Create a new project:
106
106
 
107
107
  ```bash
108
108
  keystroke init --path ./my-automation --name my-automation
109
+ keystroke init --path ./my-automation --name my-automation --agent claude-code --agent cursor --method symlink
109
110
  ```
110
111
 
112
+ `keystroke init` always installs the bundled Keystroke skills into `.agents/skills` and writes Keystroke project guidance to `AGENTS.md`. Use repeatable `--agent <agent>` flags to provision additional agent-specific skill directories and guidance files, such as `.claude/skills` plus `CLAUDE.md` for Claude Code. Use `--agent '*'` to target all supported project agents.
113
+
114
+ Skill install methods:
115
+
116
+ - `--method symlink` links selected agent skill folders back to the canonical `.agents/skills` copy.
117
+ - `--method copy` writes independent copies for selected agent folders.
118
+
119
+ Run `keystroke skills sync` with the same `--agent` and `--method` flags to refresh skills in an existing project.
120
+
111
121
  Build locally:
112
122
 
113
123
  ```bash
@@ -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 { t as OrgRoleSchema } from "./schema-_FQrHcIS.mjs";
6
6
  import { z } from "zod";
7
7
  //#region src/commands/admin/orgs.command.ts
@@ -3,11 +3,11 @@
3
3
  import { N as throwReportedCliExit, f as ANSI, n as ui, p as style, x as toErrorMessage } from "./keystroke.mjs";
4
4
  import { d as trackProject } from "./dist-BF6r1hfv.mjs";
5
5
  import { i as writeJson, n as JsonOptionSchema, t as JSON_OPTION_CONFIG } from "./output-CGdYhH0p.mjs";
6
- import { t as createTypedCommand } from "./commander-i-7LgOyc.mjs";
6
+ import { t as createTypedCommand } from "./commander-D15UZVjp.mjs";
7
7
  import { i as readAgentManifestsFromOutDir } from "./dist-FQYQ2FLm.mjs";
8
8
  import { t as requireWorkflowsDir } from "./resolve-project-CURYMjex.mjs";
9
9
  import { t as createSpinnerProgress } from "./spinner-progress-DfkMzwGx.mjs";
10
- import { a as runWorkflowBuild, n as renderBuildFailure } from "./workflow-build-kNNcU-R8.mjs";
10
+ import { a as runWorkflowBuild, n as renderBuildFailure } from "./workflow-build-C9rQQ4qU.mjs";
11
11
  import { i as resolveTypeHint } from "./schema-display-CNqiYBIb.mjs";
12
12
  import { z } from "zod";
13
13
  //#region src/commands/agents/inspect-display.ts
@@ -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/api-keys/api-keys.command.ts
7
7
  const ApiKeysCreateOptionsSchema = JsonOptionSchema.extend({ name: z.string().optional() });
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { n as DEFAULT_CLI_WEB_URL } from "./default-urls-BS4twrsS.mjs";
4
4
  import { S as AUTH_TIMEOUT_SECONDS } from "./keystroke.mjs";
5
- import { t as createTypedCommand } from "./commander-i-7LgOyc.mjs";
5
+ import { t as createTypedCommand } from "./commander-D15UZVjp.mjs";
6
6
  import { z } from "zod";
7
7
  //#region src/commands/auth/auth.command.ts
8
8
  const AuthOptionsSchema = z.object({
@@ -3,8 +3,8 @@
3
3
  import { n as readOptionalJsonSchemaKeys, t as manifestToDeclaredCredentialRequirement } from "./declared-credential-requirements-B6h4WRv4.mjs";
4
4
  import { t as AgentVersionManifestSchema } from "./agent-manifest-CZdlCTFs.mjs";
5
5
  import { i as createAgentSandboxPackage, n as AGENT_VM_PI_SKILLS_ROOT, r as AGENT_VM_TOOLS_RUNTIME_RELATIVE_PATH, t as AGENT_VM_HOST_CALL_RELATIVE_PATH } from "./agent-bundle-package-DWV6B_5q-rRTPU13L.mjs";
6
- import { t as readCredentialKeysFromSchemaObject } from "./read-credential-keys-77a91T8M-COvwpok_.mjs";
7
- import { t as bundleSandboxAgentTarget } from "./workflow-bundler-BzHk73PM-CRcJvu9a.mjs";
6
+ import { t as readCredentialKeysFromSchemaObject } from "./read-credential-keys-77a91T8M-DMmY6oDW.mjs";
7
+ import { t as bundleSandboxAgentTarget } from "./workflow-bundler-BzHk73PM-AIB4-u4Y.mjs";
8
8
  import { builtinModules } from "node:module";
9
9
  import { lstat, readFile, readdir, realpath } from "node:fs/promises";
10
10
  import path from "node:path";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { n as TaskBuildManifestSchema } from "./task-BNXDZU71.mjs";
4
- import { n as bundleWorkflowTarget } from "./workflow-bundler-BzHk73PM-CRcJvu9a.mjs";
5
- import { t as buildTriggerArtifacts } from "./trigger-artifacts-RizI57RC-abdkW8-z.mjs";
4
+ import { n as bundleWorkflowTarget } from "./workflow-bundler-BzHk73PM-AIB4-u4Y.mjs";
5
+ import { t as buildTriggerArtifacts } from "./trigger-artifacts-RizI57RC-CxHwCkQ_.mjs";
6
6
  import { performance } from "node:perf_hooks";
7
7
  //#region ../../packages/workflow-builder/dist/build-tasks-GVuMLS0h.mjs
8
8
  async function buildTaskArtifact(options) {
@@ -6,8 +6,8 @@ import { a as MANIFEST_FILE_NAME, i as FLOW_FILE_NAME, r as BUNDLE_FILE_NAME, s
6
6
  import { t as runWithConcurrency } from "./concurrency-gXn9Rw8x-BI6HQNfC.mjs";
7
7
  import { n as WorkflowLoaderProtocolError, r as WorkflowMetadataLoadError, s as createLoaderProtocolFailure } from "./import-module--8x5SLum-DaUNACER.mjs";
8
8
  import { r as toRelativeFilePath } from "./normalize-path-CojS-CgQ-DFTvyA27.mjs";
9
- import { n as bundleWorkflowTarget } from "./workflow-bundler-BzHk73PM-CRcJvu9a.mjs";
10
- import { t as buildTriggerArtifacts } from "./trigger-artifacts-RizI57RC-abdkW8-z.mjs";
9
+ import { n as bundleWorkflowTarget } from "./workflow-bundler-BzHk73PM-AIB4-u4Y.mjs";
10
+ import { t as buildTriggerArtifacts } from "./trigger-artifacts-RizI57RC-CxHwCkQ_.mjs";
11
11
  import { realpathSync } from "node:fs";
12
12
  import { readFile } from "node:fs/promises";
13
13
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@
3
3
  import { k as CliExitError } from "./keystroke.mjs";
4
4
  import { d as trackProject } from "./dist-BF6r1hfv.mjs";
5
5
  import { t as requireWorkflowsDir } from "./resolve-project-CURYMjex.mjs";
6
- import { a as runWorkflowBuild, i as renderBuildSummary, n as renderBuildFailure, r as renderBuildHeader } from "./workflow-build-kNNcU-R8.mjs";
6
+ import { a as runWorkflowBuild, i as renderBuildSummary, n as renderBuildFailure, r as renderBuildHeader } from "./workflow-build-C9rQQ4qU.mjs";
7
7
  import { t as createBuildProgress } from "./build-progress-BZivcVz4.mjs";
8
8
  import { t as withErrorBoundary } from "./error-boundary-CyLcinp1.mjs";
9
9
  //#region src/commands/workflows/build.handler.ts
@@ -20,7 +20,7 @@ function applyTypedOptionsToCommand(command, schema, optionsConfig, skipKeys) {
20
20
  const config = optionsConfig[key];
21
21
  if (!config) throw new Error(`Missing option configuration for key: ${String(key)}`);
22
22
  if (config.collect) {
23
- command.option(config.flag, config.description, (value, previous) => [...previous ?? [], value], []);
23
+ command.option(config.flag, config.description, (value, previous) => [...previous ?? [], value]);
24
24
  continue;
25
25
  }
26
26
  command.option(config.flag, config.description);
@@ -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/connect/connect.command.ts
7
7
  const ConnectOptionsSchema = JsonOptionSchema.extend({
@@ -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 { i as CredentialScopeValues, r as CredentialScopeSchema } from "./schema-O9xTWad_.mjs";
6
6
  import { z } from "zod";
7
7
  //#region src/commands/credentials/list/list.command.ts
@@ -5,7 +5,7 @@ import { t as assertWorkflowProjectRoot } from "./project-config-CsBMT4TL.mjs";
5
5
  import { a as readManifestsFromOutDir } from "./dist-FQYQ2FLm.mjs";
6
6
  import { t as requireWorkflowsDir } from "./resolve-project-CURYMjex.mjs";
7
7
  import { t as createSpinnerProgress } from "./spinner-progress-DfkMzwGx.mjs";
8
- import { a as runWorkflowBuild, n as renderBuildFailure } from "./workflow-build-kNNcU-R8.mjs";
8
+ import { a as runWorkflowBuild, n as renderBuildFailure } from "./workflow-build-C9rQQ4qU.mjs";
9
9
  //#region src/commands/workflows/_shared/current-deployment-workflow.ts
10
10
  /**
11
11
  * Lightweight resolution: gets projectId from keystroke.config.ts and authoredWorkflowId
@@ -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/deploy/deploy.command.ts
6
6
  /**
@@ -64,7 +64,7 @@ function createDeployCommand() {
64
64
  schema: DeployOptionsSchema,
65
65
  optionsConfig: DEPLOY_OPTIONS_CONFIG,
66
66
  contextMode: "auth",
67
- loadHandler: async () => (await import("./deploy.handler-zMb-BHLo.mjs")).handleDeploy
67
+ loadHandler: async () => (await import("./deploy.handler-BxxWI7nV.mjs")).handleDeploy
68
68
  });
69
69
  cmd.enablePositionalOptions();
70
70
  cmd.passThroughOptions();
@@ -6,11 +6,11 @@ import { t as assertWorkflowProjectRoot } from "./project-config-CsBMT4TL.mjs";
6
6
  import { r as requireAuthOptions, t as assertProjectConfigMatchesAuthenticatedOrg } from "./context-B1L8pZsH.mjs";
7
7
  import { i as readAgentManifestsFromOutDir, o as readWorkflowsFromDisk } from "./dist-FQYQ2FLm.mjs";
8
8
  import { t as requireWorkflowsDir } from "./resolve-project-CURYMjex.mjs";
9
- import { n as renderBuildFailure, r as renderBuildHeader } from "./workflow-build-kNNcU-R8.mjs";
9
+ import { n as renderBuildFailure, r as renderBuildHeader } from "./workflow-build-C9rQQ4qU.mjs";
10
10
  import { t as createBuildProgress } from "./build-progress-BZivcVz4.mjs";
11
11
  import { t as createDeployProgress } from "./deploy-progress-DJHph1Fz.mjs";
12
12
  import { t as withErrorBoundary } from "./error-boundary-CyLcinp1.mjs";
13
- import { t as lookupCurrentDeploymentWorkflow } from "./current-deployment-workflow-CUBHcdZl.mjs";
13
+ import { t as lookupCurrentDeploymentWorkflow } from "./current-deployment-workflow-BRUEdPrN.mjs";
14
14
  import { t as computeWorkflowDiff } from "./diff-utils-4OQTpP5s.mjs";
15
15
  import { access } from "node:fs/promises";
16
16
  import path from "node:path";
@@ -198,7 +198,7 @@ async function handleDeploy(options, ctx) {
198
198
  let outDir;
199
199
  let artifactFilter;
200
200
  try {
201
- const { runWorkflowBuild } = await import("./workflow-build-kNNcU-R8.mjs").then((n) => n.o);
201
+ const { runWorkflowBuild } = await import("./workflow-build-C9rQQ4qU.mjs").then((n) => n.o);
202
202
  const buildOutcome = await runWorkflowBuild({
203
203
  workflowsDir,
204
204
  verbose: options.verbose,
@@ -260,7 +260,7 @@ async function handleDeploy(options, ctx) {
260
260
  }
261
261
  async function handleTaskTargetDeploy(options) {
262
262
  renderBuildHeader(void 0);
263
- const buildResult = await (deployHandlerDependencies.buildTaskTargets ?? (await import("./task-target-build-Du0ObGbb.mjs")).buildTaskTargets)({
263
+ const buildResult = await (deployHandlerDependencies.buildTaskTargets ?? (await import("./task-target-build-BG6cC3bz.mjs")).buildTaskTargets)({
264
264
  projectRoot: options.workflowsDir,
265
265
  targetFiles: options.targetFiles,
266
266
  disableSourcemaps: options.options.disableSourcemaps
@@ -278,7 +278,7 @@ async function handleTaskTargetDeploy(options) {
278
278
  const progress = createDeployProgress();
279
279
  let result;
280
280
  try {
281
- result = await (deployHandlerDependencies.deployTaskTargets ?? (await import("./task-target-deploy-OyxLvh3a.mjs")).deployTaskTargets)({
281
+ result = await (deployHandlerDependencies.deployTaskTargets ?? (await import("./task-target-deploy-gMQC8kXU.mjs")).deployTaskTargets)({
282
282
  preparedTasks: buildResult.preparedTasks,
283
283
  client,
284
284
  organizationId: options.projectConfig.organizationId,
@@ -315,7 +315,7 @@ async function createFullDeployClient(ctx) {
315
315
  }
316
316
  async function createTaskDeployClient(ctx) {
317
317
  const authOptions = requireAuthOptions(ctx);
318
- return (deployHandlerDependencies.createDeployClient ?? (await import("./deploy-D4ILrWpx.mjs")).createDeployClient)(authOptions);
318
+ return (deployHandlerDependencies.createDeployClient ?? (await import("./deploy-CJbVB7e2.mjs")).createDeployClient)(authOptions);
319
319
  }
320
320
  function renderSuccessSummary(result) {
321
321
  const tasks = result.tasks || [];
@@ -4,7 +4,7 @@ import { N as throwReportedCliExit, k as CliExitError, n as ui, x as toErrorMess
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 { n as resolveLocalWorkflowManifest, t as lookupCurrentDeploymentWorkflow } from "./current-deployment-workflow-CUBHcdZl.mjs";
7
+ import { n as resolveLocalWorkflowManifest, t as lookupCurrentDeploymentWorkflow } from "./current-deployment-workflow-BRUEdPrN.mjs";
8
8
  import { n as renderDiff, t as computeWorkflowDiff } from "./diff-utils-4OQTpP5s.mjs";
9
9
  //#region src/commands/workflows/diff/diff.handler.ts
10
10
  async function handleWorkflowsDiff(options, ctx) {
@@ -1,13 +1,16 @@
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
+ import { t as SKILL_INSTALL_METHODS } from "./types-D04ah3uY.mjs";
4
5
  import { z } from "zod";
5
6
  //#region src/commands/init/init.command.ts
6
7
  const InitOptionsSchema = z.object({
7
8
  path: z.string().optional().describe("Directory to initialize (default: current directory)"),
8
9
  name: z.string().optional().describe("Project name (skips prompt; default: directory basename)"),
9
10
  description: z.string().optional().describe("Project description for the API (skips prompt when creating a new project)"),
10
- scaffold: z.boolean().default(true).describe("Scaffold project files (package.json, vitest.config.ts, etc.)")
11
+ scaffold: z.boolean().default(true).describe("Scaffold project files (package.json, vitest.config.ts, etc.)"),
12
+ agent: z.array(z.string()).optional().describe("Agent target to install Keystroke skills for. Repeat for multiple agents; '*' selects all."),
13
+ method: z.enum(SKILL_INSTALL_METHODS).optional().describe("Skill install method for agent-specific targets")
11
14
  });
12
15
  const INIT_OPTIONS_CONFIG = {
13
16
  path: {
@@ -25,6 +28,15 @@ const INIT_OPTIONS_CONFIG = {
25
28
  scaffold: {
26
29
  flag: "--no-scaffold",
27
30
  description: "Skip scaffolding project files (package.json, vitest.config.ts, etc.)"
31
+ },
32
+ agent: {
33
+ flag: "--agent <agent>",
34
+ description: "Install Keystroke skills for an agent target. Repeat for multiple agents; '*' selects all.",
35
+ collect: true
36
+ },
37
+ method: {
38
+ flag: "--method <symlink|copy>",
39
+ description: "Skill install method for agent-specific targets"
28
40
  }
29
41
  };
30
42
  function createInitCommand() {
@@ -33,7 +45,7 @@ function createInitCommand() {
33
45
  description: "Initialize a Keystroke project (creates keystroke.config.ts)",
34
46
  schema: InitOptionsSchema,
35
47
  optionsConfig: INIT_OPTIONS_CONFIG,
36
- loadHandler: async () => (await import("./init.handler-Beu-vpIu.mjs")).handleInit
48
+ loadHandler: async () => (await import("./init.handler-BZSoM76V.mjs")).handleInit
37
49
  });
38
50
  }
39
51
  //#endregion
@@ -4,13 +4,11 @@ import { k as CliExitError, n as ui, t as fetchLatestNpmPackageVersion } from ".
4
4
  import { d as trackProject } from "./dist-BF6r1hfv.mjs";
5
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";
@@ -62,54 +60,6 @@ function readLocalConfigVersion() {
62
60
  return null;
63
61
  }
64
62
  //#endregion
65
- //#region src/commands/init/agents-md.ts
66
- const AGENTS_FILENAME = "AGENTS.md";
67
- const AGENTS_BLURB_PACKAGE_PATH = "AGENTS-blurb.md";
68
- function normalizeLineEndings(value) {
69
- return value.replace(/\r\n/g, "\n");
70
- }
71
- function normalizeBlurb(value) {
72
- return `${normalizeLineEndings(value).trim()}\n`;
73
- }
74
- function resolveMonorepoSkillsBlurbPath() {
75
- return fileURLToPath(new URL("../../../../../packages/skills/AGENTS-blurb.md", import.meta.url));
76
- }
77
- function resolveCliPackageSkillsBlurbPath() {
78
- const relativePath = import.meta.url.includes("/dist/") ? "../AGENTS-blurb.md" : "../../../AGENTS-blurb.md";
79
- return fileURLToPath(new URL(relativePath, import.meta.url));
80
- }
81
- function resolveBundledKeystrokeAgentsBlurbPath() {
82
- const require = createRequire(import.meta.url);
83
- try {
84
- const skillsPackageJsonPath = require.resolve("@keystrokehq/skills/package.json");
85
- return path$1.join(path$1.dirname(skillsPackageJsonPath), AGENTS_BLURB_PACKAGE_PATH);
86
- } catch {}
87
- try {
88
- return resolveCliPackageSkillsBlurbPath();
89
- } catch {}
90
- return resolveMonorepoSkillsBlurbPath();
91
- }
92
- async function loadKeystrokeAgentsBlurb() {
93
- try {
94
- return normalizeBlurb(await readFile(resolveBundledKeystrokeAgentsBlurbPath(), "utf-8"));
95
- } catch (error) {
96
- 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 });
97
- }
98
- }
99
- async function ensureAgentsMarkdown(targetDir, blurb) {
100
- const agentsFilePath = path$1.join(targetDir, AGENTS_FILENAME);
101
- const normalizedBlurb = normalizeBlurb(blurb);
102
- try {
103
- const normalizedExisting = normalizeLineEndings(await readFile(agentsFilePath, "utf-8"));
104
- if (normalizedExisting.includes(normalizedBlurb.trim())) return "skipped";
105
- await writeFile(agentsFilePath, normalizedExisting.trim().length > 0 ? `${normalizedExisting.trimEnd()}\n\n${normalizedBlurb}` : normalizedBlurb, "utf-8");
106
- return "updated";
107
- } catch {
108
- await writeFile(agentsFilePath, normalizedBlurb, "utf-8");
109
- return "created";
110
- }
111
- }
112
- //#endregion
113
63
  //#region src/commands/init/templates/biome-config.ts
114
64
  /**
115
65
  * Template for generating biome.json for a new Keystroke project.
@@ -260,6 +210,7 @@ function createPackageJsonContent(projectName, options) {
260
210
  },
261
211
  devDependencies: {
262
212
  "@biomejs/biome": "2.4.13",
213
+ "@keystrokehq/testing": options.workflowCoreVersionRange,
263
214
  vitest: "^4.0.18",
264
215
  typescript: "^5.9.3"
265
216
  }
@@ -297,7 +248,7 @@ function createTsconfigContent() {
297
248
  */
298
249
  function createVitestConfigContent() {
299
250
  return `import { defineConfig } from 'vitest/config';
300
- import { keystrokeTestPlugin } from '@keystrokehq/testing/vitest';
251
+ import { keystrokeTestPlugin } from '@keystrokehq/testing';
301
252
 
302
253
  export default defineConfig({
303
254
  plugins: [keystrokeTestPlugin()],
@@ -371,6 +322,7 @@ async function ensureScaffoldPackageJson(targetDir, projectName, workflowCoreRan
371
322
  pkg.dependencies["@keystrokehq/core"] = workflowCoreRange;
372
323
  pkg.dependencies.zod = pkg.dependencies.zod ?? "^4.3.6";
373
324
  pkg.devDependencies = pkg.devDependencies ?? {};
325
+ pkg.devDependencies["@keystrokehq/testing"] = workflowCoreRange;
374
326
  pkg.devDependencies.vitest = pkg.devDependencies.vitest ?? "^4.0.18";
375
327
  pkg.devDependencies.typescript = pkg.devDependencies.typescript ?? "^5.9.3";
376
328
  if (!pkg.name) pkg.name = projectName;
@@ -384,6 +336,28 @@ async function ensureScaffoldPackageJson(targetDir, projectName, workflowCoreRan
384
336
  return "created";
385
337
  }
386
338
  }
339
+ async function installAgentSkillsForInit(targetDir, options) {
340
+ try {
341
+ const choices = await resolveSkillInstallChoices({
342
+ agentSlugs: options.agent,
343
+ method: options.method
344
+ });
345
+ const result = await installKeystrokeAgentSkills({
346
+ projectDir: targetDir,
347
+ agentSlugs: choices.agentSlugs,
348
+ method: choices.method
349
+ });
350
+ if (result.ok) {
351
+ summarizeSkillInstall(result, "Installed");
352
+ return;
353
+ }
354
+ 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`.");
355
+ throw new CliExitError(`@keystrokehq/skills is installed at ${result.packageRoot} but no skill directories with SKILL.md were found.`);
356
+ } catch (error) {
357
+ if (error instanceof UnknownSkillAgentError) throw new CliExitError(error.message, { cause: error });
358
+ throw error;
359
+ }
360
+ }
387
361
  async function handleInit(options, ctx) {
388
362
  const targetDir = path.resolve(options.path ?? process.cwd());
389
363
  const client = requireClient(ctx);
@@ -432,9 +406,7 @@ async function handleInit(options, ctx) {
432
406
  ui.hint(`Project "${projectName}" is now tracked.`);
433
407
  ui.hint(`Project ID: ${projectId}`);
434
408
  await trackProject(targetDir, { name: projectName });
435
- const agentsAction = await ensureAgentsMarkdown(targetDir, await loadKeystrokeAgentsBlurb());
436
- if (agentsAction === "created") ui.success("Created AGENTS.md with Keystroke project guidance.");
437
- else if (agentsAction === "updated") ui.success("Updated AGENTS.md with Keystroke project guidance.");
409
+ await installAgentSkillsForInit(targetDir, options);
438
410
  if (options.scaffold) {
439
411
  const [workflowCoreVersionRange, configVersionRange] = await Promise.all([workflowCoreScaffoldVersionRange(), configScaffoldVersionRange()]);
440
412
  await scaffoldProject(targetDir, projectName, workflowCoreVersionRange, configVersionRange);
@@ -450,12 +422,6 @@ async function writeIfMissing(filePath, content) {
450
422
  return true;
451
423
  }
452
424
  }
453
- async function trySyncAgentSkillsAfterScaffold(targetDir) {
454
- const syncResult = await syncKeystrokeAgentSkills(targetDir);
455
- if (syncResult.ok) ui.success(`Synced ${syncResult.copied.length} skill(s) to .cursor/skills and .claude/skills: ${syncResult.copied.join(", ")}`);
456
- else if (syncResult.reason === "not_installed") ui.hint("After install completes, run `keystroke skills sync` to copy @keystrokehq/skills for Cursor / Claude Code.");
457
- else ui.warn(`@keystrokehq/skills is installed at ${syncResult.packageRoot} but no skill directories with SKILL.md were found.`);
458
- }
459
425
  async function scaffoldProject(targetDir, projectName, workflowCoreVersionRange, configVersionRange) {
460
426
  const pkgAction = await ensureScaffoldPackageJson(targetDir, projectName, workflowCoreVersionRange, configVersionRange);
461
427
  ui.success(pkgAction === "created" ? `Created package.json (@keystrokehq/core ${workflowCoreVersionRange}, @keystrokehq/config ${configVersionRange})` : `Updated package.json (Keystroke deps -> core ${workflowCoreVersionRange}, config ${configVersionRange})`);
@@ -510,7 +476,6 @@ async function scaffoldProject(targetDir, projectName, workflowCoreVersionRange,
510
476
  if (created.length > 0) ui.success(`Scaffolded ${created.length} file(s): ${created.join(", ")}`);
511
477
  else ui.hint("Scaffold files already exist — skipped (package.json was still updated).");
512
478
  ui.hint("Run `pnpm install` to install dependencies, then `pnpm test` to run tests (or use your lockfile's package manager).");
513
- await trySyncAgentSkillsAfterScaffold(targetDir);
514
479
  }
515
480
  //#endregion
516
481
  export { handleInit };
@@ -5,7 +5,7 @@ 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
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-CUBHcdZl.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,14 +1,15 @@
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 { 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({
9
9
  kind: z.enum(ConnectionKindValues).optional(),
10
10
  search: z.string().optional(),
11
- connected: z.boolean().optional()
11
+ connected: z.boolean().optional(),
12
+ details: z.boolean().optional()
12
13
  });
13
14
  const INTEGRATIONS_LIST_OPTIONS_CONFIG = {
14
15
  ...JSON_OPTION_CONFIG,
@@ -23,6 +24,10 @@ const INTEGRATIONS_LIST_OPTIONS_CONFIG = {
23
24
  connected: {
24
25
  flag: "--connected",
25
26
  description: "Only show integrations with at least one configured connection in the current org"
27
+ },
28
+ details: {
29
+ flag: "--details",
30
+ description: "Show connection names, IDs, scope, status, and default selection"
26
31
  }
27
32
  };
28
33
  const IntegrationsRegisterOptionsSchema = JsonOptionSchema.extend({
@@ -47,20 +52,20 @@ function createIntegrationsCommand() {
47
52
  description: "List Keystroke integrations available to your organization",
48
53
  schema: IntegrationsListOptionsSchema,
49
54
  optionsConfig: INTEGRATIONS_LIST_OPTIONS_CONFIG,
50
- loadHandler: async () => (await import("./list.handler-C7AChEPW.mjs")).handleIntegrationsList,
55
+ loadHandler: async () => (await import("./list.handler-DYdNWjgk.mjs")).handleIntegrationsList,
51
56
  subcommands: [createTypedCommand({
52
57
  name: "list",
53
58
  description: "List Keystroke integrations available to your organization",
54
59
  schema: IntegrationsListOptionsSchema,
55
60
  optionsConfig: INTEGRATIONS_LIST_OPTIONS_CONFIG,
56
- loadHandler: async () => (await import("./list.handler-C7AChEPW.mjs")).handleIntegrationsList
61
+ loadHandler: async () => (await import("./list.handler-DYdNWjgk.mjs")).handleIntegrationsList
57
62
  }), createTypedCommand({
58
63
  name: "register",
59
64
  description: "Register a workspace provider app for future workspace-authored OAuth support",
60
65
  schema: IntegrationsRegisterOptionsSchema,
61
66
  optionsConfig: INTEGRATIONS_REGISTER_OPTIONS_CONFIG,
62
67
  handler: async (opts, ctx) => {
63
- const { handleIntegrationsRegister } = await import("./register.handler-CttgzybN.mjs");
68
+ const { handleIntegrationsRegister } = await import("./register.handler-BAx0IC-u.mjs");
64
69
  await handleIntegrationsRegister({
65
70
  integrationId: opts.integrationId,
66
71
  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
  }