@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.
- package/README.md +2 -2
- package/dist/hosts/factory.js +29 -3
- package/hooks/session-start-context.md +1 -1
- package/mcp.pi.json +2 -2
- package/package.json +1 -1
- package/skills/api-discovery/SKILL.md +7 -2
- package/skills/api-documentation/SKILL.md +2 -3
- package/skills/api-engineer/SKILL.md +13 -15
- package/skills/api-mocking/SKILL.md +4 -2
- package/skills/api-monitoring/SKILL.md +35 -25
- package/skills/api-simulation/SKILL.md +109 -74
- package/skills/api-simulation/reference/context_file.md +183 -149
- package/skills/api-simulation/reference/sim_yaml_schema.md +1 -1
- package/skills/api-testing/SKILL.md +3 -3
- package/skills/application-testing/SKILL.md +2 -2
- package/skills/ci-integration/SKILL.md +7 -5
- package/skills/cli-install/SKILL.md +29 -0
- package/skills/collection-schema-v3/SKILL.md +21 -11
- package/skills/collection-schema-v3/reference/environment.md +2 -0
- package/skills/collection-schema-v3/reference/globals.md +40 -0
- package/skills/collection-schema-v3/reference/http.md +149 -11
- package/skills/collection-schema-v3/reference/other_protocols.md +232 -86
- package/skills/datasets/SKILL.md +6 -5
- package/skills/datasets/reference/schema.md +51 -0
- package/skills/flows/SKILL.md +0 -1
- package/skills/performance-testing/SKILL.md +14 -1
- package/skills/performance-testing/references/gatling-import/README.md +141 -0
- package/skills/performance-testing/references/gatling-import/feeders.md +31 -0
- package/skills/performance-testing/references/gatling-import/injection.md +88 -0
- package/skills/performance-testing/references/gatling-import/mapping.md +91 -0
- package/skills/performance-testing/references/gatling-import/unsupported.md +31 -0
- package/skills/postman-mcp-server/SKILL.md +1 -1
- package/skills/variables/SKILL.md +2 -2
- package/skills/webhook-testing/SKILL.md +1 -1
- package/skills/workspaces/SKILL.md +53 -0
- package/skills/bootstrap/SKILL.md +0 -140
- 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
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
72
|
-
|
|
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
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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`.
|
package/skills/datasets/SKILL.md
CHANGED
|
@@ -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.
|
|
47
|
-
|
|
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.
|
|
54
|
-
|
|
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.
|
package/skills/flows/SKILL.md
CHANGED
|
@@ -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,
|