@postman/postman-plugin 0.5.0 → 0.6.0-rc.0

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 (37) hide show
  1. package/README.md +2 -2
  2. package/dist/hosts/factory.js +29 -3
  3. package/hooks/session-start-context.md +1 -1
  4. package/mcp.pi.json +2 -2
  5. package/package.json +1 -1
  6. package/skills/api-discovery/SKILL.md +7 -2
  7. package/skills/api-documentation/SKILL.md +2 -3
  8. package/skills/api-engineer/SKILL.md +13 -15
  9. package/skills/api-mocking/SKILL.md +4 -2
  10. package/skills/api-monitoring/SKILL.md +35 -25
  11. package/skills/api-simulation/SKILL.md +109 -74
  12. package/skills/api-simulation/reference/context_file.md +183 -149
  13. package/skills/api-simulation/reference/sim_yaml_schema.md +1 -1
  14. package/skills/api-testing/SKILL.md +3 -3
  15. package/skills/application-testing/SKILL.md +2 -2
  16. package/skills/ci-integration/SKILL.md +7 -5
  17. package/skills/cli-install/SKILL.md +29 -0
  18. package/skills/collection-schema-v3/SKILL.md +21 -11
  19. package/skills/collection-schema-v3/reference/environment.md +2 -0
  20. package/skills/collection-schema-v3/reference/globals.md +40 -0
  21. package/skills/collection-schema-v3/reference/http.md +149 -11
  22. package/skills/collection-schema-v3/reference/other_protocols.md +232 -86
  23. package/skills/datasets/SKILL.md +6 -5
  24. package/skills/datasets/reference/schema.md +51 -0
  25. package/skills/flows/SKILL.md +0 -1
  26. package/skills/performance-testing/SKILL.md +14 -1
  27. package/skills/performance-testing/references/gatling-import/README.md +141 -0
  28. package/skills/performance-testing/references/gatling-import/feeders.md +31 -0
  29. package/skills/performance-testing/references/gatling-import/injection.md +88 -0
  30. package/skills/performance-testing/references/gatling-import/mapping.md +91 -0
  31. package/skills/performance-testing/references/gatling-import/unsupported.md +31 -0
  32. package/skills/postman-mcp-server/SKILL.md +1 -1
  33. package/skills/variables/SKILL.md +2 -2
  34. package/skills/webhook-testing/SKILL.md +1 -1
  35. package/skills/workspaces/SKILL.md +53 -0
  36. package/skills/bootstrap/SKILL.md +0 -140
  37. package/skills/bootstrap/reference/cli_installation.md +0 -59
@@ -13,7 +13,7 @@ Optional metadata for a collection or folder:
13
13
  - `description` — optional.
14
14
  - `variables` — array of `{key, value, description?, disabled?}`. `value`
15
15
  must be a string; `disabled` a boolean.
16
- - `auth` — a single auth object `{type, credentials: [{key, value}, ...]}`,
16
+ - `auth` — a single auth object `{type, credentials: [{key, value}, ...]}`
17
17
  or an array for multiAuth: `[{id, name, type, credentials, rules?}, ...]`.
18
18
  - `scripts` — array of `{type, code, language: "text/javascript"}`. `type`
19
19
  is one of `http:beforeRequest`, `http:afterResponse`,
@@ -47,17 +47,59 @@ Optional metadata for a collection or folder:
47
47
  - `examples` — optional, a relative path to the examples directory, e.g.
48
48
  `./.resources/<request-name>.resources/examples/`.
49
49
 
50
+ When editing query parameters, update both places they are recorded: the
51
+ query string in `url` and the entries in `queryParams`. Their names and values
52
+ must match; lint reports a mismatch as `FMT209`. For example, `q=shoes&page=2`
53
+ is represented as:
54
+
55
+ ```yaml
56
+ url: '{{base_url}}/search?q=shoes&page=2'
57
+ queryParams:
58
+ - key: q
59
+ value: shoes
60
+ - key: page
61
+ value: '2'
62
+ ```
63
+
50
64
  ## HTTP example (`*.example.yaml`)
