@probelabs/visor 0.1.132 → 0.1.137
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/dist/config/config-reloader.d.ts +1 -0
- package/dist/config/config-reloader.d.ts.map +1 -1
- package/dist/config/config-watcher.d.ts +1 -0
- package/dist/config/config-watcher.d.ts.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/docs/ai-custom-tools-usage.md +37 -0
- package/dist/docs/ai-custom-tools.md +43 -1
- package/dist/docs/custom-tools.md +70 -1
- package/dist/docs/script.md +542 -27
- package/dist/docs/testing/cookbook.md +47 -0
- package/dist/examples/README.md +4 -0
- package/dist/examples/api-tools-ai-example.yaml +63 -0
- package/dist/examples/api-tools-inline-overlay-example.yaml +126 -0
- package/dist/examples/api-tools-library.yaml +18 -0
- package/dist/examples/api-tools-mcp-example.yaml +55 -0
- package/dist/examples/openapi/profiles-overlay-rename.yaml +3 -0
- package/dist/examples/openapi/users-api.json +91 -0
- package/dist/examples/openapi/users-overlay-rename.yaml +3 -0
- package/dist/generated/config-schema.d.ts +223 -74
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/generated/config-schema.json +251 -79
- package/dist/index.js +45128 -25001
- package/dist/output/traces/{run-2026-02-18T11-06-48-673Z.ndjson → run-2026-02-23T08-59-32-321Z.ndjson} +84 -84
- package/dist/{traces/run-2026-02-18T11-07-37-310Z.ndjson → output/traces/run-2026-02-23T09-00-20-148Z.ndjson} +1148 -1063
- package/dist/providers/ai-check-provider.d.ts.map +1 -1
- package/dist/providers/api-tool-executor.d.ts +43 -0
- package/dist/providers/api-tool-executor.d.ts.map +1 -0
- package/dist/providers/command-check-provider.d.ts.map +1 -1
- package/dist/providers/custom-tool-executor.d.ts +21 -0
- package/dist/providers/custom-tool-executor.d.ts.map +1 -1
- package/dist/providers/mcp-check-provider.d.ts.map +1 -1
- package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
- package/dist/providers/script-check-provider.d.ts +18 -2
- package/dist/providers/script-check-provider.d.ts.map +1 -1
- package/dist/sdk/{check-provider-registry-7TCA3NSG.mjs → check-provider-registry-BCGP62RY.mjs} +9 -8
- package/dist/sdk/{check-provider-registry-RRUZHGJI.mjs → check-provider-registry-SA2WHPLO.mjs} +9 -8
- package/dist/sdk/{check-provider-registry-4WLTLPMU.mjs → check-provider-registry-SCL4KP55.mjs} +9 -8
- package/dist/sdk/{chunk-LMJNI6RM.mjs → chunk-ALB3N4ZQ.mjs} +12 -5
- package/dist/sdk/{chunk-LMJNI6RM.mjs.map → chunk-ALB3N4ZQ.mjs.map} +1 -1
- package/dist/sdk/{chunk-27RV5RR2.mjs → chunk-BRD36I43.mjs} +3 -3
- package/dist/sdk/{chunk-5VY5QJTY.mjs → chunk-DFKP7LY6.mjs} +1896 -1762
- package/dist/sdk/chunk-DFKP7LY6.mjs.map +1 -0
- package/dist/sdk/{chunk-UBDHAGYY.mjs → chunk-E2N3U5HU.mjs} +5 -5
- package/dist/sdk/{chunk-XGI47XIH.mjs → chunk-F4K5WFSM.mjs} +1896 -1762
- package/dist/sdk/chunk-F4K5WFSM.mjs.map +1 -0
- package/dist/sdk/{chunk-BOGVSF57.mjs → chunk-J6F5K5EG.mjs} +1896 -1762
- package/dist/sdk/chunk-J6F5K5EG.mjs.map +1 -0
- package/dist/sdk/{chunk-U3BLLEW3.mjs → chunk-KPRFDKQX.mjs} +329 -80
- package/dist/sdk/chunk-KPRFDKQX.mjs.map +1 -0
- package/dist/sdk/{chunk-VF6XIUE4.mjs → chunk-LW3INISN.mjs} +32 -1
- package/dist/sdk/{chunk-VF6XIUE4.mjs.map → chunk-LW3INISN.mjs.map} +1 -1
- package/dist/sdk/{chunk-VG7FWDC2.mjs → chunk-QUEWQWDX.mjs} +11 -4
- package/dist/sdk/{chunk-VG7FWDC2.mjs.map → chunk-QUEWQWDX.mjs.map} +1 -1
- package/dist/sdk/{chunk-BGBXLPLL.mjs → chunk-UMFEBYCN.mjs} +5 -5
- package/dist/sdk/chunk-XKCER23W.mjs +1490 -0
- package/dist/sdk/chunk-XKCER23W.mjs.map +1 -0
- package/dist/sdk/{chunk-FAKITJ3J.mjs → chunk-YTAGJZHN.mjs} +3 -3
- package/dist/sdk/{chunk-XJQKTK6V.mjs → chunk-ZUEQNCKB.mjs} +2 -2
- package/dist/sdk/{config-FMIIATKX.mjs → config-3UIU4TMP.mjs} +3 -3
- package/dist/sdk/{failure-condition-evaluator-PNONVBXD.mjs → failure-condition-evaluator-3B3G5NYW.mjs} +4 -4
- package/dist/sdk/{failure-condition-evaluator-MUUAK7MN.mjs → failure-condition-evaluator-B5JJFYKU.mjs} +4 -4
- package/dist/sdk/{github-frontend-DWF6BLZH.mjs → github-frontend-VAWVSCNX.mjs} +4 -4
- package/dist/sdk/{github-frontend-WR4S3NG5.mjs → github-frontend-ZOVXPPHQ.mjs} +4 -4
- package/dist/sdk/{host-S3LSWESP.mjs → host-LOQWBHWT.mjs} +2 -2
- package/dist/sdk/{host-U7V54J2H.mjs → host-TEQ7HKKH.mjs} +2 -2
- package/dist/sdk/{liquid-extensions-YDIIH33Q.mjs → liquid-extensions-PLBOMRLI.mjs} +3 -3
- package/dist/sdk/{routing-MVDVJDYJ.mjs → routing-HR6N43RQ.mjs} +6 -6
- package/dist/sdk/{routing-F4FOWVKF.mjs → routing-SEQYM4N6.mjs} +6 -6
- package/dist/sdk/schedule-tool-2COUUTF7.mjs +18 -0
- package/dist/sdk/{schedule-tool-handler-FRN3KKRM.mjs → schedule-tool-handler-5BDMLHS5.mjs} +9 -8
- package/dist/sdk/{schedule-tool-handler-VFES42DD.mjs → schedule-tool-handler-OXGTPLST.mjs} +9 -8
- package/dist/sdk/{schedule-tool-handler-7DNEGDZC.mjs → schedule-tool-handler-Y2UABBXN.mjs} +9 -8
- package/dist/sdk/sdk.d.mts +55 -2
- package/dist/sdk/sdk.d.ts +55 -2
- package/dist/sdk/sdk.js +2367 -482
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +8 -7
- package/dist/sdk/sdk.mjs.map +1 -1
- package/dist/sdk/{trace-helpers-RDPXIN4S.mjs → trace-helpers-FAAGLXBI.mjs} +2 -2
- package/dist/sdk/{trace-helpers-KSPGA24B.mjs → trace-helpers-IGMH7ZPP.mjs} +2 -2
- package/dist/sdk/{workflow-check-provider-BMVJ6X7N.mjs → workflow-check-provider-7SR7ZWSV.mjs} +9 -8
- package/dist/sdk/{workflow-check-provider-CPGIRZMH.mjs → workflow-check-provider-L2ZUOMJR.mjs} +9 -8
- package/dist/sdk/{workflow-check-provider-4NFWH6YO.mjs → workflow-check-provider-WLA7LO56.mjs} +9 -8
- package/dist/sdk/workflow-check-provider-WLA7LO56.mjs.map +1 -0
- package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -1
- package/dist/state-machine-execution-engine.d.ts.map +1 -1
- package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -1
- package/dist/test-runner/index.d.ts.map +1 -1
- package/dist/test-runner/validator.d.ts.map +1 -1
- package/dist/traces/{run-2026-02-18T11-06-48-673Z.ndjson → run-2026-02-23T08-59-32-321Z.ndjson} +84 -84
- package/dist/{output/traces/run-2026-02-18T11-07-37-310Z.ndjson → traces/run-2026-02-23T09-00-20-148Z.ndjson} +1148 -1063
- package/dist/types/config.d.ts +55 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/config-loader.d.ts +5 -0
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/sandbox.d.ts +8 -0
- package/dist/utils/sandbox.d.ts.map +1 -1
- package/dist/utils/script-tool-environment.d.ts +90 -0
- package/dist/utils/script-tool-environment.d.ts.map +1 -0
- package/dist/utils/tool-resolver.d.ts +18 -0
- package/dist/utils/tool-resolver.d.ts.map +1 -0
- package/package.json +11 -4
- package/dist/sdk/chunk-5VY5QJTY.mjs.map +0 -1
- package/dist/sdk/chunk-BOGVSF57.mjs.map +0 -1
- package/dist/sdk/chunk-U3BLLEW3.mjs.map +0 -1
- package/dist/sdk/chunk-XGI47XIH.mjs.map +0 -1
- /package/dist/sdk/{check-provider-registry-4WLTLPMU.mjs.map → check-provider-registry-BCGP62RY.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-7TCA3NSG.mjs.map → check-provider-registry-SA2WHPLO.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-RRUZHGJI.mjs.map → check-provider-registry-SCL4KP55.mjs.map} +0 -0
- /package/dist/sdk/{chunk-27RV5RR2.mjs.map → chunk-BRD36I43.mjs.map} +0 -0
- /package/dist/sdk/{chunk-BGBXLPLL.mjs.map → chunk-E2N3U5HU.mjs.map} +0 -0
- /package/dist/sdk/{chunk-UBDHAGYY.mjs.map → chunk-UMFEBYCN.mjs.map} +0 -0
- /package/dist/sdk/{chunk-FAKITJ3J.mjs.map → chunk-YTAGJZHN.mjs.map} +0 -0
- /package/dist/sdk/{chunk-XJQKTK6V.mjs.map → chunk-ZUEQNCKB.mjs.map} +0 -0
- /package/dist/sdk/{config-FMIIATKX.mjs.map → config-3UIU4TMP.mjs.map} +0 -0
- /package/dist/sdk/{failure-condition-evaluator-MUUAK7MN.mjs.map → failure-condition-evaluator-3B3G5NYW.mjs.map} +0 -0
- /package/dist/sdk/{failure-condition-evaluator-PNONVBXD.mjs.map → failure-condition-evaluator-B5JJFYKU.mjs.map} +0 -0
- /package/dist/sdk/{github-frontend-DWF6BLZH.mjs.map → github-frontend-VAWVSCNX.mjs.map} +0 -0
- /package/dist/sdk/{github-frontend-WR4S3NG5.mjs.map → github-frontend-ZOVXPPHQ.mjs.map} +0 -0
- /package/dist/sdk/{host-S3LSWESP.mjs.map → host-LOQWBHWT.mjs.map} +0 -0
- /package/dist/sdk/{host-U7V54J2H.mjs.map → host-TEQ7HKKH.mjs.map} +0 -0
- /package/dist/sdk/{liquid-extensions-YDIIH33Q.mjs.map → liquid-extensions-PLBOMRLI.mjs.map} +0 -0
- /package/dist/sdk/{routing-F4FOWVKF.mjs.map → routing-HR6N43RQ.mjs.map} +0 -0
- /package/dist/sdk/{routing-MVDVJDYJ.mjs.map → routing-SEQYM4N6.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-7DNEGDZC.mjs.map → schedule-tool-2COUUTF7.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-FRN3KKRM.mjs.map → schedule-tool-handler-5BDMLHS5.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-VFES42DD.mjs.map → schedule-tool-handler-OXGTPLST.mjs.map} +0 -0
- /package/dist/sdk/{trace-helpers-KSPGA24B.mjs.map → schedule-tool-handler-Y2UABBXN.mjs.map} +0 -0
- /package/dist/sdk/{trace-helpers-RDPXIN4S.mjs.map → trace-helpers-FAAGLXBI.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-4NFWH6YO.mjs.map → trace-helpers-IGMH7ZPP.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-BMVJ6X7N.mjs.map → workflow-check-provider-7SR7ZWSV.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-CPGIRZMH.mjs.map → workflow-check-provider-L2ZUOMJR.mjs.map} +0 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
version: "1.0"
|
|
2
|
+
|
|
3
|
+
# Reuse the API bundle from a separate tools file and expose it to AI.
|
|
4
|
+
extends: ./api-tools-library.yaml
|
|
5
|
+
|
|
6
|
+
checks:
|
|
7
|
+
api-assistant:
|
|
8
|
+
type: ai
|
|
9
|
+
prompt: |
|
|
10
|
+
You have access to users-api MCP tools generated from OpenAPI.
|
|
11
|
+
Explain how to call getUser and which required fields are needed.
|
|
12
|
+
ai_custom_tools:
|
|
13
|
+
- users-api
|
|
14
|
+
ai:
|
|
15
|
+
provider: anthropic
|
|
16
|
+
model: claude-3-5-sonnet-20241022
|
|
17
|
+
on:
|
|
18
|
+
- manual
|
|
19
|
+
|
|
20
|
+
api-tool-whitelist-check:
|
|
21
|
+
type: mcp
|
|
22
|
+
transport: custom
|
|
23
|
+
method: createUser
|
|
24
|
+
methodArgs:
|
|
25
|
+
requestBody:
|
|
26
|
+
name: Alice
|
|
27
|
+
on:
|
|
28
|
+
- issue_comment
|
|
29
|
+
|
|
30
|
+
tests:
|
|
31
|
+
defaults:
|
|
32
|
+
strict: true
|
|
33
|
+
ai_provider: mock
|
|
34
|
+
cases:
|
|
35
|
+
- name: api-ai-example-loads-reusable-api-bundle
|
|
36
|
+
description: AI step resolves users-api from external library file
|
|
37
|
+
event: manual
|
|
38
|
+
fixture: local.minimal
|
|
39
|
+
mocks:
|
|
40
|
+
api-assistant:
|
|
41
|
+
text: getUser requires the id path parameter.
|
|
42
|
+
expect:
|
|
43
|
+
calls:
|
|
44
|
+
- step: api-assistant
|
|
45
|
+
exactly: 1
|
|
46
|
+
prompts:
|
|
47
|
+
- step: api-assistant
|
|
48
|
+
contains:
|
|
49
|
+
- users-api
|
|
50
|
+
- getUser
|
|
51
|
+
|
|
52
|
+
- name: api-ai-example-keeps-whitelist-enforcement
|
|
53
|
+
description: API bundle whitelist still applies when reused in AI config
|
|
54
|
+
event: issue_comment
|
|
55
|
+
fixture: gh.issue_comment.standard
|
|
56
|
+
expect:
|
|
57
|
+
calls:
|
|
58
|
+
- step: api-tool-whitelist-check
|
|
59
|
+
exactly: 1
|
|
60
|
+
outputs:
|
|
61
|
+
- step: api-tool-whitelist-check
|
|
62
|
+
path: issues[0].message
|
|
63
|
+
matches: "(?i)Custom tool not found: createUser"
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
version: "1.0"
|
|
2
|
+
|
|
3
|
+
tools:
|
|
4
|
+
users-api-file-overlay:
|
|
5
|
+
type: api
|
|
6
|
+
name: users-api-file-overlay
|
|
7
|
+
description: File-based OpenAPI and overlay definitions
|
|
8
|
+
spec: ./openapi/users-api.json
|
|
9
|
+
headers:
|
|
10
|
+
Authorization: "Bearer ${USERS_API_BEARER_TOKEN}"
|
|
11
|
+
X-Tenant-Id: "${USERS_API_TENANT_ID}"
|
|
12
|
+
overlays:
|
|
13
|
+
- ./openapi/users-overlay-rename.yaml
|
|
14
|
+
whitelist:
|
|
15
|
+
- getUserFromFileOverlay
|
|
16
|
+
|
|
17
|
+
users-api-inline-mixed-overlay:
|
|
18
|
+
type: api
|
|
19
|
+
name: users-api-inline-mixed-overlay
|
|
20
|
+
description: Inline OpenAPI plus mixed file + inline overlays
|
|
21
|
+
headers:
|
|
22
|
+
Authorization: "Bearer ${PROFILES_API_BEARER_TOKEN}"
|
|
23
|
+
X-Tenant-Id: "${USERS_API_TENANT_ID}"
|
|
24
|
+
spec:
|
|
25
|
+
openapi: "3.0.0"
|
|
26
|
+
info:
|
|
27
|
+
title: Profiles API Inline Example
|
|
28
|
+
version: "1.0.0"
|
|
29
|
+
servers:
|
|
30
|
+
- url: https://api.example.invalid
|
|
31
|
+
paths:
|
|
32
|
+
/profiles/{id}:
|
|
33
|
+
get:
|
|
34
|
+
operationId: getProfile
|
|
35
|
+
summary: Get profile by id
|
|
36
|
+
parameters:
|
|
37
|
+
- name: id
|
|
38
|
+
in: path
|
|
39
|
+
required: true
|
|
40
|
+
schema:
|
|
41
|
+
type: string
|
|
42
|
+
responses:
|
|
43
|
+
"200":
|
|
44
|
+
description: Profile payload
|
|
45
|
+
content:
|
|
46
|
+
application/json:
|
|
47
|
+
schema:
|
|
48
|
+
type: object
|
|
49
|
+
properties:
|
|
50
|
+
id:
|
|
51
|
+
type: string
|
|
52
|
+
handle:
|
|
53
|
+
type: string
|
|
54
|
+
overlays:
|
|
55
|
+
- ./openapi/profiles-overlay-rename.yaml
|
|
56
|
+
- actions:
|
|
57
|
+
- target: "$.paths['/profiles/{id}'].get.operationId"
|
|
58
|
+
update: getProfileFromInlineOverlay
|
|
59
|
+
|
|
60
|
+
checks:
|
|
61
|
+
api-file-overlay-required-input:
|
|
62
|
+
type: mcp
|
|
63
|
+
transport: custom
|
|
64
|
+
method: getUserFromFileOverlay
|
|
65
|
+
methodArgs: {}
|
|
66
|
+
on:
|
|
67
|
+
- manual
|
|
68
|
+
|
|
69
|
+
api-inline-overlay-required-input:
|
|
70
|
+
type: mcp
|
|
71
|
+
transport: custom
|
|
72
|
+
method: getProfileFromInlineOverlay
|
|
73
|
+
methodArgs: {}
|
|
74
|
+
on:
|
|
75
|
+
- issue_comment
|
|
76
|
+
|
|
77
|
+
api-inline-overlay-original-name-blocked:
|
|
78
|
+
type: mcp
|
|
79
|
+
transport: custom
|
|
80
|
+
method: getProfile
|
|
81
|
+
methodArgs: {}
|
|
82
|
+
on:
|
|
83
|
+
- pr_opened
|
|
84
|
+
|
|
85
|
+
tests:
|
|
86
|
+
defaults:
|
|
87
|
+
strict: true
|
|
88
|
+
cases:
|
|
89
|
+
- name: api-inline-example-file-overlay-tool-is-generated
|
|
90
|
+
description: File-based OpenAPI + overlay renames getUser to getUserFromFileOverlay
|
|
91
|
+
event: manual
|
|
92
|
+
fixture: local.minimal
|
|
93
|
+
expect:
|
|
94
|
+
calls:
|
|
95
|
+
- step: api-file-overlay-required-input
|
|
96
|
+
exactly: 1
|
|
97
|
+
outputs:
|
|
98
|
+
- step: api-file-overlay-required-input
|
|
99
|
+
path: issues[0].message
|
|
100
|
+
matches: "(?i)required property 'id'"
|
|
101
|
+
|
|
102
|
+
- name: api-inline-example-inline-spec-and-mixed-overlays-work
|
|
103
|
+
description: Inline OpenAPI supports file and inline overlays, applied in order
|
|
104
|
+
event: issue_comment
|
|
105
|
+
fixture: gh.issue_comment.standard
|
|
106
|
+
expect:
|
|
107
|
+
calls:
|
|
108
|
+
- step: api-inline-overlay-required-input
|
|
109
|
+
exactly: 1
|
|
110
|
+
outputs:
|
|
111
|
+
- step: api-inline-overlay-required-input
|
|
112
|
+
path: issues[0].message
|
|
113
|
+
matches: "(?i)required property 'id'"
|
|
114
|
+
|
|
115
|
+
- name: api-inline-example-original-operation-id-is-not-exposed
|
|
116
|
+
description: Final overlay output hides the original getProfile method name
|
|
117
|
+
event: pr_opened
|
|
118
|
+
fixture: gh.pr_open.minimal
|
|
119
|
+
expect:
|
|
120
|
+
calls:
|
|
121
|
+
- step: api-inline-overlay-original-name-blocked
|
|
122
|
+
exactly: 1
|
|
123
|
+
outputs:
|
|
124
|
+
- step: api-inline-overlay-original-name-blocked
|
|
125
|
+
path: issues[0].message
|
|
126
|
+
matches: "(?i)Custom tool not found: getProfile"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
version: "1.0"
|
|
2
|
+
|
|
3
|
+
# Reusable OpenAPI API bundle.
|
|
4
|
+
# Import this file via `extends:` from other configs to expose generated MCP tools.
|
|
5
|
+
tools:
|
|
6
|
+
users-api:
|
|
7
|
+
type: api
|
|
8
|
+
name: users-api
|
|
9
|
+
description: Reusable users API tool bundle generated from OpenAPI
|
|
10
|
+
spec: ./openapi/users-api.json
|
|
11
|
+
headers:
|
|
12
|
+
Authorization: "Bearer ${USERS_API_BEARER_TOKEN}"
|
|
13
|
+
X-Tenant-Id: "${USERS_API_TENANT_ID}"
|
|
14
|
+
whitelist:
|
|
15
|
+
- "get*"
|
|
16
|
+
|
|
17
|
+
# Library-only file: no executable steps here.
|
|
18
|
+
steps: {}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
version: "1.0"
|
|
2
|
+
|
|
3
|
+
# Reuse API bundle definition from a separate file.
|
|
4
|
+
extends: ./api-tools-library.yaml
|
|
5
|
+
|
|
6
|
+
checks:
|
|
7
|
+
# Generated operation tool validates required OpenAPI args before any HTTP call.
|
|
8
|
+
api-tool-missing-required-input:
|
|
9
|
+
type: mcp
|
|
10
|
+
transport: custom
|
|
11
|
+
method: getUser
|
|
12
|
+
methodArgs: {}
|
|
13
|
+
on:
|
|
14
|
+
- manual
|
|
15
|
+
|
|
16
|
+
# Whitelist in api-tools-library.yaml allows get* only, so createUser is blocked.
|
|
17
|
+
api-tool-whitelist-enforced:
|
|
18
|
+
type: mcp
|
|
19
|
+
transport: custom
|
|
20
|
+
method: createUser
|
|
21
|
+
methodArgs:
|
|
22
|
+
requestBody:
|
|
23
|
+
name: Alice
|
|
24
|
+
on:
|
|
25
|
+
- issue_comment
|
|
26
|
+
|
|
27
|
+
tests:
|
|
28
|
+
defaults:
|
|
29
|
+
strict: true
|
|
30
|
+
cases:
|
|
31
|
+
- name: api-example-validates-generated-operation-input
|
|
32
|
+
description: getUser requires path parameter id from the OpenAPI schema
|
|
33
|
+
event: manual
|
|
34
|
+
fixture: local.minimal
|
|
35
|
+
expect:
|
|
36
|
+
calls:
|
|
37
|
+
- step: api-tool-missing-required-input
|
|
38
|
+
exactly: 1
|
|
39
|
+
outputs:
|
|
40
|
+
- step: api-tool-missing-required-input
|
|
41
|
+
path: issues[0].message
|
|
42
|
+
matches: "(?i)required property 'id'"
|
|
43
|
+
|
|
44
|
+
- name: api-example-enforces-operation-whitelist
|
|
45
|
+
description: createUser is not exposed because api bundle whitelist is get*
|
|
46
|
+
event: issue_comment
|
|
47
|
+
fixture: gh.issue_comment.standard
|
|
48
|
+
expect:
|
|
49
|
+
calls:
|
|
50
|
+
- step: api-tool-whitelist-enforced
|
|
51
|
+
exactly: 1
|
|
52
|
+
outputs:
|
|
53
|
+
- step: api-tool-whitelist-enforced
|
|
54
|
+
path: issues[0].message
|
|
55
|
+
matches: "(?i)Custom tool not found: createUser"
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"openapi": "3.0.0",
|
|
3
|
+
"info": {
|
|
4
|
+
"title": "Users API Example Spec",
|
|
5
|
+
"version": "1.0.0"
|
|
6
|
+
},
|
|
7
|
+
"servers": [
|
|
8
|
+
{
|
|
9
|
+
"url": "https://api.example.invalid"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"paths": {
|
|
13
|
+
"/users/{id}": {
|
|
14
|
+
"get": {
|
|
15
|
+
"operationId": "getUser",
|
|
16
|
+
"summary": "Get user by id",
|
|
17
|
+
"parameters": [
|
|
18
|
+
{
|
|
19
|
+
"name": "id",
|
|
20
|
+
"in": "path",
|
|
21
|
+
"required": true,
|
|
22
|
+
"schema": {
|
|
23
|
+
"type": "string"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"responses": {
|
|
28
|
+
"200": {
|
|
29
|
+
"description": "User payload",
|
|
30
|
+
"content": {
|
|
31
|
+
"application/json": {
|
|
32
|
+
"schema": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"properties": {
|
|
35
|
+
"id": {
|
|
36
|
+
"type": "string"
|
|
37
|
+
},
|
|
38
|
+
"name": {
|
|
39
|
+
"type": "string"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"/users": {
|
|
50
|
+
"post": {
|
|
51
|
+
"operationId": "createUser",
|
|
52
|
+
"summary": "Create user",
|
|
53
|
+
"requestBody": {
|
|
54
|
+
"required": true,
|
|
55
|
+
"content": {
|
|
56
|
+
"application/json": {
|
|
57
|
+
"schema": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"properties": {
|
|
60
|
+
"name": {
|
|
61
|
+
"type": "string"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"required": [
|
|
65
|
+
"name"
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"responses": {
|
|
72
|
+
"200": {
|
|
73
|
+
"description": "Creation payload",
|
|
74
|
+
"content": {
|
|
75
|
+
"application/json": {
|
|
76
|
+
"schema": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"properties": {
|
|
79
|
+
"created": {
|
|
80
|
+
"type": "boolean"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|