@keystrokehq/skills 0.0.3 → 0.0.4

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 (44) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +23 -15
  3. package/package.json +3 -10
  4. package/{keystroke-agent-authoring → src/keystroke-agent-authoring}/references/testing.md +1 -1
  5. package/{keystroke-cli-workspace → src/keystroke-cli-workspace}/SKILL.md +1 -1
  6. package/{keystroke-cli-workspace → src/keystroke-cli-workspace}/references/command-map.md +3 -3
  7. package/{keystroke-cli-workspace → src/keystroke-cli-workspace}/references/project-lifecycle.md +1 -1
  8. package/{keystroke-trigger-authoring → src/keystroke-trigger-authoring}/references/patterns.md +8 -4
  9. package/{keystroke-trigger-authoring → src/keystroke-trigger-authoring}/references/source-map.md +2 -3
  10. package/{keystroke-trigger-authoring → src/keystroke-trigger-authoring}/references/testing.md +1 -1
  11. package/{keystroke-workflow-authoring → src/keystroke-workflow-authoring}/SKILL.md +2 -2
  12. package/{keystroke-workflow-authoring → src/keystroke-workflow-authoring}/references/runtime-helpers.md +2 -2
  13. package/{keystroke-workflow-authoring → src/keystroke-workflow-authoring}/references/source-map.md +1 -1
  14. package/{keystroke-workflow-authoring → src/keystroke-workflow-authoring}/references/testing.md +2 -2
  15. package/keystroke-agent-authoring/evals/evals.json +0 -29
  16. package/keystroke-cli-workspace/evals/evals.json +0 -23
  17. package/keystroke-credential-binding/evals/evals.json +0 -29
  18. package/keystroke-data-toolkit/evals/evals.json +0 -23
  19. package/keystroke-task-authoring/evals/evals.json +0 -23
  20. package/keystroke-trigger-authoring/evals/evals.json +0 -29
  21. package/keystroke-workflow-as-tool-debugging/evals/evals.json +0 -23
  22. package/keystroke-workflow-authoring/evals/evals.json +0 -29
  23. /package/{AGENTS-blurb.md → src/AGENTS.md} +0 -0
  24. /package/{keystroke-agent-authoring → src/keystroke-agent-authoring}/SKILL.md +0 -0
  25. /package/{keystroke-agent-authoring → src/keystroke-agent-authoring}/references/messaging-gateways.md +0 -0
  26. /package/{keystroke-agent-authoring → src/keystroke-agent-authoring}/references/patterns.md +0 -0
  27. /package/{keystroke-agent-authoring → src/keystroke-agent-authoring}/references/prebuilt-integrations.md +0 -0
  28. /package/{keystroke-agent-authoring → src/keystroke-agent-authoring}/references/sandbox-and-mcp.md +0 -0
  29. /package/{keystroke-agent-authoring → src/keystroke-agent-authoring}/references/source-map.md +0 -0
  30. /package/{keystroke-cli-workspace → src/keystroke-cli-workspace}/references/credentials-and-connect.md +0 -0
  31. /package/{keystroke-credential-binding → src/keystroke-credential-binding}/SKILL.md +0 -0
  32. /package/{keystroke-credential-binding → src/keystroke-credential-binding}/references/cli.md +0 -0
  33. /package/{keystroke-credential-binding → src/keystroke-credential-binding}/references/patterns.md +0 -0
  34. /package/{keystroke-credential-binding → src/keystroke-credential-binding}/references/source-map.md +0 -0
  35. /package/{keystroke-data-toolkit → src/keystroke-data-toolkit}/SKILL.md +0 -0
  36. /package/{keystroke-data-toolkit → src/keystroke-data-toolkit}/references/usage.md +0 -0
  37. /package/{keystroke-task-authoring → src/keystroke-task-authoring}/SKILL.md +0 -0
  38. /package/{keystroke-task-authoring → src/keystroke-task-authoring}/references/patterns.md +0 -0
  39. /package/{keystroke-task-authoring → src/keystroke-task-authoring}/references/source-map.md +0 -0
  40. /package/{keystroke-trigger-authoring → src/keystroke-trigger-authoring}/SKILL.md +0 -0
  41. /package/{keystroke-workflow-as-tool-debugging → src/keystroke-workflow-as-tool-debugging}/SKILL.md +0 -0
  42. /package/{keystroke-workflow-as-tool-debugging → src/keystroke-workflow-as-tool-debugging}/references/playbook.md +0 -0
  43. /package/{keystroke-workflow-authoring → src/keystroke-workflow-authoring}/references/patterns.md +0 -0
  44. /package/{keystroke-workflow-authoring → src/keystroke-workflow-authoring}/references/prebuilt-integrations.md +0 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ # @keystrokehq/skills