51
65
 
52
- - `$kind: "http-example"` — required.
53
- - `name` — optional.
54
- - `request: {url, method}`.
55
- - `response: {statusCode, statusText, headers: [{key, value}], body: {type, content}}`.
56
- - `order` — optional.
66
+ `http-example` requires `$kind` and `response`, and `response` requires `body`:
67
+
68
+ ```yaml
69
+ $kind: http-example
70
+ name: 200 OK
71
+ request:
72
+ method: POST
73
+ url: https://api.example.com/orders
74
+ headers:
75
+ - key: Content-Type
76
+ value: application/json
77
+ body:
78
+ type: json
79
+ content: '{"sku":"A1"}'
80
+ response:
81
+ statusCode: 200
82
+ statusText: OK
83
+ headers:
84
+ - key: Content-Type
85
+ value: application/json
86
+ body:
87
+ type: json
88
+ content: '{"id":"o_1"}'
89
+ order: 1000
90
+ ```
91
+
92
+ For a saved `204 No Content` example, the YAML schema still requires a
93
+ `response.body` object. Represent the absence of response content with
94
+ `body: {type: text, content: ''}`. This describes the saved example file;
95
+ it does not add content to the HTTP response.
57
96
 
58
- Saved examples are what `collection ai-readiness` checks for — a request
59
- with no examples scores worse for agent consumption even if perfectly
60
- valid structurally.
97
+ Response `body.type` accepts only `text`, `json`, `xml`, `html`, `javascript`
98
+ and `yaml`. For a form-encoded response, use `type: text` with a
99
+ matching `Content-Type` header. Request bodies do have `urlencoded`.
100
+
101
+ Saved examples feed **ai-readiness**, documentation, and mocks; a structurally
102
+ valid example still needs to agree with the contract.
61
103
 
62
104
  ## Environments (`postman/environments/*.environment.yaml`)
63
105
 
@@ -66,10 +108,106 @@ Environment files are v3 YAML but are not collection entities: they do not use
66
108
  [reference/environment.md](environment.md) for the schema, secret
67
109
  handling, CLI-first edit commands, and a linted example.
68
110
 
