From 5ae1191e79ef6c9ab4d609efb3a300ee169f09aa Mon Sep 17 00:00:00 2001 From: Andrew Tatomyr Date: Thu, 30 Jul 2026 08:49:46 +0000 Subject: [PATCH 1/3] Add remote "/@skills/redocly-cli/" Co-authored-by: github-actions[bot] remoteId: rem_01kys3e4qashawvw3qsa9y2k06 remoteUpdateId: grupd_01kys3e65c0fmxnctj0xh1a0xg branchName: main commitSha: 3016d43022631484d98e811b12d4e6d49ada22a0 commitUrl: https://github.com/Redocly/redocly-cli/commit/3016d43022631484d98e811b12d4e6d49ada22a0 --- @skills/redocly-cli/.changeset/README.md | 8 + @skills/redocly-cli/.changeset/config.json | 11 + @skills/redocly-cli/.changeset/format.js | 15 + .../redocly-cli/.claude/commands/deslop.md | 14 + .../.claude/rules/code-quality-standards.md | 34 + .../.claude/rules/core-principles.md | 26 + .../.claude/rules/documentation.md | 7 + .../redocly-cli/.claude/rules/rules-system.md | 173 + .../.claude/rules/security-guidelines.md | 12 + @skills/redocly-cli/.claude/rules/testing.md | 11 + @skills/redocly-cli/.claude/rules/workflow.md | 24 + .../.claude/skills/redocly-cli/SKILL.md | 148 + @skills/redocly-cli/.dockerignore | 9 + @skills/redocly-cli/.gemini/settings.json | 5 + @skills/redocly-cli/.github/CODEOWNERS | 10 + .../.github/ISSUE_TEMPLATE/bug_report.md | 58 + .../.github/ISSUE_TEMPLATE/feature_request.md | 23 + .../.github/copilot-instructions.md | 6 + .../.github/pull_request_template.md | 20 + .../styles/Redocly-Docs/BritishEnglish.yml | 110 + .../styles/Redocly-Docs/FutureTense.yml | 10 + .../styles/Redocly-Docs/HeaderGerunds.yml | 13 + .../Redocly-Docs/InclusionGenderCulture.yml | 16 + .../styles/Redocly-Docs/OxfordComma.yml | 8 + .../vocabularies/Redocly-Docs/accept.txt | 151 + .../vocabularies/Redocly-Docs/reject.txt | 0 .../.github/workflows/docs-tests.yaml | 42 + .../workflows/main-version-release-guard.yaml | 32 + .../workflows/performance-comment.yaml | 38 + .../.github/workflows/performance.yaml | 78 + .../.github/workflows/pr-title.yml | 72 + .../.github/workflows/pre-release.yaml | 41 + .../.github/workflows/release.yaml | 262 + .../.github/workflows/require-changeset.yaml | 29 + .../.github/workflows/smoke-plugins.yaml | 111 + .../.github/workflows/smoke-rebilly.yaml | 30 + .../redocly-cli/.github/workflows/smoke.yaml | 332 + .../redocly-cli/.github/workflows/tests.yaml | 51 + @skills/redocly-cli/.gitignore | 28 + @skills/redocly-cli/.husky/pre-commit | 1 + @skills/redocly-cli/.markdownlint.yaml | 54 + @skills/redocly-cli/.mlc.toml | 8 + @skills/redocly-cli/.oxfmtrc.json | 33 + @skills/redocly-cli/.oxlintrc.json | 73 + @skills/redocly-cli/.vale.ini | 44 + @skills/redocly-cli/AGENTS.md | 218 + @skills/redocly-cli/CLAUDE.md | 6 + @skills/redocly-cli/CONTRIBUTING.md | 436 + @skills/redocly-cli/Dockerfile | 15 + @skills/redocly-cli/LICENSE.md | 7 + @skills/redocly-cli/README.md | 172 + @skills/redocly-cli/cookbook/README.md | 100 + .../configurable-rules/api-health/README.md | 134 + .../api-health/openapi.yaml | 36 + .../api-health/redocly.yaml | 52 + .../azure-apim-unsupported-keyword/README.md | 197 + .../openapi.yaml | 107 + .../redocly.yaml | 113 + .../description-banned-words/README.md | 41 + .../description-banned-words/redocly.yaml | 7 + .../info-description/README.md | 48 + .../info-description/redocly.yaml | 7 + .../json-schema-misconfigurations/README.md | 116 + .../openapi.yaml | 38 + .../redocly.yaml | 38 + .../configurable-rules/no-script/README.md | 50 + .../configurable-rules/no-script/redocly.yaml | 11 + .../README.md | 69 + .../redocly.yaml | 11 + .../README.md | 248 + .../openapi.yaml | 57 + .../redocly.yaml | 119 + .../README.md | 74 + .../redocly.yaml | 11 + .../README.md | 100 + .../redocly.yaml | 11 + .../README.md | 101 + .../redocly.yaml | 22 + .../operation-summary-sentence-case/README.md | 123 + .../redocly.yaml | 8 + .../path-excludes-pattern/README.md | 48 + .../path-excludes-pattern/redocly.yaml | 6 + .../README.md | 57 + .../redocly.yaml | 15 + .../string-schemas-length-defined/README.md | 80 + .../openapi.yaml | 33 + .../redocly.yaml | 18 + .../apply-root-security/README.md | 157 + .../apply-root-security/bar.yaml | 14 + .../apply-root-security/decorator.js | 48 + .../apply-root-security/foo.yaml | 16 + .../apply-root-security/plugin.js | 10 + .../apply-root-security/redocly.yaml | 6 + .../azure-apim/README.md | 97 + .../azure-apim/azure-apim.js | 37 + .../openai-is-consequential/README.md | 118 + .../openai-is-consequential.js | 21 + .../remove-extensions/README.md | 494 + .../remove-extensions/remove-extensions.js | 74 + .../remove-unused-tags/README.md | 141 + .../remove-unused-tags/redocly.yaml | 5 + .../remove-unused-tags/tags.js | 31 + .../set-servers-urls/README.md | 125 + .../set-servers-urls/redocly.yaml | 15 + .../set-servers-urls-decorator.js | 16 + .../set-servers-urls-plugin.js | 15 + .../swap-summary-description/README.md | 170 + .../swap-summary-description/redocly.yaml | 5 + .../swap-summary-description/swap-fields.js | 31 + .../tag-sorting/README.md | 96 + .../tag-sorting/decorator-alpha.js | 18 + .../tag-sorting/tag-sorting.js | 12 + .../update-example-dates/README.md | 136 + .../update-example-dates/decorator.js | 52 + .../update-example-dates/plugin.js | 12 + .../code-sample-checks/README.md | 144 + .../code-sample-checks/check-sdk-coverage.js | 28 + .../x-code-sample-checks.js | 12 + .../default-enum-match/README.md | 99 + .../default-enum-match/default-enum-plugin.js | 35 + .../markdown-validator/README.md | 191 + .../markdown-validator/openapi-markdown.js | 12 + .../markdown-validator/package.json | 15 + .../rule-validate-markdown.js | 78 + .../cookbook/custom-plugins/sorting/README.md | 129 + .../custom-plugins/sorting/redocly.yaml | 18 + .../sorting/rule-sort-methods.js | 31 + .../custom-plugins/sorting/rule-sort-props.js | 68 + .../custom-plugins/sorting/sort-enums.js | 12 + .../custom-plugins/sorting/sort-methods.js | 37 + .../sorting/sort-props-alpha.js | 19 + .../sorting/sort-props-required.js | 31 + .../custom-plugins/sorting/sort-tags.js | 18 + .../custom-plugins/sorting/sorting.js | 28 + .../README.md | 126 + .../bundled.yaml | 19 + .../openapi.yaml | 10 + .../reorder.js | 17 + .../schema.yaml | 6 + .../rulesets/common-mistakes/README.md | 38 + .../rulesets/common-mistakes/redocly.yaml | 11 + .../cookbook/rulesets/security/README.md | 195 + .../cookbook/rulesets/security/redocly.yaml | 61 + .../rulesets/spec-compliant/README.md | 64 + .../rulesets/spec-compliant/redocly.yaml | 19 + @skills/redocly-cli/docs/@v1/api-docs.md | 38 + @skills/redocly-cli/docs/@v1/api-standards.md | 39 + @skills/redocly-cli/docs/@v1/changelog.md | 2238 + .../docs/@v1/commands/build-docs.md | 119 + .../redocly-cli/docs/@v1/commands/bundle.md | 131 + .../docs/@v1/commands/check-config.md | 39 + .../docs/@v1/commands/completion.md | 63 + .../redocly-cli/docs/@v1/commands/eject.md | 131 + .../docs/@v1/commands/generate-arazzo.md | 130 + .../@v1/commands/images/lint-markdown.png | Bin 0 -> 54104 bytes .../images/stats-github-job-summary.png | Bin 0 -> 46825 bytes .../redocly-cli/docs/@v1/commands/index.md | 71 + @skills/redocly-cli/docs/@v1/commands/join.md | 263 + @skills/redocly-cli/docs/@v1/commands/lint.md | 395 + .../redocly-cli/docs/@v1/commands/login.md | 68 + .../redocly-cli/docs/@v1/commands/logout.md | 32 + .../docs/@v1/commands/preview-docs.md | 146 + .../redocly-cli/docs/@v1/commands/preview.md | 65 + .../docs/@v1/commands/push-status.md | 70 + @skills/redocly-cli/docs/@v1/commands/push.md | 459 + .../redocly-cli/docs/@v1/commands/respect.md | 207 + .../redocly-cli/docs/@v1/commands/split.md | 50 + .../redocly-cli/docs/@v1/commands/stats.md | 209 + .../docs/@v1/commands/translate.md | 121 + .../docs/@v1/configuration/api.yaml | 130 + .../docs/@v1/configuration/apis.md | 62 + .../docs/@v1/configuration/extends.md | 122 + .../docs/@v1/configuration/index.md | 247 + .../docs/@v1/configuration/mockserver.yaml | 17 + .../docs/@v1/configuration/reference/apis.md | 105 + .../@v1/configuration/reference/decorators.md | 91 + .../@v1/configuration/reference/extends.md | 41 + .../@v1/configuration/reference/plugins.md | 34 + .../configuration/reference/preprocessors.md | 20 + .../@v1/configuration/reference/resolve.md | 90 + .../docs/@v1/configuration/reference/rules.md | 135 + .../docs/@v1/configuration/resolve.yaml | 42 + .../docs/@v1/configuration/rules.md | 71 + .../docs/@v1/configuration/schema.yaml | 322 + .../docs/@v1/custom-plugins/custom-config.md | 49 + .../@v1/custom-plugins/custom-decorators.md | 220 + .../docs/@v1/custom-plugins/custom-rules.md | 118 + .../docs/@v1/custom-plugins/extended-types.md | 75 + .../docs/@v1/custom-plugins/index.md | 60 + .../docs/@v1/custom-plugins/visitor.md | 107 + @skills/redocly-cli/docs/@v1/decorators.md | 57 + .../docs/@v1/decorators/filter-in.md | 73 + .../docs/@v1/decorators/filter-out.md | 72 + .../decorators/info-description-override.md | 39 + .../docs/@v1/decorators/info-override.md | 39 + .../media-type-examples-override.md | 215 + .../operation-description-override.md | 41 + .../decorators/remove-unused-components.md | 34 + .../docs/@v1/decorators/remove-x-internal.md | 43 + .../decorators/tag-description-override.md | 41 + .../redocly-cli/docs/@v1/file-management.md | 71 + .../docs/@v1/guides/autocomplete.md | 17 + .../docs/@v1/guides/change-token-url.md | 66 + .../docs/@v1/guides/configure-rules.md | 133 + .../redocly-cli/docs/@v1/guides/hide-apis.md | 158 + .../guides/hide-specification-extensions.md | 171 + .../images/hide-apis-path-to-root-file.png | Bin 0 -> 6514 bytes .../images/hide-internal-apis-problem.png | Bin 0 -> 7075 bytes .../@v1/guides/images/museum-arazzo-lint.png | Bin 0 -> 127138 bytes .../@v1/guides/images/museum-overlay-lint.png | Bin 0 -> 27930 bytes .../response-contains-property-multiple.png | Bin 0 -> 42601 bytes .../images/response-contains-property-one.png | Bin 0 -> 18187 bytes .../response-contains-property-range.png | Bin 0 -> 32925 bytes @skills/redocly-cli/docs/@v1/guides/index.md | 118 + .../docs/@v1/guides/lint-and-bundle.md | 47 + .../docs/@v1/guides/lint-arazzo.md | 134 + .../docs/@v1/guides/lint-asyncapi.md | 136 + .../docs/@v1/guides/lint-overlay.md | 124 + .../@v1/guides/migrate-from-openapi-cli.md | 9 + .../docs/@v1/guides/migrate-from-redoc-cli.md | 111 + .../docs/@v1/guides/migrate-from-spectral.md | 143 + .../@v1/guides/migrate-from-swagger-cli.md | 75 + .../docs/@v1/guides/replace-servers-url.md | 215 + .../@v1/guides/response-contains-property.md | 324 + .../redocly-cli/docs/@v1/guides/update-cli.md | 11 + .../@v1/images/install-update-openapi-cli.gif | Bin 0 -> 196927 bytes .../docs/@v1/images/preview-docs.png | Bin 0 -> 83362 bytes @skills/redocly-cli/docs/@v1/images/redoc.png | Bin 0 -> 57635 bytes .../docs/@v1/images/redocly-api-ref.png | Bin 0 -> 69480 bytes .../docs/@v1/images/updated-preview-docs.png | Bin 0 -> 22780 bytes @skills/redocly-cli/docs/@v1/index.md | 53 + @skills/redocly-cli/docs/@v1/installation.md | 124 + .../redocly-cli/docs/@v1/openapi-starter.md | 37 + @skills/redocly-cli/docs/@v1/quickstart.md | 117 + @skills/redocly-cli/docs/@v1/rules.md | 43 + .../docs/@v1/rules/arazzo/criteria-unique.md | 56 + .../@v1/rules/arazzo/parameters-unique.md | 58 + .../arazzo/requestBody-replacements-unique.md | 56 + .../arazzo/sourceDescriptions-name-unique.md | 54 + .../arazzo/sourceDescriptions-not-empty.md | 69 + .../rules/arazzo/sourceDescriptions-type.md | 54 + .../@v1/rules/arazzo/step-onFailure-unique.md | 64 + .../@v1/rules/arazzo/step-onSuccess-unique.md | 64 + .../docs/@v1/rules/arazzo/stepId-unique.md | 57 + .../docs/@v1/rules/arazzo/struct.md | 28 + .../@v1/rules/arazzo/workflow-dependsOn.md | 48 + .../@v1/rules/arazzo/workflowId-unique.md | 56 + .../@v1/rules/async/channels-kebab-case.md | 77 + .../rules/async/no-channel-trailing-slash.md | 78 + .../docs/@v1/rules/built-in-rules.md | 154 + .../docs/@v1/rules/configurable-rules.md | 676 + .../docs/@v1/rules/configure-rules.md | 70 + @skills/redocly-cli/docs/@v1/rules/minimal.md | 44 + .../oas/array-parameter-serialization.md | 109 + .../rules/oas/boolean-parameter-prefixes.md | 108 + .../@v1/rules/oas/component-name-unique.md | 116 + .../docs/@v1/rules/oas/info-contact.md | 82 + .../docs/@v1/rules/oas/info-license-url.md | 78 + .../docs/@v1/rules/oas/info-license.md | 76 + .../docs/@v1/rules/oas/no-ambiguous-paths.md | 97 + .../docs/@v1/rules/oas/no-empty-servers.md | 85 + .../@v1/rules/oas/no-enum-type-mismatch.md | 97 + .../oas/no-example-value-and-externalValue.md | 104 + .../@v1/rules/oas/no-http-verbs-in-paths.md | 128 + .../docs/@v1/rules/oas/no-identical-paths.md | 85 + .../oas/no-invalid-media-type-examples.md | 158 + .../oas/no-invalid-parameter-examples.md | 110 + .../rules/oas/no-invalid-schema-examples.md | 104 + .../@v1/rules/oas/no-path-trailing-slash.md | 71 + ...no-required-schema-properties-undefined.md | 108 + .../@v1/rules/oas/no-schema-type-mismatch.md | 112 + .../@v1/rules/oas/no-server-example-com.md | 78 + .../@v1/rules/oas/no-server-trailing-slash.md | 80 + .../oas/no-server-variables-empty-enum.md | 91 + .../rules/oas/no-undefined-server-variable.md | 78 + .../docs/@v1/rules/oas/no-unresolved-refs.md | 94 + .../@v1/rules/oas/no-unused-components.md | 90 + .../@v1/rules/oas/operation-2xx-response.md | 83 + .../operation-4xx-problem-details-rfc7807.md | 86 + .../@v1/rules/oas/operation-4xx-response.md | 82 + .../@v1/rules/oas/operation-description.md | 74 + .../rules/oas/operation-operationId-unique.md | 82 + .../oas/operation-operationId-url-safe.md | 76 + .../@v1/rules/oas/operation-operationId.md | 77 + .../rules/oas/operation-parameters-unique.md | 78 + .../@v1/rules/oas/operation-singular-tag.md | 74 + .../docs/@v1/rules/oas/operation-summary.md | 70 + .../@v1/rules/oas/operation-tag-defined.md | 84 + .../@v1/rules/oas/parameter-description.md | 77 + .../rules/oas/path-declaration-must-exist.md | 74 + .../@v1/rules/oas/path-excludes-patterns.md | 86 + .../@v1/rules/oas/path-not-include-query.md | 78 + .../@v1/rules/oas/path-parameters-defined.md | 76 + .../docs/@v1/rules/oas/path-segment-plural.md | 99 + .../docs/@v1/rules/oas/paths-kebab-case.md | 83 + .../docs/@v1/rules/oas/request-mime-type.md | 89 + ...ired-string-property-missing-min-length.md | 88 + .../@v1/rules/oas/response-contains-header.md | 103 + .../rules/oas/response-contains-property.md | 108 + .../docs/@v1/rules/oas/response-mime-type.md | 96 + .../oas/scalar-property-missing-example.md | 90 + .../docs/@v1/rules/oas/security-defined.md | 100 + .../oas/spec-components-invalid-map-name.md | 98 + .../docs/@v1/rules/oas/spec-strict-refs.md | 97 + .../redocly-cli/docs/@v1/rules/oas/struct.md | 70 + .../docs/@v1/rules/oas/tag-description.md | 97 + .../docs/@v1/rules/oas/tags-alphabetical.md | 85 + .../docs/@v1/rules/overlay/info-contact.md | 74 + .../docs/@v1/rules/overlay/struct.md | 28 + .../redocly-cli/docs/@v1/rules/recommended.md | 60 + .../@v1/rules/respect/no-criteria-xpath.md | 54 + .../respect/respect-supported-versions.md | 48 + .../docs/@v1/rules/ruleset-templates.md | 471 + .../docs/@v1/rules/spec-ruleset.md | 24 + @skills/redocly-cli/docs/@v1/usage-data.md | 27 + @skills/redocly-cli/docs/@v1/v1.sidebars.yaml | 202 + @skills/redocly-cli/docs/@v2/api-docs.md | 37 + @skills/redocly-cli/docs/@v2/api-standards.md | 46 + @skills/redocly-cli/docs/@v2/changelog.md | 1197 + .../docs/@v2/commands/build-docs.md | 126 + .../redocly-cli/docs/@v2/commands/bundle.md | 207 + .../docs/@v2/commands/check-config.md | 39 + .../docs/@v2/commands/completion.md | 64 + .../redocly-cli/docs/@v2/commands/drift.md | 117 + .../redocly-cli/docs/@v2/commands/eject.md | 131 + .../docs/@v2/commands/generate-arazzo.md | 130 + .../docs/@v2/commands/generate-spec.md | 119 + .../@v2/commands/images/lint-markdown.png | Bin 0 -> 54104 bytes .../images/stats-github-job-summary.png | Bin 0 -> 46825 bytes .../redocly-cli/docs/@v2/commands/index.md | 74 + @skills/redocly-cli/docs/@v2/commands/join.md | 286 + @skills/redocly-cli/docs/@v2/commands/lint.md | 488 + .../redocly-cli/docs/@v2/commands/login.md | 44 + .../redocly-cli/docs/@v2/commands/logout.md | 32 + .../redocly-cli/docs/@v2/commands/preview.md | 95 + .../redocly-cli/docs/@v2/commands/proxy.md | 85 + .../docs/@v2/commands/push-status.md | 71 + @skills/redocly-cli/docs/@v2/commands/push.md | 127 + .../redocly-cli/docs/@v2/commands/respect.md | 264 + .../redocly-cli/docs/@v2/commands/score.md | 133 + .../docs/@v2/commands/scorecard-classic.md | 198 + .../redocly-cli/docs/@v2/commands/split.md | 78 + .../redocly-cli/docs/@v2/commands/stats.md | 262 + .../docs/@v2/commands/translate.md | 121 + .../docs/@v2/configuration/api.yaml | 126 + .../docs/@v2/configuration/apis.md | 58 + .../docs/@v2/configuration/extends.md | 122 + .../docs/@v2/configuration/index.md | 233 + .../docs/@v2/configuration/mockserver.yaml | 17 + .../docs/@v2/configuration/reference/apis.md | 105 + .../@v2/configuration/reference/decorators.md | 91 + .../@v2/configuration/reference/extends.md | 41 + .../@v2/configuration/reference/plugins.md | 34 + .../configuration/reference/preprocessors.md | 20 + .../@v2/configuration/reference/resolve.md | 90 + .../docs/@v2/configuration/reference/rules.md | 135 + .../docs/@v2/configuration/resolve.yaml | 43 + .../docs/@v2/configuration/rules.md | 71 + .../docs/@v2/custom-plugins/custom-config.md | 49 + .../@v2/custom-plugins/custom-decorators.md | 220 + .../docs/@v2/custom-plugins/custom-rules.md | 116 + .../docs/@v2/custom-plugins/extended-types.md | 75 + .../docs/@v2/custom-plugins/index.md | 60 + .../docs/@v2/custom-plugins/visitor.md | 107 + @skills/redocly-cli/docs/@v2/decorators.md | 57 + .../docs/@v2/decorators/filter-in.md | 100 + .../docs/@v2/decorators/filter-out.md | 86 + .../decorators/info-description-override.md | 39 + .../docs/@v2/decorators/info-override.md | 39 + .../media-type-examples-override.md | 215 + .../operation-description-override.md | 41 + .../decorators/remove-unused-components.md | 34 + .../docs/@v2/decorators/remove-x-internal.md | 43 + .../decorators/tag-description-override.md | 41 + .../redocly-cli/docs/@v2/file-management.md | 71 + .../docs/@v2/guides/autocomplete.md | 17 + .../docs/@v2/guides/change-token-url.md | 63 + .../docs/@v2/guides/configure-rules.md | 145 + .../redocly-cli/docs/@v2/guides/hide-apis.md | 158 + .../guides/hide-specification-extensions.md | 167 + .../images/hide-apis-path-to-root-file.png | Bin 0 -> 6514 bytes .../images/hide-internal-apis-problem.png | Bin 0 -> 7075 bytes .../@v2/guides/images/museum-arazzo-lint.png | Bin 0 -> 127138 bytes .../@v2/guides/images/museum-overlay-lint.png | Bin 0 -> 27930 bytes .../response-contains-property-multiple.png | Bin 0 -> 42601 bytes .../images/response-contains-property-one.png | Bin 0 -> 18187 bytes .../response-contains-property-range.png | Bin 0 -> 32925 bytes @skills/redocly-cli/docs/@v2/guides/index.md | 130 + .../docs/@v2/guides/lint-and-bundle.md | 47 + .../docs/@v2/guides/lint-arazzo.md | 134 + .../docs/@v2/guides/lint-asyncapi.md | 122 + .../docs/@v2/guides/lint-graphql.md | 84 + .../docs/@v2/guides/lint-openrpc.md | 90 + .../docs/@v2/guides/lint-overlay.md | 124 + .../@v2/guides/migrate-from-openapi-cli.md | 9 + .../docs/@v2/guides/migrate-from-redoc-cli.md | 95 + .../docs/@v2/guides/migrate-from-spectral.md | 141 + .../@v2/guides/migrate-from-swagger-cli.md | 83 + .../docs/@v2/guides/migrate-to-v2.md | 241 + .../docs/@v2/guides/replace-servers-url.md | 189 + .../@v2/guides/response-contains-property.md | 324 + .../redocly-cli/docs/@v2/guides/update-cli.md | 11 + .../@v2/images/install-update-openapi-cli.gif | Bin 0 -> 196927 bytes .../docs/@v2/images/redoc-reunite.svg | 330 + @skills/redocly-cli/docs/@v2/images/redoc.png | Bin 0 -> 57635 bytes .../docs/@v2/images/updated-preview-docs.png | Bin 0 -> 22780 bytes @skills/redocly-cli/docs/@v2/index.md | 59 + @skills/redocly-cli/docs/@v2/installation.md | 134 + .../redocly-cli/docs/@v2/openapi-starter.md | 37 + @skills/redocly-cli/docs/@v2/quickstart.md | 92 + @skills/redocly-cli/docs/@v2/rules.md | 44 + .../docs/@v2/rules/arazzo/criteria-unique.md | 56 + .../docs/@v2/rules/arazzo/outputs-defined.md | 55 + .../@v2/rules/arazzo/parameters-unique.md | 58 + .../arazzo/requestBody-replacements-unique.md | 56 + .../arazzo/sourceDescription-name-unique.md | 54 + .../rules/arazzo/sourceDescription-type.md | 55 + .../arazzo/sourceDescriptions-not-empty.md | 69 + .../spec-step-mutually-exclusive-fields.md | 67 + .../@v2/rules/arazzo/step-onFailure-unique.md | 64 + .../@v2/rules/arazzo/step-onSuccess-unique.md | 64 + .../docs/@v2/rules/arazzo/stepId-unique.md | 57 + .../@v2/rules/arazzo/workflow-dependsOn.md | 48 + .../@v2/rules/arazzo/workflowId-unique.md | 56 + .../@v2/rules/async/channels-kebab-case.md | 77 + .../rules/async/no-channel-trailing-slash.md | 78 + .../rules/async/no-duplicated-tag-names.md | 89 + .../docs/@v2/rules/built-in-rules.md | 182 + .../@v2/rules/common/no-enum-type-mismatch.md | 110 + .../no-mixed-number-range-constraints.md | 104 + ...no-required-schema-properties-undefined.md | 141 + .../rules/common/no-schema-type-mismatch.md | 125 + .../@v2/rules/common/no-unresolved-refs.md | 110 + .../rules/common/security-scopes-defined.md | 116 + .../docs/@v2/rules/common/struct.md | 87 + .../docs/@v2/rules/configurable-rules.md | 809 + .../docs/@v2/rules/configure-rules.md | 70 + @skills/redocly-cli/docs/@v2/rules/minimal.md | 49 + .../oas/array-parameter-serialization.md | 110 + .../rules/oas/boolean-parameter-prefixes.md | 109 + .../@v2/rules/oas/component-name-unique.md | 117 + .../docs/@v2/rules/oas/info-contact.md | 83 + .../docs/@v2/rules/oas/info-license-strict.md | 90 + .../docs/@v2/rules/oas/info-license.md | 77 + .../docs/@v2/rules/oas/no-ambiguous-paths.md | 98 + .../@v2/rules/oas/no-duplicated-tag-names.md | 99 + .../docs/@v2/rules/oas/no-empty-servers.md | 86 + .../oas/no-example-value-and-externalValue.md | 110 + .../@v2/rules/oas/no-http-verbs-in-paths.md | 140 + .../docs/@v2/rules/oas/no-identical-paths.md | 86 + .../oas/no-invalid-media-type-examples.md | 210 + .../oas/no-invalid-parameter-examples.md | 154 + .../rules/oas/no-invalid-schema-examples.md | 105 + .../@v2/rules/oas/no-path-trailing-slash.md | 72 + .../@v2/rules/oas/no-server-example-com.md | 79 + .../@v2/rules/oas/no-server-trailing-slash.md | 81 + .../oas/no-server-variables-empty-enum.md | 92 + .../rules/oas/no-undefined-server-variable.md | 79 + .../@v2/rules/oas/no-unused-components.md | 91 + .../@v2/rules/oas/nullable-type-sibling.md | 83 + .../@v2/rules/oas/operation-2xx-response.md | 84 + .../operation-4xx-problem-details-rfc7807.md | 87 + .../@v2/rules/oas/operation-4xx-response.md | 83 + .../@v2/rules/oas/operation-description.md | 75 + .../rules/oas/operation-operationId-unique.md | 83 + .../oas/operation-operationId-url-safe.md | 77 + .../@v2/rules/oas/operation-operationId.md | 78 + .../rules/oas/operation-parameters-unique.md | 79 + .../@v2/rules/oas/operation-singular-tag.md | 75 + .../docs/@v2/rules/oas/operation-summary.md | 71 + .../@v2/rules/oas/operation-tag-defined.md | 85 + .../@v2/rules/oas/parameter-description.md | 78 + .../rules/oas/path-declaration-must-exist.md | 74 + .../@v2/rules/oas/path-http-verbs-order.md | 54 + .../@v2/rules/oas/path-not-include-query.md | 79 + .../@v2/rules/oas/path-parameters-defined.md | 76 + .../docs/@v2/rules/oas/path-segment-plural.md | 99 + .../docs/@v2/rules/oas/paths-kebab-case.md | 83 + .../docs/@v2/rules/oas/request-mime-type.md | 90 + ...ired-string-property-missing-min-length.md | 89 + .../@v2/rules/oas/response-contains-header.md | 104 + .../rules/oas/response-contains-property.md | 109 + .../docs/@v2/rules/oas/response-mime-type.md | 97 + .../oas/scalar-property-missing-example.md | 91 + .../docs/@v2/rules/oas/security-defined.md | 101 + .../oas/spec-components-invalid-map-name.md | 99 + .../oas/spec-discriminator-defaultMapping.md | 105 + .../docs/@v2/rules/oas/spec-example-values.md | 104 + .../spec-no-invalid-encoding-combinations.md | 120 + .../rules/oas/spec-no-invalid-tag-parents.md | 110 + .../rules/oas/spec-querystring-parameters.md | 131 + .../docs/@v2/rules/oas/spec-strict-refs.md | 98 + .../docs/@v2/rules/oas/tag-description.md | 98 + .../docs/@v2/rules/oas/tags-alphabetical.md | 85 + .../spec-no-duplicated-method-params.md | 30 + .../spec-no-required-params-after-optional.md | 30 + .../docs/@v2/rules/overlay/info-contact.md | 74 + .../docs/@v2/rules/overlay/struct.md | 28 + .../redocly-cli/docs/@v2/rules/recommended.md | 75 + .../@v2/rules/respect/no-criteria-xpath.md | 54 + ...-x-security-both-scheme-and-scheme-name.md | 74 + ...-x-security-scheme-name-without-openapi.md | 70 + .../x-security-scheme-name-reference.md | 99 + .../x-security-scheme-required-values.md | 58 + .../docs/@v2/rules/ruleset-templates.md | 414 + .../docs/@v2/rules/spec-ruleset.md | 41 + @skills/redocly-cli/docs/@v2/usage-data.md | 32 + @skills/redocly-cli/docs/@v2/v2.sidebars.yaml | 228 + .../_code-snippets/per-api-rules-example.yaml | 29 + @skills/redocly-cli/docs/sidebars.yaml | 2 + @skills/redocly-cli/docs/versions.yaml | 6 + @skills/redocly-cli/media/redocly-cli.gif | Bin 0 -> 5141628 bytes @skills/redocly-cli/package-lock.json | 9057 ++ @skills/redocly-cli/package.json | 81 + @skills/redocly-cli/packages/cli/.gitignore | 2 + @skills/redocly-cli/packages/cli/.npmignore | 6 + @skills/redocly-cli/packages/cli/CHANGELOG.md | 1952 + @skills/redocly-cli/packages/cli/bin/cli.js | 3 + @skills/redocly-cli/packages/cli/package.json | 75 + .../packages/cli/scripts/build.mjs | 91 + .../cli/scripts/prepare-publish-dir.mjs | 51 + .../src/__tests__/commands/build-docs.test.ts | 75 + .../cli/src/__tests__/commands/bundle.test.ts | 296 + .../commands/drift/schema-rule.test.ts | 175 + .../commands/drift/schema-validator.test.ts | 98 + .../commands/drift/security-rule.test.ts | 137 + .../commands/generate-arazzo.test.ts | 108 + .../cli/src/__tests__/commands/join.test.ts | 609 + .../cli/src/__tests__/commands/lint.test.ts | 341 + .../respect/create-network-dispatcher.test.ts | 208 + .../respect/har-logs/create-har-log.test.ts | 38 + .../har-logs/helpers/add-headers.test.ts | 23 + .../har-logs/helpers/build-headers.test.ts | 32 + .../helpers/build-request-cookies.test.ts | 13 + .../helpers/build-response-cookies.test.ts | 80 + .../har-logs/helpers/get-duration.test.ts | 13 + .../respect/har-logs/with-har.test.ts | 53 + .../mtls/resolve-mtls-certificates.test.ts | 183 + .../commands/respect/respect.test.ts | 206 + .../src/__tests__/fetch-with-timeout.test.ts | 107 + .../cli/src/__tests__/fixtures/config.ts | 70 + .../src/__tests__/fixtures/join/documents.ts | 239 + .../cli/src/__tests__/fixtures/openapi.json | 0 .../cli/src/__tests__/fixtures/openapi.yaml | 0 .../cli/src/__tests__/fixtures/redocly.yaml | 0 .../cli/src/__tests__/spinner.test.ts | 51 + .../packages/cli/src/__tests__/utils.test.ts | 920 + .../utils/read-env-variables.test.ts | 55 + .../cli/src/__tests__/utils/telemetry.test.ts | 305 + .../cli/src/__tests__/wrapper.test.ts | 155 + .../src/auth/__tests__/device-flow.test.ts | 71 + .../src/auth/__tests__/oauth-client.test.ts | 114 + .../packages/cli/src/auth/device-flow.ts | 189 + .../packages/cli/src/auth/oauth-client.ts | 142 + .../packages/cli/src/commands/auth.ts | 49 + .../cli/src/commands/build-docs/index.ts | 50 + .../cli/src/commands/build-docs/types.ts | 25 + .../cli/src/commands/build-docs/utils.ts | 135 + .../packages/cli/src/commands/bundle.ts | 175 + .../packages/cli/src/commands/drift/README.md | 68 + .../cli/src/commands/drift/engine/reporter.ts | 480 + .../cli/src/commands/drift/engine/runner.ts | 60 + .../commands/drift/engine/schema-validator.ts | 219 + .../drift/engine/validation-session.ts | 367 + .../packages/cli/src/commands/drift/index.ts | 155 + .../cli/src/commands/drift/log-formats/har.ts | 104 + .../src/commands/drift/log-formats/helpers.ts | 221 + .../src/commands/drift/log-formats/kong.ts | 115 + .../src/commands/drift/log-formats/ndjson.ts | 126 + .../commands/drift/log-formats/registry.ts | 30 + .../drift/log-formats/webserver-json.ts | 211 + .../cli/src/commands/drift/openapi/loader.ts | 440 + .../cli/src/commands/drift/openapi/matcher.ts | 144 + .../commands/drift/rules/builtins/owasp.ts | 398 + .../commands/drift/rules/builtins/schema.ts | 579 + .../commands/drift/rules/builtins/security.ts | 469 + .../rules/builtins/undocumented-endpoint.ts | 29 + .../cli/src/commands/drift/rules/registry.ts | 35 + .../cli/src/commands/drift/types/index.ts | 212 + .../cli/src/commands/drift/utils/args.ts | 6 + .../cli/src/commands/drift/utils/files.ts | 82 + .../commands/drift/utils/finding-groups.ts | 32 + .../cli/src/commands/drift/utils/http.ts | 296 + .../cli/src/commands/drift/utils/openapi.ts | 40 + .../cli/src/commands/drift/utils/server.ts | 49 + .../packages/cli/src/commands/eject.ts | 43 + .../cli/src/commands/generate-arazzo.ts | 45 + .../cli/src/commands/generate-spec/README.md | 144 + .../__snapshots__/prompt.test.ts.snap | 80 + .../__tests__/components.test.ts | 350 + .../generate-spec/__tests__/generator.test.ts | 207 + .../generate-spec/__tests__/prompt.test.ts | 37 + .../generate-spec/__tests__/providers.test.ts | 100 + .../generate-spec/__tests__/refine.test.ts | 339 + .../generate-spec/__tests__/samples.test.ts | 132 + .../__tests__/value-inference.test.ts | 250 + .../generate-spec/ai/PROMPT_TESTING.md | 75 + .../src/commands/generate-spec/ai/prompt.ts | 115 + .../commands/generate-spec/ai/providers.ts | 213 + .../src/commands/generate-spec/ai/refine.ts | 368 + .../src/commands/generate-spec/components.ts | 486 + .../src/commands/generate-spec/generator.ts | 779 + .../cli/src/commands/generate-spec/index.ts | 114 + .../cli/src/commands/generate-spec/samples.ts | 181 + .../commands/generate-spec/value-inference.ts | 159 + .../packages/cli/src/commands/join/index.ts | 228 + .../packages/cli/src/commands/join/types.ts | 32 + .../join/utils/add-components-prefix.ts | 10 + .../commands/join/utils/add-info-section.ts | 21 + .../cli/src/commands/join/utils/add-prefix.ts | 3 + .../join/utils/add-security-prefix.ts | 11 + .../commands/join/utils/collect-components.ts | 35 + .../join/utils/collect-external-docs.ts | 25 + .../src/commands/join/utils/collect-paths.ts | 239 + .../commands/join/utils/collect-webhooks.ts | 70 + .../duplicate-tag-description-warning.ts | 12 + .../commands/join/utils/filter-conflicts.ts | 3 + .../src/commands/join/utils/format-tags.ts | 3 + .../commands/join/utils/get-api-filename.ts | 5 + .../commands/join/utils/get-info-prefix.ts | 22 + .../cli/src/commands/join/utils/index.ts | 18 + .../join/utils/iterate-potential-conflicts.ts | 63 + .../src/commands/join/utils/populate-tags.ts | 114 + .../join/utils/prefix-tag-suggestion.ts | 14 + .../src/commands/join/utils/replace-$-refs.ts | 29 + .../src/commands/join/utils/show-conflicts.ts | 8 + .../packages/cli/src/commands/lint.ts | 173 + .../src/commands/preview-project/constants.ts | 23 + .../cli/src/commands/preview-project/index.ts | 72 + .../cli/src/commands/preview-project/types.ts | 12 + .../packages/cli/src/commands/proxy/README.md | 72 + .../cli/src/commands/proxy/har-writer.ts | 106 + .../packages/cli/src/commands/proxy/index.ts | 169 + .../packages/cli/src/commands/proxy/server.ts | 377 + .../respect/__tests__/json-logs.test.ts | 60 + .../src/commands/respect/connection-client.ts | 102 + .../respect/display-files-summary-table.ts | 98 + .../src/commands/respect/har-logs/README.md | 9 + .../src/commands/respect/har-logs/har-logs.ts | 36 + .../respect/har-logs/helpers/add-headers.ts | 14 + .../respect/har-logs/helpers/build-headers.ts | 31 + .../har-logs/helpers/build-request-cookies.ts | 18 + .../helpers/build-response-cookies.ts | 41 + .../respect/har-logs/helpers/get-duration.ts | 5 + .../src/commands/respect/har-logs/index.ts | 1 + .../src/commands/respect/har-logs/with-har.ts | 230 + .../cli/src/commands/respect/index.ts | 168 + .../cli/src/commands/respect/json-logs.ts | 131 + .../respect/mtls/resolve-mtls-certificates.ts | 67 + .../mtls/validate-mtls-command-option.ts | 74 + .../score/__tests__/collect-metrics-helper.ts | 47 + .../score/__tests__/dependency-graph.test.ts | 88 + .../score/__tests__/document-metrics.test.ts | 468 + .../score/__tests__/example-coverage.test.ts | 158 + .../commands/score/__tests__/hotspots.test.ts | 295 + .../commands/score/__tests__/index.test.ts | 181 + .../commands/score/__tests__/scoring.test.ts | 409 + .../cli/src/commands/score/collect-metrics.ts | 272 + .../score/collectors/dependency-graph.ts | 71 + .../score/collectors/document-metrics.ts | 506 + .../cli/src/commands/score/constants.ts | 49 + .../cli/src/commands/score/formatters/json.ts | 25 + .../src/commands/score/formatters/stylish.ts | 277 + .../cli/src/commands/score/hotspots.ts | 97 + .../packages/cli/src/commands/score/index.ts | 124 + .../cli/src/commands/score/scoring.ts | 208 + .../packages/cli/src/commands/score/types.ts | 134 + .../packages/cli/src/commands/score/utils.ts | 6 + .../__tests__/checkstyle-formatter.test.ts | 181 + .../__tests__/fetch-scorecard.test.ts | 281 + .../__tests__/json-formatter.test.ts | 263 + .../__tests__/junit-formatter.test.ts | 188 + .../__tests__/login-handler.test.ts | 106 + .../__tests__/plugin-evaluator.test.ts | 78 + .../__tests__/project-url.test.ts | 22 + .../__tests__/stylish-formatter.test.ts | 132 + .../__tests__/targets-handler.test.ts | 196 + .../__tests__/validate-scorecard.test.ts | 370 + .../scorecard-classic/auth/login-handler.ts | 39 + .../formatters/checkstyle-formatter.ts | 42 + .../formatters/json-formatter.ts | 111 + .../formatters/junit-formatter.ts | 107 + .../formatters/stylish-formatter.ts | 105 + .../src/commands/scorecard-classic/index.ts | 185 + .../remote/fetch-scorecard.ts | 183 + .../targets-handler/targets-handler.ts | 84 + .../src/commands/scorecard-classic/types.ts | 28 + .../validation/plugin-evaluator.ts | 68 + .../validation/project-url.ts | 10 + .../validation/validate-scorecard.ts | 187 + .../split/__tests__/assert-within-dir.test.ts | 23 + .../split/__tests__/fixtures/asyncapi2.json | 38 + .../split/__tests__/fixtures/asyncapi3.json | 42 + .../fixtures/path-traversal-paths.json | 9 + .../__tests__/fixtures/path-traversal.json | 10 + .../split/__tests__/fixtures/samples.json | 61 + .../split/__tests__/fixtures/spec.json | 70 + .../split/__tests__/fixtures/webhooks.json | 85 + .../commands/split/__tests__/index.test.ts | 270 + .../src/commands/split/asyncapi/constants.ts | 73 + .../asyncapi/find-asyncapi-component-types.ts | 16 + .../gather-asyncapi-component-files.ts | 43 + .../asyncapi/iterate-asyncapi-channels.ts | 51 + .../asyncapi/iterate-asyncapi-components.ts | 73 + .../asyncapi/iterate-asyncapi-operations.ts | 55 + .../remove-asyncapi-empty-components.ts | 23 + .../asyncapi/split-asyncapi-definition.ts | 72 + .../cli/src/commands/split/constants.ts | 6 + .../packages/cli/src/commands/split/index.ts | 66 + .../cli/src/commands/split/oas/constants.ts | 23 + .../split/oas/split-oas-definition.ts | 50 + .../packages/cli/src/commands/split/types.ts | 54 + .../commands/split/utils/assert-within-dir.ts | 11 + .../cli/src/commands/split/utils/crawl.ts | 14 + .../split/utils/create-component-dir.ts | 9 + .../commands/split/utils/does-file-differ.ts | 8 + .../split/utils/extract-filename-from-path.ts | 5 + .../split/utils/find-component-type.ts | 11 + .../split/utils/gather-components-files.ts | 29 + .../split/utils/get-file-name-path.ts | 5 + .../implicitly-reference-discriminator.ts | 41 + .../utils/is-not-security-component-type.ts | 3 + .../split/utils/iterate-components.ts | 83 + .../split/utils/iterate-path-items.ts | 75 + .../split/utils/remove-empty-components.ts | 20 + .../commands/split/utils/replace-$-refs.ts | 39 + .../split/utils/replace-channel-refs.ts | 36 + .../split/utils/starts-with-components.ts | 5 + .../split/utils/traverse-directory-deep.ts | 30 + .../packages/cli/src/commands/stats/index.ts | 70 + .../src/commands/stats/print-stats/index.ts | 34 + .../src/commands/stats/print-stats/json.ts | 18 + .../commands/stats/print-stats/markdown.ts | 17 + .../src/commands/stats/print-stats/stylish.ts | 17 + .../stats/visitor-and-accumulator-resolver.ts | 56 + .../packages/cli/src/commands/translations.ts | 33 + .../redocly-cli/packages/cli/src/custom.d.ts | 1 + @skills/redocly-cli/packages/cli/src/index.ts | 1133 + .../reunite/api/__tests__/api-keys.test.ts | 21 + .../reunite/api/__tests__/api.client.test.ts | 460 + .../src/reunite/api/__tests__/domains.test.ts | 120 + .../cli/src/reunite/api/api-client.ts | 401 + .../packages/cli/src/reunite/api/api-keys.ts | 7 + .../packages/cli/src/reunite/api/domains.ts | 66 + .../packages/cli/src/reunite/api/index.ts | 3 + .../packages/cli/src/reunite/api/types.ts | 108 + .../commands/__tests__/push-status.test.ts | 648 + .../reunite/commands/__tests__/push.test.ts | 352 + .../reunite/commands/__tests__/utils.test.ts | 58 + .../cli/src/reunite/commands/push-status.ts | 312 + .../packages/cli/src/reunite/commands/push.ts | 217 + .../cli/src/reunite/commands/utils.ts | 71 + .../packages/cli/src/reunite/utils.ts | 1 + @skills/redocly-cli/packages/cli/src/types.ts | 54 + .../json-stringify-with-array-buffer.test.ts | 104 + .../cli/src/utils/__tests__/telemetry.test.ts | 39 + .../__tests__/validate-mount-path.test.ts | 23 + .../cli/src/utils/assert-node-version.ts | 17 + .../packages/cli/src/utils/constants.ts | 4 + .../packages/cli/src/utils/error.ts | 8 + .../cli/src/utils/fetch-with-timeout.ts | 32 + .../src/utils/get-command-name-from-args.ts | 5 + .../utils/json-stringify-with-array-buffer.ts | 39 + .../packages/cli/src/utils/miscellaneous.ts | 577 + .../packages/cli/src/utils/network-check.ts | 12 + .../packages/cli/src/utils/otel.ts | 49 + .../packages/cli/src/utils/package.ts | 13 + .../packages/cli/src/utils/platform.ts | 33 + .../packages/cli/src/utils/proxy-agent.ts | 41 + .../cli/src/utils/read-env-variables.ts | 22 + .../packages/cli/src/utils/spinner.ts | 51 + .../cli/src/utils/strip-ansi-codes.ts | 5 + .../packages/cli/src/utils/telemetry.ts | 395 + .../cli/src/utils/update-version-notifier.ts | 118 + .../cli/src/utils/validate-mount-path.ts | 8 + .../cli/src/utils/validate-positive-number.ts | 12 + .../redocly-cli/packages/cli/src/wrapper.ts | 131 + .../redocly-cli/packages/cli/tsconfig.json | 10 + @skills/redocly-cli/packages/core/.npmignore | 5 + .../redocly-cli/packages/core/CHANGELOG.md | 1458 + @skills/redocly-cli/packages/core/README.md | 306 + .../packages/core/__tests__/utils.ts | 48 + .../redocly-cli/packages/core/package.json | 74 + .../__snapshots__/bundle-oas.test.ts.snap | 310 + .../__snapshots__/bundle.test.ts.snap | 696 + .../__snapshots__/redocly-yaml.test.ts.snap | 38535 +++++++++ .../core/src/__tests__/arazzo1_1.test.ts | 438 + .../bundle-examples-ref-resolution.test.ts | 230 + .../core/src/__tests__/bundle-oas.test.ts | 181 + .../core/src/__tests__/bundle.test.ts | 1066 + .../core/src/__tests__/codeframes.test.ts | 530 + .../core/src/__tests__/detect-spec.test.ts | 78 + .../core/src/__tests__/entity.test.ts | 114 + .../fixtures/.redocly.lint-ignore.yaml | 5 + .../fixtures/concurrent-lint/common.yaml | 12 + .../fixtures/concurrent-lint/spec-a.yaml | 39 + .../fixtures/concurrent-lint/spec-b.yaml | 39 + .../components/schemas/discriminated.yaml | 8 + .../components/schemas/type-a.yaml | 6 + .../components/schemas/type-b.yaml | 6 + .../openapi.yaml | 17 + .../src/__tests__/fixtures/example-data.json | 4 + .../core/src/__tests__/fixtures/extension.js | 24 + .../config-with-plugin.yaml | 5 + .../config-with-ref-to-plugin.yaml | 1 + .../custom-plugin.js | 24 + .../src/__tests__/fixtures/lint/openapi.yaml | 10 + .../src/__tests__/fixtures/local-plugin.js | 11 + .../core/src/__tests__/fixtures/redocly.yaml | 2 + .../__tests__/fixtures/refs/component-a.yaml | 6 + .../__tests__/fixtures/refs/component-b.yaml | 6 + .../__tests__/fixtures/refs/definitions.yaml | 3 + .../src/__tests__/fixtures/refs/examples.yaml | 8 + .../fixtures/refs/external-media-types.yaml | 9 + .../fixtures/refs/external-ref-with-dots.yaml | 12 + .../fixtures/refs/external-request-body.yaml | 13 + .../__tests__/fixtures/refs/externalref.yaml | 35 + .../src/__tests__/fixtures/refs/hosted.yaml | 35 + ...ternal-schema-names-and-user-conflict.yaml | 29 + ...-with-external-refs-conflicting-names.yaml | 21 + ...ternal-refs-pointer-conflicting-names.yaml | 9 + .../openapi-with-external-refs-x-query.yaml | 14 + .../refs/openapi-with-external-refs.yaml | 33 + .../openapi-with-special-names-in-props.yaml | 19 + .../fixtures/refs/openapi-with-url-refs.yaml | 18 + .../src/__tests__/fixtures/refs/param-b.yaml | 1 + .../src/__tests__/fixtures/refs/param-c.yaml | 1 + .../src/__tests__/fixtures/refs/rename.yaml | 1 + .../__tests__/fixtures/refs/requestBody.yaml | 9 + .../src/__tests__/fixtures/refs/schema-a.yaml | 1 + .../src/__tests__/fixtures/refs/simple.yaml | 1 + .../fixtures/refs/testMediaType.yaml | 10 + .../refs/title-naming-collision/openapi.yaml | 32 + .../schemas/a/User.yaml | 5 + .../schemas/b/User.yaml | 5 + .../title-naming-missing-title/openapi.yaml | 14 + .../schemas/NoTitle.yaml | 4 + .../openapi.yaml | 14 + .../schemas/Sample.yaml | 5 + .../fixtures/refs/title-naming/openapi.yaml | 28 + .../schemas/models/Authority.yaml | 8 + .../schemas/requests/Authority.yaml | 6 + .../fixtures/refs/vendor.schema.yaml | 20 + .../__tests__/fixtures/resolve/External.yaml | 10 + .../__tests__/fixtures/resolve/External2.yaml | 4 + .../__tests__/fixtures/resolve/description.md | 3 + .../fixtures/resolve/externalInfo.yaml | 4 + .../fixtures/resolve/externalLicense.yaml | 1 + .../fixtures/resolve/openapi-with-back.yaml | 13 + .../resolve/openapi-with-md-description.yaml | 5 + .../__tests__/fixtures/resolve/openapi.yaml | 28 + .../fixtures/resolve/schemas/type-a.yaml | 10 + .../fixtures/resolve/schemas/type-b.yaml | 6 + .../fixtures/resolve/transitive/a.yaml | 1 + .../resolve/transitive/components.yaml | 5 + .../fixtures/resolve/transitive/schemas.yaml | 3 + .../fixtures/self-file-refs/async2.yaml | 14 + .../self-file-refs/async3-nested.yaml | 23 + .../fixtures/self-file-refs/async3-root.yaml | 9 + .../fixtures/self-file-refs/oas2.yaml | 14 + .../fixtures/self-file-refs/oas3-nested.yaml | 25 + .../fixtures/self-file-refs/oas3-root.yaml | 9 + .../fixtures/sibling-refs/arazzo.yaml | 27 + .../fixtures/sibling-refs/asyncapi.yaml | 18 + .../fixtures/sibling-refs/description.md | 1 + .../openapi-non-summary-desc-ref.yaml | 26 + .../sibling-refs/openapi-request-body.yaml | 21 + .../openapi-with-description-ref.yaml | 27 + .../fixtures/sibling-refs/openapi.yaml | 29 + .../fixtures/sibling-refs/summary.md | 1 + .../core/src/__tests__/format.test.ts | 451 + .../core/src/__tests__/js-yaml.test.ts | 86 + .../core/src/__tests__/lint-entity.test.ts | 777 + .../packages/core/src/__tests__/lint.test.ts | 2050 + .../core/src/__tests__/logger-browser.test.ts | 53 + .../core/src/__tests__/logger.test.ts | 76 + .../src/__tests__/normalizeVisitors.test.ts | 169 + .../core/src/__tests__/openrpc.test.ts | 218 + .../core/src/__tests__/output-browser.test.ts | 18 + .../core/src/__tests__/output.test.ts | 15 + .../core/src/__tests__/redocly-yaml.test.ts | 66 + .../core/src/__tests__/ref-utils.test.ts | 262 + .../core/src/__tests__/resolve-http.test.ts | 77 + .../core/src/__tests__/resolve.test.ts | 522 + .../core/src/__tests__/utils-browser.test.ts | 11 + .../packages/core/src/__tests__/utils.test.ts | 289 + .../packages/core/src/__tests__/walk.test.ts | 1856 + .../core/src/bundle/bundle-document.ts | 165 + .../packages/core/src/bundle/bundle-oas.ts | 83 + .../core/src/bundle/bundle-visitor.ts | 388 + .../packages/core/src/bundle/bundle.ts | 134 + .../config-resolvers.test.ts.snap | 807 + .../__snapshots__/config.test.ts.snap | 105 + .../__tests__/__snapshots__/load.test.ts.snap | 299 + .../config/__tests__/arazzo1_1-config.test.ts | 18 + .../config/__tests__/config-resolvers.test.ts | 687 + .../core/src/config/__tests__/config.test.ts | 252 + .../src/config/__tests__/fixtures/gold.yaml | 59 + .../ignore-file/.redocly.lint-ignore.yaml | 3 + .../__tests__/fixtures/ignore-file/api.yaml | 12 + .../fixtures/ignore-file/redocly.yaml | 3 + .../__tests__/fixtures/load-external.yaml | 2 + .../load-redocly-with-scorecard-classic.yaml | 25 + .../load-redocly-with-scorecards.yaml | 25 + .../__tests__/fixtures/load-redocly.yaml | 2 + .../__tests__/fixtures/plugin-config.yaml | 2 + .../src/config/__tests__/fixtures/plugin.cjs | 56 + .../resolve-config/api/nested-config.yaml | 13 + .../fixtures/resolve-config/api/plugin.js | 69 + .../local-config-with-circular.yaml | 7 + ...-config-with-commonjs-export-function.yaml | 2 + .../local-config-with-custom-function.yaml | 17 + .../resolve-config/local-config-with-esm.yaml | 2 + .../local-config-with-file.yaml | 20 + .../local-config-with-plugin-init.yaml | 2 + .../local-config-with-realm-plugin.yaml | 2 + ...cal-config-with-wrong-custom-function.yaml | 17 + .../fixtures/resolve-config/local-config.yaml | 9 + .../fixtures/resolve-config/plugin-esm.mjs | 10 + .../plugin-with-deps-helper.cjs | 1 + .../resolve-config/plugin-with-deps.cjs | 10 + .../plugin-with-export-function.cjs | 10 + .../resolve-config/plugin-with-init-logic.cjs | 9 + .../resolve-config/plugin-with-init-logic.js | 9 + .../fixtures/resolve-config/plugin.js | 80 + .../fixtures/resolve-config/realm-plugin.cjs | 12 + .../__tests__/fixtures/resolve-config/sd.yaml | 4 + .../config-with-refs.yaml | 8 + .../resolve-refs-in-config/rules.yaml | 2 + .../fixtures/resolve-refs-in-config/seo.yaml | 1 + .../nested-remote-config.yaml | 3 + .../resolve-remote-configs/remote-config.yaml | 4 + .../core/src/config/__tests__/load.test.ts | 2682 + .../config/__tests__/plugins-cache.test.ts | 87 + .../config/__tests__/resolve-plugins.test.ts | 28 + .../core/src/config/__tests__/utils.test.ts | 22 + .../packages/core/src/config/all.ts | 351 + .../packages/core/src/config/builtIn.ts | 77 + .../core/src/config/bundle-extends.ts | 42 + .../core/src/config/config-resolvers.ts | 497 + .../packages/core/src/config/config.ts | 471 + .../packages/core/src/config/constants.ts | 16 + .../core/src/config/get-resolve-config.ts | 10 + .../core/src/config/group-assertion-rules.ts | 76 + .../packages/core/src/config/index.ts | 8 + .../packages/core/src/config/load.ts | 152 + .../packages/core/src/config/minimal.ts | 330 + .../packages/core/src/config/plugins-cache.ts | 119 + .../core/src/config/recommended-strict.ts | 330 + .../packages/core/src/config/recommended.ts | 330 + .../packages/core/src/config/rules.ts | 75 + .../packages/core/src/config/spec.ts | 330 + .../packages/core/src/config/types.ts | 297 + .../packages/core/src/config/utils.ts | 176 + .../packages/core/src/config/visitors.ts | 116 + .../decorators/__tests__/filter-in.test.ts | 589 + .../decorators/__tests__/filter-out.test.ts | 584 + .../fixtures/filter-in/admin-schema.yaml | 1 + .../__tests__/fixtures/filter-in/admin.yaml | 10 + .../__tests__/fixtures/filter-in/openapi.yaml | 34 + .../fixtures/filter-in/user-schema.yaml | 1 + .../media-type-examples-override.test.ts | 668 + .../__tests__/remove-x-internal.test.ts | 434 + .../__tests__/resources/request.yaml | 3 + .../__tests__/resources/response.yaml | 3 + .../core/src/decorators/arazzo/index.ts | 1 + .../core/src/decorators/async2/index.ts | 1 + .../core/src/decorators/async3/index.ts | 1 + .../common/filters/filter-helper.ts | 73 + .../decorators/common/filters/filter-in.ts | 84 + .../decorators/common/filters/filter-out.ts | 86 + .../common/info-description-override.ts | 27 + .../src/decorators/common/info-override.ts | 16 + .../common/operation-description-override.ts | 33 + .../decorators/common/remove-x-internal.ts | 78 + .../common/tag-description-override.ts | 31 + .../fixtures/handle-invalid-ref/schemas.yaml | 2 + .../fixtures/handle-invalid-ref/swagger.yaml | 14 + .../remove-unused-components.test.ts | 363 + .../core/src/decorators/oas2/index.ts | 21 + .../oas2/remove-unused-components.ts | 125 + .../fixtures/handle-invalid-ref/openapi.yaml | 11 + .../fixtures/handle-invalid-ref/schemas.yaml | 2 + .../remove-unused-components.test.ts | 687 + .../core/src/decorators/oas3/index.ts | 23 + .../oas3/media-type-examples-override.ts | 85 + .../oas3/remove-unused-components.ts | 182 + .../core/src/decorators/openrpc/index.ts | 1 + .../core/src/decorators/overlay1/index.ts | 1 + .../packages/core/src/detect-spec.ts | 89 + @skills/redocly-cli/packages/core/src/env.ts | 5 + .../core/src/errors/yaml-parse-error.ts | 21 + .../packages/core/src/format/codeframes.ts | 213 + .../packages/core/src/format/format.ts | 553 + .../packages/core/src/graphql/assertions.ts | 199 + .../core/src/graphql/detect-graphql.ts | 6 + .../packages/core/src/graphql/lint-graphql.ts | 92 + .../packages/core/src/graphql/node-kinds.ts | 55 + .../packages/core/src/graphql/visitor.ts | 115 + .../redocly-cli/packages/core/src/index.ts | 145 + .../packages/core/src/js-yaml/index.ts | 34 + .../packages/core/src/lint-entity.ts | 295 + @skills/redocly-cli/packages/core/src/lint.ts | 202 + .../redocly-cli/packages/core/src/logger.ts | 78 + .../packages/core/src/oas-types.ts | 152 + .../packages/core/src/ref-utils.ts | 141 + .../redocly-cli/packages/core/src/resolve.ts | 486 + .../core/src/rules/__tests__/ajv.test.ts | 228 + .../src/rules/__tests__/spec-ruleset.test.ts | 168 + .../core/src/rules/__tests__/utils.test.ts | 122 + .../packages/core/src/rules/ajv.ts | 158 + .../arazzo/__tests__/criteria-unique.test.ts | 166 + .../__tests__/no-criteria-xpath.test.ts | 128 + ...curity-scheme-name-without-openapi.test.ts | 87 + .../arazzo/__tests__/outputs-defined.test.ts | 851 + .../__tests__/parameters-unique.test.ts | 115 + .../requestBody-replacements-unique.test.ts | 111 + .../__tests__/source-description-type.test.ts | 143 + .../sourceDescription-name-unique.test.ts | 81 + .../sourceDescriptions-not-empty.test.ts | 106 + ...pec-step-mutually-exclusive-fields.test.ts | 116 + .../__tests__/step-onFailure-unique.test.ts | 114 + .../__tests__/step-onSuccess-unique.test.ts | 114 + .../arazzo/__tests__/stepId-unique.test.ts | 97 + .../__tests__/workflow-dependsOn.test.ts | 214 + .../__tests__/workflowId-unique.test.ts | 91 + .../x-security-scheme-required-values.test.ts | 546 + .../core/src/rules/arazzo/criteria-unique.ts | 73 + .../packages/core/src/rules/arazzo/index.ts | 57 + .../core/src/rules/arazzo/outputs-defined.ts | 181 + .../src/rules/arazzo/parameters-unique.ts | 31 + .../arazzo/requestBody-replacements-unique.ts | 35 + .../rules/arazzo/sourceDescription-type.ts | 25 + .../arazzo/sourceDescriptions-name-unique.ts | 24 + .../arazzo/sourceDescriptions-not-empty.ts | 17 + .../spec-step-mutually-exclusive-fields.ts | 30 + .../src/rules/arazzo/step-onFailure-unique.ts | 33 + .../src/rules/arazzo/step-onSuccess-unique.ts | 33 + .../core/src/rules/arazzo/stepId-unique.ts | 25 + .../src/rules/arazzo/workflow-dependsOn.ts | 59 + .../src/rules/arazzo/workflowId-unique.ts | 22 + .../__tests__/channels-kebab-case.test.ts | 149 + .../no-channel-trailing-slash.test.ts | 100 + .../src/rules/async2/channels-kebab-case.ts | 19 + .../packages/core/src/rules/async2/index.ts | 39 + .../rules/async2/no-channel-trailing-slash.ts | 16 + .../__tests__/channels-kebab-case.test.ts | 149 + .../no-channel-trailing-slash.test.ts | 99 + .../__tests__/security-scopes-defined.test.ts | 269 + .../src/rules/async3/channels-kebab-case.ts | 20 + .../packages/core/src/rules/async3/index.ts | 39 + .../rules/async3/no-channel-trailing-slash.ts | 17 + .../rules/async3/security-scopes-defined.ts | 92 + .../__tests__/entity-key-valid.test.ts | 124 + .../rules/catalog-entity/entity-key-valid.ts | 47 + .../common/__tests__/fixtures/code-sample.php | 9 + .../__tests__/fixtures/invalid-yaml.yaml | 1 + .../rules/common/__tests__/fixtures/ref.yaml | 1 + .../__tests__/info-license-strict.test.ts | 145 + .../common/__tests__/info-license.test.ts | 65 + .../__tests__/no-ambiguous-paths.test.ts | 101 + .../__tests__/no-duplicated-tag-names.test.ts | 374 + .../__tests__/no-enum-type-mismatch.test.ts | 357 + .../__tests__/no-http-verbs-in-paths.test.ts | 114 + .../__tests__/no-identical-paths.test.ts | 61 + .../no-invalid-parameter-examples.test.ts | 363 + .../no-invalid-schema-examples.test.ts | 209 + .../__tests__/no-path-trailing-slash.test.ts | 130 + ...quired-schema-properties-undefined.test.ts | 953 + .../__tests__/no-schema-type-mismatch.test.ts | 291 + .../__tests__/no-unresolved-refs.test.ts | 279 + .../__tests__/operation-2xx-response.test.ts | 199 + .../__tests__/operation-4xx-response.test.ts | 239 + .../operation-operationId-unique.test.ts | 79 + .../operation-operationId-url-safe.test.ts | 48 + .../operation-parameters-unique.test.ts | 172 + .../__tests__/operation-singular-tag.test.ts | 75 + .../__tests__/operation-tag-defined.test.ts | 71 + .../__tests__/path-http-verbs-order.test.ts | 99 + .../__tests__/path-not-include-query.test.ts | 67 + .../__tests__/path-params-defined.test.ts | 499 + .../common/__tests__/paths-kebab-case.test.ts | 114 + .../scalar-property-missing-example.test.ts | 268 + .../common/__tests__/security-defined.test.ts | 327 + .../__tests__/security-scopes-defined.test.ts | 353 + .../common/__tests__/spec-strict-refs.test.ts | 73 + .../src/rules/common/__tests__/struct.test.ts | 829 + .../common/__tests__/tag-description.test.ts | 68 + .../__tests__/tags-alphabetical.test.ts | 128 + .../assertions/__tests__/asserts.test.ts | 892 + .../common/assertions/__tests__/index.test.ts | 100 + .../common/assertions/__tests__/utils.test.ts | 237 + .../src/rules/common/assertions/asserts.ts | 372 + .../core/src/rules/common/assertions/index.ts | 67 + .../core/src/rules/common/assertions/utils.ts | 326 + .../core/src/rules/common/info-contact.ts | 16 + .../src/rules/common/info-license-strict.ts | 33 + .../core/src/rules/common/info-license.ts | 16 + .../src/rules/common/no-ambiguous-paths.ts | 51 + .../rules/common/no-duplicated-tag-names.ts | 26 + .../src/rules/common/no-enum-type-mismatch.ts | 59 + .../rules/common/no-http-verbs-in-paths.ts | 39 + .../src/rules/common/no-identical-paths.ts | 25 + .../common/no-invalid-parameter-examples.ts | 51 + .../common/no-invalid-schema-examples.ts | 56 + .../no-mixed-number-range-constraints.ts | 35 + .../rules/common/no-path-trailing-slash.ts | 16 + ...no-required-schema-properties-undefined.ts | 100 + .../rules/common/no-schema-type-mismatch.ts | 31 + .../src/rules/common/no-unresolved-refs.ts | 68 + .../rules/common/operation-2xx-response.ts | 34 + .../rules/common/operation-4xx-response.ts | 34 + .../src/rules/common/operation-description.ts | 18 + .../common/operation-operationId-unique.ts | 22 + .../common/operation-operationId-url-safe.ts | 21 + .../src/rules/common/operation-operationId.ts | 22 + .../common/operation-parameters-unique.ts | 50 + .../rules/common/operation-singular-tag.ts | 18 + .../src/rules/common/operation-summary.ts | 18 + .../src/rules/common/operation-tag-defined.ts | 40 + .../src/rules/common/parameter-description.ts | 24 + .../common/path-declaration-must-exist.ts | 16 + .../src/rules/common/path-http-verbs-order.ts | 31 + .../rules/common/path-not-include-query.ts | 18 + .../src/rules/common/path-params-defined.ts | 238 + .../src/rules/common/path-segment-plural.ts | 34 + .../core/src/rules/common/paths-kebab-case.ts | 20 + ...ired-string-property-missing-min-length.ts | 46 + .../rules/common/response-contains-header.ts | 36 + .../common/scalar-property-missing-example.ts | 59 + .../core/src/rules/common/security-defined.ts | 94 + .../rules/common/security-scopes-defined.ts | 94 + .../core/src/rules/common/spec-strict-refs.ts | 31 + .../packages/core/src/rules/common/struct.ts | 200 + .../core/src/rules/common/tag-description.ts | 18 + .../src/rules/common/tags-alphabetical.ts | 24 + .../graphql/__tests__/assertions.test.ts | 498 + .../rules/graphql/__tests__/graphql.test.ts | 189 + .../graphql/__tests__/no-unused-types.test.ts | 397 + .../__tests__/type-description.test.ts | 59 + .../packages/core/src/rules/graphql/index.ts | 13 + .../core/src/rules/graphql/no-unused-types.ts | 124 + .../packages/core/src/rules/graphql/struct.ts | 43 + .../src/rules/graphql/type-description.ts | 28 + .../boolean-parameter-prefixes.test.ts | 115 + .../response-contains-header.test.ts | 184 + .../response-contains-property.test.ts | 164 + .../__tests__/struct/fixtures/description.md | 1 + .../rules/oas2/__tests__/struct/info.test.ts | 356 + .../oas2/__tests__/struct/operation.test.ts | 124 + .../rules/oas2/__tests__/struct/paths.test.ts | 246 + .../struct/referenceableScalars.test.ts | 39 + .../src/rules/oas2/__tests__/struct/utils.ts | 24 + .../rules/oas2/boolean-parameter-prefixes.ts | 27 + .../packages/core/src/rules/oas2/index.ts | 98 + .../core/src/rules/oas2/request-mime-type.ts | 28 + .../rules/oas2/response-contains-property.ts | 37 + .../core/src/rules/oas2/response-mime-type.ts | 28 + .../array-parameter-serialization.test.ts | 282 + .../boolean-parameter-prefixes.test.ts | 116 + .../__tests__/component-name-unique.test.ts | 989 + .../rules/oas3/__tests__/fixtures/common.yaml | 11 + .../__tests__/fixtures/external-value.yaml | 2 + .../no-empty-enum-servers.com.test.ts | 210 + ...no-example-value-and-externalValue.test.ts | 72 + .../no-invalid-media-type-examples.test.ts | 1228 + .../no-mixed-number-range-constraints.test.ts | 153 + .../__tests__/no-server-example.com.test.ts | 99 + .../no-server-trailing-slash.test.ts | 82 + .../no-undefined-server-variables.test.ts | 27 + .../__tests__/no-unused-components.test.ts | 451 + ...ration-4xx-problem-details-rfc7807.test.ts | 150 + .../response-contains-header.test.ts | 407 + .../response-contains-property.test.ts | 423 + .../spec-components-invalid-map-name.test.ts | 289 + .../spec-discriminator-defaultMapping.test.ts | 678 + .../__tests__/spec-example-values.test.ts | 123 + ...c-no-invalid-encoding-combinations.test.ts | 101 + .../spec-no-invalid-tag-parents.test.ts | 186 + .../spec-querystring-parameters.test.ts | 330 + .../oas3/__tests__/struct/callbacks.test.ts | 42 + .../__tests__/struct/fixtures/description.md | 1 + .../rules/oas3/__tests__/struct/info.test.ts | 392 + .../oas3/__tests__/struct/operation.test.ts | 254 + .../rules/oas3/__tests__/struct/paths.test.ts | 285 + .../struct/referenceableScalars.test.ts | 107 + .../oas3/__tests__/struct/servers.test.ts | 506 + .../oas3/__tests__/struct/struct.test.ts | 304 + .../src/rules/oas3/__tests__/struct/utils.ts | 24 + .../__tests__/utils/lint-document-for-test.ts | 23 + .../oas3/array-parameter-serialization.ts | 47 + .../rules/oas3/boolean-parameter-prefixes.ts | 29 + .../src/rules/oas3/component-name-unique.ts | 163 + .../packages/core/src/rules/oas3/index.ts | 136 + .../core/src/rules/oas3/no-empty-servers.ts | 24 + .../no-example-value-and-externalValue.ts | 15 + .../oas3/no-invalid-media-type-examples.ts | 89 + .../src/rules/oas3/no-server-example.com.ts | 17 + .../rules/oas3/no-server-trailing-slash.ts | 16 + .../oas3/no-server-variables-empty-enum.ts | 65 + .../oas3/no-undefined-server-variable.ts | 32 + .../src/rules/oas3/no-unused-components.ts | 123 + .../src/rules/oas3/nullable-type-sibling.ts | 17 + .../operation-4xx-problem-details-rfc7807.ts | 55 + .../core/src/rules/oas3/request-mime-type.ts | 48 + .../rules/oas3/response-contains-property.ts | 39 + .../core/src/rules/oas3/response-mime-type.ts | 48 + .../oas3/spec-components-invalid-map-name.ts | 71 + .../oas3/spec-discriminator-defaultMapping.ts | 75 + .../src/rules/oas3/spec-example-values.ts | 43 + .../spec-no-invalid-encoding-combinations.ts | 23 + .../rules/oas3/spec-no-invalid-tag-parents.ts | 44 + .../rules/oas3/spec-querystring-parameters.ts | 96 + .../packages/core/src/rules/openrpc/index.ts | 23 + .../src/rules/openrpc/no-unused-components.ts | 86 + .../spec-no-duplicated-method-params.ts | 32 + .../spec-no-required-params-after-optional.ts | 35 + .../packages/core/src/rules/other/stats.ts | 202 + .../overlay1/__tests__/info-contact.test.ts | 115 + .../packages/core/src/rules/overlay1/index.ts | 15 + ...ecurity-both-scheme-and-schemeName.test.ts | 190 + .../x-security-scheme-name-reference.test.ts | 136 + .../src/rules/respect/no-criteria-xpath.ts | 25 + ...-x-security-both-scheme-and-scheme-name.ts | 40 + ...-x-security-scheme-name-without-openapi.ts | 34 + .../x-security-scheme-name-reference.ts | 45 + .../x-security-scheme-required-values.ts | 79 + .../packages/core/src/rules/utils.ts | 298 + .../packages/core/src/types/arazzo.ts | 520 + .../packages/core/src/types/arazzo1_1.ts | 263 + .../core/src/types/asyncapi-bindings.ts | 1070 + .../packages/core/src/types/asyncapi2.ts | 636 + .../packages/core/src/types/asyncapi3.ts | 613 + .../packages/core/src/types/entity.ts | 51 + .../packages/core/src/types/index.ts | 163 + .../core/src/types/json-schema-adapter.ts | 257 + .../src/types/json-schema-draft7.shared.ts | 104 + .../packages/core/src/types/oas2.ts | 479 + .../packages/core/src/types/oas3.ts | 939 + .../packages/core/src/types/oas3_1.ts | 304 + .../packages/core/src/types/oas3_2.ts | 347 + .../packages/core/src/types/openrpc.ts | 415 + .../packages/core/src/types/overlay.ts | 70 + .../packages/core/src/types/redocly-yaml.ts | 772 + .../packages/core/src/typings/arazzo.ts | 278 + .../packages/core/src/typings/asyncapi.ts | 32 + .../packages/core/src/typings/asyncapi3.ts | 144 + .../packages/core/src/typings/common.ts | 31 + .../packages/core/src/typings/openapi.ts | 436 + .../packages/core/src/typings/openrpc.ts | 124 + .../packages/core/src/typings/overlay.ts | 19 + .../packages/core/src/typings/swagger.ts | 238 + .../packages/core/src/utils/assign-config.ts | 30 + .../packages/core/src/utils/dequal.ts | 36 + .../core/src/utils/does-yaml-file-exist.ts | 9 + .../packages/core/src/utils/error.ts | 1 + .../core/src/utils/get-intersection-length.ts | 10 + .../utils/get-matching-status-code-range.ts | 3 + .../packages/core/src/utils/get-own.ts | 3 + .../packages/core/src/utils/identity.ts | 3 + .../core/src/utils/is-custom-rule-id.ts | 3 + .../packages/core/src/utils/is-defined.ts | 3 + .../packages/core/src/utils/is-empty-array.ts | 3 + .../core/src/utils/is-empty-object.ts | 5 + .../core/src/utils/is-not-empty-array.ts | 3 + .../core/src/utils/is-not-empty-object.ts | 6 + .../packages/core/src/utils/is-not-string.ts | 5 + .../packages/core/src/utils/is-ordered.ts | 38 + .../core/src/utils/is-path-parameter.ts | 3 + .../core/src/utils/is-plain-object.ts | 4 + .../packages/core/src/utils/is-string.ts | 3 + .../core/src/utils/is-supported-extension.ts | 3 + .../packages/core/src/utils/is-truthy.ts | 5 + .../packages/core/src/utils/keys-of.ts | 4 + .../packages/core/src/utils/make-ref-id.ts | 3 + .../packages/core/src/utils/next-tick.ts | 5 + .../core/src/utils/oas-has-component.ts | 8 + .../packages/core/src/utils/omit.ts | 9 + .../packages/core/src/utils/pause.ts | 3 + .../packages/core/src/utils/pluralize.ts | 8 + .../core/src/utils/read-file-from-url.ts | 32 + .../core/src/utils/regex-from-string.ts | 4 + .../packages/core/src/utils/scorecards.ts | 140 + .../packages/core/src/utils/slash.ts | 11 + .../src/utils/split-camel-case-into-words.ts | 13 + .../packages/core/src/utils/stack.ts | 14 + .../packages/core/src/utils/to-pascal-case.ts | 7 + .../packages/core/src/utils/types.ts | 5 + .../core/src/utils/validate-mime-type.ts | 57 + .../packages/core/src/utils/yaml-fs-helper.ts | 28 + .../redocly-cli/packages/core/src/visitors.ts | 683 + @skills/redocly-cli/packages/core/src/walk.ts | 498 + .../redocly-cli/packages/core/tsconfig.json | 9 + .../packages/respect-core/.gitignore | 1 + .../packages/respect-core/.npmignore | 6 + .../packages/respect-core/CHANGELOG.md | 1005 + .../packages/respect-core/README.md | 30 + .../packages/respect-core/package.json | 64 + .../respect-core/src/__tests__/run.test.ts | 73 + .../respect-core/src/arazzo-schema.ts | 449 + .../packages/respect-core/src/generate.ts | 17 + .../packages/respect-core/src/index.ts | 7 + .../cleanup-test-description.test.ts | 55 + .../generate-arazzo-description.test.ts | 303 + .../generate-example-value.test.ts | 45 + .../generate-inputs-arazzo-components.test.ts | 84 + ...enerate-test-data-from-json-schema.test.ts | 79 + .../generate-workflow-security-inputs.test.ts | 44 + ...erate-workflow-security-parameters.test.ts | 133 + .../modules/__tests__/checks/severity.test.ts | 44 + .../config-parser/auto-with-lint-errors.yaml | 34 + .../modules/__tests__/config-parser/auto.yaml | 34 + .../get-security-parameters.test.ts | 143 + .../get-value-from-context.test.ts | 522 + .../handle-request-body-replacements.test.ts | 72 + .../config-parser/parse-parameters.test.ts | 30 + .../config-parser/parse-request-body.test.ts | 316 + .../resolve-reusable-component-item.test.ts | 95 + .../resolve-reusable-object-reference.test.ts | 101 + .../resolve-workflow-reference.test.ts | 96 + .../get-operation-from-description.test.ts | 400 + .../get-request-body-schema.test.ts | 57 + .../get-request-data-from-openapi.test.ts | 41 + .../get-response-schema.test.ts | 113 + .../src/modules/__tests__/faker.test.ts | 100 + .../__snapshots__/run-step.test.ts.snap | 36 + .../call-api-and-analyze-results.test.ts | 379 + ...create-runtime-expression-ctx.test.ts.snap | 1877 + .../create-runtime-expression-ctx.test.ts | 131 + .../context/create-test-context.test.ts | 897 + .../flow-runner/error-message-matcher.test.ts | 20 + .../flow-runner/get-server-url.test.ts | 418 + .../flow-runner/get-workflows-to-run.test.ts | 124 + .../inputs/format-cli-inputs.test.ts | 41 + .../inputs/map-input-values-to-schema.test.ts | 120 + .../flow-runner/outputs/print-message.test.ts | 22 + .../flow-runner/prepare-request.test.ts | 1769 + .../resolve-running-workflows.test.ts | 47 + .../resolve-security-scheme.test.ts | 57 + .../resolve-x-security-parameters.ts.test.ts | 203 + .../__tests__/flow-runner/run-step.test.ts | 4321 + .../create-workflow-runner.test.ts.snap | 17 + .../__snapshots__/run-test-file.test.ts.snap | 3 + .../runner/create-workflow-runner.test.ts | 469 + .../runner/resolve-workflow-context.test.ts | 587 + .../flow-runner/runner/run-test-file.test.ts | 754 + .../flow-runner/schema/schema-checker.test.ts | 725 + .../check-success-criteria.test.ts | 1116 + .../validate-success-criteria.test.ts | 139 + .../validate-x-security-parameters.test.ts | 75 + .../logger-output/display-checks.test.ts | 75 + .../__tests__/logger-output/helpers.test.ts | 157 + .../logger-output/mask-secrets.test.ts | 151 + .../runtime-expressions/evaluate.test.ts | 710 + .../runtime-expressions/lint.test.ts | 240 + .../replace-json-pointers.test.ts | 187 + .../__tests__/timeout-timer/timer.test.ts | 26 + .../cleanup-test-description.ts | 30 + .../generate-arazzo-description.ts | 61 + .../generate-example-value.ts | 16 + .../generate-inputs-arazzo-components.ts | 53 + .../generate-test-data-from-json-schema.ts | 13 + .../generate-workflow-security-inputs.ts | 17 + .../generate-workflow-security-parameters.ts | 52 + .../generate-workflows-from-description.ts | 132 + .../arazzo-description-generator/index.ts | 8 + .../respect-core/src/modules/checks/checks.ts | 16 + .../respect-core/src/modules/checks/index.ts | 2 + .../src/modules/checks/severity.ts | 40 + .../context-parser/get-security-parameters.ts | 97 + .../context-parser/get-value-from-context.ts | 523 + .../handle-request-body-replacements.ts | 42 + .../src/modules/context-parser/index.ts | 7 + .../context-parser/parse-parameters.ts | 28 + .../context-parser/parse-request-body.ts | 136 + .../resolve-reusable-component.ts | 8 + .../resolve-reusable-object-reference.ts | 45 + .../resolve-workflow-reference.ts | 53 + .../description-parser/bundle-openapi.ts | 25 + .../extract-first-example.ts | 10 + .../description-parser/get-operation-by-id.ts | 59 + .../get-operation-by-path.ts | 67 + .../get-operation-from-description.ts | 46 + .../get-request-body-schema.ts | 14 + .../get-request-data-from-openapi.ts | 93 + .../description-parser/get-response-schema.ts | 15 + .../src/modules/description-parser/index.ts | 8 + .../respect-core/src/modules/faker.ts | 90 + .../call-api-and-analyze-results.ts | 147 + .../context/create-runtime-expression-ctx.ts | 64 + .../context/create-test-context.ts | 134 + .../src/modules/flow-runner/context/index.ts | 4 + .../flow-runner/context/set-public-steps.ts | 11 + .../context/set-public-workflows.ts | 56 + .../flow-runner/error-message-matcher.ts | 11 + .../src/modules/flow-runner/get-server-url.ts | 147 + .../get-test-description-from-file.ts | 103 + .../flow-runner/get-workflows-to-run.ts | 76 + .../src/modules/flow-runner/index.ts | 14 + .../flow-runner/inputs/format-cli-inputs.ts | 55 + .../src/modules/flow-runner/inputs/index.ts | 2 + .../inputs/map-input-values-to-schema.ts | 34 + .../src/modules/flow-runner/outputs/index.ts | 1 + .../flow-runner/outputs/print-message.ts | 14 + .../modules/flow-runner/prepare-request.ts | 294 + .../flow-runner/resolve-running-workflows.ts | 25 + .../flow-runner/resolve-security-scheme.ts | 34 + .../resolve-x-security-parameters.ts | 69 + .../src/modules/flow-runner/run-step.ts | 473 + .../src/modules/flow-runner/runner.ts | 427 + .../src/modules/flow-runner/schema/index.ts | 1 + .../flow-runner/schema/schema-checker.ts | 230 + .../check-success-criteria.ts | 117 + .../evaluate-jsonpath-condition.ts | 56 + .../flow-runner/success-criteria/index.ts | 2 + .../validate-success-criteria.ts | 78 + .../validate-x-security-parameters.ts | 37 + .../logger-output/calculate-tests-passed.ts | 90 + .../modules/logger-output/display-checks.ts | 163 + .../modules/logger-output/display-errors.ts | 72 + .../modules/logger-output/display-summary.ts | 71 + .../src/modules/logger-output/helpers.ts | 135 + .../src/modules/logger-output/index.ts | 6 + .../src/modules/logger-output/mask-secrets.ts | 134 + .../src/modules/logger-output/verbose-logs.ts | 45 + .../runtime-expressions/abnf-parser.pegjs | 154 + .../modules/runtime-expressions/evaluate.ts | 281 + .../src/modules/runtime-expressions/index.ts | 5 + .../src/modules/runtime-expressions/lint.ts | 9 + .../replace-json-pointers.ts | 66 + .../src/modules/timeout-timer/timer.ts | 25 + .../packages/respect-core/src/run.ts | 110 + .../packages/respect-core/src/types.ts | 359 + .../__snapshots__/ajv-errors.test.ts.snap | 38 + .../src/utils/__tests__/ajv-errors.test.ts | 59 + .../src/utils/__tests__/api-fetcher.test.ts | 177 + .../check-circular-refs-in-schema.test.ts | 31 + .../src/utils/__tests__/clean-colors.test.ts | 25 + .../src/utils/__tests__/deep-copy.test.ts | 38 + .../generate-digest-auth-header.test.ts | 66 + .../parse-www-authenticate-header.test.ts | 26 + .../src/utils/__tests__/file.test.ts | 39 + .../utils/__tests__/get-nested-value.test.ts | 47 + .../__tests__/is-binary-content-type.test.ts | 39 + .../src/utils/__tests__/is-empty.test.ts | 46 + .../src/utils/__tests__/is-json.test.ts | 11 + .../src/utils/__tests__/sort.test.ts | 13 + .../src/utils/__tests__/time.test.ts | 19 + .../src/utils/__tests__/url-encoding.test.ts | 33 + .../src/utils/__tests__/url.test.ts | 19 + .../respect-core/src/utils/ajv-errors.ts | 26 + .../respect-core/src/utils/api-fetcher.ts | 497 + .../src/utils/binary-content-type-checker.ts | 27 + .../utils/check-circular-refs-in-schema.ts | 9 + .../respect-core/src/utils/clean-colors.ts | 4 + .../respect-core/src/utils/deep-copy.ts | 45 + .../packages/respect-core/src/utils/delay.ts | 4 + .../generate-digest-auth-header.ts | 137 + .../parse-www-authenticate-header.ts | 28 + .../packages/respect-core/src/utils/file.ts | 3 + .../src/utils/get-nested-value.ts | 11 + .../respect-core/src/utils/is-empty.ts | 21 + .../respect-core/src/utils/is-json.ts | 8 + .../packages/respect-core/src/utils/sort.ts | 28 + .../packages/respect-core/src/utils/time.ts | 8 + .../respect-core/src/utils/url-encoding.ts | 41 + .../packages/respect-core/src/utils/url.ts | 5 + .../packages/respect-core/tsconfig.json | 11 + .../plugins/oxlint-redocly-plugin.js | 66 + .../resources/.redocly.lint-ignore.yaml | 6 + @skills/redocly-cli/resources/async.yaml | 609 + @skills/redocly-cli/resources/asyncapi3.yaml | 31 + .../resources/cafe-split/cafe.yaml | 74 + .../components/parameters/After.yaml | 6 + .../components/parameters/Before.yaml | 7 + .../components/parameters/Filter.yaml | 21 + .../components/parameters/Limit.yaml | 12 + .../components/parameters/MenuItemId.yaml | 7 + .../components/parameters/OrderId.yaml | 8 + .../components/parameters/PhotoSize.yaml | 11 + .../components/parameters/Search.yaml | 13 + .../components/parameters/Sort.yaml | 8 + .../components/responses/BadRequest.yaml | 5 + .../components/responses/Conflict.yaml | 5 + .../components/responses/Forbidden.yaml | 5 + .../responses/InternalServerError.yaml | 5 + .../components/responses/NotFound.yaml | 5 + .../components/responses/Unauthorized.yaml | 5 + .../components/schemas/Beverage.yaml | 19 + .../components/schemas/Dessert.yaml | 15 + .../cafe-split/components/schemas/Error.yaml | 32 + .../components/schemas/MenuBaseItem.yaml | 55 + .../components/schemas/MenuItem.yaml | 10 + .../components/schemas/MenuItemList.yaml | 16 + .../components/schemas/OAuth2Client.yaml | 59 + .../cafe-split/components/schemas/Order.yaml | 72 + .../components/schemas/OrderItem.yaml | 27 + .../components/schemas/OrderList.yaml | 16 + .../components/schemas/OrderNotification.yaml | 15 + .../components/schemas/OrderStatus.yaml | 7 + .../cafe-split/components/schemas/Page.yaml | 41 + .../schemas/RegisterClientObject.yaml | 32 + .../components/schemas/RevenueStatistics.yaml | 51 + .../paths/menu-item-images_{menuItemId}.yaml | 27 + .../resources/cafe-split/paths/menu.yaml | 87 + .../cafe-split/paths/menu_{menuItemId}.yaml | 24 + .../cafe-split/paths/oauth2_register.yaml | 57 + .../cafe-split/paths/order-items.yaml | 34 + .../resources/cafe-split/paths/orders.yaml | 87 + .../cafe-split/paths/orders_{orderId}.yaml | 126 + .../resources/cafe-split/paths/revenue.yaml | 48 + .../webhooks/order-notification.yaml | 20 + @skills/redocly-cli/resources/cafe.yaml | 1261 + @skills/redocly-cli/resources/description.md | 3 + @skills/redocly-cli/resources/local-plugin.js | 58 + .../resources/museum-api.arazzo.yaml | 122 + .../resources/museum-tickets.arazzo.yaml | 39 + @skills/redocly-cli/resources/museum.yaml | 752 + @skills/redocly-cli/resources/overlay.yaml | 13 + @skills/redocly-cli/resources/pets.yaml | 1205 + .../resources/petstore-with-errors.yaml | 153 + @skills/redocly-cli/resources/redocly.yaml | 16 + .../scripts/add-cli-dependency-changesets.js | 39 + @skills/redocly-cli/scripts/local-pack.sh | 30 + @skills/redocly-cli/scripts/post-changeset.js | 14 + .../redocly-cli/scripts/release-publish.mjs | 44 + .../scripts/write-release-message.js | 21 + .../build-docs-with-config-option/index.hbs | 23 + .../nested/message-schema.yaml | 4 + .../nested/openapi.yaml | 19 + .../nested/redocly.yaml | 4 + .../snapshot.txt | 318 + .../config-with-alias.yaml | 5 + .../config-with-apis-and-root-option.yaml | 6 + .../config.yaml | 2 + .../openapi.yaml | 16 + .../snapshot.txt | 311 + .../tests/e2e/build-docs/build-docs.test.ts | 148 + .../e2e/build-docs/redoc-sri/openapi.yaml | 27 + .../build-docs/redoc-sri/redoc-sri.test.ts | 42 + .../build-docs/simple-build-docs/pets.yaml | 1 + .../build-docs/simple-build-docs/snapshot.txt | 4 + .../async3-internal-ref-chains/asyncapi.yaml | 49 + .../async3-internal-ref-chains/redocly.yaml | 3 + .../async3-internal-ref-chains/schemas.yaml | 12 + .../async3-internal-ref-chains/snapshot.txt | 63 + .../tests/e2e/bundle/async3/UserSignedUp.yaml | 11 + .../tests/e2e/bundle/async3/redocly.yaml | 3 + .../tests/e2e/bundle/async3/simple.yml | 22 + .../tests/e2e/bundle/async3/snapshot.txt | 55 + .../e2e/bundle/bundle-anchor/redocly.yaml | 7 + .../e2e/bundle/bundle-anchor/snapshot.txt | 29 + .../tests/e2e/bundle/bundle-anchor/test.yaml | 25 + .../museum.yaml | 32 + .../parameter.yaml | 3 + .../request-body.yaml | 5 + .../snapshot.txt | 35 + .../redocly.yaml | 6 + .../snapshot.txt | 37 + .../snapshot_2.txt | 38 + .../bundle-description-dereferenced/test.yaml | 34 + .../bundle-description-long/redocly.yaml | 6 + .../bundle-description-long/snapshot.txt | 19 + .../bundle-description-long/snapshot_2.txt | 19 + .../bundle/bundle-description-long/test.yaml | 16 + .../openapi.yaml | 28 + .../redocly.yaml | 6 + .../snapshot.txt | 31 + .../bundle-external-value/external-value.json | 4 + .../bundle/bundle-external-value/redocly.yaml | 8 + .../bundle/bundle-external-value/snapshot.txt | 56 + .../bundle-external-value/test-success.yaml | 33 + .../test-wrong-examples.yaml | 28 + .../redocly.yaml | 7 + .../snapshot.txt | 40 + .../test.yaml | 25 + .../bundle-oas3_2/components/schemas/Foo.yaml | 9 + .../components/schemas/Used.yaml | 7 + .../e2e/bundle/bundle-oas3_2/openapi.yaml | 6 + .../e2e/bundle/bundle-oas3_2/paths/_.yaml | 7 + .../e2e/bundle/bundle-oas3_2/redocly.yaml | 3 + .../e2e/bundle/bundle-oas3_2/snapshot.txt | 35 + .../keep-unused-components-snapshot.txt | 27 + .../oas2-without-option/openapi.yaml | 37 + .../oas2-without-option/redocly.yaml | 5 + .../oas2/openapi.yaml | 37 + .../oas2/redocly.yaml | 6 + .../remove-unused-components-snapshot.txt | 24 + .../keep-unused-components-snapshot.txt | 42 + .../oas3-turn-off-with-flag/openapi.yaml | 41 + .../oas3-turn-off-with-flag/redocly.yaml | 5 + .../keep-unused-components-snapshot.txt | 84 + .../oas3-with-decorator-off/openapi.yaml | 41 + .../oas3-with-decorator-off/redocly.yaml | 10 + .../keep-unused-components-snapshot.txt | 29 + .../oas3-without-option/openapi.yaml | 41 + .../oas3-without-option/redocly.yaml | 5 + .../oas3/openapi.yaml | 41 + .../oas3/redocly.yaml | 6 + .../remove-unused-components-snapshot.txt | 26 + .../oas2-without-option/openapi.yaml | 50 + .../oas2-without-option/redocly.yaml | 6 + .../oas2-without-option/ref.yaml | 1 + ...hout-remove-unused-components-snapshot.txt | 39 + .../oas2/openapi.yaml | 50 + .../oas2/redocly.yaml | 7 + .../oas2/ref.yaml | 1 + .../remove-unused-components-snapshot.txt | 16 + .../openapi.yaml | 21 + .../parameters.yaml | 6 + .../redocly.yaml | 6 + .../schemas.yaml | 4 + .../snapshot.txt | 32 + .../openapi.yaml | 21 + .../parameters.yaml | 6 + .../redocly.yaml | 6 + .../schemas.yaml | 2 + .../snapshot.txt | 32 + .../oas3-parameter-ref-to-schema/openapi.yaml | 14 + .../parameters.yaml | 6 + .../oas3-parameter-ref-to-schema/redocly.yaml | 6 + .../oas3-parameter-ref-to-schema/schemas.yaml | 2 + .../oas3-parameter-ref-to-schema/snapshot.txt | 28 + .../oas3-recursive-ref/openapi.yaml | 24 + .../oas3-recursive-ref/redocly.yaml | 6 + .../oas3-recursive-ref/snapshot.txt | 16 + .../oas3-without-option/openapi.yaml | 74 + .../oas3-without-option/redocly.yaml | 6 + .../oas3-without-option/ref.yaml | 1 + ...hout-remove-unused-components-snapshot.txt | 54 + .../oas3/openapi.yaml | 74 + .../oas3/redocly.yaml | 7 + .../oas3/ref.yaml | 1 + .../remove-unused-components-snapshot.txt | 19 + .../oas2/openapi.yaml | 50 + .../oas2/redocly.yaml | 6 + .../oas2/ref.yaml | 1 + .../remove-unused-components-snapshot.txt | 16 + .../oas3/openapi.yaml | 74 + .../oas3/redocly.yaml | 6 + .../oas3/ref.yaml | 1 + .../remove-unused-components-snapshot.txt | 19 + .../openapi.yaml | 23 + .../redocly.yaml | 3 + .../schemas/a/User.yaml | 4 + .../schemas/b/User.yaml | 4 + .../snapshot-off.txt | 40 + .../snapshot.txt | 18 + .../tests/e2e/bundle/bundle.test.ts | 237 + .../e2e/bundle/discriminator-mapping/bar.yaml | 6 + .../e2e/bundle/discriminator-mapping/foo.yaml | 6 + .../bundle/discriminator-mapping/main.yaml | 19 + .../bundle/discriminator-mapping/redocly.yaml | 3 + .../bundle/discriminator-mapping/snapshot.txt | 38 + .../discriminator-mapping/snapshot_2.txt | 40 + .../info-description-override-error/main.yaml | 24 + .../redocly.yaml | 7 + .../snapshot.txt | 18 + .../info-description-override/main.yaml | 24 + .../info-description-override/redocly.yaml | 7 + .../info-description-override/snapshot.txt | 32 + .../bundle/info-description-override/test.md | 5 + .../tests/e2e/bundle/info-override/main.yaml | 24 + .../e2e/bundle/info-override/redocly.yaml | 8 + .../e2e/bundle/info-override/snapshot.txt | 28 + .../examples/request.yaml | 1 + .../examples/response.yaml | 2 + .../media-type-examples-override/openapi.yaml | 28 + .../media-type-examples-override/redocly.yaml | 13 + .../media-type-examples-override/snapshot.txt | 36 + .../bundle/no-duplicated-components/Test.yaml | 1 + .../no-duplicated-components/openapi.yaml | 8 + .../no-duplicated-components/paths/path.yaml | 6 + .../no-duplicated-components/redocly.yaml | 3 + .../no-duplicated-components/snapshot.txt | 16 + .../openapi.yaml | 9 + .../parameters/PetId.yaml | 4 + .../parameters/_index.yaml | 2 + .../paths/Pet.yaml | 9 + .../redocly.yaml | 3 + .../schemas/Pet.yaml | 1 + .../schemas/_index.yaml | 2 + .../snapshot.txt | 25 + .../components/schemas.yaml | 3 + .../folder/myObject.v2.schema.yaml | 1 + .../openapi.yaml | 3 + .../redocly.yaml | 3 + .../snapshot.txt | 8 + .../oas3_1-pattern-porperties/object.yaml | 1 + .../oas3_1-pattern-porperties/redocly.yaml | 3 + .../oas3_1-pattern-porperties/snapshot.txt | 24 + .../oas3_1-pattern-porperties/test.yaml | 17 + .../openapi.yaml | 42 + .../redocly.yaml | 8 + .../snapshot.txt | 18 + .../create-user-operation-description.md | 1 + .../openapi.yaml | 42 + .../redocly.yaml | 9 + .../snapshot.txt | 48 + .../update-pet-operation-description.md | 1 + .../e2e/bundle/primitive-types/openapi.yaml | 41 + .../e2e/bundle/primitive-types/redocly.yaml | 3 + .../e2e/bundle/primitive-types/snapshot.txt | 43 + .../reference-ending-in-hash/openapi.yaml | 10 + .../reference-ending-in-hash/redocly.yaml | 3 + .../reference-ending-in-hash/schemas/Pet.json | 1 + .../reference-ending-in-hash/snapshot.txt | 16 + .../e2e/bundle/remove-x-internal/main.yaml | 25 + .../e2e/bundle/remove-x-internal/redocly.yaml | 5 + .../remove-x-internal/schemas/candy-cane.yaml | 7 + .../remove-x-internal/schemas/cranberry.yaml | 5 + .../remove-x-internal/schemas/popcorn.yaml | 5 + .../e2e/bundle/remove-x-internal/snapshot.txt | 40 + .../external.yaml | 4 + .../openapi.yaml | 11 + .../resolve-refs-from-x-attributes/plugin.cjs | 13 + .../redocly.yaml | 8 + .../resolve-x.decorator.cjs | 15 + .../snapshot.txt | 20 + .../self-file-ref-normalization/openapi.yaml | 24 + .../self-file-ref-normalization/redocly.yaml | 3 + .../self-file-ref-normalization/snapshot.txt | 27 + .../sibling-refs-asyncapi/asyncapi.yaml | 18 + .../sibling-refs-asyncapi/description.md | 1 + .../bundle/sibling-refs-asyncapi/redocly.yaml | 3 + .../bundle/sibling-refs-asyncapi/snapshot.txt | 21 + .../bundle/sibling-refs-asyncapi/summary.md | 1 + .../bundle/sibling-refs-oas/description.md | 1 + .../e2e/bundle/sibling-refs-oas/openapi.yaml | 28 + .../e2e/bundle/sibling-refs-oas/redocly.yaml | 3 + .../e2e/bundle/sibling-refs-oas/snapshot.txt | 31 + .../e2e/bundle/sibling-refs-oas/summary.md | 1 + .../tag-description-override-error/main.yaml | 38 + .../redocly.yaml | 8 + .../snapshot.txt | 20 + .../bundle/tag-description-override/main.yaml | 38 + .../pet-tag-description.md | 1 + .../tag-description-override/redocly.yaml | 9 + .../tag-description-override/snapshot.txt | 44 + .../store-tag-description.md | 1 + .../e2e/check-config/check-config.test.ts | 67 + .../openapi.yaml | 7 + .../plugins/type-extention.cjs | 29 + .../redocly.yaml | 13 + .../snapshot.txt | 2 + .../empty-config-null/redocly.yaml | 1 + .../empty-config-null/snapshot.txt | 15 + .../redocly.yaml | 6 + .../snapshot.txt | 17 + .../redocly.yaml | 6 + .../snapshot.txt | 15 + .../invalid-config--no-option/redocly.yaml | 6 + .../invalid-config--no-option/snapshot.txt | 17 + .../nested/redocly.yaml | 3 + .../snapshot.txt | 2 + .../check-config/valid-config/redocly.yaml | 3 + .../check-config/valid-config/snapshot.txt | 2 + .../openapi.yaml | 7 + .../plugins/type-extention.cjs | 27 + .../redocly.yaml | 13 + .../snapshot.txt | 19 + .../__snapshots__/format-apache-json.txt | 22 + .../__snapshots__/format-auto-ndjson.txt | 28 + .../e2e/drift/__snapshots__/format-har.txt | 22 + .../e2e/drift/__snapshots__/format-kong.txt | 22 + .../drift/__snapshots__/format-nginx-json.txt | 22 + .../e2e/drift/__snapshots__/output-csv.txt | 5 + .../e2e/drift/__snapshots__/output-json.txt | 53 + .../e2e/drift/__snapshots__/output-sarif.txt | 74 + .../drift/__snapshots__/validate-clean.txt | 13 + .../validate-colliding-specs.txt | 14 + .../__snapshots__/validate-composition.txt | 84 + .../__snapshots__/validate-host-mismatch.txt | 28 + .../__snapshots__/validate-min-severity.txt | 22 + .../drift/__snapshots__/validate-readonly.txt | 13 + .../__snapshots__/validate-recursive.txt | 31 + .../validate-schema-mismatch.txt | 31 + .../drift/__snapshots__/validate-security.txt | 26 + .../drift/__snapshots__/validate-server.txt | 22 + .../__snapshots__/validate-undocumented.txt | 28 + .../redocly-cli/tests/e2e/drift/drift.test.ts | 358 + .../e2e/drift/fixtures/apache-access.ndjson | 2 + .../drift/fixtures/colliding-apis/legacy.yaml | 29 + .../drift/fixtures/colliding-apis/main.yaml | 38 + .../drift/fixtures/composition-openapi.yaml | 140 + .../e2e/drift/fixtures/nginx-access.ndjson | 2 + .../tests/e2e/drift/fixtures/openapi.yaml | 55 + .../e2e/drift/fixtures/readonly-openapi.yaml | 45 + .../e2e/drift/fixtures/recursive-openapi.yaml | 30 + .../e2e/drift/fixtures/secured-openapi.yaml | 20 + .../drift/fixtures/traffic-composition.ndjson | 6 + .../fixtures/traffic-host-mismatch.ndjson | 2 + .../e2e/drift/fixtures/traffic-matched.ndjson | 2 + .../fixtures/traffic-missing-auth.ndjson | 1 + .../fixtures/traffic-mixed-severity.ndjson | 2 + .../drift/fixtures/traffic-prefixed.ndjson | 5 + .../drift/fixtures/traffic-readonly.ndjson | 1 + .../drift/fixtures/traffic-recursive.ndjson | 2 + .../fixtures/traffic-schema-mismatch.ndjson | 1 + .../fixtures/traffic-undocumented.ndjson | 2 + .../tests/e2e/drift/fixtures/traffic.har | 32 + .../e2e/drift/fixtures/traffic.kong.json | 24 + .../constructor-property/openapi.yaml | 37 + .../constructor-property/snapshot.txt | 8 + .../__snapshots__/ai-refined-polymorphic.txt | 110 + .../__snapshots__/ai-refined.txt | 149 + .../generate-spec/__snapshots__/infer-har.txt | 59 + .../__snapshots__/infer-id-templates.txt | 138 + .../__snapshots__/infer-ndjson.txt | 126 + .../__snapshots__/infer-polymorphic.txt | 92 + .../__snapshots__/infer-server-scoped.txt | 50 + .../e2e/generate-spec/fixtures/bin-bad/claude | 4 + .../generate-spec/fixtures/bin-fail/claude | 5 + .../fixtures/bin-ok-polymorphic/claude | 14 + .../fragments/get-payments-paymentId.yaml | 18 + .../fragments/post-payments.yaml | 77 + .../e2e/generate-spec/fixtures/bin-ok/claude | 17 + .../fixtures/bin-ok/cursor-agent | 3 + .../bin-ok/fragments/delete-users-userId.yaml | 15 + .../bin-ok/fragments/get-users-userId.yaml | 19 + .../fixtures/bin-ok/fragments/get-users.yaml | 49 + .../bin-ok/fragments/post-sessions.yaml | 32 + .../fixtures/bin-ok/fragments/post-users.yaml | 18 + .../generate-spec/fixtures/bin-partial/claude | 5 + .../fixtures/bin-partial/partial.yaml | 12 + .../generate-spec/fixtures/traffic-ids.ndjson | 6 + .../fixtures/traffic-polymorphic.ndjson | 6 + .../fixtures/traffic-servers.ndjson | 4 + .../e2e/generate-spec/fixtures/traffic.har | 45 + .../e2e/generate-spec/fixtures/traffic.ndjson | 6 + .../e2e/generate-spec/generate-spec.test.ts | 207 + @skills/redocly-cli/tests/e2e/helpers.ts | 56 + .../fails-if-component-conflicts/bar.yaml | 27 + .../fails-if-component-conflicts/foo.yaml | 35 + .../fails-if-component-conflicts/snapshot.txt | 4 + .../join/fails-if-no-info-section/bar.yaml | 18 + .../join/fails-if-no-info-section/foo.yaml | 19 + .../fails-if-no-info-section/snapshot.txt | 3 + .../join/fails-if-tags-duplication/bar.yaml | 21 + .../join/fails-if-tags-duplication/foo.yaml | 29 + .../fails-if-tags-duplication/snapshot.txt | 8 + .../tests/e2e/join/ignore-decorators/bar.yaml | 23 + .../tests/e2e/join/ignore-decorators/foo.yaml | 30 + .../e2e/join/ignore-decorators/redocly.yaml | 3 + .../e2e/join/ignore-decorators/snapshot.txt | 66 + .../redocly-cli/tests/e2e/join/join.test.ts | 108 + .../e2e/join/json-and-yaml-input/bar.yaml | 23 + .../e2e/join/json-and-yaml-input/foo.json | 49 + .../json-output.snapshot.txt | 107 + .../yaml-output.snapshot.txt | 66 + .../multi-references-to-one-file/bar.yaml | 16 + .../multi-references-to-one-file/foo.yaml | 25 + .../nested/FooObject.yaml | 6 + .../nested/Response.yaml | 14 + .../multi-references-to-one-file/openapi.yaml | 84 + .../multi-references-to-one-file/snapshot.txt | 89 + .../join/multiple-tags-in-same-files/bar.yaml | 35 + .../join/multiple-tags-in-same-files/foo.yaml | 38 + .../multiple-tags-in-same-files/snapshot.txt | 81 + .../tests/e2e/join/oas3.2/bar.yaml | 40 + .../tests/e2e/join/oas3.2/foo.yaml | 105 + .../tests/e2e/join/oas3.2/snapshot.txt | 159 + .../prefix-components-with-info-prop/bar.yaml | 36 + .../prefix-components-with-info-prop/foo.yaml | 42 + .../snapshot.txt | 87 + .../join/prefix-tags-with-filename/bar.yaml | 21 + .../join/prefix-tags-with-filename/foo.yaml | 29 + .../prefix-tags-with-filename/snapshot.txt | 62 + .../join/prefix-tags-with-info-prop/bar.yaml | 21 + .../join/prefix-tags-with-info-prop/foo.yaml | 29 + .../prefix-tags-with-info-prop/snapshot.txt | 62 + .../join/reference-in-description/bar.yaml | 18 + .../reference-in-description/description.md | 1 + .../join/reference-in-description/foo.yaml | 27 + .../reference-in-description/snapshot.txt | 55 + .../join/references-in-parameters/bar.yaml | 35 + .../join/references-in-parameters/foo.yaml | 61 + .../references-in-parameters/snapshot.txt | 94 + .../join/root-security-in-both-specs/bar.yaml | 22 + .../join/root-security-in-both-specs/foo.yaml | 25 + .../root-security-in-both-specs/snapshot.txt | 62 + .../join/root-security-without-paths/bar.yaml | 14 + .../join/root-security-without-paths/foo.yaml | 16 + .../root-security-without-paths/snapshot.txt | 37 + .../three-files-one-without-servers/bar.yaml | 18 + .../three-files-one-without-servers/baz.yaml | 16 + .../three-files-one-without-servers/foo.yaml | 26 + .../snapshot.txt | 71 + .../join/two-files-with-no-errors/bar.yaml | 18 + .../join/two-files-with-no-errors/foo.yaml | 26 + .../two-files-with-no-errors/snapshot.txt | 54 + .../tests/e2e/join/with-metadata/pet.yaml | 46 + .../tests/e2e/join/with-metadata/snapshot.txt | 85 + .../tests/e2e/join/with-metadata/test.yaml | 40 + .../e2e/join/without-x-tag-groups/bar.yaml | 21 + .../e2e/join/without-x-tag-groups/foo.yaml | 29 + .../join/without-x-tag-groups/snapshot.txt | 52 + .../join/yaml-input-and-json-output/bar.yaml | 23 + .../join/yaml-input-and-json-output/foo.yaml | 30 + .../yaml-input-and-json-output/snapshot.txt | 107 + .../__fixtures__/invalid-openapi.yaml | 11 + .../__fixtures__/valid-openapi.yaml | 21 + .../e2e/lint-config/config-structure/env.yaml | 3 + .../lint-config/config-structure/redocly.yaml | 249 + .../lint-config/config-structure/snapshot.txt | 648 + .../config-with-refs-extended/apis.yaml | 2 + .../config-with-refs-extended/redocly.yaml | 15 + .../config-with-refs-extended/rules.yaml | 2 + .../config-with-refs-extended/seo.yaml | 1 + .../config-with-refs-extended/snapshot.txt | 83 + .../theme-openapi.yaml | 3 + .../config-with-refs-extended/v1.yaml | 1 + .../lint-config/config-with-refs/redocly.yaml | 10 + .../lint-config/config-with-refs/rules.yaml | 2 + .../lint-config/config-with-refs/snapshot.txt | 45 + .../config-with-refs/theme-openapi.yaml | 4 + .../redocly.yaml | 2 + .../snapshot.txt | 16 + .../redocly.yaml | 2 + .../snapshot.txt | 8 + .../redocly.yaml | 2 + .../snapshot.txt | 21 + .../invalid-config--no-option/redocly.yaml | 6 + .../invalid-config--no-option/snapshot.txt | 22 + .../redocly.yaml | 13 + .../snapshot.txt | 21 + .../invalid-config-format-json/redocly.yaml | 4 + .../invalid-config-format-json/snapshot.txt | 14 + .../invalid-custom-rule-config/redocly.yaml | 3 + .../invalid-custom-rule-config/snapshot.txt | 22 + .../config-with-error.snapshot.txt | 17 + .../config-with-warn.snapshot.txt | 98 + .../redocly.yaml | 5 + .../invalid-lint-config-severity/redocly.yaml | 10 + .../invalid-lint-config-severity/snapshot.txt | 27 + .../tests/e2e/lint-config/lint-config.test.ts | 68 + .../cafe-workflows.yaml | 166 + .../arazzo-1-1-valid-description/snapshot.txt | 8 + .../museum.yaml | 17 + .../snapshot.txt | 56 + .../museum.yaml | 40 + .../plugins/type-extention.cjs | 28 + .../redocly.yaml | 5 + .../snapshot.txt | 22 + .../arazzo-valid-test-description/museum.yaml | 37 + .../snapshot.txt | 8 + .../openapi.yaml | 51 + .../plugin.mjs | 30 + .../redocly.yaml | 13 + .../snapshot.txt | 43 + .../assertions-camel-case-twice/openapi.yaml | 39 + .../assertions-camel-case-twice/redocly.yaml | 12 + .../assertions-camel-case-twice/snapshot.txt | 35 + .../openapi.yaml | 50 + .../redocly.yaml | 29 + .../snapshot.txt | 63 + .../openapi.yaml | 37 + .../redocly.yaml | 21 + .../snapshot.txt | 49 + .../openapi.yaml | 37 + .../redocly.yaml | 21 + .../snapshot.txt | 49 + .../openapi.yaml | 37 + .../redocly.yaml | 21 + .../snapshot.txt | 49 + .../assertions-contains-error/openapi.yaml | 12 + .../assertions-contains-error/redocly.yaml | 15 + .../assertions-contains-error/snapshot.txt | 23 + .../openapi.yaml | 49 + .../plugin.mjs | 31 + .../redocly.yaml | 61 + .../snapshot.txt | 81 + .../assertions-defined-error/openapi.yaml | 33 + .../assertions-defined-error/redocly.yaml | 20 + .../assertions-defined-error/snapshot.txt | 38 + .../lint/assertions-enum-error/openapi.yaml | 29 + .../lint/assertions-enum-error/redocly.yaml | 17 + .../lint/assertions-enum-error/snapshot.txt | 25 + .../openapi.yaml | 40 + .../redocly.yaml | 12 + .../snapshot.txt | 21 + .../e2e/lint/assertions-error/openapi.yaml | 82 + .../e2e/lint/assertions-error/redocly.yaml | 213 + .../e2e/lint/assertions-error/snapshot.txt | 477 + .../lint/assertions-list-types/openapi.yaml | 56 + .../lint/assertions-list-types/redocly.yaml | 23 + .../lint/assertions-list-types/snapshot.txt | 60 + .../lint/assertions-map-types/openapi.yaml | 48 + .../lint/assertions-map-types/redocly.yaml | 35 + .../lint/assertions-map-types/snapshot.txt | 81 + .../assertions-match-parent-keys/openapi.yaml | 47 + .../assertions-match-parent-keys/redocly.yaml | 20 + .../assertions-match-parent-keys/snapshot.txt | 53 + .../openapi.yaml | 29 + .../redocly.yaml | 12 + .../snapshot.txt | 27 + .../openapi.yaml | 29 + .../redocly.yaml | 12 + .../snapshot.txt | 21 + .../openapi.yaml | 35 + .../redocly.yaml | 83 + .../snapshot.txt | 193 + .../openapi.yaml | 29 + .../redocly.yaml | 12 + .../snapshot.txt | 27 + .../openapi.yaml | 29 + .../redocly.yaml | 12 + .../snapshot.txt | 21 + .../openapi.yaml | 29 + .../redocly.yaml | 19 + .../snapshot.txt | 21 + .../openapi.yaml | 29 + .../redocly.yaml | 19 + .../snapshot.txt | 21 + .../assertions-non-empty-error/openapi.yaml | 29 + .../assertions-non-empty-error/redocly.yaml | 12 + .../assertions-non-empty-error/snapshot.txt | 21 + .../assertions-non-empty-off/openapi.yaml | 29 + .../assertions-non-empty-off/redocly.yaml | 13 + .../assertions-non-empty-off/snapshot.txt | 6 + .../assertions-non-empty-warn/openapi.yaml | 29 + .../assertions-non-empty-warn/redocly.yaml | 13 + .../assertions-non-empty-warn/snapshot.txt | 21 + .../assertions-pattern-error/openapi.yaml | 29 + .../assertions-pattern-error/redocly.yaml | 12 + .../assertions-pattern-error/snapshot.txt | 23 + .../openapi.yaml | 18 + .../redocly.yaml | 19 + .../snapshot.txt | 49 + .../openapi.yaml | 33 + .../redocly.yaml | 11 + .../snapshot.txt | 21 + .../assertions-patternProperties/openapi.yaml | 12 + .../assertions-patternProperties/redocly.yaml | 10 + .../assertions-patternProperties/schema.json | 16 + .../assertions-patternProperties/snapshot.txt | 21 + .../openapi.yaml | 5 + .../redocly.yaml | 12 + .../snapshot.txt | 6 + .../openapi.yaml | 5 + .../redocly.yaml | 11 + .../snapshot.txt | 6 + .../openapi.yaml | 30 + .../redocly.yaml | 16 + .../snapshot.txt | 21 + .../components/paths/Owners.yaml | 27 + .../components/schemas/Error.yaml | 9 + .../openapi.yaml | 67 + .../redocly.yaml | 23 + .../snapshot.txt | 35 + .../components/Vets.yaml | 26 + .../components/paths/Owners.yaml | 27 + .../components/schemas/Error.yaml | 9 + .../assertions-ref-pattern-error/openapi.yaml | 67 + .../assertions-ref-pattern-error/redocly.yaml | 23 + .../assertions-ref-pattern-error/snapshot.txt | 77 + .../components/paths/Owners.yaml | 27 + .../components/schemas/Error.yaml | 9 + .../openapi.yaml | 67 + .../redocly.yaml | 23 + .../snapshot.txt | 49 + .../assertions-require-any-error/openapi.yaml | 27 + .../assertions-require-any-error/redocly.yaml | 14 + .../assertions-require-any-error/snapshot.txt | 21 + .../openapi.yaml | 4 + .../redocly.yaml | 19 + .../snapshot.txt | 37 + .../snapshot_2.txt | 37 + .../assertions-severity-override/openapi.yaml | 4 + .../assertions-severity-override/redocly.yaml | 8 + .../assertions-severity-override/ruleset.yaml | 13 + .../assertions-severity-override/snapshot.txt | 37 + .../snapshot_2.txt | 37 + .../assertions-show-suggestions/openapi.yaml | 29 + .../assertions-show-suggestions/redocly.yaml | 21 + .../assertions-show-suggestions/snapshot.txt | 25 + .../openapi.yaml | 31 + .../redocly.yaml | 19 + .../snapshot.txt | 21 + .../openapi.yaml | 44 + .../redocly.yaml | 28 + .../snapshot.txt | 6 + .../assertions-undefined-error/openapi.yaml | 29 + .../assertions-undefined-error/redocly.yaml | 12 + .../assertions-undefined-error/snapshot.txt | 21 + .../assertions-vendor-extensions/openapi.yaml | 12 + .../assertions-vendor-extensions/redocly.yaml | 36 + .../assertions-vendor-extensions/snapshot.txt | 49 + .../tests/e2e/lint/assertions.test.ts | 25 + .../tests/e2e/lint/assertions/description.md | 1 + .../tests/e2e/lint/assertions/openapi.yaml | 95 + .../tests/e2e/lint/assertions/redocly.yaml | 229 + .../tests/e2e/lint/assertions/snapshot.txt | 6 + .../tests/e2e/lint/async2/anyof.yml | 31 + .../e2e/lint/async2/application-headers.yml | 83 + .../tests/e2e/lint/async2/correlation-id.yml | 144 + .../e2e/lint/async2/gitter-streaming.yml | 167 + .../tests/e2e/lint/async2/mercure.yml | 49 + .../redocly-cli/tests/e2e/lint/async2/not.yml | 24 + .../tests/e2e/lint/async2/oneof.yml | 46 + .../e2e/lint/async2/operation-security.yml | 106 + .../e2e/lint/async2/operation-with-tags.yml | 32 + .../tests/e2e/lint/async2/redocly.yaml | 38 + .../tests/e2e/lint/async2/rpc-client.yml | 68 + .../tests/e2e/lint/async2/rpc-server.yml | 65 + .../tests/e2e/lint/async2/simple.yml | 23 + .../tests/e2e/lint/async2/slack-rtm.yml | 884 + .../tests/e2e/lint/async2/snapshot.txt | 54 + .../e2e/lint/async2/streetlights-kafka.yml | 188 + .../e2e/lint/async2/streetlights-mqtt.yml | 216 + .../streetlights-operation-security.yml | 210 + .../e2e/lint/async2/websocket-gemini.yml | 272 + .../tests/e2e/lint/async3/anyof.yml | 36 + .../e2e/lint/async3/application-headers.yml | 86 + .../tests/e2e/lint/async3/correlation-id.yml | 180 + .../e2e/lint/async3/gitter-streaming.yml | 178 + .../tests/e2e/lint/async3/mercure.yml | 58 + .../redocly-cli/tests/e2e/lint/async3/not.yml | 29 + .../tests/e2e/lint/async3/oneof.yml | 57 + .../e2e/lint/async3/operation-security.yml | 117 + .../tests/e2e/lint/async3/redocly.yaml | 38 + .../tests/e2e/lint/async3/rpc-client.yml | 72 + .../tests/e2e/lint/async3/rpc-server.yml | 69 + .../tests/e2e/lint/async3/simple-3-1.yml | 37 + .../tests/e2e/lint/async3/simple.yml | 31 + .../tests/e2e/lint/async3/slack-rtm.yml | 982 + .../tests/e2e/lint/async3/snapshot.txt | 54 + .../e2e/lint/async3/streetlights-kafka.yml | 199 + .../e2e/lint/async3/streetlights-mqtt.yml | 253 + .../streetlights-operation-security.yml | 240 + .../e2e/lint/async3/websocket-gemini.yml | 301 + .../openapi.yaml | 14 + .../redocly.yaml | 12 + .../snapshot.txt | 39 + .../default-message-override/openapi.yaml | 13 + .../default-message-override/redocly.yaml | 28 + .../default-message-override/snapshot.txt | 110 + .../default-message-override/split/info.yaml | 2 + .../split/openapi.yaml | 6 + .../split/paths/test.yaml | 7 + .../openapi-oas30-draft4.yaml | 79 + .../openapi-oas32-2020.yaml | 99 + .../redocly.yaml | 8 + .../snapshot.txt | 176 + .../tests/e2e/lint/examples.test.ts | 25 + .../e2e/lint/extends-empty-array/openapi.yaml | 18 + .../e2e/lint/extends-empty-array/redocly.yaml | 5 + .../e2e/lint/extends-empty-array/snapshot.txt | 3 + .../redocly.yaml | 17 + .../schema.graphql | 3 + .../snapshot.txt | 22 + .../e2e/lint/graphql-invalid/redocly.yaml | 6 + .../e2e/lint/graphql-invalid/schema.graphql | 10 + .../e2e/lint/graphql-invalid/snapshot.txt | 21 + .../tests/e2e/lint/graphql-valid/redocly.yaml | 6 + .../e2e/lint/graphql-valid/schema.graphql | 18 + .../tests/e2e/lint/graphql-valid/snapshot.txt | 6 + .../info-contact--lint-in-apis/openapi.yaml | 17 + .../info-contact--lint-in-apis/redocly.yaml | 5 + .../info-contact--lint-in-apis/snapshot.txt | 6 + .../openapi.yaml | 19 + .../redocly.yaml | 6 + .../snapshot.txt | 22 + .../tests/e2e/lint/info-contact/openapi.yaml | 17 + .../tests/e2e/lint/info-contact/redocly.yaml | 6 + .../tests/e2e/lint/info-contact/snapshot.txt | 6 + .../openapi.yaml | 13 + .../redocly.yaml | 6 + .../snapshot.txt | 22 + .../e2e/lint/info-license-rule/openapi.yaml | 16 + .../e2e/lint/info-license-rule/redocly.yaml | 6 + .../e2e/lint/info-license-rule/snapshot.txt | 6 + .../openapi.yaml | 15 + .../redocly.yaml | 6 + .../snapshot.txt | 23 + .../info-license-strict-rule/openapi.yaml | 16 + .../info-license-strict-rule/redocly.yaml | 6 + .../info-license-strict-rule/snapshot.txt | 6 + .../redocly-cli/tests/e2e/lint/lint.test.ts | 122 + .../e2e/lint/merge-lint-configs/openapi.yaml | 20 + .../e2e/lint/merge-lint-configs/redocly.yaml | 8 + .../e2e/lint/merge-lint-configs/snapshot.txt | 22 + .../nested-config-2.yaml | 4 + .../nested-config.yaml | 2 + .../nested-extends-two-level/openapi.yaml | 20 + .../nested-extends-two-level/redocly.yaml | 8 + .../nested-extends-two-level/snapshot.txt | 70 + .../lint/nested-extends/nested-config.yaml | 4 + .../e2e/lint/nested-extends/openapi.yaml | 20 + .../e2e/lint/nested-extends/redocly.yaml | 8 + .../e2e/lint/nested-extends/snapshot.txt | 70 + .../lint/no-duplicated-tag-names/openapi.yaml | 33 + .../lint/no-duplicated-tag-names/redocly.yaml | 6 + .../lint/no-duplicated-tag-names/snapshot.txt | 23 + .../lint/no-empty-servers-rule/openapi.yaml | 16 + .../lint/no-empty-servers-rule/redocly.yaml | 6 + .../lint/no-empty-servers-rule/snapshot.txt | 6 + .../no-empty-servers-warning/openapi.yaml | 15 + .../no-empty-servers-warning/redocly.yaml | 6 + .../no-empty-servers-warning/snapshot.txt | 23 + .../openapi.yaml | 45 + .../redocly.yaml | 6 + .../snapshot.txt | 65 + .../no-enum-type-mismatch-error/openapi.yaml | 33 + .../no-enum-type-mismatch-error/redocly.yaml | 6 + .../no-enum-type-mismatch-error/snapshot.txt | 39 + .../lint/no-enum-type-mismatch/openapi.yaml | 29 + .../lint/no-enum-type-mismatch/redocly.yaml | 6 + .../lint/no-enum-type-mismatch/snapshot.txt | 6 + .../no-http-verbs-in-paths-error/openapi.yaml | 66 + .../no-http-verbs-in-paths-error/redocly.yaml | 7 + .../no-http-verbs-in-paths-error/snapshot.txt | 119 + .../openapi.yaml | 66 + .../redocly.yaml | 8 + .../snapshot.txt | 87 + .../openapi.yaml | 48 + .../redocly.yaml | 13 + .../snapshot.txt | 61 + .../openapi.yaml | 40 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 31 + .../redocly.yaml | 6 + .../snapshot.txt | 41 + .../components.yaml | 11 + .../openapi.yaml | 21 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 53 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 150 + .../redocly.yaml | 6 + .../snapshot.txt | 245 + .../openapi.yaml | 62 + .../redocly.yaml | 6 + .../snapshot.txt | 79 + .../openapi.json | 52 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.json | 74 + .../redocly.yaml | 6 + .../snapshot.txt | 48 + .../example.yaml | 1 + .../openapi.yaml | 36 + .../redocly.yaml | 6 + .../snapshot.txt | 22 + .../openapi.yaml | 52 + .../redocly.yaml | 6 + .../snapshot.txt | 43 + .../openapi-oas30-draft4.yaml | 50 + .../openapi-oas32-2020.yaml | 54 + .../redocly.yaml | 8 + .../snapshot.txt | 98 + .../openapi.yaml | 36 + .../redocly.yaml | 6 + .../snapshot.txt | 25 + .../openapi.yaml | 79 + .../redocly.yaml | 6 + .../snapshot.txt | 150 + .../openapi.yaml | 48 + .../redocly.yaml | 6 + .../snapshot.txt | 63 + .../openapi.yaml | 44 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 40 + .../redocly.yaml | 6 + .../snapshot.txt | 61 + .../no-invalid-schema-examples/openapi.yaml | 80 + .../no-invalid-schema-examples/redocly.yaml | 6 + .../no-invalid-schema-examples/snapshot.txt | 6 + .../no-path-trailing-slash-error/openapi.yaml | 13 + .../no-path-trailing-slash-error/redocly.yaml | 6 + .../no-path-trailing-slash-error/snapshot.txt | 23 + .../no-path-trailing-slash-off/openapi.yaml | 17 + .../no-path-trailing-slash-off/redocly.yaml | 7 + .../no-path-trailing-slash-off/snapshot.txt | 6 + .../no-path-trailing-slash-rule/openapi.yaml | 16 + .../no-path-trailing-slash-rule/redocly.yaml | 6 + .../no-path-trailing-slash-rule/snapshot.txt | 6 + .../lint/no-server-example-rule/openapi.yaml | 16 + .../lint/no-server-example-rule/redocly.yaml | 6 + .../lint/no-server-example-rule/snapshot.txt | 6 + .../openapi.yaml | 16 + .../redocly.yaml | 6 + .../snapshot.txt | 23 + .../openapi.yaml | 16 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 23 + .../redocly.yaml | 6 + .../snapshot.txt | 39 + .../openapi.yaml | 23 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 17 + .../redocly.yaml | 6 + .../snapshot.txt | 52 + .../no-unresolved-refs-error/openapi.yaml | 31 + .../no-unresolved-refs-error/redocly.yaml | 6 + .../no-unresolved-refs-error/snapshot.txt | 23 + .../lint/no-unresolved-refs-rule/openapi.yaml | 31 + .../lint/no-unresolved-refs-rule/redocly.yaml | 6 + .../lint/no-unresolved-refs-rule/snapshot.txt | 6 + .../no-unused-components-rule/openapi.yaml | 31 + .../no-unused-components-rule/redocly.yaml | 6 + .../no-unused-components-rule/snapshot.txt | 6 + .../no-unused-components-warning/openapi.yaml | 25 + .../no-unused-components-warning/redocly.yaml | 6 + .../no-unused-components-warning/snapshot.txt | 23 + .../e2e/lint/null-schema-values/openapi.yaml | 15 + .../e2e/lint/null-schema-values/redocly.yaml | 7 + .../e2e/lint/null-schema-values/snapshot.txt | 35 + .../tests/e2e/lint/oas2/openapi.yaml | 209 + .../tests/e2e/lint/oas2/redocly.yaml | 6 + .../tests/e2e/lint/oas2/snapshot.txt | 6 + .../e2e/lint/oas3-no-errors/openapi.yaml | 158 + .../e2e/lint/oas3-no-errors/redocly.yaml | 6 + .../e2e/lint/oas3-no-errors/snapshot.txt | 6 + .../tests/e2e/lint/oas3.1-error/openapi.yaml | 23 + .../tests/e2e/lint/oas3.1-error/redocly.yaml | 6 + .../tests/e2e/lint/oas3.1-error/snapshot.txt | 23 + .../tests/e2e/lint/oas3.1/openapi.yaml | 351 + .../tests/e2e/lint/oas3.1/redocly.yaml | 6 + .../tests/e2e/lint/oas3.1/snapshot.txt | 62 + .../tests/e2e/lint/oas3.2/openapi.yaml | 168 + .../tests/e2e/lint/oas3.2/redocly.yaml | 6 + .../tests/e2e/lint/oas3.2/snapshot.txt | 360 + .../e2e/lint/openrpc-invalid/openrpc.json | 7 + .../e2e/lint/openrpc-invalid/redocly.yaml | 6 + .../e2e/lint/openrpc-invalid/snapshot.txt | 37 + .../tests/e2e/lint/openrpc-valid/openrpc.json | 32 + .../tests/e2e/lint/openrpc-valid/redocly.yaml | 6 + .../tests/e2e/lint/openrpc-valid/snapshot.txt | 23 + .../operation-2xx-response-rule/openapi.yaml | 13 + .../operation-2xx-response-rule/redocly.yaml | 6 + .../operation-2xx-response-rule/snapshot.txt | 6 + .../openapi.yaml | 13 + .../redocly.yaml | 6 + .../snapshot.txt | 23 + .../openapi.yaml | 22 + .../redocly.yaml | 6 + .../snapshot.txt | 23 + .../operation-4xx-response-rule/openapi.yaml | 13 + .../operation-4xx-response-rule/redocly.yaml | 6 + .../operation-4xx-response-rule/snapshot.txt | 6 + .../openapi.yaml | 13 + .../redocly.yaml | 6 + .../snapshot.txt | 23 + .../operation-description-rule/openapi.yaml | 14 + .../operation-description-rule/redocly.yaml | 6 + .../operation-description-rule/snapshot.txt | 6 + .../openapi.yaml | 13 + .../redocly.yaml | 6 + .../snapshot.txt | 23 + .../openapi.yaml | 48 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 20 + .../redocly.yaml | 6 + .../snapshot.txt | 27 + .../openapi.yaml | 20 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 31 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 24 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 17 + .../redocly.yaml | 6 + .../snapshot.txt | 22 + .../openapi.yaml | 80 + .../redocly.yaml | 6 + .../snapshot.txt | 107 + .../openapi.yaml | 58 + .../redocly.yaml | 6 + .../snapshot.txt | 168 + .../operation-tag-defined-rule/openapi.yaml | 42 + .../operation-tag-defined-rule/redocly.yaml | 6 + .../operation-tag-defined-rule/snapshot.txt | 6 + .../tests/e2e/lint/operations.test.ts | 25 + .../parameter-description-rule/openapi.yaml | 34 + .../parameter-description-rule/redocly.yaml | 6 + .../parameter-description-rule/snapshot.txt | 6 + .../openapi.yaml | 44 + .../redocly.yaml | 6 + .../snapshot.txt | 81 + .../openapi.yaml | 20 + .../redocly.yaml | 6 + .../snapshot.txt | 23 + .../openapi.yaml | 20 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../path-not-include-query-error/openapi.yaml | 20 + .../path-not-include-query-error/redocly.yaml | 6 + .../path-not-include-query-error/snapshot.txt | 23 + .../path-not-include-query-rule/openapi.yaml | 16 + .../path-not-include-query-rule/redocly.yaml | 6 + .../path-not-include-query-rule/snapshot.txt | 6 + .../openapi.yaml | 25 + .../redocly.yaml | 6 + .../snapshot.txt | 39 + .../components/parameters/path_userId.yaml | 5 + .../parameters/path_userId_ref.yaml | 1 + .../openapi.yaml | 7 + .../paths/users_data.yaml | 6 + .../redocly.yaml | 6 + .../snapshot.txt | 23 + .../path-parameters-defined-rule/openapi.yaml | 25 + .../path-parameters-defined-rule/redocly.yaml | 6 + .../path-parameters-defined-rule/snapshot.txt | 6 + .../path-segment-plural-error/openapi.yaml | 26 + .../path-segment-plural-error/redocly.yaml | 6 + .../path-segment-plural-error/snapshot.txt | 39 + .../e2e/lint/path-segment-plural/openapi.yaml | 38 + .../e2e/lint/path-segment-plural/redocly.yaml | 11 + .../e2e/lint/path-segment-plural/snapshot.txt | 6 + .../openapi.yaml | 67 + .../redocly.yaml | 13 + .../snapshot.txt | 75 + .../openapi.yaml | 98 + .../redocly.yaml | 13 + .../snapshot.txt | 87 + .../openapi.yaml | 70 + .../redocly.yaml | 13 + .../snapshot.txt | 55 + .../openapi.yaml | 51 + .../redocly.yaml | 5 + .../snapshot.txt | 39 + .../redocly-cli/tests/e2e/lint/rules.test.ts | 51 + .../tests/e2e/lint/skip-rules/openapi.yaml | 17 + .../tests/e2e/lint/skip-rules/redocly.yaml | 11 + .../tests/e2e/lint/skip-rules/snapshot.txt | 37 + .../tests/e2e/lint/skip-rules/snapshot_2.txt | 6 + .../components/schemas/Bar.yaml | 7 + .../components/schemas/Deep.yaml | 2 + .../components/schemas/Foo.yaml | 7 + .../components/schemas/Used.yaml | 5 + .../openapi.yaml | 6 + .../paths/_.yaml | 7 + .../redocly.yaml | 6 + .../snapshot.txt | 6 + .../openapi.yaml | 73 + .../redocly.yaml | 8 + .../snapshot.txt | 121 + .../tests/e2e/lint/spec-from/openapi.yaml | 13 + .../tests/e2e/lint/spec-from/redocly.yaml | 6 + .../tests/e2e/lint/spec-from/snapshot.txt | 55 + .../openapi.yaml | 34 + .../redocly.yaml | 7 + .../snapshot.txt | 25 + .../arazzo.yaml | 19 + .../redocly.yaml | 6 + .../snapshot.txt | 23 + .../tests/e2e/lint/spec-strict-refs/info.yaml | 11 + .../e2e/lint/spec-strict-refs/openapi.yaml | 22 + .../e2e/lint/spec-strict-refs/props.yaml | 8 + .../e2e/lint/spec-strict-refs/redocly.yaml | 6 + .../e2e/lint/spec-strict-refs/snapshot.txt | 39 + .../redocly-cli/tests/e2e/lint/spec.test.ts | 32 + .../lint/tags-alphabetical-rule/openapi.yaml | 41 + .../lint/tags-alphabetical-rule/redocly.yaml | 6 + .../lint/tags-alphabetical-rule/snapshot.txt | 6 + .../tags-alphabetical-warning/openapi.yaml | 41 + .../tags-alphabetical-warning/redocly.yaml | 6 + .../tags-alphabetical-warning/snapshot.txt | 29 + .../lint/test-unused-component/openapi.yaml | 13 + .../lint/test-unused-component/redocly.yaml | 6 + .../lint/test-unused-component/snapshot.txt | 6 + .../e2e/lint/turn-off-rules/openapi.yaml | 18 + .../e2e/lint/turn-off-rules/redocly.yaml | 3 + .../e2e/lint/turn-off-rules/snapshot.txt | 3 + .../e2e/lint/turn-on-all-rules/openapi.yaml | 19 + .../e2e/lint/turn-on-all-rules/redocly.yaml | 6 + .../e2e/lint/turn-on-all-rules/snapshot.txt | 243 + .../lint/validate-schema-formats/openapi.yaml | 67 + .../lint/validate-schema-formats/redocly.yaml | 9 + .../lint/validate-schema-formats/snapshot.txt | 205 + .../.redocly.lint-ignore.yaml | 7 + .../e2e/lint/with-ignore-file/openapi.yaml | 16 + .../e2e/lint/with-ignore-file/redocly.yaml | 7 + .../e2e/lint/with-ignore-file/snapshot.txt | 8 + .../e2e/lint/wrong-required-type/openapi.yaml | 12 + .../e2e/lint/wrong-required-type/redocly.yaml | 7 + .../e2e/lint/wrong-required-type/snapshot.txt | 20 + .../tests/e2e/lint/xml-oas-3.2/openapi.yaml | 441 + .../tests/e2e/lint/xml-oas-3.2/redocly.yaml | 6 + .../tests/e2e/lint/xml-oas-3.2/snapshot.txt | 65 + .../nested/openapi/main.yaml | 8 + .../nested/plugins/decorators/version.cjs | 11 + .../nested/plugins/test.cjs | 12 + .../nested/redocly.yaml | 14 + .../apply-per-api-decorators/snapshot.txt | 19 + .../apply-per-api-decorators/snapshot_2.txt | 9 + .../apply-per-api-decorators/snapshot_3.txt | 22 + .../apply-per-api-decorators/snapshot_4.txt | 22 + .../e2e/miscellaneous/miscellaneous.test.ts | 94 + .../resolve-plugins/openapi.yaml | 9 + .../resolve-plugins/plugin-config.yaml | 6 + .../resolve-plugins/snapshot.txt | 21 + .../resolve-plugins/snapshot_2.txt | 15 + .../bad-request-error.response.yaml | 5 + .../error-schema.yaml | 6 + .../nested/status.yaml | 6 + .../openapi.yaml | 18 + .../resolve-refs-in-preprocessors/plugin.cjs | 25 + .../redocly.yaml | 11 + .../snapshot.txt | 53 + .../snapshot_2.txt | 23 + .../snapshot_3.txt | 15 + .../successful-request.response.yaml | 7 + .../tests/e2e/proxy/fixtures/openapi.yaml | 25 + .../redocly-cli/tests/e2e/proxy/proxy.test.ts | 147 + .../case-insensitive-headers.test.ts.snap | 33 + .../case-insensitive-headers.arazzo.yaml | 42 + .../case-insensitive-headers.test.ts | 15 + .../__snapshots__/cat-fact-api.test.ts.snap | 204 + .../respect/cat-fact-api/auto-cat.arazzo.yaml | 21 + .../respect/cat-fact-api/cat-fact-api.test.ts | 19 + .../tests/e2e/respect/cat-fact-api/cats.yaml | 133 + ...verity-in-next-step-execution.test.ts.snap | 319 + ...everity-in-next-step-execution.arazzo.yaml | 37 + ...er-severity-in-next-step-execution.test.ts | 27 + .../__snapshots__/free-apis.test.ts.snap | 44 + .../e2e/respect/free-apis/free-apis.test.ts | 15 + .../e2e/respect/free-apis/free.arazzo.yaml | 51 + .../e2e/respect/free-apis/testing-acme.yaml | 764 + .../__snapshots__/implicit.test.ts.snap | 103 + .../e2e/respect/implicit/implicit.arazzo.yaml | 25 + .../e2e/respect/implicit/implicit.test.ts | 20 + .../e2e/respect/implicit/testing-acme.yaml | 764 + ...-target-workflow-and-remapped.test.ts.snap | 82 + .../events.arazzo.yaml | 63 + ...p-target-workflow-and-remapped.arazzo.yaml | 26 + ...-step-target-workflow-and-remapped.test.ts | 28 + ...assed-to-step-target-workflow.test.ts.snap | 76 + .../events.arazzo.yaml | 62 + ...passed-to-step-target-workflow.arazzo.yaml | 26 + ...uts-passed-to-step-target-workflow.test.ts | 25 + .../inputs-with-cli-and-env.test.ts.snap | 254 + .../inputs-with-cli-and-env.arazzo.yaml | 100 + .../inputs-with-cli-and-env.test.ts | 25 + .../e2e/respect/local-json-server/.gitignore | 1 + .../local-json-server.test.ts.snap | 78 + .../json-server-openapi.yaml | 112 + .../local-json-server.arazzo.yaml | 82 + .../local-json-server.test.ts | 52 + .../mask-input-secrets.test.ts.snap | 287 + .../mask-input-secrets.arazzo.yaml | 118 + .../mask-input-secrets.test.ts | 25 + .../__snapshots__/max-steps.test.ts.snap | 168 + .../tests/e2e/respect/max-steps/arazzo.yaml | 51 + .../e2e/respect/max-steps/max-steps.test.ts | 26 + .../tests/e2e/respect/max-steps/oas.yaml | 18 + .../e2e/respect/museum-api-with-errors.yaml | 755 + .../tests/e2e/respect/museum-api.yaml | 855 + .../tests/e2e/respect/museum-tickets.yaml | 39 + ...puts-access-syntax-variations.test.ts.snap | 350 + ...tputs-access-syntax-variations.arazzo.yaml | 81 + .../outputs-access-syntax-variations.test.ts | 15 + .../__snapshots__/replacements.test.ts.snap | 139 + .../replacements/replacements.arazzo.yaml | 56 + .../respect/replacements/replacements.test.ts | 15 + .../reusable-components.test.ts.snap | 522 + .../reusable-components.arazzo.yaml | 151 + .../reusable-components.test.ts | 23 + .../reveal-masked-input-secrets.test.ts.snap | 287 + .../reveal-masked-input-secrets.arazzo.yaml | 118 + .../reveal-masked-input-secrets.test.ts | 26 + ...rride-with-console-parameters.test.ts.snap | 73 + ...erride-with-console-parameters.arazzo.yaml | 43 + ...r-override-with-console-parameters.test.ts | 21 + .../severity-error-level.test.ts.snap | 200 + .../severity-error-level.test.ts | 27 + .../severity-level.arazzo.yaml | 87 + .../severity-off-level.test.ts.snap | 198 + .../severity-level.arazzo.yaml | 87 + .../severity-off-level.test.ts | 27 + .../severity-warn-level.test.ts.snap | 198 + .../severity-level.arazzo.yaml | 87 + .../severity-warn-level.test.ts | 27 + ...ep-on-failure-type-end-action.test.ts.snap | 51 + ...tep-on-failure-type-end-action.arazzo.yaml | 62 + .../step-on-failure-type-end-action.test.ts | 16 + ...ep-on-success-type-end-action.test.ts.snap | 41 + ...tep-on-success-type-end-action.arazzo.yaml | 44 + .../step-on-success-type-end-action.test.ts | 16 + .../redocly-cli/tests/e2e/respect/utils.ts | 12 + .../workflow-depends-on-failed.test.ts.snap | 72 + .../workflow-depends-on-failed.arazzo.yaml | 32 + .../workflow-depends-on-failed.test.ts | 15 + ...workflow-depends-on-not-found.test.ts.snap | 46 + .../workflow-depends-on-not-found.arazzo.yaml | 26 + .../workflow-depends-on-not-found.test.ts | 15 + .../workflow-failure-actions.test.ts.snap | 77 + .../workflow-failure-actions.arazzo.yaml | 62 + .../workflow-failure-actions.test.ts | 15 + .../workflow-success-actions.test.ts.snap | 60 + .../workflow-success-actions.arazzo.yaml | 88 + .../workflow-success-actions.test.ts | 15 + .../x-allow-reserved-query-param.test.ts.snap | 46 + .../x-allow-reserved-query-param.arazzo.yaml | 21 + .../x-allow-reserved-query-param.test.ts | 15 + .../x-security-api-key-auth.test.ts.snap | 96 + .../x-security-api-key-auth.arazzo.yaml | 31 + .../x-security-api-key-auth.test.ts | 21 + .../x-security-basic-auth.test.ts.snap | 95 + .../x-security-basic-auth.arazzo.yaml | 27 + .../x-security-basic-auth.test.ts | 21 + .../x-security-bearer-auth.test.ts.snap | 47 + .../x-security-bearer-auth.arazzo.yaml | 26 + .../x-security-bearer-auth.test.ts | 21 + .../x-security-oauth2-auth.test.ts.snap | 47 + .../x-security-oauth2-auth.arazzo.yaml | 31 + .../x-security-oauth2-auth.test.ts | 15 + ...orkflow-level-merged-to-steps.test.ts.snap | 137 + ...workflow-level-merged-to-steps.arazzo.yaml | 41 + ...-on-workflow-level-merged-to-steps.test.ts | 15 + ...security-open-id-connect-auth.test.ts.snap | 47 + ...-security-open-id-connect-auth.arazzo.yaml | 26 + .../x-security-open-id-connect-auth.test.ts | 15 + ...-security-resolve-scheme-name.test.ts.snap | 165 + ...x-security-resolve-scheme-name.arazzo.yaml | 32 + .../x-security-resolve-scheme-name.test.ts | 21 + ...x-security-scheme-apply-order.test.ts.snap | 98 + .../x-security-scheme-apply-order.arazzo.yaml | 93 + .../x-security-scheme-apply-order.test.ts | 21 + .../tests/e2e/score/score-json/museum.yaml | 1 + .../tests/e2e/score/score-json/snapshot.txt | 351 + .../e2e/score/score-minimal/openapi.yaml | 46 + .../e2e/score/score-minimal/snapshot.txt | 48 + .../tests/e2e/score/score-stylish/museum.yaml | 1 + .../e2e/score/score-stylish/snapshot.txt | 40 + .../redocly-cli/tests/e2e/score/score.test.ts | 32 + .../e2e/split/asyncapi2-basic/asyncapi.yaml | 33 + .../e2e/split/asyncapi2-basic/snapshot.txt | 35 + .../e2e/split/asyncapi3-basic/asyncapi.yaml | 39 + .../e2e/split/asyncapi3-basic/snapshot.txt | 42 + .../e2e/split/asyncapi3-complex/asyncapi.yaml | 104 + .../e2e/split/asyncapi3-complex/snapshot.txt | 100 + .../split/discriminator-in-json/openapi.json | 76 + .../split/discriminator-in-json/snapshot.txt | 90 + .../e2e/split/missing-outDir/snapshot.txt | 19 + .../tests/e2e/split/missing-outDir/spec.json | 3 + .../tests/e2e/split/oas2/openapi.yaml | 45 + .../tests/e2e/split/oas2/snapshot.txt | 3 + .../e2e/split/oas3-no-errors/openapi.yaml | 111 + .../e2e/split/oas3-no-errors/snapshot.txt | 114 + .../e2e/split/openapi-json-file/openapi.json | 165 + .../e2e/split/openapi-json-file/snapshot.txt | 179 + .../tests/e2e/split/refs-in-json/openapi.json | 176 + .../tests/e2e/split/refs-in-json/snapshot.txt | 8 + .../e2e/split/root-endpoint/openapi.yaml | 111 + .../e2e/split/root-endpoint/snapshot.txt | 114 + .../e2e/split/slash-separator/openapi.yaml | 111 + .../e2e/split/slash-separator/snapshot.txt | 114 + .../redocly-cli/tests/e2e/split/split.test.ts | 165 + .../e2e/stats/stats-async2-json/async.yaml | 37 + .../e2e/stats/stats-async2-json/snapshot.txt | 35 + .../e2e/stats/stats-async2-stylish/async.yaml | 37 + .../stats/stats-async2-stylish/snapshot.txt | 13 + .../stats/stats-async3-stylish/asyncapi3.yaml | 42 + .../stats/stats-async3-stylish/snapshot.txt | 13 + .../tests/e2e/stats/stats-json/museum.yaml | 1 + .../tests/e2e/stats/stats-json/snapshot.txt | 43 + .../e2e/stats/stats-markdown/museum.yaml | 1 + .../e2e/stats/stats-markdown/snapshot.txt | 17 + .../tests/e2e/stats/stats-stylish/museum.yaml | 1 + .../e2e/stats/stats-stylish/snapshot.txt | 15 + .../redocly-cli/tests/e2e/stats/stats.test.ts | 53 + .../default-recommended-fallback/openapi.yaml | 58 + .../default-recommended-fallback/snapshot.txt | 170 + .../openapi.yaml | 58 + .../redocly.yaml | 0 .../snapshot.txt | 3 + .../openapi.yaml | 58 + .../redocly.yaml | 3 + .../snapshot.txt | 3 + .../tests/e2e/zero-config/zero-config.test.ts | 32 + .../redocly-cli/tests/performance/.gitignore | 10 + .../redocly-cli/tests/performance/README.md | 22 + .../redocly-cli/tests/performance/chart.js | 94 + .../tests/performance/make-test-command.sh | 31 + .../tests/performance/package.json | 31 + .../tests/smoke/basic/add-redoc.sh | 10 + .../tests/smoke/basic/message-schema.yaml | 4 + .../tests/smoke/basic/openapi.yaml | 21 + .../tests/smoke/basic/package.json | 20 + .../tests/smoke/basic/pre-built/redoc.html | 324 + .../BuyEventTicketsRequestExample.yaml | 6 + .../BuyEventTicketsResponseExample.yaml | 8 + .../BuyGeneralTicketsRequestExample.yaml | 5 + .../BuyGeneralTicketsResponseExample.yaml | 7 + .../CreateSpecialEventRequestExample.yaml | 11 + .../CreateSpecialEventResponseExample.yaml | 12 + .../GetMuseumHoursResponseExample.yaml | 32 + .../GetSpecialEventResponseExample.yaml | 11 + .../ListSpecialEventsResponseExample.yaml | 93 + .../UpdateSpecialEventRequestExample.yaml | 4 + .../UpdateSpecialEventResponseExample.yaml | 12 + .../museum/components/parameters/EndDate.yaml | 9 + .../museum/components/parameters/EventId.yaml | 8 + .../parameters/PaginationLimit.yaml | 8 + .../components/parameters/PaginationPage.yaml | 7 + .../components/parameters/StartDate.yaml | 9 + .../components/parameters/TicketId.yaml | 8 + .../components/responses/BadRequest.yaml | 5 + .../museum/components/responses/NotFound.yaml | 5 + .../components/responses/Unauthorized.yaml | 5 + .../schemas/BuyMuseumTicketsRequest.yaml | 21 + .../schemas/BuyMuseumTicketsResponse.yaml | 22 + .../schemas/CreateSpecialEventRequest.yaml | 19 + .../museum/components/schemas/Date.yaml | 3 + .../museum/components/schemas/Email.yaml | 4 + .../museum/components/schemas/Error.yaml | 8 + .../museum/components/schemas/EventDates.yaml | 4 + .../components/schemas/EventDescription.yaml | 5 + .../museum/components/schemas/EventId.yaml | 4 + .../components/schemas/EventLocation.yaml | 3 + .../museum/components/schemas/EventName.yaml | 3 + .../museum/components/schemas/EventPrice.yaml | 4 + .../schemas/GetMuseumHoursResponse.yaml | 4 + .../schemas/GetTicketCodeResponse.yaml | 3 + .../schemas/ListSpecialEventsResponse.yaml | 4 + .../components/schemas/MuseumDailyHours.yaml | 25 + .../museum/components/schemas/Phone.yaml | 3 + .../schemas/SpecialEventResponse.yaml | 22 + .../schemas/TicketConfirmation.yaml | 3 + .../museum/components/schemas/TicketId.yaml | 4 + .../components/schemas/TicketMessage.yaml | 3 + .../museum/components/schemas/TicketType.yaml | 8 + .../schemas/UpdateSpecialEventRequest.yaml | 15 + .../smoke/basic/pre-split/museum/openapi.yaml | 41 + .../pre-split/museum/paths/museum-hours.yaml | 24 + .../museum/paths/special-events.yaml | 54 + .../paths/special-events_{eventId}.yaml | 72 + .../basic/pre-split/museum/paths/tickets.yaml | 33 + .../museum/paths/tickets_{ticketId}_qr.yaml | 19 + .../code_samples/C_sharp/petGet/post.cs | 15 + .../petstore/code_samples/PHP/petGet/post.php | 9 + .../petstore/code_samples/PHP/petGet/put.php | 10 + .../petstore/components/examples/Order.yaml | 5 + .../components/requestBodies/Pet.yaml | 16 + .../components/requestBodies/UserArray.yaml | 8 + .../components/schemas/ApiResponse.yaml | 9 + .../petstore/components/schemas/Cat.yaml | 17 + .../petstore/components/schemas/Category.yaml | 19 + .../petstore/components/schemas/Dog.yaml | 13 + .../petstore/components/schemas/HoneyBee.yaml | 12 + .../petstore/components/schemas/Id.yaml | 3 + .../petstore/components/schemas/Order.yaml | 37 + .../petstore/components/schemas/Pet.yaml | 63 + .../petstore/components/schemas/Tag.yaml | 12 + .../petstore/components/schemas/User.yaml | 48 + .../basic/pre-split/petstore/openapi.yaml | 175 + .../paths/GETCustomers_findByTags.yaml | 39 + .../petstore/paths/GETpet_{petId}.yaml | 91 + .../pre-split/petstore/paths/petGet.yaml | 63 + .../petstore/paths/pet_findByStatusPut.yaml | 43 + .../paths/pet_{petId}_uploadImage.yaml | 31 + .../petstore/paths/store_inventory.yaml | 18 + .../pre-split/petstore/paths/store_order.yaml | 30 + .../petstore/paths/store_order_{orderId}.yaml | 53 + .../petstore/paths/store_subscribe.yaml | 244 + .../basic/pre-split/petstore/paths/user.yaml | 16 + .../petstore/paths/user_createWithArray.yaml | 11 + .../petstore/paths/user_createWithList.yaml | 11 + .../pre-split/petstore/paths/user_login.yaml | 52 + .../pre-split/petstore/paths/user_logout.yaml | 9 + .../petstore/paths/user_{username}.yaml | 70 + .../pre-split/petstore/webhooks/newPet.yaml | 14 + .../tests/smoke/basic/prepare-smoke.sh | 16 + .../tests/smoke/basic/run-smoke.sh | 30 + .../tests/smoke/plugins/local-plugin.js | 3 + .../tests/smoke/plugins/message-schema.yaml | 4 + .../tests/smoke/plugins/openapi.yaml | 19 + .../tests/smoke/plugins/package.json | 11 + .../smoke/plugins/prepare-smoke-plugins.sh | 16 + .../tests/smoke/plugins/redocly.yaml | 5 + .../tests/smoke/plugins/run-smoke.sh | 19 + .../__snapshots__/rebilly.smoke.ts.snap | 54 + .../smoke/rebilly/rebilly-description.yaml | 69513 ++++++++++++++++ .../tests/smoke/rebilly/rebilly.arazzo.yaml | 124 + .../tests/smoke/rebilly/rebilly.smoke.ts | 15 + @skills/redocly-cli/tsconfig.build.json | 4 + @skills/redocly-cli/tsconfig.json | 26 + @skills/redocly-cli/vitest.config.ts | 58 + 2790 files changed, 354872 insertions(+) create mode 100644 @skills/redocly-cli/.changeset/README.md create mode 100644 @skills/redocly-cli/.changeset/config.json create mode 100644 @skills/redocly-cli/.changeset/format.js create mode 100644 @skills/redocly-cli/.claude/commands/deslop.md create mode 100644 @skills/redocly-cli/.claude/rules/code-quality-standards.md create mode 100644 @skills/redocly-cli/.claude/rules/core-principles.md create mode 100644 @skills/redocly-cli/.claude/rules/documentation.md create mode 100644 @skills/redocly-cli/.claude/rules/rules-system.md create mode 100644 @skills/redocly-cli/.claude/rules/security-guidelines.md create mode 100644 @skills/redocly-cli/.claude/rules/testing.md create mode 100644 @skills/redocly-cli/.claude/rules/workflow.md create mode 100644 @skills/redocly-cli/.claude/skills/redocly-cli/SKILL.md create mode 100644 @skills/redocly-cli/.dockerignore create mode 100644 @skills/redocly-cli/.gemini/settings.json create mode 100644 @skills/redocly-cli/.github/CODEOWNERS create mode 100644 @skills/redocly-cli/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 @skills/redocly-cli/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 @skills/redocly-cli/.github/copilot-instructions.md create mode 100644 @skills/redocly-cli/.github/pull_request_template.md create mode 100644 @skills/redocly-cli/.github/styles/Redocly-Docs/BritishEnglish.yml create mode 100644 @skills/redocly-cli/.github/styles/Redocly-Docs/FutureTense.yml create mode 100644 @skills/redocly-cli/.github/styles/Redocly-Docs/HeaderGerunds.yml create mode 100644 @skills/redocly-cli/.github/styles/Redocly-Docs/InclusionGenderCulture.yml create mode 100644 @skills/redocly-cli/.github/styles/Redocly-Docs/OxfordComma.yml create mode 100644 @skills/redocly-cli/.github/styles/config/vocabularies/Redocly-Docs/accept.txt create mode 100644 @skills/redocly-cli/.github/styles/config/vocabularies/Redocly-Docs/reject.txt create mode 100644 @skills/redocly-cli/.github/workflows/docs-tests.yaml create mode 100644 @skills/redocly-cli/.github/workflows/main-version-release-guard.yaml create mode 100644 @skills/redocly-cli/.github/workflows/performance-comment.yaml create mode 100644 @skills/redocly-cli/.github/workflows/performance.yaml create mode 100644 @skills/redocly-cli/.github/workflows/pr-title.yml create mode 100644 @skills/redocly-cli/.github/workflows/pre-release.yaml create mode 100644 @skills/redocly-cli/.github/workflows/release.yaml create mode 100644 @skills/redocly-cli/.github/workflows/require-changeset.yaml create mode 100644 @skills/redocly-cli/.github/workflows/smoke-plugins.yaml create mode 100644 @skills/redocly-cli/.github/workflows/smoke-rebilly.yaml create mode 100644 @skills/redocly-cli/.github/workflows/smoke.yaml create mode 100644 @skills/redocly-cli/.github/workflows/tests.yaml create mode 100644 @skills/redocly-cli/.gitignore create mode 100755 @skills/redocly-cli/.husky/pre-commit create mode 100644 @skills/redocly-cli/.markdownlint.yaml create mode 100644 @skills/redocly-cli/.mlc.toml create mode 100644 @skills/redocly-cli/.oxfmtrc.json create mode 100644 @skills/redocly-cli/.oxlintrc.json create mode 100644 @skills/redocly-cli/.vale.ini create mode 100644 @skills/redocly-cli/AGENTS.md create mode 100644 @skills/redocly-cli/CLAUDE.md create mode 100644 @skills/redocly-cli/CONTRIBUTING.md create mode 100644 @skills/redocly-cli/Dockerfile create mode 100644 @skills/redocly-cli/LICENSE.md create mode 100644 @skills/redocly-cli/README.md create mode 100644 @skills/redocly-cli/cookbook/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/api-health/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/api-health/openapi.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/api-health/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/azure-apim-unsupported-keyword/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/azure-apim-unsupported-keyword/openapi.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/azure-apim-unsupported-keyword/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/description-banned-words/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/description-banned-words/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/info-description/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/info-description/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/json-schema-misconfigurations/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/json-schema-misconfigurations/openapi.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/json-schema-misconfigurations/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/no-script/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/no-script/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-delete-should-not-define-requestBody/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-delete-should-not-define-requestBody/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-deprecated-response-headers/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-deprecated-response-headers/openapi.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-deprecated-response-headers/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-get-should-not-define-requestBody/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-get-should-not-define-requestBody/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-operationId-exclude-OPTIONS/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-operationId-exclude-OPTIONS/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-post-should-define-request-body/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-post-should-define-request-body/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-summary-sentence-case/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/operation-summary-sentence-case/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/path-excludes-pattern/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/path-excludes-pattern/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/required-items-for-array-schemas/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/required-items-for-array-schemas/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/README.md create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/openapi.yaml create mode 100644 @skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/bar.yaml create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/decorator.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/foo.yaml create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/plugin.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/azure-apim/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/azure-apim/azure-apim.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/openai-is-consequential/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/openai-is-consequential/openai-is-consequential.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/remove-extensions/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/remove-extensions/remove-extensions.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/tags.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/set-servers-urls-decorator.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/set-servers-urls-plugin.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/swap-fields.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/decorator-alpha.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/tag-sorting.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/decorator.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/plugin.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/check-sdk-coverage.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/x-code-sample-checks.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-rules/default-enum-match/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-rules/default-enum-match/default-enum-plugin.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/openapi-markdown.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/package.json create mode 100644 @skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/rule-validate-markdown.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugins/sorting/README.md create mode 100644 @skills/redocly-cli/cookbook/custom-plugins/sorting/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/custom-plugins/sorting/rule-sort-methods.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugins/sorting/rule-sort-props.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugins/sorting/sort-enums.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugins/sorting/sort-methods.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugins/sorting/sort-props-alpha.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugins/sorting/sort-props-required.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugins/sorting/sort-tags.js create mode 100644 @skills/redocly-cli/cookbook/custom-plugins/sorting/sorting.js create mode 100644 @skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/README.md create mode 100644 @skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/bundled.yaml create mode 100644 @skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/openapi.yaml create mode 100644 @skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/reorder.js create mode 100644 @skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/schema.yaml create mode 100644 @skills/redocly-cli/cookbook/rulesets/common-mistakes/README.md create mode 100644 @skills/redocly-cli/cookbook/rulesets/common-mistakes/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/rulesets/security/README.md create mode 100644 @skills/redocly-cli/cookbook/rulesets/security/redocly.yaml create mode 100644 @skills/redocly-cli/cookbook/rulesets/spec-compliant/README.md create mode 100644 @skills/redocly-cli/cookbook/rulesets/spec-compliant/redocly.yaml create mode 100644 @skills/redocly-cli/docs/@v1/api-docs.md create mode 100644 @skills/redocly-cli/docs/@v1/api-standards.md create mode 100644 @skills/redocly-cli/docs/@v1/changelog.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/build-docs.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/bundle.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/check-config.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/completion.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/eject.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/generate-arazzo.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/images/lint-markdown.png create mode 100644 @skills/redocly-cli/docs/@v1/commands/images/stats-github-job-summary.png create mode 100644 @skills/redocly-cli/docs/@v1/commands/index.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/join.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/lint.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/login.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/logout.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/preview-docs.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/preview.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/push-status.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/push.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/respect.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/split.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/stats.md create mode 100644 @skills/redocly-cli/docs/@v1/commands/translate.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/api.yaml create mode 100644 @skills/redocly-cli/docs/@v1/configuration/apis.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/extends.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/index.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/mockserver.yaml create mode 100644 @skills/redocly-cli/docs/@v1/configuration/reference/apis.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/reference/decorators.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/reference/extends.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/reference/plugins.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/reference/preprocessors.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/reference/resolve.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/reference/rules.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/resolve.yaml create mode 100644 @skills/redocly-cli/docs/@v1/configuration/rules.md create mode 100644 @skills/redocly-cli/docs/@v1/configuration/schema.yaml create mode 100644 @skills/redocly-cli/docs/@v1/custom-plugins/custom-config.md create mode 100644 @skills/redocly-cli/docs/@v1/custom-plugins/custom-decorators.md create mode 100644 @skills/redocly-cli/docs/@v1/custom-plugins/custom-rules.md create mode 100644 @skills/redocly-cli/docs/@v1/custom-plugins/extended-types.md create mode 100644 @skills/redocly-cli/docs/@v1/custom-plugins/index.md create mode 100644 @skills/redocly-cli/docs/@v1/custom-plugins/visitor.md create mode 100644 @skills/redocly-cli/docs/@v1/decorators.md create mode 100644 @skills/redocly-cli/docs/@v1/decorators/filter-in.md create mode 100644 @skills/redocly-cli/docs/@v1/decorators/filter-out.md create mode 100644 @skills/redocly-cli/docs/@v1/decorators/info-description-override.md create mode 100644 @skills/redocly-cli/docs/@v1/decorators/info-override.md create mode 100644 @skills/redocly-cli/docs/@v1/decorators/media-type-examples-override.md create mode 100644 @skills/redocly-cli/docs/@v1/decorators/operation-description-override.md create mode 100644 @skills/redocly-cli/docs/@v1/decorators/remove-unused-components.md create mode 100644 @skills/redocly-cli/docs/@v1/decorators/remove-x-internal.md create mode 100644 @skills/redocly-cli/docs/@v1/decorators/tag-description-override.md create mode 100644 @skills/redocly-cli/docs/@v1/file-management.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/autocomplete.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/change-token-url.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/configure-rules.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/hide-apis.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/hide-specification-extensions.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/images/hide-apis-path-to-root-file.png create mode 100644 @skills/redocly-cli/docs/@v1/guides/images/hide-internal-apis-problem.png create mode 100644 @skills/redocly-cli/docs/@v1/guides/images/museum-arazzo-lint.png create mode 100644 @skills/redocly-cli/docs/@v1/guides/images/museum-overlay-lint.png create mode 100644 @skills/redocly-cli/docs/@v1/guides/images/response-contains-property-multiple.png create mode 100644 @skills/redocly-cli/docs/@v1/guides/images/response-contains-property-one.png create mode 100644 @skills/redocly-cli/docs/@v1/guides/images/response-contains-property-range.png create mode 100644 @skills/redocly-cli/docs/@v1/guides/index.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/lint-and-bundle.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/lint-arazzo.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/lint-asyncapi.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/lint-overlay.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/migrate-from-openapi-cli.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/migrate-from-redoc-cli.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/migrate-from-spectral.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/migrate-from-swagger-cli.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/replace-servers-url.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/response-contains-property.md create mode 100644 @skills/redocly-cli/docs/@v1/guides/update-cli.md create mode 100644 @skills/redocly-cli/docs/@v1/images/install-update-openapi-cli.gif create mode 100644 @skills/redocly-cli/docs/@v1/images/preview-docs.png create mode 100644 @skills/redocly-cli/docs/@v1/images/redoc.png create mode 100644 @skills/redocly-cli/docs/@v1/images/redocly-api-ref.png create mode 100644 @skills/redocly-cli/docs/@v1/images/updated-preview-docs.png create mode 100644 @skills/redocly-cli/docs/@v1/index.md create mode 100644 @skills/redocly-cli/docs/@v1/installation.md create mode 100644 @skills/redocly-cli/docs/@v1/openapi-starter.md create mode 100644 @skills/redocly-cli/docs/@v1/quickstart.md create mode 100644 @skills/redocly-cli/docs/@v1/rules.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/criteria-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/parameters-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/requestBody-replacements-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/sourceDescriptions-name-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/sourceDescriptions-not-empty.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/sourceDescriptions-type.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/step-onFailure-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/step-onSuccess-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/stepId-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/struct.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/workflow-dependsOn.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/arazzo/workflowId-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/async/channels-kebab-case.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/async/no-channel-trailing-slash.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/built-in-rules.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/configurable-rules.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/configure-rules.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/minimal.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/array-parameter-serialization.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/boolean-parameter-prefixes.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/component-name-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/info-contact.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/info-license-url.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/info-license.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-ambiguous-paths.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-empty-servers.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-enum-type-mismatch.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-example-value-and-externalValue.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-http-verbs-in-paths.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-identical-paths.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-invalid-media-type-examples.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-invalid-parameter-examples.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-invalid-schema-examples.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-path-trailing-slash.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-required-schema-properties-undefined.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-schema-type-mismatch.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-server-example-com.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-server-trailing-slash.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-server-variables-empty-enum.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-undefined-server-variable.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-unresolved-refs.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/no-unused-components.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-2xx-response.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-4xx-problem-details-rfc7807.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-4xx-response.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-description.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-operationId-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-operationId-url-safe.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-operationId.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-parameters-unique.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-singular-tag.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-summary.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/operation-tag-defined.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/parameter-description.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/path-declaration-must-exist.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/path-excludes-patterns.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/path-not-include-query.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/path-parameters-defined.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/path-segment-plural.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/paths-kebab-case.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/request-mime-type.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/required-string-property-missing-min-length.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/response-contains-header.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/response-contains-property.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/response-mime-type.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/scalar-property-missing-example.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/security-defined.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/spec-components-invalid-map-name.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/spec-strict-refs.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/struct.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/tag-description.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/oas/tags-alphabetical.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/overlay/info-contact.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/overlay/struct.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/recommended.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/respect/no-criteria-xpath.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/respect/respect-supported-versions.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/ruleset-templates.md create mode 100644 @skills/redocly-cli/docs/@v1/rules/spec-ruleset.md create mode 100644 @skills/redocly-cli/docs/@v1/usage-data.md create mode 100644 @skills/redocly-cli/docs/@v1/v1.sidebars.yaml create mode 100644 @skills/redocly-cli/docs/@v2/api-docs.md create mode 100644 @skills/redocly-cli/docs/@v2/api-standards.md create mode 100644 @skills/redocly-cli/docs/@v2/changelog.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/build-docs.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/bundle.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/check-config.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/completion.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/drift.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/eject.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/generate-arazzo.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/generate-spec.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/images/lint-markdown.png create mode 100644 @skills/redocly-cli/docs/@v2/commands/images/stats-github-job-summary.png create mode 100644 @skills/redocly-cli/docs/@v2/commands/index.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/join.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/lint.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/login.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/logout.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/preview.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/proxy.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/push-status.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/push.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/respect.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/score.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/scorecard-classic.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/split.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/stats.md create mode 100644 @skills/redocly-cli/docs/@v2/commands/translate.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/api.yaml create mode 100644 @skills/redocly-cli/docs/@v2/configuration/apis.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/extends.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/index.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/mockserver.yaml create mode 100644 @skills/redocly-cli/docs/@v2/configuration/reference/apis.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/reference/decorators.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/reference/extends.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/reference/plugins.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/reference/preprocessors.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/reference/resolve.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/reference/rules.md create mode 100644 @skills/redocly-cli/docs/@v2/configuration/resolve.yaml create mode 100644 @skills/redocly-cli/docs/@v2/configuration/rules.md create mode 100644 @skills/redocly-cli/docs/@v2/custom-plugins/custom-config.md create mode 100644 @skills/redocly-cli/docs/@v2/custom-plugins/custom-decorators.md create mode 100644 @skills/redocly-cli/docs/@v2/custom-plugins/custom-rules.md create mode 100644 @skills/redocly-cli/docs/@v2/custom-plugins/extended-types.md create mode 100644 @skills/redocly-cli/docs/@v2/custom-plugins/index.md create mode 100644 @skills/redocly-cli/docs/@v2/custom-plugins/visitor.md create mode 100644 @skills/redocly-cli/docs/@v2/decorators.md create mode 100644 @skills/redocly-cli/docs/@v2/decorators/filter-in.md create mode 100644 @skills/redocly-cli/docs/@v2/decorators/filter-out.md create mode 100644 @skills/redocly-cli/docs/@v2/decorators/info-description-override.md create mode 100644 @skills/redocly-cli/docs/@v2/decorators/info-override.md create mode 100644 @skills/redocly-cli/docs/@v2/decorators/media-type-examples-override.md create mode 100644 @skills/redocly-cli/docs/@v2/decorators/operation-description-override.md create mode 100644 @skills/redocly-cli/docs/@v2/decorators/remove-unused-components.md create mode 100644 @skills/redocly-cli/docs/@v2/decorators/remove-x-internal.md create mode 100644 @skills/redocly-cli/docs/@v2/decorators/tag-description-override.md create mode 100644 @skills/redocly-cli/docs/@v2/file-management.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/autocomplete.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/change-token-url.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/configure-rules.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/hide-apis.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/hide-specification-extensions.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/images/hide-apis-path-to-root-file.png create mode 100644 @skills/redocly-cli/docs/@v2/guides/images/hide-internal-apis-problem.png create mode 100644 @skills/redocly-cli/docs/@v2/guides/images/museum-arazzo-lint.png create mode 100644 @skills/redocly-cli/docs/@v2/guides/images/museum-overlay-lint.png create mode 100644 @skills/redocly-cli/docs/@v2/guides/images/response-contains-property-multiple.png create mode 100644 @skills/redocly-cli/docs/@v2/guides/images/response-contains-property-one.png create mode 100644 @skills/redocly-cli/docs/@v2/guides/images/response-contains-property-range.png create mode 100644 @skills/redocly-cli/docs/@v2/guides/index.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/lint-and-bundle.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/lint-arazzo.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/lint-asyncapi.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/lint-graphql.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/lint-openrpc.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/lint-overlay.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/migrate-from-openapi-cli.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/migrate-from-redoc-cli.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/migrate-from-spectral.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/migrate-from-swagger-cli.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/migrate-to-v2.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/replace-servers-url.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/response-contains-property.md create mode 100644 @skills/redocly-cli/docs/@v2/guides/update-cli.md create mode 100644 @skills/redocly-cli/docs/@v2/images/install-update-openapi-cli.gif create mode 100644 @skills/redocly-cli/docs/@v2/images/redoc-reunite.svg create mode 100644 @skills/redocly-cli/docs/@v2/images/redoc.png create mode 100644 @skills/redocly-cli/docs/@v2/images/updated-preview-docs.png create mode 100644 @skills/redocly-cli/docs/@v2/index.md create mode 100644 @skills/redocly-cli/docs/@v2/installation.md create mode 100644 @skills/redocly-cli/docs/@v2/openapi-starter.md create mode 100644 @skills/redocly-cli/docs/@v2/quickstart.md create mode 100644 @skills/redocly-cli/docs/@v2/rules.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/criteria-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/outputs-defined.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/parameters-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/requestBody-replacements-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/sourceDescription-name-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/sourceDescription-type.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/sourceDescriptions-not-empty.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/spec-step-mutually-exclusive-fields.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/step-onFailure-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/step-onSuccess-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/stepId-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/workflow-dependsOn.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/arazzo/workflowId-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/async/channels-kebab-case.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/async/no-channel-trailing-slash.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/async/no-duplicated-tag-names.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/built-in-rules.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/common/no-enum-type-mismatch.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/common/no-mixed-number-range-constraints.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/common/no-required-schema-properties-undefined.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/common/no-schema-type-mismatch.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/common/no-unresolved-refs.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/common/security-scopes-defined.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/common/struct.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/configurable-rules.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/configure-rules.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/minimal.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/array-parameter-serialization.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/boolean-parameter-prefixes.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/component-name-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/info-contact.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/info-license-strict.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/info-license.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-ambiguous-paths.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-duplicated-tag-names.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-empty-servers.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-example-value-and-externalValue.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-http-verbs-in-paths.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-identical-paths.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-invalid-media-type-examples.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-invalid-parameter-examples.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-invalid-schema-examples.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-path-trailing-slash.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-server-example-com.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-server-trailing-slash.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-server-variables-empty-enum.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-undefined-server-variable.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/no-unused-components.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/nullable-type-sibling.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-2xx-response.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-4xx-problem-details-rfc7807.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-4xx-response.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-description.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-operationId-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-operationId-url-safe.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-operationId.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-parameters-unique.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-singular-tag.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-summary.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/operation-tag-defined.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/parameter-description.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/path-declaration-must-exist.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/path-http-verbs-order.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/path-not-include-query.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/path-parameters-defined.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/path-segment-plural.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/paths-kebab-case.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/request-mime-type.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/required-string-property-missing-min-length.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/response-contains-header.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/response-contains-property.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/response-mime-type.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/scalar-property-missing-example.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/security-defined.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/spec-components-invalid-map-name.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/spec-discriminator-defaultMapping.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/spec-example-values.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/spec-no-invalid-encoding-combinations.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/spec-no-invalid-tag-parents.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/spec-querystring-parameters.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/spec-strict-refs.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/tag-description.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/oas/tags-alphabetical.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/openrpc/spec-no-duplicated-method-params.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/openrpc/spec-no-required-params-after-optional.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/overlay/info-contact.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/overlay/struct.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/recommended.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/respect/no-criteria-xpath.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/respect/no-x-security-both-scheme-and-scheme-name.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/respect/no-x-security-scheme-name-without-openapi.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/respect/x-security-scheme-name-reference.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/respect/x-security-scheme-required-values.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/ruleset-templates.md create mode 100644 @skills/redocly-cli/docs/@v2/rules/spec-ruleset.md create mode 100644 @skills/redocly-cli/docs/@v2/usage-data.md create mode 100644 @skills/redocly-cli/docs/@v2/v2.sidebars.yaml create mode 100644 @skills/redocly-cli/docs/_code-snippets/per-api-rules-example.yaml create mode 100644 @skills/redocly-cli/docs/sidebars.yaml create mode 100644 @skills/redocly-cli/docs/versions.yaml create mode 100644 @skills/redocly-cli/media/redocly-cli.gif create mode 100644 @skills/redocly-cli/package-lock.json create mode 100644 @skills/redocly-cli/package.json create mode 100644 @skills/redocly-cli/packages/cli/.gitignore create mode 100644 @skills/redocly-cli/packages/cli/.npmignore create mode 100644 @skills/redocly-cli/packages/cli/CHANGELOG.md create mode 100755 @skills/redocly-cli/packages/cli/bin/cli.js create mode 100644 @skills/redocly-cli/packages/cli/package.json create mode 100644 @skills/redocly-cli/packages/cli/scripts/build.mjs create mode 100644 @skills/redocly-cli/packages/cli/scripts/prepare-publish-dir.mjs create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/build-docs.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/bundle.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/drift/schema-rule.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/drift/schema-validator.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/drift/security-rule.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/generate-arazzo.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/join.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/lint.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/respect/create-network-dispatcher.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/respect/har-logs/create-har-log.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/respect/har-logs/helpers/add-headers.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/respect/har-logs/helpers/build-headers.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/respect/har-logs/helpers/build-request-cookies.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/respect/har-logs/helpers/build-response-cookies.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/respect/har-logs/helpers/get-duration.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/respect/har-logs/with-har.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/respect/mtls/resolve-mtls-certificates.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/commands/respect/respect.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/fetch-with-timeout.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/fixtures/config.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/fixtures/join/documents.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/fixtures/openapi.json create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/fixtures/openapi.yaml create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/fixtures/redocly.yaml create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/spinner.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/utils.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/utils/read-env-variables.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/utils/telemetry.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/__tests__/wrapper.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/auth/__tests__/device-flow.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/auth/__tests__/oauth-client.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/auth/device-flow.ts create mode 100644 @skills/redocly-cli/packages/cli/src/auth/oauth-client.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/auth.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/build-docs/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/build-docs/types.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/build-docs/utils.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/bundle.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/README.md create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/engine/reporter.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/engine/runner.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/engine/schema-validator.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/engine/validation-session.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/log-formats/har.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/log-formats/helpers.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/log-formats/kong.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/log-formats/ndjson.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/log-formats/registry.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/log-formats/webserver-json.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/openapi/loader.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/openapi/matcher.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/rules/builtins/owasp.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/rules/builtins/schema.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/rules/builtins/security.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/rules/builtins/undocumented-endpoint.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/rules/registry.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/types/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/utils/args.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/utils/files.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/utils/finding-groups.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/utils/http.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/utils/openapi.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/drift/utils/server.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/eject.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-arazzo.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/README.md create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/__tests__/__snapshots__/prompt.test.ts.snap create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/__tests__/components.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/__tests__/generator.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/__tests__/prompt.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/__tests__/providers.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/__tests__/refine.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/__tests__/samples.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/__tests__/value-inference.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/ai/PROMPT_TESTING.md create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/ai/prompt.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/ai/providers.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/ai/refine.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/components.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/generator.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/samples.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/generate-spec/value-inference.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/types.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/add-components-prefix.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/add-info-section.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/add-prefix.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/add-security-prefix.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/collect-components.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/collect-external-docs.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/collect-paths.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/collect-webhooks.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/duplicate-tag-description-warning.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/filter-conflicts.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/format-tags.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/get-api-filename.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/get-info-prefix.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/iterate-potential-conflicts.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/populate-tags.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/prefix-tag-suggestion.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/replace-$-refs.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/join/utils/show-conflicts.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/lint.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/preview-project/constants.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/preview-project/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/preview-project/types.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/proxy/README.md create mode 100644 @skills/redocly-cli/packages/cli/src/commands/proxy/har-writer.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/proxy/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/proxy/server.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/__tests__/json-logs.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/connection-client.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/display-files-summary-table.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/har-logs/README.md create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/har-logs/har-logs.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/har-logs/helpers/add-headers.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/har-logs/helpers/build-headers.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/har-logs/helpers/build-request-cookies.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/har-logs/helpers/build-response-cookies.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/har-logs/helpers/get-duration.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/har-logs/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/har-logs/with-har.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/json-logs.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/mtls/resolve-mtls-certificates.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/respect/mtls/validate-mtls-command-option.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/__tests__/collect-metrics-helper.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/__tests__/dependency-graph.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/__tests__/document-metrics.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/__tests__/example-coverage.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/__tests__/hotspots.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/__tests__/index.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/__tests__/scoring.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/collect-metrics.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/collectors/dependency-graph.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/collectors/document-metrics.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/constants.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/formatters/json.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/formatters/stylish.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/hotspots.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/scoring.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/types.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/score/utils.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/__tests__/checkstyle-formatter.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/__tests__/fetch-scorecard.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/__tests__/json-formatter.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/__tests__/junit-formatter.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/__tests__/login-handler.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/__tests__/plugin-evaluator.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/__tests__/project-url.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/__tests__/stylish-formatter.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/__tests__/targets-handler.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/__tests__/validate-scorecard.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/auth/login-handler.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/formatters/checkstyle-formatter.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/formatters/json-formatter.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/formatters/junit-formatter.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/formatters/stylish-formatter.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/remote/fetch-scorecard.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/targets-handler/targets-handler.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/types.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/validation/plugin-evaluator.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/validation/project-url.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/scorecard-classic/validation/validate-scorecard.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/__tests__/assert-within-dir.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/__tests__/fixtures/asyncapi2.json create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/__tests__/fixtures/asyncapi3.json create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/__tests__/fixtures/path-traversal-paths.json create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/__tests__/fixtures/path-traversal.json create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/__tests__/fixtures/samples.json create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/__tests__/fixtures/spec.json create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/__tests__/fixtures/webhooks.json create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/__tests__/index.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/asyncapi/constants.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/asyncapi/find-asyncapi-component-types.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/asyncapi/gather-asyncapi-component-files.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/asyncapi/iterate-asyncapi-channels.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/asyncapi/iterate-asyncapi-components.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/asyncapi/iterate-asyncapi-operations.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/asyncapi/remove-asyncapi-empty-components.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/asyncapi/split-asyncapi-definition.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/constants.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/oas/constants.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/oas/split-oas-definition.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/types.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/assert-within-dir.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/crawl.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/create-component-dir.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/does-file-differ.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/extract-filename-from-path.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/find-component-type.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/gather-components-files.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/get-file-name-path.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/implicitly-reference-discriminator.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/is-not-security-component-type.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/iterate-components.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/iterate-path-items.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/remove-empty-components.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/replace-$-refs.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/replace-channel-refs.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/starts-with-components.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/split/utils/traverse-directory-deep.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/stats/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/stats/print-stats/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/stats/print-stats/json.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/stats/print-stats/markdown.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/stats/print-stats/stylish.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/stats/visitor-and-accumulator-resolver.ts create mode 100644 @skills/redocly-cli/packages/cli/src/commands/translations.ts create mode 100644 @skills/redocly-cli/packages/cli/src/custom.d.ts create mode 100644 @skills/redocly-cli/packages/cli/src/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/api/__tests__/api-keys.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/api/__tests__/api.client.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/api/__tests__/domains.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/api/api-client.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/api/api-keys.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/api/domains.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/api/index.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/api/types.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/commands/__tests__/push-status.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/commands/__tests__/push.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/commands/__tests__/utils.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/commands/push-status.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/commands/push.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/commands/utils.ts create mode 100644 @skills/redocly-cli/packages/cli/src/reunite/utils.ts create mode 100644 @skills/redocly-cli/packages/cli/src/types.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/__tests__/json-stringify-with-array-buffer.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/__tests__/telemetry.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/__tests__/validate-mount-path.test.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/assert-node-version.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/constants.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/error.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/fetch-with-timeout.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/get-command-name-from-args.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/json-stringify-with-array-buffer.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/miscellaneous.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/network-check.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/otel.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/package.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/platform.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/proxy-agent.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/read-env-variables.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/spinner.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/strip-ansi-codes.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/telemetry.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/update-version-notifier.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/validate-mount-path.ts create mode 100644 @skills/redocly-cli/packages/cli/src/utils/validate-positive-number.ts create mode 100644 @skills/redocly-cli/packages/cli/src/wrapper.ts create mode 100644 @skills/redocly-cli/packages/cli/tsconfig.json create mode 100644 @skills/redocly-cli/packages/core/.npmignore create mode 100644 @skills/redocly-cli/packages/core/CHANGELOG.md create mode 100644 @skills/redocly-cli/packages/core/README.md create mode 100644 @skills/redocly-cli/packages/core/__tests__/utils.ts create mode 100644 @skills/redocly-cli/packages/core/package.json create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/__snapshots__/bundle-oas.test.ts.snap create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/__snapshots__/bundle.test.ts.snap create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/__snapshots__/redocly-yaml.test.ts.snap create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/arazzo1_1.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/bundle-examples-ref-resolution.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/bundle-oas.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/bundle.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/codeframes.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/detect-spec.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/entity.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/.redocly.lint-ignore.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/concurrent-lint/common.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/concurrent-lint/spec-a.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/concurrent-lint/spec-b.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/discriminator-mapping-file-refs/components/schemas/discriminated.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/discriminator-mapping-file-refs/components/schemas/type-a.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/discriminator-mapping-file-refs/components/schemas/type-b.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/discriminator-mapping-file-refs/openapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/example-data.json create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/extension.js create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/lint-with-refs-and-plugins/config-with-plugin.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/lint-with-refs-and-plugins/config-with-ref-to-plugin.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/lint-with-refs-and-plugins/custom-plugin.js create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/lint/openapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/local-plugin.js create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/redocly.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/component-a.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/component-b.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/definitions.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/examples.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/external-media-types.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/external-ref-with-dots.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/external-request-body.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/externalref.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/hosted.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/openapi-bundle-external-schema-names-and-user-conflict.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/openapi-with-external-refs-pointer-conflicting-names.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/openapi-with-external-refs-x-query.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/openapi-with-special-names-in-props.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/param-b.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/param-c.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/rename.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/requestBody.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/schema-a.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/simple.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/testMediaType.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/title-naming-collision/openapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/title-naming-collision/schemas/a/User.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/title-naming-collision/schemas/b/User.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/title-naming-missing-title/openapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/title-naming-missing-title/schemas/NoTitle.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/title-naming-unsupported-title/openapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/title-naming-unsupported-title/schemas/Sample.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/title-naming/openapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/title-naming/schemas/models/Authority.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/title-naming/schemas/requests/Authority.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/refs/vendor.schema.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/External.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/External2.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/description.md create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/externalInfo.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/externalLicense.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/openapi-with-back.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/openapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/schemas/type-a.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/schemas/type-b.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/transitive/a.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/transitive/components.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/resolve/transitive/schemas.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/self-file-refs/async2.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/self-file-refs/async3-nested.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/self-file-refs/async3-root.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/self-file-refs/oas2.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/self-file-refs/oas3-nested.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/self-file-refs/oas3-root.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/sibling-refs/arazzo.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/sibling-refs/asyncapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/sibling-refs/description.md create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/sibling-refs/openapi-non-summary-desc-ref.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/sibling-refs/openapi-request-body.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/sibling-refs/openapi-with-description-ref.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/sibling-refs/openapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/fixtures/sibling-refs/summary.md create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/format.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/js-yaml.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/lint-entity.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/lint.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/logger-browser.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/logger.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/normalizeVisitors.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/openrpc.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/output-browser.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/output.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/redocly-yaml.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/ref-utils.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/resolve-http.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/resolve.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/utils-browser.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/utils.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/__tests__/walk.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/bundle/bundle-document.ts create mode 100644 @skills/redocly-cli/packages/core/src/bundle/bundle-oas.ts create mode 100644 @skills/redocly-cli/packages/core/src/bundle/bundle-visitor.ts create mode 100755 @skills/redocly-cli/packages/core/src/bundle/bundle.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/__snapshots__/config.test.ts.snap create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/__snapshots__/load.test.ts.snap create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/arazzo1_1-config.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/config-resolvers.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/config.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/gold.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/ignore-file/.redocly.lint-ignore.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/ignore-file/api.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/ignore-file/redocly.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/load-external.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/load-redocly-with-scorecard-classic.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/load-redocly-with-scorecards.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/load-redocly.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/plugin-config.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/plugin.cjs create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/api/plugin.js create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-commonjs-export-function.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-esm.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-plugin-init.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-realm-plugin.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/local-config.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/plugin-esm.mjs create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/plugin-with-deps-helper.cjs create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/plugin-with-deps.cjs create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/plugin-with-export-function.cjs create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/plugin-with-init-logic.cjs create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/plugin-with-init-logic.js create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/plugin.js create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/realm-plugin.cjs create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-config/sd.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-refs-in-config/config-with-refs.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-refs-in-config/rules.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-refs-in-config/seo.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/load.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/plugins-cache.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/resolve-plugins.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/__tests__/utils.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/all.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/builtIn.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/bundle-extends.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/config-resolvers.ts create mode 100755 @skills/redocly-cli/packages/core/src/config/config.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/constants.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/get-resolve-config.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/group-assertion-rules.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/load.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/minimal.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/plugins-cache.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/recommended-strict.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/recommended.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/rules.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/spec.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/types.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/utils.ts create mode 100644 @skills/redocly-cli/packages/core/src/config/visitors.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/__tests__/filter-in.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/__tests__/filter-out.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/__tests__/fixtures/filter-in/admin-schema.yaml create mode 100644 @skills/redocly-cli/packages/core/src/decorators/__tests__/fixtures/filter-in/admin.yaml create mode 100644 @skills/redocly-cli/packages/core/src/decorators/__tests__/fixtures/filter-in/openapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/decorators/__tests__/fixtures/filter-in/user-schema.yaml create mode 100644 @skills/redocly-cli/packages/core/src/decorators/__tests__/media-type-examples-override.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/__tests__/remove-x-internal.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/__tests__/resources/request.yaml create mode 100644 @skills/redocly-cli/packages/core/src/decorators/__tests__/resources/response.yaml create mode 100644 @skills/redocly-cli/packages/core/src/decorators/arazzo/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/async2/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/async3/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/common/filters/filter-helper.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/common/filters/filter-in.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/common/filters/filter-out.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/common/info-description-override.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/common/info-override.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/common/operation-description-override.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/common/remove-x-internal.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/common/tag-description-override.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas2/__tests__/fixtures/handle-invalid-ref/schemas.yaml create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas2/__tests__/fixtures/handle-invalid-ref/swagger.yaml create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas2/__tests__/remove-unused-components.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas2/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas2/remove-unused-components.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas3/__tests__/fixtures/handle-invalid-ref/openapi.yaml create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas3/__tests__/fixtures/handle-invalid-ref/schemas.yaml create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas3/__tests__/remove-unused-components.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas3/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas3/media-type-examples-override.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/oas3/remove-unused-components.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/openrpc/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/decorators/overlay1/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/detect-spec.ts create mode 100644 @skills/redocly-cli/packages/core/src/env.ts create mode 100644 @skills/redocly-cli/packages/core/src/errors/yaml-parse-error.ts create mode 100644 @skills/redocly-cli/packages/core/src/format/codeframes.ts create mode 100644 @skills/redocly-cli/packages/core/src/format/format.ts create mode 100644 @skills/redocly-cli/packages/core/src/graphql/assertions.ts create mode 100644 @skills/redocly-cli/packages/core/src/graphql/detect-graphql.ts create mode 100644 @skills/redocly-cli/packages/core/src/graphql/lint-graphql.ts create mode 100644 @skills/redocly-cli/packages/core/src/graphql/node-kinds.ts create mode 100644 @skills/redocly-cli/packages/core/src/graphql/visitor.ts create mode 100644 @skills/redocly-cli/packages/core/src/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/js-yaml/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/lint-entity.ts create mode 100755 @skills/redocly-cli/packages/core/src/lint.ts create mode 100644 @skills/redocly-cli/packages/core/src/logger.ts create mode 100644 @skills/redocly-cli/packages/core/src/oas-types.ts create mode 100644 @skills/redocly-cli/packages/core/src/ref-utils.ts create mode 100644 @skills/redocly-cli/packages/core/src/resolve.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/__tests__/ajv.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/__tests__/spec-ruleset.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/__tests__/utils.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/ajv.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/criteria-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/no-criteria-xpath.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/no-x-security-scheme-name-without-openapi.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/outputs-defined.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/parameters-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/requestBody-replacements-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/source-description-type.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/sourceDescription-name-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/sourceDescriptions-not-empty.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/spec-step-mutually-exclusive-fields.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/step-onFailure-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/step-onSuccess-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/stepId-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/workflow-dependsOn.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/workflowId-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/__tests__/x-security-scheme-required-values.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/criteria-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/outputs-defined.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/parameters-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/requestBody-replacements-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/sourceDescription-type.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/sourceDescriptions-name-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/sourceDescriptions-not-empty.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/spec-step-mutually-exclusive-fields.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/step-onFailure-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/step-onSuccess-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/stepId-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/workflow-dependsOn.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/arazzo/workflowId-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async2/__tests__/channels-kebab-case.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async2/__tests__/no-channel-trailing-slash.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async2/channels-kebab-case.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async2/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async2/no-channel-trailing-slash.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async3/__tests__/channels-kebab-case.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async3/__tests__/no-channel-trailing-slash.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async3/__tests__/security-scopes-defined.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async3/channels-kebab-case.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async3/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async3/no-channel-trailing-slash.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/async3/security-scopes-defined.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/catalog-entity/__tests__/entity-key-valid.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/catalog-entity/entity-key-valid.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/fixtures/code-sample.php create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/fixtures/invalid-yaml.yaml create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/fixtures/ref.yaml create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/info-license-strict.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/info-license.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-ambiguous-paths.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-duplicated-tag-names.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-enum-type-mismatch.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-http-verbs-in-paths.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-identical-paths.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-invalid-parameter-examples.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-invalid-schema-examples.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-path-trailing-slash.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-required-schema-properties-undefined.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-schema-type-mismatch.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/no-unresolved-refs.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/operation-2xx-response.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/operation-4xx-response.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/operation-operationId-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/operation-operationId-url-safe.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/operation-parameters-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/operation-singular-tag.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/operation-tag-defined.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/path-http-verbs-order.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/path-not-include-query.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/path-params-defined.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/paths-kebab-case.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/scalar-property-missing-example.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/security-defined.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/security-scopes-defined.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/spec-strict-refs.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/struct.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/tag-description.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/__tests__/tags-alphabetical.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/assertions/__tests__/asserts.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/assertions/__tests__/index.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/assertions/__tests__/utils.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/assertions/asserts.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/assertions/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/assertions/utils.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/info-contact.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/info-license-strict.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/info-license.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-ambiguous-paths.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-duplicated-tag-names.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-enum-type-mismatch.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-http-verbs-in-paths.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-identical-paths.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-invalid-parameter-examples.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-invalid-schema-examples.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-mixed-number-range-constraints.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-path-trailing-slash.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-required-schema-properties-undefined.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-schema-type-mismatch.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/no-unresolved-refs.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/operation-2xx-response.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/operation-4xx-response.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/operation-description.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/operation-operationId-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/operation-operationId-url-safe.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/operation-operationId.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/operation-parameters-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/operation-singular-tag.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/operation-summary.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/operation-tag-defined.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/parameter-description.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/path-declaration-must-exist.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/path-http-verbs-order.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/path-not-include-query.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/path-params-defined.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/path-segment-plural.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/paths-kebab-case.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/required-string-property-missing-min-length.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/response-contains-header.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/scalar-property-missing-example.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/security-defined.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/security-scopes-defined.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/spec-strict-refs.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/struct.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/tag-description.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/common/tags-alphabetical.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/graphql/__tests__/assertions.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/graphql/__tests__/graphql.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/graphql/__tests__/no-unused-types.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/graphql/__tests__/type-description.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/graphql/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/graphql/no-unused-types.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/graphql/struct.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/graphql/type-description.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/__tests__/response-contains-header.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/__tests__/response-contains-property.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/__tests__/struct/fixtures/description.md create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/__tests__/struct/info.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/__tests__/struct/operation.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/__tests__/struct/paths.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/__tests__/struct/referenceableScalars.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/__tests__/struct/utils.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/boolean-parameter-prefixes.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/request-mime-type.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/response-contains-property.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas2/response-mime-type.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/array-parameter-serialization.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/component-name-unique.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/fixtures/common.yaml create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/fixtures/external-value.yaml create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/no-mixed-number-range-constraints.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/no-server-example.com.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/no-undefined-server-variables.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/no-unused-components.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/operation-4xx-problem-details-rfc7807.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/response-contains-header.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/response-contains-property.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/spec-discriminator-defaultMapping.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/spec-example-values.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/spec-no-invalid-encoding-combinations.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/spec-no-invalid-tag-parents.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/spec-querystring-parameters.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/struct/callbacks.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/struct/fixtures/description.md create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/struct/info.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/struct/operation.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/struct/paths.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/struct/referenceableScalars.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/struct/servers.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/struct/struct.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/struct/utils.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/__tests__/utils/lint-document-for-test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/array-parameter-serialization.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/boolean-parameter-prefixes.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/component-name-unique.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/no-empty-servers.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/no-example-value-and-externalValue.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/no-invalid-media-type-examples.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/no-server-example.com.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/no-server-trailing-slash.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/no-server-variables-empty-enum.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/no-undefined-server-variable.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/no-unused-components.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/nullable-type-sibling.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/operation-4xx-problem-details-rfc7807.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/request-mime-type.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/response-contains-property.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/response-mime-type.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/spec-components-invalid-map-name.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/spec-discriminator-defaultMapping.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/spec-example-values.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/spec-no-invalid-encoding-combinations.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/spec-no-invalid-tag-parents.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/oas3/spec-querystring-parameters.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/openrpc/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/openrpc/no-unused-components.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/openrpc/spec-no-duplicated-method-params.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/openrpc/spec-no-required-params-after-optional.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/other/stats.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/overlay1/__tests__/info-contact.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/overlay1/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/respect/__tests__/no-x-security-both-scheme-and-schemeName.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/respect/__tests__/x-security-scheme-name-reference.test.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/respect/no-criteria-xpath.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/respect/no-x-security-both-scheme-and-scheme-name.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/respect/no-x-security-scheme-name-without-openapi.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/respect/x-security-scheme-name-reference.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/respect/x-security-scheme-required-values.ts create mode 100644 @skills/redocly-cli/packages/core/src/rules/utils.ts create mode 100755 @skills/redocly-cli/packages/core/src/types/arazzo.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/arazzo1_1.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/asyncapi-bindings.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/asyncapi2.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/asyncapi3.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/entity.ts create mode 100755 @skills/redocly-cli/packages/core/src/types/index.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/json-schema-adapter.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/json-schema-draft7.shared.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/oas2.ts create mode 100755 @skills/redocly-cli/packages/core/src/types/oas3.ts create mode 100755 @skills/redocly-cli/packages/core/src/types/oas3_1.ts create mode 100755 @skills/redocly-cli/packages/core/src/types/oas3_2.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/openrpc.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/overlay.ts create mode 100644 @skills/redocly-cli/packages/core/src/types/redocly-yaml.ts create mode 100644 @skills/redocly-cli/packages/core/src/typings/arazzo.ts create mode 100644 @skills/redocly-cli/packages/core/src/typings/asyncapi.ts create mode 100644 @skills/redocly-cli/packages/core/src/typings/asyncapi3.ts create mode 100644 @skills/redocly-cli/packages/core/src/typings/common.ts create mode 100644 @skills/redocly-cli/packages/core/src/typings/openapi.ts create mode 100644 @skills/redocly-cli/packages/core/src/typings/openrpc.ts create mode 100644 @skills/redocly-cli/packages/core/src/typings/overlay.ts create mode 100644 @skills/redocly-cli/packages/core/src/typings/swagger.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/assign-config.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/dequal.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/does-yaml-file-exist.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/error.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/get-intersection-length.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/get-matching-status-code-range.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/get-own.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/identity.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-custom-rule-id.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-defined.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-empty-array.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-empty-object.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-not-empty-array.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-not-empty-object.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-not-string.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-ordered.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-path-parameter.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-plain-object.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-string.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-supported-extension.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/is-truthy.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/keys-of.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/make-ref-id.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/next-tick.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/oas-has-component.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/omit.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/pause.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/pluralize.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/read-file-from-url.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/regex-from-string.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/scorecards.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/slash.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/split-camel-case-into-words.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/stack.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/to-pascal-case.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/types.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/validate-mime-type.ts create mode 100644 @skills/redocly-cli/packages/core/src/utils/yaml-fs-helper.ts create mode 100644 @skills/redocly-cli/packages/core/src/visitors.ts create mode 100644 @skills/redocly-cli/packages/core/src/walk.ts create mode 100644 @skills/redocly-cli/packages/core/tsconfig.json create mode 100644 @skills/redocly-cli/packages/respect-core/.gitignore create mode 100644 @skills/redocly-cli/packages/respect-core/.npmignore create mode 100644 @skills/redocly-cli/packages/respect-core/CHANGELOG.md create mode 100644 @skills/redocly-cli/packages/respect-core/README.md create mode 100644 @skills/redocly-cli/packages/respect-core/package.json create mode 100644 @skills/redocly-cli/packages/respect-core/src/__tests__/run.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/arazzo-schema.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/generate.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/arazzo-description-generator/cleanup-test-description.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/arazzo-description-generator/generate-arazzo-description.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/arazzo-description-generator/generate-example-value.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/arazzo-description-generator/generate-inputs-arazzo-components.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/arazzo-description-generator/generate-test-data-from-json-schema.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/arazzo-description-generator/generate-workflow-security-inputs.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/arazzo-description-generator/generate-workflow-security-parameters.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/checks/severity.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/config-parser/auto-with-lint-errors.yaml create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/config-parser/auto.yaml create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/config-parser/get-security-parameters.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/config-parser/get-value-from-context.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/config-parser/handle-request-body-replacements.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/config-parser/parse-parameters.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/config-parser/parse-request-body.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/config-parser/resolve-reusable-component-item.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/config-parser/resolve-reusable-object-reference.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/config-parser/resolve-workflow-reference.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/description-parser/get-operation-from-description.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/description-parser/get-request-body-schema.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/description-parser/get-request-data-from-openapi.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/description-parser/get-response-schema.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/faker.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/__snapshots__/run-step.test.ts.snap create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/call-api-and-analyze-results.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/context/__snapshots__/create-runtime-expression-ctx.test.ts.snap create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/context/create-runtime-expression-ctx.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/context/create-test-context.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/error-message-matcher.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/get-server-url.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/get-workflows-to-run.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/inputs/format-cli-inputs.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/inputs/map-input-values-to-schema.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/outputs/print-message.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/prepare-request.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/resolve-running-workflows.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/resolve-security-scheme.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/resolve-x-security-parameters.ts.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/run-step.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/runner/__snapshots__/create-workflow-runner.test.ts.snap create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/runner/__snapshots__/run-test-file.test.ts.snap create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/runner/create-workflow-runner.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/runner/resolve-workflow-context.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/runner/run-test-file.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/schema/schema-checker.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/success-criteria/check-success-criteria.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/success-criteria/validate-success-criteria.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/flow-runner/validate-x-security-parameters.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/logger-output/display-checks.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/logger-output/helpers.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/logger-output/mask-secrets.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/runtime-expressions/evaluate.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/runtime-expressions/lint.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/runtime-expressions/replace-json-pointers.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/__tests__/timeout-timer/timer.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/arazzo-description-generator/cleanup-test-description.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/arazzo-description-generator/generate-arazzo-description.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/arazzo-description-generator/generate-example-value.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/arazzo-description-generator/generate-inputs-arazzo-components.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/arazzo-description-generator/generate-test-data-from-json-schema.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/arazzo-description-generator/generate-workflow-security-inputs.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/arazzo-description-generator/generate-workflow-security-parameters.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/arazzo-description-generator/generate-workflows-from-description.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/arazzo-description-generator/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/checks/checks.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/checks/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/checks/severity.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/context-parser/get-security-parameters.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/context-parser/get-value-from-context.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/context-parser/handle-request-body-replacements.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/context-parser/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/context-parser/parse-parameters.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/context-parser/parse-request-body.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/context-parser/resolve-reusable-component.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/context-parser/resolve-reusable-object-reference.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/context-parser/resolve-workflow-reference.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/description-parser/bundle-openapi.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/description-parser/extract-first-example.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/description-parser/get-operation-by-id.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/description-parser/get-operation-by-path.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/description-parser/get-operation-from-description.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/description-parser/get-request-body-schema.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/description-parser/get-request-data-from-openapi.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/description-parser/get-response-schema.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/description-parser/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/faker.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/call-api-and-analyze-results.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/context/create-runtime-expression-ctx.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/context/create-test-context.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/context/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/context/set-public-steps.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/context/set-public-workflows.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/error-message-matcher.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/get-server-url.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/get-test-description-from-file.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/get-workflows-to-run.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/inputs/format-cli-inputs.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/inputs/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/inputs/map-input-values-to-schema.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/outputs/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/outputs/print-message.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/prepare-request.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/resolve-running-workflows.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/resolve-security-scheme.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/resolve-x-security-parameters.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/run-step.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/runner.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/schema/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/schema/schema-checker.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/success-criteria/check-success-criteria.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/success-criteria/evaluate-jsonpath-condition.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/success-criteria/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/success-criteria/validate-success-criteria.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/flow-runner/validate-x-security-parameters.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/logger-output/calculate-tests-passed.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/logger-output/display-checks.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/logger-output/display-errors.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/logger-output/display-summary.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/logger-output/helpers.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/logger-output/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/logger-output/mask-secrets.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/logger-output/verbose-logs.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/runtime-expressions/abnf-parser.pegjs create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/runtime-expressions/evaluate.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/runtime-expressions/index.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/runtime-expressions/lint.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/runtime-expressions/replace-json-pointers.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/modules/timeout-timer/timer.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/run.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/types.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/__snapshots__/ajv-errors.test.ts.snap create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/ajv-errors.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/api-fetcher.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/check-circular-refs-in-schema.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/clean-colors.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/deep-copy.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/digest-auth/generate-digest-auth-header.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/digest-auth/parse-www-authenticate-header.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/file.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/get-nested-value.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/is-binary-content-type.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/is-empty.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/is-json.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/sort.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/time.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/url-encoding.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/__tests__/url.test.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/ajv-errors.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/api-fetcher.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/binary-content-type-checker.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/check-circular-refs-in-schema.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/clean-colors.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/deep-copy.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/delay.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/digest-auth/generate-digest-auth-header.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/digest-auth/parse-www-authenticate-header.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/file.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/get-nested-value.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/is-empty.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/is-json.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/sort.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/time.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/url-encoding.ts create mode 100644 @skills/redocly-cli/packages/respect-core/src/utils/url.ts create mode 100644 @skills/redocly-cli/packages/respect-core/tsconfig.json create mode 100644 @skills/redocly-cli/plugins/oxlint-redocly-plugin.js create mode 100644 @skills/redocly-cli/resources/.redocly.lint-ignore.yaml create mode 100644 @skills/redocly-cli/resources/async.yaml create mode 100644 @skills/redocly-cli/resources/asyncapi3.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/cafe.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/parameters/After.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/parameters/Before.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/parameters/Filter.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/parameters/Limit.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/parameters/MenuItemId.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/parameters/OrderId.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/parameters/PhotoSize.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/parameters/Search.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/parameters/Sort.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/responses/BadRequest.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/responses/Conflict.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/responses/Forbidden.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/responses/InternalServerError.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/responses/NotFound.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/responses/Unauthorized.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/Beverage.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/Dessert.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/Error.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/MenuBaseItem.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/MenuItem.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/MenuItemList.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/OAuth2Client.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/Order.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/OrderItem.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/OrderList.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/OrderNotification.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/OrderStatus.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/Page.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/RegisterClientObject.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/components/schemas/RevenueStatistics.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/paths/menu-item-images_{menuItemId}.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/paths/menu.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/paths/menu_{menuItemId}.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/paths/oauth2_register.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/paths/order-items.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/paths/orders.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/paths/orders_{orderId}.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/paths/revenue.yaml create mode 100644 @skills/redocly-cli/resources/cafe-split/webhooks/order-notification.yaml create mode 100644 @skills/redocly-cli/resources/cafe.yaml create mode 100644 @skills/redocly-cli/resources/description.md create mode 100644 @skills/redocly-cli/resources/local-plugin.js create mode 100644 @skills/redocly-cli/resources/museum-api.arazzo.yaml create mode 100644 @skills/redocly-cli/resources/museum-tickets.arazzo.yaml create mode 100644 @skills/redocly-cli/resources/museum.yaml create mode 100644 @skills/redocly-cli/resources/overlay.yaml create mode 100644 @skills/redocly-cli/resources/pets.yaml create mode 100644 @skills/redocly-cli/resources/petstore-with-errors.yaml create mode 100644 @skills/redocly-cli/resources/redocly.yaml create mode 100644 @skills/redocly-cli/scripts/add-cli-dependency-changesets.js create mode 100755 @skills/redocly-cli/scripts/local-pack.sh create mode 100644 @skills/redocly-cli/scripts/post-changeset.js create mode 100644 @skills/redocly-cli/scripts/release-publish.mjs create mode 100644 @skills/redocly-cli/scripts/write-release-message.js create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs-with-config-option/index.hbs create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs-with-config-option/nested/message-schema.yaml create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs-with-config-option/nested/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs-with-config-option/nested/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs-with-config-option/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs-with-disabled-search/config-with-alias.yaml create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs-with-disabled-search/config-with-apis-and-root-option.yaml create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs-with-disabled-search/config.yaml create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs-with-disabled-search/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs-with-disabled-search/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/build-docs.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/redoc-sri/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/redoc-sri/redoc-sri.test.ts create mode 120000 @skills/redocly-cli/tests/e2e/build-docs/simple-build-docs/pets.yaml create mode 100644 @skills/redocly-cli/tests/e2e/build-docs/simple-build-docs/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/async3-internal-ref-chains/asyncapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/async3-internal-ref-chains/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/async3-internal-ref-chains/schemas.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/async3-internal-ref-chains/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/async3/UserSignedUp.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/async3/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/async3/simple.yml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/async3/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-anchor/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-anchor/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-anchor/test.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-arazzo-valid-test-description/museum.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-arazzo-valid-test-description/parameter.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-arazzo-valid-test-description/request-body.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-arazzo-valid-test-description/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-description-dereferenced/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-description-dereferenced/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-description-dereferenced/snapshot_2.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-description-dereferenced/test.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-description-long/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-description-long/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-description-long/snapshot_2.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-description-long/test.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-example-value-with-ref/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-example-value-with-ref/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-example-value-with-ref/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-external-value/external-value.json create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-external-value/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-external-value/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-external-value/test-success.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-external-value/test-wrong-examples.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-no-output-without-inline-apis/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-no-output-without-inline-apis/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-no-output-without-inline-apis/test.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-oas3_2/components/schemas/Foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-oas3_2/components/schemas/Used.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-oas3_2/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-oas3_2/paths/_.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-oas3_2/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-oas3_2/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas2-without-option/keep-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas2-without-option/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas2-without-option/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas2/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas2/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas2/remove-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3-turn-off-with-flag/keep-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3-turn-off-with-flag/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3-turn-off-with-flag/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3-with-decorator-off/keep-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3-with-decorator-off/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3-with-decorator-off/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3-without-option/keep-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3-without-option/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3-without-option/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-api-config/oas3/remove-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas2-without-option/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas2-without-option/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas2-without-option/ref.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas2-without-option/without-remove-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas2/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas2/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas2/ref.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas2/remove-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema-with-unused-schema-opposite-ref/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema-with-unused-schema-opposite-ref/parameters.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema-with-unused-schema-opposite-ref/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema-with-unused-schema-opposite-ref/schemas.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema-with-unused-schema-opposite-ref/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema-with-unused-schema-same-ref/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema-with-unused-schema-same-ref/parameters.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema-with-unused-schema-same-ref/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema-with-unused-schema-same-ref/schemas.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema-with-unused-schema-same-ref/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema/parameters.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema/schemas.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-parameter-ref-to-schema/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-recursive-ref/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-recursive-ref/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-recursive-ref/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-without-option/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-without-option/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-without-option/ref.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3-without-option/without-remove-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3/ref.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components-from-config/oas3/remove-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components/oas2/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components/oas2/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components/oas2/ref.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components/oas2/remove-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components/oas3/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components/oas3/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components/oas3/ref.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-remove-unused-components/oas3/remove-unused-components-snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-use-titles-for-component-names-collision/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-use-titles-for-component-names-collision/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-use-titles-for-component-names-collision/schemas/a/User.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-use-titles-for-component-names-collision/schemas/b/User.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-use-titles-for-component-names-collision/snapshot-off.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle-use-titles-for-component-names-collision/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/bundle.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/bundle/discriminator-mapping/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/discriminator-mapping/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/discriminator-mapping/main.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/discriminator-mapping/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/discriminator-mapping/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/discriminator-mapping/snapshot_2.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/info-description-override-error/main.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/info-description-override-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/info-description-override-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/info-description-override/main.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/info-description-override/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/info-description-override/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/info-description-override/test.md create mode 100644 @skills/redocly-cli/tests/e2e/bundle/info-override/main.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/info-override/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/info-override/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/media-type-examples-override/examples/request.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/media-type-examples-override/examples/response.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/media-type-examples-override/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/media-type-examples-override/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/media-type-examples-override/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-duplicated-components/Test.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-duplicated-components/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-duplicated-components/paths/path.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-duplicated-components/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-duplicated-components/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-components/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-components/parameters/PetId.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-components/parameters/_index.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-components/paths/Pet.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-components/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-components/schemas/Pet.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-components/schemas/_index.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-components/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-or-duplicated-components/components/schemas.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-or-duplicated-components/folder/myObject.v2.schema.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-or-duplicated-components/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-or-duplicated-components/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/no-self-referenced-or-duplicated-components/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/oas3_1-pattern-porperties/object.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/oas3_1-pattern-porperties/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/oas3_1-pattern-porperties/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/oas3_1-pattern-porperties/test.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/operation-description-override-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/operation-description-override-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/operation-description-override-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/operation-description-override/create-user-operation-description.md create mode 100644 @skills/redocly-cli/tests/e2e/bundle/operation-description-override/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/operation-description-override/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/operation-description-override/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/operation-description-override/update-pet-operation-description.md create mode 100644 @skills/redocly-cli/tests/e2e/bundle/primitive-types/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/primitive-types/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/primitive-types/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/reference-ending-in-hash/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/reference-ending-in-hash/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/reference-ending-in-hash/schemas/Pet.json create mode 100644 @skills/redocly-cli/tests/e2e/bundle/reference-ending-in-hash/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/remove-x-internal/main.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/remove-x-internal/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/remove-x-internal/schemas/candy-cane.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/remove-x-internal/schemas/cranberry.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/remove-x-internal/schemas/popcorn.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/remove-x-internal/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/resolve-refs-from-x-attributes/external.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/resolve-refs-from-x-attributes/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/resolve-refs-from-x-attributes/plugin.cjs create mode 100644 @skills/redocly-cli/tests/e2e/bundle/resolve-refs-from-x-attributes/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/resolve-refs-from-x-attributes/resolve-x.decorator.cjs create mode 100644 @skills/redocly-cli/tests/e2e/bundle/resolve-refs-from-x-attributes/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/self-file-ref-normalization/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/self-file-ref-normalization/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/self-file-ref-normalization/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/sibling-refs-asyncapi/asyncapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/sibling-refs-asyncapi/description.md create mode 100644 @skills/redocly-cli/tests/e2e/bundle/sibling-refs-asyncapi/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/sibling-refs-asyncapi/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/sibling-refs-asyncapi/summary.md create mode 100644 @skills/redocly-cli/tests/e2e/bundle/sibling-refs-oas/description.md create mode 100644 @skills/redocly-cli/tests/e2e/bundle/sibling-refs-oas/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/sibling-refs-oas/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/sibling-refs-oas/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/sibling-refs-oas/summary.md create mode 100644 @skills/redocly-cli/tests/e2e/bundle/tag-description-override-error/main.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/tag-description-override-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/tag-description-override-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/tag-description-override/main.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/tag-description-override/pet-tag-description.md create mode 100644 @skills/redocly-cli/tests/e2e/bundle/tag-description-override/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/bundle/tag-description-override/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/bundle/tag-description-override/store-tag-description.md create mode 100644 @skills/redocly-cli/tests/e2e/check-config/check-config.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/check-config/config-type-extensions-in-assertions/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/check-config/config-type-extensions-in-assertions/plugins/type-extention.cjs create mode 100644 @skills/redocly-cli/tests/e2e/check-config/config-type-extensions-in-assertions/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/check-config/config-type-extensions-in-assertions/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/check-config/empty-config-null/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/check-config/empty-config-null/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/check-config/invalid-config--lint-config-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/check-config/invalid-config--lint-config-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/check-config/invalid-config--lint-config-warn/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/check-config/invalid-config--lint-config-warn/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/check-config/invalid-config--no-option/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/check-config/invalid-config--no-option/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/check-config/valid-config-with-config-option/nested/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/check-config/valid-config-with-config-option/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/check-config/valid-config/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/check-config/valid-config/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/check-config/wrong-config-type-extensions-in-assertions/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/check-config/wrong-config-type-extensions-in-assertions/plugins/type-extention.cjs create mode 100644 @skills/redocly-cli/tests/e2e/check-config/wrong-config-type-extensions-in-assertions/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/check-config/wrong-config-type-extensions-in-assertions/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/format-apache-json.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/format-auto-ndjson.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/format-har.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/format-kong.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/format-nginx-json.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/output-csv.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/output-json.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/output-sarif.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-clean.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-colliding-specs.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-composition.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-host-mismatch.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-min-severity.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-readonly.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-recursive.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-schema-mismatch.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-security.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-server.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/__snapshots__/validate-undocumented.txt create mode 100644 @skills/redocly-cli/tests/e2e/drift/drift.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/apache-access.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/colliding-apis/legacy.yaml create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/colliding-apis/main.yaml create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/composition-openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/nginx-access.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/readonly-openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/recursive-openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/secured-openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic-composition.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic-host-mismatch.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic-matched.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic-missing-auth.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic-mixed-severity.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic-prefixed.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic-readonly.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic-recursive.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic-schema-mismatch.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic-undocumented.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic.har create mode 100644 @skills/redocly-cli/tests/e2e/drift/fixtures/traffic.kong.json create mode 100644 @skills/redocly-cli/tests/e2e/fixtures/constructor-property/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/fixtures/constructor-property/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/__snapshots__/ai-refined-polymorphic.txt create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/__snapshots__/ai-refined.txt create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/__snapshots__/infer-har.txt create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/__snapshots__/infer-id-templates.txt create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/__snapshots__/infer-ndjson.txt create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/__snapshots__/infer-polymorphic.txt create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/__snapshots__/infer-server-scoped.txt create mode 100755 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-bad/claude create mode 100755 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-fail/claude create mode 100755 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-ok-polymorphic/claude create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-ok-polymorphic/fragments/get-payments-paymentId.yaml create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-ok-polymorphic/fragments/post-payments.yaml create mode 100755 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-ok/claude create mode 100755 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-ok/cursor-agent create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-ok/fragments/delete-users-userId.yaml create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-ok/fragments/get-users-userId.yaml create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-ok/fragments/get-users.yaml create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-ok/fragments/post-sessions.yaml create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-ok/fragments/post-users.yaml create mode 100755 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-partial/claude create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/bin-partial/partial.yaml create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/traffic-ids.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/traffic-polymorphic.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/traffic-servers.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/traffic.har create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/fixtures/traffic.ndjson create mode 100644 @skills/redocly-cli/tests/e2e/generate-spec/generate-spec.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/helpers.ts create mode 100644 @skills/redocly-cli/tests/e2e/join/fails-if-component-conflicts/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/fails-if-component-conflicts/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/fails-if-component-conflicts/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/fails-if-no-info-section/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/fails-if-no-info-section/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/fails-if-no-info-section/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/fails-if-tags-duplication/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/fails-if-tags-duplication/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/fails-if-tags-duplication/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/ignore-decorators/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/ignore-decorators/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/ignore-decorators/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/ignore-decorators/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/join.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/join/json-and-yaml-input/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/json-and-yaml-input/foo.json create mode 100644 @skills/redocly-cli/tests/e2e/join/json-and-yaml-input/json-output.snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/json-and-yaml-input/yaml-output.snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/multi-references-to-one-file/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/multi-references-to-one-file/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/multi-references-to-one-file/nested/FooObject.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/multi-references-to-one-file/nested/Response.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/multi-references-to-one-file/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/multi-references-to-one-file/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/multiple-tags-in-same-files/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/multiple-tags-in-same-files/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/multiple-tags-in-same-files/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/oas3.2/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/oas3.2/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/oas3.2/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/prefix-components-with-info-prop/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/prefix-components-with-info-prop/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/prefix-components-with-info-prop/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/prefix-tags-with-filename/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/prefix-tags-with-filename/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/prefix-tags-with-filename/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/prefix-tags-with-info-prop/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/prefix-tags-with-info-prop/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/prefix-tags-with-info-prop/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/reference-in-description/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/reference-in-description/description.md create mode 100644 @skills/redocly-cli/tests/e2e/join/reference-in-description/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/reference-in-description/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/references-in-parameters/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/references-in-parameters/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/references-in-parameters/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/root-security-in-both-specs/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/root-security-in-both-specs/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/root-security-in-both-specs/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/root-security-without-paths/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/root-security-without-paths/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/root-security-without-paths/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/three-files-one-without-servers/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/three-files-one-without-servers/baz.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/three-files-one-without-servers/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/three-files-one-without-servers/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/two-files-with-no-errors/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/two-files-with-no-errors/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/two-files-with-no-errors/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/with-metadata/pet.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/with-metadata/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/with-metadata/test.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/without-x-tag-groups/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/without-x-tag-groups/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/without-x-tag-groups/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/join/yaml-input-and-json-output/bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/yaml-input-and-json-output/foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/join/yaml-input-and-json-output/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/__fixtures__/invalid-openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/__fixtures__/valid-openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-structure/env.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-structure/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-structure/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs-extended/apis.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs-extended/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs-extended/rules.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs-extended/seo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs-extended/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs-extended/theme-openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs-extended/v1.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs/rules.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/config-with-refs/theme-openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config--lint-config-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config--lint-config-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config--lint-config-off/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config--lint-config-off/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config--lint-config-warn/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config--lint-config-warn/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config--no-option/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config--no-option/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config-assertation-config-type/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config-assertation-config-type/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config-format-json/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-config-format-json/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-custom-rule-config/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-custom-rule-config/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-definition-and-config/config-with-error.snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-definition-and-config/config-with-warn.snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-definition-and-config/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-lint-config-severity/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/invalid-lint-config-severity/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint-config/lint-config.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/lint/arazzo-1-1-valid-description/cafe-workflows.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/arazzo-1-1-valid-description/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/arazzo-not-valid-test-description/museum.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/arazzo-not-valid-test-description/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/arazzo-type-extensions-with-plugin/museum.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/arazzo-type-extensions-with-plugin/plugins/type-extention.cjs create mode 100644 @skills/redocly-cli/tests/e2e/lint/arazzo-type-extensions-with-plugin/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/arazzo-type-extensions-with-plugin/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/arazzo-valid-test-description/museum.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/arazzo-valid-test-description/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertion-string-property-min-length/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertion-string-property-min-length/plugin.mjs create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertion-string-property-min-length/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertion-string-property-min-length/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-camel-case-twice/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-camel-case-twice/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-camel-case-twice/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-camel-case-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-camel-case-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-camel-case-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-kebab-case-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-kebab-case-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-kebab-case-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-pascal-case-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-pascal-case-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-pascal-case-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-snake-case-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-snake-case-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-casing-snake-case-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-contains-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-contains-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-contains-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-custom-function-options/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-custom-function-options/plugin.mjs create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-custom-function-options/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-custom-function-options/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-defined-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-defined-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-defined-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-enum-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-enum-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-enum-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-enum-on-keys-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-enum-on-keys-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-enum-on-keys-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-list-types/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-list-types/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-list-types/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-map-types/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-map-types/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-map-types/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-match-parent-keys/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-match-parent-keys/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-match-parent-keys/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-max-length-array-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-max-length-array-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-max-length-array-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-max-length-string-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-max-length-string-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-max-length-string-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-message-placeholders/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-message-placeholders/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-message-placeholders/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-min-length-array-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-min-length-array-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-min-length-array-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-min-length-string-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-min-length-string-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-min-length-string-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-mutually-exclusive-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-mutually-exclusive-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-mutually-exclusive-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-mutually-required-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-mutually-required-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-mutually-required-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-non-empty-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-non-empty-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-non-empty-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-non-empty-off/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-non-empty-off/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-non-empty-off/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-non-empty-warn/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-non-empty-warn/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-non-empty-warn/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-pattern-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-pattern-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-pattern-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-pattern-report-location/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-pattern-report-location/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-pattern-report-location/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-pattern-with-object/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-pattern-with-object/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-pattern-with-object/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-patternProperties/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-patternProperties/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-patternProperties/schema.json create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-patternProperties/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-property-key-not-allowed/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-property-key-not-allowed/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-property-key-not-allowed/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-property-key-required/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-property-key-required/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-property-key-required/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-query-in-parameters/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-query-in-parameters/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-query-in-parameters/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-forbidden-error/components/paths/Owners.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-forbidden-error/components/schemas/Error.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-forbidden-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-forbidden-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-forbidden-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-pattern-error/components/Vets.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-pattern-error/components/paths/Owners.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-pattern-error/components/schemas/Error.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-pattern-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-pattern-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-pattern-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-required-error/components/paths/Owners.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-required-error/components/schemas/Error.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-required-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-required-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-ref-required-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-require-any-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-require-any-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-require-any-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-severity-override-without-extends/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-severity-override-without-extends/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-severity-override-without-extends/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-severity-override-without-extends/snapshot_2.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-severity-override/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-severity-override/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-severity-override/ruleset.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-severity-override/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-severity-override/snapshot_2.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-show-suggestions/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-show-suggestions/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-show-suggestions/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-type-integer-in-parameter/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-type-integer-in-parameter/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-type-integer-in-parameter/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-type-integer-in-schema-response/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-type-integer-in-schema-response/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-type-integer-in-schema-response/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-undefined-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-undefined-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-undefined-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-vendor-extensions/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-vendor-extensions/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions-vendor-extensions/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions/description.md create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/assertions/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/anyof.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/application-headers.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/correlation-id.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/gitter-streaming.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/mercure.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/not.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/oneof.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/operation-security.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/operation-with-tags.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/rpc-client.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/rpc-server.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/simple.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/slack-rtm.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/streetlights-kafka.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/streetlights-mqtt.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/streetlights-operation-security.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async2/websocket-gemini.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/anyof.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/application-headers.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/correlation-id.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/gitter-streaming.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/mercure.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/not.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/oneof.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/operation-security.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/rpc-client.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/rpc-server.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/simple-3-1.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/simple.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/slack-rtm.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/streetlights-kafka.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/streetlights-mqtt.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/streetlights-operation-security.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/async3/websocket-gemini.yml create mode 100644 @skills/redocly-cli/tests/e2e/lint/configurable-rule-with-reference/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/configurable-rule-with-reference/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/configurable-rule-with-reference/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/default-message-override/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/default-message-override/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/default-message-override/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/default-message-override/split/info.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/default-message-override/split/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/default-message-override/split/paths/test.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/draft4-vs-2020-schema-differences/openapi-oas30-draft4.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/draft4-vs-2020-schema-differences/openapi-oas32-2020.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/draft4-vs-2020-schema-differences/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/draft4-vs-2020-schema-differences/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/examples.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/lint/extends-empty-array/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/extends-empty-array/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/extends-empty-array/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/graphql-configurable-rule-redefine-severity-per-api/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/graphql-configurable-rule-redefine-severity-per-api/schema.graphql create mode 100644 @skills/redocly-cli/tests/e2e/lint/graphql-configurable-rule-redefine-severity-per-api/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/graphql-invalid/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/graphql-invalid/schema.graphql create mode 100644 @skills/redocly-cli/tests/e2e/lint/graphql-invalid/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/graphql-valid/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/graphql-valid/schema.graphql create mode 100644 @skills/redocly-cli/tests/e2e/lint/graphql-valid/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-contact--lint-in-apis/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-contact--lint-in-apis/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-contact--lint-in-apis/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-contact-not-present-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-contact-not-present-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-contact-not-present-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-contact/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-contact/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-contact/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-rule-not-present-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-rule-not-present-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-rule-not-present-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-strict-missing-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-strict-missing-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-strict-missing-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-strict-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-strict-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/info-license-strict-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/lint.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/lint/merge-lint-configs/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/merge-lint-configs/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/merge-lint-configs/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/nested-extends-two-level/nested-config-2.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/nested-extends-two-level/nested-config.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/nested-extends-two-level/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/nested-extends-two-level/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/nested-extends-two-level/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/nested-extends/nested-config.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/nested-extends/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/nested-extends/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/nested-extends/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-duplicated-tag-names/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-duplicated-tag-names/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-duplicated-tag-names/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-empty-servers-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-empty-servers-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-empty-servers-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-empty-servers-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-empty-servers-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-empty-servers-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-enum-type-mismatch-error-recommended-config/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-enum-type-mismatch-error-recommended-config/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-enum-type-mismatch-error-recommended-config/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-enum-type-mismatch-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-enum-type-mismatch-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-enum-type-mismatch-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-enum-type-mismatch/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-enum-type-mismatch/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-enum-type-mismatch/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-http-verbs-in-paths-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-http-verbs-in-paths-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-http-verbs-in-paths-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-http-verbs-in-paths-split-words-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-http-verbs-in-paths-split-words-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-http-verbs-in-paths-split-words-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-examples-allow-additional-properties-in-config/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-examples-allow-additional-properties-in-config/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-examples-allow-additional-properties-in-config/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-anyof-top-props/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-anyof-top-props/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-anyof-top-props/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-invalid-schema/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-invalid-schema/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-invalid-schema/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/components.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-multiple-valid-refs-different-files/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-multiple-valid-refs/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-multiple-valid-refs/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-multiple-valid-refs/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-read-write-only-with-composition/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-read-write-only-with-composition/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-read-write-only-with-composition/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-read-write-only/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-read-write-only/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-read-write-only/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-recursion-oneOf/openapi.json create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-recursion-oneOf/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-recursion-oneOf/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-recursion/openapi.json create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-recursion/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples-recursion/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples/example.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-media-type-examples/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-parameter-examples-read-write-only/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-parameter-examples-read-write-only/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-parameter-examples-read-write-only/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-parameter-examples-with-exclusive-minimum/openapi-oas30-draft4.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-parameter-examples-with-exclusive-minimum/openapi-oas32-2020.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-parameter-examples-with-exclusive-minimum/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-parameter-examples-with-exclusive-minimum/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-array-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-array-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-array-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-nested-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-nested-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-nested-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-oas3.1-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-oas3.1-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-oas3.1-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-oas3.1/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-oas3.1/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-oas3.1/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-string-number-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-string-number-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples-string-number-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-invalid-schema-examples/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-path-trailing-slash-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-path-trailing-slash-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-path-trailing-slash-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-path-trailing-slash-off/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-path-trailing-slash-off/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-path-trailing-slash-off/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-path-trailing-slash-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-path-trailing-slash-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-path-trailing-slash-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-example-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-example-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-example-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-trailing-slash-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-trailing-slash-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-trailing-slash-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-trailing-slash-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-trailing-slash-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-trailing-slash-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-variables-empty-enum-errror/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-variables-empty-enum-errror/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-variables-empty-enum-errror/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-variables-empty-enum/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-variables-empty-enum/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-server-variables-empty-enum/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-undefined-server-variable-error-recommended-config/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-undefined-server-variable-error-recommended-config/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-undefined-server-variable-error-recommended-config/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unresolved-refs-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unresolved-refs-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unresolved-refs-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unresolved-refs-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unresolved-refs-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unresolved-refs-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unused-components-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unused-components-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unused-components-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unused-components-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unused-components-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/no-unused-components-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/null-schema-values/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/null-schema-values/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/null-schema-values/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas2/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas2/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas2/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3-no-errors/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3-no-errors/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3-no-errors/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3.1-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3.1-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3.1-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3.1/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3.1/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3.1/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3.2/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3.2/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/oas3.2/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/openrpc-invalid/openrpc.json create mode 100644 @skills/redocly-cli/tests/e2e/lint/openrpc-invalid/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/openrpc-invalid/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/openrpc-valid/openrpc.json create mode 100644 @skills/redocly-cli/tests/e2e/lint/openrpc-valid/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/openrpc-valid/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-2xx-response-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-2xx-response-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-2xx-response-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-2xx-response-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-2xx-response-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-2xx-response-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-4xx-problem-details-rfc7807/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-4xx-problem-details-rfc7807/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-4xx-problem-details-rfc7807/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-4xx-response-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-4xx-response-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-4xx-response-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-4xx-response-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-4xx-response-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-4xx-response-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-description-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-description-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-description-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-description-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-description-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-description-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-operationId-in-callback/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-operationId-in-callback/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-operationId-in-callback/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-operationId-unique-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-operationId-unique-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-operationId-unique-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-operationId-unique-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-operationId-unique-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-operationId-unique-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-parameters-unique-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-parameters-unique-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-parameters-unique-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-defined-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-defined-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-defined-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-defined-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-defined-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-defined-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-scheme-oas2-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-scheme-oas2-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-scheme-oas2-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-scheme-oas3-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-scheme-oas3-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-security-scheme-oas3-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-tag-defined-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-tag-defined-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/operation-tag-defined-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/operations.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/lint/parameter-description-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/parameter-description-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/parameter-description-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/parameter-description-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/parameter-description-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/parameter-description-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-declaration-must-exist-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-declaration-must-exist-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-declaration-must-exist-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-declaration-must-exist-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-declaration-must-exist-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-declaration-must-exist-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-not-include-query-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-not-include-query-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-not-include-query-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-not-include-query-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-not-include-query-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-not-include-query-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-ref-location/components/parameters/path_userId.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-ref-location/components/parameters/path_userId_ref.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-ref-location/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-ref-location/paths/users_data.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-ref-location/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-ref-location/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-parameters-defined-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-segment-plural-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-segment-plural-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-segment-plural-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-segment-plural/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-segment-plural/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/path-segment-plural/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/request-response-mime-type-oas2-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/request-response-mime-type-oas2-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/request-response-mime-type-oas2-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/request-response-mime-type-oas3-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/request-response-mime-type-oas3-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/request-response-mime-type-oas3-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/request-response-mime-type-oas3.1-error/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/request-response-mime-type-oas3.1-error/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/request-response-mime-type-oas3.1-error/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/required-string-property-missing-min-length/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/required-string-property-missing-min-length/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/required-string-property-missing-min-length/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/rules.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/lint/skip-rules/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/skip-rules/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/skip-rules/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/skip-rules/snapshot_2.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-discriminator-defaultMapping/components/schemas/Bar.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-discriminator-defaultMapping/components/schemas/Deep.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-discriminator-defaultMapping/components/schemas/Foo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-discriminator-defaultMapping/components/schemas/Used.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-discriminator-defaultMapping/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-discriminator-defaultMapping/paths/_.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-discriminator-defaultMapping/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-discriminator-defaultMapping/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-error-if-minimum-not-correct/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-error-if-minimum-not-correct/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-error-if-minimum-not-correct/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-from/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-from/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-from/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-json-schema-validation-dependentRequired/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-json-schema-validation-dependentRequired/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-json-schema-validation-dependentRequired/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-step-mutually-exclusive-fields/arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-step-mutually-exclusive-fields/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-step-mutually-exclusive-fields/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-strict-refs/info.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-strict-refs/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-strict-refs/props.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-strict-refs/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec-strict-refs/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/spec.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/lint/tags-alphabetical-rule/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/tags-alphabetical-rule/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/tags-alphabetical-rule/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/tags-alphabetical-warning/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/tags-alphabetical-warning/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/tags-alphabetical-warning/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/test-unused-component/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/test-unused-component/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/test-unused-component/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/turn-off-rules/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/turn-off-rules/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/turn-off-rules/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/turn-on-all-rules/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/turn-on-all-rules/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/turn-on-all-rules/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/validate-schema-formats/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/validate-schema-formats/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/validate-schema-formats/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/with-ignore-file/.redocly.lint-ignore.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/with-ignore-file/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/with-ignore-file/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/with-ignore-file/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/wrong-required-type/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/wrong-required-type/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/wrong-required-type/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/lint/xml-oas-3.2/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/xml-oas-3.2/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/lint/xml-oas-3.2/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/apply-per-api-decorators/nested/openapi/main.yaml create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/apply-per-api-decorators/nested/plugins/decorators/version.cjs create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/apply-per-api-decorators/nested/plugins/test.cjs create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/apply-per-api-decorators/nested/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/apply-per-api-decorators/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/apply-per-api-decorators/snapshot_2.txt create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/apply-per-api-decorators/snapshot_3.txt create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/apply-per-api-decorators/snapshot_4.txt create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/miscellaneous.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-plugins/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-plugins/plugin-config.yaml create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-plugins/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-plugins/snapshot_2.txt create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-refs-in-preprocessors/bad-request-error.response.yaml create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-refs-in-preprocessors/error-schema.yaml create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-refs-in-preprocessors/nested/status.yaml create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-refs-in-preprocessors/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-refs-in-preprocessors/plugin.cjs create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-refs-in-preprocessors/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-refs-in-preprocessors/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-refs-in-preprocessors/snapshot_2.txt create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-refs-in-preprocessors/snapshot_3.txt create mode 100644 @skills/redocly-cli/tests/e2e/miscellaneous/resolve-refs-in-preprocessors/successful-request.response.yaml create mode 100644 @skills/redocly-cli/tests/e2e/proxy/fixtures/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/proxy/proxy.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/case-insensitive-headers/__snapshots__/case-insensitive-headers.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/case-insensitive-headers/case-insensitive-headers.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/case-insensitive-headers/case-insensitive-headers.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/cat-fact-api/__snapshots__/cat-fact-api.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/cat-fact-api/auto-cat.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/cat-fact-api/cat-fact-api.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/cat-fact-api/cats.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/consider-severity-in-next-step-execution/__snapshots__/consider-severity-in-next-step-execution.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/consider-severity-in-next-step-execution/consider-severity-in-next-step-execution.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/consider-severity-in-next-step-execution/consider-severity-in-next-step-execution.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/free-apis/__snapshots__/free-apis.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/free-apis/free-apis.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/free-apis/free.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/free-apis/testing-acme.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/implicit/__snapshots__/implicit.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/implicit/implicit.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/implicit/implicit.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/implicit/testing-acme.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-passed-to-step-target-workflow-and-remapped/__snapshots__/inputs-passed-to-step-target-workflow-and-remapped.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-passed-to-step-target-workflow-and-remapped/events.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-passed-to-step-target-workflow-and-remapped/inputs-passed-to-step-target-workflow-and-remapped.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-passed-to-step-target-workflow-and-remapped/inputs-passed-to-step-target-workflow-and-remapped.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-passed-to-step-target-workflow/__snapshots__/inputs-passed-to-step-target-workflow.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-passed-to-step-target-workflow/events.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-passed-to-step-target-workflow/inputs-passed-to-step-target-workflow.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-passed-to-step-target-workflow/inputs-passed-to-step-target-workflow.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-with-cli-and-env/__snapshots__/inputs-with-cli-and-env.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-with-cli-and-env/inputs-with-cli-and-env.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/inputs-with-cli-and-env/inputs-with-cli-and-env.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/local-json-server/.gitignore create mode 100644 @skills/redocly-cli/tests/e2e/respect/local-json-server/__snapshots__/local-json-server.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/local-json-server/json-server-openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/local-json-server/local-json-server.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/local-json-server/local-json-server.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/mask-input-secrets/__snapshots__/mask-input-secrets.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/mask-input-secrets/mask-input-secrets.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/mask-input-secrets/mask-input-secrets.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/max-steps/__snapshots__/max-steps.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/max-steps/arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/max-steps/max-steps.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/max-steps/oas.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/museum-api-with-errors.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/museum-api.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/museum-tickets.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/outputs-access-syntax-variations/__snapshots__/outputs-access-syntax-variations.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/outputs-access-syntax-variations/outputs-access-syntax-variations.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/outputs-access-syntax-variations/outputs-access-syntax-variations.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/replacements/__snapshots__/replacements.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/replacements/replacements.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/replacements/replacements.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/reusable-components/__snapshots__/reusable-components.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/reusable-components/reusable-components.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/reusable-components/reusable-components.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/reveal-masked-input-secrets/__snapshots__/reveal-masked-input-secrets.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/reveal-masked-input-secrets/reveal-masked-input-secrets.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/reveal-masked-input-secrets/reveal-masked-input-secrets.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/server-override-with-console-parameters/__snapshots__/server-override-with-console-parameters.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/server-override-with-console-parameters/server-override-with-console-parameters.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/server-override-with-console-parameters/server-override-with-console-parameters.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/severity-error-level/__snapshots__/severity-error-level.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/severity-error-level/severity-error-level.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/severity-error-level/severity-level.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/severity-off-level/__snapshots__/severity-off-level.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/severity-off-level/severity-level.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/severity-off-level/severity-off-level.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/severity-warn-level/__snapshots__/severity-warn-level.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/severity-warn-level/severity-level.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/severity-warn-level/severity-warn-level.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/step-on-failure-type-end-action/__snapshots__/step-on-failure-type-end-action.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/step-on-failure-type-end-action/step-on-failure-type-end-action.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/step-on-failure-type-end-action/step-on-failure-type-end-action.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/step-on-success-type-end-action/__snapshots__/step-on-success-type-end-action.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/step-on-success-type-end-action/step-on-success-type-end-action.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/step-on-success-type-end-action/step-on-success-type-end-action.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/utils.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-depends-on-failed/__snapshots__/workflow-depends-on-failed.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-depends-on-failed/workflow-depends-on-failed.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-depends-on-failed/workflow-depends-on-failed.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-depends-on-not-found/__snapshots__/workflow-depends-on-not-found.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-depends-on-not-found/workflow-depends-on-not-found.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-depends-on-not-found/workflow-depends-on-not-found.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-failure-actions/__snapshots__/workflow-failure-actions.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-failure-actions/workflow-failure-actions.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-failure-actions/workflow-failure-actions.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-success-actions/__snapshots__/workflow-success-actions.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-success-actions/workflow-success-actions.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/workflow-success-actions/workflow-success-actions.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-allow-reserved-query-param/__snapshots__/x-allow-reserved-query-param.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-allow-reserved-query-param/x-allow-reserved-query-param.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-allow-reserved-query-param/x-allow-reserved-query-param.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-api-key-auth/__snapshots__/x-security-api-key-auth.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-api-key-auth/x-security-api-key-auth.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-api-key-auth/x-security-api-key-auth.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-basic-auth/__snapshots__/x-security-basic-auth.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-basic-auth/x-security-basic-auth.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-basic-auth/x-security-basic-auth.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-bearer-auth/__snapshots__/x-security-bearer-auth.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-bearer-auth/x-security-bearer-auth.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-bearer-auth/x-security-bearer-auth.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-oauth2-auth/__snapshots__/x-security-oauth2-auth.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-oauth2-auth/x-security-oauth2-auth.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-oauth2-auth/x-security-oauth2-auth.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-on-workflow-level-merged-to-steps/__snapshots__/x-security-on-workflow-level-merged-to-steps.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-on-workflow-level-merged-to-steps/x-security-on-workflow-level-merged-to-steps.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-on-workflow-level-merged-to-steps/x-security-on-workflow-level-merged-to-steps.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-open-id-connect-auth/__snapshots__/x-security-open-id-connect-auth.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-open-id-connect-auth/x-security-open-id-connect-auth.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-open-id-connect-auth/x-security-open-id-connect-auth.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-resolve-scheme-name/__snapshots__/x-security-resolve-scheme-name.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-resolve-scheme-name/x-security-resolve-scheme-name.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-resolve-scheme-name/x-security-resolve-scheme-name.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-scheme-apply-order/__snapshots__/x-security-scheme-apply-order.test.ts.snap create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-scheme-apply-order/x-security-scheme-apply-order.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/e2e/respect/x-security-scheme-apply-order/x-security-scheme-apply-order.test.ts create mode 120000 @skills/redocly-cli/tests/e2e/score/score-json/museum.yaml create mode 100644 @skills/redocly-cli/tests/e2e/score/score-json/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/score/score-minimal/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/score/score-minimal/snapshot.txt create mode 120000 @skills/redocly-cli/tests/e2e/score/score-stylish/museum.yaml create mode 100644 @skills/redocly-cli/tests/e2e/score/score-stylish/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/score/score.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/split/asyncapi2-basic/asyncapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/split/asyncapi2-basic/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/asyncapi3-basic/asyncapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/split/asyncapi3-basic/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/asyncapi3-complex/asyncapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/split/asyncapi3-complex/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/discriminator-in-json/openapi.json create mode 100644 @skills/redocly-cli/tests/e2e/split/discriminator-in-json/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/missing-outDir/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/missing-outDir/spec.json create mode 100644 @skills/redocly-cli/tests/e2e/split/oas2/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/split/oas2/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/oas3-no-errors/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/split/oas3-no-errors/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/openapi-json-file/openapi.json create mode 100644 @skills/redocly-cli/tests/e2e/split/openapi-json-file/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/refs-in-json/openapi.json create mode 100644 @skills/redocly-cli/tests/e2e/split/refs-in-json/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/root-endpoint/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/split/root-endpoint/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/slash-separator/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/split/slash-separator/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/split/split.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/stats/stats-async2-json/async.yaml create mode 100644 @skills/redocly-cli/tests/e2e/stats/stats-async2-json/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/stats/stats-async2-stylish/async.yaml create mode 100644 @skills/redocly-cli/tests/e2e/stats/stats-async2-stylish/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/stats/stats-async3-stylish/asyncapi3.yaml create mode 100644 @skills/redocly-cli/tests/e2e/stats/stats-async3-stylish/snapshot.txt create mode 120000 @skills/redocly-cli/tests/e2e/stats/stats-json/museum.yaml create mode 100644 @skills/redocly-cli/tests/e2e/stats/stats-json/snapshot.txt create mode 120000 @skills/redocly-cli/tests/e2e/stats/stats-markdown/museum.yaml create mode 100644 @skills/redocly-cli/tests/e2e/stats/stats-markdown/snapshot.txt create mode 120000 @skills/redocly-cli/tests/e2e/stats/stats-stylish/museum.yaml create mode 100644 @skills/redocly-cli/tests/e2e/stats/stats-stylish/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/stats/stats.test.ts create mode 100644 @skills/redocly-cli/tests/e2e/zero-config/default-recommended-fallback/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/zero-config/default-recommended-fallback/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/zero-config/no-default-recommended-fallback-with-empty-config/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/zero-config/no-default-recommended-fallback-with-empty-config/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/zero-config/no-default-recommended-fallback-with-empty-config/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/zero-config/no-default-recommended-fallback/openapi.yaml create mode 100644 @skills/redocly-cli/tests/e2e/zero-config/no-default-recommended-fallback/redocly.yaml create mode 100644 @skills/redocly-cli/tests/e2e/zero-config/no-default-recommended-fallback/snapshot.txt create mode 100644 @skills/redocly-cli/tests/e2e/zero-config/zero-config.test.ts create mode 100644 @skills/redocly-cli/tests/performance/.gitignore create mode 100644 @skills/redocly-cli/tests/performance/README.md create mode 100644 @skills/redocly-cli/tests/performance/chart.js create mode 100644 @skills/redocly-cli/tests/performance/make-test-command.sh create mode 100644 @skills/redocly-cli/tests/performance/package.json create mode 100755 @skills/redocly-cli/tests/smoke/basic/add-redoc.sh create mode 100644 @skills/redocly-cli/tests/smoke/basic/message-schema.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/openapi.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/package.json create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-built/redoc.html create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/BuyEventTicketsRequestExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/BuyEventTicketsResponseExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/BuyGeneralTicketsRequestExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/BuyGeneralTicketsResponseExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/CreateSpecialEventRequestExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/CreateSpecialEventResponseExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/GetMuseumHoursResponseExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/GetSpecialEventResponseExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/ListSpecialEventsResponseExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/UpdateSpecialEventRequestExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/examples/UpdateSpecialEventResponseExample.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/parameters/EndDate.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/parameters/EventId.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/parameters/PaginationLimit.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/parameters/PaginationPage.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/parameters/StartDate.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/parameters/TicketId.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/responses/BadRequest.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/responses/NotFound.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/responses/Unauthorized.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/BuyMuseumTicketsRequest.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/BuyMuseumTicketsResponse.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/CreateSpecialEventRequest.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/Date.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/Email.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/Error.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/EventDates.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/EventDescription.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/EventId.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/EventLocation.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/EventName.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/EventPrice.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/GetMuseumHoursResponse.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/GetTicketCodeResponse.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/ListSpecialEventsResponse.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/MuseumDailyHours.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/Phone.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/SpecialEventResponse.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/TicketConfirmation.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/TicketId.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/TicketMessage.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/TicketType.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/components/schemas/UpdateSpecialEventRequest.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/openapi.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/paths/museum-hours.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/paths/special-events.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/paths/special-events_{eventId}.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/paths/tickets.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/museum/paths/tickets_{ticketId}_qr.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/code_samples/C_sharp/petGet/post.cs create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/code_samples/PHP/petGet/post.php create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/code_samples/PHP/petGet/put.php create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/examples/Order.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/requestBodies/Pet.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/requestBodies/UserArray.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/schemas/ApiResponse.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/schemas/Cat.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/schemas/Category.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/schemas/Dog.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/schemas/HoneyBee.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/schemas/Id.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/schemas/Order.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/schemas/Pet.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/schemas/Tag.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/components/schemas/User.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/openapi.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/GETCustomers_findByTags.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/GETpet_{petId}.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/petGet.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/pet_findByStatusPut.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/pet_{petId}_uploadImage.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/store_inventory.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/store_order.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/store_order_{orderId}.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/store_subscribe.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/user.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/user_createWithArray.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/user_createWithList.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/user_login.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/user_logout.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/paths/user_{username}.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/pre-split/petstore/webhooks/newPet.yaml create mode 100644 @skills/redocly-cli/tests/smoke/basic/prepare-smoke.sh create mode 100644 @skills/redocly-cli/tests/smoke/basic/run-smoke.sh create mode 100644 @skills/redocly-cli/tests/smoke/plugins/local-plugin.js create mode 100644 @skills/redocly-cli/tests/smoke/plugins/message-schema.yaml create mode 100644 @skills/redocly-cli/tests/smoke/plugins/openapi.yaml create mode 100644 @skills/redocly-cli/tests/smoke/plugins/package.json create mode 100644 @skills/redocly-cli/tests/smoke/plugins/prepare-smoke-plugins.sh create mode 100644 @skills/redocly-cli/tests/smoke/plugins/redocly.yaml create mode 100644 @skills/redocly-cli/tests/smoke/plugins/run-smoke.sh create mode 100644 @skills/redocly-cli/tests/smoke/rebilly/__snapshots__/rebilly.smoke.ts.snap create mode 100644 @skills/redocly-cli/tests/smoke/rebilly/rebilly-description.yaml create mode 100644 @skills/redocly-cli/tests/smoke/rebilly/rebilly.arazzo.yaml create mode 100644 @skills/redocly-cli/tests/smoke/rebilly/rebilly.smoke.ts create mode 100644 @skills/redocly-cli/tsconfig.build.json create mode 100644 @skills/redocly-cli/tsconfig.json create mode 100644 @skills/redocly-cli/vitest.config.ts diff --git a/@skills/redocly-cli/.changeset/README.md b/@skills/redocly-cli/.changeset/README.md new file mode 100644 index 000000000..e5b6d8d6a --- /dev/null +++ b/@skills/redocly-cli/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/@skills/redocly-cli/.changeset/config.json b/@skills/redocly-cli/.changeset/config.json new file mode 100644 index 000000000..8e494ba8f --- /dev/null +++ b/@skills/redocly-cli/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", + "changelog": "./format.js", + "commit": false, + "fixed": [["@redocly/cli", "@redocly/openapi-core", "@redocly/respect-core"]], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/@skills/redocly-cli/.changeset/format.js b/@skills/redocly-cli/.changeset/format.js new file mode 100644 index 000000000..3a42868f9 --- /dev/null +++ b/@skills/redocly-cli/.changeset/format.js @@ -0,0 +1,15 @@ +export const getReleaseLine = async (changeset, _type) => { + const [firstLine, ...futureLines] = changeset.summary.split('\n').map((l) => l.trimRight()); + + let returnVal = `- ${firstLine}`; + + if (futureLines.length > 0) { + returnVal += `\n${futureLines.map((l) => ` ${l}`).join('\n')}`; + } + return returnVal; +}; + +export const getDependencyReleaseLine = async (changesets, dependenciesUpdated) => { + if (dependenciesUpdated.length === 0) return ''; + return `- Updated ${dependenciesUpdated[0].name} to v${dependenciesUpdated[0].newVersion}.`; +}; diff --git a/@skills/redocly-cli/.claude/commands/deslop.md b/@skills/redocly-cli/.claude/commands/deslop.md new file mode 100644 index 000000000..b100de1e4 --- /dev/null +++ b/@skills/redocly-cli/.claude/commands/deslop.md @@ -0,0 +1,14 @@ +--- +description: Remove AI-generated slop from the current branch's diff +--- + +Check the diff against main and remove all AI-generated slop introduced in this branch. + +This includes: + +- Extra comments that a human wouldn't add, or that are inconsistent with the rest of the file +- Extra defensive checks or try/catch blocks abnormal for that area of the codebase (especially in trusted/validated codepaths) +- Casts to `any` to work around type issues +- Any other style inconsistent with the surrounding file + +Report at the end with a 1–3 sentence summary of what was changed. diff --git a/@skills/redocly-cli/.claude/rules/code-quality-standards.md b/@skills/redocly-cli/.claude/rules/code-quality-standards.md new file mode 100644 index 000000000..967555a2d --- /dev/null +++ b/@skills/redocly-cli/.claude/rules/code-quality-standards.md @@ -0,0 +1,34 @@ +# Code quality standards + +Write the simplest code that solves the problem and reads like the file around it. +The rules below are the specific practices this repository enforces — most are also what `/deslop` strips out. + +1. No needless wrappers or abstractions. + Don't wrap a function that's used in one place, and don't add layers for a single caller. + Plain, readable code beats a clever indirection. + +1. No overcomplicated code. + Keep it simple, understandable, and explainable, and make it fit the existing architecture. + +1. Descriptive names. + Use names like `pkgRootMatch`, `inputPath`, `error` — never single letters or abbreviations like `m`, `p`, `e`. + This applies across every package and script. + +1. Comments match the file. + Don't add comments that restate the code or exceed the surrounding file's comment density. + Plain English only. + +1. No defensive noise in trusted paths. + Skip `try/catch` and null checks in code the walker has already validated — add them only where input is genuinely untrusted. + +1. No `any` to silence the type checker. + Fix the type instead; the shared type definitions live in `packages/core/src/types/`. + Try avoiding typecasting (especially double typecasting), except for tests. + Leave a short comment explaining why the typecasting is necessary. + +1. Use ESM import extensions. + +1. Reuse an existing rule name when the same concept already exists for another spec flavor. + +1. The repo lints with oxlint and formats with oxfmt (not ESLint/Prettier). + Run `npm run lint` and `npm run format` before committing. diff --git a/@skills/redocly-cli/.claude/rules/core-principles.md b/@skills/redocly-cli/.claude/rules/core-principles.md new file mode 100644 index 000000000..cf785aa50 --- /dev/null +++ b/@skills/redocly-cli/.claude/rules/core-principles.md @@ -0,0 +1,26 @@ +# Core Operational Principles + +The durable principles that shape every contribution, ordered by how much they matter. +Release and commit mechanics are procedures, not principles — they live in +[`workflow.md`](./workflow.md). + +1. Act on verifiable evidence, not assumptions. + Read the relevant file before you change it, and back every claim with proof from the code or configuration — not a guess about how it probably works. + +1. Think the problem through before you answer. + Weigh the factors, constraints, and possible approaches, then recommend the best one — in simple, clear, concise language. + +1. Be a nonconformist. + Discuss and push back when something looks wrong; argue for the better solution instead of agreeing with every instruction. + A line you can't explain is a line to remove. + +1. Validate preconditions before any destructive or high-impact operation. + Check the state explicitly before deleting, overwriting, or doing anything hard to reverse. + +1. Respect the core patterns: Walker, Visitors, and Nodes. + New rules and decorators follow this pattern instead of using regex or manual drilling objects described by the supported specifications. + The full guide is in [`rules-system.md`](./rules-system.md). + +1. Explain in chat, not in files. + Don't create explanation, summary, or design files unless asked. + Keep explanations short and in plain language — avoid jargon and long, confusing sentences. diff --git a/@skills/redocly-cli/.claude/rules/documentation.md b/@skills/redocly-cli/.claude/rules/documentation.md new file mode 100644 index 000000000..c76fdff36 --- /dev/null +++ b/@skills/redocly-cli/.claude/rules/documentation.md @@ -0,0 +1,7 @@ +# Documentation and output + +1. Update the docs for every new or changed rule, decorator, option, or command — a feature without docs is incomplete. + Write them in Markdown. +1. Keep user-facing output (logs, messages, errors) clear, non-technical, and actionable. +1. Use clear and concise language in all documentation. +1. Use semantic line breaks in Markdown files (preferably splitting sentences into separate lines). diff --git a/@skills/redocly-cli/.claude/rules/rules-system.md b/@skills/redocly-cli/.claude/rules/rules-system.md new file mode 100644 index 000000000..049ee5ddd --- /dev/null +++ b/@skills/redocly-cli/.claude/rules/rules-system.md @@ -0,0 +1,173 @@ +## Rules System: Walker, Visitors, and Nodes + +This is the most important pattern to understand when working in `packages/core`. + +### Concepts + +Node — a typed object in the parsed API description AST. +Every node has a name that matches its spec concept: `Schema`, `Operation`, `Server`, `Parameter`, `Response`, etc. +The full list of node types per spec is in `packages/core/src/types/`. + +Visitor — an object whose keys are node names. +When the Walker enters or leaves a node of that type, it calls the corresponding visitor hook. +Visitor names mirror node names exactly. +The full visitor type map is in `packages/core/src/visitors.ts`. + +Walker — the engine in `packages/core/src/walk.ts` (`walkDocument`). +It recursively traverses the parsed document, resolves `$ref` references, and invokes registered visitors at each node. + +### Visitor hooks + +Each key in a visitor object can be either a plain function (shorthand for `enter`) or an object with up to three hooks: + +| Hook | When it runs | +| ------------------ | -------------------------------------------------------------------------------- | +| `enter(node, ctx)` | When the Walker first arrives at this node | +| `leave(node, ctx)` | After all child nodes have been visited; all `$ref`s are resolved by this point | +| `skip(node, ctx)` | Called before `enter`; return `true` to skip this visitor entirely for this node | + +### Context object (`ctx`) + +Every visitor hook receives a context object with: + +| Property | Type | Description | +| ------------------ | -------------------- | ------------------------------------------------------- | +| `report(problem)` | function | Emit a lint problem | +| `location` | `Location` | JSON pointer + source of the current node | +| `key` | `string \| number` | Key of this node within its parent | +| `parent` | `any` | Parent node object | +| `resolve(ref)` | function | Resolve a `$ref` to its target node and location | +| `type` | `NormalizedNodeType` | Type descriptor for the current node | +| `specVersion` | `SpecVersion` | For example, `'OAS3_0'`, `'OAS3_1'` | +| `getVisitorData()` | function | Shared data store scoped to the current rule invocation | + +### Rule function signature + +A rule is a factory function that receives rule options and returns a visitor object. +The type depends on the target spec: + +```ts +import type { Oas3Rule } from '../../visitors.js'; + +// Factory receives rule options, returns a visitor +export const MyRule: Oas3Rule = (options) => { + // State can be kept here — it is scoped to one document walk + return { + NodeName(node, ctx) { + /* shorthand enter */ + }, + + OtherNode: { + enter(node, ctx) { + /* ... */ + }, + leave(node, ctx) { + /* ... */ + }, + skip(node, ctx) { + return false; + }, + }, + }; +}; +``` + +Available rule types: `Oas3Rule`, `Oas3_1Rule`, `Oas2Rule`, `Async2Rule`, `Async3Rule`, `ArazzoRule`. + +### Minimal rule example + +```ts +// packages/core/src/rules/oas3/no-server-trailing-slash.ts +import type { Oas3Rule } from '../../visitors.js'; + +export const NoServerTrailingSlash: Oas3Rule = () => { + return { + Server(server, { report, location }) { + if (server.url?.endsWith('/') && server.url !== '/') { + report({ + message: 'Server `url` should not have a trailing slash.', + location: location.child(['url']), + }); + } + }, + }; +}; +``` + +### Stateful rule example (using `enter` + `leave`) + +```ts +// packages/core/src/rules/oas3/no-unused-components.ts +import type { Oas3Rule } from '../../visitors.js'; + +export const NoUnusedComponents: Oas3Rule = () => { + const components = new Map(); + + return { + // Track every $ref resolution — mark the target as used + ref(ref, { type, resolve, key, location }) { + const resolved = resolve(ref); + if (resolved.location) { + components.set(resolved.location.absolutePointer, { + used: true, + name: key.toString(), + location, + }); + } + }, + + // Report unused components only after the entire document has been walked + Root: { + leave(_, { report }) { + components.forEach((info) => { + if (!info.used) { + report({ + message: `Component: "${info.name}" is never used.`, + location: info.location.key(), + }); + } + }); + }, + }, + + NamedSchemas: { + Schema(schema, { location, key }) { + components.set(location.absolutePointer, { used: false, location, name: key.toString() }); + }, + }, + }; +}; +``` + +### Register a new rule + +After creating the rule file, register it in the spec index: + +```ts +// packages/core/src/rules/oas3/index.ts +import { NoMyRule } from './no-my-rule.js'; + +export const Oas3Rules = { + // ...existing rules... + 'no-my-rule': NoMyRule, +}; +``` + +### Configurable rules (Assertions) + +Users can define their own rules in `redocly.yaml` using the built-in `Assertion` system (`packages/core/src/rules/common/assertions/asserts.ts`). +Instead of writing TypeScript, the user declares a subject node type and a set of assertion checks. +Internally, the subject type is converted into a visitor automatically. + +```yaml +rules: + rule/path-exclude-pattern: + subject: + type: Paths # node type → becomes a visitor + assertions: + notPattern: \/wrong +``` + +Prefer implementing actual rule code over adding assertion-based rules when contributing to the core rule set. + +--- diff --git a/@skills/redocly-cli/.claude/rules/security-guidelines.md b/@skills/redocly-cli/.claude/rules/security-guidelines.md new file mode 100644 index 000000000..5fd644b8c --- /dev/null +++ b/@skills/redocly-cli/.claude/rules/security-guidelines.md @@ -0,0 +1,12 @@ +# Security guidelines + +The essentials are in `AGENTS.md`: this is the depth. +The CLI reads local and remote files, resolves `$ref`s across documents, authenticates against Redocly cloud, and runs real HTTP requests in respect-core — treat all of that as untrusted input. + +1. Never hardcode credentials, tokens, or API keys. + Read them from the environment or the existing auth flow, and never log their values. +1. Validate and type-check external input — `redocly.yaml`, CLI arguments, and fetched documents — before using it. +1. Never use `eval` or build shell commands from unsanitised input. + The runtime-expression evaluator in respect-core stays expression-only, not arbitrary code execution. +1. Treat resolved `$ref`s and remote URLs as untrusted: guard file writes (bundle, split, eject) against path traversal, and don't fetch outside the intended scope. +1. Log sensitive operations without their sensitive values — tokens, secrets, and auth headers never reach the logger. diff --git a/@skills/redocly-cli/.claude/rules/testing.md b/@skills/redocly-cli/.claude/rules/testing.md new file mode 100644 index 000000000..722c27c7b --- /dev/null +++ b/@skills/redocly-cli/.claude/rules/testing.md @@ -0,0 +1,11 @@ +# Testing + +1. Write meaningful tests that exercise real behavior — not tests that exist only to raise coverage. + One focused, clear test is enough. +1. Rule tests are unit tests by convention: parse a YAML document, run `lintDocument`, and assert with `toMatchInlineSnapshot` — a behavior test in itself (given this input, these problems). + Generate new snapshots and update stale ones as part of the change. +1. Compile before testing. + Unit tests import from `lib/` (compiled output), not `src/` — run `npm run compile` after every change. +1. Run the full suite (`npm test`) when you touch core linting logic, and make sure all tests pass in CI. +1. Coverage thresholds (`vitest.config.ts`) are a guide, not a number to game. + If a feature or fix is already covered by e2e tests, propose lowering the threshold rather than padding the suite with unit tests that only chase coverage. diff --git a/@skills/redocly-cli/.claude/rules/workflow.md b/@skills/redocly-cli/.claude/rules/workflow.md new file mode 100644 index 000000000..fc4ec7775 --- /dev/null +++ b/@skills/redocly-cli/.claude/rules/workflow.md @@ -0,0 +1,24 @@ +# Release and commit workflow + +The mechanics every change goes through before it lands. +These are procedures — follow them in order. + +## Changesets + +- Every feature or fix needs a changeset. + Run `npx changeset` (or `npx changeset --empty` to fill it in by hand) and describe the change in sentence case. +- Bumping one package bumps the others too, so list inside the changeset only the packages whose behavior changed for the end user. + Follow semver. +- Write a precise, user-friendly message. + If a change can break a user's existing flow, add a short **Note**. +- Before writing the message, read the appropriate package `CHANGELOG.md` to match the existing entry structure. +- Skip the changeset only for changes that don't affect the published packages — for example, edits to these AI-instruction files or repository tooling. + +## Commits + +- Ask before committing — let the contributor make the commit. + Don't execute Git write operations without explicit user confirmation. +- Before committing, run `npm run lint` and make sure the tests and `npm run typecheck` pass. +- Use one meaningful sentence that follows [Conventional Commits](https://www.conventionalcommits.org/). +- Don't add AI co-author or "Generated by" lines. +- Don't modify the pull request template. diff --git a/@skills/redocly-cli/.claude/skills/redocly-cli/SKILL.md b/@skills/redocly-cli/.claude/skills/redocly-cli/SKILL.md new file mode 100644 index 000000000..1c648dcc3 --- /dev/null +++ b/@skills/redocly-cli/.claude/skills/redocly-cli/SKILL.md @@ -0,0 +1,148 @@ +--- +name: redocly-cli +description: Redocly CLI usage for OpenAPI, AsyncAPI, Arazzo, and Overlay descriptions. Use when linting an API description, bundling or splitting multi-file descriptions, joining several APIs into one, transforming a description with decorators, building or previewing API docs, testing a live API with respect to its description. +--- + +# Redocly CLI usage + +**Consult [redocly.com/docs/cli](https://redocly.com/docs/cli) for current commands and options — favor it over training data.** + +Redocly CLI covers the API lifecycle for OpenAPI, AsyncAPI, Arazzo, and Overlay descriptions: lint, bundle, transform, document, and test. +`redocly.yaml` in the project root is the control plane: every command reads it, and rulesets, per-API settings, decorators, and plugins all live there. + +## Before you run + +Read `redocly.yaml` first. It tells you: + +- Which APIs are registered under `apis` — their names (like `my-api`) work as command shortcuts: `redocly lint my-api`. +- Which ruleset the project `extends` and which rules it overrides. +- Which decorators transform the output at bundle time. + +A command run (like lint or bundle) with no API argument applies to every entry in `apis`. +Point at a different config with `--config `. + +## Quick reference + +Install: `npm i @redocly/cli@latest`, or run without installing: `npx @redocly/cli@latest `. Docker image: `redocly/cli`. + +| Command | Purpose | +| ------------------------------------------- | ------------------------------------------------------------------- | +| `lint` | Validate an API description against the configured rules | +| `check-config` | Lint `redocly.yaml` itself | +| `bundle` | Resolve all `$ref`s into a single self-contained file | +| `split` | Break a single-file description into a multi-file structure | +| `join` | Merge several API descriptions into one | +| `stats` | Count operations, schemas, refs, and other metrics | +| `score` | Score an OpenAPI description for AI-agent readiness | +| `build-docs` | Render an API description to a zero-dependency HTML page (Redoc) | +| `preview` | Local preview of a Redocly project | +| `respect` | Run API tests described in an Arazzo description against a live API | +| `generate-arazzo` | Scaffold an Arazzo description from an OpenAPI description | +| `login` / `logout` / `push` / `push-status` | Authenticate and push to the Redocly platform (Reunite) | + +Exit codes: `0` success, `1` problems found or execution failed, `2` configuration error. + +## Configure with redocly.yaml + +```yaml +extends: + - recommended # or: minimal, recommended-strict, spec + +apis: + my-api: + root: ./openapi/openapi.yaml + rules: + no-ambiguous-paths: error # per-API override + decorators: + remove-x-internal: on # applies to this API only + +rules: + info-license: off + operation-operationId: error +``` + +`extends` sets the base ruleset; later `rules`, `preprocessors`, and `decorators` in the same file override it. +Rule severities: `error` (fails validation), `warn` (reported, still valid), `off`. + +### Configurable rules + +When a governance requirement has no built-in rule, declare one under `rule/` with a subject node type and assertions: + +```yaml +rules: + rule/tag-name-macro-case: + subject: + type: Tag + property: name + assertions: + defined: true + casing: MACRO_CASE + severity: warn + message: Tag names must be upper case with underscores (_). +``` + +## Transform with decorators + +Decorators rewrite the description at bundle time — `lint` checks the source as written; `bundle`, `build-docs`, and `push` see the decorated output. +Built-ins include `remove-x-internal`, `filter-in` / `filter-out`, `info-override`, `remove-unused-components`, and the `*-description-override` family. + +## Extend with custom plugins + +When configurable rules and built-in decorators can't express the requirement, escalate to a [custom plugin](https://redocly.com/docs/cli/custom-plugins): a JavaScript module exporting rules, decorators, preprocessors, or config, keyed by document format: + +```js +export default function myPlugin() { + return { + id: 'my-plugin', + rules: { + oas3: { + 'operation-id-not-test': () => ({ + Operation(operation, { report, location }) { + if (operation.operationId === 'test') { + report({ message: 'operationId must not be "test".', location }); + } + }, + }), + }, + }, + }; +} +``` + +Register it in `redocly.yaml` (paths relative to the config file) and reference its rules as `/`: + +```yaml +plugins: + - ./plugins/my-plugin.js +rules: + my-plugin/operation-id-not-test: error +``` + +## Test a live API + +`respect` executes an [Arazzo](https://spec.openapis.org/arazzo/latest.html) description as a test suite against a running API, asserting real responses match the description. +Start from `generate-arazzo ` to scaffold the workflows, then refine the steps and success criteria by hand. + +## Workflow + +1. Read `redocly.yaml` to learn the registered APIs, ruleset, and decorators. +2. Make the change — spec edit, rule config, or decorator. +3. Verify: + - `redocly lint` exits `0` (or reports only warnings you expected). + - After editing `redocly.yaml`: `redocly check-config` reports no problems. + - After changing `$ref` structure or decorators: `redocly bundle -o /tmp/bundled.yaml` succeeds and the output contains what you intended. + +## Gotchas + +- v2 is ESM-only: Node.js v22.12.0+ (or v20.19.0+). +- `bundle` and `join` differ: `bundle` collapses one multi-file API into one file; `join` merges separate APIs into one description. +- `respect` currently covers only synchronous HTTP flow. +- Any `redocly.yaml` in the working directory configures every command — a stray one changes lint results silently. +- `--extends` on the command line sets the base ruleset for that run; useful for a quick `--extends=spec` conformance check. + +## Resources + +- [Command reference](https://redocly.com/docs/cli/commands) +- [Built-in rules](https://redocly.com/docs/cli/rules) +- [Decorators](https://redocly.com/docs/cli/decorators) +- [Configuration](https://redocly.com/docs/cli/configuration) diff --git a/@skills/redocly-cli/.dockerignore b/@skills/redocly-cli/.dockerignore new file mode 100644 index 000000000..4480b16f8 --- /dev/null +++ b/@skills/redocly-cli/.dockerignore @@ -0,0 +1,9 @@ +* +!package.json +!tsconfig.build.json +!tsconfig.json +!package-lock.json +!README.md +!LICENSE.md +!packages/* +!scripts/local-pack.sh diff --git a/@skills/redocly-cli/.gemini/settings.json b/@skills/redocly-cli/.gemini/settings.json new file mode 100644 index 000000000..05d52d750 --- /dev/null +++ b/@skills/redocly-cli/.gemini/settings.json @@ -0,0 +1,5 @@ +{ + "context": { + "fileName": "AGENTS.md" + } +} diff --git a/@skills/redocly-cli/.github/CODEOWNERS b/@skills/redocly-cli/.github/CODEOWNERS new file mode 100644 index 000000000..b8649689b --- /dev/null +++ b/@skills/redocly-cli/.github/CODEOWNERS @@ -0,0 +1,10 @@ +* @Redocly/dark-side +.changeset/ @Redocly/technical-writers +README.md @Redocly/technical-writers +docs/ @Redocly/technical-writers +packages/cli/src/utils/otel.ts @Redocly/hot-dogs +packages/cli/src/utils/telemetry.ts @Redocly/hot-dogs +packages/cli/src/commands/drift/ @Redocly/cyberpunks +packages/cli/src/commands/generate-spec/ @Redocly/cyberpunks +packages/cli/src/commands/proxy/ @Redocly/cyberpunks +cookbook/**/*.md @Redocly/technical-writers \ No newline at end of file diff --git a/@skills/redocly-cli/.github/ISSUE_TEMPLATE/bug_report.md b/@skills/redocly-cli/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..a8dca61e4 --- /dev/null +++ b/@skills/redocly-cli/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,58 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: 'Type: Bug' +assignees: '' +--- + +**Describe the bug** + + + +**To Reproduce** + + + +**Expected behavior** + + + +**Logs** + + + +**OpenAPI description** + + + +**Redocly version(s)** + + + +**Node.js version(s)** + + + +**OS, environment** + + + +**Additional context** + + diff --git a/@skills/redocly-cli/.github/ISSUE_TEMPLATE/feature_request.md b/@skills/redocly-cli/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..54f4bb886 --- /dev/null +++ b/@skills/redocly-cli/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,23 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: 'Type: Enhancement' +assignees: '' +--- + +**Is your feature request related to a problem? Please describe.** + + + +**Describe the solution you'd like** + + + +**Describe alternatives you've considered** + + + +**Additional context** + + diff --git a/@skills/redocly-cli/.github/copilot-instructions.md b/@skills/redocly-cli/.github/copilot-instructions.md new file mode 100644 index 000000000..1c3ef7ea4 --- /dev/null +++ b/@skills/redocly-cli/.github/copilot-instructions.md @@ -0,0 +1,6 @@ +# GitHub Copilot instructions + +The contribution rules for this repository live in [`AGENTS.md`](../AGENTS.md). +Read it first and follow it — architecture, how to add rules, testing, code quality, and the release workflow. + +The detailed operating rules are under [`.claude/rules/`](../.claude/rules). diff --git a/@skills/redocly-cli/.github/pull_request_template.md b/@skills/redocly-cli/.github/pull_request_template.md new file mode 100644 index 000000000..626941324 --- /dev/null +++ b/@skills/redocly-cli/.github/pull_request_template.md @@ -0,0 +1,20 @@ +## What/Why/How? + +## Reference + +## Testing + +## Screenshots (optional) + +## Check yourself + +- [ ] This PR follows the [contributing guide](https://github.com/Redocly/redocly-cli/blob/main/CONTRIBUTING.md#pull-request-guidelines) +- [ ] All new/updated code is covered by tests +- [ ] Core code changed? - Tested with other Redocly products (internal contributions only) +- [ ] New package installed? - Tested in different environments (browser/node) +- [ ] Documentation update has been considered + +## Security + +- [ ] The security impact of the change has been considered +- [ ] Code follows company security practices and guidelines diff --git a/@skills/redocly-cli/.github/styles/Redocly-Docs/BritishEnglish.yml b/@skills/redocly-cli/.github/styles/Redocly-Docs/BritishEnglish.yml new file mode 100644 index 000000000..6c33445ff --- /dev/null +++ b/@skills/redocly-cli/.github/styles/Redocly-Docs/BritishEnglish.yml @@ -0,0 +1,110 @@ +extends: substitution +message: 'Use the US spelling "%s" instead of British "%s".' +link: https://docs.microsoft.com/en-us/style-guide/word-choice/use-us-spelling-avoid-non-english-words +level: error +ignorecase: true +swap: + aeon: eon + aeroplane: airplane + ageing: aging + aluminium: aluminum + anaemia: anemia + anaesthesia: anesthesia + analyse: analyze + annexe: annex + apologise: apologize + behaviour: behavior + busses: buses + calibre: caliber + cancelled: canceled + cancellation: cancelation + catalogue: catalog + categorise: categorize + categorised: categorized + categorises: categorizes + categorising: categorizing + centre: center + cheque: check + civilisation: civilization + civilise: civilize + colour: color + cosy: cozy + cypher: cipher + dependant: dependent + defence: defense + distil: distill + draught: draft + encyclopaedia: encyclopedia + enquiry: inquiry + enrol: enroll + enrolment: enrollment + enthral: enthrall + expiry: expiration + favourite: favorite + fibre: fiber + fillet: filet + flavour: flavor + furore: furor + fulfil: fulfill + gaol: jail + grey: gray + humour: humor + honour: honor + initialled: initialed + initialling: initialing + instil: instill + jewellery: jewelry + labelling: labeling + labelled: labeled + labour: labor + libellous: libelous + licence: license + likeable: likable + liveable: livable + lustre: luster + manoeuvre: maneuver + marvellous: marvelous + matt: matte + meagre: meager + metre: meter + modelling: modeling + moustache: mustache + neighbour: neighbor + normalise: normalize + offence: offense + organise: organize + organisation: organization + orientated: oriented + paralyse: paralyze + plough: plow + pretence: pretense + programme: program + pyjamas: pajamas + rateable: ratable + realise: realize + recognise: recognize + reconnoitre: reconnoiter + rumour: rumor + sabre: saber + saleable: salable + saltpetre: saltpeter + sceptic: skeptic + sepulchre: sepulcher + signalling: signaling + sizeable: sizable + skilful: skillful + sombre: somber + smoulder: smolder + speciality: specialty + spectre: specter + splendour: splendor + standardise: standardize + standardised: standardized + sulphur: sulfur + theatre: theater + travelled: traveled + traveller: traveler + travelling: traveling + unshakeable: unshakable + wilful: willful + yoghurt: yogurt diff --git a/@skills/redocly-cli/.github/styles/Redocly-Docs/FutureTense.yml b/@skills/redocly-cli/.github/styles/Redocly-Docs/FutureTense.yml new file mode 100644 index 000000000..7012bde70 --- /dev/null +++ b/@skills/redocly-cli/.github/styles/Redocly-Docs/FutureTense.yml @@ -0,0 +1,10 @@ +extends: existence +message: 'Avoid using future tense: "%s". Use present tense instead.' +link: https://intranet.redocly.com/content/documentation-style-guide#tone-and-audience +ignorecase: true +level: error +raw: + - "(going to( |\n|[[:punct:]])[a-zA-Z]*|" + - "will( |\n|[[:punct:]])[a-zA-Z]*|" + - "won't( |\n|[[:punct:]])[a-zA-Z]*|" + - "[a-zA-Z]*'ll( |\n|[[:punct:]])[a-zA-Z]*)" diff --git a/@skills/redocly-cli/.github/styles/Redocly-Docs/HeaderGerunds.yml b/@skills/redocly-cli/.github/styles/Redocly-Docs/HeaderGerunds.yml new file mode 100644 index 000000000..618786ba3 --- /dev/null +++ b/@skills/redocly-cli/.github/styles/Redocly-Docs/HeaderGerunds.yml @@ -0,0 +1,13 @@ +extends: existence +message: 'Do not start headings with with a gerund (ing word). Use an imperative verb instead.' +link: https://intranet.redocly.com/content/documentation-style-guide/#content-organization +level: error +scope: heading +tokens: + - '^\w*ing.*' +exceptions: + - Single + - Settings + - Billing + - Hosting + - Breaking diff --git a/@skills/redocly-cli/.github/styles/Redocly-Docs/InclusionGenderCulture.yml b/@skills/redocly-cli/.github/styles/Redocly-Docs/InclusionGenderCulture.yml new file mode 100644 index 000000000..ac5ae0274 --- /dev/null +++ b/@skills/redocly-cli/.github/styles/Redocly-Docs/InclusionGenderCulture.yml @@ -0,0 +1,16 @@ +extends: substitution +message: 'Use inclusive language. Consider "%s" instead of "%s".' +link: https://intranet.redocly.com/content/documentation-style-guide/#grammar-and-syntax +level: error +ignorecase: true +swap: + he: they + his: their + she: they + hers: their + blacklist(?:ed|ing|s)?: blocklist + whitelist(?:ed|ing|s)?: allowlist + master: primary, main + slave: replica + he/she: they + s/he: they diff --git a/@skills/redocly-cli/.github/styles/Redocly-Docs/OxfordComma.yml b/@skills/redocly-cli/.github/styles/Redocly-Docs/OxfordComma.yml new file mode 100644 index 000000000..163a59545 --- /dev/null +++ b/@skills/redocly-cli/.github/styles/Redocly-Docs/OxfordComma.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Use the Oxford comma in '%s'." +link: https://docs.microsoft.com/en-us/style-guide/punctuation/commas +scope: sentence +level: error +nonword: true +tokens: + - '(?:[^\s,]+,){1,} \w+ (?:and|or) \w+[.?!]' diff --git a/@skills/redocly-cli/.github/styles/config/vocabularies/Redocly-Docs/accept.txt b/@skills/redocly-cli/.github/styles/config/vocabularies/Redocly-Docs/accept.txt new file mode 100644 index 000000000..b94506a75 --- /dev/null +++ b/@skills/redocly-cli/.github/styles/config/vocabularies/Redocly-Docs/accept.txt @@ -0,0 +1,151 @@ +[Aa]nsible +[Aa]utostart +[Bb]locklist +[Bb]locklists +[Bb]oolean +[Bb]reakpoint +[B]reakpoints +[Cc]ancelation +[Cc]lassloading +[Cc]hargeback +[Cc]hargebacks +[Cc]he +[Cc]rypto +[Cc]ryptocurrency +[Dd]evfile|[Dd]evfiles +[Dd]ownstream +[Dd]ownstreaming +[Ff]actories|[Ff]actory +[Gg]it +[Gg]rafana +[Hh]eatmap +[Hh]elm +[Hh]ostname +[Ii]tem +[Jj]etbrains +[Kk]eycloak +[Ll]iveness +[Ll]ombok +[Ll]oopback +[Mm]aven +[Mm]inikube +[Mm]inishift +[Mm]ixin|[Mm]ixins +[Mm]odularization +[Mm]ulticluster +[Mm]ultihost +[Mm]ultinode +[Mm]ultitenant +[Mm]ultiuser +[Mm]ultizone +[Nn]amespace|[Nn]amespaces +[Nn]etcoredebug[Oo]utput +[Nn]ginx +[Oo]nboarding +[Pp]podman +[Pp]reconfigured +[Rr]eadonly +[Rr]epresentment +[Rr]ollout|[Rr]ollouts +[Rr]untime|[Rr]untimes +[Ss]erializer +[Ss]erverless +[Ss]ubnetwork +[Ss]ubpath|[Ss]ubpaths +[Tt]heia +[Tt]olerations +[Tt]ruststore +[Uu]ninstallation +[Uu]nstaged +[Uu]ntrusted +[Ww]orkspace|[Ww]orkspaces +[Yy]eoman +\.NET +adoc +Antora +API +Apigee +AsciiDoc +AWS|aws +Azure +Bierner +Bitbucket +btn +Btrfs +CentOS +Ceph +Che-Theia +CLI +ConfigMap|ConfigMaps +Ctrl +DaemonSet +Dev Workspace +Developer Perspective +DNS +Docker +Dockerfile +Dotnet +Endevor +endif +GitHub|github +GitLab +Gluster +Gradle +Grafana +GUI +HTTPS|https +I/O +IDE|ide|IDEs +Intelephense +IntelliJ IDEA +Java +Java Lombok +JSON|json +JVM|jvm +kbd +Kubespray +Laravel +Let\'s Encrypt +Mattermost +mebibytes +Microsoft Azure +millicores +Mulesoft +MySQL +Netlify +Node.js +npm +NuGet +OAuth +ocp +OmniSharp +OpenShift +OpenTracing +Operator +OperatorHub +OpenAPI +AsyncAPI +osd +PHP +PostgreSQL +Quarkus +Rebilly +Redoc +Redocly +Redocly-cli +SCM +Sharding +SonarLint +Spring Boot +SVG +Uber +URI|URIs +URL|url|URLs +Velero +Vercel +Visual Studio Code +vsix +Webview|Webviews +Woopra +YAML|yaml +Zowe diff --git a/@skills/redocly-cli/.github/styles/config/vocabularies/Redocly-Docs/reject.txt b/@skills/redocly-cli/.github/styles/config/vocabularies/Redocly-Docs/reject.txt new file mode 100644 index 000000000..e69de29bb diff --git a/@skills/redocly-cli/.github/workflows/docs-tests.yaml b/@skills/redocly-cli/.github/workflows/docs-tests.yaml new file mode 100644 index 000000000..3e8f3d418 --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/docs-tests.yaml @@ -0,0 +1,42 @@ +name: Documentation tests +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + markdownlint: + name: markdownlint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: DavidAnson/markdownlint-cli2-action@ce4853d43830c74c1753b39f3cf40f71c2031eb9 # v23.0.0 + with: + config: .markdownlint.yaml + globs: | + docs/**/*.md + cookbook/**/*.md + + vale: + name: vale action + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: errata-ai/vale-action@reviewdog + with: + files: '["README.md", "docs", ".changeset"]' + filter_mode: file + fail_on_error: true + + linkcheck: + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Markup Link Checker (mlc) - docs + uses: becheran/mlc@7ec24825cefe0c9c8c6bac48430e1f69e3ec356e # v1.2.0 + with: + args: ./docs + - name: Markup Link Checker (mlc) - cookbook + uses: becheran/mlc@7ec24825cefe0c9c8c6bac48430e1f69e3ec356e # v1.2.0 + with: + args: ./cookbook diff --git a/@skills/redocly-cli/.github/workflows/main-version-release-guard.yaml b/@skills/redocly-cli/.github/workflows/main-version-release-guard.yaml new file mode 100644 index 000000000..ea37b4788 --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/main-version-release-guard.yaml @@ -0,0 +1,32 @@ +name: Major Version Release Guard + +permissions: + contents: read + pull-requests: read + +on: + pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] + branches: + - main + - v1 + +jobs: + check-major-version: + if: ${{ !contains(github.event.pull_request.labels.*.name, 'cli-main-version-release') }} + name: Confirm major version release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Detect major version changeset + run: | + MAJOR_FILES=$(grep -rl ': major$' .changeset/ --include="*.md" 2>/dev/null || true) + if [ -n "$MAJOR_FILES" ]; then + echo "Major version bump found in:" + echo "$MAJOR_FILES" + echo "❌ Add the 'cli-main-version-release' label to this PR to confirm the major release." + exit 1 + else + echo "✅ No major version bump detected." + fi diff --git a/@skills/redocly-cli/.github/workflows/performance-comment.yaml b/@skills/redocly-cli/.github/workflows/performance-comment.yaml new file mode 100644 index 000000000..e373ce98a --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/performance-comment.yaml @@ -0,0 +1,38 @@ +name: Performance Benchmark Comment + +# Comments on fork PRs only. Same-repo PRs comment inline from performance.yaml (writable token). + +on: + workflow_run: + workflows: ['Performance Benchmark'] + types: [completed] + +permissions: + pull-requests: write + actions: read + +jobs: + comment: + if: >- + github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'success' && + github.event.workflow_run.head_repository.full_name != github.repository + runs-on: ubuntu-latest + steps: + - name: Download benchmark result + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + with: + name: performance-benchmark + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Read PR number + id: pr + run: echo "number=$(cat pr-number.txt)" >> "$GITHUB_OUTPUT" + + - name: Comment PR + uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1 + with: + file-path: benchmark_chart.md + pr-number: ${{ steps.pr.outputs.number }} + comment-tag: historical-versions-comparison diff --git a/@skills/redocly-cli/.github/workflows/performance.yaml b/@skills/redocly-cli/.github/workflows/performance.yaml new file mode 100644 index 000000000..576f4bb9b --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/performance.yaml @@ -0,0 +1,78 @@ +name: Performance Benchmark + +permissions: + contents: read + pull-requests: write + +on: + pull_request: + branches: + - main + +env: + CI: true + REDOCLY_TELEMETRY: off + +jobs: + historical-versions: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Install pnpm for Rebilly/api-definitions + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + with: + run_install: false + version: 10.33.0 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: npm + - name: Install Dependencies + run: npm ci + - name: Install External + run: npm i -g hyperfine + + - name: Add more versions to test + # Run only on the release branch (changeset-release/main): + if: github.head_ref == 'changeset-release/main' + run: | + cd tests/performance/ + cat package.json | jq ".dependencies = $(cat package.json | jq ._enhancedDependencies)" > package.json + cat package.json + + - name: Prepare + run: | + npm run compile + npm run pack:prepare + cd tests/performance/ + npm i + npm run make-test + + - name: Run Benchmark + run: | + cd tests/performance/ + npm run test # This command is generated and injected into package.json in the previous step. + cat benchmark_bundle.md benchmark_lint.md benchmark_check-config.md + npm run chart # Creates benchmark_chart.md with the performance bar chart. + + # Same-repo PRs (incl. the bot release PR, which gets no workflow_run event) comment inline. + - name: Comment PR + if: github.event.pull_request.head.repo.full_name == github.repository + uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1 + with: + file-path: tests/performance/benchmark_chart.md + comment-tag: historical-versions-comparison + + # Forks get a read-only token, so they hand off via artifact for performance-comment.yaml. + - name: Save PR number + if: github.event.pull_request.head.repo.full_name != github.repository + run: echo "${{ github.event.number }}" > tests/performance/pr-number.txt + + - name: Upload benchmark result + if: github.event.pull_request.head.repo.full_name != github.repository + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: performance-benchmark + path: | + tests/performance/benchmark_chart.md + tests/performance/pr-number.txt diff --git a/@skills/redocly-cli/.github/workflows/pr-title.yml b/@skills/redocly-cli/.github/workflows/pr-title.yml new file mode 100644 index 000000000..3d621706a --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/pr-title.yml @@ -0,0 +1,72 @@ +name: PR Title and Description Check + +on: + pull_request: + types: [opened, edited, synchronize, reopened] + +permissions: + contents: read + +jobs: + check-pr-title: + if: >- + github.event.pull_request.user.login != 'dependabot[bot]' && + github.event.pull_request.user.login != 'github-actions[bot]' + runs-on: ubuntu-latest + steps: + - name: Check PR title + env: + PR_TITLE: ${{ github.event.pull_request.title }} + run: | + if ! echo "$PR_TITLE" | grep -E "^(fix|feat|chore|docs)(\([a-z-]+\))?(\!)?: (🔖 |🧪 )?[a-z].+[^.]$"; then + echo "❌ PR title '$PR_TITLE' does not match the required format" + echo "Required format: type(scope): subject" + echo "Examples:" + echo " feat: add new feature" + echo " fix(core): fix bug" + echo " docs: update README" + echo " chore!: breaking change" + exit 1 + fi + echo "✅ PR title format is valid" + check-pr-required-checklist: + if: >- + github.event.pull_request.user.login != 'dependabot[bot]' && + github.event.pull_request.user.login != 'github-actions[bot]' + runs-on: ubuntu-latest + concurrency: # Allows debouncing when editing the PR description + group: pr-required-checklist-${{ github.event.pull_request.number }} + cancel-in-progress: true + steps: + - name: Debounce delay + run: sleep 30 # seconds + + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Check required checklist items + env: + PR_BODY: ${{ github.event.pull_request.body }} + run: | + echo "Checking required checklist items in PR description..." + + REQUIRED_CHECKS="$(grep 'required 🔒' .github/pull_request_template.md)" + + MISSING_REQUIRED_CHECKS=no + while read line; do + line="${line%%}" # clean up the line + while [[ "$line" == *[[:space:]] ]]; do + line="${line%[[:space:]]}" # strip trailing spaces + done + expected_checked_line="${line/#- [ \]/- [x]}" # expect the same line, but with checked box + if ! echo "$PR_BODY" | grep -Fiq -- "$expected_checked_line"; then + line="${line#- [ \] }" # clean up the line + echo "⚠️ Please acknowledge the following: $line" + MISSING_REQUIRED_CHECKS=yes + fi + done <<< "$REQUIRED_CHECKS" + + if [ "$MISSING_REQUIRED_CHECKS" = "yes" ]; then + exit 1 + fi + + echo "✅ Required checklist items are checked" diff --git a/@skills/redocly-cli/.github/workflows/pre-release.yaml b/@skills/redocly-cli/.github/workflows/pre-release.yaml new file mode 100644 index 000000000..e2a76c5d2 --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/pre-release.yaml @@ -0,0 +1,41 @@ +name: Pre-release Checks + +permissions: + contents: read + pull-requests: write + +on: + pull_request: + branches: + - main + +env: + CI: true + REDOCLY_TELEMETRY: off + +jobs: + checks: + # Run only on release branch (changeset-release/main): + if: github.head_ref == 'changeset-release/main' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + - name: Check Redocly Config Version + run: | + LATEST_VERSION=$(npm view @redocly/config version) + CURRENT_VERSION=$(jq -r '.dependencies["@redocly/config"] | ltrimstr("^") | ltrimstr("~")' packages/core/package.json) + echo Latest: $LATEST_VERSION, Current: $CURRENT_VERSION + if [ "$LATEST_VERSION" != "$CURRENT_VERSION" ]; then + COMMENT="⚠️ **Redocly Config version mismatch**: The latest published version of \`@redocly/config\` is \`$LATEST_VERSION\`, but the current version is \`$CURRENT_VERSION\`. Please consider updating to the latest version." + echo "$COMMENT" + gh pr comment $PR_NUMBER --body "$COMMENT" + exit 1 + else + echo "Redocly Config version is up to date: $CURRENT_VERSION" + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} diff --git a/@skills/redocly-cli/.github/workflows/release.yaml b/@skills/redocly-cli/.github/workflows/release.yaml new file mode 100644 index 000000000..72d5556b8 --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/release.yaml @@ -0,0 +1,262 @@ +name: Release + +on: + push: # for the regular release flow (release --> dockerhub --> post-release-smoke-checks --> notify) + branches: + - main + pull_request: # for the snapshot release flow + types: + - labeled + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + release: + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + name: Release + runs-on: ubuntu-latest + permissions: + id-token: write # Required for OIDC + contents: write + pull-requests: write + outputs: + published: ${{ steps.changesets.outputs.published }} + publishedPackages: ${{ steps.changesets.outputs.publishedPackages }} + steps: + - name: Checkout Repo + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Setup Node.js + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: npm + + - name: Install Dependencies + run: npm ci + + - name: Create Release Pull Request or Publish to npm + id: changesets + uses: RomanHotsiy/changesets-action@v1 + with: + # This expects you to have a script called release which does a build for your packages and calls changeset publish + publish: npm run release + commit: 'chore: 🔖 release new versions' + title: 'chore: 🔖 release new versions' + # This calculates the changed packages and creates an additional changeset for internal dependency updates. + # Then `changeset version` produces all necessary version bumps in package.json files. + # After that, `npm i` ensures the lockfile is updated with the new versions. + # Finally, the `post-changeset` script and updates the main changelog. + version: | + npx changeset status --output=__changesets__.json + node scripts/add-cli-dependency-changesets.js __changesets__.json + npx changeset version + npm i + node scripts/post-changeset.js + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + dockerhub: + needs: [release] + if: needs.release.outputs.published == 'true' + runs-on: ubuntu-latest + permissions: + packages: write + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Get version + id: get_version + run: | + value="$(cat packages/cli/package.json | jq -r '.version')" + echo "value=$value" >> "$GITHUB_OUTPUT" + + - name: Docker meta + id: docker_meta + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 + with: + images: | + redocly/cli + ghcr.io/redocly/cli + tags: | + ${{ steps.get_version.outputs.value }} + latest + + - name: Set up QEMU + uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 + + - name: Login to DockerHub + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0 + with: + context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.docker_meta.outputs.tags }} + labels: ${{ steps.docker_meta.outputs.labels }} + + post-release-smoke-checks: + needs: + - release + - dockerhub + name: Test released version + continue-on-error: true + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + - name: Install CLI from npm + run: npm i -g @redocly/cli@latest + - name: Test version from NPM + continue-on-error: true + run: | + expected_version="$(cat packages/cli/package.json | jq -r '.version')" + actual_version="$(redocly --version)" + if [[ $expected_version == $actual_version ]]; then + echo "The version is correct. Actual version: $actual_version" + else + echo "The version is incorrect. Expected: $expected_version, actual: $actual_version" + fi + redocly lint https://raw.githubusercontent.com/Rebilly/api-definitions/main/openapi/openapi.yaml --format=stylish + redocly bundle https://raw.githubusercontent.com/Rebilly/api-definitions/main/openapi/openapi.yaml -o bundled.json + redocly build-docs https://raw.githubusercontent.com/Rebilly/api-definitions/main/openapi/openapi.yaml + - name: Pull docker image + run: docker pull redocly/cli:latest + - name: Test docker image + continue-on-error: true + run: | + expected_version="$(cat packages/cli/package.json | jq -r '.version')" + actual_version="$(docker run --rm redocly/cli --version)" + if [[ $expected_version == $actual_version ]]; then + echo "The version is correct. Actual version: $actual_version" + else + echo "The version is incorrect. Expected: $expected_version, actual: $actual_version" + fi + docker run --rm redocly/cli lint https://raw.githubusercontent.com/Rebilly/api-definitions/main/openapi/openapi.yaml + docker run --rm redocly/cli bundle https://raw.githubusercontent.com/Rebilly/api-definitions/main/openapi/openapi.yaml --output=bundled.yaml + docker run --rm redocly/cli build-docs https://raw.githubusercontent.com/Rebilly/api-definitions/main/openapi/openapi.yaml + + notify: + needs: + - release + - post-release-smoke-checks + if: needs.release.outputs.published == 'true' + name: Send the Release Message to Slack + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Setup Node.js + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: npm + + - name: Install Dependencies + run: npm ci + + - name: Write release message to file + run: node scripts/write-release-message.js + + - name: Send to a Slack channel + id: slack + uses: slackapi/slack-github-action@fcfb566f8b0aab22203f066d80ca1d7e4b5d05b3 # v1.27.1 + with: + channel-id: C019K52TC0L #releases + payload-file-path: ./output/release-message.json + env: + SLACK_BOT_TOKEN: ${{ secrets.RELEASES_SLACK_BOT_TOKEN }} + + release-snapshot: + if: github.event_name == 'pull_request' && github.event.label.name == 'snapshot' + name: Release Snapshot + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + id-token: write # Required for OIDC + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Setup Node.js + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: npm + registry-url: https://registry.npmjs.org + + - name: Update package versions + run: | + TIMESTAMP=$(date +%s) + VERSION="0.0.0-snapshot.$TIMESTAMP" + + # Update Core package version + jq ".version = \"$VERSION\"" packages/core/package.json > tmp.json && mv tmp.json packages/core/package.json + + # Update Respect Core package version and dependencies + jq ".version = \"$VERSION\"" packages/respect-core/package.json > tmp.json && mv tmp.json packages/respect-core/package.json + jq ".dependencies[\"@redocly/openapi-core\"] = \"$VERSION\"" packages/respect-core/package.json > tmp.json && mv tmp.json packages/respect-core/package.json + + # Update CLI package version and dependencies, so npm links the local + # workspace packages instead of installing the published versions + jq ".version = \"$VERSION\"" packages/cli/package.json > tmp.json && mv tmp.json packages/cli/package.json + jq ".devDependencies[\"@redocly/openapi-core\"] = \"$VERSION\" | .devDependencies[\"@redocly/respect-core\"] = \"$VERSION\"" packages/cli/package.json > tmp.json && mv tmp.json packages/cli/package.json + + # Add comment with installation instructions + COMMENT="📦 A new experimental 🧪 version **v$VERSION** of Redocly CLI has been published for testing. + + Install with NPM: + \`\`\`bash + npm install @redocly/cli@$VERSION + \`\`\` + + ⚠️ Note: This is a development build and may contain unstable features." + + gh pr comment $PR_NUMBER --body "$COMMENT" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + + - name: Install dependencies + run: npm install + + - name: Build packages + run: npm run compile + + - name: Publish snapshot packages + run: | + git diff + + cd packages/core + npm publish --tag snapshot + sleep 10 + + cd ../respect-core + npm publish --tag snapshot + sleep 10 + + cd ../cli + npm run prepare:publish-dir + npm publish ./.publish --tag snapshot + npm run clean:publish-dir diff --git a/@skills/redocly-cli/.github/workflows/require-changeset.yaml b/@skills/redocly-cli/.github/workflows/require-changeset.yaml new file mode 100644 index 000000000..4af881a5c --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/require-changeset.yaml @@ -0,0 +1,29 @@ +name: Require Either a Changeset or a Label 'no changeset needed' + +permissions: + contents: read + +on: + pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] + branches: + - main + +jobs: + require-changeset-or-label: + if: ${{ !contains(github.event.pull_request.labels.*.name, 'no changeset needed') && github.head_ref != 'changeset-release/main' }} + runs-on: ubuntu-latest + env: + CI: true + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + # check out full history + fetch-depth: 0 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: npm + - run: npm ci + - name: Check for changeset + run: npx changeset status --since origin/main diff --git a/@skills/redocly-cli/.github/workflows/smoke-plugins.yaml b/@skills/redocly-cli/.github/workflows/smoke-plugins.yaml new file mode 100644 index 000000000..6e72e7edc --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/smoke-plugins.yaml @@ -0,0 +1,111 @@ +name: Smoke tests + +permissions: + contents: read + +on: + pull_request: + types: [opened, synchronize, reopened] + +env: + CI: true + REDOCLY_TELEMETRY: off + +jobs: + prepare-smoke-plugins: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: npm + - name: Install dependencies + run: npm ci + - name: Prepare Smoke + run: bash ./tests/smoke/plugins/prepare-smoke-plugins.sh + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/plugins/ + key: cache-plugins-${{ github.run_id }}-${{ github.run_attempt }} + + run-smoke-plugins--npm--node-24: + needs: prepare-smoke-plugins + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/plugins/ + key: cache-plugins-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + - run: bash ./tests/smoke/plugins/run-smoke.sh + + run-smoke-plugins--npm--node-24--windows: + needs: prepare-smoke-plugins + runs-on: windows-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/plugins/ + key: cache-plugins-${{ github.run_id }}-${{ github.run_attempt }} + enableCrossOsArchive: true + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + - run: bash ./tests/smoke/plugins/run-smoke.sh + + run-smoke-plugins--npm--node-22: + needs: prepare-smoke-plugins + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/plugins/ + key: cache-plugins-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 22 + - run: bash ./tests/smoke/plugins/run-smoke.sh + + run-smoke-plugins--npm--node-22--windows: + needs: prepare-smoke-plugins + runs-on: windows-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/plugins/ + key: cache-plugins-${{ github.run_id }}-${{ github.run_attempt }} + enableCrossOsArchive: true + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 22 + - run: bash ./tests/smoke/plugins/run-smoke.sh + + run-smoke-plugins--npm--node-20: + needs: prepare-smoke-plugins + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/plugins/ + key: cache-plugins-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 20 + - run: bash ./tests/smoke/plugins/run-smoke.sh + + run-smoke-plugins--npm--node-20--windows: + needs: prepare-smoke-plugins + runs-on: windows-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/plugins/ + key: cache-plugins-${{ github.run_id }}-${{ github.run_attempt }} + enableCrossOsArchive: true + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 20 + - run: bash ./tests/smoke/plugins/run-smoke.sh diff --git a/@skills/redocly-cli/.github/workflows/smoke-rebilly.yaml b/@skills/redocly-cli/.github/workflows/smoke-rebilly.yaml new file mode 100644 index 000000000..60104e3f9 --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/smoke-rebilly.yaml @@ -0,0 +1,30 @@ +name: Smoke tests + +permissions: + contents: read + +on: + pull_request: + types: [opened, synchronize, reopened] + +env: + CI: true + REDOCLY_TELEMETRY: off + +jobs: + run-smoke-rebilly: + # Only run if PR is from the same repository (not a fork) + if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: npm + - name: Install dependencies + run: npm ci + - name: Run Rebilly smoke test + run: npm run smoke:rebilly + env: + SANDBOX_REBILLY_TOKEN: ${{ secrets.SANDBOX_REBILLY_TOKEN }} diff --git a/@skills/redocly-cli/.github/workflows/smoke.yaml b/@skills/redocly-cli/.github/workflows/smoke.yaml new file mode 100644 index 000000000..acc5d1741 --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/smoke.yaml @@ -0,0 +1,332 @@ +name: Smoke tests + +permissions: + contents: read + +on: + pull_request: + types: [opened, synchronize, reopened] + +env: + CI: true + REDOCLY_TELEMETRY: off + +jobs: + prepare-smoke: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: npm + - name: Install dependencies + run: npm ci + - name: Prepare Smoke + run: bash ./tests/smoke/basic/prepare-smoke.sh + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + + run-smoke--npm--node-24: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + - run: bash ./tests/smoke/basic/run-smoke.sh "npm install" "npm run" + + run-smoke--npm--node-24--redoc: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + - name: Add redoc to deps + run: bash ./tests/smoke/basic/add-redoc.sh + - run: bash ./tests/smoke/basic/run-smoke.sh "npm install" "npm run" + + run-smoke--yarn--node-24: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + - run: bash ./tests/smoke/basic/run-smoke.sh "yarn install" "yarn" + + run-smoke--yarn--node-24--redoc: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + - name: Add redoc to deps + run: bash ./tests/smoke/basic/add-redoc.sh + - run: bash ./tests/smoke/basic/run-smoke.sh "yarn install" "yarn" + + run-smoke--pnpm--node-24: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + - name: Install pnpm + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 + with: + version: 10 + - run: bash ./tests/smoke/basic/run-smoke.sh "pnpm install" "pnpm run" + + # Skipped due to a known Windows + NodeJS v24 issue: https://github.com/nodejs/node/issues/56645 + # run-smoke--npm--node-24--windows: + # needs: prepare-smoke + # runs-on: windows-latest + # steps: + # - uses: actions/cache@v3 + # with: + # path: tests/smoke/basic/ + # key: cache-${{ github.run_id }}-${{ github.run_attempt }} + # enableCrossOsArchive: true + # - uses: actions/setup-node@v3 + # with: + # node-version: 24 + # - run: bash ./tests/smoke/basic/run-smoke.sh "npm i redocly-cli.tgz" "npm run" + + # run-smoke--yarn--node-24--windows: + # needs: prepare-smoke + # runs-on: windows-latest + # steps: + # - uses: actions/cache@v3 + # with: + # path: tests/smoke/basic/ + # key: cache-${{ github.run_id }}-${{ github.run_attempt }} + # enableCrossOsArchive: true + # - uses: actions/setup-node@v3 + # with: + # node-version: 24 + # - run: bash ./tests/smoke/basic/run-smoke.sh "yarn add ./redocly-cli.tgz --no-lockfile" "yarn" + + run-smoke--npm--node-22: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 22 + - run: bash ./tests/smoke/basic/run-smoke.sh "npm install" "npm run" + + run-smoke--npm--node-22--redoc: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 22 + - name: Add redoc to deps + run: bash ./tests/smoke/basic/add-redoc.sh + - run: bash ./tests/smoke/basic/run-smoke.sh "npm install" "npm run" + + run-smoke--yarn--node-22: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 22 + - run: bash ./tests/smoke/basic/run-smoke.sh "yarn install" "yarn" + + run-smoke--yarn--node-22--redoc: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 22 + - name: Add redoc to deps + run: bash ./tests/smoke/basic/add-redoc.sh + - run: bash ./tests/smoke/basic/run-smoke.sh "yarn install" "yarn" + + run-smoke--pnpm--node-22: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 22 + - name: Install pnpm + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 + with: + version: 10 + - run: bash ./tests/smoke/basic/run-smoke.sh "pnpm install" "pnpm run" + + run-smoke--npm--node-22--windows: + needs: prepare-smoke + runs-on: windows-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + enableCrossOsArchive: true + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 22 + - run: bash ./tests/smoke/basic/run-smoke.sh "npm install" "npm run" + + run-smoke--yarn--node-22--windows: + needs: prepare-smoke + runs-on: windows-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + enableCrossOsArchive: true + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 22 + - run: bash ./tests/smoke/basic/run-smoke.sh "yarn install" "yarn" + + run-smoke--npm--node-20: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 20 + - run: bash ./tests/smoke/basic/run-smoke.sh "npm install" "npm run" + + run-smoke--npm--node-20--redoc: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 20 + - name: Add redoc to deps + run: bash ./tests/smoke/basic/add-redoc.sh + - run: bash ./tests/smoke/basic/run-smoke.sh "npm install" "npm run" + + run-smoke--yarn--node-20: + needs: prepare-smoke + runs-on: ubuntu-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 20 + - run: bash ./tests/smoke/basic/run-smoke.sh "yarn install" "yarn" + + run-smoke--npm--node-20--windows: + needs: prepare-smoke + runs-on: windows-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + enableCrossOsArchive: true + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 20 + - run: bash ./tests/smoke/basic/run-smoke.sh "npm install" "npm run" + + run-smoke--yarn--node-20--windows: + needs: prepare-smoke + runs-on: windows-latest + steps: + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 + with: + path: tests/smoke/basic/ + key: cache-${{ github.run_id }}-${{ github.run_attempt }} + enableCrossOsArchive: true + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 20 + - run: bash ./tests/smoke/basic/run-smoke.sh "yarn install" "yarn" + + run-smoke--docker-image: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Build docker image + run: docker build -t redocly/cli:latest . + - name: Run docker image + run: | + # Prepare + cp resources/pets.yaml resources/museum.yaml resources/museum-tickets.arazzo.yaml tests/smoke/basic/ + cd tests/smoke/basic/ + + # Run commands + docker run --rm redocly/cli:latest --version + docker run --rm -v $PWD:/spec redocly/cli:latest lint openapi.yaml + docker run --rm -v $PWD:/spec redocly/cli:latest bundle openapi.yaml --ext json + docker run --rm -v $PWD:/spec redocly/cli:latest build-docs openapi.yaml + docker run --rm -v $PWD:/spec redocly/cli:latest split pets.yaml --outDir output/split/petstore && docker run --rm -v $PWD:/spec redocly/cli:latest split museum.yaml --outDir output/split/museum + docker run --rm -v $PWD:/spec redocly/cli:latest respect museum-tickets.arazzo.yaml + + # Check for broken styles when building docs (related issue: https://github.com/Redocly/redocly-cli/issues/1073) + echo "Checking docs for issues..." + diff pre-built/redoc.html redoc-static.html -u + echo "✅ Docs built correctly." + + # Check for broken $refs (or other issues) in the split files, especially on Windows (it will fail on a difference) + echo "Checking split files for issues..." + diff -r pre-split output/split -u + echo "✅ Files split correctly." diff --git a/@skills/redocly-cli/.github/workflows/tests.yaml b/@skills/redocly-cli/.github/workflows/tests.yaml new file mode 100644 index 000000000..c7432bee6 --- /dev/null +++ b/@skills/redocly-cli/.github/workflows/tests.yaml @@ -0,0 +1,51 @@ +name: Build and Test + +on: + pull_request: + types: [opened, synchronize, reopened] + push: + branches: + - main + +env: + CI: true + REDOCLY_TELEMETRY: off + +jobs: + build-and-unit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: npm + - name: Install dependencies + run: npm ci + - name: Typecheck + run: npm run typecheck + - name: Unit Tests + run: npm run unit + + - name: Coverage Report + if: always() # Also generate the report if tests are failing + continue-on-error: true # Do not fail if there is an error during reporting + uses: davelosert/vitest-coverage-report-action@d63aa97db4c0319f304f1787689de1ca548365cf # v2.11.1 + + - name: E2E Tests + run: npm run e2e + + code-style-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: 24 + cache: npm + - name: Install dependencies + run: npm ci + - name: Lint + run: npm run lint + - name: Check formatting + run: npm run format:check diff --git a/@skills/redocly-cli/.gitignore b/@skills/redocly-cli/.gitignore new file mode 100644 index 000000000..f2173085e --- /dev/null +++ b/@skills/redocly-cli/.gitignore @@ -0,0 +1,28 @@ +.DS_Store +.idea +node_modules/ +nodejs/ +coverage/ +.vscode/ +yarn.lock +lib/ +output/ +*.tar.gz +*.tsbuildinfo +*.tgz +redoc-static.html +.env +__changesets__.json + +# AI artifacts +.claude/settings.local.json +**/.claude/scheduled_tasks.lock +**/.claude/scheduled_tasks.json +**/.claude/routines/.state/ +**/.claude/worktrees/ +**/.claude/checkpoints/ +**/.claude/mailbox/ +**/.claude/agent-registry.json +**/.claude/agent-memory-local +**/.claude/first-run +**/.claude/assistant-daemon-state.json \ No newline at end of file diff --git a/@skills/redocly-cli/.husky/pre-commit b/@skills/redocly-cli/.husky/pre-commit new file mode 100755 index 000000000..2312dc587 --- /dev/null +++ b/@skills/redocly-cli/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/@skills/redocly-cli/.markdownlint.yaml b/@skills/redocly-cli/.markdownlint.yaml new file mode 100644 index 000000000..ab1a86e51 --- /dev/null +++ b/@skills/redocly-cli/.markdownlint.yaml @@ -0,0 +1,54 @@ +--- +# Default rules: https://github.com/github/super-linter/blob/master/TEMPLATES/.markdown-lint.yml + +# Rules by id + +# Unordered list style +MD004: false + +# Unordered list indentation +MD007: + indent: 2 + +MD013: + # TODO: Consider to decrease allowed line length + line_length: 800 + tables: false + +## Allow same headers in siblings +MD024: + siblings_only: true + +# Multiple top level headings in the same document +MD025: + front_matter_title: '' + +# Trailing punctuation in heading +MD026: + punctuation: '.,;:。,;:' + +# Ordered list item prefix +MD029: false + +# Unordered lists inside of ordered lists +MD030: false + +# Inline HTML +MD033: false + +# No bare urls +MD034: false + +# Emphasis used instead of a heading +MD036: false + +# Disable "First line in file should be a top level heading" +# We use uncommon format to add metadata. +# TODO: Consider to use "YAML front matter". +MD041: false + +# Rules by tags +blank_lines: false + +MD046: false +# code-block-style diff --git a/@skills/redocly-cli/.mlc.toml b/@skills/redocly-cli/.mlc.toml new file mode 100644 index 000000000..61a313f72 --- /dev/null +++ b/@skills/redocly-cli/.mlc.toml @@ -0,0 +1,8 @@ +# Ignore these links, we can't check them from this subproject +ignore-links=["../../*", "/docs/*", "/learn/*", + # skip this, it redirects to user login + "https://github.com/Redocly/redocly-cli/issues/*" +] +# Path to the root folder used to resolve all relative paths +root-dir="./docs" +offline = true diff --git a/@skills/redocly-cli/.oxfmtrc.json b/@skills/redocly-cli/.oxfmtrc.json new file mode 100644 index 000000000..86a784dac --- /dev/null +++ b/@skills/redocly-cli/.oxfmtrc.json @@ -0,0 +1,33 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "printWidth": 100, + "singleQuote": true, + "experimentalSortPackageJson": false, + "ignorePatterns": [ + "coverage/", + "lib/", + "output/", + "packages/respect-core/src/modules/runtime-expressions/abnf-parser.js", + "packages/core/src/rules/common/__tests__/fixtures/invalid-yaml.yaml", + "tests/performance/api-definitions/", + "tests/smoke/**/*.yaml", + "snapshot*.txt", + "*.html", + "*.hbs", + "*.toml", + "LICENSE.md", + "CHANGELOG.md", + ".changeset/pre.json" + ], + "experimentalSortImports": { + "groups": [ + ["side_effect"], + ["builtin", "external"], + ["index", "sibling", "parent"], + ["unknown"] + ], + "newlinesBetween": true, + "ignoreCase": true + }, + "trailingComma": "es5" +} diff --git a/@skills/redocly-cli/.oxlintrc.json b/@skills/redocly-cli/.oxlintrc.json new file mode 100644 index 000000000..e98cdc4a7 --- /dev/null +++ b/@skills/redocly-cli/.oxlintrc.json @@ -0,0 +1,73 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "import"], + "jsPlugins": ["./plugins/oxlint-redocly-plugin.js"], + "categories": { + "correctness": "error" + }, + "env": { + "builtin": true, + "es2026": true + }, + "ignorePatterns": ["packages/*/lib/**", "*.js", "*.cjs"], + "rules": { + "eslint/no-array-constructor": "error", + "eslint/no-case-declarations": "error", + "eslint/no-console": "error", + "eslint/no-empty": "error", + "eslint/no-redeclare": "error", + "eslint/no-regex-spaces": "error", + "eslint/no-unexpected-multiline": "error", + "eslint/no-unreachable": "error", + "eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrors": "none" + } + ], + + "typescript/ban-ts-comment": "error", + "typescript/no-empty-object-type": "error", + "typescript/no-explicit-any": "warn", + "typescript/no-namespace": "error", + "typescript/no-require-imports": "error", + "typescript/no-unnecessary-type-constraint": "error", + "typescript/no-unsafe-function-type": "error", + "typescript/consistent-type-imports": [ + "warn", + { + "prefer": "type-imports", + "fixStyle": "inline-type-imports" + } + ], + + "import/no-cycle": ["warn"], + "import/no-duplicates": [ + "error", + { + "preferInline": true + } + ], + + "oxlint-redocly-plugin/no-typeof-object": "error" + }, + "overrides": [ + { + "files": ["**/__tests__/**"], + "plugins": ["vitest"], + "rules": { + "typescript/no-explicit-any": "allow", + "typescript/ban-ts-comment": "allow", + "eslint/no-control-regex": "allow" + } + }, + { + "files": ["packages/core/src/logger.ts"], + "rules": { + "eslint/no-console": "allow" + } + } + ] +} diff --git a/@skills/redocly-cli/.vale.ini b/@skills/redocly-cli/.vale.ini new file mode 100644 index 000000000..15d4698db --- /dev/null +++ b/@skills/redocly-cli/.vale.ini @@ -0,0 +1,44 @@ +# Vale configuration file. +# See: https://docs.errata.ai/vale/config + +# The relative path to the folder containing linting rules (styles). +StylesPath = ".github/styles" + +# Vocab define the exceptions to use in *all* `BasedOnStyles`. +# spelling-exceptions.txt triggers `Vale.Terms` +# reject.txt triggers `Vale.Avoid` +# See: https://docs.errata.ai/vale/vocab +Vocab = Redocly-Docs + +# Minimum alert level +# ------------------- +# The minimum alert level in the output (suggestion, warning, or error). +# If integrated into CI, builds fail by default on error-level alerts, unless you run Vale with the --no-exit flag +MinAlertLevel = suggestion + +# IgnoredScopes specifies inline-level HTML tags to ignore. +# These tags may occur in an active scope (unlike SkippedScopes, skipped entirely) but their content still won't raise any alerts. +# Default: ignore `code` and `tt`. +IgnoredScopes = code, tt, img, url + +# SkippedScopes specifies block-level HTML tags to ignore. Ignore any content in these scopes. +# Default: ignore `script`, `style`, `pre`, and `figure`. +SkippedScopes = script, style, pre, figure, code, tt, listingblock, literalblock + +# Rules for matching file types. See: https://docs.errata.ai/vale/scoping + +[formats] +properties = md +mdx = md + +# Rules for .MD, .MDX +[*.{md,mdx}] + +BasedOnStyles = Redocly-Docs +# Ignore code surrounded by backticks +TokenIgnores = (\x60[^\n\x60]+\x60) +# /End of rules for .MD, .MDX + + +# Process .ini files +[*.ini] diff --git a/@skills/redocly-cli/AGENTS.md b/@skills/redocly-cli/AGENTS.md new file mode 100644 index 000000000..e14ee63ea --- /dev/null +++ b/@skills/redocly-cli/AGENTS.md @@ -0,0 +1,218 @@ +# Contributing to Redocly CLI with AI assistants + +AI-assisted contributions are welcome, but the bar is the same as for any other code: a change must be simple, readable, tested, and explainable by the person who opens the pull request. +This file tells an AI assistant — and its human — how to produce a change that fits Redocly CLI and survives review. + +It is the single source of truth for AI tools, read from the repository root — directly or through a tool-specific pointer file. +The detailed operating rules live in [`.claude/rules/`](./.claude/rules), and the sections below link to them for the full depth. +For full development setup, the complete test command reference, and the release flow, see [`CONTRIBUTING.md`](./CONTRIBUTING.md). + +## How we work + +- Write the simplest code that solves the problem and matches the surrounding file. + Don't add wrappers, layers, or abstractions for something used in one place. +- Every PR is reviewed in details: code that can't be explained gets rejected. + If you can't say why a line is there, remove it. +- Push back when something looks wrong. + A good contribution argues for the better solution instead of agreeing with every instruction. +- Base changes on what the code and configuration actually do, not on assumptions. + Read the relevant file before you change it. +- Use plain English in comments, commit messages, and PR descriptions — no filler and no marketing tone. +- For experimental features, follow the [experimental features checklist](./CONTRIBUTING.md#experimental-features) in the contributing guide. + +The principles behind this, ordered by value, are in [`.claude/rules/core-principles.md`](./.claude/rules/core-principles.md). + +## Commands + +```bash +# Install dependencies +npm install + +# Compile TypeScript (required before running tests) +npm run compile + +# Type checking only (no emit) +npm run typecheck + +# Run all unit tests +npm run unit + +# Run a single test file +npm run unit -- packages/core/src/__tests__/some.test.ts + +# Run tests matching a name pattern +npm run unit -- -t 'test name pattern' + +# Update snapshots +npm run unit -- -u + +# Run e2e tests +npm run e2e + +# Run the full test suite (compile + typecheck + unit + e2e) +npm test + +# Lint +npm run lint + +# Format +npm run format + +# Run the CLI directly from source +npm run cli -- lint openapi.yaml +``` + +## Architecture + +This is a TypeScript monorepo with npm workspaces containing three packages: + +### `packages/core` (@redocly/openapi-core) + +The heart of the project. +Handles all OpenAPI/AsyncAPI linting, validation, bundling, and decoration logic. +This package is also used in external apps such as `language-server` and `vs-code-extension`. + +Key directories: + +- `src/rules/` — Built-in linting rules, organized by spec type (`oas2/`, `oas3/`, `oas3_1/`, `async2/`, `async3/`, `arazzo/`, `common/`). Each rule is its own file. +- `src/config/` — Configuration loading and resolution (reads `redocly.yaml`). +- `src/decorators/` — Built-in decorators for transforming API descriptions. +- `src/bundle/` — Bundling logic that resolves `$ref` across multiple files. +- `src/resolve.ts` — Document resolution for multi-file specs (local and remote). +- `src/types/` — TypeScript type definitions for OAS2, OAS3, AsyncAPI, Arazzo. + +### `packages/cli` (@redocly/cli) + +User-facing CLI layer built on top of core. +Uses yargs for argument parsing. + +- `src/index.ts` — Main command dispatcher. +- `src/commands/` — One file per command. +- Commands use `commandWrapper()` for consistent output, config loading, config linting, and exit codes (0 = success, 1 = execution error, 2 = config error). + +### `packages/respect-core` (@redocly/respect-core) + +API contract testing framework. +Validates real API responses against OpenAPI/Arazzo specs. + +- `src/run.ts` — Test execution logic. +- `src/modules/` — Core testing modules, including runtime expression evaluation. + +## Build System + +`packages/core` and `packages/respect-core` are compiled by TypeScript (`tsc -b tsconfig.build.json`). +`packages/cli` is bundled by esbuild (`packages/cli/scripts/build.mjs`) — it produces `lib/index.js` (entry chunk, ~450 kB) and lazy chunks under `lib/chunks/` (redoc + react, loaded only when `build-docs` runs). +The root `npm run compile` runs both steps: tsc for core/respect-core, then the esbuild bundle for the CLI. + +The published CLI package ships from a staged `.publish/` directory (created by `packages/cli/scripts/prepare-publish-dir.mjs`) with a hand-crafted `package.json` that has zero runtime dependencies — everything is bundled. + +## Respect the architecture: Walker, Visitors, Nodes + +Linting in `packages/core` rests on three concepts: the **Walker** traverses the parsed API description and resolves `$ref`s, **Visitors** are objects keyed by **Node** type, and the Walker calls each visitor's `enter` / `leave` / `skip` hooks as it reaches a node. +New rules and decorators follow this pattern instead of parsing documents by hand. +The full guide, with examples, is in [`.claude/rules/rules-system.md`](./.claude/rules/rules-system.md). + +## Add or change a built-in rule + +A rule is not finished when its logic works. +To avoid a half-wired rule, a new rule must also be: + +- Registered in the spec index (for example `packages/core/src/rules/oas3/index.ts`). +- Added to the `minimal`, `recommended`, `recommended-strict`, `spec`, and `all` rulesets with sensible severities — the defaults are `off` or `warn` for `minimal` and `recommended`, and `error` for `all`. +- Added to the built-in rules list in `packages/core/src/types/redocly-yaml.ts`. +- Documented: a new page under `docs/@v2/`, a link from the built-in rules list and the sidebar, plus updates to the rulesets and ruleset-templates pages. + +Naming and reuse: + +- If the rule enforces a specification requirement, prefix its name with `spec-` and add it to the spec ruleset in `packages/core/src/config/spec.ts`. +- If the same concept already exists for another spec flavor, reuse that rule name so it stays discoverable across specs. +- Prefer real rule code over assertion-based (`redocly.yaml`) rules when contributing to the core rule set. + +## Testing + +- **Compile before testing.** Unit tests import from `lib/` (compiled output), not `src/` — run `npm run compile` after every change. +- Cover the feature or fix with one focused test, not a pile of redundant ones. + A single clear test that exercises the behavior is enough. +- Rule unit tests parse a YAML document, run `lintDocument`, and assert with `toMatchInlineSnapshot` so the whole output stays visible. + Generate or update snapshots as part of the change. +- Don't add `console.log` or write to `stdout` / `stderr` directly — it breaks the e2e snapshots. + Use the `logger` from `@redocly/openapi-core` (see [`CONTRIBUTING.md`](./CONTRIBUTING.md#logging)). +- A `redocly.yaml` in the repository root affects unit tests in the CLI package. + Remove it before running them. +- Run the full suite (`npm test`) when you touch core linting logic. + +The full testing and QA rules are in +[`.claude/rules/testing.md`](./.claude/rules/testing.md). + +The rule test pattern looks like this: + +```ts +import { outdent } from 'outdent'; +import { parseYamlToDocument, replaceSourceWithRef } from '../../../../__tests__/utils.js'; +import { createConfig } from '../../../config/index.js'; +import { lintDocument } from '../../../lint.js'; +import { BaseResolver } from '../../../resolve.js'; + +describe('Oas3 no-my-rule', () => { + it('should report a violation', async () => { + const document = parseYamlToDocument( + outdent` + openapi: 3.0.0 + ... + `, + 'foobar.yaml' + ); + + const results = await lintDocument({ + externalRefResolver: new BaseResolver(), + document, + config: await createConfig({ rules: { 'no-my-rule': 'error' } }), + }); + + expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`...`); + }); +}); +``` + +## Code quality — no AI slop + +Before opening a PR, strip the things an assistant tends to add that a human reviewer would not: + +- Comments that restate the code or don't match the file's existing comment density. +- Defensive `try/catch` or null checks in trusted, already-validated code paths. +- Casts to `any` to silence the type checker — fix the type instead. +- Helpers or wrappers used in only one place. +- Single-letter or abbreviated names (`m`, `p`, `e`). + Use descriptive names like `pkgRootMatch`, `inputPath`, `error`. + This applies across every package and script. + +The full list of practices this repo enforces is in [`.claude/rules/code-quality-standards.md`](./.claude/rules/code-quality-standards.md). + +## Documentation and user-facing output + +- Update the docs for every new or changed rule, decorator, option, or command — a feature without docs is incomplete. +- Keep user-facing output (CLI messages, warnings, errors) clear, non-technical, and actionable. +- Don't create explanation, summary, or design files unless asked. + Put the explanation in the PR description. + +The full documentation and output rules are in [`.claude/rules/documentation.md`](./.claude/rules/documentation.md). + +## Changesets and commits + +The full release and commit workflow is in [`.claude/rules/workflow.md`](./.claude/rules/workflow.md). + +- Every feature or fix needs a changeset: run `npx changeset` and describe the change in sentence case. + If the change lives in `packages/core` or `packages/respect-core` but affects CLI behavior, include `@redocly/cli` as well. + All three packages share one version and release together. +- Use [Conventional Commits](https://www.conventionalcommits.org/) for commit messages. +- Don't add AI co-author or "Generated by" lines to commits. +- Don't modify the pull request template. +- Let the contributor review and make the commit — don't commit automatically. + +## Security basics + +The full security guidelines are in [`.claude/rules/security-guidelines.md`](./.claude/rules/security-guidelines.md). + +- Never hardcode credentials, tokens, or secrets. +- Validate and type-check external input (configuration, CLI arguments, fetched documents) before using it. +- Don't use `eval` or build shell commands from unsanitised input. diff --git a/@skills/redocly-cli/CLAUDE.md b/@skills/redocly-cli/CLAUDE.md new file mode 100644 index 000000000..3efdd7ed7 --- /dev/null +++ b/@skills/redocly-cli/CLAUDE.md @@ -0,0 +1,6 @@ +@AGENTS.md + +## Claude Code + +Claude Code auto-loads the operating rules under `.claude/rules/`. +Run `/deslop` to strip AI slop from the current diff before opening a PR. diff --git a/@skills/redocly-cli/CONTRIBUTING.md b/@skills/redocly-cli/CONTRIBUTING.md new file mode 100644 index 000000000..2b820180c --- /dev/null +++ b/@skills/redocly-cli/CONTRIBUTING.md @@ -0,0 +1,436 @@ +# Redocly CLI Contributing Guide + +Hi! We're really excited that you are interested in contributing to Redocly CLI. +Before submitting your contribution though, please make sure to take a moment and read through the following guidelines. + +If you're contributing with an AI assistant, make sure it follows the guidelines in [`AGENTS.md`](./AGENTS.md). +Most tools pick it up automatically; if yours doesn't, point it at the file. +Issue comments and discussion replies are expected to be written in the contributor's own words rather than generated by AI. + +- [Issue reporting guidelines](#issue-reporting-guidelines) +- [Pull request guidelines](#pull-request-guidelines) +- [Development guidelines](#development-guidelines) + - [Commonly used NPM scripts](#commonly-used-npm-scripts) + - [Logging](#logging) + - [Built-in rules changes](#built-in-rules-changes) + - [Update Redoc](#update-redoc) + - [Arguments usage](#arguments-usage) + - [Exit codes](#exit-codes) + - [Local source code usage](#local-source-code-usage) +- [Tests](#tests) +- [Contribute documentation](#contribute-documentation) +- [Contribute to the cookbook](#contribute-to-the-cookbook) +- [Project structure](#project-structure) +- [Release flow](#release-flow) + +## Issue reporting guidelines + +- Before opening a new issue, try to make sure the same problem or idea hasn't already been reported. + You can do that on the [Issues page](https://github.com/Redocly/redocly-cli/issues) in the repository and using the filter `is:issue` combined with some keywords relevant to your idea or problem. + It helps us notice that more people have the same issue or use case, and reduces the chance of getting your issue marked as a duplicate. + Plus, you can even find some workarounds for your issue in the comments of a previously reported one! + +- The best way to get your bug fixed is to provide a (reduced) test case. + List and explain the steps we should take to try and hit the same problem you're having. + It helps us understand in which conditions the issue appears, and gives us a better idea of what may be causing it. + +- Abide by our [Code of Conduct](https://redocly.com/code-of-conduct/) in all your interactions on this repository, and show patience and respect to other community members. + +## Pull request guidelines + +Before submitting a pull request, please make sure the following is done: + +1. Pull/fork the repository and create your branch from `main`. +1. Run `npm install` in the repository root. +1. If you've fixed a bug or added code that should be tested, don't forget to add [tests](#tests)! +1. Ensure the test suite and lint checks pass (`npm run test` and `npm run lint`). +1. It's your responsibility to ensure your contribution does not violate copyright laws. +1. Each feat/fix PR should also contain a changeset (to create one, run `npx changeset`). + If your changes are scoped to `packages/core` or `packages/respect-core` but also affect Redocly CLI behavior, include the `@redocly/cli` package as well. + Describe what you've done in this PR using sentence case (you can refer to our [changelog](https://redocly.com/docs/cli/changelog/)). + This creates a file in the `.changeset` folder. + Commit this file with your changes. + If the PR doesn't need a changeset (for example, it is a small change, or updates only documentation), add the `no changeset needed` label to the PR. +1. Use the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format for commit messages. + +**Please do not modify the PR template.** + +**Maintainers (when merging):** remove redundant intermediate commit descriptions and keep the main commit description (plus co-authors if needed). +If several commit descriptions should be preserved, rebase instead of squashing. + +### Experimental features + +We accept contributions for experimental features, but they should be clearly marked as such in the documentation and changeset. +Checklist for experimental features: + +1. Clean code isolation (preferably one entrypoint to the existing code). +1. Reuse of existing approaches, concepts, patterns, types, functions, and constants (such as walker, `NodeType`, `detectSpec`, `isRef`, etc.). +1. No unnecessary concept duplication. +1. Clean, concise docs. +1. No excessive unit tests (especially testing internal implementation details), prefer e2e. + You can request the coverage threshold adjustment if needed. + +## Development guidelines + +[Node.js](http://nodejs.org) at v22.12.0+ and NPM v11+ are required. + +After forking the repo, run: + +```bash +npm install # or npm i +``` + +### Commonly used NPM scripts + +To compile the code, run `npm run compile`. + +To run a specific CLI command, use `npm run cli`, e.g. `npm run cli -- lint resources/museum.yaml --format=stylish`. +Notice that the extra `--` is required to pass arguments to the CLI rather than to NPM itself. + +Format your code with `npm run format` before committing. + +Check the [Tests section](#tests) for the test commands reference. + +There are some other scripts available in the `scripts` section of the `package.json` file. + +### Logging + +When contributing to Redocly CLI, it's important to follow these logging guidelines: + +1. Use the built-in logger from `@redocly/openapi-core` package: + + ```typescript + import { logger } from '@redocly/openapi-core'; + ``` + +1. All informational messages, warnings, and errors should be written to `stderr` using the appropriate logger methods: + - `logger.info()` for general information + - `logger.warn()` for warnings + - `logger.error()` for errors + +1. Only write to `stdout` when the output is meant to be consumed by other applications or tools (like when piping to `jq` or other CLI tools). + This includes: + - command output that needs to be parsed + - interactive outputs (like login/logout responses) + - data that needs to be piped to other commands + + ```typescript + logger.output(JSON.stringify(stats, null, 2)); + ``` + +1. Avoid using `console.log`, `console.error`, or direct `process.stdout.write`/`process.stderr.write` calls. + Always use the logger methods to ensure consistent output formatting and proper stream usage. + +### Built-in rules changes + +After adding a new rule, make sure it is added to the `minimal`, `recommended`, `recommended-strict` (the same as the previous but with warnings turned into error), `spec`, and `all` rulesets with appropriate severity levels. +The defaults are `off` or `warn` for `minimal` and `recommended` and `error` for `all`. +Also add the rule to the built-in rules list in [the config types tree](./packages/core/src/types/redocly-yaml.ts). + +If the rule reflects a specification requirement, prefix it with `spec-` and add it to the [spec ruleset](./packages/core/src/config/spec.ts). +If a rule already exists for another specification flavor, reuse the existing name so the same concept stays discoverable across specs. + +Separately, open a pull request with the corresponding documentation changes. +To make changes to documentation: + +1. Create a new page for the rule in the `docs/@v2` folder. +1. Add the link to the rule page to the [built-in rules list](docs/@v2/rules/built-in-rules.md) and the [sidebar](docs/@v2/v2.sidebars.yaml). +1. Update the rulesets pages and [ruleset templates](docs/@v2/rules/ruleset-templates.md). + +### Update Redoc + +When updating Redoc, recompute the subresource integrity [SRI](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) (`redocStandaloneSri` in [package.ts](./packages/cli/src/utils/package.ts)): + +```bash +openssl dgst -sha384 -binary node_modules/redoc/bundles/redoc.standalone.js | openssl base64 -A +``` + +The SRI value also appears in [e2e test snapshots](#e2e-tests) — update those too. + +### Arguments usage + +There are three ways of providing arguments to the CLI: environment variables, command line arguments, and a Redocly configuration file. + +#### Environment variables + +Environment variables should be used to provide some arguments that are common for all the commands. +We always prefer configuration over environment variables. +Environment variables should not affect the **core** package logic. + +#### Command line arguments + +Use them to provide some arguments that are specific to a certain command. +Think of them as modifiers. +They should not affect the **core** package logic. + +#### Configuration file + +The **redocly.yaml** file is the most flexible way of providing arguments. +Please use it to provide arguments that are common for all the commands, for a specific command, or for a specific API. +It could be used for providing arguments for both **cli** and **core** packages. +Please refer to the [configuration file](https://redocly.com/docs/cli/configuration/) documentation for more details. + +### Exit codes + +The application maintains the following exit codes. + +| Exit code | Description | +| --------- | ------------------------- | +| 0 | Success | +| 1 | Command execution error | +| 2 | Config resolution failure | + +### Local source code usage + +There are two options for testing local changes in other local applications: + +- NPM linking +- local packing and installing from the `redocly-cli.tgz` file + +#### NPM linking + +To test the local source code of the packages in other local applications, you can use npm linking. +To learn how to use npm linking, see the [offical docs](https://docs.npmjs.com/cli/v9/commands/npm-link). + +#### Local packing and installing + +To test local changes as a package, you can use the following steps: + +1. (Optional) Change the version of the packages. + +1. Run `npm run pack:prepare` in the repository's root. + This command generates **redocly-cli.tgz**, **respect-core.tgz**, and **openapi-core.tgz** files. + +1. Copy these **.tgz** files to a destination folder and then run `npm install redocly-cli.tgz` there to install Redocly CLI. + To install `openapi-core`: repeat this step, but with **openapi-core.tgz** file. + +## Tests + +When running tests, make sure the code is compiled (`npm run compile`). +Having `redocly.yaml` in the root of the project affects the unit tests, and console logs affect the e2e tests, so make sure to get rid of both before running tests. +Run `npm test` to start both unit and e2e tests (and additionally typecheck the code). + +### Unit tests + +Run unit tests with this command: `npm run unit`. + +Unit tests in the **cli** package are sensitive to top-level configuration file (**redocly.yaml**). + +- To run tests from a single file, run: `npm run unit -- ` +- To run a specific test, use this command: `npm run unit -- -t 'Test name'`. +- To update snapshots, run `npm run unit -- -u`. +- To skip coverage, run the command with `--coverage=false`. + +### E2E tests + +Run e2e tests with this command: `npm run e2e`. + +E2E tests are sensitive to any additional output (like `console.log`) in the source code. + +To update snapshots, run `npm run e2e -- -u`. + +The e2e tests are written and run with [Vitest](https://vitest.dev/). +They live under `tests/e2e/`, grouped by command. + +Note that the snapshot does not always match the command output because of the way stdout and stderr are combined in [`getCommandOutput`](./tests/e2e/helpers.ts). +This is intentional so outputs stay consistent for snapshot testing. +The order of stdout and stderr in a snapshot may differ from what you see in the terminal, but the combined output is stable. + +### Smoke tests + +Smokes are for testing the CLI in different environments. + +To run them locally, please follow the steps described in the smoke GitHub actions: [smoke-basic](.github/workflows/smoke.yaml), [smoke-plugins](.github/workflows/smoke-plugins.yaml), [smoke-rebilly](.github/workflows/smoke-rebilly.yaml). + +To update smoke tests for the `build-docs` command (which sometimes fails due to external package updates), please follow the steps below: + +```sh +# Build and install the current CLI build locally +npm run compile +npm run pack:prepare +npm i -g redocly-cli.tgz + +# Re-build the docs +(cd tests/smoke/basic/ && redocly build-docs openapi.yaml -o pre-built/redoc.html) +``` + +Don't forget to visually check the [changes](tests/smoke/basic/pre-built/redoc.html) in a browser. +For other commands you'd have to do something similar. + +### Performance benchmark + +To run the performance tests locally, you should have `hyperfine` (v1.16.1+) installed on your machine. +Prepare the local build, go to the `tests/performance` folder, clean it up, do the preparations: + +```sh +(npm run compile && npm run pack:prepare && cd tests/performance/ && git clean -dX -f . && git clean -dX -ff . && rm -rf node_modules && rm -f package-lock.json && npm i && npm run make-test) +``` + +and run the actual test: + +```sh +(cd tests/performance/ && npm run test) +``` + +You might need to adjust the CLI versions that need to be tested in the `tests/performance/package.json` file. +There are also other commands available for your convenience to test specific commands like `lint` or `check-config`. + +### Manual tests + +What should be verified when changes are applied to the `respect-core` package: + +- `mTLS` is working. Can be done by calling API endpoint with mTLS authentication `npm run cli respect {YOUR}.arazzo.yaml -- --verbose --mtls=='{"domain":{"caCert":"ca-cert.pem", "clientKey":"client-key.pem","clientCert":"client-cert.pem"}}'`. + [Learn more about mTLS usage in Respect](https://redocly.com/docs/respect/guides/mtls-cli#use-mtls-with-respect-in-redocly-cli). +- File upload is working for both `multipart/form-data` and `application/octet-stream`. + +## Contribute documentation + +Additions and updates to our documentation are very welcome. +You can find the documentation in the `docs/` folder, and this is published to https://redocly.com/docs/cli/ as part of our main website. + +To preview your documentation changes locally: + +1. Make sure `redocly` is already installed on your local computer. + See [installation](https://redocly.com/docs/cli/installation/). + +1. Run this command from the `docs/` folder: + + ```bash + redocly preview + ``` + +By default, you can access the docs preview at http://localhost:4000 or http://127.0.0.1:4000. + +> Currently, the custom Markdoc tags used in the main website are not available in the local preview version, and links that point to the wider website do show as errors when using a local platform. +> Pull request workflows generate full previews: you will be able to check if everything is in good shape before we review and merge your changes. + +### Prose linting + +We are proud of our docs. +When you open a pull request, we lint the prose using [Vale](https://vale.sh/). +You can also install this tool locally and run it from the root of the project with: + +```bash +vale README.md docs/ .changeset +``` + +The configuration is in `.vale.ini` in the root of the project. + +### Markdown linting + +We use [Markdownlint](https://github.com/DavidAnson/markdownlint-cli2) to check that the Markdown in our docs is well formatted (config: `.markdownlint.yaml`). +The checks run on pull requests; locally, from the repository root: + +```bash +npx markdownlint-cli2 "docs/**/*.md" +``` + +> Note that formatter also runs and reformats Markdown files. +> Use `npm run format` from the root of the project. + +> Please use semantic line breaks in markdown files (preferably splitting sentences into separate lines). + +### Markdown link checking + +We use [`mlc`](https://github.com/becheran/mlc) to check the links in the `docs/` folder. +This tool runs automatically on every pull request, but you can also run it locally if you want to. +Visit the project homepage to find the installation instructions for your platform, and then run the command like this: + +```bash +mlc docs/ +``` + +The tool only checks links within the local docs (it can't check links to other docs sections that are present when we publish all products under https://redocly.com/docs), and doesn't currently check anchors. +Take care when renaming pages or titles. + +## Contribute to the Cookbook + +The [Cookbook](./cookbook) is a community collection of rulesets, configuration, custom plugins, and other Redocly CLI additions. +Unlike the packages, it is not built or tested as part of the CLI — treat every entry as a shared example that people use at their own risk. +A Cookbook-only change does not affect the published packages, so it does not need a changeset; add the `no changeset needed` label to the pull request instead. + +To add an entry: + +1. Pick the top-level category under `cookbook/` that fits best (`rulesets`, `configurable-rules`, `custom-plugins`, `custom-plugin-decorators`, `custom-plugin-rules`, or `miscellaneous`), and create a directory inside it named for what you are adding. + Give it a meaningful name — people browse the collection this way. + + ```text + cookbook + └── configurable-rules + └── endpoints-are-tagged-cupcake + ``` + +1. Put the file or files you want to share into the new directory, and name them so others can reuse and understand them. + +1. Add a `README.md` to the directory that explains the problem the entry solves and any context a reader needs to reuse it successfully. + Follow the structure of the existing entries. + +1. List your entry in the relevant section of the [Cookbook catalog](./cookbook/README.md). + +1. Open a pull request. + Someone from Redocly will review it, suggest changes if needed, and merge it once it is ready. + +## Project structure + +- **`tests/e2e`**: contains e2e tests. + +- **`tests/performance`**: contains the performance benchmark. + +- **`tests/smoke`**: contains smoke tests. + +- **`docs`**: contains the documentation source files. When changes to the documentation are merged, they automatically get published on the [Redocly docs website](https://redocly.com/docs/cli/). + +- **`packages`**: contains the source code. It consists of three packages - CLI, core, and respect-core. The codebase is written in Typescript. + - **`packages/cli`**: contains Redocly CLI commands and utils. More details [in the README](./README.md) file. + - **`packages/cli/src`**: contains CLI package source code. + - **`packages/cli/src/commands`**: contains CLI commands functions. + + - **`packages/core`**: contains Redocly CLI core functionality like rules, decorators, etc. + - **`packages/core/src`**: contains core package source code. + - **`packages/core/src/config`**: contains the base configuration options. + - **`packages/core/src/decorators`**: contains the built-in [decorators](docs/@v2/decorators.md) code. + - **`packages/core/src/format`**: contains the format options. + - **`packages/core/src/js-yaml`**: contains the [JS-YAML](https://www.npmjs.com/package/js-yaml) based functions. + - **`packages/core/src/rules`**: contains the built-in [rules](docs/@v2/rules/built-in-rules.md) code. + - **`packages/core/src/types`**: contains the common types for several OpenAPI versions. + - **`packages/core/src/typings`**: contains the common Typescript typings. + + - **`packages/respect-core`**: contains the Respect core package. + +- **`resources`**: contains some example API descriptions and configuration files that might be useful for testing. + +- **`cookbook`**: contains the community cookbook — shared rulesets, configuration, custom plugins, and other Redocly CLI additions. It is not part of the build or test suite. + +## Release flow + +We use [Changesets](https://github.com/changesets/changesets) flow. +After merging a PR with a changeset, the release PR is automatically created. + +If the pipelines are not starting, close and reopen the PR. +Merging that PR triggers the release process. + +### Revert a release + +There's no possibility to revert a release itself. +However, you can release a new version with a problematic commit reverted. + +1. Create a new branch from **main**. +1. Find the hash of the commit you want to revert and run `git revert `. +1. Create a patch-level changeset for the revert and open a PR with it. +1. Merge the PR and cut a release according to the [Release flow](#release-flow). + +### Snapshot release + +To release an experimental version to the **NPM** registry, follow these steps: + +1. Create a new PR to **main**. +1. Add the `snapshot` label to the PR. + This triggers a release of the current branch changes to the **NPM** registry under the `snapshot` tag. + +The released version can be installed with `npm install @redocly/cli@snapshot`. + +### Release a V1 version + +Redocly CLI v1 is currently in archive mode, but still can receive bug fixes. + +To release a new version, switch to the `v1` branch and follow the steps described in the Contribution guide (the `CONTRIBUTING.md` file). diff --git a/@skills/redocly-cli/Dockerfile b/@skills/redocly-cli/Dockerfile new file mode 100644 index 000000000..6a0b8e7c5 --- /dev/null +++ b/@skills/redocly-cli/Dockerfile @@ -0,0 +1,15 @@ +FROM node:24-alpine + +WORKDIR /build +COPY . . +RUN apk add --no-cache jq git && \ + npm ci --ignore-scripts && \ + npm run prepare && \ + npm run pack:prepare && \ + npm install --global redocly-cli.tgz && \ + # Clean up to reduce image size + npm cache clean --force && rm -rf /build + +WORKDIR /spec +ENTRYPOINT ["redocly"] +ENV REDOCLY_ENVIRONMENT=docker diff --git a/@skills/redocly-cli/LICENSE.md b/@skills/redocly-cli/LICENSE.md new file mode 100644 index 000000000..7932c885b --- /dev/null +++ b/@skills/redocly-cli/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2019 Redocly Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@skills/redocly-cli/README.md b/@skills/redocly-cli/README.md new file mode 100644 index 000000000..1f856f739 --- /dev/null +++ b/@skills/redocly-cli/README.md @@ -0,0 +1,172 @@ +# Redocly CLI + +[@Redocly](https://redocly.com) CLI is your all-in-one API documentation utility. +It builds, manages, improves, and quality-checks your API descriptions, all of which comes in handy for various phases of the API Lifecycle. +Create your own rulesets to make API governance easy, publish beautiful API reference documentation, and more. +Supports OpenAPI 3.2, 3.1, 3.0 and OpenAPI 2.0 (legacy Swagger), AsyncAPI 3.0 and 2.6, Arazzo 1.0. + +![build and test](https://github.com/redocly/redocly-cli/actions/workflows/tests.yaml/badge.svg) +![npm (scoped)](https://img.shields.io/npm/v/@redocly/cli) +![NPM](https://img.shields.io/npm/l/@redocly/cli) + +![OpenAPI CLI toolset](./media/redocly-cli.gif) + +## Migration + +Migrating from Redocly CLI v1 to v2? +Here's the [guide](https://redocly.com/docs/cli/guides/migrate-to-v2) to make the transition smoother. + +## Usage + +### Node + +```sh +npx @redocly/cli@latest lint path-to-root-file.yaml +``` + +Alternatively, install it globally with `npm`: + +```sh +npm install @redocly/cli -g +``` + +Then you can use it as `redocly [command] [options]`, for example: + +```sh +redocly lint path-to-root-file.yaml +``` + +The minimum required versions of Node.js and NPM are 22.12.0 and 10.9.2 respectively. + +### Docker + +To give the Docker container access to the OpenAPI description files, you need to mount the containing directory as a volume. +Assuming the API description is rooted in the current working directory, you need the following command: + +```sh +docker run --rm -v $PWD:/spec redocly/cli lint path-to-root-file.yaml +``` + +To build and run with a local image, run the following from the project root: + +```sh +docker build -t redocly/cli . +docker run --rm -v $PWD:/spec redocly/cli lint path-to-root-file.yaml +``` + +## Common tasks + +### Generate API reference documentation + +Redocly CLI is a great way to render API reference documentation. +It uses open source [Redoc](https://github.com/redocly/redoc) to build your documentation. +Use a command like this: + +```sh +redocly build-docs openapi.yaml +``` + +Your API reference docs are in `redoc-static.html` by default. +You can customize this in many ways. +[Read the main docs](https://redocly.com/docs/cli/commands/build-docs) for more information. + +> :bulb: Redocly also has [hosted API management solution](https://redocly.com/reunite/), a (commercial) alternative to Redoc. +> Redoc, Revel, Reef, and Realm can be worked on locally using the `preview` command. + +### Bundle multiple OpenAPI documents + +Having one massive OpenAPI description can be annoying, so most people split them up into multiple documents via `$ref`, only to later find out some tools don't support `$ref` or don't support multiple documents. +Redocly CLI to the rescue! It has a `bundle` command you can use to recombine all of those documents back into one single document. +The bundled output that Redocly CLI provides is clean, tidy, and looks like a human made it. + +### Automate API guidelines with Linting + +Check that your API matches the expected API guidelines by using the `lint` command. +API guidelines are an important piece of API governance. They help to keep APIs consistent by enforcing the same standards and naming conventions, and they can also guide API teams through potential security hazards and other pitfalls. +Automating API guidelines means you can keep APIs consistent and secure throughout their lifecycle. +Even better, you can shape the design of the API before it even exists by combining API linting with a design-first API workflow. + +Our API linter is designed for speed on even large documents, and it's easy to run locally, in CI, or anywhere you need it. +It's also designed for humans, with meaningful error messages to help you get your API right every time. + +Try it like this: + +```sh +redocly lint openapi.yaml +``` + +**Configure the rules** as you wish. +Other API Linters use complicated identifiers like JSONPath, but Redocly makes life easy with simple expressions that understand the API specification structure. +You can either use the [built-in rules](https://redocly.com/docs/cli/rules) to mix-and-match your ideal API guidelines, or break out the tools to [build your own](https://redocly.com/docs/cli/rules#rule-ideas). + +**Format the output** in whatever way you need. +The `stylish` output is as good as it sounds, but if you need JSON, Markdown, Checkstyle and other outputs to integrate with other tools, the `lint` command can output those too. + +**Multiple files supported** so you don't need to bundle your API description to lint it; just point Redocly CLI at the "entry point" (e.g.: `openapi.yaml`) and it handles the rest. + +[Learn more about API standards and configuring Redocly rules](https://redocly.com/docs/cli/api-standards). + +Looking for more examples? Check out our [Cookbook](./cookbook/README.md). + +### API contract testing with Respect + +Ensure your APIs match their OpenAPI descriptions with **Respect**, Redocly's API contract testing system. Respect sends real HTTP requests to your API server and validates that responses match the expectations defined in your OpenAPI description and Arazzo workflows. + +- Verify API responses match your OpenAPI schema +- Test complex API sequences using OpenAPI Arazzo format +- Catch API drift early in development and CI/CD +- Ensure external APIs you depend on behave as expected +- Track response times and detect anomalies + +#### Quick start + +```sh +# Generate test workflows from your OpenAPI spec +redocly generate-arazzo openapi.yaml + +# Run contract tests against your API +redocly respect auto-generated.arazzo.yaml --verbose +``` + +#### Respect vs. Respect Monitoring + +Respect is Redocly's community-edition product. Looking for something more? We also offer continuous API monitoring with additional features including: + +- Real-time insights +- Automated alerts via email or Slack +- Automated API checks +- Proactive API quality assurance + +Learn more about [Respect](https://redocly.com/respect) and [get started with API contract testing](https://redocly.com/docs/respect/get-started). + +### Transform an OpenAPI description + +If your OpenAPI description isn't everything you hoped it would be, enhance it with the Redocly [decorators](https://redocly.com/docs/cli/decorators) feature. +This allows you to: + +- Publish reference docs with a subset of endpoints for public use +- Improve the docs by adding examples and descriptions +- Adapt an existing OpenAPI description, and replace details like URLs for use on staging platforms + +## Data collection + +This tool [collects data](./docs/usage-data.md) to help Redocly improve our products and services. +You can opt out by setting the `REDOCLY_TELEMETRY` environment variable to `off`. + +## Update notifications + +Redocly CLI checks for updates on startup. +You can disable this by setting the `REDOCLY_SUPPRESS_UPDATE_NOTICE` environment variable to `true`. + +## More resources + +[Read the detailed docs](https://redocly.com/docs/cli/). + +## Credits + +Thanks to [graphql-js](https://github.com/graphql/graphql-js) and [eslint](https://github.com/eslint/eslint) for inspiration of the API description traversal approach and to [Swagger](https://github.com/swagger-api/swagger-editor), [Spectral](https://github.com/stoplightio/spectral), and [OAS-Kit](https://github.com/Mermade/oas-kit) for inspiring the recommended ruleset. + +## Development + +Contributions are welcome! +All the information you need is in [CONTRIBUTING.md](CONTRIBUTING.md). diff --git a/@skills/redocly-cli/cookbook/README.md b/@skills/redocly-cli/cookbook/README.md new file mode 100644 index 000000000..8a2c4fbba --- /dev/null +++ b/@skills/redocly-cli/cookbook/README.md @@ -0,0 +1,100 @@ +# Redocly CLI Cookbook + +A community collection of rulesets, configuration, custom plugins and other additions for [Redocly CLI](https://github.com/Redocly/redocly-cli). +We know our users have some great tips, examples, and code to share, and this is the place to do just that. +We would love to have your [contributions](#contributing) here too! + +> [!IMPORTANT] +> Redocly are the repository maintainers, but we can't thoroughly test everything here. +> Please browse, share, and use what you find at your own risk. + +If you're new to Redocly CLI, start with the [documentation](https://redocly.com/docs/cli/) to get up and running, then come back here to pick out any elements you would like to re-use yourself. +To keep up with new developments, either subscribe to the project repository, or [sign up for the Redocly product newsletter](https://redocly.com/product-updates/). + +## Usage + +Use the content here as a starting point for your own work. + +1. Take a look at what's available in each category, and pick any that you think apply to your situation. + +2. Each section links to the documentation for that feature, in case you need an introduction or refresher. + +3. Copy and paste the examples you want to use into your own setup, then edit them to fit your own needs. + +If you come up with something new, please consider sharing it here by opening a pull request. + +## Categories + +### Rulesets + +Combine existing [built-in rules](https://redocly.com/docs/cli/rules/built-in-rules/) or configurable rules in ways that serve a specific purpose, and make a [reusable ruleset](https://redocly.com/docs/cli/guides/configure-rules/#create-a-reusable-ruleset). + +- [Spec-compliant ruleset](./rulesets/spec-compliant/) - built-in rules that keep a description close to the specification. +- [Spot common mistakes](./rulesets/common-mistakes/) - extends the spec-compliant ruleset with checks for common oversights. +- [Security ruleset](./rulesets/security/) - configurable rules that add some defensive checks to your description. + +### Configurable rules + +There are some fantastic examples of [configurable rules](https://redocly.com/docs/cli/rules/configurable-rules/) in the wild. +We hope the list here inspires you to share more of your own! + +- [Ban certain words from descriptions](./configurable-rules/description-banned-words/) +- [Require `items` field for schemas of type `array`](./configurable-rules/required-items-for-array-schemas/) +- [Ensure sentence case in operation summaries](./configurable-rules/operation-summary-sentence-case/) +- [`POST` SHOULD define `requestBody` schema](./configurable-rules/operation-post-should-define-request-body/) +- [`GET` SHOULD NOT define `requestBody` schema](./configurable-rules/operation-get-should-not-define-requestBody/) +- [`DELETE` SHOULD NOT define `requestBody` schema](./configurable-rules/operation-delete-should-not-define-requestBody/) +- [Info section must have a description](./configurable-rules/info-description/) +- [No ` API +paths: {} +``` + +When you lint this OpenAPI file with the `rule/no-script-tags-in-markdown` rule, you'll see a warning: + +```text +Markdown descriptions should not contain script tags. +``` + +## References + +Inspired by the Spectral rule [no-script-tags-in-markdown](https://docs.stoplight.io/docs/spectral/4dec24461f3af-open-api-rules#no-script-tags-in-markdown). diff --git a/@skills/redocly-cli/cookbook/configurable-rules/no-script/redocly.yaml b/@skills/redocly-cli/cookbook/configurable-rules/no-script/redocly.yaml new file mode 100644 index 000000000..0ea857553 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/no-script/redocly.yaml @@ -0,0 +1,11 @@ +extends: [] + +rules: + rule/no-script-tags-in-markdown: + subject: + type: any + property: description + assertions: + notPattern: '; rel=alternate; title='the menu api' + content: + 'application/json': + schema: {} + '410': + description: Gone + headers: + Sunset: + description: For historical reasons the Sunset HTTP header field uses a different data type for date than the Deprecation header field. + schema: + type: string + examples: + sunset_date: + summary: An HTTP-date timestamp, as defined in Section 7.1.1.1 of RFC7231, and SHOULD be a timestamp in the future. + value: Sun, 30 Jun 2024 23:59:59 GMT + Link: + schema: + type: string + examples: + link_value: + value: ; rel=alternate; title='the menu api' + content: + 'application/json': + schema: {} +``` diff --git a/@skills/redocly-cli/cookbook/configurable-rules/operation-deprecated-response-headers/openapi.yaml b/@skills/redocly-cli/cookbook/configurable-rules/operation-deprecated-response-headers/openapi.yaml new file mode 100644 index 000000000..5979ab5ba --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/operation-deprecated-response-headers/openapi.yaml @@ -0,0 +1,57 @@ +openapi: 3.1.0 +info: + title: Redocly Cafe - deprecated endpoints + version: 0.0.0 +paths: + '/menu-items': + summary: legacy menu items endpoint, replaced by /menu + get: + deprecated: true + responses: + '200': + description: OK + headers: + Deprecation: + schema: + type: string + examples: + deprecation_date: + summary: A Structured Field Value date, as defined in Section 3.3.7 of RFC9651. + value: '@1688169599' + Sunset: + description: For historical reasons the Sunset HTTP header field uses a different data type for date than the Deprecation header field. + schema: + type: string + examples: + sunset_date: + summary: An HTTP-date timestamp, as defined in Section 7.1.1.1 of RFC7231, and SHOULD be a timestamp in the future. + value: Sun, 30 Jun 2024 23:59:59 GMT + Link: + schema: + type: string + examples: + link_value: + value: ; rel=alternate; title='the menu api' + content: + 'application/json': + schema: {} + '410': + description: Gone + headers: + Sunset: + description: For historical reasons the Sunset HTTP header field uses a different data type for date than the Deprecation header field. + schema: + type: string + examples: + sunset_date: + summary: An HTTP-date timestamp, as defined in Section 7.1.1.1 of RFC7231, and SHOULD be a timestamp in the future. + value: Sun, 30 Jun 2024 23:59:59 GMT + Link: + schema: + type: string + examples: + link_value: + value: ; rel=alternate; title='the menu api' + content: + 'application/json': + schema: {} diff --git a/@skills/redocly-cli/cookbook/configurable-rules/operation-deprecated-response-headers/redocly.yaml b/@skills/redocly-cli/cookbook/configurable-rules/operation-deprecated-response-headers/redocly.yaml new file mode 100644 index 000000000..7cfc1100d --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/operation-deprecated-response-headers/redocly.yaml @@ -0,0 +1,119 @@ +rules: + rule/response-2XX-deprecated-must-define-headers: + severity: error + message: Deprecated endpoints MUST respond with standard headers + where: + - subject: + type: Operation + property: deprecated + assertions: + defined: true + const: true + subject: + type: Response + matchParentKeys: '2([\d]+){2}' + assertions: + required: + - headers + + rule/response-2XX-deprecated-must-use-standard-headers: + severity: error + message: 'Deprecated endpoints MUST respond with "Sunset", "Deprecation", and "Link" standard headers' + where: + - subject: + type: Operation + property: deprecated + assertions: + defined: true + const: true + - subject: + type: Response + matchParentKeys: '2([\d]+){2}' + assertions: + required: + - headers + subject: + type: HeadersMap + assertions: + required: + - Deprecation + - Sunset + - Link + + rule/operation-deprecated-must-define-410-response: + severity: error + message: Deprecated endpoints MUST define a 410 response + where: + - subject: + type: Operation + property: deprecated + assertions: + defined: true + const: true + subject: + type: Responses + assertions: + required: + - '410' + + rule/response-410-deprecated-must-define-headers: + severity: error + message: Deprecated endpoints MUST respond with standard headers + where: + - subject: + type: Operation + property: deprecated + assertions: + defined: true + const: true + subject: + type: Response + matchParentKeys: '410' + assertions: + required: + - headers + + rule/response-410-deprecated-must-define-standard-headers: + severity: error + message: 'Deprecated endpoints MUST respond with "Sunset" and "Link" standard headers after "Deprecation" date value has been exceeded' + where: + - subject: + type: Operation + property: deprecated + assertions: + defined: true + const: true + - subject: + type: Response + matchParentKeys: '410' + assertions: + required: + - headers + subject: + type: HeadersMap + assertions: + required: + - 'Sunset' + - 'Link' + + rule/response-410-deprecated-must-not-define-deprecation-header: + severity: error + message: 'Deprecated endpoints 410 response MUST NOT define "Deprecation" header' + where: + - subject: + type: Operation + property: deprecated + assertions: + defined: true + const: true + - subject: + type: Response + matchParentKeys: '410' + assertions: + required: + - headers + subject: + type: HeadersMap + assertions: + disallowed: + - 'Deprecation' diff --git a/@skills/redocly-cli/cookbook/configurable-rules/operation-get-should-not-define-requestBody/README.md b/@skills/redocly-cli/cookbook/configurable-rules/operation-get-should-not-define-requestBody/README.md new file mode 100644 index 000000000..f082aa1a8 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/operation-get-should-not-define-requestBody/README.md @@ -0,0 +1,74 @@ +# `GET` SHOULD NOT define `requestBody` schema + +Authors: + +- `@jeremyfiel` Jeremy Fiel (ADP) + +## What this does and why + +Following the HTTP standard and RESTful api principles, a `GET` operation SHOULD NOT include a `requestBody` in an attempt to modify a resource on the server, [RFC9110][1]. + +## Code + +Add this to the `rules` section of your `redocly.yaml`: + +```yaml +rules: + rule/get-should-not-define-requestBody: + severity: warn + message: '"GET" SHOULD NOT define a "requestBody" schema' + subject: + type: Operation + filterInParentKeys: + - get + assertions: + disallowed: + - requestBody +``` + +This rule will warn if any `PathItem` includes a `GET` operation with a `requestBody` schema definition. + +## Examples + +Here's a sample of an OpenAPI description: + +```yaml +openapi: 3.0.3 +info: + title: Redocly Cafe + version: 1.0.0 +paths: + /orders/{orderId}: + get: + summary: Retrieve an order + description: Retrieve a single order by its ID. + parameters: + - name: orderId + in: path + description: ID of the order to retrieve. + required: true + schema: + type: string + pattern: ^ord_[0-9abcdefghjkmnpqrstvwxyz]{26}$ + requestBody: # <- This will warn + description: a request body for my get operation + content: + 'application/json': + schema: + type: object + properties: + customerName: + type: string + responses: + '200': + description: Successful operation. + content: + application/json: + schema: + type: object + properties: + customerName: + type: string +``` + +[1]: https://www.rfc-editor.org/rfc/rfc9110#section-9.3.1-6 'RFC9110' diff --git a/@skills/redocly-cli/cookbook/configurable-rules/operation-get-should-not-define-requestBody/redocly.yaml b/@skills/redocly-cli/cookbook/configurable-rules/operation-get-should-not-define-requestBody/redocly.yaml new file mode 100644 index 000000000..d6cabb088 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/operation-get-should-not-define-requestBody/redocly.yaml @@ -0,0 +1,11 @@ +rules: + rule/get-should-not-define-requestBody: + severity: warn + message: '"GET" SHOULD NOT define a "requestBody" schema' + subject: + type: Operation + filterInParentKeys: + - get + assertions: + disallowed: + - requestBody diff --git a/@skills/redocly-cli/cookbook/configurable-rules/operation-operationId-exclude-OPTIONS/README.md b/@skills/redocly-cli/cookbook/configurable-rules/operation-operationId-exclude-OPTIONS/README.md new file mode 100644 index 000000000..e9ff750d2 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/operation-operationId-exclude-OPTIONS/README.md @@ -0,0 +1,100 @@ +# Variant of the `operation-operationId` rule that excludes `OPTIONS` operations + +Author: + +- [@nickcorby](https://github.com/nickcorby) + +## What this does and why + +This rule throws an error for all operations that are missing the `operationId` property, while filtering out specific operations that you want to exclude from this validation (e.g. `OPTIONS`). + +This rule can be tweaked to exclude any combination of operations, or inversely to **include** set operations. + +## Code + +This rule is added to the `rules` section of your `redocly.yaml` file: + +```yaml +rules: + rule/operation-operationId-exclude-OPTIONS: + subject: + type: Operation + filterOutParentKeys: + - options + assertions: + required: + - operationId + message: Operation is missing 'operationId' property. + severity: error +``` + +The `filterOutParentKeys` property allows you to define which operations you would like to exclude from the rule: + +```yaml +type: Operation +filterOutParentKeys: + - options +``` + +This can be extended to multiple operations: + +```yaml +type: Operation +filterOutParentKeys: + - options + - delete +``` + +Alternatively, you can use the `filterInParentKeys` property to define which operations you would like to include in the rule: + +```yaml +type: Operation +filterInParentKeys: + - get + - post +``` + +## Examples + +With the rule configured with `severity: error`, the following snippet of a `GET` and `POST` operations will trigger this rule and display an error: + +```yaml +openapi: 3.1.0 +info: {} +paths: + /menu: + get: # Error: Operation is missing 'operationId' property. Rule: operation-operationId-exclude-OPTIONS + responses: + '200': + content: {} + + post: # Error: Operation is missing 'operationId' property. Rule: operation-operationId-exclude-OPTIONS + responses: + '201': + content: {} + + options: # No error + responses: + '204': + content: {} +``` + +**Note:** If you are using a ruleset that includes the [operation-operationId](https://redocly.com/docs/cli/rules/oas/operation-operationId) rule (like `recommended`), you will need to disable this rule in order for the configurable rule to apply. + +If your `redocly.yaml` file contains: + +```yaml +extends: + - recommended +``` + +You will need to include the following snippet in the `rules` property: + +```yaml +rules: + operation-operationId: off +``` + +## References + +Assisted by [AlbinaBlazhko17](https://github.com/AlbinaBlazhko17) diff --git a/@skills/redocly-cli/cookbook/configurable-rules/operation-operationId-exclude-OPTIONS/redocly.yaml b/@skills/redocly-cli/cookbook/configurable-rules/operation-operationId-exclude-OPTIONS/redocly.yaml new file mode 100644 index 000000000..8812cdb47 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/operation-operationId-exclude-OPTIONS/redocly.yaml @@ -0,0 +1,11 @@ +rules: + rule/operation-operationId-exclude-OPTIONS: + subject: + type: Operation + filterOutParentKeys: + - options + assertions: + required: + - operationId + message: Operation is missing 'operationId' property. + severity: error diff --git a/@skills/redocly-cli/cookbook/configurable-rules/operation-post-should-define-request-body/README.md b/@skills/redocly-cli/cookbook/configurable-rules/operation-post-should-define-request-body/README.md new file mode 100644 index 000000000..964d3914e --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/operation-post-should-define-request-body/README.md @@ -0,0 +1,101 @@ +# `POST` SHOULD define `requestBody` schema + +Authors: + +- `@jeremyfiel` Jeremy Fiel (ADP) + +## What this does and why + +Following the HTTP standard and RESTful API principles, a `POST` request SHOULD include a `requestBody` indicating the contents of the request to the server. In some cases, when using a command pattern (`/actions/{action-id}`), you may allow a `requestBody` to be omitted; this rule provides for the option to ignore a particular URI pattern. The other constraint on this rule is the `deprecated` property should not be defined to avoid linting deprecated endpoints, unnecessarily. + +## Code + +Add this to the `rules` section of your `redocly.yaml`: + +```yaml +rules: + rule/post-should-define-requestBody: + severity: error + message: '"POST" SHOULD define a "requestBody" schema unless using an "actions" pattern' + subject: + type: Operation + where: + - subject: + type: PathItem + # Here you can define your own URI pattern to ignore if providing a requestBody is not required. + # The negation happens in this portion of the regex `(? [!NOTE] +> This rule can be repurposed for other fields with a single sentence, but not multiple sentences. + +### Rule explanation + +This rule asserts that each Operation `summary` matches the regex defined in `pattern`. The regex we defined matches strings that: + +1. Start with an uppercase letter +2. Are followed by 1+ characters that are _not_ uppercase letters +3. End with a character that is _not_ an uppercase letter + +**Tip**: Building a regex for your own rule? A tool like [regexr](https://regexr.com/) can be quite useful. + +## Examples + +Summaries _with_ sentence casing (correct): + +```yaml +/orders: + post: + summary: Create order +/orders/{orderId}: + get: + summary: Retrieve an order +``` + +Summaries _without_ sentence casing (incorrect): + +```yaml +/orders: + post: + summary: Create New Order +/orders/{orderId}: + get: + summary: retrieve an Order +``` + +## Excluding operations from the rule + +Sometimes you might need an exception to the rule. For example, your Operation summary could have a proper noun or an acronym. You can do that using an [ignore file](https://redocly.com/docs/cli/commands/lint/). + +### Example - ignoring sentence casing + +Pretend you have the following Operation and want to keep "OAuth2" capitalized in the summary: + +```yaml +/oauth2/register: + post: + summary: Create OAuth2 client +``` + +1. Verify your sentence casing rule is working correctly + +- Run `npx @redocly/cli lint` +- Console should show error on Operation summary + +The linting output from our example: + +```bash +Operation summary must be sentence cased. + + 6 | /oauth2/register: + 7 | post: + 8 | summary: Create OAuth2 client + 9 | description: Register a new OAuth2 client for dynamic client registration. +10 | operationId: registerOAuth2Client + +Error was generated by the rule/operation-summary-sentence-case rule. +``` + +2. Generate an ignore file + +- Run `npx @redocly/cli lint --generate-ignore-file` +- Console should confirm an ignore file was generated +- A _.redocly.lint-ignore.yaml_ was added to your code + +The ignore file generated by our example: + +```yaml +# .redocly.lint-ignore.yaml +openapi.yaml: + rule/operation-summary-sentence-case: + - '#/paths/~1oauth2~1register/post/summary' +``` + +3. Run the linter and verify your Operation summary is ignored + +- Run `npx @redocly/cli lint` +- Console output should confirm valid OpenAPI description + +The linting output from our example with ignore file added: + +```bash +Woohoo! Your API description is valid. 🎉 +1 problem is explicitly ignored. +``` diff --git a/@skills/redocly-cli/cookbook/configurable-rules/operation-summary-sentence-case/redocly.yaml b/@skills/redocly-cli/cookbook/configurable-rules/operation-summary-sentence-case/redocly.yaml new file mode 100644 index 000000000..a61ece58f --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/operation-summary-sentence-case/redocly.yaml @@ -0,0 +1,8 @@ +rules: + rule/operation-summary-sentence-case: + subject: + type: Operation + property: summary + message: 'Operation summary must be sentence cased.' + assertions: + pattern: /^[A-Z]+[^A-Z]+$/ diff --git a/@skills/redocly-cli/cookbook/configurable-rules/path-excludes-pattern/README.md b/@skills/redocly-cli/cookbook/configurable-rules/path-excludes-pattern/README.md new file mode 100644 index 000000000..a5ffc5d08 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/path-excludes-pattern/README.md @@ -0,0 +1,48 @@ +# Paths should not match a pattern + +Authors: + +- [`@tatomyr`](https://github.com/tatomyr) Andrew Tatomyr (Redocly) + +## What this does and why + +The [`no-http-verbs-in-paths` rule](https://redocly.com/docs/cli/rules/no-http-verbs-in-paths/#no-http-verbs-in-paths) is pre-built for a very specific set of patterns. +This rule is the general Swiss army knife version. +If you absolutely know something should not be in the path (for example `foo`), then add the pattern to prevent it. + +Some common things to check using this rule: other common CRUD verbs, bad words, and internal code or terminology. + +## Code + +Add this to the `rules` section of your `redocly.yaml`: + +```yaml +rules: + rule/path-exclude-pattern: + subject: + type: Paths + assertions: + notPattern: \/wrong +``` + +If you want to exclude multiple patterns, you may write several rules like this each with a different pattern. + +## Examples + +Here's an example of an OpenAPI description: + +```yaml +openapi: 3.1.0 +info: + title: Redocly Cafe + version: 1.0.0 +paths: + /menu: + $ref: ./menu.yaml + /wrong-menu: # <-- This will error + $ref: ./wrong-menu.yaml +``` + +## References + +Built-in [`no-http-verbs-in-paths` rule](https://redocly.com/docs/cli/rules/no-http-verbs-in-paths/#no-http-verbs-in-paths). diff --git a/@skills/redocly-cli/cookbook/configurable-rules/path-excludes-pattern/redocly.yaml b/@skills/redocly-cli/cookbook/configurable-rules/path-excludes-pattern/redocly.yaml new file mode 100644 index 000000000..c3eded40a --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/path-excludes-pattern/redocly.yaml @@ -0,0 +1,6 @@ +rules: + rule/path-exclude-pattern: + subject: + type: Paths + assertions: + notPattern: \/wrong diff --git a/@skills/redocly-cli/cookbook/configurable-rules/required-items-for-array-schemas/README.md b/@skills/redocly-cli/cookbook/configurable-rules/required-items-for-array-schemas/README.md new file mode 100644 index 000000000..d095af978 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/required-items-for-array-schemas/README.md @@ -0,0 +1,57 @@ +# Require `items` field for schemas of type `array` + +Authors: + +- `@tatomyr` Andrew Tatomyr (Redocly) + +## What this does and why + +When declaring a JSON Schema, it's possible to define an array without specifying what type of items are in the array. +Linting with Redocly tools simply omits this, as it is considered an arbitrary array with any kind of item. +However, to enforce the explicitness, you can use a [configurable rule](https://redocly.com/docs/cli/rules/configurable-rules/). + +**Note:** Whilst OAS 3.0.x specification does not enforce using the `items` field in descriptions, OAS 3.1.x fully supports JSON Schema 2020-12 draft which requires it. However, Redocly CLI doesn't alter the behavior and allows the omission of `items`. + +## Code + +Add this to the `rules` section of your `redocly.yaml`: + +```yaml +rules: + rule/required-items-in-array-schemas: + subject: + type: Schema + assertions: + required: + - items + where: + - subject: + type: Schema + property: type + assertions: + const: array + defined: true + message: The 'items' field is required for schemas of array type. +``` + +This rule will error if an array is declared without an `items` field. +The `where` section is used to filter the rule to only apply to schemas of type `array`. +Note the `defined: true` assertion, which ensures that the `type` field is defined. + +## Examples + +Here's a sample of an OpenAPI description: + +```yaml +# ... +components: + schemas: + OrderItems: # This will error + type: array + MenuItemNames: # This will pass + type: array + items: + type: string + CustomerName: # This will pass, doesn't match the 'where' clause + type: string +``` diff --git a/@skills/redocly-cli/cookbook/configurable-rules/required-items-for-array-schemas/redocly.yaml b/@skills/redocly-cli/cookbook/configurable-rules/required-items-for-array-schemas/redocly.yaml new file mode 100644 index 000000000..6e31399a6 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/required-items-for-array-schemas/redocly.yaml @@ -0,0 +1,15 @@ +rules: + rule/required-items-in-array-schemas: + subject: + type: Schema + assertions: + required: + - items + where: + - subject: + type: Schema + property: type + assertions: + const: array + defined: true + message: The 'items' field is required for schemas of array type. diff --git a/@skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/README.md b/@skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/README.md new file mode 100644 index 000000000..6b88ce0a2 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/README.md @@ -0,0 +1,80 @@ +# String schemas length defined + +Authors: + +- [`adamaltman`](https://github.com/adamaltman) Adam Altman (Redocly) + +## What this does and why + +This requires `minLength` and `maxLength` properties set on a `string` where `enum` isn't defined. + +## Code + +The rule checks that a `string` uses the `minLength` and `maxLength` keywords unless an `enum` is defined. + +It does this by using a combination `requireAny` and `mutuallyRequired`. + +```yaml +rules: + rule/string-schemas-length-defined: + subject: + type: Schema + where: + - subject: + type: Schema + property: type + assertions: + const: string + assertions: + requireAny: + - minLength + - maxLength + - enum + mutuallyRequired: + - minLength + - maxLength +``` + +## Examples + +The following OpenAPI has schemas prefixed with either `Good` or `Bad` to show the configurable rules catch the likely bad uses of keywords. + +```yaml +openapi: 3.1.0 +info: + title: Redocly Cafe strict string definitions + version: 1.0.0 +paths: {} +components: + schemas: + MenuItemPrice: # should not be caught by these rules + type: integer + + BadCustomerName: + type: string + + BadCommentWithMinLength: + type: string + minLength: 1 + + BadPhotoDescriptionWithMaxLength: + type: string + maxLength: 500 + + GoodOrderStatusBecauseEnum: + type: string + enum: + - placed + - preparing + - completed + - canceled + + GoodCustomerNameBecauseMinAndMaxLength: + type: string + minLength: 1 + maxLength: 100 +``` + +## References + +Inspired by a question from Keith F. diff --git a/@skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/openapi.yaml b/@skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/openapi.yaml new file mode 100644 index 000000000..d466c04a1 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/openapi.yaml @@ -0,0 +1,33 @@ +openapi: 3.1.0 +info: + title: Redocly Cafe strict string definitions + version: 1.0.0 +paths: {} +components: + schemas: + MenuItemPrice: # should not be caught by these rules + type: integer + + BadCustomerName: + type: string + + BadCommentWithMinLength: + type: string + minLength: 1 + + BadPhotoDescriptionWithMaxLength: + type: string + maxLength: 500 + + GoodOrderStatusBecauseEnum: + type: string + enum: + - placed + - preparing + - completed + - canceled + + GoodCustomerNameBecauseMinAndMaxLength: + type: string + minLength: 1 + maxLength: 100 diff --git a/@skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/redocly.yaml b/@skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/redocly.yaml new file mode 100644 index 000000000..a6affe121 --- /dev/null +++ b/@skills/redocly-cli/cookbook/configurable-rules/string-schemas-length-defined/redocly.yaml @@ -0,0 +1,18 @@ +rules: + rule/string-schemas-length-defined: + subject: + type: Schema + where: + - subject: + type: Schema + property: type + assertions: + const: string + assertions: + requireAny: + - minLength + - maxLength + - enum + mutuallyRequired: + - minLength + - maxLength diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/README.md b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/README.md new file mode 100644 index 000000000..4a93b8e4b --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/README.md @@ -0,0 +1,157 @@ +# Apply root-level security + +Authors: + +- [`@Daryna-del`](https://github.com/Daryna-del), Daryna Pastushenko (Redocly) + +## What this does and why + +When you use `redocly join` to combine multiple API descriptions into one, root-level `security` is not automatically inherited across the joined specs. This is by design — silently applying security requirements from one file to operations defined in another would change their behavior without an explicit declaration. + +A common scenario is when one spec (for example, `foo.yaml`) defines shared infrastructure — security schemes and root-level `security` — but has no paths of its own, while another spec (`bar.yaml`) defines all the paths but has no `security` at all. After joining, the operations from `bar.yaml` end up with no security applied. + +This decorator (`apply-root-security`) solves that: it reads the root-level `security` from a specified source file (for example `foo.yaml`) and merges it into the root-level `security` of the document you are bundling, skipping any requirements the document already defines. It runs as a `bundle` step, giving you full control over which file supplies the requirement. + +## Code + +The `security-plugin` plugin defines the `decorator` section and the plugin `id`: + +```javascript +export default function plugin() { + return { + id: 'security-plugin', + decorators: { + oas3: { 'apply-root-security': applyRootSecurity }, + }, + }; +} +``` + +Here's the main part of the decorator (from `decorator.js`): + +```javascript +export const applyRootSecurity = ({ pathSecurityFile } = {}) => { + let source = null; + + return { + Root: { + enter(_root, { config }) { + if (!pathSecurityFile) { + throw new Error( + 'The apply-root-security decorator requires the pathSecurityFile option. Set it in redocly.yaml.' + ); + } + source = resolvePath(pathSecurityFile, config); + }, + leave(root) { + if (Array.isArray(source?.security)) { + const existingRequirements = new Set( + (root.security || []).map((requirement) => JSON.stringify(requirement)) + ); + const newRequirements = source.security.filter( + (requirement) => !existingRequirements.has(JSON.stringify(requirement)) + ); + if (newRequirements.length > 0) { + root.security = [...(root.security || []), ...newRequirements]; + } + } + if (source?.components?.securitySchemes) { + root.components = root.components || {}; + root.components.securitySchemes = { + ...root.components.securitySchemes, + ...source.components.securitySchemes, + }; + } + }, + }, + }; +}; +``` + +In summary, this decorator does the following: + +1. Visit the `Root` node and apply any security requirements from the source file that are not already present in the target document. +2. Merge security scheme definitions from the source file into the target's `components`, creating that section when it is missing and preserving existing schemes. + +The `resolvePath` function resolves the path to the security file and returns its parsed content: + +```javascript +function resolvePath(pathSecurityFile, config) { + const base = config.configPath ? path.dirname(config.configPath) : process.cwd(); + const absolutePath = path.isAbsolute(pathSecurityFile) + ? pathSecurityFile + : path.resolve(base, pathSecurityFile); + return yaml.load(fs.readFileSync(absolutePath, 'utf8')); +} +``` + +The decorator reads the source file with [`js-yaml`](https://github.com/nodeca/js-yaml), so install it next to your plugin: `npm install js-yaml`. + +Add the following to `redocly.yaml`: + +```yaml +plugins: + - './plugin.js' + +decorators: + security-plugin/apply-root-security: + pathSecurityFile: ./foo.yaml +``` + +## Examples + +Given two specs (both included in this directory): + +**foo.yaml** — defines root-level security, no paths: + +```yaml +openapi: 3.1.0 +info: + title: Cafe security + version: 1.0.0 +security: + - OAuth2: [] +components: + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.cafe.redocly.com/oauth2/authorize + tokenUrl: https://api.cafe.redocly.com/oauth2/token + scopes: {} +paths: {} +``` + +**bar.yaml** — defines paths, no security: + +```yaml +openapi: 3.1.0 +info: + title: Redocly Cafe + version: 1.0.0 +paths: + /menu: + get: + summary: List all menu items + operationId: listMenuItems + responses: + '200': + description: OK + '400': + description: Bad request +``` + +Run: + +```bash +redocly bundle bar.yaml -o result.yaml +``` + +`result.yaml` will have `security: [{OAuth2: []}]` and `components.securitySchemes.OAuth2` applied. + +## References + +- [Redocly join command](https://redocly.com/docs/cli/commands/join) +- [Custom decorators in plugins](https://redocly.com/docs/cli/custom-plugins/custom-decorators) +- [Security requirement object (OpenAPI)](https://spec.openapis.org/oas/v3.1.0#security-requirement-object) diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/bar.yaml b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/bar.yaml new file mode 100644 index 000000000..9504e33ed --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/bar.yaml @@ -0,0 +1,14 @@ +openapi: 3.1.0 +info: + title: Redocly Cafe + version: 1.0.0 +paths: + /menu: + get: + summary: List all menu items + operationId: listMenuItems + responses: + '200': + description: OK + '400': + description: Bad request diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/decorator.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/decorator.js new file mode 100644 index 000000000..230f70b29 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/decorator.js @@ -0,0 +1,48 @@ +import yaml from 'js-yaml'; +import fs from 'node:fs'; +import path from 'node:path'; + +export const applyRootSecurity = ({ pathSecurityFile } = {}) => { + let source = null; + + return { + Root: { + enter(_root, { config }) { + if (!pathSecurityFile) { + throw new Error( + 'The apply-root-security decorator requires the pathSecurityFile option. Set it in redocly.yaml.' + ); + } + source = resolvePath(pathSecurityFile, config); + }, + leave(root) { + if (Array.isArray(source?.security)) { + const existingRequirements = new Set( + (root.security || []).map((requirement) => JSON.stringify(requirement)) + ); + const newRequirements = source.security.filter( + (requirement) => !existingRequirements.has(JSON.stringify(requirement)) + ); + if (newRequirements.length > 0) { + root.security = [...(root.security || []), ...newRequirements]; + } + } + if (source?.components?.securitySchemes) { + root.components = root.components || {}; + root.components.securitySchemes = { + ...root.components.securitySchemes, + ...source.components.securitySchemes, + }; + } + }, + }, + }; +}; + +function resolvePath(pathSecurityFile, config) { + const base = config.configPath ? path.dirname(config.configPath) : process.cwd(); + const absolutePath = path.isAbsolute(pathSecurityFile) + ? pathSecurityFile + : path.resolve(base, pathSecurityFile); + return yaml.load(fs.readFileSync(absolutePath, 'utf8')); +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/foo.yaml b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/foo.yaml new file mode 100644 index 000000000..4d1690819 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/foo.yaml @@ -0,0 +1,16 @@ +openapi: 3.1.0 +info: + title: Cafe security + version: 1.0.0 +security: + - OAuth2: [] +components: + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.cafe.redocly.com/oauth2/authorize + tokenUrl: https://api.cafe.redocly.com/oauth2/token + scopes: {} +paths: {} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/plugin.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/plugin.js new file mode 100644 index 000000000..87ceb4286 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/plugin.js @@ -0,0 +1,10 @@ +import { applyRootSecurity } from './decorator.js'; + +export default function plugin() { + return { + id: 'security-plugin', + decorators: { + oas3: { 'apply-root-security': applyRootSecurity }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/redocly.yaml b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/redocly.yaml new file mode 100644 index 000000000..985deac08 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/apply-root-security/redocly.yaml @@ -0,0 +1,6 @@ +plugins: + - './plugin.js' + +decorators: + security-plugin/apply-root-security: + pathSecurityFile: ./foo.yaml diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/azure-apim/README.md b/@skills/redocly-cli/cookbook/custom-plugin-decorators/azure-apim/README.md new file mode 100644 index 000000000..cfdb5f112 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/azure-apim/README.md @@ -0,0 +1,97 @@ +# Azure APIM decorator + +Authors: + +- [`@adamaltman`](https://github.com/adamaltman), Adam Altman (Redocly) + +## What this does and why + +[Azure APIM](https://learn.microsoft.com/en-us/azure/api-management/api-management-api-import-restrictions) doesn't support a variety of OpenAPI features (one of which is examples). +Examples causes an error when attempting to import OpenAPI descriptions that contain examples to Azure APIM. + +This decorator removes examples from schemas, media types, and components. + +This is a decorator you can run in a pipeline to transform your OpenAPI description prior to uploading to Azure APIM. +Note that Azure APIM has many restrictions, and it might require more transformation prior to uploading to Azure APIM. + +You certainly would want to have the examples for purposes of documentation. Redocly renders multiple media type examples beautifully. + +Contribute to this community cookbook by adding decorators for issues you find with your imports to Azure APIM. + +## Code + +The code is entirely in [azure-apim.js](./azure-apim.js). + +The code sets the plugin name to `azure-apim` and adds a decorator named `remove-examples`. + +It operates on the `Schemas`, `MediaType`, and `Components` element (in OpenAPI 3.x descriptions) to remove the `examples` node. + +## Examples + +Add the plugin to `redocly.yaml` and enable the decorator: + +```yaml +plugins: + - ./azure-apim.js + +decorators: + azure-apim/remove-examples: on +``` + +Here is an example of an operation before and after: + +**Before**: + +```yaml +/orders: + get: + summary: List orders + operationId: listOrders + description: Retrieves collection of orders. + responses: + '200': + description: Orders retrieved. + content: + application/json: + schema: + $ref: '#/components/schemas/OrderList' + examples: + order-list: + $ref: '#/components/examples/OrderList' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' +``` + +**After**: + +```yaml +/orders: + get: + summary: List orders + operationId: listOrders + description: Retrieves collection of orders. + responses: + '200': + description: Orders retrieved. + content: + application/json: + schema: + $ref: '#/components/schemas/OrderList' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' +``` + +🎉 Notice `examples` is removed from the `application/json` media type. + +## References + +- https://learn.microsoft.com/en-us/azure/api-management/api-management-api-import-restrictions +- OpenAPI [node types](https://redocly.com/docs/openapi-visual-reference/openapi-node-types/) diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/azure-apim/azure-apim.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/azure-apim/azure-apim.js new file mode 100644 index 000000000..a8c57d046 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/azure-apim/azure-apim.js @@ -0,0 +1,37 @@ +export default function plugin() { + return { + id: 'azure-apim', + decorators: { + oas3: { + 'remove-examples': RemoveExamples, + }, + }, + }; +} + +/** @type {import('@redocly/cli').OasDecorator} */ +function RemoveExamples() { + return { + Schema: { + leave(Schema) { + if (Schema['examples']) { + delete Schema['examples']; + } + }, + }, + MediaType: { + leave(MediaType) { + if (MediaType['examples']) { + delete MediaType['examples']; + } + }, + }, + Components: { + leave(Components) { + if (Components['examples']) { + delete Components['examples']; + } + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/openai-is-consequential/README.md b/@skills/redocly-cli/cookbook/custom-plugin-decorators/openai-is-consequential/README.md new file mode 100644 index 000000000..12e7f1df0 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/openai-is-consequential/README.md @@ -0,0 +1,118 @@ +# Decorator to add x-openai-isConsequential tag to GET operations + +Authors: + +- [`@adamaltman`](https://github.com/adamaltman), Adam Altman (Redocly) + +## What this does and why + +OpenAI Actions uses OpenAPI to enable GPTs to make API calls. + +It has support for a consequential flag (documentation no longer available, but originally at `https://platform.openai.com/docs/actions/consequential-flag`): + +> If the field isn't present, we default all GET operations to false and all other operations to true + +If you want to set the GET operations to true too, then this decorator is for you. + +## Code + +The code is entirely in `openai-is-consequential.js`: + +```javascript +export default function plugin() { + return { + id: 'openai-plugin', + decorators: { + oas3: { + 'is-consequential': OpenAIConsequential, + }, + }, + }; +} + +/** @type {import('@redocly/cli').OasDecorator} */ +function OpenAIConsequential() { + return { + PathItem(PathItem) { + if (PathItem['get']) { + PathItem['get']['x-openai-isConsequential'] = true; + } + }, + }; +} +``` + +The code sets the plugin name to `openai-plugin` and adds a decorator named `is-consequential`. + +It operates on the `PathItem` element (in OpenAPI 3.x descriptions). + +The conditional logic applies to `get` operations. Modify the `if` statement if you want to target different operations. + +## Examples + +Add the plugin to `redocly.yaml` and enable the decorator: + +```yaml +plugins: + - ./openai-is-consequential.js + +decorators: + openai-plugin/is-consequential: on +``` + +Here is an example of an operation before and after: + +**Before**: + +```yaml +/revenue: + get: + summary: Get revenue statistics + operationId: getRevenue + x-sdk-operation-name: getRevenue + description: Retrieves revenue statistics. + responses: + '200': + description: Revenue statistics retrieved. + content: + application/json: + schema: + $ref: '#/components/schemas/RevenueStatistics' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' +``` + +**After**: + +```yaml +/revenue: + get: + summary: Get revenue statistics + operationId: getRevenue + x-sdk-operation-name: getRevenue + description: Retrieves revenue statistics. + responses: + '200': + description: Revenue statistics retrieved. + content: + application/json: + schema: + $ref: '#/components/schemas/RevenueStatistics' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + x-openai-isConsequential: true +``` + +🎉 Notice `x-openai-isConsequential: true` at the last line of the after example. + +## References + +- The [`PathItem` types documentation](https://redocly.com/docs/openapi-visual-reference/path-item/#types) diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/openai-is-consequential/openai-is-consequential.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/openai-is-consequential/openai-is-consequential.js new file mode 100644 index 000000000..8ab1a4c0c --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/openai-is-consequential/openai-is-consequential.js @@ -0,0 +1,21 @@ +export default function plugin() { + return { + id: 'openai-plugin', + decorators: { + oas3: { + 'is-consequential': OpenAIConsequential, + }, + }, + }; +} + +/** @type {import('@redocly/cli').OasDecorator} */ +function OpenAIConsequential() { + return { + PathItem(PathItem) { + if (PathItem['get']) { + PathItem['get']['x-openai-isConsequential'] = true; + } + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-extensions/README.md b/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-extensions/README.md new file mode 100644 index 000000000..4f03ed882 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-extensions/README.md @@ -0,0 +1,494 @@ +# Remove extensions + +Authors: + +- @nicobao (when working full time at @CIDgravity) + +## What this does and why + +Go through each node of an OpenAPI document, and remove any given [OpenAPI Extensions](https://spec.openapis.org/oas/v3.1.0#specification-extensions) (must start with `x-`). + +Why? See + +## Code + +The plugin itself can be found in [`remove-extensions.js`](./remove-extensions.js). The rest of this section shows you how to set up and use the plugin. + +Create a `plugin.js` file to refer to this file: + +```js +import RemoveExtensions from './remove-extensions.js'; + +/** @type {import('@redocly/cli').DecoratorsConfig} */ +const decorators = { + oas3: { + 'remove-extensions': RemoveExtensions, + }, +}; + +export default function plugin() { + return { + id: 'plugin', + decorators, + }; +} +``` + +Create/edit `redocly.yaml` as follows (edit with your own settings): + +```yml +apis: + unchanged@latest: + root: ./cafe.yaml + with-plugin@latest: + root: ./cafe.yaml + decorators: + plugin/remove-extensions: + extensions: + - x-amazon* + - x-google* +plugins: + - ./plugin.js +``` + +Run the `bundle` command to remove all the [GCP](https://cloud.google.com/endpoints/docs/openapi/openapi-extensions) and [AWS](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-swagger-extensions.html) custom OpenAPI extensions from the OpenAPI description: + +```bash +redocly bundle with-plugin@latest --output dist/with-plugin.yaml +``` + +The `extensions` parameter is optional. If empty or not set, it will remove all extensions (elements starting with `x-`). The accepted values for the `extensions` param are: + +- `extensions: ` +- `extensions: ` +- `extensions: ` + +Regular expressions follow [Javascript Regex convention](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions). + +## Examples + +With the same config as above. + +Input OpenAPI (`cafe.yaml`): + +```yaml +openapi: 3.0.0 +info: + description: 'This is a sample Redocly Cafe server. Cafe operators (not customers) use + it to manage menus, orders, and revenue. Find out more at + [https://cafe.redocly.com](https://cafe.redocly.com).' + version: 1.0.0 + title: Redocly Cafe + termsOfService: https://redocly.com/subscription-agreement + contact: + email: team@redocly.com + license: + name: MIT + url: https://opensource.org/licenses/MIT +tags: + - name: Products + description: Operations related to products + externalDocs: + description: Find out more + url: https://cafe.redocly.com + - name: Orders + description: Order management operations +x-amazon-apigateway-api-key-source: HEADER +paths: + /menu: + get: + x-google-plugin-key-auth: + name: key-auth + enabled: true + tags: + - Products + summary: List all menu items + description: Retrieve a collection of menu items with optional filtering + operationId: listMenuItems + parameters: + - name: search + in: query + description: Text search across menu item fields + required: false + schema: + type: string + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MenuItem' + '400': + description: Invalid search value + post: + x-google-plugin-key-auth: + name: key-auth + enabled: true + x-internal: true + tags: + - Products + summary: Create menu item + description: '' + operationId: createMenuItem + requestBody: + $ref: '#/components/requestBodies/MenuItem' + responses: + '201': + description: Menu item created + '400': + description: Invalid input + /orders: + get: + x-google-plugin-key-auth: + name: key-auth + enabled: true + tags: + - Orders + summary: List all orders + description: Multiple status values can be provided with comma separated strings. + Use placed, preparing, completed for testing. + operationId: listOrders + parameters: + - name: status + in: query + description: Status values used to filter orders + required: false + explode: true + schema: + type: array + items: + type: string + enum: + - placed + - preparing + - completed + - canceled + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Order' + '400': + description: Invalid status value + '/orders/{orderId}': + get: + tags: + - Orders + summary: Retrieve an order + description: Returns a single order + operationId: getOrderById + parameters: + - name: orderId + in: path + description: ID of the order to retrieve + required: true + schema: + type: string + responses: + '200': + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/Order' + '400': + description: Invalid ID supplied + '404': + description: Order not found +externalDocs: + description: Find out more about Redocly Cafe + url: https://cafe.redocly.com +servers: + - url: https://api.cafe.redocly.com +components: + requestBodies: + MenuItem: + content: + application/json: + schema: + $ref: '#/components/schemas/MenuItem' + description: Menu item that needs to be added to the menu + required: true + schemas: + OrderItem: + type: object + required: + - menuItemId + - quantity + properties: + menuItemId: + type: string + quantity: + type: integer + minimum: 1 + comment: + type: string + example: No sugar! + MenuItem: + type: object + required: + - name + - price + properties: + id: + type: string + example: prd_01h1s5z6vf2mm1mz3hevnn9va7 + name: + x-internal: true + type: string + example: Cappuccino + price: + type: integer + description: Price in cents + example: 4500 + category: + x-internal: true + type: string + description: Menu item category + enum: + - beverage + - dessert + Order: + type: object + required: + - customerName + - orderItems + properties: + id: + type: string + example: ord_01h1s5z6vf2mm1mz3hevnn9va7 + customerName: + type: string + example: Mary Ann + status: + x-internal: true + type: string + description: order status in the cafe + enum: + - placed + - preparing + - completed + - canceled + orderItems: + type: array + items: + $ref: '#/components/schemas/OrderItem' +``` + +Output OpenAPI (`with-plugin.yaml`): + +```yaml +openapi: 3.0.0 +info: + description: This is a sample Redocly Cafe server. Cafe operators (not customers) use it to manage menus, orders, and revenue. Find out more at [https://cafe.redocly.com](https://cafe.redocly.com). + version: 1.0.0 + title: Redocly Cafe + termsOfService: https://redocly.com/subscription-agreement + contact: + email: team@redocly.com + license: + name: MIT + url: https://opensource.org/licenses/MIT +servers: + - url: https://api.cafe.redocly.com +tags: + - name: Products + description: Operations related to products + externalDocs: + description: Find out more + url: https://cafe.redocly.com + - name: Orders + description: Order management operations +externalDocs: + description: Find out more about Redocly Cafe + url: https://cafe.redocly.com +paths: + /menu: + get: + tags: + - Products + summary: List all menu items + description: Retrieve a collection of menu items with optional filtering + operationId: listMenuItems + parameters: + - name: search + in: query + description: Text search across menu item fields + required: false + schema: + type: string + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MenuItem' + '400': + description: Invalid search value + post: + x-internal: true + tags: + - Products + summary: Create menu item + description: '' + operationId: createMenuItem + requestBody: + $ref: '#/components/requestBodies/MenuItem' + responses: + '201': + description: Menu item created + '400': + description: Invalid input + /orders: + get: + tags: + - Orders + summary: List all orders + description: Multiple status values can be provided with comma separated strings. Use placed, preparing, completed for testing. + operationId: listOrders + parameters: + - name: status + in: query + description: Status values used to filter orders + required: false + explode: true + schema: + type: array + items: + type: string + enum: + - placed + - preparing + - completed + - canceled + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Order' + '400': + description: Invalid status value + /orders/{orderId}: + get: + tags: + - Orders + summary: Retrieve an order + description: Returns a single order + operationId: getOrderById + parameters: + - name: orderId + in: path + description: ID of the order to retrieve + required: true + schema: + type: string + responses: + '200': + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/Order' + '400': + description: Invalid ID supplied + '404': + description: Order not found +components: + requestBodies: + MenuItem: + content: + application/json: + schema: + $ref: '#/components/schemas/MenuItem' + description: Menu item that needs to be added to the menu + required: true + schemas: + OrderItem: + type: object + required: + - menuItemId + - quantity + properties: + menuItemId: + type: string + quantity: + type: integer + minimum: 1 + comment: + type: string + example: No sugar! + MenuItem: + type: object + required: + - name + - price + properties: + id: + type: string + example: prd_01h1s5z6vf2mm1mz3hevnn9va7 + name: + x-internal: true + type: string + example: Cappuccino + price: + type: integer + description: Price in cents + example: 4500 + category: + x-internal: true + type: string + description: Menu item category + enum: + - beverage + - dessert + Order: + type: object + required: + - customerName + - orderItems + properties: + id: + type: string + example: ord_01h1s5z6vf2mm1mz3hevnn9va7 + customerName: + type: string + example: Mary Ann + status: + x-internal: true + type: string + description: order status in the cafe + enum: + - placed + - preparing + - completed + - canceled + orderItems: + type: array + items: + $ref: '#/components/schemas/OrderItem' +``` + +## References + +Copyright CIDgravity, @nicobao, 2022. + +Copy-pasted from: + +- https://github.com/CIDgravity/redoc-plugins +- https://github.com/nicobao/redoc-plugins + +This decorator was originally licensed under both the Apache v2 license and the MIT license. diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-extensions/remove-extensions.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-extensions/remove-extensions.js new file mode 100644 index 000000000..8a2ce2c97 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-extensions/remove-extensions.js @@ -0,0 +1,74 @@ +/** @type {import('@redocly/cli').OasDecorator} */ + +const openAPIExtensions = /^x-/; + +// a console.assert that actually abort execution +// message is str +// bool is boolean +function assert(bool, message) { + if (!bool) { + const err = message !== undefined ? new Error(message) : new Error('an error occurred'); + throw err; + } +} + +function doRemoveParamFromNode(node, param) { + assert(typeof param === 'string', 'extension must be a string'); + assert( + isExtensionValid(param), + `[Aborting] String "${param}" is not a valid OpenAPI extension, it must begin with "x-"` + ); + delete node[param]; + console.log('Deleted extension "%s" from object "%O"', param, node); +} + +function isExtensionValid(extension) { + assert(typeof extension === 'string', 'extension must be a string'); + if (extension.match(openAPIExtensions)) { + return true; + } else { + return false; + } +} + +function removeExtensionsFromNode(node, extensions) { + const extensionsType = typeof extensions; + assert( + extensionsType === 'undefined' || extensionsType === 'string' || extensionsType === 'object', + `Extensions must be a string or a list of string instead of being of type "${extensionsType}"` + ); + if (extensions === undefined || extensions === null || extensions === '') { + console.log('Deleting all OpenAPI extensions (params starting with "x-")...'); + Object.keys(node) + .filter((param) => param.match(openAPIExtensions)) + .forEach((param) => { + doRemoveParamFromNode(node, param); + }); + } else if (extensionsType === 'string') { + // extensions is a string representing a regex - delete all the params that match this regex + Object.keys(node) + .filter((param) => param.match(extensions)) + .forEach((param) => { + doRemoveParamFromNode(node, param); + }); + } else { + // extensions a list + // only return something if all strings are valid OpenAPI spec, otherwise panic (handled by the assert) + extensions.forEach((extension) => { + // extension is a string representing a regex - delete all the params that match this regex + Object.keys(node) + .filter((param) => param.match(extension)) + .forEach((param) => { + doRemoveParamFromNode(node, param); + }); + }); + } +} + +export default function RemoveExtensions({ extensions }) { + return { + any: { + enter: (node, _ctx) => removeExtensionsFromNode(node, extensions), + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/README.md b/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/README.md new file mode 100644 index 000000000..fd2ca9cc8 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/README.md @@ -0,0 +1,141 @@ +# Remove unused tags + +Authors: + +- [`@lornajane`](https://github.com/lornajane), Lorna Mitchell (Redocly) + +## What this does and why + +A custom plugin with a decorator that looks at each operation in the API description, and counts how many times each tag is used. Any that are not used by any operation are removed. + +There is support for an array of tags to ignore; these tags won't be removed from the API description even if they are unused. + +This is a useful decorator to use when you are reducing a larger OpenAPI file for a specific output case. Using the [filter-out decorator](https://redocly.com/docs/cli/decorators/filter-out/) for example can leave tags that are no longer needed. + +## Code + +The plugin code itself is in `tags.js`: + +```js +export default function plugin() { + return { + id: 'tags', + decorators: { + oas3: { + 'no-unused-tags': ({ ignore }) => { + console.log('Cleaning up unused tags...'); + // mark the ignored tags as already used so we don't remove them + const usedTags = new Set(ignore?.map((tag) => tag.toLowerCase())); + return { + Operation: { + enter(operation) { + // log all the tags that are in use + for (const tag of operation.tags || []) { + usedTags.add(tag.toLowerCase()); + } + }, + }, + Root: { + leave(root) { + // remove any tags that we didn't find in use or marked to ignore + root.tags = (root.tags || []).filter((tag) => usedTags.has(tag.name.toLowerCase())); + return root; + }, + }, + }; + }, + }, + }, + }; +} +``` + +In summary, this code does the following: + +1. Take the supplied ignore values (if there are any), convert them to lower case, and add them to the `usedTags` set so that they don't get removed. + +2. Visit each operation in the description and add all tags used to the `usedTags` set. + +3. Examine the tags declared in the OpenAPI document, and remove any that aren't found in the `usedTags` set. + +To use the custom decorator, add configuration like the following to the `redocly.yaml` file: + +```yaml +plugins: + - ./tags.js + +decorators: + tags/no-unused-tags: on +``` + +If there are tags that should be preserved even though they are unused, add them to the ignore list: + +```yaml +plugins: + - ./tags.js + +decorators: + tags/no-unused-tags: + ignore: + - extra + - KeepMe +``` + +Apply the decorator by running the bundle command: + +```bash +redocly bundle openapi.yaml -o openapi-tidy.yaml +``` + +The new file `openapi-tidy.yaml` contains the API description with only the in-use and ignored tags included. + +The checking is case-insensitive (it seems more likely to mistype a tag's case than to intentionally have two tags named the same with different case - although I'm sure both exist somewhere!). + +## Examples + +Start by adding the decorator to `redocly.yaml` and including some ignore settings: + +```yaml +plugins: + - ./tags.js + +decorators: + tags/no-unused-tags: + ignore: + - extra + - KeepMe +``` + +Given an API description that uses only the `Products` and `Orders` tags, the tags section would be transformed to remove the other tags. + +**Before bundling/decorating**: + +```yaml +tags: + - name: Products + description: Operations related to products. + - name: Statistics + description: This tag isn't used by any of the endpoints, so that should be detected and corrected. + - name: Extra + description: This tag isn't used by any of the endpoints, but we're keeping it anyway. + - name: Orders + description: Order management operations. +``` + +Run the decorator and observe the API description tags section **after bundling/decorating**: + +```yaml +tags: + - name: Products + description: Operations related to products. + - name: Extra + description: This tag isn't used by any of the endpoints, but we're keeping it anyway. + - name: Orders + description: Order management operations. +``` + +Use this decorator to tidy up when leftover tags remain in an OpenAPI description. + +## References + +- Inspired by [issue #953 on Redocly CLI](https://github.com/Redocly/redocly-cli/issues/953). diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/redocly.yaml b/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/redocly.yaml new file mode 100644 index 000000000..05ae7413c --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/redocly.yaml @@ -0,0 +1,5 @@ +plugins: + - './tags.js' + +decorators: + tags/no-unused-tags: on diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/tags.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/tags.js new file mode 100644 index 000000000..2c50e70d9 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/remove-unused-tags/tags.js @@ -0,0 +1,31 @@ +export default function plugin() { + return { + id: 'tags', + decorators: { + oas3: { + 'no-unused-tags': ({ ignore }) => { + console.log('Cleaning up unused tags...'); + // mark the ignored tags as already used so we don't remove them + const usedTags = new Set(ignore?.map((tag) => tag.toLowerCase())); + return { + Operation: { + enter(operation) { + // log all the tags that are in use + for (const tag of operation.tags || []) { + usedTags.add(tag.toLowerCase()); + } + }, + }, + Root: { + leave(root) { + // remove any tags that we didn't find in use or marked to ignore + root.tags = (root.tags || []).filter((tag) => usedTags.has(tag.name.toLowerCase())); + return root; + }, + }, + }; + }, + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/README.md b/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/README.md new file mode 100644 index 000000000..623fc325b --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/README.md @@ -0,0 +1,125 @@ +# Set servers URLs + +Authors: + +- [`@TKostrzewski`](https://github.com/TKostrzewski), Thomas Kostrzewski + +## What this does and why + +A custom plugin/decorator pair that sets the API server(s) URL(s) of the OpenAPI specification. +If a `servers` field is already present, it will be overwritten. + +Unlike the [replace servers URL guide](https://redocly.com/docs/cli/guides/replace-servers-url), this decorator also works when the source description has no `servers` field, and it can set multiple server URLs at once. + +Some common use cases for this custom plugin and decorator set include: + +- overriding server URLs for different deployment environments, all without modifying the original OpenAPI specification +- ensuring all generated API documentation points to a specific gateway, or proxy endpoint +- standardizing server URLs across multiple OpenAPI specifications, in a monorepo, or microservices architecture. +- injecting mock server URLs for testing purposes. +- replacing internal server URLs with public-facing server URLs, before publishing API documentation. + +## Code + +### Decorator + +You can find the full decorator code in the [set-servers-urls-decorator.js](set-servers-urls-decorator.js) file. + +The decorator validates the `serverUrl` argument, and then maps it to the OpenAPI `servers` field. + +```javascript +export default function SetServersUrls({ serverUrl = [] }) { + return { + Root: { + leave(node) { + const serverUrlsIsAValidArray = Array.isArray(serverUrl) && serverUrl.length > 0; + + if (!serverUrlsIsAValidArray) { + return; + } + + node.servers = serverUrl.map((url) => ({ url })); + }, + }, + }; +} +``` + +### Plugin + +You can find the full plugin code in the [set-servers-urls-plugin.js](set-servers-urls-plugin.js) file. + +```javascript +const setServersUrlsDecorator = { + oas3: { + 'set-servers-urls-decorator': SetServersUrls, + }, +}; + +export default function setServersUrlsPlugin() { + return { + id: 'set-servers-urls-plugin', + decorators: setServersUrlsDecorator, + }; +} +``` + +### redocly.yaml + +You can find the full configuration in the [redocly.yaml](redocly.yaml) file. + +```yaml +apis: + api-one-name: + root: api-one-definition.yaml + decorators: + set-servers-urls-plugin/set-servers-urls-decorator: + serverUrl: + [ + 'https://api-one.development.com', + 'https://api-one.staging.com', + 'https://api-one.production.com', + ] +plugins: + - './set-servers-urls-plugin.js' +extends: + - recommended +``` + +## Examples + +With the `redocly.yaml` configuration above, and an example OpenAPI description (saved within a `api-one-definition.yaml` file, and based on the [Redocly Cafe API](https://cafe.redocly.com/openapi/cafe)) as such: + +```yaml +openapi: 3.1.0 +info: + title: Redocly Cafe + ... +servers: + - url: "https://api.cafe.redocly.com" +paths: + ... +... +``` + +The resulting OpenAPI description (after applying the decorator) would be: + +```yaml +openapi: 3.1.0 +info: + title: Redocly Cafe + ... +servers: + - url: "https://api-one.development.com" + - url: "https://api-one.staging.com" + - url: "https://api-one.production.com" +paths: + ... +... +``` + +## References + +- Redocly CLI - [Replace servers URL plugin example](https://redocly.com/docs/cli/guides/replace-servers-url) +- Redocly Cafe API - [cafe-openapi-example openapi.yaml](https://github.com/Redocly/cafe-api) +- OpenAPI specification v3.1.0 - [Servers Object](https://spec.openapis.org/oas/v3.1.0#server-object) diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/redocly.yaml b/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/redocly.yaml new file mode 100644 index 000000000..cf812865c --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/redocly.yaml @@ -0,0 +1,15 @@ +apis: + api-one-name: + root: api-one-definition.yaml + decorators: + set-servers-urls-plugin/set-servers-urls-decorator: + serverUrl: + [ + 'https://api-one.development.com', + 'https://api-one.staging.com', + 'https://api-one.production.com', + ] +plugins: + - './set-servers-urls-plugin.js' +extends: + - recommended diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/set-servers-urls-decorator.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/set-servers-urls-decorator.js new file mode 100644 index 000000000..1495d6ed8 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/set-servers-urls-decorator.js @@ -0,0 +1,16 @@ +/** @type {import('@redocly/cli').OasDecorator} */ +export default function SetServersUrls({ serverUrl = [] }) { + return { + Root: { + leave(node) { + const serverUrlsIsAValidArray = Array.isArray(serverUrl) && serverUrl.length > 0; + + if (!serverUrlsIsAValidArray) { + return; + } + + node.servers = serverUrl.map((url) => ({ url })); + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/set-servers-urls-plugin.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/set-servers-urls-plugin.js new file mode 100644 index 000000000..29507e66f --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/set-servers-urls/set-servers-urls-plugin.js @@ -0,0 +1,15 @@ +import SetServersUrls from './set-servers-urls-decorator.js'; + +/** @type {import('@redocly/cli').DecoratorsConfig} */ +const setServersUrlsDecorator = { + oas3: { + 'set-servers-urls-decorator': SetServersUrls, + }, +}; + +export default function setServersUrlsPlugin() { + return { + id: 'set-servers-urls-plugin', + decorators: setServersUrlsDecorator, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/README.md b/@skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/README.md new file mode 100644 index 000000000..de804057d --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/README.md @@ -0,0 +1,170 @@ +# Swap the summary and description fields + +Authors: + +- [`@lornajane`](https://github.com/lornajane), Lorna Mitchell (Redocly) + +## What this does and why + +We sometimes see API descriptions with the fields mixed up. +The most common of these is the `summary` and `description` fields on Operations in OpenAPI, some generators seem to produce the fields with the content reversed. + +- Summary: used when the operations are displayed in a list, it should be a very short phrase to describe the operation. +- Description: used to supply more detail, used when the operation is displayed in detail. The description field also supports Markdown. + +This decorator takes the content of both fields and (as long as there is some content in the description field), swaps them over. + +## Code + +The following code snippet shows the decorator, in a file named `swap-fields.js`: + +```js +export default function plugin() { + return { + id: 'swap-fields', + decorators: { + oas3: { + 'summary-description': () => { + return { + Operation: { + leave(target) { + let description = ''; + let summary = ''; + if (target.description) { + description = target.description; + } + if (target.summary) { + summary = target.summary; + } + + // only swap them if there is some description content + if (description.length > 0) { + target.description = summary; + target.summary = description; + } + }, + }, + }; + }, + }, + }, + }; +} +``` + +Put this file alongside your `redocly.yaml` file, and add the following configuration to `redocly.yaml`: + +```yaml +plugins: + - swap-fields.js + +decorators: + swap-fields/summary-description: on +``` + +When you run `redocly bundle`, the API description(s) will have their field order updated. + +## Examples + +Before the change, an example based on the [Redocly Cafe API](https://cafe.redocly.com/openapi/cafe) with the fields reversed (the problem was initially spotted in the [GitHub API Reference](https://github.com/github/rest-api-description)): + +```yaml +openapi: 3.1.0 +info: + version: 1.0.0 + title: Redocly Cafe + description: Demo API for cafe operators to manage menus, orders, and revenue. + license: + name: MIT + url: https://opensource.org/licenses/MIT + termsOfService: https://redocly.com/subscription-agreement + contact: + email: team@redocly.com + url: https://redocly.com/contact-us/ +webhooks: + order-notification: + post: + summary: |- + This event occurs when a new order is placed in the cafe. + The payload contains the order ID, its status, and the time the event occurred. + Use it to update kitchen displays, or to notify baristas that a new order is waiting. + + To subscribe to this event, register a webhook URL when creating your OAuth2 client. + description: A new order was placed. + operationId: orderNotificationWebhook + requestBody: + required: true + content: + application/json: + schema: + '$ref': '#/components/schemas/OrderNotification' + responses: + '200': + description: Return a 200 status to indicate that the data was received successfully + +components: + schemas: + OrderNotification: + title: order notification event + type: object + properties: + orderStatus: + type: string + enum: + - placed +``` + +After the decorator has been run, the updated file looks like the following example: + +```yaml +openapi: 3.1.0 +info: + version: 1.0.0 + title: Redocly Cafe + description: Demo API for cafe operators to manage menus, orders, and revenue. + license: + name: MIT + url: https://opensource.org/licenses/MIT + termsOfService: https://redocly.com/subscription-agreement + contact: + email: team@redocly.com + url: https://redocly.com/contact-us/ +webhooks: + order-notification: + post: + summary: A new order was placed. + description: |- + This event occurs when a new order is placed in the cafe. + The payload contains the order ID, its status, and the time the event occurred. + Use it to update kitchen displays, or to notify baristas that a new order is waiting. + + To subscribe to this event, register a webhook URL when creating your OAuth2 client. + operationId: orderNotificationWebhook + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/OrderNotification' + responses: + '200': + description: Return a 200 status to indicate that the data was received successfully +components: + schemas: + OrderNotification: + title: order notification event + type: object + properties: + orderStatus: + type: string + enum: + - placed +``` + +You could also edit the plugin to make other field changes as you need. + +## References + +- [Redocly Cafe API](https://cafe.redocly.com/openapi/cafe), the API the example is based on +- [GitHub REST API descriptions](https://github.com/github/rest-api-description), where the problem was initially spotted +- [OpenAPI reference](https://spec.openapis.org/oas/latest.html) diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/redocly.yaml b/@skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/redocly.yaml new file mode 100644 index 000000000..7b3147f6a --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/redocly.yaml @@ -0,0 +1,5 @@ +plugins: + - swap-fields.js + +decorators: + swap-fields/summary-description: on diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/swap-fields.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/swap-fields.js new file mode 100644 index 000000000..4f91d336a --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/swap-summary-description/swap-fields.js @@ -0,0 +1,31 @@ +export default function plugin() { + return { + id: 'swap-fields', + decorators: { + oas3: { + 'summary-description': () => { + return { + Operation: { + leave(target) { + let description = ''; + let summary = ''; + if (target.description) { + description = target.description; + } + if (target.summary) { + summary = target.summary; + } + + // only swap them if there is some description content + if (description.length > 0) { + target.description = summary; + target.summary = description; + } + }, + }, + }; + }, + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/README.md b/@skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/README.md new file mode 100644 index 000000000..0eb62c7a9 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/README.md @@ -0,0 +1,96 @@ +# Decorator to sort tags in an API description + +Authors: + +- [`@lornajane`](https://github.com/lornajane), Lorna Mitchell (Redocly) + +## What this does and why + +Redocly CLI has the [`tags-alphabetical`](https://redocly.com/docs/cli/rules/tags-alphabetical/) rule to error if the `tags` section isn't in alphabetical order by `name`. + +This decorator provides functionality to _put_ the tags in order by name, in order to make any API description compatible with that rule. + +## Code + +Here's the main plugin entrypoint, it's in `tag-sorting.js`: + +```javascript +import SortTagsAlphabetically from './decorator-alpha'; + +export default function tagSortingPlugin() { + return { + id: 'tag-sorting', + decorators: { + oas3: { + alphabetical: SortTagsAlphabetically, + }, + }, + }; +} +``` + +The code here sets the plugin name to `tag-sorting` and adds a decorator for OpenAPI 3 called `alphabetical`. + +The functionality for the alphabetical sorting is in `decorator-alpha.js`: + +```javascript +export default function SortTagsAlphabetically() { + console.log('re-ordering tags: alphabetical'); + return { + TagList: { + leave(target) { + target.sort((a, b) => { + if (a.name < b.name) { + return -1; + } + if (a.name > b.name) { + return 1; + } + return 0; + }); + }, + }, + }; +} +``` + +It operates on the `TagList` element, since it needs to shuffle the child entries inside it. A simple comparison of the name field is used to sort the items. + +## Examples + +Add the plugin to `redocly.yaml` and enable the decorator: + +```yaml +plugins: + - ./tag-sorting.js + +decorators: + tag-sorting/alphabetical: on +``` + +Now with an OpenAPI description that has more than one tag listed at the top level, the decorator will re-order the entries. + +**Before**: + +```yaml +tags: + - name: Products + description: Operations related to products. + - name: Orders + description: Order management operations. +``` + +**After**: + +```yaml +tags: + - name: Orders + description: Order management operations. + - name: Products + description: Operations related to products. +``` + +## References + +- [`tags-alphabetical` rule](https://redocly.com/docs/cli/rules/tags-alphabetical/) +- The [`tags` types documentation](https://redocly.com/docs/openapi-visual-reference/tags/#types) diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/decorator-alpha.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/decorator-alpha.js new file mode 100644 index 000000000..5cf17e3f4 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/decorator-alpha.js @@ -0,0 +1,18 @@ +export default function SortTagsAlphabetically() { + console.log('re-ordering tags: alphabetical'); + return { + TagList: { + leave(target) { + target.sort((a, b) => { + if (a.name < b.name) { + return -1; + } + if (a.name > b.name) { + return 1; + } + return 0; + }); + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/tag-sorting.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/tag-sorting.js new file mode 100644 index 000000000..0bd2a654f --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/tag-sorting/tag-sorting.js @@ -0,0 +1,12 @@ +import SortTagsAlphabetically from './decorator-alpha.js'; + +export default function tagSortingPlugin() { + return { + id: 'tag-sorting', + decorators: { + oas3: { + alphabetical: SortTagsAlphabetically, + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/README.md b/@skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/README.md new file mode 100644 index 000000000..54cd81489 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/README.md @@ -0,0 +1,136 @@ +# Substitute datetime placeholders in an API description + +Authors: + +- [`@tatomyr`](https://github.com/tatomyr), Andrew Tatomyr (Redocly) + +## What this does and why + +When an API description includes datetime values, it's nice if they present soon or realistic date values. +This decorator provides the functionality to replace a special datetime placeholder, `$DateTimeNow`, with the current date and time when bundling the API description. +You can also use expressions to add a set number of days to the value, for example `$DateTimeNow + 10 days`. + +> [!WARNING] +> Placeholders aren't supported by all OpenAPI tools. Using this approach, you should bundle your OpenAPI to apply the decorators before passing the API description to other tools. + +## Code + +The `dates-plugin` plugin defines the `decorator` section and the plugin `id`: + +```javascript +import updateExampleDates from './decorator.js'; + +export default function plugin() { + return { + id: 'dates-plugin', + decorators: { + oas3: { + 'update-example-dates': updateExampleDates, + }, + }, + }; +} +``` + +Here's the main part of the decorator (from `decorator.js`): + +```javascript +export default function updateExampleDates() { + return { + // Covers the 'examples' keyword (including examples in the 'components' section) + Example: { + enter(example) { + replaceWithComputedDateTime(example, 'value'); + }, + }, + // Covers the 'example' in media type objects + MediaType: { + enter(mediaTypeObject) { + replaceWithComputedDateTime(mediaTypeObject, 'example'); + }, + }, + // Covers the 'example' in schemas + Schema: { + enter(schema) { + replaceWithComputedDateTime(schema, 'example'); + }, + }, + }; +} +``` + +The decorator operates on the `Example`, `MediaType` and `Schema` nodes to cover the different ways of specifying examples. + +The `replaceWithComputedDateTime` function replaces the example value at the given key when it is a string containing the `$DateTimeNow` variable. +When the value is an object, `traverseAndReplaceWithComputedDateTime` walks it and replaces the matching values inside: + +```javascript +function replaceWithComputedDateTime(parent, key) { + const value = parent[key]; + if (typeof value === 'string' && /\$DateTimeNow/.test(value)) { + parent[key] = computeDateTemplate(value); + } else { + traverseAndReplaceWithComputedDateTime(value); + } +} + +function traverseAndReplaceWithComputedDateTime(value) { + if (typeof value === 'object' && value !== null) { + for (const key in value) { + replaceWithComputedDateTime(value, key); + } + } +} +``` + +The `computeDateTemplate` function is a very basic datetime calculator that can only add days to the current date, but it illustrates the idea and you can extend it to meet your own specific needs: + +```javascript +function computeDateTemplate(template) { + const substitutedExpression = template + .replace('$DateTimeNow', Date.now()) // Replacing the variable with the current date in milliseconds + .replace(/(\d+)\s*days?/g, (_, t) => t * 1000 * 60 * 60 * 24) // Replacing days with milliseconds + .trim(); + const calculated = substitutedExpression // A basic calculator + .split(/\s*\+\s*/) + .reduce((sum, item) => sum + +item, 0); + return new Date(calculated).toISOString(); +} +``` + +## Examples + +Add the plugin to `redocly.yaml` and enable the decorator: + +```yaml +plugins: + - ./plugin.js + +decorators: + dates-plugin/update-example-dates: on +``` + +Given the following API description, the decorator will replace `$DateTimeNow` with the current date and `$DateTimeNow + 7 days` with the date a week from now: + +```yaml +openapi: 3.1.0 +paths: + /date-time: + get: + responses: + 200: + content: + application/json: + example: + somewhere-in-the-past: 2023-11-06T12:00:00.000Z + today: $DateTimeNow # Will be replaced with the current date + in-a-week: $DateTimeNow + 7 days # Will be replaced with the date in a week +``` + +Please note that API descriptions are static text documents, so the dates will get updated only when the description gets bundled. + +## References + +- [Redocly documentation on examples in OpenAPI](https://redocly.com/docs/openapi-visual-reference/schemas/#example-and-examples) + +- [OpenAPI Specification on Media Type Objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object) diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/decorator.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/decorator.js new file mode 100644 index 000000000..15f0da120 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/decorator.js @@ -0,0 +1,52 @@ +export default function updateExampleDates() { + return { + // Covers the 'examples' keyword (including examples in the 'components' section) + Example: { + enter(example) { + replaceWithComputedDateTime(example, 'value'); + }, + }, + // Covers the 'example' in media type objects + MediaType: { + enter(mediaTypeObject) { + replaceWithComputedDateTime(mediaTypeObject, 'example'); + }, + }, + // Covers the 'example' in schemas + Schema: { + enter(schema) { + replaceWithComputedDateTime(schema, 'example'); + }, + }, + }; +} + +// Replaces the value at parent[key] when it is a string containing the template, +// or traverses it when it is an object +function replaceWithComputedDateTime(parent, key) { + const value = parent[key]; + if (typeof value === 'string' && /\$DateTimeNow/.test(value)) { + parent[key] = computeDateTemplate(value); + } else { + traverseAndReplaceWithComputedDateTime(value); + } +} + +function traverseAndReplaceWithComputedDateTime(value) { + if (typeof value === 'object' && value !== null) { + for (const key in value) { + replaceWithComputedDateTime(value, key); + } + } +} + +function computeDateTemplate(template) { + const substitutedExpression = template + .replace('$DateTimeNow', Date.now()) // Replacing the variable with the current date in milliseconds + .replace(/(\d+)\s*days?/g, (_, t) => t * 1000 * 60 * 60 * 24) // Replacing days with milliseconds + .trim(); + const calculated = substitutedExpression // A basic calculator + .split(/\s*\+\s*/) + .reduce((sum, item) => sum + +item, 0); + return new Date(calculated).toISOString(); +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/plugin.js b/@skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/plugin.js new file mode 100644 index 000000000..f27588cfa --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-decorators/update-example-dates/plugin.js @@ -0,0 +1,12 @@ +import updateExampleDates from './decorator.js'; + +export default function plugin() { + return { + id: 'dates-plugin', + decorators: { + oas3: { + 'update-example-dates': updateExampleDates, + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/README.md b/@skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/README.md new file mode 100644 index 000000000..4de9c3340 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/README.md @@ -0,0 +1,144 @@ +# Check code sample coverage + +Authors: + +- Laura Rubin @SansContext (with great help from Manny Silva @hawkeyexl in the Write the Docs Slack) + +## What this does and why + +This rule checks to see if each operation has examples for a static set of specified languages. In the original case, I have six languages that we try to cover for example code samples, and it's helpful to know which routes are missing which samples, so I can prioritize and burn down patching them. + +This loads the `lang:` fields specified in the `x-code-samples` array, and then compares those languages to a `const` list of languages that you specify in the top of `check-sdk-coverage.js`. If you have different wording or different SDKs, you can add those here. + +You probably want to set these to `warn` if you think you're going to have a lot of them. + +**Tip**: you might want to use these in conjunction with a configurable rule that checks if you even _have_ an `x-code-samples` array... + +```yaml +rule/x-code-samples-exist: + subject: + type: Operation + property: x-code-samples + assertions: + defined: true + message: 'Each path must have an x-code-samples object.' + severity: warn +``` + +## Code + +These examples show how to create a [custom plugin](https://redocly.com/docs/cli/custom-plugins) with a rule to check that the expected code samples are present. + +### Plugin - `x-code-sample-checks.js` + +First the main plugin code in `x-code-sample-checks.js`: + +```js +import CheckSDKCoverage from './check-sdk-coverage.js'; + +export default function myRulesPlugin() { + return { + id: 'x-code-samples-check', + rules: { + oas3: { + 'check-sdk-coverage': CheckSDKCoverage, + }, + }, + }; +} +``` + +Save this file and import the plugin by adding the following example to `redocly.yaml`: + +```yaml +plugins: + - ./x-code-sample-checks.js +``` + +### Rule - Check SDK Coverage + +The main functionality of the plugin is in this file `check-sdk-coverage.js`, which is as follows: + +```js +// If you have different SDK languages edit this array +const sdkLanguages = ['bash', 'javascript', 'python', 'ruby', 'java', 'kotlin']; + +export default function CheckSDKCoverage() { + return { + XCodeSampleList: { + enter(codeSampleList, ctx) { + //check for the SDK languages by making an array of the lang fields from the code samples + const langArray = codeSampleList.map((codeSample) => { + return codeSample.lang; + }); + //compare the sdkLanguages array with the langArray to find the missing languages, and save them to an array + const missingLanguages = sdkLanguages.filter((lang) => { + return !langArray.includes(lang); + }); + //if there are missing languages, report them as warnings + // might want to make this less verbose later + if (missingLanguages.length > 0) { + ctx.report({ + message: `Only ${langArray.length} code samples: ${langArray.join( + ', ' + )} but is missing the following SDK languages: ${missingLanguages.join(', ')}`, + }); + } + }, + }, + }; +} +``` + +Edit the `sdkLanguages` array to specify the languages that every endpoint should include. + +Enable the rule in `redocly.yaml` like this: + +```yaml +rules: + x-code-samples-check/check-sdk-coverage: error +``` + +## Examples + +The following sections show part of an API description, and the expected output. + +### API description snippet + +```yaml +post: + operationId: registerOAuth2Client + summary: Create OAuth2 client + description: [...] # Omitted for brevity + security: [...] # Omitted for brevity + requestBody: [...] # Omitted for brevity + responses: [...] # Omitted for brevity + x-code-samples: + - lang: bash + label: cURL + source: + $ref: ./code_samples/oauth2/register/POST/curl.sh + - lang: ruby + label: Ruby SDK + source: + $ref: ./code_samples/oauth2/register/POST/ruby.rb + - lang: python + label: Python SDK + source: + $ref: ./code_samples/oauth2/register/POST/python.py + - lang: java + label: Java SDK + source: + $ref: ./code_samples/oauth2/register/POST/java.java + - lang: kotlin + label: Kotlin SDK + source: + $ref: ./code_samples/oauth2/register/POST/kotlin.kt +``` + +### Output + +```bash +paths/oauth2-register.yaml: + 9:5 error x-code-samples-check/check-sdk-coverage Only 5 code samples: bash, ruby, python, java, kotlin but is missing the following SDK languages: javascript +``` diff --git a/@skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/check-sdk-coverage.js b/@skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/check-sdk-coverage.js new file mode 100644 index 000000000..735b93acb --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/check-sdk-coverage.js @@ -0,0 +1,28 @@ +// If you have different SDK languages edit this array +const sdkLanguages = ['bash', 'javascript', 'python', 'ruby', 'java', 'kotlin']; + +export default function CheckSDKCoverage() { + return { + XCodeSampleList: { + enter(codeSampleList, ctx) { + //check for the SDK languages by making an array of the lang fields from the code samples + const langArray = codeSampleList.map((codeSample) => { + return codeSample.lang; + }); + //compare the sdkLanguages array with the langArray to find the missing languages, and save them to an array + const missingLanguages = sdkLanguages.filter((lang) => { + return !langArray.includes(lang); + }); + //if there are missing languages, report them as warnings + // might want to make this less verbose later + if (missingLanguages.length > 0) { + ctx.report({ + message: `Only ${langArray.length} code samples: ${langArray.join( + ', ' + )} but is missing the following SDK languages: ${missingLanguages.join(', ')}`, + }); + } + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/x-code-sample-checks.js b/@skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/x-code-sample-checks.js new file mode 100644 index 000000000..a39d21afa --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-rules/code-sample-checks/x-code-sample-checks.js @@ -0,0 +1,12 @@ +import CheckSDKCoverage from './check-sdk-coverage.js'; + +export default function myRulesPlugin() { + return { + id: 'x-code-samples-check', + rules: { + oas3: { + 'check-sdk-coverage': CheckSDKCoverage, + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-rules/default-enum-match/README.md b/@skills/redocly-cli/cookbook/custom-plugin-rules/default-enum-match/README.md new file mode 100644 index 000000000..ab2340eaa --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-rules/default-enum-match/README.md @@ -0,0 +1,99 @@ +# Default is an Enum + +Authors: + +- [@hawkeyexl](https://github.com/hawkeyexl) Manny Silva ([Doc Detective](https://doc-detective.com)) + +## What this does and why + +This rule makes sure that when a schema has both `default` and `enum` properties, the `default` property is set to one of the values in the `enum` array. This is useful for API documentation where you want to make sure that the default value is valid. + +## Code + +### Redocly config - `redocly.yaml` + +Update your Redocly configuration file to include the plugin and rule. Update paths as necessary. + +```yaml +plugins: + - ./default-enum-plugin.js + +rules: + default-enum/default-enum-match: error +``` + +### Plugin - `default-enum-plugin.js` + +The plugin defines the rule and returns it. Update paths as necessary. + +```js +export default function myRulesPlugin() { + return { + id: 'default-enum', + rules: { + oas3: { + 'default-enum-match': DefaultEnumMatch, + }, + arazzo: { + 'default-enum-match': DefaultEnumMatch, + }, + async3: { + 'default-enum-match': DefaultEnumMatch, + }, + }, + }; +} + +function DefaultEnumMatch() { + return { + Schema: { + enter(schema, ctx) { + // If enum and default are defined, default must be one of the enum values + if ( + schema.enum && + typeof schema.default != 'undefined' && + !schema.enum.includes(schema.default) + ) { + ctx.report({ + message: `The default value must be one of the enum values.`, + }); + } + }, + }, + }; +} +``` + +## Examples + +Given an OpenAPI description with the following schema: + +```yaml +status: + type: string + enum: + - placed + - preparing + - completed + - canceled + default: delivered +``` + +You get the following output: + +```text +The default value must be one of the enum values. + +10 | properties: +11 | status: +12 | type: string + | ^^^^^^^^^^^^ +13 | enum: + | ^^^^^ + … | < 4 more lines > +18 | default: delivered + | ^^^^^^^^^^^^^^^^^^ +19 | + +Error was generated by the default-enum/default-enum-match rule. +``` diff --git a/@skills/redocly-cli/cookbook/custom-plugin-rules/default-enum-match/default-enum-plugin.js b/@skills/redocly-cli/cookbook/custom-plugin-rules/default-enum-match/default-enum-plugin.js new file mode 100644 index 000000000..53482fc08 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-rules/default-enum-match/default-enum-plugin.js @@ -0,0 +1,35 @@ +export default function myRulesPlugin() { + return { + id: 'default-enum', + rules: { + oas3: { + 'default-enum-match': DefaultEnumMatch, + }, + arazzo: { + 'default-enum-match': DefaultEnumMatch, + }, + async3: { + 'default-enum-match': DefaultEnumMatch, + }, + }, + }; +} + +function DefaultEnumMatch() { + return { + Schema: { + enter(schema, ctx) { + // If enum and default are defined, default must be one of the enum values + if ( + schema.enum && + typeof schema.default != 'undefined' && + !schema.enum.includes(schema.default) + ) { + ctx.report({ + message: `The default value must be one of the enum values.`, + }); + } + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/README.md b/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/README.md new file mode 100644 index 000000000..3911cbd9c --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/README.md @@ -0,0 +1,191 @@ +# Validate Markdown descriptions + +Authors: + +- [`@lornajane`](https://github.com/lornajane) Lorna Mitchell (Redocly) + +## What this does and why + +Writing Markdown within YAML/JSON can be awkward, and our usual Markdown tooling may not be available. This plugin adds a rule that uses a third-party Markdown validator library, the excellent [markdownlint](https://github.com/DavidAnson/markdownlint), to pick the `description` fields from your OpenAPI description, and make sure it's valid. This can really help to catch typos and formatting problems, especially in longer descriptions or large APIs. + +By using an existing library, we get all the power and configurability of this specialist tool, and so you can edit and adapt this plugin to meet your own Markdown preferences. + +## Code + +This rule is built on the `markdownlint` library, so we need a `package.json` file to specify the dependency: + +```json +{ + "name": "redocly-openapi-markdown-plugin", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "openapi-markdown.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "MIT", + "dependencies": { + "markdownlint": "^0.31.1" + } +} +``` + +Make sure to install the dependency using your favorite package manager. For example I use `npm` so my installation command is: + +```sh +npm install +``` + +The entry point for the plugin code is in `openapi-markdown.js`: + +```js +import ValidateMarkdown from './rule-validate-markdown.js'; + +export default function plugin() { + return { + id: 'openapi-markdown', + rules: { + oas3: { + validate: ValidateMarkdown, + }, + }, + }; +} +``` + +The rule itself is in `rule-validate-markdown.js`: + +```js +import markdownlint from 'markdownlint'; + +const config = { + // the list is here https://github.com/DavidAnson/markdownlint#rules--aliases + MD013: { line_length: 120 }, + MD041: false, // first line should be h1 + MD047: false, // should end with newline +}; + +function checkString(description, ctx) { + let options = { + strings: { + desc: description, + }, + config: config, + }; + + try { + const lintResults = markdownlint.sync(options); + + if (lintResults.desc.length) { + // desc is the key in the options.strings object + let lines = description.split('\n'); + + for (const desc of lintResults.desc) { + // grab error message + let message = desc.ruleDescription; + // add line number context for longer entries + if (desc.lineNumber > 1) { + // computer counts from zero, humans count from 1 + const charsByError = lines[desc.lineNumber - 1].substring(0, 20); + message = `${message} (near: ${charsByError} ...)`; + } + + ctx.report({ + message: message, + location: ctx.location.child('description'), + }); + } + } + } catch (error) { + console.log(error); + } +} + +export default function ValidateMarkdown() { + console.log('OpenAPI Markdown: validate'); + return { + Info: { + enter({ description }, ctx) { + if (description) { + return checkString(description, ctx); + } + }, + }, + Tag: { + enter({ description }, ctx) { + if (description) { + return checkString(description, ctx); + } + }, + }, + Operation: { + enter({ description }, ctx) { + if (description) { + return checkString(description, ctx); + } + }, + }, + Parameter: { + enter({ description }, ctx) { + if (description) { + return checkString(description, ctx); + } + }, + }, + }; +} +``` + +To control the markdown validation rules in use, edit the config at the top of the file. + +Bring the plugin into your `redocly.yaml` file like this: + +```yaml +plugins: + - ./openapi-markdown.js + +rules: + openapi-markdown/validate: warn +``` + +When you lint your API descriptions, you'll see warnings for any invalid markdown found in the description fields. + +## Examples + +Given an OpenAPI description with these opening lines: + +```yaml +openapi: 3.1.0 +info: + title: Redocly Cafe + description: |- + Demo API for cafe operators (not customers) to manage menus, orders, and revenue. + + + ## Made by Redocly + Create API credentials and try it yourself at [Redocly Cafe](https://cafe.redocly.com). + version: 1.0.0 +``` + +Linting (with `--format=stylish` for brevity) produces the following output: + +```text +validating cafe.yaml... +OpenAPI Markdown: validate +cafe.yaml: + 4:16 warning openapi-markdown/validate Multiple consecutive blank lines (near: ...) + 4:16 warning openapi-markdown/validate Headings should be surrounded by blank lines (near: ## Made by Redocly ...) + +cafe.yaml: validated in 24ms + +Woohoo! Your API description is valid. 🎉 +You have 2 warnings. +``` + +You can configure markdownlint to pick up (or ignore) any aspects of markdown that it knows about. + +## References + +Built on [markdownlint](https://github.com/DavidAnson/markdownlint). diff --git a/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/openapi-markdown.js b/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/openapi-markdown.js new file mode 100644 index 000000000..d2b707ae3 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/openapi-markdown.js @@ -0,0 +1,12 @@ +import ValidateMarkdown from './rule-validate-markdown.js'; + +export default function plugin() { + return { + id: 'openapi-markdown', + rules: { + oas3: { + validate: ValidateMarkdown, + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/package.json b/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/package.json new file mode 100644 index 000000000..d8aba2a7b --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/package.json @@ -0,0 +1,15 @@ +{ + "name": "redocly-openapi-markdown-plugin", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "openapi-markdown.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "MIT", + "dependencies": { + "markdownlint": "^0.31.1" + } +} diff --git a/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/rule-validate-markdown.js b/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/rule-validate-markdown.js new file mode 100644 index 000000000..f8d451c60 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugin-rules/markdown-validator/rule-validate-markdown.js @@ -0,0 +1,78 @@ +import markdownlint from 'markdownlint'; + +const config = { + // the list is here https://github.com/DavidAnson/markdownlint#rules--aliases + MD013: { line_length: 120 }, + MD041: false, // first line should be h1 + MD047: false, // should end with newline +}; + +function checkString(description, ctx) { + let options = { + strings: { + desc: description, + }, + config: config, + }; + + try { + const lintResults = markdownlint.sync(options); + + if (lintResults.desc.length) { + // desc is the key in the options.strings object + let lines = description.split('\n'); + + for (const desc of lintResults.desc) { + // grab error message + let message = desc.ruleDescription; + // add line number context for longer entries + if (desc.lineNumber > 1) { + // computer counts from zero, humans count from 1 + const charsByError = lines[desc.lineNumber - 1].substring(0, 20); + message = `${message} (near: ${charsByError} ...)`; + } + + ctx.report({ + message: message, + location: ctx.location.child('description'), + }); + } + } + } catch (error) { + console.log(error); + } +} + +export default function ValidateMarkdown() { + console.log('OpenAPI Markdown: validate'); + return { + Info: { + enter({ description }, ctx) { + if (description) { + return checkString(description, ctx); + } + }, + }, + Tag: { + enter({ description }, ctx) { + if (description) { + return checkString(description, ctx); + } + }, + }, + Operation: { + enter({ description }, ctx) { + if (description) { + return checkString(description, ctx); + } + }, + }, + Parameter: { + enter({ description }, ctx) { + if (description) { + return checkString(description, ctx); + } + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugins/sorting/README.md b/@skills/redocly-cli/cookbook/custom-plugins/sorting/README.md new file mode 100644 index 000000000..1e39a44cf --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugins/sorting/README.md @@ -0,0 +1,129 @@ +# A suite of sorting decorators + +Authors: + +- [`@lornajane`](https://github.com/lornajane), Lorna Mitchell (Redocly) + +## What this does and why + +There are lots of reasons that you'd want to alter the order of the items in your API description, such as putting required fields first, or just ordering things alphabetically (or logically!) to make things consistent and easier to find. +When Redocly only made API documentation tools, the sorting changes were made as part of the docs build. +But now we make more complex tools, and many API pipelines have more than just docs in them too - so these operations are more commonly done with a decorator to transform the API description; then it can be used with any tools. + +Redocly CLI has a [`tags-alphabetical`](https://redocly.com/docs/cli/rules/tags-alphabetical) rule to error if the `tags` section isn't in alphabetical order by `name`. +This plugin adds some additional _rules_ for checking sort orders. + +- `method-sort` rule to put your methods in the desired order. The default is `["post", "patch", "put", "get", "delete"]`, but you can supply your own with an `order` parameter. +- `property-sort` rule to sort properties either alphabetically with `type: alpha` (the default sort order for this rule) or with `type: required` to put the required properties first. + +The plugin also includes _decorators_ to sort your OpenAPI descriptions, perhaps to allow an existing OpenAPI description to be easily updated to meet the expectations of the sorting rules. +Here's a full list of the sorting features: + +- `methods`: sorts methods consistently in the order you supply (or `GET`, `POST`, `PATCH`, `PUT` and `DELETE` by default), with any unsorted methods appended afterwards +- `enums-alphabetical`: sorts the options for an enum field alphabetically +- `properties-alphabetical`: sorts object properties in schemas alphabetically +- `properties-required-first`: puts the required properties at the top of the list (run this _after_ any other property sorting decorators) +- `tags-alphabetical`: sorts tags alphabetically + +## Code + +Here's the main plugin entrypoint, it's in `sorting.js`: + +```javascript +import SortTagsAlphabetically from './sort-tags.js'; +import SortEnumsAlphabetically from './sort-enums.js'; +import SortMethods from './sort-methods.js'; +import SortPropertiesAlphabetically from './sort-props-alpha.js'; +import SortPropertiesRequiredFirst from './sort-props-required.js'; +import RuleSortMethods from './rule-sort-methods.js'; +import RuleSortProps from './rule-sort-props.js'; + +export default function Sorting() { + return { + id: 'sorting', + rules: { + oas3: { + 'method-sort': RuleSortMethods, + 'property-sort': RuleSortProps, + }, + }, + decorators: { + oas3: { + 'tags-alphabetical': SortTagsAlphabetically, + 'enums-alphabetical': SortEnumsAlphabetically, + methods: SortMethods, + 'properties-alphabetical': SortPropertiesAlphabetically, + 'properties-required-first': SortPropertiesRequiredFirst, + }, + }, + }; +} +``` + +Each of the available rules/decorators is in its own file, rather than copying them here, you can view them in the same directory as this `README`: + +- [rule-sort-methods.js](./rule-sort-methods.js) +- [rule-sort-props.js](./rule-sort-props.js) +- [sort-tags.js](./sort-tags.js) +- [sort-enums.js](./sort-enums.js) +- [sort-methods.js](./sort-methods.js) +- [sort-props-alpha.js](./sort-props-alpha.js) +- [sort-props-required.js](./sort-props-required.js) + +You can copy or adapt the plugins here to meet your own needs, changing the sorting algorithms or sorting different fields. +One thing to look out for is that if you need to re-order the properties of an object, then you should visit the parent of the object, and assign the new object to the key that should be updated. + +## Examples + +Add the plugin to `redocly.yaml` and enable the decorators and/or rules: + +```yaml +plugins: + - sorting.js + +decorators: + sorting/methods: + order: [delete, get] + sorting/tags-alphabetical: on + sorting/enums-alphabetical: on + sorting/properties-alphabetical: on + sorting/properties-required-first: on + +rules: + sorting/method-sort: + severity: error + order: [get, post, delete] + sorting/property-sort: + severity: warn + type: required # default is alpha +``` + +### Lint with rules + +Run the [lint command](https://redocly.com/docs/cli/commands/lint) and the rules are used during linting. +Your command will look something like the following example: + +```bash +redocly lint openapi.yaml +``` + +If your OpenAPI doesn't fulfil the criteria in the configured rules, the details of the warnings/errors are shown in the output. + +Adjust the rule configuration or severity levels to meet your needs, and let us know if there's some other rules you'd like to see included. + +### Bundle with decorators + +Run the [bundle command](https://redocly.com/docs/cli/commands/bundle) and the decorators are applied during bundling. +Your command will look something like the following example: + +```bash +redocly bundle openapi.yaml -o updated-openapi.yaml +``` + +Use your favorite "diff" tool to look at the changes made between your existing API description and the updated version. + +Remove or turn off any of the decorators that don't fit your use case, and let us know if there are any other sorting features you need by opening an issue on this repository. + +## References + +- [`tags-alphabetical` rule](https://redocly.com/docs/cli/rules/tags-alphabetical) diff --git a/@skills/redocly-cli/cookbook/custom-plugins/sorting/redocly.yaml b/@skills/redocly-cli/cookbook/custom-plugins/sorting/redocly.yaml new file mode 100644 index 000000000..25e271302 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugins/sorting/redocly.yaml @@ -0,0 +1,18 @@ +plugins: + - sorting.js + +rules: + sorting/method-sort: + severity: error + order: [get, post, delete] + sorting/property-sort: + severity: warn + type: required + +decorators: + sorting/properties-alphabetical: on + sorting/tags-alphabetical: on + sorting/methods: + order: [get, post, delete] + sorting/enums-alphabetical: on + sorting/properties-required-first: on diff --git a/@skills/redocly-cli/cookbook/custom-plugins/sorting/rule-sort-methods.js b/@skills/redocly-cli/cookbook/custom-plugins/sorting/rule-sort-methods.js new file mode 100644 index 000000000..1a1b43bf3 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugins/sorting/rule-sort-methods.js @@ -0,0 +1,31 @@ +export default function RuleSortMethods({ order }) { + console.log('check method order'); + return { + PathItem: { + enter(pathItem, ctx) { + // default method sort order, can be changed with an "order" param in config + let methodOrder = ['post', 'patch', 'put', 'get', 'delete']; + if (order) { + methodOrder = order; + } + + // Identify the methods that are present and put them in order + const methods = Object.getOwnPropertyNames(pathItem).filter((method) => + methodOrder.includes(method) + ); + const expectedOrder = methodOrder.filter((item) => methods.includes(item)); + + let i = 0; + while (i < expectedOrder.length) { + // each method present must be in the expected order + if (methods[i] !== expectedOrder[i]) { + ctx.report({ + message: `Unexpected method order, expected ${expectedOrder[i]} but found ${methods[i]}`, + }); + } + i++; + } + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugins/sorting/rule-sort-props.js b/@skills/redocly-cli/cookbook/custom-plugins/sorting/rule-sort-props.js new file mode 100644 index 000000000..eed3d2c38 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugins/sorting/rule-sort-props.js @@ -0,0 +1,68 @@ +export default function RuleSortProps({ type }) { + let sortType = 'alpha'; // default + const supportedSortTypes = ['alpha', 'required']; + if (type && supportedSortTypes.includes(type)) { + sortType = type; + } + console.log(`check properties order (${sortType})`); + return { + Schema: { + enter(schema, ctx) { + if (schema.type == 'object' && schema.properties) { + const propList = Object.getOwnPropertyNames(schema.properties); + + if (sortType == 'required') { + // exit early if there are no required properties + let requiredList = []; + if (!schema.required) { + return; + } else { + requiredList = schema.required; + } + + const notRequiredList = propList.filter((item) => !requiredList.includes(item)); + // if the notRequiredList is empty, everything was required, we can exit + if (notRequiredList.length == 0) { + return; + } + + // loop through, if we find an optional field before a required one then report + let required = true; + let prevProp = ''; + let prevReq = true; + propList.forEach((prop) => { + const isReq = requiredList.includes(prop); + // did we go from an optional field to a required one? + if (isReq && !prevReq) { + ctx.report({ + message: `Unexpected property order, found required \`${prop}\` after optional \`${prevProp}\``, + }); + } + + // need these to refer to on the next iteration + prevReq = isReq; + prevProp = prop; + }); + } else { + // alpha sort is default + const sortedList = [...propList].sort(); + + // use a loop so we can show exactly where the order failed for large objects + let i = 0; + + while (i < propList.length) { + if (sortedList[i] !== propList[i]) { + ctx.report({ + message: `Unexpected property order, found \`${propList[i]}\` but expected \`${sortedList[i]}\``, + }); + return; // if one property is out of order, there might be many others, return to avoid noise + } + + i++; + } + } + } + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-enums.js b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-enums.js new file mode 100644 index 000000000..4dd2bcb63 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-enums.js @@ -0,0 +1,12 @@ +export default function SortEnumsAlphabetically() { + console.log('re-ordering enums: alphabetical'); + return { + Schema: { + leave(target) { + if (target.enum) { + target.enum.sort(); + } + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-methods.js b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-methods.js new file mode 100644 index 000000000..aeb0bbc43 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-methods.js @@ -0,0 +1,37 @@ +export default function SortMethods({ order }) { + console.log('re-ordering methods'); + return { + PathItem: { + leave(pathItem) { + // start with the default ordering, override with config if we have it + let methodList = ['get', 'post', 'patch', 'put', 'delete']; + if (order) { + methodList = order; + } + + let existingMethods = Object.getOwnPropertyNames(pathItem); + + for (const method of methodList) { + const operation = pathItem[method]; + // For each defined operation, delete it and re-add it to the path so they will be in the correct order: + if (operation) { + // remove it from the methods list so we know we processed it + existingMethods = existingMethods.filter((x) => x != method); + delete pathItem[method]; + pathItem[method] = operation; + } + } + + // now re-add any methods that weren't in the list + for (const method of existingMethods) { + const operation = pathItem[method]; + // Delete and re-add unprocessed operations to the path so they will be in the correct order: + if (operation) { + delete pathItem[method]; + pathItem[method] = operation; + } + } + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-props-alpha.js b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-props-alpha.js new file mode 100644 index 000000000..c81022df2 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-props-alpha.js @@ -0,0 +1,19 @@ +export default function SortPropertiesAlphabetically() { + console.log('re-ordering properties: alphabetical'); + return { + Schema: { + leave(schema) { + if (schema.type == 'object' && schema.properties) { + const propList = Object.getOwnPropertyNames(schema.properties).sort(); + let newProps = {}; + + propList.forEach((prop) => { + newProps[prop] = schema.properties[prop]; + }); + + schema.properties = newProps; + } + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-props-required.js b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-props-required.js new file mode 100644 index 000000000..b0a47f3f3 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-props-required.js @@ -0,0 +1,31 @@ +export default function SortPropertiesRequiredFirst() { + console.log('re-ordering properties: required first'); + return { + Schema: { + leave(schema) { + if (schema.type == 'object' && schema.properties) { + const propList = Object.getOwnPropertyNames(schema.properties); + let newProps = {}; + + if (schema.required && schema.required.length > 0) { + const requiredList = schema.required; + // put the required items in first + requiredList.forEach((prop) => { + if (Object.hasOwn(schema.properties, prop)) { + newProps[prop] = schema.properties[prop]; + } + }); + + // now add anything that wasn't already added + propList.forEach((prop) => { + if (!Object.hasOwn(newProps, prop)) { + newProps[prop] = schema.properties[prop]; + } + }); + schema.properties = newProps; + } + } + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-tags.js b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-tags.js new file mode 100644 index 000000000..5cf17e3f4 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sort-tags.js @@ -0,0 +1,18 @@ +export default function SortTagsAlphabetically() { + console.log('re-ordering tags: alphabetical'); + return { + TagList: { + leave(target) { + target.sort((a, b) => { + if (a.name < b.name) { + return -1; + } + if (a.name > b.name) { + return 1; + } + return 0; + }); + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/custom-plugins/sorting/sorting.js b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sorting.js new file mode 100644 index 000000000..c258ad0d3 --- /dev/null +++ b/@skills/redocly-cli/cookbook/custom-plugins/sorting/sorting.js @@ -0,0 +1,28 @@ +import RuleSortMethods from './rule-sort-methods.js'; +import RuleSortProps from './rule-sort-props.js'; +import SortEnumsAlphabetically from './sort-enums.js'; +import SortMethods from './sort-methods.js'; +import SortPropertiesAlphabetically from './sort-props-alpha.js'; +import SortPropertiesRequiredFirst from './sort-props-required.js'; +import SortTagsAlphabetically from './sort-tags.js'; + +export default function Sorting() { + return { + id: 'sorting', + rules: { + oas3: { + 'method-sort': RuleSortMethods, + 'property-sort': RuleSortProps, + }, + }, + decorators: { + oas3: { + 'tags-alphabetical': SortTagsAlphabetically, + 'enums-alphabetical': SortEnumsAlphabetically, + methods: SortMethods, + 'properties-alphabetical': SortPropertiesAlphabetically, + 'properties-required-first': SortPropertiesRequiredFirst, + }, + }, + }; +} diff --git a/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/README.md b/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/README.md new file mode 100644 index 000000000..30f1c24fe --- /dev/null +++ b/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/README.md @@ -0,0 +1,126 @@ +# Reorder description properties + +Authors: + +- [`@tatomyr`](https://github.com/tatomyr) Andrew Tatomyr (Redocly) + +## What this does and why + +Sometimes you might want to enforce a specific order of properties in your OpenAPI descriptions. Especially it could be useful after bundling the description, as the order of properties might change. + +## Code + +For that purpose, you can write a simple `JavaScript` script code similar to the one below: + +```javascript +/* reorder.js */ + +// Import the necessary modules +import fs from 'fs'; +import { parseYaml, stringifyYaml } from '@redocly/openapi-core'; + +// Define the function to reorder the properties +const reorder = (root) => { + const { components, openapi, ...rest } = root; + return { + // Here you can put the properties in the order you want + components, + ...rest, + openapi, + }; +}; + +// Get the file name from the command line arguments +const fileName = process.argv[2]; + +// Read the file content, reorder and print the output +const content = fs.readFileSync(fileName, 'utf8'); +const reordered = reorder(parseYaml(content)); +process.stdout.write(stringifyYaml(reordered)); +``` + +Please notice that `@redocly/openapi-core` has to be installed as a project dependency as it exposes the `parseYaml` and `stringifyYaml` functions. + +You can tweak the properties you need to put in the desired order in the `reorder` function. + +Then you can bundle the file with Redocly CLI (or just use any OpenAPI file) and then reorder the properties with the following command: + +```bash +node reorder.js +``` + +## Examples + +Given an OpenAPI description: + +```yaml +openapi: 3.1.0 +paths: + /menu: + get: + responses: + '200': + content: + application/json: + schema: + $ref: schema.yaml +``` + +which references a schema in a separate file `schema.yaml`: + +```yaml +type: object +properties: + name: + type: string + price: + type: integer +``` + +bundling with `redocly bundle openapi.yaml -o bundled.yaml` will produce the following `bundled.yaml`: + +```yaml +openapi: 3.1.0 +paths: + /menu: + get: + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/schema' +components: + schemas: + schema: + type: object + properties: + name: + type: string + price: + type: integer +``` + +But if we want to reorder the properties in the `bundled.yaml` file, we can run `node reorder.js bundled.yaml` which will result in the following output: + +```yaml +components: + schemas: + schema: + type: object + properties: + name: + type: string + price: + type: integer +paths: + /menu: + get: + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/schema' +openapi: 3.1.0 +``` diff --git a/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/bundled.yaml b/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/bundled.yaml new file mode 100644 index 000000000..9f77734c3 --- /dev/null +++ b/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/bundled.yaml @@ -0,0 +1,19 @@ +openapi: 3.1.0 +paths: + /menu: + get: + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/schema' +components: + schemas: + schema: + type: object + properties: + name: + type: string + price: + type: integer diff --git a/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/openapi.yaml b/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/openapi.yaml new file mode 100644 index 000000000..3254159bb --- /dev/null +++ b/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/openapi.yaml @@ -0,0 +1,10 @@ +openapi: 3.1.0 +paths: + /menu: + get: + responses: + '200': + content: + application/json: + schema: + $ref: schema.yaml diff --git a/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/reorder.js b/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/reorder.js new file mode 100644 index 000000000..7c8e952a1 --- /dev/null +++ b/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/reorder.js @@ -0,0 +1,17 @@ +import { parseYaml, stringifyYaml } from '@redocly/openapi-core'; +import fs from 'fs'; + +const reorder = (root) => { + const { components, openapi, ...rest } = root; + return { + // Here you can put the properties in the order you want + components, + ...rest, + openapi, + }; +}; + +const fileName = process.argv[2]; +const content = fs.readFileSync(fileName, 'utf8'); +const reordered = reorder(parseYaml(content)); +process.stdout.write(stringifyYaml(reordered)); diff --git a/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/schema.yaml b/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/schema.yaml new file mode 100644 index 000000000..588ba6bfa --- /dev/null +++ b/@skills/redocly-cli/cookbook/miscellaneous/reorder-bundled-description-properties/schema.yaml @@ -0,0 +1,6 @@ +type: object +properties: + name: + type: string + price: + type: integer diff --git a/@skills/redocly-cli/cookbook/rulesets/common-mistakes/README.md b/@skills/redocly-cli/cookbook/rulesets/common-mistakes/README.md new file mode 100644 index 000000000..feab97d05 --- /dev/null +++ b/@skills/redocly-cli/cookbook/rulesets/common-mistakes/README.md @@ -0,0 +1,38 @@ +# Spot common mistakes + +Authors: + +- `@CidTori` + +## What this does and why + +This ruleset combines unopinionated rules to identify common mistakes and avoid oversights. The ruleset works well in combination with the [spec-compliant ruleset](../spec-compliant/). + +## Code + +You can use it in your `redocly.yaml` with [`extends`](https://redocly.com/docs/cli/configuration/extends/), or you can copy its content directly: + +```yaml +rules: + no-server-example.com: warn + no-server-trailing-slash: warn + no-ambiguous-paths: warn + no-path-trailing-slash: warn + operation-operationId: warn + no-enum-type-mismatch: warn + no-unused-components: warn +``` + +## References + +Here is why each rule is included: + +- `no-server-example.com`: most likely a copy-paste error from some example in a documentation +- `no-server-trailing-slash`: prevents double slash between the server and the endpoint path, no downside +- `no-ambiguous-paths`: ambiguous paths may be hard to see without a linter, and preventing them is a good practice +- `no-path-trailing-slash`: avoid confusion, no downside +- `operation-operationId`: as the rule itself says: "This rule is unopinionated." +- `no-enum-type-mismatch`: as the rule itself says: "Lack of compliance is most likely the result of a typo." +- `no-unused-components`: unused components are hard to spot without a linter, and most of the time you just want to remove them + +Please, feel free to open issues or pull requests to suggest updates or additions to this ruleset. diff --git a/@skills/redocly-cli/cookbook/rulesets/common-mistakes/redocly.yaml b/@skills/redocly-cli/cookbook/rulesets/common-mistakes/redocly.yaml new file mode 100644 index 000000000..1381f7677 --- /dev/null +++ b/@skills/redocly-cli/cookbook/rulesets/common-mistakes/redocly.yaml @@ -0,0 +1,11 @@ +extends: + - https://raw.githubusercontent.com/Redocly/redocly-cli/main/cookbook/rulesets/spec-compliant/redocly.yaml + +rules: + no-server-example.com: warn + no-server-trailing-slash: warn + no-ambiguous-paths: warn + no-path-trailing-slash: warn + operation-operationId: warn + no-enum-type-mismatch: warn + no-unused-components: warn diff --git a/@skills/redocly-cli/cookbook/rulesets/security/README.md b/@skills/redocly-cli/cookbook/rulesets/security/README.md new file mode 100644 index 000000000..1f34c77c9 --- /dev/null +++ b/@skills/redocly-cli/cookbook/rulesets/security/README.md @@ -0,0 +1,195 @@ +# Security ruleset, a collection of security-conscious rules + +Authors: + +- [`@lornajane`](https://github.com/lornajane) Lorna Mitchell (Redocly) + +## What this does and why + +A ruleset to pick up on some common API mistakes using linting. +A security mindset means more than a few linting rules - but we hope that they help! + +Included in this set are a few defensive data type rules, plus a few others from the OWASP recommendations: + +- `rule/no-http-basic` - Don't use HTTP Basic auth +- `rule/operation-security` - Security must be defined at the operation level +- `rule/https-server-urls` - Server URLs must use https +- `rule/limit-string-length` - Avoid overflow errors by setting a maximum length for string values +- `rule/limit-array-length` - Avoid overflow errors by setting a maximum number of array items + +What else should be here? Open an issue - or a pull request. + +## Code + +The following code snippet shows the rules to use: + +```yaml +rules: + rule/no-http-basic: + message: HTTP Basic should not be used. + subject: + type: SecurityScheme + property: scheme + assertions: + notPattern: /basic/i + severity: error + + rule/operation-security: + message: Security must be defined at the operation level. + subject: + type: Operation + property: security + assertions: + defined: true + severity: warn + + rule/https-server-urls: + message: Server URLs must start with "https:". + subject: + type: Server + property: url + assertions: + pattern: /^https:/ + severity: error + + rule/limit-string-length: + message: Strings must have maxLength defined, or be an enum/const + subject: + type: Schema + assertions: + requireAny: + - maxLength + - enum + - const + where: + - subject: + type: Schema + property: type + assertions: + const: string + defined: true + severity: warn + + rule/limit-array-length: + message: Arrays must have a maxItems property + subject: + type: Schema + assertions: + required: + - maxItems + where: + - subject: + type: Schema + property: type + assertions: + const: array + defined: true + severity: warn +``` + +You can copy and paste this configuration into your own `redocly.yaml` file, and adjust the `severity` settings to suit your use case. + +Then run `redocly lint` to apply the linting rules to your API description. + +## Examples + +Each rule has its own example. Run `redocly lint openapi.yaml` to lint your API description. + +## HTTP Basic should not be used + +This rule picks up where a security scheme uses a scheme of "Basic" (or "basic"). +Avoid using an example like the following: + +```yaml +components: + securitySchemes: + LegacyAuth: + type: http + scheme: basic +``` + +It is recommended to use a scheme such as bearer or digest in your APIs. + +## Security must be defined at the operation level + +OpenAPI allows security to be defined at the top level of the document, but this rule adds a check that every endpoint has a security definition. +By intentionally securing each endpoint with an appropriate configuration, security mistakes are less likely to occur. + +Each operation should look like the example below: + +```yaml +operationId: getRevenue +summary: Get revenue statistics +security: + - ApiKey: [] +description: Retrieve revenue statistics for a configurable date range. +``` + +This approach also makes it easier to use tighter security for endpoints with side effects. + +## Server URLs must start with "https:" + +It is good practice to use HTTPS endpoints to protect any credentials or important information during transit. +This rule identifies any plain `http://` URLs in the server array, such as the following example: + +```yaml +servers: + - url: 'http://api.cafe.redocly.com' +``` + +Correct this problem by using `https://` URLs for all endpoints. + +## Strings must have maxLength defined, or be an enum/const + +To avoid API endpoints receiving payloads that could cause overflow errors, set limits on the size of the fields that can be accepted or define specific values that can be sent. + +All of the following field examples are acceptable: + +```yaml +components: + schemas: + OrderStatus: + description: Order status. + type: string + enum: + - placed + - preparing + - completed + - canceled + example: placed + Object: + description: Entity name. + type: string + const: order + CustomerName: + description: Name of the customer who placed the order. + type: string + maxLength: 100 + example: Mary Ann +``` + +Note that the `const` keyword came in with the updated JSON Schema version in OpenAPI 3.1. +For OpenAPI 3.0, use an `enum` field with a single option. + +## Arrays must have a maxItems property + +Similar to the previous point about setting a maximum string field size, set a realistic limit for the size of the arrays that your endpoints accept. +By setting a maximum array size to a sensible limit, you can avoid having your API endpoints try to process something so large that they cause problems. + +The following example shows an array field with a limit set: + +```yaml +OrderItems: + type: array + maxItems: 10 + items: + $ref: '#/components/schemas/OrderItem' + description: List of items to include in the order. +``` + +Pick a limit that's generous for the size of the data that you expect, but small enough that it can be handled without performance implications. + +## References + +- [OWASP top ten](https://owasp.org/Top10/) +- Published linting rulesets from [Spectral](https://blog.stoplight.io/spectral-owasp-api-2023-security-ruleset) and [Vacuum](https://quobix.com/vacuum/rules/owasp/) diff --git a/@skills/redocly-cli/cookbook/rulesets/security/redocly.yaml b/@skills/redocly-cli/cookbook/rulesets/security/redocly.yaml new file mode 100644 index 000000000..8494e8eed --- /dev/null +++ b/@skills/redocly-cli/cookbook/rulesets/security/redocly.yaml @@ -0,0 +1,61 @@ +rules: + rule/no-http-basic: + message: HTTP Basic should not be used. + subject: + type: SecurityScheme + property: scheme + assertions: + notPattern: /basic/i + severity: error + + rule/operation-security: + message: Security must be defined at the operation level. + subject: + type: Operation + property: security + assertions: + defined: true + severity: warn + + rule/https-server-urls: + message: Server URLs must start with "https:". + subject: + type: Server + property: url + assertions: + pattern: /^https:/ + severity: error + + rule/limit-string-length: + message: Strings must have maxLength defined, or be an enum/const + subject: + type: Schema + assertions: + requireAny: + - maxLength + - enum + - const + where: + - subject: + type: Schema + property: type + assertions: + const: string + defined: true + severity: warn + + rule/limit-array-length: + message: Arrays must have a maxItems property + subject: + type: Schema + assertions: + required: + - maxItems + where: + - subject: + type: Schema + property: type + assertions: + const: array + defined: true + severity: warn diff --git a/@skills/redocly-cli/cookbook/rulesets/spec-compliant/README.md b/@skills/redocly-cli/cookbook/rulesets/spec-compliant/README.md new file mode 100644 index 000000000..3674c2ff9 --- /dev/null +++ b/@skills/redocly-cli/cookbook/rulesets/spec-compliant/README.md @@ -0,0 +1,64 @@ +# spec-compliant ruleset + +Authors: + +- `@CidTori` + +## What this does and why + +This ruleset uses the current built-in rules to stick closely to the spec. + +It's an unopinionated good default. + +REQUIRED rules (in the spec) are set to `error`, RECOMMENDED rules to `warn`. + +## Code + +You can use it in your `redocly.yaml` with [`extends`](https://redocly.com/docs/cli/configuration/extends/), or you can copy its content directly: + +```yaml +rules: + struct: error + nullable-type-sibling: error + spec-strict-refs: error + no-undefined-server-variable: error + path-not-include-query: error + path-declaration-must-exist: error + no-identical-paths: error + path-parameters-defined: error + operation-operationId-url-safe: warn + operation-operationId-unique: error + operation-parameters-unique: error + operation-2xx-response: warn + no-invalid-parameter-examples: warn + no-invalid-media-type-examples: warn + no-invalid-schema-examples: warn + no-example-value-and-externalValue: error + no-unresolved-refs: error + spec-components-invalid-map-name: error +``` + +## References + +Here is why each rule is included: + +- `struct`: [ensures structural correctness](https://redocly.com/docs/cli/rules/common/struct#api-design-principles) +- `nullable-type-sibling`: [ensures compliance with the OpenAPI 3.0 spec](https://redocly.com/docs/cli/rules/oas/nullable-type-sibling) +- `spec-strict-refs`: ["strict adherence to the specifications"](https://redocly.com/docs/cli/rules/spec-strict-refs/#api-design-principles) +- `no-undefined-server-variable`: ["it's an error with the specification"](https://redocly.com/docs/cli/rules/no-undefined-server-variable/#api-design-principles) +- `path-declaration-must-exist`: ["This rule is for spec correctness"](https://redocly.com/docs/cli/rules/path-declaration-must-exist/#api-design-principles) +- `no-identical-paths`: ["Templated paths with the same hierarchy but different templated names MUST NOT exist as they are identical."](https://spec.openapis.org/oas/latest.html#patterned-fields) +- `path-not-include-query`: ["Each template expression in the path MUST correspond to a path parameter"](https://spec.openapis.org/oas/latest.html#path-templating) +- `path-parameters-defined`: ["Each template expression in the path MUST correspond to a path parameter"](https://spec.openapis.org/oas/latest.html#path-templating) +- `operation-operationId-url-safe` (debatable): ["it is RECOMMENDED to follow common programming naming conventions"](https://spec.openapis.org/oas/latest.html#fixed-fields-7) +- `operation-operationId-unique`: ["The id MUST be unique among all operations described in the API."](https://spec.openapis.org/oas/latest.html#fixed-fields-7) +- `operation-parameters-unique`: ["The list MUST NOT include duplicated parameters. A unique parameter is defined by a combination of a name and location."](https://spec.openapis.org/oas/latest.html#fixed-fields-7) +- `operation-2xx-response` (debatable): ["The Responses Object MUST contain at least one response code, and if only one response code is provided it SHOULD be the response for a successful operation call."](https://spec.openapis.org/oas/latest.html#responses-object) +- `no-invalid-parameter-examples`: ["The example SHOULD match the specified schema and encoding properties if present."](https://spec.openapis.org/oas/latest.html#fixed-fields-9) +- `no-invalid-media-type-examples`: ["The example object SHOULD be in the correct format as specified by the media type."](https://spec.openapis.org/oas/latest.html#fixed-fields-11) +- `no-invalid-schema-examples`: ["It is RECOMMENDED that these values be valid against the associated schema."](https://datatracker.ietf.org/doc/html/draft-bhutton-json-schema-validation-00#section-9.5) +- `no-example-value-and-externalValue`: ["The value field and externalValue field are mutually exclusive."](https://spec.openapis.org/oas/latest.html#fixed-fields-15) +- `no-unresolved-refs` (debatable): ["The referenced structure MUST be in the form of a Path Item Object."](https://spec.openapis.org/oas/latest.html#fixed-fields-6) +- `spec-components-invalid-map-name`: ["All the fixed fields declared above are objects that MUST use keys that match the regular expression: ^\[a-zA-Z0-9\.\-\_\]+$."](https://spec.openapis.org/oas/latest.html#fixed-fields-5) + +Please, feel free to open issues or pull requests to suggest updates or additions to this ruleset. diff --git a/@skills/redocly-cli/cookbook/rulesets/spec-compliant/redocly.yaml b/@skills/redocly-cli/cookbook/rulesets/spec-compliant/redocly.yaml new file mode 100644 index 000000000..95d07a4f8 --- /dev/null +++ b/@skills/redocly-cli/cookbook/rulesets/spec-compliant/redocly.yaml @@ -0,0 +1,19 @@ +rules: + struct: error + nullable-type-sibling: error + spec-strict-refs: error + no-undefined-server-variable: error + path-not-include-query: error + path-declaration-must-exist: error + no-identical-paths: error + path-parameters-defined: error + operation-operationId-url-safe: warn + operation-operationId-unique: error + operation-parameters-unique: error + operation-2xx-response: warn + no-invalid-parameter-examples: warn + no-invalid-media-type-examples: warn + no-invalid-schema-examples: warn + no-example-value-and-externalValue: error + no-unresolved-refs: error + spec-components-invalid-map-name: error diff --git a/@skills/redocly-cli/docs/@v1/api-docs.md b/@skills/redocly-cli/docs/@v1/api-docs.md new file mode 100644 index 000000000..979fad497 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/api-docs.md @@ -0,0 +1,38 @@ +--- +seo: + title: API docs +--- + +# API documentation + +Good quality API documentation is the most important factor for a good developer experience. Redocly offers two options for web-based API reference documentation, so you can choose what fits your needs. + +## API reference + +Use the Redocly platform to produce beautiful API documentation, and automatically update it every time your OpenAPI description changes. Change the theme to fit your brand, and make your API consumers very happy with clear documentation, code examples, and the all-important ability to try API calls from within the documentation itself. + +![Example API reference documentation from Redocly](images/redocly-api-ref.png) + +This option is ideal for teams that want **hassle-free hosting**, lots of **theme customization options**, and good CI/CD integration features straight out of the box. There's a **free trial** on all our plans, so you can take it for a spin before you commit. + +Get started with Redocly API reference: + +- [Sign up for Workflows](https://app.redocly.com/signup) and add your OpenAPI description to the registry to get started immediately. +- Check out the [documentation for using the API registry](https://redocly.com/docs/api-registry/guides/api-registry-quickstart/) to learn more. +- Use Redocly CLI for [local preview of API documentation](./commands/preview-docs.md) while you're making changes to the API description or docs configuration. +- Add the [Redocly VS Code extension](https://redocly.com/docs/redocly-openapi/) to your IDE for better OpenAPI editing support and autocomplete on Redocly configuration settings. + +## Redoc + +Redoc is open source, and yours to use however you wish. It has fewer features and theming options, but still integrates well with Redocly CLI, allowing you to preview and also build your docs to publish to a platform of your choice. + +![Example API reference from Redoc](images/redoc.png) + +Use this option if you plan to host your API reference documentation yourself, or are looking for an open source solution. + +Get started with Redoc: + +- Visit the [Redoc section of the docs](https://redocly.com/docs/redoc/quickstart/) to learn more about redoc +- Check out the project and community [on GitHub](https://github.com/redocly/redoc). +- Use Redocly CLI for [local preview of API documentation](./commands/preview-docs.md) while you're making changes to the API description or docs configuration, and to [build your API docs](./commands/build-docs.md). +- Add the [Redocly VS Code extension](https://redocly.com/docs/redocly-openapi/) to your IDE for better OpenAPI editing support and autocomplete on Redocly configuration settings. diff --git a/@skills/redocly-cli/docs/@v1/api-standards.md b/@skills/redocly-cli/docs/@v1/api-standards.md new file mode 100644 index 000000000..ab395c984 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/api-standards.md @@ -0,0 +1,39 @@ +--- +seo: + title: API standards +--- + +# API standards and governance + +In APIs, making sure that an API meets certain standard behaviors, and continues to meet them even as it evolves, is really important. Most API providers use tooling to ensure that their APIs have all the features they expect of them - and that their users expect too. + +This can be simple API consistency, such as whether resource names should use `kebab-case` or `camelCase` in URLs, or whether any error described contains the expected fields. It can be user-centric, making sure that the documentation is thorough and includes descriptions for all endpoints, or example values for all parameters. For some organizations, security is vital and API governance and linting tools can check that every endpoint has security rules designed for it. + +## Ensure compliance with API linting + +Redocly offers linting to make sure that an OpenAPI description matches the expected standards. It's available in the Redocly CLI tool and in our hosted platform. Both tools share a common configuration so you can use the same setup for both environments. + +Choose between one of the existing rulesets, or compile your own. There are some built-in rules for common use cases, and configurable rules for when you need to express something specific to your use case. For advanced users, you can also create your own rules by building custom plugins with Javascript. + +Once the ruleset is created, use it with your API and Redocly in any or all of these ways: + +- every update to an API in the API registry is linted with the rules for that API +- use Redocly CLI to lint APIs as part of your continuous integration setup, such as in GitHub Actions +- during development, check the API you are working on using Redocly CLI on your local machine + +By establishing good standards and making them part of your development workflow, keeping the APIs as you would like them becomes painless good practice, even when there are many changes being worked on. + +### Get started with API standards + +- [Redocly linting rules](./rules.md) +- [Configure a simple API standard ruleset](./guides/configure-rules.md) +- [See the list of built-in rules](./rules/built-in-rules.md) + +## Enhance an existing OpenAPI description + +Sometimes, the OpenAPI description you have isn't the one you wish you had. Redocly's [decorators](./decorators.md) feature enables you to make repeatable changes to an API description, so that you can reapply the changes instantly when the API changes. This is a very good way to improve the developer experience for your API users. + +Whether you need to filter out some endpoints before publishing documentation, improve or add description fields, or add other elements to bring your API description to the standard you'd like, decorators can help. + +- [Redocly decorators](./decorators.md) +- [Custom plugins in Javascript](./custom-plugins/index.md) allow you to create your own advanced decorators. diff --git a/@skills/redocly-cli/docs/@v1/changelog.md b/@skills/redocly-cli/docs/@v1/changelog.md new file mode 100644 index 000000000..d5636bb1f --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/changelog.md @@ -0,0 +1,2238 @@ +--- +toc: + maxDepth: 2 +--- + +# Redocly CLI changelog + + + +## 1.34.17 (2026-06-30) + +### Patch Changes + +- Fixed a path traversal in the `split` command that might have written files outside the chosen `--outDir`. +- Updated @redocly/respect-core to v1.34.17. + +## 1.34.16 (2026-06-26) + +### Patch Changes + +- Updated `js-yaml` to the `4.2.0` version. +- Updated @redocly/respect-core to v1.34.16. + +## 1.34.15 (2026-05-25) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.34.15. + +## 1.34.14 (2026-04-30) + +### Patch Changes + +- Updated Handlebars to v4.7.9. +- Updated @redocly/openapi-core to v1.34.14. + +## 1.34.13 (2026-04-27) + +### Patch Changes + +- Increased the default fetch timeout used by the `push` command to better support slower uploads. +- Updated @redocly/openapi-core to v1.34.13. + +## 1.34.12 (2026-04-20) + +### Patch Changes + +- Improved the stability of the `push` command. +- Updated @redocly/openapi-core to v1.34.12. + +## 1.34.11 (2026-03-16) + +### Patch Changes + +- Updated `undici` to the `6.24.1` version to ensure improved performance, security, and compatibility. +- Updated @redocly/respect-core to v1.34.11. + +## 1.34.10 (2026-03-02) + +### Patch Changes + +- Updated `js-yaml` dependency to v4.1.1. +- Updated @redocly/openapi-core to v1.34.10. + +## 1.34.9 (2026-03-02) + +### Patch Changes + +- Updated `minimatch` dependency to v5.1.9. +- Updated @redocly/openapi-core to v1.34.9. + +## 1.34.8 (2026-02-24) + +### Patch Changes + +- Pinned runtime dependency and key tooling versions to improve v1 stability. +- Updated @redocly/respect-core to v1.34.8. + +## 1.34.7 + +### Patch Changes + +- Fixed an issue where running CLI commands would result in "ReferenceError: React is not defined" message. +- Updated @redocly/openapi-core to v1.34.7. + +## 1.34.6 + +### Patch Changes + +- Updated React dependency to avoid vulnerable React version (19.0.0) affected by CVE-2025-55182. +- Updated @redocly/openapi-core to v1.34.6. + +## 1.34.5 (2025-07-21) + +### Patch Changes + +- Updated `form-data` to 4.0.4 for Redocly CLI v1. +- Updated @redocly/respect-core to v1.34.5. + +## 1.34.4 (2025-06-27) + +### Patch Changes + +- Resolved an issue where `dotenv@16.6.0` injected an unintended message into the output. +- Updated @redocly/respect-core to v1.34.4. + +## 1.34.3 (2025-04-22) + +### Patch Changes + +- Updated Redoc to v2.5.0. +- Updated @redocly/openapi-core to v1.34.3. + +## 1.34.2 (2025-04-09) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.34.2. + +## 1.34.1 (2025-03-29) + +### Patch Changes + +- Improved OpenTelemetry data serialization. +- Updated @redocly/respect-core to v1.34.1. + +## 1.34.0 (2025-03-19) + +### Minor Changes + +- Added global execution timeout timer to `respect` command execution to prevent infinite test runs. You can configure this timer using the `RESPECT_TIMEOUT` environment variable (defaults to 1 hour). + +### Patch Changes + +- Updated @redocly/respect-core to v1.34.0. + +## 1.33.1 (2025-03-11) + +### Patch Changes + +- Fixed `generate-arazzo` command to properly handle output file paths. The `output-file` parameter must have a value when provided. +- Updated @redocly/respect-core to v1.33.1. + +## 1.33.0 (2025-03-05) + +### Minor Changes + +- Added support for generating workflows from OpenAPI operations without operationIds. The `generate-arazzo` command now automatically generates operationPaths using the URL pattern: `{$sourceDescriptions..url}#/paths//`. + +### Patch Changes + +- Updated @redocly/respect-core to v1.33.0. + +## 1.32.2 (2025-03-04) + +### Patch Changes + +- Fixed step execution to respect severity levels when handling step failures. Previously, steps would always break workflow execution on failure when onFailure is omitted, but now they properly consider the configured severity level (e.g., `warn` | `off` severity allows subsequent steps to execute). +- Updated @redocly/openapi-core to v1.32.2. + +## 1.32.1 (2025-03-03) + +### Patch Changes + +- Added support for `basic`, `bearer`, and `apiKey` security schemes in workflow generation with `generate-arazzo` command. +- Updated @redocly/openapi-core to v1.32.1. + +## 1.32.0 (2025-03-03) + +### Minor Changes + +- Added support for linting, preprocessors, decorators, and type extensions for Overlay v1 documents. + +### Patch Changes + +- Updated OAS3 Schema type definition to correct `type` keyword enum, removed `null`. +- Fixed an issue where JSON logs did not properly capture data from nested external workflows. +- Updated @redocly/openapi-core to v1.32.0. + +## 1.31.3 (2025-02-28) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.31.3. + +## 1.31.2 (2025-02-26) + +### Patch Changes + +- Fixed `sourceDescription` name generation in `generate-arazzo` command when using OpenAPI files that contain multiple periods "." in their filenames. +- Updated @redocly/respect-core to v1.31.2. + +## 1.31.1 (2025-02-25) + +### Patch Changes + +- Added the missing `respect-core` import in Redocly CLI package. +- Updated @redocly/openapi-core to v1.31.1. + +## 1.31.0 (2025-02-25) + +### Minor Changes + +- Added the `generate-arazzo` command to scaffold Arazzo description templates out of OpenAPI descriptions. +- Added the `respect` command to test APIs against Arazzo description files. + +### Patch Changes + +- Updated @redocly/openapi-core to v1.31.0. + +## 1.30.0 (2025-02-18) + +### Minor Changes + +- Added [OAuth 2.0 Device authorization flow](https://datatracker.ietf.org/doc/html/rfc8628) that enables users to authenticate through Reunite API. + +### Patch Changes + +- Updated `operation-tag-defined` built-in rule to verify tags are defined on the operation prior to matching them to a global tag. +- Updated @redocly/openapi-core to v1.30.0. + +## 1.29.0 (2025-02-14) + +### Minor Changes + +- Added typings and interfaces for Overlay Specification v1.0.0. + +### Patch Changes + +- Fixed a problem where the `split` command produced backslashes instead of forward slashes in `$ref`s on Windows. +- Fixed an issue where the `no-invalid-media-type-examples` rule crashed instead of reporting an error when it failed to resolve an example from a $ref. +- Updated @redocly/openapi-core to v1.29.0. + +## 1.28.5 (2025-02-07) + +### Patch Changes + +- Fixed an issue where the `build-docs` command produced incorrect output. +- Updated @redocly/openapi-core to v1.28.5. + +## 1.28.4 (2025-02-07) + +### Patch Changes + +- Fixed an issue where the `build-docs` command failed when React 19 was installed in the project folder. +- Updated @redocly/openapi-core to v1.28.4. + +## 1.28.3 (2025-02-06) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.28.3. + +## 1.28.2 (2025-02-04) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.28.2. + +## 1.28.1 (2025-01-31) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.28.1. + +## 1.28.0 (2025-01-30) + +### Minor Changes + +- Switched to using native `fetch` API instead of `node-fetch` dependency, improving performance and reducing bundle size. + +### Patch Changes + +- Updated @redocly/openapi-core to v1.28.0. + +## 1.27.2 (2025-01-14) + +### Patch Changes + +- Updated the `sideNavStyle` configuration schema to include the `path-only` option. +- Updated @redocly/openapi-core to v1.27.2. + +## 1.27.1 (2025-01-07) + +### Patch Changes + +- Fixed an issue where running the `preview` command failed because one of its dependencies could not be resolved. + The issue occurred when Realm was not installed in the `node_modules` of the project. +- Updated @redocly/openapi-core to v1.27.1. + +## 1.27.0 (2025-01-03) + +### Minor Changes + +- Added the ability to override default problem messages for built-in rules. + +### Patch Changes + +- Fixed an issue where `apis`' root in `redocly.yaml` was not resolved properly when the value of `root` was a URL. +- Updated the Redocly CLI command `redocly build-docs` to use `stdout` instead of `stderr` for simple logs. +- Updated @redocly/openapi-core to v1.27.0. + +## 1.26.1 (2024-12-18) + +### Patch Changes + +- Fixed an issue where an API alias's root path might be resolved incorrectly for configuration files located outside the root folder. +- Updated @redocly/openapi-core to v1.26.1. + +## 1.26.0 (2024-12-09) + +### Minor Changes + +- Introduced the `struct` rule and deprecated the `spec` rule. + Added the `spec` ruleset, which enforces compliance with the specifications. + +### Patch Changes + +- Fixed an issue where the CLI would fail to run on Windows due to a breaking change in the Node.js API. +- Fixed an issue where `join` would throw an error when a glob pattern was provided. +- Updated `sourceDescriptions` to enforce a valid type field, ensuring compliance with the Arazzo specification. +- Updated @redocly/openapi-core to v1.26.0. + +## 1.25.15 (2024-11-29) + +### Patch Changes + +- Clarified usage of the `--output` option in the `bundle` command. +- Updated @redocly/openapi-core to v1.25.15. + +## 1.25.14 (2024-11-25) + +### Patch Changes + +- Resolved an issue where overrides for the severity of configurable rules were ignored. +- Updated @redocly/openapi-core to v1.25.14. + +## 1.25.13 (2024-11-21) + +### Patch Changes + +- Added the possibility to skip configurable rules using the `--skip-rule` option. +- Updated @redocly/openapi-core to v1.25.13. + +## 1.25.12 (2024-11-20) + +### Patch Changes + +- Fixed an issue where valid Redocly tokens were not recognized. +- Updated @redocly/openapi-core to v1.25.12. + +## 1.25.11 (2024-11-04) + +### Patch Changes + +- Fixed an issue with the `remove-x-internal` decorator where bundling API descriptions containing discriminators could fail when using **Node.js** v17 or earlier. +- Fixed API descriptions bundling. Previously, schemas containing nulls in examples were causing failures. +- Updated @redocly/openapi-core to v1.25.11. + +## 1.25.10 (2024-10-30) + +### Patch Changes + +- Fixed `component-name-unique` problems to include correct location. +- Fixed the `remove-x-internal` decorator, which was not removing the reference in the corresponding discriminator mapping while removing the original `$ref`. +- Updated @redocly/openapi-core to v1.25.10. + +## 1.25.9 (2024-10-25) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.25.9. + +## 1.25.8 (2024-10-21) + +### Patch Changes + +- Added the `REDOCLY_SUPPRESS_UPDATE_NOTICE` environment variable so that users can skip version updates. +- Fixed bundling with the `--dereferenced` option. Previously, references to external files were not substituted with references to components, causing them to become invalid. +- Fixed an issue where using `externalValue` as a property name was causing the API description validation process to fail. +- Updated @redocly/openapi-core to v1.25.8. + +## 1.25.7 (2024-10-16) + +### Patch Changes + +- Updated redoc to v2.2.0. +- Removed the support of the `x-inherit` extension for Arazzo description files. +- Updated @redocly/openapi-core to v1.25.7. + +## 1.25.6 (2024-10-14) + +### Patch Changes + +- Changed the `x-operation` extension in Arazzo, enabling users to make requests with this extension without an API description file. +- Removed the support of the `x-parameters` extension for Arazzo description files. +- Updated @redocly/openapi-core to v1.25.6. + +## 1.25.5 (2024-10-04) + +### Patch Changes + +- Fixed an issue where the bundle command did not resolve links in `externalValue`. +- Fixed an issue where the plugins in external NPM packages could not be resolved if the CLI package was installed globally. +- Updated @redocly/openapi-core to v1.25.5. + +## 1.25.4 (2024-09-30) + +### Patch Changes + +- Added a warning message to the `push` and `push-status` commands to notify users about upcoming or ongoing resource deprecation. +- Updated @redocly/openapi-core to v1.25.4. + +## 1.25.3 (2024-09-18) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.25.3. + +## 1.25.2 (2024-09-13) + +### Patch Changes + +- Fixed `camelCase` assertion for single-letter values. +- Updated @redocly/openapi-core to v1.25.2. + +## 1.25.1 (2024-09-13) + +### Patch Changes + +- Added additional checks to `criteria-unique` Arazzo rule. +- Updated @redocly/openapi-core to v1.25.1. + +## 1.25.0 (2024-09-11) + +### Minor Changes + +- Added a cache for resolved plugins to ensure that plugins are only instantiated once during a single execution. + +### Patch Changes + +- Updated @redocly/openapi-core to v1.25.0. + +## 1.24.0 (2024-09-09) + +### Minor Changes + +- Added Respect and Arazzo rules: `no-criteria-xpath`, `no-actions-type-end`, `criteria-unique`. + +### Patch Changes + +- Fixed an issue where custom rules were not applied to Arazzo descriptions. +- Updated @redocly/openapi-core to v1.24.0. + +## 1.23.1 (2024-09-06) + +### Patch Changes + +- Fixed a bug where bundling multiple API description files specified as CLI arguments, along with the `--output` option, stored the result in a single file instead of a folder. +- Updated @redocly/openapi-core to v1.23.1. + +## 1.23.0 (2024-09-06) + +### Minor Changes + +- Added support for the `output` option in the per-API configuration so that the destination file can be specified in configuration. + +### Patch Changes + +- Fixed the absolute path for importing plugins in Windows. +- Added the ability to run the `eject` command without specifying components, which displays a selectable list of all available components. +- Updated @redocly/openapi-core to v1.23.0. + +## 1.22.1 (2024-08-30) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.22.1. + +## 1.22.0 (2024-08-29) + +### Minor Changes + +- Updated the Arazzo validation types for workflows input, parameter objects, and criteria to match the specification. +- Added Arazzo rulesets so that users can customize their linting rules for this format. + +### Patch Changes + +- Updated @redocly/openapi-core to v1.22.0. + +## 1.21.1 (2024-08-27) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.21.1. + +## 1.21.0 (2024-08-23) + +### Minor Changes + +- Added the `eject` and `translate` commands for use with the new Reunite-hosted product family. + +### Patch Changes + +- Updated @redocly/openapi-core to v1.21.0. + +## 1.20.1 (2024-08-22) + +### Patch Changes + +- Get more helpful error messages when there's a problem importing a plugin. +- Updated @redocly/openapi-core to v1.20.1. + +## 1.20.0 (2024-08-21) + +### Minor Changes + +- Added support for ESM plugins and importing of plugins directly from npm package: `@vendor/package/plugin.js` instead of `./node_modules/@vendor/package/plugin.js`. +- Added `info-license-strict` rule as a replacement of the `info-license-url` to support the OpenAPI 3.1 changes to allow identifier or URL license details. +- Changed plugins format to export a function instead of an object for compatibility with other Redocly products. The backwards compatibility with an old format of plugins is maintained. + +### Patch Changes + +- Added support for webhooks in stats and fixed a crash that occurred when tags were not included in webhooks. +- Updated @redocly/openapi-core to v1.20.0. + +## 1.19.0 (2024-08-01) + +### Minor Changes + +- Added support for AsyncAPI 3.0 description linting. + +### Patch Changes + +- Fixed an issue where `patternProperties` incorrectly caused linting errors due to a missing `PatternProperties` node. +- Updated @redocly/openapi-core to v1.19.0. + +## 1.18.1 (2024-07-22) + +### Patch Changes + +- Allowed the `theme.openapi` configuration option to accept settings specific to Redoc 2.x and earlier. +- Fixed an issue in the OpenAPI `spec` rule where `dependentSchemas` was parsed as an array. + It is now correctly parsed as a map. +- Fixed bundling of `$refs` inside `patternProperties`. +- Updated AsyncAPI v2 typings to abide by JSON Schema draft-07 specification. +- Updated @redocly/openapi-core to v1.18.1. + +## 1.18.0 (2024-07-12) + +### Minor Changes + +- Added support for Arazzo description linting. + +### Patch Changes + +- Removed `additionalItems` from OAS 3.0.x typings. This keyword is not supported by the specification. +- Updated @redocly/openapi-core to v1.18.0. + +## 1.17.1 (2024-07-03) + +### Patch Changes + +- Added JSON Schema draft 2019-09+ validation keyword - `dependentRequired`. +- Updated @redocly/openapi-core to v1.17.1. + +## 1.17.0 (2024-07-01) + +### Minor Changes + +- Changed resolution process to include extendedTypes and plugins before linting. + +### Patch Changes + +- Added support for the `contentSchema` keyword to parse as a schema instance. +- Replace path items emoji with 🔀 so the width is consistent. +- Updated @redocly/openapi-core to v1.17.0. + +## 1.16.0 (2024-06-18) + +### Minor Changes + +- Users can run the CLI tool behind a proxy by using `HTTP_PROXY` or `HTTPS_PROXY` environment variables to configure the proxy settings. + +### Patch Changes + +- Updated @redocly/openapi-core to v1.16.0. + +## 1.15.0 (2024-06-11) + +### Minor Changes + +- Made `redocly.yaml` validation consistent with the general Redocly config. + +### Patch Changes + +- Updated Redoc to v2.1.5. +- Fixed `no-invalid-media-type-examples`, `no-invalid-parameter-examples`, and `no-invalid-schema-examples` rules which allowed falsy example values to pass for any schema. +- Updated @redocly/openapi-core to v1.15.0. + +## 1.14.0 (2024-05-29) + +### Minor Changes + +- Added the ability to exclude some operations or entire paths from the `security-defined` rule. + +### Patch Changes + +- Improved error messages. +- Updated @redocly/openapi-core to v1.14.0. + +## 1.13.0 (2024-05-23) + +### Minor Changes + +- Added support for the linting command to output markdown format. + +### Patch Changes + +- Updated @redocly/openapi-core to v1.13.0. + +## 1.12.2 (2024-05-09) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.12.2. + +## 1.12.1 (2024-05-09) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.12.1. + +## 1.12.0 (2024-04-25) + +### Minor Changes + +- Added return values for the `push` and `push-status` commands. + +### Patch Changes + +- Fixed handling of wildcards on Windows ([#1521](https://github.com/Redocly/redocly-cli/issues/1521)). +- Updated @redocly/openapi-core to v1.12.0. + +## 1.11.0 (2024-04-04) + +### Minor Changes + +- Removed additional operations from the `join` command; use `lint` and/or `bundle` for operations such as `lint` and `decorate`. +- Removed lint support from the bundle command to support a wider range of use cases. Users should update to [run lint and bundle separately](https://redocly.com/docs/cli/guides/lint-and-bundle/). +- Added support for a `github-actions` output format for the `lint` command to annotate reported problems on files when used in a GitHub Actions workflow. + +### Patch Changes + +- Fixed [`no-invalid-media-type-examples`](https://redocly.com/docs/cli/rules/no-invalid-media-type-examples/) rule `externalValue` example validation. +- Updated @redocly/openapi-core to v1.11.0. + +## 1.10.6 (2024-03-26) + +### Patch Changes + +- Added `check-config` command to validate a Redocly configuration file. +- Updated @redocly/openapi-core to v1.10.6. + +## 1.10.5 (2024-03-19) + +### Patch Changes + +- Updated license text for date and organization naming accuracy. +- Updated @redocly/openapi-core to v1.10.5. + +## 1.10.4 (2024-03-14) + +### Patch Changes + +- Fixed a problem with the `preview` command crashing on Windows by adding operating system detection for the correct `npx` executable to use. +- Updated @redocly/openapi-core to v1.10.4. + +## 1.10.3 (2024-03-04) + +### Patch Changes + +- Reverted "Users can run the CLI tool behind a proxy by using HTTP_PROXY or HTTPS_PROXY environment variables to configure the proxy settings" temporary. +- Updated @redocly/openapi-core to v1.10.3. + +## 1.10.2 (2024-03-04) + +### Patch Changes + +- Users can run the CLI tool behind a proxy by using `HTTP_PROXY` or `HTTPS_PROXY` environment variables to configure the proxy settings. +- Updated @redocly/openapi-core to v1.10.2. + +## 1.10.1 (2024-02-29) + +### Patch Changes + +- Updated @redocly/openapi-core to v1.10.1. + +## 1.10.0 (2024-02-29) + +### Minor Changes + +- Users can run the CLI tool behind a proxy by using `HTTP_PROXY` or `HTTPS_PROXY` environment variables to configure the proxy settings. + +### Patch Changes + +- Added inflection to the `join` command so that `--prefix-components-with-info-prop` replaces spaces with underscores to create less confusing $refs. +- Updated @redocly/openapi-core to v1.10.0. + +## 1.9.1 (2024-02-20) + +### Patch Changes + +- Adds support for using logical AND for the security schema so that the `join` command generates the correct schema. +- Fixed a bug with resolving $refs to file names that contain the hash symbol. +- Fixed a problem where the `join` command did not process schemas containing `null` values when the `--prefix-components-with-info-prop` option was used.' +- Updated @redocly/openapi-core to v1.9.1. + +## 1.9.0 (2024-02-13) + +### Minor Changes + +- - Removed descriptions adding for x-tagGroups for the `join` command. Descriptions in x-tagGroups are not supported and cause errors on linting. + - Updated `info.title` to be used as a name in x-tagGroups instead of a file name for the `join` command, so you can now join files with the same names. +- Added new `no-required-schema-properties-undefined` rule to check if each required schema property is defined. + +### Patch Changes + +- Fixed an issue where using the `--prefix-components-with-info-prop` option with the `join` command caused `$refs` to include duplicated prefixes. +- Fixed an issue where `$ref`s ending in `#` (instead of `#/`) would break the application. +- Updated @redocly/openapi-core to v1.9.0. + +## 1.8.2 (2024-02-01) + +### Patch Changes + +- Added markdown format option to stats command for use with GitHub job summaries. +- Fixed an issue with the `push` command, when `destination` option does not work without specifying it in `redocly.yaml`. +- Updated @redocly/openapi-core to v1.8.2. + +## 1.8.1 (2024-01-29) + +### Patch Changes + +- Added git to the docker image, so the push command can use git metadata. +- Updated @redocly/openapi-core to v1.8.1. + +## 1.8.0 (2024-01-26) + +### Minor Changes + +- Added a `push` and `push-status` command for use with future Redocly products. + +### Patch Changes + +- Updated @redocly/openapi-core to v1.8.0. + +## 1.7.0 (2024-01-23) + +### Minor Changes + +- Added a `preview` command that starts a local preview server for Redocly projects that use products that are currently in a pre-release stage. + +### Patch Changes + +- Fixed an issue with resolving references after splitting API descriptions written in the json format. +- Added filename extension support for more `x-codeSamples` languages. +- Fixed a problem where the linter incorrectly returned an error for valid examples that contain references. +- Updated @redocly/openapi-core to v1.7.0. + +## 1.6.0 (2023-12-21) + +### Minor Changes + +- Added the ability to use `$ref` in the Redocly config file. This ability allows users to split up big config files and maintain their constituent parts independently. + +### Patch Changes + +- Deprecated `--lint` option in the `join` command. The options are marked for removal in a future release. Use the [lint command](https://redocly.com/docs/cli/commands/lint/) separately to lint your APIs. +- Updated @redocly/openapi-core to v1.6.0. + +## 1.5.0 (2023-11-29) + +### Minor Changes + +- Added new rule `array-parameter-serialization` to require that serialization parameters `style` and `explode` are present on array parameters. + +### Patch Changes + +- Deprecated lint-related options in the `bundle` command. The options are marked for removal in a future release. + Use the [lint command](https://redocly.com/docs/cli/commands/lint/) separately to lint your APIs before bundling. +- Updated Redoc to v2.1.3. +- Updated @redocly/openapi-core to v1.5.0. + +## 1.4.1 (2023-11-15) + +### Patch Changes + +- Fixed an issue with resolving the `node-fetch` package by explicitly adding the missing dependency. +- Updated @redocly/openapi-core to v1.4.1. + +## 1.4.0 (2023-10-26) + +### Minor Changes + +- Added `recommended-strict` ruleset which uses the same rules as `recommended` but with the severity level set to `error` for all rules. +- Add JSON output support to the `split` and `join` commands. + +### Patch Changes + +- The `--host/-h` argument in the `preview-docs` command is now also used by the WebSocket server for hot reloading. +- Updated @redocly/openapi-core to v1.4.0. + +## 1.3.0 (2023-10-19) + +### Minor Changes + +- Added the possibility to configure the linting severity level of the configuration file for all CLI commands. + Redocly CLI exits with an error if there are any issues with the configuration file, and the severity is set to `error`. + +### Patch Changes + +- Updated @redocly/openapi-core to v1.3.0. + +## 1.2.1 (2023-10-17) + +### Patch Changes + +- Fixed an issue with nested refs in the `join` command. +- Fixed pattern for no-server-example.com rule to improve detection accuracy. +- Changed the report location for `pattern` and `notPattern` assertions to be more precise. +- Updated `unevaluatedItems` type definition to resolve either boolean or object schema per JSON Schema 2019-09 specification. +- Updated @redocly/openapi-core to v1.2.1. + +## 1.2.0 (2023-09-18) + +### Minor Changes + +- Added support for linting AsyncAPI v2 files, so that a wider range of API descriptions can use the Redocly linting workflow. + +### Patch Changes + +- Renamed API definition to API description for consistency. +- Updated @redocly/openapi-core to v1.2.0. + +## 1.1.0 (2023-09-14) + +### Minor Changes + +- Added `ignoreCase` option for `tags-alphabetical` rule. +- Added `join` support for OAS 3.1 descriptions. +- Added support for Redoc v2.1.2, and aligned the dependencies for both projects. + +### Patch Changes + +- Fixed an issue where the `--remove-unused-components` option removed used components that were referenced as child objects. +- Updated Redocly config validation. +- Fixed the location pointer when reporting on the `no-path-trailing-slash` rule. +- Updated minimum required version of Node.js to v14.19.0, NPM to v7.0.0, and removed deprecated packages. +- Updated @redocly/openapi-core to v1.1.0. + +## 1.0.2 (2023-08-07) + +### Patch Changes + +- No code changes. +- Updated @redocly/openapi-core to v1.0.2. + +## 1.0.1 (2023-08-07) + +### Patch Changes + +- Fixed the build-docs command failing when running outside the root folder. +- Updated @redocly/openapi-core to v1.0.1. + +## 1.0.0 (2023-07-25) + +This release marks the stable version 1.0. There are no changes from previous releases. + +## 1.0.0-rc.3 (2023-07-20) + +### Fixes + +- Fixed issue with publishing to Docker Hub (no code changes). +- Fixed smoke tests in Yarn and Docker environments. + +### Changes + +- Added job for testing new version (no code changes). + +## 1.0.0-rc.2 (2023-07-19) + +- Update package publishing process (no code changes). + +## 1.0.0-rc.1 (2023-07-17) + +No code changes. + +## 1.0.0-beta.131 (2023-07-10) + +### Fixes + +- Handled aborted request in the docker and removed a redundant call. +- Resolved problem with installation failing in node 14- and yarn due to unresolved peer dependencies. + +### Changes + +- Removed the `cdn` option from the `build-docs` command as it was not functional. +- Updated Redocly config validation schemas. + +## 1.0.0-beta.130 (2023-07-06) + +### Features + +- Added new rule `component-name-unique` to check for unique component names (kudos to @pboos 🎉). +- Added docker container to GitHub container registry. + +### Fixes + +- Fixed an issue when the `--files` option of the `push` command did not upload extra files. +- Fixed nullable schema type validation for OAS 3.1. +- Added peer dependencies to fix an issue with styles seen in the build-docs command. + +### Changes + +- Additional data masking for the anonymous data collection feature. +- Added fetch request timeout to prevent hanging the tool when executing commands. + +## 1.0.0-beta.129 (2023-06-26) + +### Features + +- Added product metrics collection. + +### Fixes + +- Fixed build-docs command not working in Docker. +- Other stability fixes and improvements. + +### Changes + +- Streamlined the `push` command interface. The previous syntax also continues to work. +- Improved Redocly configuration validation. +- Documentation and messaging corrections. + +## 1.0.0-beta.128 (2023-06-07) + +### Features + +- Resolve `$ref`s in preprocessors. +- Create the `spec-strict-refs` rule to ensure `$ref` usage is in accordance with the OpenAPI specification. + +### Fixes + +- Handle syntax errors from plugins. +- Apply the following regular expression, `^[a-zA-Z0-9\.\-_]+$`, only to fixed fields under components. + +### Changes + +- Change the prefix from `assert/` to `rule/` as a prefix for configurable rules. The `assert/` prefix continues to work with a warning of the deprecated syntax. + +## 1.0.0-beta.127 (2023-05-25) + +### Features + +- Inform the user if a new version is available. + +### Fixes + +- Improved messages on wrong schemas. +- Fixed components duplication and self-referencing when bundling. +- Fixed typos. + +### Changes + +- Adjusted CLI arguments behavior for array-like options: it's required to specify the option multiple times to add multiple values. For example, `--skip-rule rule1 --skip-rule rule2` instead of `--skip-rule rule1 rule2`. + +## 1.0.0-beta.126 (2023-05-10) + +### Features + +- Added new options for the `join` command: `--decorate` and `--preprocess`. + +### Fixes + +- Fixed a bug with OAS (`x-`) specification extensions that contain an array. +- Display an error if the API path refers to a folder. +- Fixed the `push` command not recognizing API descriptions with spaces. +- Defined default `allowedValues` in the `all` ruleset for mime-type rules. + +### Changes + +- Display an error if apis or rules for the `lint` command are not provided. +- Stopped executing decorators and preprocessors upon the `join` command. +- Sort top-level OAS3 keys in `bundle` and `join` commands. + +## 1.0.0-beta.125 (2023-04-06) + +### Features + +- Added the [required-min-length-string-type-property](./rules/oas/required-string-property-missing-min-length.md) rule that requires required properties in the API description with type `string` to have a `minLength`. + +### Fixes + +- Fixed an issue with `$ref` in path parameters during the `join` command. +- This release also includes various internal stability fixes and improvements. + +### Changes + +- Changed the arguments for assertion custom functions. Now as the third parameter, instead of a `location` object, assertion custom functions include a `ctx` object. See [Custom functions](./rules/configurable-rules.md#custom-function-example). + +## 1.0.0-beta.124 (2023-03-09) + +- Fixed an issue with remote file inside the lint ignore file. + +## 1.0.0-beta.123 (2023-01-02) + +### Fixes + +- Fixed the `push` command when organization is provided in the `redocly.yaml` configuration file. + +## 1.0.0-beta.122 (2023-01-26) + +### Fixes + +- Fixed an issue with the `push` command not working with a valid `organizationId`. + +## 1.0.0-beta.121 (2023-01-25) + +### Features + +- Added custom output file option to the `join` command. +- Added an option to include webhooks to [operation-4xx-response](./rules/oas/operation-4xx-response.md) rule. +- Added a new built-in decorator [info-override](./decorators/info-override.md). +- Added support for `/` as a separator which puts paths into subdirectories for each path segment with the [split command](./commands/split.md). + +### Fixes + +- Ignored case when inferring file extension from code sample `lang` property. + +### Changes + +- Moved and renamed the `features.openapi` and `features.mockServer` into the `theme` object with the names `openapi` and `mockServer`. + +Before: + +```yaml +features.openapi: {} +features.mockServer: {} +``` + +After: + +```yaml +theme: + openapi: {} + mockServer: {} +``` + +## 1.0.0-beta.120 (2023-01-05) + +### Fixes + +- Fixed an issue where `$refs` weren't resolved inside specification extensions. + +## 1.0.0-beta.119 (2023-01-03) + +### Fixes + +- Fixed an issue where the `spec` rule showed an error for `x-logo` properties in the 3.1 OpenAPI description. + +## 1.0.0-beta.118 (2022-12-29) + +### Features + +- Enabled removing unused components in the config to use within the bundle command. +- Implemented special SpecExtension type `VendorExtension`. +- Added an error handler for the case when the API description file or a plugin does not exist. +- Added `media-type-examples-override` decorator. + +### Fixes + +- Fixed an issue where the rule spec-components-invalid-map-name is not applied for all examples and adjusted the logic behind the rule in general. + +## 1.0.0-beta.116 (2022-12-7) + +### Fixes + +- Fixed an issue with scalar assertion failing when an object is of invalid type. + +### Features + +- Added Redoc vendor extensions to supported types. + +## 1.0.0-beta.115 (2022-11-29) + +### Features + +- Added support for [`any`](./rules/configurable-rules.md#any-example) type in assertions. + +### Changes + +- Renamed the Docker image on [Docker Hub](https://hub.docker.com/repository/docker/redocly/cli). +- Changed assertions errors grouping. +- Removed orphaned git submodule `public_api_docs`. + +## 1.0.0-beta.114 (2022-11-18) + +### Features + +- Added a new assertion [`notPattern`](./rules/configurable-rules.md#notpattern-example) to the custom rules. + +## 1.0.0-beta.113 (2022-11-15) + +### Changes + +- Removed automatically adding the `recommended` configuration when there is a config defined without an `extends` list. + +### Fixes + +- Fixed an issue with undefined `process.cwd` in browser environment. +- Fixed an issue with `$anchors` in OpenAPI documents are not properly parsed. +- Fixed an issue with the `spec` rule not reporting on `nullable` in Schema object that don't have a `type` sibling. +- Added missing OAS2 and OAS3 list types. +- Don't show false media type example errors when a discriminator is used with the `allOf` keyword. + +## 1.0.0-beta.112 (2022-11-01) + +### Changes + +- Changed assertions syntax and renamed to [custom rules](./rules/configurable-rules.md). +- Removed `info-description` rule. +- Removed deprecated fields suggestions in Redocly config file. + +## 1.0.0-beta.111 (2022-10-10) + +### Changes + +- Renamed four type names for alignment with the OpenAPI specification. + - `PathsMap` to `Paths` + - `ResponsesMap` to `Responses` + - `EncodingsMap` to `EncodingMap` + - `SecuritySchemeFlows` to `OAuth2Flows` + +### Features + +- Added a new option `--keep-url-references` to the `bundle` command that disables bundling of absolute URL `$ref`-s. + +### Fixes + +- Improved location of problems produced by `security-defined` rule. +- Fixed an issue with `response-contains-header` being case-sensitive. +- Fixed an issue with `path-params-defined` rule that was not accounting for params defined on the operation level. +- Fixed an issue with `type` not being validated if it is an array. +- Fixed an issue with `apis` overrides not picking up some base values from the root config. +- Fixed an issue with api not being detected from the `apis` list if used as a file name. + +## 1.0.0-beta.110 (2022-09-21) + +### Features + +- Added the `build-docs` command which builds Redoc API docs into a zero-dependency HTML file. +- Added the ability to upload other files and folders with the `push` command. +- Added support for custom assertions as plugins. + +### Fixes + +- Fixed incorrect behavior for the `no-invalid-media-type-examples` rule in combination with the `allOf` keyword. + +## 1.0.0-beta.109 (2022-09-08) + +### Features + +- Added rfc7807 problem details rule. +- Improved error messages by adding `referenced from` information. +- Added the [`spec-components-invalid-map-name`](./rules/oas/spec-components-invalid-map-name.md) rule for component map names validation. +- Added a new lint `--format` option: `summary`. + +### Fixes + +- Fixed an issue with multi-line strings in literal mode. +- Fixed an issue with multi-line Markdown with Windows-style new lines. +- Fixed the Header object type to require `content` or `schema`. +- Fixed a error message for `operation-4xx-response` rule. +- Fixed an issue with `paths` not being correctly handled by the `join` command. +- Fixed the `operation-security-defined` rule to check the security on the root and in each operation. + +### Changes + +- Renamed 'DefinitionRoot', 'ServerVariableMap', 'PathMap', 'CallbackMap', 'MediaTypeMap', 'ExampleMap', 'EncodingMap', 'HeaderMap', and 'LinkMap' definition node types. +- Removed the `styleguide` object from the configuration file. +- Renamed the `operation-security-defined` rule to `security-defined`. + +## 1.0.0-beta.108 (2022-08-22) + +### Changes + +- Renamed `no-servers-empty-enum` to `no-server-variables-empty-enum` and fixed incorrect docs of `no-empty-enum-servers`. + +### Features + +- Add browser support for `openapi-core`. +- Allow accessing `config` field in subclasses extending `BaseResolver` class. +- Ability to create config (e.g. `redocly.yaml`) from string or object. + +### Fixes + +- Fixed docs for `no-server-example.com`. +- Incorrect schema description dereferenced. + +## 1.0.0-beta.107 (2022-08-16) + +### Changes + +- Add `allowAdditionalProperties` to built-in rules and mark `disallowAdditionalProperties` as deprecated. + +### Fixes + +- Introduced severity level `off` for assertions. + +## 1.0.0-beta.106 (2022-08-09) + +### Fixes + +- Now errors exit with return code `1`. + +### Changes + +- Renamed `lint` into `styleguide` in Redocly configuration. +- Improved naming consistency. + +## 1.0.0-beta.105 (2022-07-27) + +### Fixes + +- Fixed bug with an invalid path to the configuration file causing issues with the ignore file. + +## 1.0.0-beta.104 (2022-07-11) + +### Fixes + +- Fixed incorrect boolean filtering in `filter-out` rule. +- Fixed bug with tags duplication for the `join` command. +- Other internal stability fixes and improvements. + +## 1.0.0-beta.103 (2022-06-27) + +### Features + +- Added new property `ref` to assertation object. +- Added the `--lint-config` option for the `lint` command. Use it to validate the configuration file with appropriate severity level. +- Added new built-in decorators `filter-in` and `filter-out`. + +### Fixes + +- Resolved an issue with the `--run-id` option for the `push` command. The `--run-id` option renamed to the `--batch-id`, added the `--batch-size` option. +- Improved types for the configuration file. + +## 1.0.0-beta.102 (2022-06-09) + +### Features + +- The `join` command supports a new option `--without-x-tag-groups`. Use it to skip the creation and population of `x-tagGroups`. +- Added new property `requireAny` to assertation object. +- Updated types. Added `showSecuritySchemeType` and `disableTryItRequestUrlEncoding` configuration options. + +### Fixes + +- Fixed issue with `additionalItems` array type. + +## 1.0.0-beta.101 (2022-06-09) + +Broken release. + +## 1.0.0-beta.100 (2022-05-27) + +### Fixes + +- Fixed types for `Callback` and `NamedCallbacks`. +- Fixed an issue with the `scalar-property-missing-example` built-in rule that didn't work on examples containing falsy values. + +## 1.0.0-beta.99 (2022-05-25) + +### Features + +- Added three new built-in rules: `response-contains-header`, `response-contains-property`, `scalar-property-missing-example`. +- The `bundle` command supports a new option `--keep-url-references`. Use it to prevent Redocly CLI from resolving external URL references during bundling. +- Added `addinionalItems`, `minContains` and `maxContains` array types. + +### Fixes + +- Resolved an issue with escaping symbols in code sample language names (the `lang` value in the `x-codeSamples` specification extension). + +## 1.0.0-beta.98 (2022-05-18) + +### Features + +- Updated types. Added `hideTryItPanel`, `schemaDefinitionsTagName` configuration options and `x-hideTryItPanel`, `x-tags` OpenAPI specification extensions. + +## 1.0.0-beta.97 (2022-05-10) + +### Features + +- Added the `--public` option to the `push` command. With this option, you can upload OpenAPI descriptions and make them publicly accessible. +- Changed assertions syntax to this pattern: `assert/{assert name}` + +### Fixes + +- Fixed an issue with `process.*` in core package that caused crashes in client-side builds. +- Fixed `preview-docs` hot reload. + +## 1.0.0-beta.96 (2022-05-06) + +Technical release for changing the package name from `@redocly/openapi-cli` to `@redocly/cli`. + +## 1.0.0-beta.95 (2022-05-04) + +{% admonition type="warning" name="Product name change" %} +The product name has changed from OpenAPI CLI to **Redocly CLI**. + +This change is reflected in all Redocly product documentation, in the npm package name (more on that in the "Deprecated" section), +and in the official project GitHub repository. + +The change also affects the CLI commands. The legacy name `openapi` is supported for now, but we strongly recommend you use the new name `redocly`. +(To illustrate, if you previously used `openapi lint`, now you should use `redocly lint`). + +If you encounter any issues and suspect they may be related to this change, let us know by [reporting an issue](https://github.com/Redocly/redocly-cli/issues). + +{% /admonition %} + +### Features + +- The `lint.extends` section in the Redocly configuration file supports file paths and URLs as values. This means you can define your own lint rulesets in local or remote files, and list those files in the `extends` section. The following example shows how to do it: + +```yaml +extends: + - recommended + - ./path/to/local/lint-ruleset.yaml + - https://url-to-remote/lint-ruleset.yaml +``` + +The contents of those referenced files must correspond to the standard format used in the `rules` object to configure the rules. Here is an example `lint-ruleset.yaml` file referenced above: + +```yaml +rules: + tags-alphabetical: error +``` + +- The `lint` command supports a new output formatting option called `codeclimate` that you can use with the `--format` argument. + +### Fixes + +- Fixed an issue with resolvable scalar values not working in assertions. + +### Deprecated + +- Deprecated the `@redocly/openapi-cli` npm package. From this version forward, use `@redocly/cli` instead. + +--- + +## 1.0.0-beta.94 (2022-04-12) + +### Features + +- The `lint` command supports using `unevaluatedProperties` as boolean in **OAS 3.1.x** and no longer reports this as an error. +- Internal changes. + +--- + +## 1.0.0-beta.93 (2022-04-05) + +### Fixes + +- Resolved an issue with the `push` command skipping dependencies. + +--- + +## 1.0.0-beta.92 (2022-04-04) + +### Features + +- Introduced [configurable rules](./rules/configurable-rules.md) - a new, powerful lint feature, which helps you enforce API design standards without coding (named `assertions` at the time of the release). +- The `push` command supports a new `--skip-decorator` option. + +### Fixes + +- Resolved an issue with `openapi preview-docs` failing during authorization. + +--- + +## 1.0.0-beta-91 (2022-03-29) + +### Features + +- Added the `--separator` option to the `split` command. Use it to change the separator character that's used instead of whitespace in file names. The default is `_`, which means that after splitting, path file names look like this: "user_login.yaml", "user_logout", etc. + +### Fixes + +- Resolved an issue with the `bundle` command when handling files with multiple dots in the file name. + +--- + +## 1.0.0-beta.90 (2022-03-24) + +### Fixes + +- Updated types to support validation of the Redocly configuration file according to the new file structure. + +--- + +## 1.0.0-beta.89 (2022-03-21) + +### Features + +- Internal changes of `redocly.yaml` config structure - add new mock server options to `redocly.yaml` schema. + +### Fixes + +- Fixed crash when there's an empty `redocly.yaml` file. + +--- + +## 1.0.0-beta.88 (2022-03-16) + +### Features + +- Internal changes of `redocly.yaml` config structure. + +### Fixes + +- Fixed an issue with the `lint` command highlighting the entire file when `servers` are missing in OAS3. Now it highlights only the `openapi` field, indicating an incorrect OpenAPI description. +- Fixed an issue with the `lint` command highlighting all parent values when one of the child fields has an empty value instead of highlighting the field itself. + +--- + +## 1.0.0-beta.87 (2022-03-10) + +### Fixes + +- Fixed an issue with `process.env` assignment that caused crashes in client-side builds. +- Fixed an issue with `no-path-parameter` rule reporting false-positives. + +--- + +## 1.0.0-beta.86 (2022-03-09) + +### Features + +- Allowed to name the config file either `.redocly.yaml` (deprecated) or `redocly.yaml`. + +### Fixes + +- The `spec` rule triggers an error when a parameter is missing `schema` or `content` fields. + +--- + +## 1.0.0-beta.85 (2022-03-02) + +- Internal improvements + +--- + +## 1.0.0-beta.84 (2022-02-23) + +### Fixes + +- Fixed an issue with the `lint` command crashing when the `servers.url` field is empty in the OpenAPI description. +- Fixed an issue with the `lint` command crashing when an `enum` value is invalid. + +--- + +## 1.0.0-beta.83 (2022-02-22) + +### Features + +- Added the `webhooks` and [x-webhooks](https://redocly.com/docs/api-reference-docs/specification-extensions/x-webhooks/#x-webhooks) support to the `split` command. + +--- + +## 1.0.0-beta.82 (2022-02-15) + +### Fixes + +- Removed support for using OpenAPI CLI behind a proxy server. + +--- + +## 1.0.0-beta.81 (2022-02-10) + +### Features + +- Added support for using OpenAPI CLI behind a proxy server. + +### Fixes + +- Fixed an issue with the `lint` command not reporting errors when `securityDefinitions.basic` contains the unsupported `additionalProperty` in OAS2. +- Fixed an issue with the `no-invalid-media-type-examples` built-in rule that didn't work on examples containing a `$ref`. +- Fixed an issue with the `lint` command incorrectly reporting boolean schemas for array items as invalid. +- Fixed an issue with `isPathParameter` failing because of an incorrect brace. + +--- + +## 1.0.0-beta.80 (2022-01-24) + +### Fixes + +- Fixed an issue with date-time conversion in YAML files. +- Fixed an issue with the `oauth2-redirect.html` file being absent when served by `preview-docs` command. + +--- + +## 1.0.0-beta.79 (2022-01-10) + +### Fixes + +- Fixed the `remove-x-internal` decorator to remove references to removed `x-internal` components. +- Fixed the `remove-unused-components` decorator that strips remotely referenced components. + +--- + +## 1.0.0-beta.78 (2022-01-06) + +### Features + +- Added the `remove-x-internal` built-in decorator. +- Added the `--remove-unused-components` option to the `bundle` command. + +--- + +## 1.0.0-beta.77 (2022-01-06) + +### Fixes + +- Fixed an issue with backslashes in `$refs` to paths with the `split` command in a Windows environment. + +--- + +## 1.0.0-beta.76 (2021-12-28) + +### Features + +- Exported `mapTypeToComponent` function. + +--- + +## 1.0.0-beta.75 (2021-12-24) + +### Features + +- Added the `--host` option to the `preview-docs` CLI command. + +### Fixes + +- Fixed an issue with continuous deployment to Docker Hub. + +--- + +## 1.0.0-beta.74 (2021-12-22) + +### Fixes + +- Fixed an issue with `const` not handled correctly by the `lint` command. + +--- + +## 1.0.0-beta.73 (2021-12-16) + +### Fixes + +- Resolved another backward compatibility issue with older versions of portal. + +--- + +## 1.0.0-beta.72 (2021-12-16) + +### Fixes + +- Fixed another backward compatibility issue with regions: save old config key to support old portal versions. + +--- + +## 1.0.0-beta.71 (2021-12-16) + +### Fixes + +- Fixed a backward compatibility issue with `REDOCLY_DOMAIN` in the EU region introduced in the previous release. + +--- + +## 1.0.0-beta.70 (2021-12-14) + +### Features + +- Added support for the [region](./configuration/index.md) option with the `login`, `push`, and other commands. +- Added two new built-in rules: + - [no-invalid-schema-examples](./rules/oas/no-invalid-schema-examples.md) + - [no-invalid-parameter-examples](./rules/oas/no-invalid-parameter-examples.md) + +### Fixes + +- Fixed an issue with the built-in `paths-kebab-case` rule that disallowed paths with trailing slashes. +- Fixed a validation issue with the `example` property when the schema is an array. + +--- + +## 1.0.0-beta.69 (2021-11-16) + +### Features + +- Implemented new `--extends` and `--metafile` options for the [bundle](./commands/bundle.md#options) command. + +--- + +## 1.0.0-beta.68 (2021-11-15) + +### Fixes + +- Fixed an issue with hot reloading when running a preview of reference docs with `openapi preview-docs`. +- Fixed an issue with page refresh when pagination is set to `item` or `section`. +- Fixed an issue with inlining external schema when components' names match. +- Fixed an issue with fetching hosted schema on Windows when bundling OpenAPI descriptions. +- Fixed an issue for `no-server-trailing-slash` when server url is a root. + +--- + +## 1.0.0-beta.67 (2021-11-02) + +### Features + +- Added a new built-in rule: [operation-4xx-response](./rules/oas/operation-4xx-response.md). + +--- + +## 1.0.0-beta.66 (2021-11-01) + +### Features + +- Added four new built-in rules: + - [path-excludes-patterns](./rules/oas/path-excludes-patterns.md) + - [no-http-verbs-in-paths](./rules/oas/no-http-verbs-in-paths.md) + - [request-mime-type](./rules/oas/request-mime-type.md) + - [response-mime-type](./rules/oas/response-mime-type.md) + +### Fixes + +- Fixed an issue with OAS 3.1 meta keywords reported as not expected. +- Fixed an issue with incorrect codeframe for `info-license-url` rule. +- Fixed an issue with discriminator mapping not supported in `no-invalid-media-type-examples`. +- Fixed an issue with ignore file generated in windows not working on other systems, and in Redocly Workflows. + +--- + +## 1.0.0-beta.65 (2021-10-27) + +### Features + +- Added three built-in decorators - `info-description-override`, `tag-description-override`, `operation-description-override` - that let you modify your API descriptions during the bundling process. Use these decorators in the `lint` section of your `redocly.yaml` file to point OpenAPI CLI to Markdown files with custom content. That custom content replaces any existing content in the `info.description` field, and in `tags.description` and `operation.description` fields for specified tag names and operation IDs. + +The following examples show how to add the decorators to the `redocly.yaml` file: + +```yaml info-description-override +lint: + decorators: + info-description-override: + filePath: ./my-custom-description.md +``` + +```yaml tag-description-override +lint: + decorators: + tag-description-override: + tagNames: + pet: ./my-custom-description.md +``` + +```yaml operation-description-override +lint: + decorators: + operation-description-override: + operationIds: + updatePet: ./my-custom-description.md +``` + +- Improved documentation for [the lint command](./commands/lint.md). + +### Fixes + +- Fixed the the `bundle` command to return a non-zero code when it detects an error when used with the `--lint` option. + +--- + +## 1.0.0-beta.64 (2021-10-20) + +### Fixes + +- Fixed an issue with the `--format` option not working with the `bundle` command. + +- Fixed a validation issue with the non-string `openapi` value in API descriptions. The `lint` command now warns if the value is not string instead of crashing. + +--- + +## 1.0.0-beta.63 (2021-10-12) + +### Features + +- Upgraded the `js-yaml` package from v.3 to v.4 with YAML 1.2 support. This resolves issues with parsing timestamps and example strings with leading zeros in YAML. + +--- + +## 1.0.0-beta.62 (2021-09-30) + +### Fixes + +- Resolved an issue with the `--max-problems` option that was not working with the `bundle` command. + +--- + +## 1.0.0-beta.61 (2021-09-21) + +### Features + +- Improved validation of values for the following fields in the Schema Object: `multipleOf, maxLength, minLength, maxItems, minItems, maxProperties, minProperties`. + +--- + +## 1.0.0-beta.60 (2021-09-20) + +### Fixes + +- Fixed an issue with the `join` command crashing when trying to resolve $ref. + +--- + +## 1.0.0-beta.59 (2021-09-15) + +### Fixes + +- Resolved an issue with the `preview-docs` command not working when running `openapi-cli` in a Docker container. + +- Improved the security of local documentation previews by removing query parameters from the request URL. + +--- + +## 1.0.0-beta.58 (2021-09-02) + +### Fixes + +- Internal improvements to configuration types. + +--- + +## 1.0.0-beta.57 (2021-09-01) + +### Fixes + +- Simplified the login check query to improve performance. + +--- + +## 1.0.0-beta.56 (2021-09-01) + +### Features + +- Added a function for linting the `redocly.yaml` configuration file. + +- Published [the OpenAPI CLI quickstart guide](quickstart.md) as part of our Google Season of Docs 2021 project. + +--- + +## 1.0.0-beta.55 (2021-08-20) + +### Features + +- Updated and improved the [introductory content](index.md) and [installation instructions](installation.md) for OpenAPI CLI as part of our Google Season of Docs 2021 project. + +- Implemented improvements to the internal CD process. + +--- + +## 1.0.0-beta.54 (2021-07-19) + +- Internal changes. + +--- + +## 1.0.0-beta.53 (2021-07-02) + +### Fixes + +- Resolved an issue with transitive $ref resolution in the JSON schema validator. + +- If the JSON schema validator crashes, OpenAPI CLI reports the problem in the output instead of crashing itself. + +--- + +## 1.0.0-beta.52 (2021-07-01) + +### Fixes + +- The `operation-operationId` rule no longer triggers a warning when one or more operations in the `callbacks` object don't have `operationId` defined. + +--- + +## 1.0.0-beta.51 (2021-06-30) + +### Features + +- Our [official OpenAPI CLI documentation](https://redocly.com/docs/cli/) is now open-source! 🥳 You can find the source of all pages published on our website in the `docs` folder of the [openapi-cli repository](https://github.com/Redocly/redocly-cli/tree/main/docs). We invite you to help us improve the documentation and make it more usable for everyone. Please make sure to always follow our [Code of conduct](https://redocly.com/code-of-conduct/) in all your contributions. + +- Implemented support for OpenAPI 3.1 in `typeExtension` plugins. + +### Fixes + +- Resolved a crash caused when processing properties with the `null` value. + +- Resolved a "Maximum call stack size exceeded" issue in the JSON schema validator caused by recursive `oneOf`. + +--- + +## 1.0.0-beta.50 (2021-06-08) + +### Fixes + +- Implemented improvements to the `openapi-cli` package to reduce the size of the browser bundle. + +--- + +## 1.0.0-beta.49 (2021-06-01) + +### Fixes + +- Removed unused keywords in OpenAPI 3.1. + +- Resolved an issue with the `openapi bundle` command failing because of the missing `js-yaml` dependency. + +--- + +## 1.0.0-beta.48 (2021-05-25) + +### Fixes + +- Resolved an issue with the plugin ID being prefixed to all rules, preprocessors and decorators multiple times (for example, when using the `preview-docs` command and changing configuration files). + +--- + +## 1.0.0-beta.47 (2021-05-21) + +### Features + +- The `bundle` command now supports an optional `--lint` parameter. + +### Fixes + +- Improved the error messages for `kebab-case` and implemented detection of `snake_case` usage in paths. + +- The `join` command does not overwrite an existing `x-displayName` of a tag with the tag's `name` property. + +--- + +## 1.0.0-beta.46 (2021-05-17) + +### Features + +- Implemented support for [OpenAPI 3.1](https://github.com/OAI/OpenAPI-Specification/releases/tag/3.1.0). You can now lint, validate, and bundle your OAS 3.1 descriptions with OpenAPI CLI. + +--- + +## 1.0.0-beta.45 (2021-05-09) + +### Fixes + +- Resolved a validation issue for `enum` items with the nullable property. Validation errors are no longer reported when `nullable: true` for `enum` items that contain a `null` value. + +--- + +## 1.0.0-beta.44 (2021-04-12) + +### Fixes + +- The `browser` field in `package.json` is now set to simplify using `openapi-core` in browser-based builds. + +--- + +## 1.0.0-beta.43 (2021-04-09) + +### Fixes + +- The root API description document is now parsed in all cases, even if it doesn't report the correct MIME type or doesn't use any of the supported file extensions. + +--- + +## 1.0.0-beta.42 (2021-04-06) + +### Fixes + +- Improved `openapi-core` so that it can be used within our other projects including Redoc, Reference docs, and Developer portal. + +--- + +## 1.0.0-beta.41 (2021-04-02) + +### Fixes + +- Resolved an issue with the `--dereferenced` CLI option not functioning properly. + +--- + +## 1.0.0-beta.40 (2021-03-31) + +### Fixes + +- Resolved an issue where transitive $refs that span multiple files would crash the validation in some cases. + +--- + +## 1.0.0-beta.39 (2021-03-26) + +### Fixes + +- Resolved a hot-reloading issue with the `preview-docs` command. It now automatically reloads the docs in the browser when you make live changes to an OpenAPI description. + +--- + +## 1.0.0-beta.38 (2021-03-20) + +### Fixes + +- Exported a helper function from `openapi-core` and implemented defaults for some functions to improve integration with the Developer portal. + +--- + +## 1.0.0-beta.37 (2021-03-16) + +### Fixes + +- Implemented error handling for failed file uploads when using the `push` command. The command now displays success/failure messages in the output. + +--- + +## 1.0.0-beta.36 (2021-03-15) + +### Features + +- Source type was changed from `FILE` to `CICD` to support integration with the new CI/CD source in Workflows. + +--- + +## 1.0.0-beta.35 (2021-03-12) + +### Features + +- OpenAPI CLI now has tab completion for global installations. Run `openapi completion` for instructions to set it up in your environment. + +--- + +## 1.0.0-beta.34 (2021-03-10) + +### Features + +- OpenAPI CLI now has an official Docker image! You can get it from [Docker Hub](https://hub.docker.com/repository/docker/redocly/openapi-cli). + +--- + +## 1.0.0-beta.33 (2021-03-10) + +### Features + +- You can now use the `--verbose` parameter with the `login` command to show a detailed error trace (if any). Detailed error output is not displayed by default for this command. + +--- + +## 1.0.0-beta.32 (2021-02-25) + +### Features + +- The "access token" has been renamed to "API key" in the output of relevant OpenAPI CLI commands (`login`, `push`) to make it clearer what information the users must provide. + +- For improved security, the API key is now hidden (masked) when the user provides it in the terminal, and it's not logged in the user's history. + +--- + +## 1.0.0-beta.31 (2021-01-25) + +### Features + +- The `bundle` method is now able to accept `Document` directly in openapi-core. + +--- + +## 1.0.0-beta.30 (2021-01-25) + +### Features + +- OpenAPI CLI now automatically resolves all $refs by default, even in places where they are not allowed by the specification ("incorrect $refs"). This functionality can be disabled for examples by setting `doNotResolveExamples` to `true` in `redocly.yaml`. + +--- + +## 1.0.0-beta.29 (2021-01-13) + +### Fixes + +- Fixed an issue with incorrect base directory when resolving transitive `$refs`. + +--- + +## 1.0.0-beta.28 (2021-01-09) + +### Fixes + +- Resolved an issue with nested filepaths that caused the `push` command to upload files to the wrong path when used on Windows systems. + +--- + +## 1.0.0-beta.27 (2021-01-06) + +### Features + +- A new command called `push` is now supported by OpenAPI CLI. With this command, you can upload your API descriptions and associated files, and set up your own CI pipeline for updating API descriptions without granting Redocly Workflows access to your repositories. + +### Fixes + +- Resolved an issue that prevented using the `.` (dot) symbol in version names with the `push` command. + +--- + +## 1.0.0-beta.25 (2020-11-27) + +### Fixes + +- Resolved an issue with `assert-node-version` using the wrong path. + +- OpenAPI CLI bundles the API description before gathering stats. + +--- + +## 1.0.0-beta.23 (2020-11-24) + +### Fixes + +- Resolved issues with tag logic and tag display names for the `join` command. + +- Refactored CLI command handlers. + +--- + +## 1.0.0-beta.22 (2020-11-16) + +### Features + +- A new command called `join` is now available in OpenAPI CLI. Use it to combine two or more API description files into one. The resulting file optionally helps distinguish the origin of OpenAPI objects and properties by appending custom prefixes to them. Note that this command is considered experimental; meaning, it's still a work in progress. + +--- + +## 1.0.0-beta.19 (2020-11-13) + +### Features + +- The previously single OpenAPI CLI package has been split into two: `openapi-cli` and `openapi-core`. + +--- + +## 1.0.0-beta.18 (2020-10-19) + +### Features + +- OpenAPI CLI now supports the `split` command, which you can use to create a multi-file structure out of an API description file by extracting referenced parts into standalone, separate files. The command doesn't support OAS 2. + +### Fixes + +- Resolved an issue with counting operation tags in the `stats` command. + +--- + +## 1.0.0-beta-16 (2020-09-28) + +### Features + +- A new command called `stats` has been implemented. It provides statistics about the structure of one or more API description files, and lets you choose the format in which the statistics are presented. + +### Fixes + +- Resolved an issue with the `glob` library by installing the missing package. + +--- + +## 1.0.0-beta-15 (2020-09-25) + +### Fixes + +- Resolved an issue with the extended regex path which was missing the dot symbol. + +- Added support for non-compatible globbing shells. + +--- + +## 1.0.0-beta-14 (2020-09-14) + +### Fixes + +- Added the missing label definition for `x-codeSamples` and enabled `x-codeSamples` for OAS 2. + +--- + +## 1.0.0-beta-13 (2020-09-13) + +### Fixes + +- Fixed the required field name for `openIdConnectUrl`. + +- Resolved an issue with detecting duplicated plugin IDs, and added a warning that plugin IDs must be unique. + +- Adedd `engines` and `engineStrict` to `package.json`. + +- Implemented better handling and error messages for invalid severity values. + +--- + +## 1.0.0-beta-12 (2020-09-08) + +### Fixes + +- Previously, OpenAPI CLI tried to use `/` instead of `\` for file path splitting on Windows machines. The issue has been resolved by implementing platform-specific separator usage. + +--- + +## 1.0.0-beta-11 (2020-09-03) + +### Fixes + +- Resolved an issue with missing support for external plugins in the bundled version. + +--- + +## 1.0.0-beta.10 (2020-08-31) + +### Fixes + +- Fixed a crash that happened when attempting to resolve back-references. + +- The version number of OpenAPI CLI is now printed in the JSON output. + +--- + +## 1.0.0-beta.9 (2020-08-20) + +### Features + +- The `--format` option now supports JSON as one of the output formats you can choose when using OpenAPI CLI commands. + +- Bundling and uploading are now part of the build process. + +- Warnings and errors are now displayed as separate counts in JSON output. + +- All parts of a pointer are now used to generate unique component names when needed. + +- Added support for linting `x-webhooks`, which is a forward-compatibility vendor extension for `webhooks` from OpenAPI 3.1. + +### Fixes + +- Removed an extra blank line that was printed when no rules were ignored. + +- Resolved an issue with missing types for `OasDecorator` and `Oas3Decorator`. + +- Resolved a tag syntax error when deploying to Workflows. + +- Relative paths are now used for JSON output. + +--- + +## 1.0.0-beta.8 (2020-07-30) + +### Fixes + +- Added mime-type handling for remote docs. + +--- + +## 1.0.0-beta-7 (2020-07-26) + +### Fixes + +- Fixed the callbacks type definition. + +- Fixed invalid component names for some components. + +- Resolved an issue with bundling local references. + +- Resolved a minor issue where the help message displayed references to the `registry:login` command instead of the `login` command. + +--- + +## 1.0.0-beta.5 (2020-07-21) + +### Fixes + +- Fixed invalid unescape and `decodeURIComponent`. + +- Updated the `extends` parameter logic to allow configuration overrides. + +- Improved handling logic and error message when the input file is not an OpenAPI document. + +--- + +## 1.0.0-beta.4 (2020-07-14) + +### Fixes + +- Resolved an issue with detecting output file extension without an entrypoint. + +- Resolved an issue with the `preview-docs` command failing to automatically select the first description from the `apiDefinitions` section of the configuration file when used without arguments. + +- Fixed an issue with relative paths for entrypoints from external configuration files. + +--- + +## 1.0.0-beta.3 (2020-07-10) + +### Fixes + +- The `default.hbs` file is now copied to the build directory. + +- Resolved an issue with the preview functionality failing to access `watcher`. + +--- + +## 1.0.0-beta.2 (2020-07-09) + +### Fixes + +- Resolved an issue with the `no-path-trailing-slash` rule showing errors for the wrong location and path. + +- Fixed a transitive resolve issue. + +--- + +## 1.0.0-beta.1 (2020-07-09) + +First beta release! diff --git a/@skills/redocly-cli/docs/@v1/commands/build-docs.md b/@skills/redocly-cli/docs/@v1/commands/build-docs.md new file mode 100644 index 000000000..1a025adc2 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/build-docs.md @@ -0,0 +1,119 @@ +# `build-docs` + +## Introduction + +The `build-docs` command builds Redoc into an HTML file that contains your API documentation. +The standalone HTML file can be easily shared or hosted on a platform of your choice. + +## Usage + +```bash +redocly build-docs +redocly build-docs --output=custom.html +redocly build-docs --theme.openapi.disableSearch +redocly build-docs --template custom.hbs +redocly build-docs -t custom.hbs --templateOptions.metaDescription "Page meta description" +``` + +## Options + +| Option | Type | Description | +| ------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| api | string | Path to the API description filename or alias that you want to generate the build for. Refer to [the API section](#specify-api) for more details. | +| --config | string | Path to the [configuration file](#use-an-alternative-configuration-file). Defaults to `redocly.yaml` in the local folder. | +| --disableGoogleFont | boolean | Disable Google fonts. The default value is `false`. | +| --help | boolean | Show help. | +| --lint-config | string | Specify the severity level for the configuration file. Possible values: `warn`, `error`, `off`. Default value is `warn`. | +| --output, -o | string | Set the path and name of the output file. The default value is `redoc-static.html`. | +| --template, -t | string | Use custom [Handlebars](https://handlebarsjs.com/) templates to render your OpenAPI description. | +| --templateOptions | string | Add template options you want to pass to your custom Handlebars template. To add options, use dot notation. | +| --theme.openapi | string | Customize your output with [Redoc functionality options](https://redocly.com/docs/api-reference-docs/configuration/functionality/) or [Redoc theming options](https://redocly.com/docs/api-reference-docs/configuration/theming/). | +| --title | string | Set the page title. | +| --version | boolean | Show version number. | + +## Examples + +### Specify API + +The `build-docs` command behaves differently depending on how you pass the API to it, and whether the [configuration file](#use-an-alternative-configuration-file) exists. + +#### Pass an API directly + +```bash +redocly build-docs openapi.yaml +``` + +In this case, the `build-docs` command builds the API description that was passed to the command. +Even if a configuration file exists, the command does not check for APIs listed in it. + +#### Pass an API alias + +Instead of a full path, you can use an API name from the `apis` object of your Redocly configuration file. +For example, with a `redocly.yaml` configuration file containing the following entry for `games@v1`: + +```yaml Configuration file +apis: + games@v1: + root: ./openapi/api-description.json +``` + +You can generate a build by including the API name with the command, as shown in the following example: + +```bash Command +redocly build-docs games@v1 +``` + +In this case, after resolving the path behind the `games@v1` name, `build-docs` generates a build of the `api-description.json` file. For this approach, the Redocly configuration file is mandatory. +Any additional configurations provided in the file are also used by the command. + +### Use an alternative configuration file + +By default, the CLI tool looks for the [Redocly configuration file](../configuration/index.md) in the current working directory. Use the optional `--config` argument to provide an alternative path to a configuration file. + +```bash +redocly build-docs --config=./another/directory/config.yaml +``` + +### Hide search + +The following command uses the optional `--theme.openapi` argument to build docs with the search box hidden: + +```bash +redocly build-docs openapi.yaml --theme.openapi.disableSearch +``` + +### Use a custom template + +The following command builds docs using a custom Handlebars template and adds metadata to the meta tag in the head of the page using `templateOptions`: + +```bash +redocly build-docs ./openapi/api.yaml -t custom.hbs --templateOptions.metaDescription "Page meta description" +``` + +Sample custom Handlebars template: + +```handlebars + + + + {{title}} + + + + + {{{redocHead}}} + {{#unless disableGoogleFont}}{{/unless}} + + + {{{redocHTML}}} + + +``` diff --git a/@skills/redocly-cli/docs/@v1/commands/bundle.md b/@skills/redocly-cli/docs/@v1/commands/bundle.md new file mode 100644 index 000000000..9deee0483 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/bundle.md @@ -0,0 +1,131 @@ +# `bundle` + +## Introduction + +API descriptions can grow and become difficult to manage, especially if several teams are collaborating on them. It's a good practice to maintain the reusable parts as separate files, and include them in the main (root) API description by referencing them with `$ref`. However, most OpenAPI tools don't support that multi-file approach, and require a single-file API description. + +Redocly CLI can help you combine separate API description files (such as if you used the [`split`](./split.md) command) into one. The `bundle` command pulls the relevant parts of an API description into a single file output in JSON or YAML format. + +The `bundle` command differs from the [`join`](./join.md) command. The `bundle` command takes a root OpenAPI file as input and follows the `$ref` mentions to include all the referenced components into a single output file. The `join` command can combine multiple OpenAPI files into a single unified API description file. + +The `bundle` command first executes preprocessors, then rules, then decorators. + +## Usage + +```bash +redocly bundle ... +redocly bundle [--remove-unused-components] +redocly bundle [--config=] +redocly bundle ... -o --ext +redocly bundle --version +``` + +## Options + +| Option | Type | Description | +| -------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| apis | [string] | List of API description root filenames or names assigned in the `apis` section of your Redocly configuration file. Default values are names defined in the `apis` section of your configuration file. | +| --config | string | Specify the path to the [configuration file](#use-alternative-configuration-file). | +| --dereferenced, -d | boolean | Generate fully dereferenced bundle. | +| --ext | string | Specify the bundled file's extension. The possible values are `json`, `yaml`, or `yml`. The default value is `yaml`. | +| --extends | [string] | Can be used in combination with `--lint` to [extend a specific configuration](./lint.md#extend-configuration). The default values are taken from the Redocly configuration file. | +| --force, -f | boolean | Generate a bundle output even when errors occur. | +| --help | boolean | Show help. | +| --keep-url-references, -k | boolean | Preserve absolute URL references. | +| --lint-config | string | Specify the severity level for the configuration file.
**Possible values:** `warn`, `error`, `off`. The default value is `warn`. | +| --metafile | string | Path for the bundle metadata file. | +| --output, -o | string | Name or folder for the bundle file specified using the command line. If you don't specify the file extension, `.yaml` is used by default. If the specified folder doesn't exist, it's created automatically. **Overwrites existing bundler output file.** | +| --remove-unused-components | boolean | Remove unused components from the `bundle` output. | +| --skip-decorator | [string] | Ignore certain decorators. See the [Skip preprocessor, rule, or decorator section](#skip-preprocessor-rule-or-decorator). | +| --skip-preprocessor | [string] | Ignore certain preprocessors. See the [Skip preprocessor, rule, or decorator section](#skip-preprocessor-rule-or-decorator). | +| --version | boolean | Show version number. | + +## Examples + +### Bundle a single API description + +This command creates a bundled file at the path `dist/openapi.json` starting from the root API description file `openapi/openapi.yaml` and following the `$ref` to other files if appropriate. The bundled file is in JSON format. + +```bash +redocly bundle openapi/openapi.yaml --output dist/openapi.json +``` + +### Bundle multiple API descriptions + +This command creates one bundled file for each of the specified apis in the `dist/` folder. Bundled files are in JSON format. + +```bash Command +redocly bundle --output dist --ext json openapi/openapi.yaml openapi/museum.yaml +``` + +The `dist/` folder contents after the `bundle` command is executed: + +
+dist/openapi.json
+dist/museum.json
+
+ +Alternatively, you can specify the default `output` location for a bundled API in the `apis` section of your Redocly configuration file. +This is especially useful when bundling multiple APIs. + +```yaml +apis: + orders@v1: + root: orders/openapi.yaml + output: dist/orders.json + accounts@v1: + root: accounts/openapi.yaml + output: dist/accounts.json +``` + +Given the `redocly.yaml` configuration file above, the following command bundles the APIs `foo` and `bar` into the `dist/` folder. + +```bash +redocly bundle +``` + +Please note, that providing an API to the `bundle` command results in the command bundling only the specified API. +Additionally, the `--output` option is only meaningful when used with APIs specified in the command line. + +### Create a fully dereferenced bundle + +A fully dereferenced bundle does not use `$ref` at all, all the references are resolved and placed into the API description file. This can be useful if you need to prepare an OpenAPI file to be used by another tool that does not understand the `$ref` syntax. + +```bash +redocly bundle --dereferenced --output dist --ext json openapi/openapi.yaml openapi/museum.yaml +``` + +{% admonition type="warning" name="Note" %} +JSON output only works when there are no circular references. +{% /admonition %} + +### Use alternative configuration file + +By default, the CLI tool looks for the Redocly configuration file in the current working directory. Use the optional `--config` argument to provide an alternative path to a configuration file. + +```bash +redocly bundle --config=./another/directory/config.yaml +``` + +### Skip preprocessor, rule, or decorator + +You may want to skip specific preprocessors, rules, or decorators upon running the command. +{% tabs %} +{% tab label="Skip preprocessors" %} + +```bash +redocly bundle --skip-preprocessor=discriminator-mapping-to-one-of --skip-preprocessor=another-example +``` + +{% /tab %} +{% tab label="Skip decorators" %} + +```bash +redocly bundle --skip-decorator=generate-code-samples --skip-decorator=remove-internal-operations +``` + +{% /tab %} +{% /tabs %} +{% admonition type="success" name="Tip" %} +To learn more about preprocessors, rules, and decorators, refer to the [custom plugins](../custom-plugins/index.md) page. +{% /admonition %} diff --git a/@skills/redocly-cli/docs/@v1/commands/check-config.md b/@skills/redocly-cli/docs/@v1/commands/check-config.md new file mode 100644 index 000000000..5cb483005 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/check-config.md @@ -0,0 +1,39 @@ +# `check-config` + +## Introduction + +Use the `check-config` command to check that the content in a Redocly configuration file is valid and in the expected format. +Adding this check before using the configuration file with other commands can catch any problems at an early stage. +This command uses the same mechanism as our API linting to match a file against an expected data structure. + +## Usage + +```bash +redocly check-config +redocly check-config [--config=] +``` + +## Options + +| Option | Type | Description | +| ------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------- | +| --config | string | Specify path to the [configuration file](#use-alternative-configuration-file). | +| --lint-config | string | Specify the severity level for the configuration file.
**Possible values:** `warn`, `error`. Default value is `error`. | + +## Examples + +### Use default location for configuration file + +By default, the CLI tool looks for the [Redocly configuration file](../configuration/index.md) in the current working directory. + +```bash +redocly check-config +``` + +### Use alternative configuration file + +Use the optional `--config` argument to provide an alternative path to a configuration file. + +```bash +redocly check-config --config=./another/directory/config.yaml +``` diff --git a/@skills/redocly-cli/docs/@v1/commands/completion.md b/@skills/redocly-cli/docs/@v1/commands/completion.md new file mode 100644 index 000000000..defb35f08 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/completion.md @@ -0,0 +1,63 @@ +# `completion` + +## Introduction + +The `completion` command generates the scripts to add autocompletion to your bash or zsh shell. This addition is a handy productivity boost if you regularly use `redocly` from the command line. + +## Usage + +```bash +redocly completion +``` + +The output is a script for you to copy and paste, and add to the configuration file for your shell. The instructions are in the comments of the output. + +## Examples + +### See bash shell example + +To generate an autocompletion script, run the following command from a bash or zsh prompt: + +```bash +redocly completion +``` + +If run from a bash prompt, the `completion` command outputs the following autocompletion script: + +```sh +###-begin-redocly-completions-### +# +# yargs command completion script +# +# Installation: redocly completion >> ~/.bashrc +# or redocly completion >> ~/.bash_profile on OSX. +# +_redocly_yargs_completions() +{ + local cur_word args type_list + + cur_word="${COMP_WORDS[COMP_CWORD]}" + args=("${COMP_WORDS[@]}") + + # ask yargs to generate completions. + type_list=$(redocly --get-yargs-completions "${args[@]}") + + COMPREPLY=( $(compgen -W "${type_list}" -- ${cur_word}) ) + + # if no match was found, fall back to filename completion + if [ ${#COMPREPLY[@]} -eq 0 ]; then + COMPREPLY=() + fi + + return 0 +} +complete -o default -F _redocly_yargs_completions redocly +###-end-redocly-completions-### +``` + +The installation instructions are included in the output as comments, showing how to run the command and add it to the correct file: + +- `redocly completion >> ~/.bashrc` +- Or on OSX: `redocly completion >> ~/.bash_profile` + +If you use zsh shell, the `completion` command provides a similar output that is appropriate for your system. diff --git a/@skills/redocly-cli/docs/@v1/commands/eject.md b/@skills/redocly-cli/docs/@v1/commands/eject.md new file mode 100644 index 000000000..23e512ba0 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/eject.md @@ -0,0 +1,131 @@ +# `eject` + +## Introduction + +The `eject` command allows you to customize components by creating a local copy of their source code in your Redocly project. +Use this feature when you need to modify a component's styles, structure, or behavior beyond what's possible through configuration. + +Works with Redocly [Revel](https://redocly.com/revel), [Reef](https://redocly.com/reef), or [Realm](https://redocly.com/realm). + +## Usage + +```bash +redocly eject component +redocly eject component [--force] +redocly eject component [--project-dir=] +redocly eject --help +redocly eject --version +``` + +## Options + +| Option | Type | Description | +| --------------------- | ------- | ------------------------------------------------------------------------------------------------------------ | +| `component-path` | string | Path to the component or a glob pattern for multiple components. | +| `--force`, `-f` | boolean | Skip the "overwrite existing" confirmation when ejecting a component that already exists in the destination. | +| `--project-dir`, `-d` | string | Path to the project directory. The default value is `.` (current directory). | +| `--help` | boolean | Show help. | +| `--version` | boolean | Show version number. | + +## Examples + +If no component is found when running the `eject` command, then it prints a list of ejectable components. + +### Eject a single component + +Eject an individual component by passing its filepath. +Components are ejected to the `@theme` folder in the root of your project. + +The following command ejects the `Filter` component: + +```bash +redocly eject component 'Filter/Filter.tsx' +``` + +When ejected, the filepath to the ejected component prints to terminal. +In this example, the `Filter` component is ejected to `@theme/components/Filter/Filter.tsx`. + +### Eject multiple components + +Eject multiple components using the ejection prompt, which is triggered by passing `/**` wrapped in single quotes. + +The following command starts an ejection prompt for the `Footer` folder: + +```bash +redocly eject component 'Footer/**' +``` + +Use the ejection prompt to select and eject any components inside the `Footer` folder. + +#### Use ejection prompt + +Use your keyboard to navigate the ejection prompt. + +- Arrows move the cursor. +- Spacebar selects an item (file or folder). +- Enter ejects the selected items. + +Selecting an item adds a check mark. +Selecting a folder selects all its children items. + +#### Eject all components + +To eject all available components, pass the root folders and use the ejection prompt. + +```bash +redocly eject component 'components/**' +redocly eject component 'icons/**' +redocly eject component 'layouts/**' +redocly eject component 'markdoc/**' +``` + +You may need to scroll using the arrow keys to see all the components inside a folder. + +### Skip ejection override confirmation + +Use the `--force` option to skip the confirmation prompt when ejecting a component that already exists in the destination: + +```bash +redocly eject component 'components/Menu/MenuContainer.tsx' --force +``` + +By including `--force`, this example ejects the `MenuContainer` component to `@theme/components/Menu/MenuContainer.tsx` and replaces any existing file at that location _without a warning_. + +### Specify a project folder + +Use the `--project-dir` to provide a path to the project where you want to eject a component: + +```bash +redocly eject component 'components/Search/SearchDialog.tsx' --project-dir='museum-docs' +``` + +The following example shows a project structure after the example command runs from the `projects` folder: + +```treeview +projects/ +├── museum-docs/ +│ ├── @theme/ +│ │ └── components/ +│ │ └── Search/ +│ │ └── SearchDialog.tsx +│ ├── museum-api.json +│ ├── redocly.yaml +│ └── ... +├── storage-docs/ +└── authentication-docs/ +``` + +The `--project-dir` option is designed to help manage multiple projects by reducing the need for traversal. + +## Tips on using `eject` + +- Use `eject` when your customization needs outgrow [styling](https://redocly.com/docs/realm/style/how-to/customize-styles) or [configuration](https://redocly.com/docs/realm/config) capabilities. + +- A list of ejectable components is printed when no component is found by the `eject` command. + +- Ejected components only [override standard components](https://redocly.com/docs/realm/extend/how-to/eject-components#override-core-components) when the new component is located in your `@theme` folder with a matching path and filename. + +## Resources + +- Learn to [eject components](https://redocly.com/docs/realm/extend/how-to/eject-components) and unlock deeper project customization. +- See how component ejection is used to [add a new color mode](https://redocly.com/docs/realm/extend/how-to/add-color-mode). diff --git a/@skills/redocly-cli/docs/@v1/commands/generate-arazzo.md b/@skills/redocly-cli/docs/@v1/commands/generate-arazzo.md new file mode 100644 index 000000000..58b87ef42 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/generate-arazzo.md @@ -0,0 +1,130 @@ +--- +slug: + - /docs/cli/v1/commands/generate-arazzo + - /docs/respect/v1/commands/generate-arazzo +--- + +# `generate-arazzo` + +Auto-generate an Arazzo description based on an OpenAPI description file. + +{% admonition type="warning" %} + +Given the nature of OpenAPI, the generated Arazzo description is not a complete test file and may not function. Dependencies between endpoints are not resolved. + +It acts as a starting point for a test file and needs to be extended to be functional. +{% /admonition %} + +The first HTTP response is used as the success criteria for each step. + +## Usage + +```sh +npx @redocly/cli@latest generate-arazzo [-o | --output-file] +``` + +## Options + +{% table %} + +- Option {% width="20%" %} +- Type {% width="15%" %} +- Description + +--- + +- -o, --output-file +- string +- Name for the generated output file. Defaults to `auto-generated.arazzo.yaml` **If the file already exists, it's overwritten.** See the [specify output file](#specify-output-file) section. + +{% /table %} + +## Examples + +Run the command: `npx @redocly/cli@latest generate-arazzo 'https://warp-single-sidebar.redocly.app/_spec/apis/index.yaml'` + +The command generates an `auto-generated.arazzo.yaml` file in the current directory. + +The contents of the generated file are: + +```yaml {% title="auto-generated.arazzo.yaml" %} +arazzo: 1.0.1 +info: + title: Warp API + version: 1.0.0 +sourceDescriptions: + - name: warp + type: openapi + url: https://warp-single-sidebar.redocly.app/_spec/apis/index.yaml +workflows: + - workflowId: post-timelines-workflow + steps: + - stepId: post-timelines-step + operationId: $sourceDescriptions.warp.createTimeline + successCriteria: + - condition: $statusCode == 201 + - workflowId: get-timelines-workflow + steps: + - stepId: get-timelines-step + operationId: $sourceDescriptions.warp.listTimelines + successCriteria: + - condition: $statusCode == 200 + - workflowId: delete-timeline-{timeline_id}-workflow + steps: + - stepId: delete-timeline-{timeline_id}-step + operationId: $sourceDescriptions.warp.deleteTimeline + successCriteria: + - condition: $statusCode == 204 + - workflowId: post-travels-workflow + steps: + - stepId: post-travels-step + operationId: $sourceDescriptions.warp.timeTravel + successCriteria: + - condition: $statusCode == 200 + - workflowId: post-items-workflow + steps: + - stepId: post-items-step + operationId: $sourceDescriptions.warp.registerItem + successCriteria: + - condition: $statusCode == 200 + - workflowId: post-events-workflow + steps: + - stepId: post-events-step + operationId: $sourceDescriptions.warp.manipulateEvent + successCriteria: + - condition: $statusCode == 200 + - workflowId: post-anchors-workflow + steps: + - stepId: post-anchors-step + operationId: $sourceDescriptions.warp.setAnchor + successCriteria: + - condition: $statusCode == 201 + - workflowId: post-paradox-checks-workflow + steps: + - stepId: post-paradox-checks-step + operationId: $sourceDescriptions.warp.checkParadox + successCriteria: + - condition: $statusCode == 200 + - workflowId: get-monitor-timeline-workflow + steps: + - stepId: get-monitor-timeline-step + operationId: $sourceDescriptions.warp.monitorTimeline + successCriteria: + - condition: $statusCode == 200 +``` + +The generated file is not a complete test file and needs to be extended to be functional. + +### Specify output file + +By default, the CLI tool writes the generated file as `auto-generated.arazzo.yaml` in the current working directory. Use the optional `--output-file` argument to provide an alternative output file path. + +```bash Command +redocly generate-arazzo --output-file=arazzo-custom.yaml +``` + +## Resources + +- [Learn more about Arazzo](/learn/arazzo/what-is-arazzo). +- [Lint command](./lint.md) to lint your Arazzo description. +- [Respect command](./respect.md) to execute your Arazzo description. diff --git a/@skills/redocly-cli/docs/@v1/commands/images/lint-markdown.png b/@skills/redocly-cli/docs/@v1/commands/images/lint-markdown.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3d9570ff82d23754423c46612b792ba7fa896c GIT binary patch literal 54104 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 Kw)nYe;C}&3q7^Lw literal 0 HcmV?d00001 diff --git a/@skills/redocly-cli/docs/@v1/commands/index.md b/@skills/redocly-cli/docs/@v1/commands/index.md new file mode 100644 index 000000000..31c4cdd19 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/index.md @@ -0,0 +1,71 @@ +--- +tocMaxDepth: 2 +--- + +# Redocly CLI commands + +Documentation commands: + +- [`preview`](preview.md) Start a local preview of a Redocly project with one of the product NPM packages. +- [`translate`](translate.md) Generate translation keys for a Redocly Realm, Reef, or Revel project. +- [`eject`](eject.md) Eject and modify components from the core theme in a Redocly Realm, Reef, or Revel project. +- [`preview-docs`](preview-docs.md) Preview API reference docs for the specified API description. +- [`build-docs`](build-docs.md) Build API description into an HTML file. + +API management commands: + +- [`stats`](stats.md) Gather statistics for a document. +- [`bundle`](bundle.md) Bundle API description. +- [`split`](split.md) Split API description into a multi-file structure. +- [`join`](join.md) Join API descriptions [experimental feature]. + +Linting commands: + +- [`lint`](lint.md) Lint API description. +- [`check-config`](check-config.md) Lint Redocly configuration file. + +Testing commands: + +- [`respect`](respect.md) Execute API tests described in an Arazzo description. +- [`generate-arazzo`](generate-arazzo.md) Generate an Arazzo description from an OpenAPI description. + +Redocly platform commands: + +- [`login`](login.md) Log in to Reunite or to the Redocly API registry with an access token. +- [`logout`](logout.md) Clear your stored credentials. +- [`push`](push.md) Push an API description to the Redocly API registry. +- [`push-status`](push-status.md) Track an in-progress push operation to Reunite. + +Supporting commands: + +- [`completion`](completion.md) Generate autocomplete commands (includes install instructions). + +## Additional options + +There are some parameters supported by all commands: + +`--version` display the current version of `redocly`. + +`--help` display the command help, or the help for the subcommand if you used one. For example: + +```bash +npx @redocly/cli@latest lint --help +``` + +Try these with any of the other commands. + +## Config file + +Redocly CLI comes with one primary configuration file (`redocly.yaml`), also known as the Redocly configuration file. +This file defines all of the config options available to you, including the location of your files (for unbundling and bundling), and linting rules (for validation against the OpenAPI Specification). + +The Redocly configuration file must sit in your root directory. +If Redocly CLI finds `redocly.yaml` in the root directory, it uses the options set in that file when executing commands. + +You can also specify a config file to most commands using `--config myconfig.yaml` as part of the command. For example: + +```bash +npx @redocly/cli@latest lint --config redocly-official.yaml openapi.yaml +``` + +For more information, refer to the [Redocly configuration file](../configuration/index.md) docs. diff --git a/@skills/redocly-cli/docs/@v1/commands/join.md b/@skills/redocly-cli/docs/@v1/commands/join.md new file mode 100644 index 000000000..ac46f6cae --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/join.md @@ -0,0 +1,263 @@ +# `join` + +## Introduction + +{% admonition type="warning" name="Important" %} +The `join` command is considered an experimental feature. This means it's still a work in progress and may go through major changes. + +The `join` command supports OpenAPI 3.x descriptions only. +{% /admonition %} + +Maintainers of multiple API descriptions can benefit from storing each endpoint as a standalone API description file. However, this approach is not supported by the majority of OpenAPI tools, as they require a single API description file. With Redocly CLI, you can solve this problem by using the `join` command to combine two or more API description files into a single one. + +The `join` command differs from the [`bundle`](./bundle.md) command. The `bundle` command takes a root OpenAPI file as input and follows the `$ref` mentions to include all the referenced components into a single output file. The `join` command can combine multiple OpenAPI files into a single unified API description file. + +To easily distinguish the origin of OpenAPI objects and properties, you can optionally instruct the `join` command to prepend custom prefixes to them. + +The `join` command accepts both YAML and JSON files, which you can mix in the resulting `openapi.yaml` or `openapi.json` file. Setting a custom name and extension for this file can be achieved by providing it through the `--output` argument. Any existing file is overwritten. If the `--output` option is not provided, the command uses the extension of the first entry point file. + +Apart from providing individual API description files as the input, you can also specify the path to a folder that contains multiple API description files and match them with a wildcard (for example, `myproject/openapi/*.(yaml/json)`). The `join` command collects all matching files and combines them into one file. + +We recommend running [`lint`](./lint.md) before joining API descriptions to ensure that they are valid and meet the expected standards. +You may also want to use [decorators](./../decorators.md) to add any filtering or transformation needed for your API descriptions, either before or after combining. + +## Usage + +```bash +redocly join ... +redocly join ... -o +redocly join [--help] [--prefix-components-with-info-prop] [--prefix-tags-with-info-prop] [--prefix-tags-with-filename] + +redocly join first-api.yaml second-api.yaml +redocly join first-api.yaml second-api.json +redocly join first-api.yaml second-api.json -o openapi-custom.yaml +redocly join ./*.yaml +redocly join --version +``` + +## Options + +| Option | Type | Description | +| ---------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| apis | [string] | **REQUIRED.** 1. Array of paths to API description files that you want to join. At least two input files are required.
2. A wildcard pattern to match API description files within a specific folder. | +| --config | string | Specify path to the [configuration file](../configuration/index.md). | +| --help | boolean | Show help. | +| --lint-config | string | Specify the severity level for the configuration file.
**Possible values:** `warn`, `error`, `off`. Default value is `warn`. | +| --output, -o | string | Name for the joined output file. Defaults to `openapi.yaml` or `openapi.json` (depends on the extension of the first input file). **If the file already exists, it's overwritten.** See the [specify output file](#specify-output-file) section. | +| --prefix-components-with-info-prop | string | Prefix components with property value from info object. See the [resolve conflicting component names](#resolve-conflicting-component-names) section. | +| --prefix-tags-with-filename | boolean | Prefix tags with property value from file name. See the [prefix tags with filename](#prefix-tags-with-filename) section. | +| --prefix-tags-with-info-prop | string | Prefix tags with property value from info object. See the [prefix tags with specified info property](#prefix-tags-with-specified-info-property) section. | +| --version | boolean | Show version number. | +| --without-x-tag-groups | boolean | Skip automated `x-tagGroups` creation. See the [avoid tag duplication](#avoid-tag-duplication) section. | + +{% admonition type="warning" %} +These options are mutually exclusive: `without-x-tag-groups`, `prefix-tags-with-filename`, and `prefix-tags-with-info-prop`. +{% /admonition %} + +## Examples + +### Specify an array of paths + +This command combines the API description files that are passed in: + +```bash +redocly join first-api.yaml second-api.json +``` + +The output file `openapi.yaml` is created in the working directory: + +The order of input files affects how their content is processed. The first provided file is always treated as the "main" file, and its content has precedence over other input files when combining them. Specifically, the following properties of the API description are always taken only from the first input file: + +
+info:
+  version
+  title
+  termsOfService
+  contact
+  license
+externalDocs
+
+ +By default, the `info.description` property is taken only from the first file, even if it exists in other input files. + +However, if any of the input files contain the `tags` object, the `join` command automatically creates the `x-tagGroups` object in the output file. + +
+x-tagGroups:
+  - name: first-api
+    tags:
+      - expanded
+      - other
+  - name: second-api
+    tags:
+      - partner
+
+ +Use the [`--without-x-tag-groups`](#avoid-tag-duplication) option to skip the creation and population of `x-tagGroups` in the output file. + +{% admonition type="info" %} +If some operations in an input file don't have a tag assigned to them, the `join` command automatically adds the `other` tag to those operations in the output file. The `other` tag is also included in the `x-tagGroups` object. + +If any of the input files contain the `x-tagGroups` object, the content of this object is ignored by the `join` command and not included in the output file. + +The `info.title` field is used as a name in `x-tagGroups` instead of a file name for the `join` command, so you can join files with the same names. If you need to adjust the `info.title` field, you can also use the [info-override decorator](https://redocly.com/docs/cli/decorators/info-override/). + +{% /admonition %} + +The `servers` object combines the content from all input files, starting with the content from the first file. Commented lines are not included in the output file. + +Path names and component names must be unique in all input files, but their content doesn't have to be unique for the `join` command to produce the output file. For each path item object, only the operation ID must be unique. + +If the `join` command detects any conflicting content while trying to combine the input files, it displays informative messages about the conflicts and exits without creating an output file. To prevent this, use optional parameters to add prefixes to tags and components. + +
+Conflict on tags => all : tickets in files: museum.yaml,exhibition.yaml
+
+1 conflict(s) on tags.
+Suggestion: please use prefix-tags-with-filename, prefix-tags-with-info-prop or without-x-tag-groups to prevent naming conflicts.
+
+Conflict on paths => /tickets : get in files: museum.yaml,exhibition.yaml
+Conflict on paths => /tickets : post in files: museum.yaml,exhibition.yaml
+Conflict on paths => operationIds : listEvents in files: museum.yaml,exhibition.yaml
+Conflict on paths => operationIds : createEvent in files: museum.yaml,exhibition.yaml
+Conflict on paths => operationIds : getEvent in files: museum.yaml,exhibition.yaml
+Conflict on paths => /tickets/{Id} : get in files: museum.yaml,exhibition.yaml
+
+Please fix conflicts before running join.
+
+ +### Prefix tags with specified `info` property + +If any of the input files contain the `tags` object, tags in the output file are prefixed by the selected property from the `info` object of the corresponding input file. + +The output file preserves the original tag names as the value of the `x-displayName` property for each tag. + +This command uses the `title` property as the prefix: + +```bash +redocly join first-api.yaml second-api.json --prefix-tags-with-info-prop title +``` + +The following is the example output: + +
+- name: First Document title_endpoints
+  description: endpoints tag description
+  x-displayName: endpoints
+
+- name: Second document title_events
+  description: events tag description
+  x-displayName: events
+
+ +### Prefix tags with filename + +If any of the input files contain the `tags` object, tags in the output file are prefixed by the filename of the corresponding input file. + +The output file preserves the original tag names as the value of the `x-displayName` property for each tag. + +This command sets the `--prefix-tags-with-filename` option: + +```bash +redocly join first-api.yaml second-api.json --prefix-tags-with-filename true +``` + +The following is the example output: + +
+- name: first-api_endpoints
+  description: endpoints tag description
+  x-displayName: endpoints
+
+- name: second-api_events
+  description: events tag description
+  x-displayName: events
+
+ +### Avoid tag duplication + +If you have the same tags in multiple API descriptions, you can avoid tag duplication by using the `without-x-tag-groups` option. In this case, the `x-tagGroups` property is not created in the joined file. + +This command sets the `--without-x-tag-groups` option: + +```bash Command +redocly join first-api.yaml second-api.json --without-x-tag-groups +``` + +The tag description is taken from the first file that contains the tag. You may see a warning about conflicts in the command output: + +
+warning: 1 conflict(s) on tags description.
+
+openapi.yaml: join processed in 69ms
+
+ +### Resolve conflicting component names + +If any of the input files have conflicting component names, this option can be used to resolve that issue and generate the output file. All component names in the output file are prefixed by the selected property from the `info` object of the corresponding input file(s). + +This command uses the `version` property as the prefix: + +```bash +redocly join museum_v1.yaml museum_v2.json --prefix-components-with-info-prop version +``` + +The following is the example output: + +
+components:
+  schemas:
+    1.0.0_BuyMuseumTicketsRequest:
+      description: Request payload used for purchasing museum tickets.
+      type: object
+      properties:
+        ticketType:
+          $ref: '#/components/schemas/1.0.0_TicketType'
+        eventId:
+          description: >-
+            Unique identifier for a special event. Required if purchasing
+            tickets for the museum's special events.
+          $ref: '#/components/schemas/1.0.0_1.0.0_EventId'
+        ticketDate:
+          description: Date that the ticket is valid for.
+          $ref: '#/components/schemas/1.0.0_1.0.0_Date'
+        email:
+          $ref: '#/components/schemas/1.0.0_Email'
+        phone:
+          $ref: '#/components/schemas/1.0.0_Phone'
+      required:
+        - ticketType
+        - ticketDate
+        - email
+    1.2.0_BuyMuseumTicketsRequest:
+      description: Request payload used for purchasing museum tickets.
+      type: object
+      properties:
+        ticketType:
+          $ref: '#/components/schemas/1.2.0_TicketType'
+        eventId:
+          description: >-
+            Unique identifier for a special event. Required if purchasing
+            tickets for the museum's special events.
+          $ref: '#/components/schemas/1.2.0_1.2.0_EventId'
+        ticketDate:
+          description: Date that the ticket is valid for.
+          $ref: '#/components/schemas/1.2.0_1.2.0_Date'
+        email:
+          $ref: '#/components/schemas/1.2.0_Email'
+        phone:
+          $ref: '#/components/schemas/1.2.0_Phone'
+      required:
+        - ticketType
+        - ticketDate
+        - email
+
+
+ +### Specify output file + +By default, the CLI tool writes the joined file as `openapi.yaml` or `openapi.json` in the current working directory. Use the optional `--output` argument to provide an alternative output file path. + +```bash Command +redocly join --output=openapi-custom.yaml +``` diff --git a/@skills/redocly-cli/docs/@v1/commands/lint.md b/@skills/redocly-cli/docs/@v1/commands/lint.md new file mode 100644 index 000000000..55d9c4e2d --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/lint.md @@ -0,0 +1,395 @@ +# `lint` + +## Introduction + +Redocly CLI can identify and report on problems found in OpenAPI or Arazzo descriptions. This helps you avoid bugs and make API or Arazzo descriptions more consistent. + +The `lint` command reports on problems and executes preprocessors and rules. Unlike the `bundle` command, `lint` doesn't execute decorators. + +{% admonition type="success" name="Tip" %} +To learn more about choosing and configuring linting rules to meet your needs, visit the [API standards](../api-standards.md) page. +{% /admonition %} + +## Usage + +```bash +redocly lint +redocly lint ... +redocly lint [--max-problems=] [--config=] [--format=] +redocly lint [--generate-ignore-file] [--help] +redocly lint --version +``` + +## Options + +| Option | Type | Description | +| ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| apis | [string] | Array of API or Arazzo description filenames that need to be linted. See [the API section](#specify-api) for more options. | +| --config | string | Specify path to the [configuration file](#use-custom-configuration-file). | +| --extends | [string] | [Extend a specific configuration](#extend-configuration) (defaults or config file settings). Build-in rulesets are: `minimal`, `recommended`, `recommended-strict`. Default value is `recommended`. | +| --format | string | Format for the output.
**Possible values:** `codeframe`, `stylish`, `json`, `checkstyle`, `codeclimate`, `github-actions`, `markdown`, `summary`. Default value is `codeframe`. | +| --generate-ignore-file | boolean | [Generate ignore file](#generate-ignore-file). | +| --help | boolean | Show help. | +| --lint-config | string | Specify the severity level for the configuration file.
**Possible values:** `warn`, `error`, `off`. Default value is `warn`. | +| --max-problems | integer | Truncate output to display the specified [maximum number of problems](#limit-the-displayed-problems-count). Default value is 100. | +| --skip-preprocessor | [string] | Ignore certain preprocessors. See the [Skip preprocessor or rule section](#skip-preprocessor-or-rule) below. | +| --skip-rule | [string] | Ignore certain rules. See the [Skip preprocessor or rule section](#skip-preprocessor-or-rule) below. | +| --version | boolean | Show version number. | + +## Examples + +### Specify API + +The `lint` command behaves differently depending on how you pass the API(s) to it, and whether the [configuration file](#use-custom-configuration-file) exists. + +#### Pass API directly + +```bash +redocly lint openapi/openapi.yaml +``` + +In this case, `lint` validates the API or Arazzo description(s) passed to the command. If you have no configuration file defined, the [recommended ruleset](../rules/recommended.md) is used. If you have `extends` or `rules` defined in `redocly.yaml`, those are used when linting. + +The `apis` argument can also use any glob format supported by your file system. For example: + +```bash +redocly lint ./root-documents/*.yaml +``` + +#### Pass API alias + +Instead of full paths, you can use names listed in the `apis` section of your Redocly configuration file. The example `redocly.yaml` configuration file below shows an API alias `core@v1` defined: + +```yaml +apis: + core@v1: + root: ./openapi/api-description.json +``` + +Use the alias with the lint command as shown: + +```bash +redocly lint core@v1 +``` + +In this case, after resolving the path behind the `core@v1` name, `lint` validates the `api-description.json` file. For this approach, the Redocly configuration file is mandatory. + +#### Lint all configured APIs + +You can omit the `apis` argument completely when executing the `lint` command to check all APIs defined in the configuration file. Run `redocly lint` with no arguments to lint all defined APIs. An example `redocly.yaml` file is shown below: + +```yaml +apis: + core@v1: + root: ./openapi/api-description.json + production: + root: ./openapi/production.yaml + sandbox: + root: ./openapi/sandbox.yaml +``` + +{% admonition type="warning" name="Important" %} +If you try to execute the `lint` command without apis when your project doesn't have any configuration files, the `lint` command displays an error. +{% /admonition %} + +### Use custom configuration file + +By default, the CLI tool looks for the [Redocly configuration file](../configuration/index.md) in the current working directory. Use the optional `--config` argument to provide an alternative path to a configuration file. + +```bash +redocly lint --config=./another/directory/config.yaml +``` + +### Extend configuration + +The `--extends` option allows you to extend the existing configuration. This option accepts one of the following values: `minimal`, `recommended`, or `recommended-strict`. Each of the values is a base set of rules that the `lint` command uses. You can further modify this set in cases when you want to have your own set of rules based on the existing one, including particular rules that cover your specific needs. For more details, see [rulesets](../rules.md). + +```bash +redocly lint --extends=recommended-strict +``` + +{% admonition type="warning" name="Important" %} +When you run the `lint` command without a configuration file, it uses the `extends: [recommended]` by default. +However, if you have a configuration file, but it doesn't include any rules or extends configuration, the `lint` command displays an error. +{% /admonition %} + +### Specify output format + +The standard `codeframe` output format works well in most situations, but `redocly` can also produce output to integrate with other tools. + +{% admonition type="warning" name="Lint one API at a time" %} +Some formats, such as `checkstyle` or `json`, don't work well when multiple APIs are linted in a single command. Try linting each API separately when you pass the command output to another tool. +{% /admonition %} + +#### Codeframe (default) + +```bash +redocly lint --format=codeframe +``` + +This command lints the file and uses the default output format of `codeframe`. It has the same behavior as omitting the `--format` parameter. Here's an output example: + +
+[1] museum-with-errors.yaml:19:7 at #/paths/~1museum-hours/get/operationIds
+
+Property `operationIds` is not expected here.
+
+Did you mean: operationId ?
+
+17 | summary: Get museum hours
+18 | description: Get upcoming museum operating hours
+19 | operationIds: getMuseumHours
+20 | tags:
+21 |   -  Operations
+
+Error was generated by the spec rule.
+
+ +Note that the problems are displayed in the following format: `file:line:column`. For example, `museum-with-errors.yaml:19:7`. + +Depending on the terminal emulator you use, it may be possible to directly click this indicator to edit the file in place. + +#### Stylish + +```bash +redocly lint --format=stylish +``` + +This command uses the `stylish` format to get a more condensed output that is useful for summarizing the linting results, as seen in the example below: + +
+museum-with-errors.yaml:
+  19:7   error    spec                   Property `operationIds` is not expected here.
+  29:11  error    spec                   Property `require` is not expected here.
+  16:5   warning  operation-operationId  Operation object should contain `operationId` field.
+
+ +In this format, `lint` shows the file name, line number, and column where the problem occurred. However, the output is compressed and omits other contexts and suggestions. + +#### JSON + +```bash +redocly lint --format=json +``` + +It can be useful to get the output in JSON format to be processed by other tools. Using this command gets the following example output: + +
+{
+  "totals": {
+    "errors": 2,
+    "warnings": 1,
+    "ignored": 0
+  },
+  "version": "1.7.0",
+  "problems": [
+    {
+      "ruleId": "spec",
+      "severity": "error",
+      "message": "Property `operationIds` is not expected here.",
+      "suggest": [
+        "operationId"
+      ],
+      "location": [
+        {
+          "source": {
+            "ref": "museum-with-errors.yaml"
+          },
+          "pointer": "#/paths/~1museum-hours/get/operationIds",
+          "reportOnKey": true
+        }
+      ]
+    },
+    {
+      "ruleId": "spec",
+      "severity": "error",
+      "message": "Property `require` is not expected here.",
+      "suggest": [],
+      "location": [
+        {
+          "source": {
+            "ref": "museum-with-errors.yaml"
+          },
+          "pointer": "#/paths/~1museum-hours/get/responses/200/require",
+          "reportOnKey": true
+        }
+      ]
+    },
+    {
+      "ruleId": "operation-operationId",
+      "severity": "warn",
+      "message": "Operation object should contain `operationId` field.",
+      "location": [
+        {
+          "source": {
+            "ref": "museum-with-errors.yaml"
+          },
+          "pointer": "#/paths/~1museum-hours/get/operationId",
+          "reportOnKey": true
+        }
+      ],
+      "suggest": []
+    }
+  ]
+}
+
+ +#### Checkstyle + +```bash +redocly lint --format=checkstyle +``` + +The `lint` command also supports the [Checkstyle](https://checkstyle.org/) XML report format. Use this command to get the following standard format output to use with your other tools: + +```xml + + + + + + + + +``` + +Due to the limitations of this format, only file name, line, column, severity, +and rule ID (in the `source` attribute) are included. All other information is +omitted. + +#### GitHub Actions + +```bash +redocly lint --format=github-actions +``` + +The `lint` command also comes with support for a [GitHub Actions](https://docs.github.com/en/actions) specific formatting. +Specify this output format to have any encountered problem annotated on the affected files. + +
+::error title=spec,file=museum-with-errors.yaml,line=19,endLine=19,col=7,endColumn=7::Property `operationIds` is not expected here.
+::error title=spec,file=museum-with-errors.yaml,line=29,endLine=29,col=11,endColumn=11::Property `require` is not expected here.
+::warning title=operation-operationId,file=museum-with-errors.yaml,line=16,endLine=16,col=5,endColumn=5::Operation object should contain `operationId` field.
+
+ +#### Markdown + +Use `markdown` format output with the `lint` command to get a Markdown-ready output format. +This output format is useful if you want to report the outcomes to a document, or use the information in a GitHub Job Summary. + +Running the `lint` command with `--format=markdown` produces output like the following example: + +
+## Lint: ./museum-with-errors.yaml
+
+| Severity | Location | Problem | Message |
+|---|---|---|---|
+| error | line 42:11 | [spec](https://redocly.com/docs/cli/rules/spec/) | Must contain at least one of the following fields: schema, content. |
+| error | line 44:11 | [spec](https://redocly.com/docs/cli/rules/spec/) | Property `type` is not expected here. |
+
+Validation failed
+Errors: 2
+
+ +The output includes a formatted table, and links to any built-in rules that identified problems. +An example is shown in the following screenshot. + +![Output of the lint command, Markdown rendered as HTML](./images/lint-markdown.png) + +### Limit the displayed problems count + +With the `--max-problems` option, you can limit the number of problems displayed in the command output. Here's an example command: + +```bash +redocly lint --max-problems=20 +``` + +If the number of detected problems exceeds the specified threshold, the remaining problems are hidden under the "spoiler message" that lets you know how many problems were hidden. + +
+< ... 2 more problems hidden > increase with `--max-problems N`
+
+ +Note that the default value is `100`. + +### Generate ignore file + +With this option, you can generate the `.redocly.lint-ignore.yaml` file to suppress error and warning severity problems in the output. You still receive visual feedback to let you know how many problems were ignored. + +This option is useful when you have an API design standard, but have some exceptions to the rule (for example, a legacy API operation). It allows for highly granular control. + +{% admonition type="warning" %} +This command overwrites an existing ignore file. +{% /admonition %} + +The following command runs `lint` and adds all the errors to an ignore file: + +```bash +redocly lint museum-with-errors.yaml --generate-ignore-file +``` + +Here's the example output: + +
+Generated ignore file with 3 problems.
+
+ +The errors in the ignore file `.redocly.lint-ignore.yaml` are ignored when the `lint` command is run. + +To generate an ignore file for multiple API descriptions, pass them as arguments: + +```bash +redocly lint v1.yaml v2.yaml --generate-ignore-file +``` + +Example of an ignore file: + +```yaml .redocly.lint-ignore.yaml file +# This file instructs Redocly's linter to ignore the rules contained for specific parts of your API. +# See https://redoc.ly/docs/cli/ for more information. +museum-with-errors.yaml: + spec: + - '#/paths/~1museum-hours/get/operationIds' + - '#/paths/~1museum-hours/get/responses/200/require' + operation-operationId: + - '#/paths/~1museum-hours/get/operationId' +``` + +The rule in the example is named `spec`, which indicates compliance with the OpenAPI spec. You can also manually add problems that should be ignored to specific rules. + +### Skip preprocessor or rule + +You may want to skip specific preprocessors or rules upon running the command. Examples for each option are as follows: + +{% tabs %} +{% tab label="Skip preprocessors" %} + +```bash +redocly lint --skip-preprocessor=discriminator-mapping-to-one-of --skip-preprocessor=another-example +``` + +{% /tab %} +{% tab label="Skip rules" %} + +```bash +redocly lint --skip-rule=no-sibling-refs --skip-rule=no-parent-tags +``` + +{% /tab %} +{% /tabs %} + +To learn more about preprocessors, rules, and decorators, refer to the [custom plugins](../custom-plugins/index.md) page. + +### Lint config file + +The `lint` command also validates the configuration file. You may want to set severity level by using the `--lint-config` option. This option accepts one of the following values: `warn`,`error`,`off`. Default value is `warn`. + +```bash +redocly lint --lint-config=off +``` + +### Lint Arazzo description file + +The `lint` command also validates [The Arazzo](https://spec.openapis.org/arazzo/latest.html) description files. You can pass the Arazzo description file to the `lint` command as shown below: + +`redocly lint arazzo.yaml` diff --git a/@skills/redocly-cli/docs/@v1/commands/login.md b/@skills/redocly-cli/docs/@v1/commands/login.md new file mode 100644 index 000000000..e40b2c12c --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/login.md @@ -0,0 +1,68 @@ +# `login` + +## Introduction + +Use the `login` command to authenticate to the API registry. + +When you log in, the [`preview-docs`](./preview-docs.md) command starts a preview server using [Redocly API reference docs](https://redocly.com/reference/) with all of the premium features. Users who are not logged in see a [Redoc community edition](https://redocly.com/redoc/) version of their documentation. + +After logging in, you can also access your members-only (private) API descriptions in the Redocly registry, and use the [`push`](./push.md) command. + +If you're having issues with the `login` command, use the `--verbose` option to display a detailed error trace (if any). + +## Usage + +{% admonition type="warning" name="Note" %} +To log in, a personal API key is required. See [generate a personal API key](https://redocly.com/docs/settings/personal-api-keys/). +{% /admonition %} + +```bash +redocly login [--help] [--verbose] [--version] + +redocly login --verbose +``` + +To authenticate using **Reunite** API, use the `--next` option. + +```bash +redocly login --next +``` + +Note that logging in with **Reunite** API does not allow you to use the `push` command. + +## Options + +| Option | Type | Description | +| ------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| --config | string | Specify path to the [configuration file](../configuration/index.md). | +| --help | boolean | Show help. | +| --residency, --region, -r | string | Specify the application's residency. Supported values: `us`, `eu`, or a full URL. The `eu` region is limited to enterprise customers. Default value is `us`. | +| --verbose | boolean | Display additional output. | +| --version | boolean | Show version number. | +| --next | boolean | Authenticate through Reunite API. | + +## Examples + +### View successful login message + +A confirmation message is displayed with a successful login: + +
+redocly login
+  🔑 Copy your API key from https://app.redocly.com/profile and paste it below:
+
+  Logging in...
+  Authorization confirmed. ✅
+
+ +### View failed login message + +An error message is displayed with a failed login: + +
+redocly login
+  🔑 Copy your API key from https://app.redocly.com/profile and paste it below:
+
+  Logging in...
+  Authorization failed. Please check if you entered a valid API key.
+
diff --git a/@skills/redocly-cli/docs/@v1/commands/logout.md b/@skills/redocly-cli/docs/@v1/commands/logout.md new file mode 100644 index 000000000..840922ebf --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/logout.md @@ -0,0 +1,32 @@ +# `logout` + +## Introduction + +Use the `logout` command to clear the API key from your device. +You may want to `logout` if you are using a shared work computer or want to [`login`](./login.md) with another API key. + +## Usage + +```bash +redocly logout [--help] [--version] + +redocly logout --version +``` + +## Options + +| Option | Type | Description | +| --------- | ------- | -------------------- | +| --help | boolean | Show help. | +| --version | boolean | Show version number. | + +## Examples + +### View successful logout message + +A confirmation message is displayed with a successful logout: + +
+redocly logout
+Logged out from the Redocly account. ✋
+
diff --git a/@skills/redocly-cli/docs/@v1/commands/preview-docs.md b/@skills/redocly-cli/docs/@v1/commands/preview-docs.md new file mode 100644 index 000000000..03b8cf655 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/preview-docs.md @@ -0,0 +1,146 @@ +# `preview-docs` + +## Introduction + +With the `preview-docs` command, you can generate documentation previews for API descriptions on your local machine. +Use the previews to develop your API descriptions locally before deployment. + +If you have a license key or API key configured, the output is a preview of the premium [Redocly API reference docs](https://redocly.com/reference/). Otherwise, it is a preview of [Redoc community edition](https://redocly.com/redoc/). + +{% admonition type="success" name="Tip" %} +To preview docs using the premium Redocly API reference docs, you must first authenticate to the API registry with the [`login`](./login.md) command. +{% /admonition %} + +## Usage + +```bash +redocly preview-docs +redocly preview-docs [--config=] [--port=] [--host=] +redocly preview-docs [--force] [--help] [--version] +redocly preview-docs --version +``` + +## Options + +| Option | Type | Description | +| ----------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| api | string | Path to the API description filename or alias that you want to generate the preview for. Refer to [the API section](#specify-api) for more details. | +| --config | string | Specify path to the [configuration file](#use-alternative-configuration-file). | +| --force, -f | boolean | Generate preview output even when errors occur. | +| --help | boolean | Show help. | +| --host, -h | string | The host where the documentation preview can be accessed. The default value is `127.0.0.1`. | +| --lint-config | string | Specify the severity level for the configuration file.
**Possible values:** `warn`, `error`, `off`. Default value is `warn`. | +| --port, -p | integer | The port where the documentation preview can be accessed. You can set any port number over 1024 as long as it is not already being used. The default value is port `8080`. | +| --skip-decorator | [string] | Ignore [certain decorators](#skip-preprocessor-or-decorator). | +| --skip-preprocessor | [string] | Ignore [certain preprocessors](#skip-preprocessor-or-decorator). | +| --use-community-edition | boolean | Use Redoc Community Edition for docs preview. | +| --version | boolean | Show version number. | + +## Examples + +### Specify API + +The `preview-docs` command behaves differently depending on how you pass the API to it, and whether the [configuration file](#use-alternative-configuration-file) exists. + +#### Pass an API directly + +```bash +redocly preview-docs openapi/openapi.yaml +``` + +In this case, `preview-docs` previews the API description that was passed to the command. Any configuration file is ignored. + +#### Pass an API alias + +Instead of a full path, you can use an API name from the `apis` section of your Redocly configuration file. +For example, with a `redocly.yaml` configuration file containing the following entry for `core@v1`: + +```yaml +apis: + core@v1: + root: ./openapi/api-description.json +``` + +You can generate a preview by giving the API alias name, as shown below: + +```bash +redocly preview-docs core@v1 +``` + +In this case, after resolving the path behind the `core@v1` name, `preview-docs` generates a preview of the `api-description.json` file. For this approach, the Redocly configuration file is mandatory. + +### Use alternative configuration file + +By default, the CLI tool looks for the [Redocly configuration file](../configuration/index.md) in the current working directory. Use the optional `--config` argument to provide an alternative path to a configuration file: + +```bash +redocly preview-docs --config=./another/directory/config.yaml +``` + +### Use custom port for preview + +By default, without using the `port` option, the preview starts on port `8080`, so you can access the docs at `http://localhost:8080` + +To specify a custom port for the preview, pass the desired value using either short or long option format: +{% tabs %} +{% tab label="Short format" %} + +```bash +redocly preview-docs -p 8888 openapi/openapi.yaml +``` + +{% /tab %} +{% tab label="Long format" %} + +```bash +redocly preview-docs -port 8888 openapi/openapi.yaml +``` + +{% /tab %} +{% /tabs %} + +Both commands start the preview on port `8888`, so you can access the docs at `http://localhost:8888`. + +### Use custom host for preview + +By default, without using the `host` option, the preview starts on host `127.0.0.1`, so you can access the docs at `http://127.0.0.1:8080` or `http://localhost:8080`. + +To specify a custom host for the preview, pass the desired value using either short or long option format: +{% tabs %} +{% tab label="Short format" %} + +```bash +redocly preview-docs -h 0.0.0.0 openapi/openapi.yaml +``` + +{% /tab %} +{% tab label="Long format" %} + +```bash +redocly preview-docs --host 0.0.0.0 openapi/openapi.yaml +``` + +{% /tab %} +{% /tabs %} + +Both commands start the preview on host `0.0.0.0`, so you can access the docs at `http://0.0.0.0:8080` + +### Skip preprocessor or decorator + +You may want to skip specific preprocessors, rules, or decorators upon running the command. +{% tabs %} +{% tab label="Skip preprocessors" %} + +```bash +redocly preview-docs --skip-preprocessor=discriminator-mapping-to-one-of --skip-preprocessor=another-example +``` + +{% /tab %} +{% tab label="Skip decorators" %} + +```bash +redocly preview-docs --skip-decorator=generate-code-samples --skip-decorator=remove-internal-operations +``` + +{% /tab %} +{% /tabs %} diff --git a/@skills/redocly-cli/docs/@v1/commands/preview.md b/@skills/redocly-cli/docs/@v1/commands/preview.md new file mode 100644 index 000000000..f5bbff756 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/preview.md @@ -0,0 +1,65 @@ +# `preview` + +## Introduction + +The `preview` command starts a local preview server for a Redocly project. Use the preview server to develop your project locally before deployment. + +## Usage + +```bash +redocly preview +redocly preview --product=revel +redocly preview --product=reef --plan=pro +redocly preview --product=reef --plan=pro --project-dir=./my-docs-project --port=4001 +``` + +## Options + +| Option | Type | Description | +| ----------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| --help | boolean | Show help. | +| --plan | string | Product plan to use in preview.
**Possible values:** `pro`, `enterprise`. The default value is `enterprise`. For more details, see [plans](https://redocly.com/pricing/). | +| --product | string | Name of a product to preview the project with.
**Possible values:** `redoc`, `revel`, `reef`, `realm`, `redoc-revel`, `redoc-reef`, `revel-reef`.
`redoc` is the flagship product for generating API documentation from OpenAPI specifications.
`revel` is a specialized product designed for external API applications.
`reef` is a specialized product designed for internal API needs.
`realm` is a balanced product combining `redoc`, `revel`, and `reef`.
`redoc-revel` is a blended product combining `redoc` and `revel`.
`redoc-reef` is a blended product combining `redoc` and `reef`.
`revel-reef` is a blended product combining `revel` and `reef`.
The default value is autodetected from the project's `package.json` or `realm` is used. | +| --project-dir, -d | string | Path to the project directory. The default value is `.` (current directory). | +| --port, -p | number | The port to run the preview server on. The default value is `4000`. | +| --version | boolean | Show version number. | + +## Examples + +### Select a product for preview + +Specify the product package to use by setting the `--product` option. +If this setting is not supplied, the preview command tries to guess which package to use from the project's `package.json` or use `realm` by default. + +```bash +redocly preview --product=revel +``` + +### Select a plan for preview + +By default, previews are run in enterprise plan mode. This mode makes all of the enterprise features available. +Switch the preview to pro plan mode by setting the `--plan` option to `pro`: + +```bash +redocly preview --plan=pro +``` + +### Specify project directory + +By default, the preview command uses the current directory. To specify another directory, provide a path relative to the current directory using the `--project-dir` option: + +```bash +redocly preview --project-dir=./path/to/my/docs/ +``` + +### Use custom port for preview + +By default, the preview starts on port `4000`, so you can access the docs at `http://localhost:4000` or `http://127.0.0.1:4000`. + +To specify a custom port for the preview, pass the desired value using the `port` option: + +```bash +redocly preview --port=8888 +``` + +This command starts the preview on port 8888, so you can access the docs at `http://localhost:8888` or `http://127.0.0.1:8888`. diff --git a/@skills/redocly-cli/docs/@v1/commands/push-status.md b/@skills/redocly-cli/docs/@v1/commands/push-status.md new file mode 100644 index 000000000..11feb80b5 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/push-status.md @@ -0,0 +1,70 @@ +# `push-status` + +This command is used with Reunite products only. +It provides details about files, deployments, and API scorecards, using a `` that is returned by an earlier `push` command. + +The `push-status` command can be used whenever the application or process executing a `push` command (without `--wait-for-deployment` option) returns the `pushId`. +This identifier can be used by subsequent systems to perform custom logic when the deployment is completed. + +## Prerequisites + +Have the following before you use the `push-status` command: + +- A user account in a [Reunite project](https://auth.cloud.redocly.com/). +- An active organization [API key](https://redocly.com/docs/realm/setup/how-to/api-keys). +- [Redocly CLI](../installation.md) v1.10.x or later. + +## Authentication + +Use the `REDOCLY_AUTHORIZATION` environment variable to set the API key. +See the [Manage API keys](https://redocly.com/docs/realm/setup/how-to/api-keys) page in the documentation for details on how to get your API key in Reunite. + +## Usage + +```bash +REDOCLY_AUTHORIZATION= redocly push-status --organization --project [--wait] [--max-execution-time ] +``` + +## Options + +| Option | Type | Description | +| -------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------ | +| pushId | string | **REQUIRED.** Identifier of the push you are tracking. Returned as result of the [`push`](./push.md) command. | +| --organization, -o | string | **REQUIRED.** [Organization slug](#find-org-slug). | +| --project, -p | string | **REQUIRED.** [Project slug](#find-org-slug). | +| --domain, -d | string | The domain that the `push` command pushed to. Default value is [https://app.cloud.redocly.com](https://app.cloud.redocly.com). | +| --wait | boolean | Waits until the build is completed if it is in progress. Default value is `false`. | +| --max-execution-time | number | Maximum wait time for build completion in seconds (used in conjunction with the `--wait` option). Default value is `1200`. | + +
+How to find and copy the Reunite organization or project slugs + +1. Log in to Reunite. +2. Select your organization and project. +3. Copy the value of the `{ORGANIZATION_SLUG}` or `{PROJECT_SLUG}` from the page URL in your browser, based on the following structure, `https://{REDOCLY_HOST}/org/{ORGANIZATION_SLUG}/project/{PROJECT_SLUG}`. + +
+ +## Examples + +When `push` is performed from the repository's default branch, a preview build is automatically followed by a production build; this command can send only the completed builds or wait for uncompleted builds to complete. + +### Get the build status of a specific push + +The following example command prints the status of completed preview and production builds as well as scorecards if they exist for the push with the ID `push_01hkw0p0wg348n3gtxmv8rt6hy` in the `redocly` organization and `awesome-api-docs` project: + +```bash +REDOCLY_AUTHORIZATION='api-key' redocly push-status push_01hkw0p0wg348n3gtxmv8rt6hy -o=redocly -p=awesome-api-docs +``` + +If there are preview or production builds that haven't completed yet for the push ID, they are not included in the output of this command. + +### Get build status for a specific push and wait until it is completed + +You can configure the `push-status` command to check the deployment statuses of the preview build (and subsequent production build if applicable), and if the builds are not complete, check every 5 seconds until the builds are complete. + +The following example command prints the status for the preview and production builds as well as scorecards if they exist for the push with the ID `push_01hkw0p0wg348n3gtxmv8rt6hy` in the `redocly` organization and `awesome-api-docs` project: + +```bash +REDOCLY_AUTHORIZATION='api-key' redocly push-status push_01hkw0p0wg348n3gtxmv8rt6hy -o=redocly -p=awesome-api-docs --wait +``` diff --git a/@skills/redocly-cli/docs/@v1/commands/push.md b/@skills/redocly-cli/docs/@v1/commands/push.md new file mode 100644 index 000000000..3079a31c3 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/push.md @@ -0,0 +1,459 @@ +# `push` + +Use the push command with either the Reunite or Workflows families of products. +Pick the section that relates to the product you use. + +{% tabs %} + +{% tab label="Reunite" %} + +This command is used to push files from another location to a Reunite project. + +{% admonition type="warning" name="The content is overwritten" %} +The content of the destination folder (in other words the `--mount-path`) is overwritten every time changes are detected in comparison to the current content. +{% /admonition %} + +## Before you begin + +Have the following values ready to use with the `push` command: + +- A user account in a [Reunite project](https://auth.cloud.redocly.com/). +- An active organization [API key](https://redocly.com/docs/realm/setup/how-to/api-keys). +- [Redocly CLI](../installation.md) installed. + +Use the `REDOCLY_AUTHORIZATION` environment variable to set the API key. See the [Manage API keys](https://redocly.com/docs/realm/setup/how-to/api-keys) page in the documentation for details on how to get your API key in Reunite. + +## Command usage + +```bash +REDOCLY_AUTHORIZATION= redocly push --organization --project --mount-path --branch --message --author <'Author Name '> [--commit-sha ] [--commit-url ] [--created-at ] [--repository ] [--namespace ] [--default-branch ] [--domain ] [--wait-for-deployment] [--max-execution-time ] [--lint-config ] [--verbose] + +``` + +## Command options + +| Option | Type | Description | +| --------------------- | :------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| files | [string] | **REQUIRED.** List of folders and/or files to upload. | +| --organization, -o | string | **REQUIRED.** Organization slug. | +| --project, -p | string | **REQUIRED.** Project slug. | +| --mount-path, -mp | string | **REQUIRED.** The path where the files are mounted in the project. Cannot be empty or identical to the project path. | +| --branch, -b | string | **REQUIRED.** The branch files are pushed from. | +| --author, -a | string | **REQUIRED.** The author of the push in the format: `'Author Name '`. | +| --message, -m | string | **REQUIRED.** The commit message for the push. | +| --commit-sha, -sha | string | Commit SHA. | +| --commit-url, -url | string | Commit URL. | +| --repository | string | Repository ID. Example: `redocly-cli`. | +| --namespace | string | Repository owner/organization/workspace. Example: `Redocly`. | +| --created-at | string | Commit creation date. Format: `yyyy-mm-ddThh:mm:ss+offset value`. Example: `2024-02-20T14:26:26+02:00` | +| --domain | string | The domain to which the files are pushed. Default value is [https://app.cloud.redocly.com](https://app.cloud.redocly.com). | +| --default-branch | string | The default branch of the repository the push originates from. Default value is `main`. | +| --lint-config | string | Severity level for configuration file linting.
**Possible values:** `warn`, `error`, `off`. Default value is `warn`. | +| --max-execution-time | number | Maximum wait time for deployment completion in seconds (used in conjunction with the `--wait-for-deployment` option). Default value is `1200`. | +| --wait-for-deployment | boolean | Waits until the build is completed if it is in progress. Behaves the same as `push-status` command when passed. See [push-status](./push-status.md) command. Default value is `false`. | +| --verbose | boolean | Verbose output. Default value is `false`. | +| --help | boolean | Help output for the command. | + +## Example usage + +### Push files to the `push-docs` project in the default organization + +The following command pushes the `index.md` and `docs/push.yaml` files to the project with `push-docs` slug belonging to organization with `redocly` slug: + +```bash +REDOCLY_AUTHORIZATION= \ +redocly push index.md docs/push.yaml \ + --organization redocly \ + --project 'push-docs' \ + --mount-path 'docs/push' \ + --branch "docs/push-info" \ + --author "User " \ + --message "Add new docs" +``` + +Pushed files are added to an auto-generated preview branch with a `-docs/push-info` suffix. +The committer is `User `, and the commit message is `Add new docs`. +The files are added inside the `docs/push` folder in the project (the folder is created if it doesn't exist yet, if the folder does exist then the contents are overwritten). + +### Push file to the `push-docs` project in the `default` organization and wait until it is deployed + +This command example does the same as the [previous example](#push-files-to-the-push-docs-project-in-the-default-organization), but waits until the preview deployment finishes due to passed `--wait-for-deployment` option: + +```bash +REDOCLY_AUTHORIZATION= \ +redocly push docs/push.yaml \ + --organization default \ + --project 'push-docs' \ + --mount-path 'docs/push' \ + --branch "docs/push-info" \ + --author "User " \ + --message "Add new docs" \ + --wait-for-deployment +``` + +The command returns when the deployment is completed. + +### Push files from a GitHub action to the `push-docs` project in the `Docs` organization and wait until it is deployed + +The following command pushes the `docs/museum.yaml` file to the project `push-docs` in the `Docs` organization. +It uses the variables available in the GitHub actions context to supply information to the destination. + +```bash +npx @redocly/cli@latest push docs/museum.yaml \ + --organization "Docs" \ + --project "push-docs" \ + --mount-path "/docs/remotes/cicd" \ + --default-branch "${{ github.event.repository.default_branch || github.event.repository.master_branch }}" \ + --branch "${{ github.ref_name }}" \ + --author "${{ github.event.head_commit.author.name }} <${{ github.event.head_commit.author.email }}>" \ + --commit-sha "${{ github.event.head_commit.id }}" \ + --commit-url "${{ github.event.head_commit.url }}" \ + --namespace "${{ github.event.repository.owner.login }}" \ + --repository "${{ github.event.repository.name }}" \ + --created-at "${{ github.event.head_commit.timestamp }}" \ + --message "${{ github.event.head_commit.message }}" \ + --wait-for-deployment +``` + +The `docs/museum.yaml` file from the repository the action is running on is added to the `/docs/remotes/cicd` folder. The change is made on behalf of the latest commit author and uses the most recent commit message. + +The `--commit-sha`, `--commit-url`, `--namespace`, `--repository` options are used to attach the details of the push to the deployment and are also shown on the Reunite "Deployments" page. +This information is useful in case you have multiple sources for the pushes. + +Whenever a `push` is performed from the default branch (`--branch "${{ github.ref_name }}"` and equals to `--default-branch "${{ github.event.repository.default_branch || github.event.repository.master_branch }}"`) - a production deployment starts automatically after a successful preview deployment. +In this case the command waits for both deployments to finish. + +## Resources + +- Use the [push-status command](./push-status.md) to check on an in-progress deploy. +- For use in a CI context, check out the [GitHub Action](https://redocly.com/docs/realm/setup/reference/reunite-push-action). + +{% /tab %} + +{% tab label="Workflows" %} + +Redocly Workflows integrates with [popular version control services](https://redocly.com/docs/workflows/sources/) and uses them as the source of your API descriptions to help you automatically validate, build, and deploy API reference docs and developer portals. This approach requires you to give Redocly Workflows access to your repositories. + +The Redocly CLI `push` command helps you automate API description updates without granting Redocly Workflows access to your repositories. This approach is useful when you can't or don't want to grant Redocly Workflows permissions to your repositories, or when your API descriptions are generated automatically from code annotations in a CI/CD pipeline + +This method allows you to: + +- Use Redocly Workflows to preview documentation and portal builds. +- Manage versions in the API registry. + +Apart from uploading your API description file, the `push` command can automatically upload other files that are detected or referenced in the API description: + +- The [Redocly configuration file](../configuration/index.md) and any configuration files referenced in the `extends` list. +- The `package.json` file (if it exists) from the folder where you're executing the `push` command. Redocly Workflows uses the `@redocly/cli` version specified in `package.json`. +- The HTML template and the full contents of the folder specified as the `theme.openapi.htmlTemplate` parameter in the Redocly configuration file. + +{% admonition type="info" %} +If a plugin is referenced in the Redocly configuration file, the `push` command recursively scans the folder containing the plugin and uploads all `.js`, `.json`, `.mjs` and `.ts` files. + +Make sure that each plugin has all the required files in its folder; otherwise, they are not uploaded. +{% /admonition %} + +By default, the `push` command only updates an existing API description version. If an API with the provided name and version doesn't exist in your organization, it isn't created automatically. For details on how to create an API, check the [Upsert an API with push](#upsert-an-api-with-push) section. + +{% admonition type="warning" %} +Only API descriptions with a CI source can be updated with the `push` command. Attempting to update API definitions created from other sources fails with an error. +{% /admonition %} + +## Prerequisites + +Before using the `push` command, ensure the following prerequisites are met: + +1. Active user account in a Redocly Workflows organization. +2. Active [personal API key or organization API key](https://redocly.com/docs/settings/personal-api-keys/). + +## Authentication + +To authenticate to the API registry, you can use several approaches: + +- Use the `login` command. In this case, the command is as follows: + + ```bash + redocly login + redocly push ... + ``` + + Refer to the [`login` command documentation](login.md) for more details. + +- Set the `REDOCLY_AUTHORIZATION` environment variable to either your [personal API key](https://redocly.com/docs/settings/personal-api-keys/) or an organization-wide API key (configurable by organization owners in **Redocly Workflows > Settings > API keys**). In this case, the command may look as follows: + + ```bash + REDOCLY_AUTHORIZATION=yourPersonalApiKey redocly push ... + ``` + + Treat the API keys as secrets and work with them accordingly. Consult the documentation for your CI system to learn more about handling secrets: + - [Travis CI documentation](https://docs.travis-ci.com/user/environment-variables/) + - [CircleCI documentation](https://circleci.com/docs/env-vars/) + - [GitHub Actions documentation](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions) + - [Jenkins documentation](https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#handling-credentials) + +## Usage + +```bash +redocly push +redocly push [api] [--destination] [--organization] +redocly push [-u] [--job-id id] [--batch-size number] [--destination] [--organization] [--branch] +``` + +## Options + +| Option | Type | Description | +| ---------------- | :------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| api | string | The API description that you want to push to the Redocly API registry. Provide it as a path to the root API description file (or as an alias). See [set options explicitly](#set-options-explicitly) for more information. | +| --batch-size | number | Number of CI pushes expected within one batch. Must be used only in combination with the `--job-id` option. Must be an integer bigger than 1. See [the pushes per batch section](#determine-how-many-pushes-are-performed-per-batch) for more information. | +| --branch, -b | string | The branch where your API description is pushed or upserted. Default value is `main`. | +| --destination | string | The location in the API registry where you want to push or upsert your API description. Provide it in the following format: `api-name@api-version`. | +| --files | [string] | List of other folders and files to upload. See [the files section](#upload-other-folders-and-files) for more information. | +| --help | boolean | Show help. | +| --job-id | string | The ID of the CI job that the current push is associated with. Must be used only in combination with the `--batch-size` option. See [the job ID section](#specify-job-id) for more information. | +| --lint-config | string | Specify the severity level for the configuration file.
**Possible values:** `warn`, `error`, `off`. Default value is `warn`. | +| --organization | string | ID of organization that the API description is being pushed to. Overrides the one defined in the configuration file. | +| --public | boolean | Make API descriptions publicly accessible from the API Registry. Read more about [using the public option](#make-api-descriptions-publicly-accessible). | +| --region,-r | string | Specify which region to use when logging in. Supported values: `us`, `eu`. The `eu` region is limited to enterprise customers. Default value is `us`. Alternatively, set an environment variable `REDOCLY_DOMAIN` with the value of the appropriate Redocly API. | +| --skip-decorator | [string] | Ignore one or more decorators. See [the skip decorator section](#skip-decorator) for usage examples. | +| --upsert, -u | boolean | Create a new version of an API when pushing to the API registry if the version doesn't exist. See [the upsert an API with push section](#upsert-an-api-with-push) for more information. | +| --version | boolean | Show version number. | + +## Examples + +The command behaves differently depending on the options you pass to it, and whether the configuration file exists in your working directory. + +You can choose any of the following approaches: + +- [Specify all options explicitly in the command](#set-options-explicitly) +- [Set options in the Redocly configuration file](#set-options-in-the-configuration-file) + +### Specify destination + +To properly push your API description to the Redocly API registry, you need the following information: + +- [Organization ID](#organization-id) +- [API name and version](#api-name-and-version) + +#### Organization ID + +The `push` command uses the following order of precedence: + +1. First, it takes the organization ID from command-line arguments (if provided). +1. If the organization ID is not provided explicitly, it takes it from the configuration file. + +To find your organization ID required for the command: + +1. Log into Workflows. +1. Access the **API registry** page. +1. In your browser's address bar, find the URL of this page. +1. Inspect the segment after `app.redocly.com/org/`. This part is your organization ID. + +For example, if the URL is `app.redocly.com/org/test_docs`, the organization ID is `test_docs`. When using the `push` command, you would provide this ID as `--organization=test_docs`. + +Note that the organization ID can differ from the organization name. Owners can change the organization name at any time in the Workflows **Settings** page, but the organization ID cannot be changed. + +#### API name and version + +{% admonition type="info" %} +The name and version of your API should contain only supported characters (`a-z`, `A-Z`, `0-9`, `-`, `.`). Using a restricted character results in an error, and your API doesn't get created. +{% /admonition %} + +To find your API name required for the command: + +1. Log into Workflows. +1. Access the **API registry** page. +1. Check the list of APIs displayed on this page. +1. Inspect the title of each list item to the left of the **New version** and **Edit API** action buttons. This title is an API name. + +To find your API version required for the command: + +1. Log into Workflows. +1. Access the **API registry** page. +1. Check the list of APIs displayed on this page. +1. The version is displayed in the title after the `@` in format ` @ `. + +When using the `push` command, you would provide the API name and version in the format `api-name@api-version`. For example: `--destination=petstore-api@v1`. + +### Set options explicitly + +Provide the `api` as a path to the root API description file, and specify the organization ID, API name, and API version. + +```bash +redocly push openapi/petstore.yaml --destination=petstore-api@v1 --organization=openapi-org +``` + +In this case, `push` uploads only the API description that was passed to the command. The configuration file is ignored. + +To push the API description to a particular branch, specify the branch name. + +```bash +redocly push openapi/petstore.yaml --destination=petstore-api@v1 --organization=openapi-org -b develop +``` + +### Set options in the configuration file + +Depending on the contents of your Redocly configuration file, you can use simplified `push` syntax instead of providing the full path to the API description file. + +Here's an example configuration file: + +```yaml +organization: organization-id +apis: + api-name@api-version: + root: path/to/root/api-description.yaml + another-api: + root: openapi/openapi.yaml +``` + +With a configuration file like this, you can use any of the following approaches: + +- Push all configured APIs + +```bash +redocly push +``` + +Push every API listed in the `apis` section of the configuration file. You must specify your Workflows organization ID in the configuration file for this approach to work. APIs without an explicitly defined version are automatically pushed to `@latest`. + +- Push specified API and version + +```bash +redocly push --destination=api-name@api-version +``` + +Push the specified API and version from the `apis` section of the configuration file. +You must specify your organization ID in the configuration file for this approach to work. + +- Push specified API and version with organization ID + +```bash +redocly push --destination=api-name@api-version --organization=organization-id +``` + +Push the specified API and version from the `apis` section of the configuration file to the Workflows organization matching the provided organization ID. +In this case, you don't have to specify the organization ID in the configuration file. + +### Upsert an API with push + +To upsert an API in the registry with the `push` command, use the `--upsert` or `-u` option. The upsert creates the destination if it doesn't exist, or updates it if it does. +{% tabs %} +{% tab label="Set options explicitly" %} + +```bash +redocly push -u test-api-v1.yaml --destination=test-api@v1 --organization=redocly +``` + +{% /tab %} +{% tab label="Use config file" %} + +```bash +redocly push -u --destination=test-api@v1 +``` + +{% /tab %} +{% tab label="Upsert all APIs from config file" %} + +```bash +redocly push -u +``` + +{% /tab %} +{% /tabs %} + +To upsert the API description to a particular branch, specify the branch name with the `--branch` or `-b` option. +{% tabs %} +{% tab label="Set options explicitly" %} + +```bash +redocly push openapi/petstore.yaml --destination=petstore-api@v1 --organization=openapi-org -b develop +``` + +{% /tab %} +{% tab label="Use config file" %} + +```bash Use config file +redocly push -u test-api@v1 -b develop +``` + +{% /tab %} +{% /tabs %} + +### Specify job ID + +The `--job-id` option can be used by Redocly Workflows to associate multiple pushes with a single CI job. + +Below are possible use cases for the `--job-id` option: + +- CI/CD systems: group pushes from a single CI job together so that each push does not trigger separate reference docs/portals rebuild. +- External systems: a parameter that can be used in reports, metrics, or analytics to refer to a specific application service state. + +Must be used only in combination with the `--batch-size` option. + +### Determine how many pushes are performed per batch + +The `--batch-size` option can be used by Redocly Workflows to understand how many pushes in total are performed within one batch to properly handle parallel pushes. + +Must be used only in combination with the `--job-id` option. Must be an integer bigger than 1. + +### Skip decorator + +You may want to skip specific decorators upon running the command. +{% tabs %} +{% tab label="Skip a decorator" %} + +```bash +redocly push openapi/petstore.yaml --destination=petstore-api@v1 --organization=openapi-org --skip-decorator=test/remove-internal-operations +``` + +{% /tab %} +{% tab label="Skip multiple decorators" %} + +```bash +redocly push openapi/petstore.yaml --destination=petstore-api@v1 --organization=openapi-org --skip-decorator=test/remove-internal-operations --skip-decorator=test/remove-internal-schemas +``` + +{% /tab %} +{% /tabs %} + +### Make API descriptions publicly accessible + +The `--public` option allows you to upload your API description and make it publicly accessible from the API Registry. By default, API descriptions uploaded with the `push` command are not available to the public. +For more information on how to configure access to your APIs, check the [registry access](https://redocly.com/docs/api-registry/settings/manage-access/#set-up-access-to-api-registry) section. + +```bash +redocly push openapi/petstore.yaml --destination=petstore-api@v1 --organization=openapi-org --public +``` + +### Upload other folders and files + +The `--files` option allows you to upload other folders and files. + +```bash +redocly push openapi/petstore.yaml --destination=petstore-api@v1 --organization=openapi-org --files ./path/to/folder +``` + +You can also add files and folders by providing them in the `redocly.yaml` configuration file: + +```yaml +apis: + main: + root: ./openapi.yaml +files: + - ./path/to/folder + - ./path/to/another-folder/file.md + - ./file.md +``` + +Note that the `--files` option has higher priority than the `redocly.yaml` configuration file. + +### Set up CI from Redocly Workflows + +The Redocly Workflows interface can help you get started with the `push` command. + +1. In **API registry**, select **Add API**. +1. In the **Definition name** step, provide a name for your new API description. +1. In the **Choose source** step, select **Upload from CI/CD**. This generates syntax for the `push` command that you can copy and use to upload a new API description file. Or use the [`redocly push -u` command](#upsert-an-api-with-push) directly from the command-line interface. + +{% /tab %} + +{% /tabs %} diff --git a/@skills/redocly-cli/docs/@v1/commands/respect.md b/@skills/redocly-cli/docs/@v1/commands/respect.md new file mode 100644 index 000000000..0586068fc --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/respect.md @@ -0,0 +1,207 @@ +--- +slug: + - /docs/cli/v1/commands/respect + - /docs/respect/v1/commands/respect +--- + +# `respect` + +Use this command to execute API tests described in an Arazzo description. + +## Usage + +```sh +npx @redocly/cli@latest respect [-w | --workflow] [-s | --skip] [-v | --verbose] [-i | --input] [-S | --server] [-H | --har-output] [-J | --json-output] +``` + +## Options + +{% table %} + +- Option {% width="20%" %} +- Type {% width="15%" %} +- Description + +--- + +- -w, --workflow +- [string] +- Workflow names from the test file to run. + For example, the following command runs "first-flow" and "second-flow" workflows from the `test-file.yaml` Arazzo description: + + `npx @redocly/cli@latest respect test-file.yaml --workflow first-flow second-flow` + + {% admonition type="warning" %} + The `--workflow` option can't be used with `--skip`. + {% /admonition %} + +--- + +- -s, --skip +- [string] +- Workflow names from the test file to skip. + For example, the following command skips the "first-flow" workflow from the `test-file.yaml` Arazzo description: + + `npx @redocly/cli@latest respect test-file.yaml --skip first-flow` + + {% admonition type="warning" name="Warning" %} + The `--skip` option can't be used with `--workflow`. + {% /admonition %} + +--- + +- -v, --verbose +- boolean +- Runs the command in verbose mode to help with troubleshooting issues. + For example, the following command runs all workflows from the `test-file.yaml` Arazzo description in verbose mode: + + `npx @redocly/cli@latest respect test-file.yaml --verbose` + +--- + +- --har-output +- string +- Path for the `har` file for saving logs. + For example, the following command runs all workflows from the `test-file.yaml` Arazzo description and saves the logs to the `logs.har` file: + + `npx @redocly/cli@latest respect test-file.yaml --har-output='logs.har'` + +--- + +- --json-output +- string +- Path for the JSON file for saving logs. For example, the following command runs all workflows from the `test-file.yaml` Arazzo description and saves the logs to the `logs.json` file: + + `npx @redocly/cli@latest respect test-file.yaml --json-output='logs.json'` + +--- + +- --input +- string +- Input parameters with values that are mapped to the workflow inputs description. + For example, the following command maps the "userEmail" and "userPassword" inputs and values to all workflows in the `test.yaml` Arazzo description: + + `npx @redocly/cli@latest respect test.yaml --input userEmail=name@redocly.com --input userPassword=12345` + + You can also use an environment variable to set the input, as in the following example: + + `REDOCLY_CLI_RESPECT_INPUT='userEmail=name@redocly.com,userPassword=12345' npm run cli respect test.yaml` + + You can even include nested values, as in the following example command that maps the `nestedKey` input and value to all workflows in the `test-file.yaml` Arazzo description: + + `npx @redocly/cli@latest respect test-file.yaml --input '{"key": "value", "nested": {"nestedKey": "nestedValue"}}'` + + You can also use an environment variable to set the input, as in the following example: + + `REDOCLY_CLI_RESPECT_INPUT='{"key":"value","nested":{"nestedKey":"nestedValue"}}' npx @redocly/cli@latest respect test-file.yaml` + +--- + +- --server +- string +- Server overrides for the `sourceDescriptions` object. + For example, the following command runs all workflows from the `test-file.yaml` Arazzo description and instead of using the servers listed in the API description, uses the specified servers: + + `npx @redocly/cli@latest respect test-file.yaml --server sourceDescriptionName1=https://test.com --server sourceDescriptionName2=https://test2.com` + + You can also pass multiple server overrides as an environment variable by separating them with commas, as in the following example: + + `REDOCLY_CLI_RESPECT_SERVER="sourceDescriptionName1=https://test.com,sourceDescriptionName2=https://test2.com"` + +--- + +- --severity +- string +- Severity of the check. + Customize the severity level of validation checks for status codes, schemas, and content types. Setting the severity level is useful when: + - You're actively developing your API and want to temporarily relax validation. + - You're testing new API behavior that doesn't match the current schema. + - You've encountered known issues that shouldn't block test execution. + - You want to treat certain validation failures as warnings instead of errors. + + The following checks can be configured: + - `STATUS_CODE_CHECK`: Verifies if the status code returned with API responses matches the statuses described in the provided OpenAPI description. + - `SCHEMA_CHECK`: Verifies if the response body schema matches what is defined in the provided OpenAPI description. + - `SUCCESS_CRITERIA_CHECK`: Verifies if the success criteria defined in the provided Arazzo description has been met. + - `CONTENT_TYPE_CHECK`: Verifies if the `Content-Type` matches what is defined in the provided OpenAPI description. + + The following severity values are available: + - `error`: Validation failures cause the workflow to fail. + - `warn`: Validation failures appear as warnings but don't fail the workflow. + - `off`: Validation checks still run, but their results are ignored. + + {% admonition type="info" %} + Setting the severity of a check to `off` does not prevent the check from executing - it only prevents the check's results from affecting the workflow outcome. + {% /admonition %} + + For example, the following command sets status code errors to the warning severity level: + + `npx @redocly/cli respect test-file.yaml --severity='{"STATUS_CODE_CHECK":"warn"}'` + +{% /table %} + +## Examples + +- Run the tests by running the following command: `npx @redocly/cli@latest respect `. +- Run multiple tests by running the following command: `npx @redocly/cli@latest respect `. +- Run multiple tests by running the following command with bash selector : `npx @redocly/cli@latest respect $(find ./path-to-tests-folder -type f -name '*.arazzo.yaml')`. + +**Example output** + +```bash +Running workflow warp.arazzo.yaml / missionLostInvention + + ✓ POST /anchors - step setAnchorToCurrentTime +    ✓ status code check (Response code 201 matches one of description codes: [201, 409]) +    ✓ content-type check +    ✓ schema check + + ✓ POST /timelines - step createTimelineTo1889 +    ✓ status code check (Response code 201 matches one of description codes: [201]) +    ✓ content-type check +    ✓ schema check + + ✓ POST /travels - step travelTo1889 +    ✓ status code check (Response code 200 matches one of description codes: [200, 400]) +    ✓ content-type check +    ✓ schema check + + ✓ POST /items - step findAndRegisterBlueprint +    ✓ status code check (Response code 200 matches one of description codes: [200, 409]) +    ✓ content-type check +    ✓ schema check + + ✓ POST /paradox-checks - step avoidParadox +    ✓ success criteria check +    ✓ success criteria check +    ✓ status code check (Response code 200 matches one of description codes: [200, 400]) +    ✓ content-type check +    ✓ schema check + + ✓ POST /travels - step returnToPresent +    ✓ status code check (Response code 200 matches one of description codes: [200, 400]) +    ✓ content-type check +    ✓ schema check + + +  Summary for warp.arazzo.yaml +   +  Workflows: 1 passed, 1 total +  Steps: 6 passed, 6 total +  Checks: 20 passed, 20 total +  Time: 1060ms + + +┌──────────────────────────────────────────────────────────┬────────────┬─────────┬─────────┬──────────┬─────────┐ +│ Filename │ Workflows │ Passed │ Failed │ Warnings │ Skipped │ +├──────────────────────────────────────────────────────────┼────────────┼─────────┼─────────┼──────────┼─────────┤ +│ ✓ warp.arazzo.yaml │ 1 │ 1 │ - │ - │ - │ +└──────────────────────────────────────────────────────────┴────────────┴─────────┴─────────┴──────────┴─────────┘ +``` + +## Resources + +- Learn more about using mTLS with Respect in [Use mTLS](/docs/respect/guides/mtls-cli). +- Follow steps to test API sequences in [Test a sequence of API calls](/docs/respect/guides/test-api-sequences). +- Learn what Respect is and how you can use it to test API in the [Respect](/docs/respect) concept document. +- [Learn Arazzo](/learn/arazzo/what-is-arazzo). diff --git a/@skills/redocly-cli/docs/@v1/commands/split.md b/@skills/redocly-cli/docs/@v1/commands/split.md new file mode 100644 index 000000000..18404f75a --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/split.md @@ -0,0 +1,50 @@ +# `split` + +## Introduction + +The `split` command takes an API description file and creates a [multi-file structure](https://redocly.com/docs/resources/multi-file-definitions/) out of it by extracting referenced parts into standalone, separate files. Code samples, components, and paths are split from the root API description into separate files and folders. The structure of the unbundled directory corresponds to the structure created by our [openapi-starter](https://github.com/Redocly/openapi-starter) tool. The advantage of this approach is making smaller files that are easier to manage and a structure that makes reviewing simpler. + +Use the [`bundle`](./bundle.md) command and supply the main file as the entrypoint to get your OpenAPI description in one file. Many OpenAPI tools prefer a single file, but `split` and `bundle` allow you to manage your files easily for development, and then prepare a single file for other tools to consume. + +{% admonition type="warning" name="OpenAPI 3.x only" %} +The `split` command doesn't support OpenAPI 2.0 descriptions. +{% /admonition %} + +## Usage + +```bash +redocly split --outDir= +redocly split [--help] [--version] +redocly split --version +``` + +## Options + +| Option | Type | Description | +| ------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| api | string | **REQUIRED.** Path to the API description file that you want to split into a multi-file structure. | +| --config | string | Specify path to the [configuration file](../configuration/index.md). | +| --help | boolean | Show help. | +| --lint-config | string | Specify the severity level for the configuration file.
**Possible values:** `warn`, `error`, `off`. Default value is `warn`. | +| --outDir | string | **REQUIRED.** Path to the directory where you want to save the split files. If the specified directory doesn't exist, it is created automatically. | +| --separator | string | File path separator used while splitting. The default value is `_`. This controls the file names generated in the `paths` folder (e.g. `/users/create` path becomes `user_create.yaml`). | +| --version | boolean | Show version number. | + +## Examples + +### View successful split message + +This `split` command "unbundles" the specified API description, as defined in `pet.yaml`, into the `openapi` output directory: + +```bash +redocly split pet.yaml --outDir=openapi +``` + +A confirmation message is displayed with a successful split: + +
+Document: pet.yaml is successfully split
+ and all related files are saved to the directory: openapi
+
+pet.yaml: split processed in 33ms
+
diff --git a/@skills/redocly-cli/docs/@v1/commands/stats.md b/@skills/redocly-cli/docs/@v1/commands/stats.md new file mode 100644 index 000000000..0d65e9fe0 --- /dev/null +++ b/@skills/redocly-cli/docs/@v1/commands/stats.md @@ -0,0 +1,209 @@ +# `stats` + +## Introduction + +The `stats` command provides statistics about the structure of one or more API description files. +This command generates statistics for the following metrics: + +- References +- External Documents +- Schemas +- Parameters +- Links +- Path Items +- Operations +- Tags + +If you're interested in the technical details, the statistics are calculated using the counting logic from the `StatsVisitor` module. + +## Usage + +```bash +redocly stats +redocly stats [--format=