2
+
3
+ ## 0.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - bb9fea0: Fix: Removing callbacks from triggers (except polling)
8
+
9
+ ## 0.0.3
10
+
11
+ ### Patch Changes
12
+
13
+ - c4870ce: Update public package references and authoring guidance for the provider-name integration packages.
14
+
15
+ ## 0.0.2
16
+
17
+ ### Patch Changes
18
+
19
+ - 761d44e: Add `keystroke workflows run` for manually invoking workflows from a project's current deployment, including input and workflow globals parsing plus wait/follow support.
20
+
21
+ Update Keystroke CLI and workflow authoring skills with guidance for deployed workflow manual runs.
22
+
23
+ ## 0.0.1
24
+
25
+ ### Patch Changes
26
+
27
+ - 2ff9004: Publish Keystroke skills as an npm package and let the CLI use its installed skills package as a fallback when syncing skills into projects.
package/README.md CHANGED
@@ -19,34 +19,42 @@ The packaged skills are:
19
19
 
20
20
  ## Editing
21
21
 
22
- Edit the source files in `packages/skills/`.
22
+ Edit shipped skill content in `packages/skills/src/`.
23
23
 
24
- Do not treat local editor skill directories as the source of truth for these packaged skills. Edit the canonical files in `packages/skills/` first, then use the Keystroke CLI skill sync flow when local `.cursor/skills` or `.claude/skills` copies need to be refreshed.
24
+ Do not treat local editor skill directories as the source of truth for these packaged skills. Edit the canonical files in `packages/skills/src/` first, then use the Keystroke CLI skill sync flow when project-installed skill copies need to be refreshed.
25
+
26
+ Evaluation prompts and notes live in `packages/skills/evals/`. They are repo-only authoring assets and are not published to npm or copied into user projects.
25
27
 
26
28
  ## Structure
27
29
 
28
- Each skill follows this structure:
30
+ The publishable package content follows this structure:
29
31
 
30
32
  ```text
31
- <skill-name>/
32
- ├── SKILL.md
33
- ├── references/
34
- │ ├── source-map.md
35
- │ └── ...
36
- └── evals/
37
- └── evals.json
33
+ src/
34
+ ├── AGENTS.md
35
+ ├── <skill-name>/
36
+ │ ├── SKILL.md
37
+ │ └── references/
38
+ │ ├── source-map.md
39
+ └── ...
40
+ └── ...
38
41
  ```
39
42
 
43
+ - `src/AGENTS.md` is the Keystroke project context written or appended to project-root `AGENTS.md` by `keystroke init`.
40
44
  - `SKILL.md` stays concise and procedural.
41
45
  - `references/` holds longer examples, source maps, and gotchas.
42
- - `evals/evals.json` stores the initial evaluation prompts used with `.agents/skills/skill-creator/`.
46
+ - `evals/<skill-name>/evals.json` stores the initial evaluation prompts used with `.agents/skills/skill-creator/`.
43
47
 
44
48
  ## Wiring
45
49
 
46
- These packaged skills are intended to be copied into local editor skill directories through the Keystroke CLI:
50
+ These packaged skills are installed into project agent skill directories through the Keystroke CLI:
47
51
 
48
- - packaged skills are authored here
49
- - `keystroke skills sync` copies them into `.cursor/skills` and `.claude/skills`
52
+ - packaged skills are authored in `src/`
53
+ - `keystroke init` always copies them into the canonical project path `.agents/skills`
54
+ - `keystroke init --agent <agent> --method symlink` provisions selected agent-specific paths by linking back to `.agents/skills`
55
+ - `keystroke init --agent <agent> --method copy` provisions selected agent-specific paths with independent copies
56
+ - `keystroke skills sync` refreshes an existing project using the same `--agent` and `--method` flags
57
+ - eval assets stay in `evals/` and are excluded from published packages and synced project skills
50
58
 
51
59
  If the discovery story changes later, update this package and the sync flow together. Until then, edit the packaged skills here first.