111
+ ## Auth
112
+
113
+ `auth` is available on a collection, a folder, a request and an example. It has two
114
+ shapes. No auth:
115
+
116
+ ```yaml
117
+ auth:
118
+ type: noauth
119
+ ```
120
+
121
+ Anything else takes `type` plus `credentials`:
122
+
123
+ ```yaml
124
+ auth:
125
+ type: bearer
126
+ credentials:
127
+ - key: token
128
+ value: '{{TOKEN}}'
129
+ ```
130
+
131
+ `type` is one of `basic`, `bearer`, `apikey`, `digest`, `oauth1`, `oauth2`, `jwt`,
132
+ `awsv4`, `hawk`, `ntlm`, `asap`, `edgegrid`, `azure`, `sasl`, `inherit`. Use `inherit`
133
+ to take the parent folder's or collection's auth explicitly; omitting `auth` entirely
134
+ does the same thing.
135
+
136
+ `credentials` keys are the same names the Postman app shows for that auth type —
137
+ `username`/`password` for `basic`, `token` for `bearer`, `key`/`value`/`in` for
138
+ `apikey`, `accessKey`/`secretKey`/`region`/`service` for `awsv4`. A structurally
139
+ valid credential entry does not establish that the server will authenticate it.
140
+ `credentials` is an array of `{key, value}` entries.
141
+
142
+ ## Request body
143
+
144
+ `body` is one shape chosen by `type` — write that branch's keys and nothing else.
145
+
146
+ ```yaml
147
+ body: {type: none}
148
+ ```
149
+ ```yaml
150
+ body:
151
+ type: json # or text, xml, html, javascript
152
+ content: |-
153
+ {"id": 1}
154
+ ```
155
+ ```yaml
156
+ body:
157
+ type: urlencoded
158
+ content:
159
+ - key: grant_type
160
+ value: client_credentials
161
+ ```
162
+ ```yaml
163
+ body:
164
+ type: formdata
165
+ content:
166
+ - key: file
167
+ type: file
168
+ src: ./payload.bin
169
+ - key: note
170
+ type: text
171
+ value: hello
172
+ contentType: text/plain
173
+ ```
174
+ ```yaml
175
+ body:
176
+ type: file
177
+ content:
178
+ src: ./upload.bin # an object with src, not a bare path
179
+ ```
180
+
181
+ Choose `body.type` to match the payload and contract. JSON `content` is a string;
182
+ a block scalar keeps it readable without turning it into a YAML object.
183
+ A *response* body inside an example has a narrower type list:
184
+ see [HTTP examples](#http-example-exampleyaml).
185
+
186
+ ## Scripts
187
+
188
+ ```yaml
189
+ scripts:
190
+ - type: afterResponse
191
+ code: |-
192
+ pm.test('ok', () => pm.response.to.have.status(200));
193
+ ```
194
+
195
+ `type` is `beforeRequest` or `afterResponse` on a request, and protocol-prefixed on a
196
+ collection or folder (`http:beforeRequest`, `http:afterResponse`,
197
+ `graphql:beforeQuery`, `grpc:beforeInvoke`, …). A script entry may also carry
198
+ `language`, `packages`, and `requests`. `language` takes exactly one value,
199
+ **`text/javascript`** — `language: javascript` is a hard error,
200
+ `Invalid input: expected "text/javascript"`. Omitting it is fine.
201
+
202
+ The v2.1 `event:` field is not the v3 `scripts:` field. A script's `type` also
203
+ depends on its scope; moving it between a request and a definition requires checking
204
+ the type as well as the code. See the main skill's verification guidance for
205
+ checking that the intended script behavior survives the edit.
206
+
69
207
  ## YAML rules
70
208
 
71
- Invalid YAML breaks parsing silently in confusing ways — when in doubt,
72
- single-quote it:
209
+ YAML parsing and scalar coercion can change a field's meaning before schema
210
+ validation. Preserve the type the field expects:
73
211
 
74
212
  1. Single-quote any value containing `{{variables}}`:
75
213
  `url: '{{base_url}}/users'` — never leave it unquoted.
@@ -1,86 +1,232 @@
1
- # Non-HTTP request schemas (v3)
2
-
3
- Read this only when a collection actually contains one of these request
4
- types — for the common case, the HTTP schema in the parent
5
- [SKILL.md](../SKILL.md) is the one that applies.
6
-
7
- ## GraphQL request
8
-
9
- - `$kind: "graphql-request"` — required.
10
- - `url` — string.
11
- - `order` — optional.
12
- - `query` — string (the GraphQL query).
13
- - `variables` — string (a YAML string containing a JSON object).
14
- - `headers` — array of `{key, value, description?, disabled?}`.
15
- - `auth` — `{type, credentials}`.
16
- - `settings` — `{disabledSystemHeaders?}`.
17
- - `scripts` — array of `{type: "beforeQuery"|"afterResponse", code, language}`.
18
-
19
- ## gRPC request
20
-
21
- - `$kind: "grpc-request"` — required.
22
- - `url` — string.
23
- - `order` — optional.
24
- - `methodPath` — string.
25
- - `methodDescriptor` — string.
26
- - `message` — `{content: string (JSON)}`.
27
- - `metadata` — array of `{key, value, description?}`.
28
- - `auth` — `{type, credentials}`.
29
- - `settings` —
30
- `{secureConnection?, strictSSL?, maxResponseMessageSize?, includeDefaultFields?, connectionTimeout?}`.
31
- - `scripts` — array of `{type: "beforeInvoke"|"afterResponse", code, language}`.
32
-
33
- ## WebSocket request
34
-
35
- - `$kind: "websocket-request"` — required.
36
- - `url` — string.
37
- - `order` — optional.
38
- - `headers` — array of `{key, value, description?, disabled?}`.
39
- - `queryParams` — array of `{key, value, description?, disabled?}`.
40
- - `settings` — `{handshakeTimeout?, retryCount?, retryDelay?, maxPayload?, strictSSL?}`.
41
-
42
- ## Socket.IO request
43
-
44
- - `$kind: "socket.io-request"` — required.
45
- - `url` — string.
46
- - `order` — optional.
47
- - `headers` — array of `{key, value}`.
48
- - `queryParams` — array of `{key, value}`.
49
- - `events` — array of `{name, description?, subscribeOnConnect: boolean}`.
50
- - `settings` — `{version?, path?, handshakeTimeout?, retryCount?, retryDelay?, strictSSL?}`.
51
-
52
- ## MQTT request
53
-
54
- - `$kind: "mqtt-request"` — required.
55
- - `url` — string.
56
- - `order` — optional.
57
- - `clientId` — string.
58
- - `version` — `4 | 5`.
59
- - `topics` — array of
60
- `{name, qos: 0|1|2, subscribe: boolean, description?, settings: {noLocal?, retainAsPublished?, retainHandling?, subscriptionIdentifier?}}`.
61
- - `lastWill` — `{topic, payload, qos, retain, type: "text"|"json", properties: {messageExpiryInterval?, contentType?}}`.
62
- - `properties` —
63
- `{sessionExpiryInterval?, receiveMaximum?, maximumPacketSize?, requestResponseInformation?, userProperties: [{key, value}]}`.
64
- - `settings` — `{cleanSession?, keepAlive?, autoReconnect?, connectionTimeout?, strictSSL?}`.
65
-
66
- ## MCP request
67
-
68
- - `$kind: "mcp-request"` — required.
69
- - `transport` — `"sse" | "stdio"`.
70
- - `order` — optional.
71
- - SSE shape: `{url, headers?, message, auth?, settings: {strictSSL?, requestTimeout?, sessionTimeout?}}`.
72
- - STDIO shape: `{command, env: [{key, value}], message, auth?, settings: {requestTimeout?}}`.
73
-
74
- ## LLM request
75
-
76
- - `$kind: "llm-request"` — required.
77
- - `url` — string.
78
- - `order` — optional.
79
- - `config` — `{model, provider}`.
80
- - `userPrompts` — array of `{id, value, timestamp, active, type: "text"}`.
81
- - `systemPrompts` — array of `{id, value, timestamp, active, type: "text"}`.
82
- - `mcpConfig` — optional string (JSON config).
83
- - `enabledTools` — optional array of strings.
84
- - `auth` — `{type, credentials}`.
85
- - `settings` —
86
- `{temperature?, maxToken?, streamResponse?, responseFormatJSON?, topP?, presencePenalty?, frequencyPenalty?, maxSteps?, streamTools?}`.
1
+ # Other protocol schemas
2
+
3
+ Consult the section for the request kind being changed. Non-HTTP protocols have
4
+ different body, script, and settings shapes; structural validity does not establish
5
+ that the configured service or provider is available.
6
+
7
+ Shared [auth](http.md#auth), [body](http.md#request-body), and
8
+ [script](http.md#scripts) shapes are documented with HTTP where they apply.
9
+
10
+ - [Request kinds](#request-kinds): GraphQL, gRPC, WebSocket, Socket.IO, MQTT, MCP, LLM
11
+ - [Messages](#messages) and [examples](#examples)
12
+
13
+ ## Request kinds
14
+
15
+ `$kind` is required on these request kinds, and it is the *only* required field except on
16
+ `mcp-request`, which also requires `transport`. So for every other kind a half-written
17
+ request can pass structural checks without being executable. Only `*.request.yaml`
18
+ files are discovered as requests; the right fields in a differently named file
19
+ do not make it runnable. Each kind has its own settings; HTTP settings do not
20
+ apply to every protocol. Common metadata fields `id`, `name`, `description` and `order`
21
+ are available on all of them and omitted below.
22
+
23
+ ### `graphql-request`
24
+
25
+ `url`, `query`, `variables` (a **string** of JSON), `headers`, `auth`, `schema`,
26
+ `scripts`, `examples`, `settings`.
27
+
28
+ There is **no `queryParams`** — put query-string parameters in the `url`.
29
+
30
+ `settings`: `disabledSystemHeaders`.
31
+
32
+ `schema` is one shape chosen by `source`:
33
+
34
+ ```yaml
35
+ schema: {source: none}
36
+ ```
37
+ ```yaml
38
+ schema: {source: auto}
39
+ ```
40
+ ```yaml
41
+ schema:
42
+ source: file
43
+ location: ./schema.graphql
44
+ ```
45
+ ```yaml
46
+ schema:
47
+ source: api
48
+ apiId: <id>
49
+ versionId: <id> # releaseId optional
50
+ ```
51
+ ```yaml
52
+ schema:
53
+ source: specification
54
+ specificationId: <id>
55
+ ```
56
+
57
+ ### `grpc-request`
58
+
59
+ `url`, `methodPath` (e.g. `helloworld.Greeter/SayHello`), `methodDescriptor` (an inline
60
+ proto definition), `message` (`{content}`), `metadata` (per-call headers as
61
+ `{key, value}` array entries), `auth`, `schema`, `scripts`, `examples`, `settings`.
62
+
63
+ `settings`: `secureConnection`, `strictSSL`, `serverNameOverride`,
64
+ `maxResponseMessageSize`, `includeDefaultFields`, `connectionTimeout`.
65
+
66
+ ### `websocket-request`
67
+
68
+ `url`, `headers`, `queryParams`, `messages`, `examples`, `settings`.
69
+
70
+ `messages` and `examples` are **strings** — relative paths to directories, not arrays.
71
+ An array fails with `Invalid input: expected string, received array`.
72
+
73
+ `settings`: `handshakeTimeout`, `retryCount`, `maxPayload`, `retryDelay`, `strictSSL`.
74
+
75
+ ### `socket.io-request`
76
+
77
+ `url`, `headers`, `queryParams`, `events`, `messages`, `examples`, `settings`.
78
+
79
+ ```yaml
80
+ events:
81
+ - name: chat:message
82
+ subscribeOnConnect: true
83
+ description: Inbound chat traffic
84
+ ```
85
+
86
+ `settings`: `version` (the **strings** `'2'`, `'3'`, `'4'`), `path`,
87
+ `handshakeTimeout`, `retryCount`, `retryDelay`, `strictSSL`. Bare `version: 4` is
88
+ rejected — `Invalid option: expected one of "2"|"3"|"4" (path: /settings/version)`.
89
+
90
+ ### `mqtt-request`
91
+
92
+ `url`, `clientId`, `version`, `topics`, `lastWill`, `properties`, `auth`, `messages`,
93
+ `examples`, `settings`.
94
+
95
+ `version` is a **number**, either `4` or `5`, and it sits at the top level rather than
96
+ in `settings`. Do not quote it — that is the opposite of `socket.io-request`, whose
97
+ `settings.version` is the string `'2'`, `'3'` or `'4'`.
98
+
99
+ ```yaml
100
+ topics:
101
+ - name: sensors/+/temp
102
+ qos: 1 # a number: 0, 1 or 2
103
+ subscribe: true
104
+ lastWill:
105
+ topic: status/client
106
+ payload: offline
107
+ type: text
108
+ qos: 0
109
+ retain: true
110
+ ```
111
+
112
+ `properties`: `sessionExpiryInterval`, `receiveMaximum`, `maximumPacketSize`,
113
+ `requestResponseInformation`, `userProperties`.
114
+
115
+ `settings`: `cleanSession`, `keepAlive`, `autoReconnect`, `connectionTimeout`,
116
+ `strictSSL`.
117
+
118
+ ### `mcp-request`
119
+
120
+ Requires `$kind` **and** `transport`, which selects the legal keys. Common to both:
121
+ `message`, `auth`.
122
+
123
+ | `transport` | Its keys | `settings` |
124
+ |---|---|---|
125
+ | `stdio` | `command`, `env` (`{key, value}` array entries) | `version`, `requestTimeout` |
126
+ | `sse` | `url`, `headers` | `version`, `requestTimeout`, `strictSSL`, `sessionTimeout` |
127
+
128
+ There are no other transports. `message` is a JSON-RPC envelope as a **string**;
129
+ `{{variables}}` interpolate inside it.
130
+
131
+ ```yaml
132
+ $kind: mcp-request
133
+ transport: stdio # command + env; no url
134
+ command: uvx some-mcp-server
135
+ env:
136
+ - key: API_KEY
137
+ value: '{{KEY}}'
138
+ message: |-
139
+ {"method": "tools/call", "params": {"name": "do_thing", "arguments": {}}}
140
+ order: 1000
141
+ ```
142
+
143
+ ```yaml
144
+ $kind: mcp-request
145
+ transport: sse # url + headers; no command
146
+ url: https://mcp.example.com/sse
147
+ headers:
148
+ - key: Authorization
149
+ value: 'Bearer {{KEY}}'
150
+ message: |-
151
+ {"method": "tools/list"}
152
+ ```
153
+
154
+ ### `llm-request`
155
+
156
+ `url`, `config`, `userPrompts`, `systemPrompts`, `mcpConfig`, `enabledTools`,
157
+ `clientTools`, `auth`, `settings`.
158
+
159
+ `config` takes `model` and `provider`, both free-form strings. Schema validation
160
+ does not establish that the configured provider or model is available at run time.
161
+
162
+ Prompt entries are `{id, value, timestamp, active, contentType}`. The content
163
+ format is expressed by `contentType`; `type` is not a prompt-entry field.
164
+ `timestamp` is numeric, and `active` is boolean.
165
+
166
+ `mcpConfig` is a **string containing a JSON array**, not nested YAML and not
167
+ `mcp.json`'s `mcpServers` object. `clientTools`, for tools the model may call with no
168
+ MCP server behind them, is `[{id, tools: [{id}]}]`.
169
+
170
+ For example, a prompt and a stdio MCP tool configuration use different scalar
171
+ shapes within the same request:
172
+
173
+ ```yaml
174
+ userPrompts:
175
+ - id: '1'
176
+ value: Summarise the last 10 orders
177
+ timestamp: 1758412800000
178
+ active: true
179
+ contentType: text
180
+ mcpConfig: |-
181
+ [
182
+ {
183
+ "name": "orders",
184
+ "config": {"command": "uvx", "args": ["orders-mcp-server"]},
185
+ "enabled": true,
186
+ "disabledTools": []
187
+ }
188
+ ]
189
+ ```
190
+
191
+ `settings`: `temperature`, `maxToken`, `maxSteps`, `topP`, `topK`, `seed`,
192
+ `presencePenalty`, `frequencyPenalty`, `repetitionPenalty`, `contextWindow`,
193
+ `streamResponse`, `streamTools`, `responseFormatJSON`. If a tool chain stops early,
194
+ distinguish a step limit from a tool or provider failure before changing `maxSteps`;
195
+ the limit also bounds execution cost and duration.
196
+
197
+ ## Messages
198
+
199
+ A `messages` directory holds `*.message.yaml` files. Each kind has different required
200
+ fields; a valid WebSocket message is not automatically a valid MQTT message.
201
+
202
+ ```yaml
203
+ $kind: websocket-message # requires content + contentType
204
+ content: '{"op":"subscribe"}'
205
+ contentType: json # text | json | xml | html | hex | base64
206
+ ```
207
+
208
+ ```yaml
209
+ $kind: socket.io-message # requires eventName + args
210
+ eventName: chat:message
211
+ acknowledgement: true
212
+ args:
213
+ - content: '{"text":"hi"}'
214
+ contentType: json
215
+ ```
216
+
217
+ ```yaml
218
+ $kind: mqtt-message # requires content + contentType + topic
219
+ topic: sensors/1/temp
220
+ content: '21.5'
221
+ contentType: text # text | json | hex | base64
222
+ qos: 1
223
+ retain: false
224
+ ```
225
+
226
+ ## Examples
227
+
228
+ Examples live in `.resources/<request-name>.resources/examples/*.example.yaml`, with
229
+ `$kind` matching the request's protocol — `graphql-example`,
230
+ `grpc-example`, `websocket-example`, `socket.io-example`, `mqtt-example`. An
231
+ `*-example` kind is rejected in a `*.request.yaml`, and a `*-request` kind is rejected
232
+ in a `*.example.yaml`.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: datasets
3
- description: Use when a collection needs queried or joined test inputs, a reusable named view, spreadsheet worksheet data, live database rows, or script access through pm.datasets(). Chooses between a simple iteration file and a dataset while preserving query semantics, portability, and credential boundaries. Use for requests such as "run this collection over database rows".
3
+ description: Use when creating or repairing dataset manifests, or when a collection needs queried or joined test inputs, a reusable named view, spreadsheet worksheet data, live database rows, or script access through pm.datasets(). Chooses between a simple iteration file and a dataset while preserving query semantics, portability, and credential boundaries. Use for requests such as "run this collection over database rows".
4
4
  ---
5
5
 
6
6
  # Datasets
@@ -43,15 +43,16 @@ stay with `collection run -d`; a dataset should earn its extra configuration.
43
43
 
44
44
  Create a local manifest with `postman dataset create <path.dataset.yaml>
45
45
  --name <name>`, then attach sources with `dataset source add`. Source commands
46
- supply IDs and validation that hand-written entries can miss. Existing-dataset
47
- commands accept a local path or workspace ID; `list` needs a local path for
46
+ supply IDs and validation that hand-written entries can miss. When inspecting
47
+ or repairing manifest fields, consult [Dataset YAML](reference/schema.md).
48
+ Existing-dataset commands accept a local path or workspace ID; `list` needs a local path for
48
49
  local discovery, while workspace create/list use `--workspace`.
49
50
 
50
51
  File sources are copied into `data_dir` unless `--ref-only` is used. That option
51
52
  records absolute paths and makes the dataset machine-specific. For a workspace
52
53
  dataset, adding `--file` alone registers a local filesystem source; `--upload`
53
- is what uploads bytes. Use **bootstrap**'s workspace sync when publishing the
54
- whole project; there is no separate `dataset push`.
54
+ is what uploads bytes. Datasets are pushed along with the workspace; there is
55
+ no separate `dataset push`.
55
56
 
56
57
  For spreadsheet sources, use the worksheet-aware guidance in
57
58
  [Spreadsheet sources](reference/spreadsheets.md). For ordinary source names,
@@ -0,0 +1,51 @@
1
+ # Dataset YAML
2
+
3
+ Consult this reference when inspecting or repairing manifest fields. Source and
4
+ view commands can supply generated IDs when creating new entries.
5
+
6
+ ```
7
+ postman/datasets/users/
8
+ ├── users.dataset.yaml
9
+ └── .resources/
10
+ └── rows.json
11
+ ```
12
+
13
+ ```yaml
14
+ type: dataset # not $kind
15
+ name: "Users"
16
+ id: 3f2b6c1e-9d4a-4f81-bc37-5e0a71d9c402 # uuid4
17
+ data_dir: .resources
18
+ sources:
19
+ - from: embedded_datasource
20
+ datasource:
21
+ name: Records
22
+ id: 8a1d0e77-5c62-4b19-9f03-2d6e4a8b7c15
23
+ format: json # this example uses a JSON file
24
+ source_type: static # static for files, dynamic for databases
25
+ location:
26
+ type: local_filesystem
27
+ value: rows.json # relative to data_dir
28
+ views:
29
+ - from: embedded_view
30
+ view:
31
+ name: Records_default_view
32
+ id: c94e5b20-71af-4d36-8e52-0b7c6d1934fa
33
+ query: SELECT id, name FROM Records ORDER BY id
34
+ ```
35
+
36
+ `sources` and `views` are optional — `type`, `name`, `id` and `data_dir` alone is a
37
+ valid dataset, and is what `postman dataset create <path> --name X` writes.
38
+
39
+ For example, a MySQL source sets `format: mysql`, `source_type: dynamic`,
40
+ `ingest: false`, a `dsKey` and a `slug`, with `location.type: mysql`, `location.value`
41
+ a DSN and `location.table` the table name.
42
+
43
+ A view's `query` is SQL over the source `name`, not over the file name.
44
+
45
+ There is no `dataset lint`. `postman dataset get <path>` checks the structure offline.
46
+ `postman dataset query <path> -q "<sql>"` runs SQL against the source, which also proves
47
+ the data parses and the query resolves — note the `-q` flag is required.
48
+
49
+ Connector support and credential handling depend on the installed CLI. Use the
50
+ **datasets** skill's connector and credential guidance when changing a source;
51
+ the MySQL example above is not a complete list of supported connectors.
@@ -49,7 +49,6 @@ result that says nothing about the caller's actual workflow.
49
49
  and reports. Connector blocks need `--workspace` even for a local file;
50
50
  otherwise failure occurs inside the graph. An access denial across several
51
51
  workspaces points toward credentials or entitlement, not an empty flow list.
52
- Use **bootstrap** for unresolved CLI/authentication setup.
53
52
 
54
53
  Read [command options](reference/flow_cli_flags.md) for inputs, reporters,
55
54
  dataset iteration, and flag collisions; check installed subcommand `-h` before
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: performance-testing
3
- description: Use when load-testing or benchmarking an API with concurrent virtual users and latency or error thresholds. Reuses a collection to probe a chosen failure mode and distinguishes target limits from load-generator limits. Use for requests such as "load test this API".
3
+ description: Use when load-testing or benchmarking an API with concurrent virtual users and latency or error thresholds, or when importing or migrating a JMeter `.jmx` plan or a Gatling simulation (Java/Kotlin/Scala/JS/TS) into a Postman collection plus a `postman performance run` configuration. Reuses a collection to probe a chosen failure mode and distinguishes target limits from load-generator limits. Use for requests such as "load test this API", "import my JMeter plan", or "convert my Gatling project to Postman".
4
4
  ---
5
5
 
6
6
  # Performance Testing
@@ -47,6 +47,19 @@ and which JMeter features have no equivalent here — think-time timers,
47
47
  concurrent thread groups, and non-HTTP (JDBC/FTP/LDAP/Java) samplers are
48
48
  reported, never faked.
49
49
 
50
+ ## Importing from Gatling
51
+
52
+ Have a Gatling project (a Java/Kotlin/Scala/JS/TS `Simulation`) instead of a
53
+ collection? Convert it by following `references/gatling-import/README.md`, then
54
+ treat the result as the collection above. There is no importer to run — you read
55
+ the source and build the collection, environment, `run.sh` and gap report, using
56
+ the files next to that README as the algorithm (`mapping.md`, `injection.md`,
57
+ `feeders.md`, `unsupported.md`). The gap report marks what mapped exactly, what
58
+ was approximated, and what has no equivalent — WebSocket/SSE and other non-HTTP
59
+ steps, arrival-rate (open-model) injection, think-time pauses, throttling and
60
+ retries are reported, never faked. Open-model injection is converted to VUs via
61
+ Little's law with the arithmetic shown, not guessed.
62
+
50
63
  ## Verification
51
64
 
52
65
  Report the workload, runner, achieved traffic, latency and error metrics,