52
60
 
@@ -57,7 +65,7 @@ Because these are repo-authored local skills rather than externally installed sk
57
65
  Draft and refine these skills with the existing `.agents/skills/skill-creator/` workflow:
58
66
 
59
67
  1. Draft the skill
60
- 2. Add realistic eval prompts to `evals/evals.json`
68
+ 2. Add realistic eval prompts to `evals/<skill-name>/evals.json`
61
69
  3. Run at least one evaluation pass
62
70
  4. Revise the skill based on results
63
71
  5. Improve the `description` once the body is stable
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keystrokehq/skills",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -9,15 +9,8 @@
9
9
  },
10
10
  "files": [
11
11
  "README.md",
12
- "AGENTS-blurb.md",
13
- "keystroke-workflow-authoring",
14
- "keystroke-agent-authoring",
15
- "keystroke-data-toolkit",
16
- "keystroke-workflow-as-tool-debugging",
17
- "keystroke-credential-binding",
18
- "keystroke-trigger-authoring",
19
- "keystroke-task-authoring",
20
- "keystroke-cli-workspace"
12
+ "CHANGELOG.md",
13
+ "src"
21
14
  ],
22
15
  "scripts": {
23
16
  "build": "node -e \"process.exit(0)\"",
@@ -17,7 +17,7 @@ Default testing targets:
17
17
 
18
18
  ```ts
19
19
  import { defineConfig } from 'vitest/config';
20
- import { keystrokeTestPlugin } from '@keystrokehq/testing/vitest';
20
+ import { keystrokeTestPlugin } from '@keystrokehq/testing';
21
21
 
22
22
  export default defineConfig({
23
23
  plugins: [keystrokeTestPlugin()],
@@ -87,7 +87,7 @@ Important distinctions:
87
87
  - Use `keystroke connect <integration>` for official integration connection flows.
88
88
  - Use `keystroke credentials ...` for credential inspection and upload flows.
89
89
  - Use `keystroke skills sync` to copy `@keystrokehq/skills` into local editor skill directories.
90
- - Use `keystroke workflows run <authoredWorkflowId>` for deployed-workflow manual invocation; use `try-deploy` only when testing a temporary build artifact.
90
+ - Use `keystroke workflows run <authoredWorkflowId>` for deployed-workflow manual invocation; use `keystroke workflows test <workflow>` when testing a temporary build artifact.
91
91
 
92
92
  ## References
93
93
 
@@ -36,8 +36,8 @@ Root help shows these directly. Subcommand help focuses on the local flags for t
36
36
  - `projects`: inspect cached project state
37
37
  - `connect`: connect official integrations through OAuth
38
38
  - `credentials`: list requirements and upload credentials
39
- - `workflows`: build, validate, inspect, diff, env, logs, paused, run, try-deploy
40
- - `test`: test workflows and agent-callable tools
39
+ - `workflows`: build, validate, inspect, diff, env, logs, paused, test, run
40
+ - `test`: test agent-callable tools
41
41
  - `deploy`: deploy workflows, agents, tasks, or focused targets via `--target <file>`
42
42
  - `sync`: local sync operations
43
43
  - `skills`: Keystroke skills sync flows
@@ -47,7 +47,7 @@ Root help shows these directly. Subcommand help focuses on the local flags for t
47
47
 
48
48
  - `keystroke workflows logs` is different from `keystroke logs`
49
49
  - `keystroke workflows run <authoredWorkflowId>` executes the current deployed workflow snapshot via the workflow execute API; it does not build or upload local code
50
- - `keystroke workflows try-deploy <workflow>` builds local code, uploads or references a test bundle, and runs that temporary artifact
50
+ - `keystroke workflows test <workflow>` builds local code, uploads or references a test bundle, and runs that temporary artifact
51
51
  - `keystroke deploy --target <file>` is the focused deploy path
52
52
  - many commands support `--json`
53
53
 
@@ -77,7 +77,7 @@ keystroke workflows run wf_onboard_user --input '{"email":"user@example.com"}'
77
77
 
78
78
  Notes:
79
79
  - `workflows run` executes the current deployed snapshot through `client.workflows.execute()` / `POST /api/v1/workflows/execute`
80
- - it does not build or upload local source; use `workflows try-deploy` for temporary local artifact testing
80
+ - it does not build or upload local source; use `workflows test` for temporary local artifact testing
81
81
  - pass `--project-id <uuid>` outside a project checkout, otherwise the CLI resolves `projectId` from `keystroke.config.ts`
82
82
  - pass `--workflow-globals` or `--workflow-globals-file` when the deployed manifest declares required workflow globals without defaults
83
83
  - use `--wait` to poll to a terminal status and `--follow` to poll logs/events while waiting
@@ -202,12 +202,16 @@ triggers: [
202
202
 
203
203
  Call the trigger as a function with `{ transform }` when the trigger payload and workflow input are different shapes. This returns a `BoundTrigger`.
204
204
 
205
- ## Bound trigger with additional `filter`
205
+ ## Narrow a trigger for per-workflow filtering
206
206
 
207
207
  ```ts
208
+ const largePayments = paymentWebhook.narrow({
209
+ name: 'large-payments',
210
+ filter: z.object({ amount: z.number().gt(100) }),
211
+ });
212
+
208
213
  triggers: [
209
- paymentWebhook({
210
- filter: (payload) => payload.amount > 100,
214
+ largePayments({
211
215
  transform: (payload) => ({
212
216
  eventId: payload.id,
213
217
  amount: payload.amount,
@@ -216,7 +220,7 @@ triggers: [
216
220
  ]
217
221
  ```
218
222
 
219
- An additional filter on the binding composes with the trigger's own filter.
223
+ Filtering and idempotency live on the trigger or its `.narrow()` derivatives — never on the attachment. Bindings accept only `transform`. Use `.narrow()` to produce a filtered child trigger and attach that to the workflow.
220
224
 
221
225
  ## Task trigger note
222
226
 
@@ -101,14 +101,13 @@ All factory-created triggers are callable. Calling one returns a `BoundTrigger`:
101
101
 
102
102
  - `trigger()` — bare binding (no transform)
103
103
  - `trigger({ transform })` — bound with payload-to-input mapping
104
- - `trigger({ filter })` — bound with additional filter
105
- - `trigger({ transform, filter })` — bound with both
104
+
105
+ Bindings carry only `transform`. To filter events for a specific workflow, derive a child with `trigger.narrow({ name, filter })` and attach that `.narrow()` is the only authoring path for per-target filtering. Binding-level `filter` and `idempotencyKey` are intentionally not part of the API.
106
106
 
107
107
  ## `BoundTrigger`
108
108
 
109
109
  - `.isBoundTrigger` — always `true`
110
110
  - `.trigger` — reference to the underlying trigger instance
111
- - `.filter?` — composed filter (trigger's filter + binding filter)
112
111
  - `.transform?` — payload-to-workflow-input mapping function
113
112
 
114
113
  ## Workflow `triggers` array
@@ -10,7 +10,7 @@ Assume `paymentWebhook`, `orderPolling`, and `paymentWorkflow` are the public tr
10
10
 
11
11
  ```ts
12
12
  import { defineConfig } from 'vitest/config';
13
- import { keystrokeTestPlugin } from '@keystrokehq/testing/vitest';
13
+ import { keystrokeTestPlugin } from '@keystrokehq/testing';
14
14
 
15
15
  export default defineConfig({
16
16
  plugins: [keystrokeTestPlugin()],
@@ -123,7 +123,7 @@ Teach these rules:
123
123
  - waits and hooks
124
124
  5. Put operational work in steps, shared operations, or agents.
125
125
  6. Keep each exported primitive in its own typed file.
126
- 7. Finish with tests using `@keystrokehq/testing/vitest`.
126
+ 7. Finish with tests using `@keystrokehq/testing`.
127
127
 
128
128
  ## Workflow rules
129
129
 
@@ -202,7 +202,7 @@ keystroke workflows run <authoredWorkflowId> --input '{}' --wait
202
202
  keystroke workflows run <authoredWorkflowId> --input '{}' --follow
203
203
  ```
204
204
 
205
- `workflows run` executes the current deployed snapshot. It is different from `workflows try-deploy`, which builds local code and runs a temporary artifact.
205
+ `workflows run` executes the current deployed snapshot. It is different from `workflows test`, which builds local code and runs a temporary artifact.
206
206
 
207
207
  To explicitly start a workflow via API:
208
208
  - **Endpoint**: `POST /api/v1/workflows/execute`
@@ -239,7 +239,7 @@ Use these when operation behavior depends on retry state or when you want the st
239
239
 
240
240
  ## Public testing helpers
241
241
 
242
- Import these from `@keystrokehq/testing/vitest`:
242
+ Import these from `@keystrokehq/testing`:
243
243
 
244
244
  - `keystrokeTestPlugin`
245
245
  - `createTestRuntime`
@@ -256,7 +256,7 @@ Import these from `@keystrokehq/testing/vitest`:
256
256
  Example:
257
257
 
258
258
  ```ts
259
- import { createMockHook } from '@keystrokehq/testing/vitest';
259
+ import { createMockHook } from '@keystrokehq/testing';
260
260
 
261
261
  const hook = createMockHook();
262
262
  await hook;
@@ -9,7 +9,7 @@ import {
9
9
  createTestRuntime,
10
10
  createTestStepContext,
11
11
  keystrokeTestPlugin,
12
- } from '@keystrokehq/testing/vitest';
12
+ } from '@keystrokehq/testing';
13
13
  ```
14
14
 
15
15
  `Operation`, `Step`, and `Tool` are aliases for the same class. In this workflow skill, prefer `Step` for examples and explanations, but `Operation` is equally valid for shared or integration-oriented code.
@@ -10,7 +10,7 @@ Assume `helloWorkflow`, `accountSyncWorkflow`, `loadCustomer`, `paymentWebhook`,
10
10
 
11
11
  ```ts
12
12
  import { defineConfig } from 'vitest/config';
13
- import { keystrokeTestPlugin } from '@keystrokehq/testing/vitest';
13
+ import { keystrokeTestPlugin } from '@keystrokehq/testing';
14
14
 
15
15
  export default defineConfig({
16
16
  plugins: [keystrokeTestPlugin()],
@@ -40,7 +40,7 @@ Use it when a workflow test needs more than plain input data.
40
40
 
41
41
  ```ts
42
42
  import { createTestRuntime } from '@keystrokehq/testing';
43
- import { createMockHook } from '@keystrokehq/testing/vitest';
43
+ import { createMockHook } from '@keystrokehq/testing';
44
44
 
45
45
  const runtime = createTestRuntime({
46
46
  workflowGlobals: {
@@ -1,29 +0,0 @@
1
- {
2
- "skill_name": "keystroke-agent-authoring",
3
- "evals": [
4
- {
5
- "id": 1,
6
- "prompt": "I need a Keystroke agent that can look up Slack users and DM one of them. What fields should I set up, and where do tools and credentials go?",
7
- "expected_output": "Explains the canonical Keystroke agent path, the important agent fields, tool configuration, and the credential relationship between the agent and its tools.",
8
- "files": []
9
- },
10
- {
11
- "id": 2,
12
- "prompt": "Should this be a Step or an agent? The task is to inspect some repo files, decide what changed, and then call a couple of tools depending on what it finds.",
13
- "expected_output": "Explains when an agent is appropriate, when a normal step would be better, and how workflow orchestration relates to agent scope.",
14
- "files": []
15
- },
16
- {
17
- "id": 3,
18
- "prompt": "Show me how to build a sandboxed Keystroke coding agent that can work in a checked-out repo and maybe use MCP later if needed.",
19
- "expected_output": "Uses the public sandbox and MCP patterns, points to MCP references when needed, and keeps workflow orchestration separate.",
20
- "files": []
21
- },
22
- {
23
- "id": 4,
24
- "prompt": "I want my Keystroke agent to answer messages from GitHub conversations. Should I use a trigger or something else?",
25
- "expected_output": "Explains that conversational entry belongs on Agent.messaging with a MessagingGateway, not on workflow triggers, and keeps the distinction between tasks, triggers, and conversations clear.",
26
- "files": []
27
- }
28
- ]
29
- }
@@ -1,23 +0,0 @@
1
- {
2
- "skill_name": "keystroke-cli-workspace",
3
- "evals": [
4
- {
5
- "id": 1,
6
- "prompt": "I need to deploy a Keystroke task. What command should I use, and how should I inspect the available flags before running it?",
7
- "expected_output": "Uses the CLI skill, chooses `keystroke deploy --target <task.task.ts>`, and tells the agent to inspect `keystroke deploy --help` first.",
8
- "files": []
9
- },
10
- {
11
- "id": 2,
12
- "prompt": "How do I set up a new Keystroke project and make the Keystroke-authored skills available in Cursor?",
13
- "expected_output": "Uses `keystroke init`, explains `keystroke skills sync`, and tells the agent to inspect command help first.",
14
- "files": []
15
- },
16
- {
17
- "id": 3,
18
- "prompt": "I need to figure out which CLI options exist for uploading credentials. What should I do before running the upload command?",
19
- "expected_output": "Explicitly uses `keystroke credentials upload --help` before describing the upload flow.",
20
- "files": []
21
- }
22
- ]
23
- }
@@ -1,29 +0,0 @@
1
- {
2
- "skill_name": "keystroke-credential-binding",
3
- "evals": [
4
- {
5
- "id": 1,
6
- "prompt": "I need to add a credential set for a new API integration in Keystroke. Can you show me how to define the CredentialSet and how a step would read it safely?",
7
- "expected_output": "Explains CredentialSet authoring, typed schemas, and step context access through ctx.credentials.",
8
- "files": []
9
- },
10
- {
11
- "id": 2,
12
- "prompt": "Before I deploy these workflows, how do I figure out which credentials are required and upload them from env vars with the Keystroke CLI?",
13
- "expected_output": "Uses the tested credential requirements and upload flows, including the KEYSTROKE_<KEY> convention.",
14
- "files": []
15
- },
16
- {
17
- "id": 3,
18
- "prompt": "Does the same credential model work for steps, tools, agents, and triggers, or are there important differences I need to know?",
19
- "expected_output": "Explains the shared CredentialSet model and the differences in where credentials are attached and consumed across primitives.",
20
- "files": []
21
- },
22
- {
23
- "id": 4,
24
- "prompt": "How do I upload official GitHub credentials with the current Keystroke CLI? Please use the real command surface, not an outdated one.",
25
- "expected_output": "Uses the current credentials upload syntax, including --integration and the KEYSTROKE_<KEY> convention, and avoids stale flags such as --from-workflows or --no-verify.",
26
- "files": []
27
- }
28
- ]
29
- }
@@ -1,23 +0,0 @@
1
- {
2
- "skill_name": "keystroke-data-toolkit",
3
- "evals": [
4
- {
5
- "id": 1,
6
- "prompt": "My workflow tool can return a few megabytes of audit rows. How should I configure the workflow and how should the agent inspect the result?",
7
- "expected_output": "Recommends largeResultMode: 'ref', explains the ref envelope, and uses describe_ref/read_ref/slice_ref with bounded ranges.",
8
- "files": []
9
- },
10
- {
11
- "id": 2,
12
- "prompt": "The agent called read_ref and got truncated: true. What should it do next?",
13
- "expected_output": "Explains that truncation is signaled and the agent should request a narrower range or targeted slice rather than assuming it saw all data.",
14
- "files": []
15
- },
16
- {
17
- "id": 3,
18
- "prompt": "Can we add DuckDB reducers for this large CSV workflow output?",
19
- "expected_output": "States that reducers and DuckDB are deferred in the active product and recommends bounded ref reads or samples instead.",
20
- "files": []
21
- }
22
- ]
23
- }
@@ -1,23 +0,0 @@
1
- {
2
- "skill_name": "keystroke-task-authoring",
3
- "evals": [
4
- {
5
- "id": 1,
6
- "prompt": "I want a Keystroke task that runs an agent every time a webhook fires and includes the webhook payload in the prompt. How should I author that?",
7
- "expected_output": "Explains Task authoring, inline triggers, prompt templating with trigger context, and keeps workflow attachments out of the task path.",
8
- "files": []
9
- },
10
- {
11
- "id": 2,
12
- "prompt": "Should this be a workflow or a task? The job is just: cron fires, agent writes a summary, then stop.",
13
- "expected_output": "Chooses Task, explains why the task model fits better than workflow orchestration, and mentions deploy --target for focused task deploys.",
14
- "files": []
15
- },
16
- {
17
- "id": 3,
18
- "prompt": "How do I limit a Keystroke task to run once and expire after a week?",
19
- "expected_output": "Explains task lifecycle fields such as maxExecutions and expiresAfter with authored code examples.",
20
- "files": []
21
- }
22
- ]
23
- }
@@ -1,29 +0,0 @@
1
- {
2
- "skill_name": "keystroke-trigger-authoring",
3
- "evals": [
4
- {
5
- "id": 1,
6
- "prompt": "How do I create a Keystroke webhook trigger for a Stripe event and map the incoming payload into my workflow input?",
7
- "expected_output": "Explains webhookTrigger() factory setup, required and optional fields, and the bound trigger transform pattern via Workflow({ triggers: [trigger({ transform })] }).",
8
- "files": []
9
- },
10
- {
11
- "id": 2,
12
- "prompt": "I need a polling trigger that checks an external API every 15 minutes and only launches the workflow for new items. What should that look like?",
13
- "expected_output": "Explains pollingTrigger() factory setup, schedule, poll/response, optional filter and idempotency behavior, and listing the trigger in Workflow({ triggers: [...] }) with optional transform binding.",
14
- "files": []
15
- },
16
- {
17
- "id": 3,
18
- "prompt": "What is the right way to test a Keystroke trigger? I want to validate webhook verify/filter logic and the input transform into the workflow.",
19
- "expected_output": "Points to trigger-specific callback tests (verify, filter, payload.parse) plus bound trigger transform testing via bound.transform?.(payload).",
20
- "files": []
21
- },
22
- {
23
- "id": 4,
24
- "prompt": "I want a cron-driven agent job. Do I attach a trigger to the agent, attach it to a task, or something else?",
25
- "expected_output": "Explains that workflow triggers are listed in Workflow({ triggers: [...] }), task triggers are listed inline on Task.triggers, and messaging gateways are not triggers.",
26
- "files": []
27
- }
28
- ]
29
- }
@@ -1,23 +0,0 @@
1
- {
2
- "skill_name": "keystroke-workflow-as-tool-debugging",
3
- "evals": [
4
- {
5
- "id": 1,
6
- "prompt": "A workflow tool with ctx.wait returned pending: true and the agent tried to call it again. What should I inspect and what behavior is expected?",
7
- "expected_output": "Explains yield receipt behavior, turn ending, idempotency, pending yield state, child workflow run, and agent_continue resume path.",
8
- "files": []
9
- },
10
- {
11
- "id": 2,
12
- "prompt": "My midSessionSnapshot workflow tool is suspended_snapshotted. When the child workflow completes, which worker should resume it?",
13
- "expected_output": "States that agent_resume handles current snapshots through Path B conversation-log replay and does not claim native Pi process restore.",
14
- "files": []
15
- },
16
- {
17
- "id": 3,
18
- "prompt": "A workflow tool returned a ref and the model wants to query it with a reducer. What should I do?",
19
- "expected_output": "Recommends describe_ref/read_ref/slice_ref with bounded ranges and states reducers/DuckDB are deferred and unsupported.",
20
- "files": []
21
- }
22
- ]
23
- }
@@ -1,29 +0,0 @@
1
- {
2
- "skill_name": "keystroke-workflow-authoring",
3
- "evals": [
4
- {
5
- "id": 1,
6
- "prompt": "I'm building a Keystroke workflow that checks a few upstream APIs, waits 10 minutes between retries, and then posts the result to Slack. Can you show me how to structure the workflow and what should be steps versus workflow orchestration?",
7
- "expected_output": "Explains workflow planning, step boundaries, replay-safe orchestration, the durable wait path, and where Slack or other external work belongs.",
8
- "files": []
9
- },
10
- {
11
- "id": 2,
12
- "prompt": "I have a workflow that uses Math.random() and Date.now() inside Workflow.run to make request ids. Why is that a problem in Keystroke, and how should I rewrite it?",
13
- "expected_output": "Explains workflow replay safety, why nondeterministic logic should not live in the workflow body, and how to move it into a step or agent boundary.",
14
- "files": []
15
- },
16
- {
17
- "id": 3,
18
- "prompt": "How do I test a Keystroke workflow that uses workflowGlobals and a webhook trigger? I want the recommended testing path, not a random custom harness.",
19
- "expected_output": "Uses core Vitest helpers, covers workflowGlobals, and points to bound trigger transform testing via bound.transform?.(payload, ctx).",
20
- "files": []
21
- },
22
- {
23
- "id": 4,
24
- "prompt": "Can my Keystroke workflow run bash to call a Python script, or should I structure this differently?",
25
- "expected_output": "Explains that workflows are authored as TypeScript orchestration and do not run bash as part of the workflow model, then routes shell-heavy work to an agent sandbox.",
26
- "files": []
27
- }
28
- ]
29
- }
File without changes