{"id":20915097,"url":"https://github.com/microcks/microcks-spectral-ruleset","last_synced_at":"2025-10-26T20:12:56.520Z","repository":{"id":239895322,"uuid":"800951761","full_name":"microcks/microcks-spectral-ruleset","owner":"microcks","description":"A set of rules for Spectral that allows linting OpenAPI and AsyncAPI spec for Microcks conventions","archived":false,"fork":false,"pushed_at":"2024-10-25T07:35:21.000Z","size":90,"stargazers_count":7,"open_issues_count":1,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-10-30T05:42:58.290Z","etag":null,"topics":["api","asyncapi","contract-testing","linting-rules","microcks","mocking","openapi","spectral"],"latest_commit_sha":null,"homepage":"https://microcks.io","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/microcks.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY-INSIGHTS.yml","support":null,"governance":"GOVERNANCE.md","roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"microcks","patreon":null,"open_collective":"microcks","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2024-05-15T10:08:12.000Z","updated_at":"2024-10-25T07:35:21.000Z","dependencies_parsed_at":"2024-05-28T01:54:06.261Z","dependency_job_id":"5bfd544d-ff6a-4ce8-998f-08ab6f6ca526","html_url":"https://github.com/microcks/microcks-spectral-ruleset","commit_stats":{"total_commits":21,"total_committers":2,"mean_commits":10.5,"dds":0.04761904761904767,"last_synced_commit":"965a75ceb0d3fbcda58f6c3c4eada10e8f527e5a"},"previous_names":["microcks/microcks-spectral-ruleset"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microcks%2Fmicrocks-spectral-ruleset","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microcks%2Fmicrocks-spectral-ruleset/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microcks%2Fmicrocks-spectral-ruleset/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microcks%2Fmicrocks-spectral-ruleset/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/microcks","download_url":"https://codeload.github.com/microcks/microcks-spectral-ruleset/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224397474,"owners_count":17304362,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","asyncapi","contract-testing","linting-rules","microcks","mocking","openapi","spectral"],"created_at":"2024-11-18T16:13:01.067Z","updated_at":"2025-10-26T20:12:56.435Z","avatar_url":"https://github.com/microcks.png","language":"JavaScript","funding_links":["https://github.com/sponsors/microcks","https://opencollective.com/microcks"],"categories":[],"sub_categories":[],"readme":"# Microcks Spectral ruleset\n\nA set of rules for [Spectral](https://github.com/stoplightio/spectral) that allows linting OpenAPI and AsyncAPI spec for Microcks conventions.\n\nMicrocks conventions for [OpenAPI](https://microcks.io/documentation/using/openapi/) and [AsyncAPI](https://microcks.io/documentation/using/asyncapi/) specification files can be sometime a little boring to apply and debug. This set of rules allows you to use your favorite linter to detect if some of the conventions are missing or are incomplete so that Microcks will be able to import comprehensive mocks 😉\n\nThis ruleset is initially targeting the [Spectral](https://github.com/stoplightio/spectral) linter but we also added a compatibility layer for [Vacuum](https://github.com/daveshanley/vacuum). As this is not our primary focus, we'll see what it means to support this layer in the long-term...\n\n[![License](https://img.shields.io/github/license/microcks/microcks-testcontainers-java?style=for-the-badge\u0026logo=apache)](https://www.apache.org/licenses/LICENSE-2.0)\n[![Project Chat](https://img.shields.io/badge/discord-microcks-pink.svg?color=7289da\u0026style=for-the-badge\u0026logo=discord)](https://microcks.io/discord-invite/)\n[![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/microcks\u0026style=for-the-badge)](https://artifacthub.io/packages/search?repo=microcks)\n[![CNCF Landscape](https://img.shields.io/badge/CNCF%20Landscape-5699C6?style=for-the-badge\u0026logo=cncf)](https://landscape.cncf.io/?item=app-definition-and-development--application-definition-image-build--microcks)\n\n## Build Status\n\nLatest released version is `0.0.6`.\n\nCurrent development version is `0.0.7-SNAPSHOT`.\n\n#### Fossa license and security scans\n\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fmicrocks%2Fmicrocks-spectral-ruleset.svg?type=shield\u0026issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fmicrocks%2Fmicrocks-spectral-ruleset?ref=badge_shield\u0026issueType=license)\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fmicrocks%2Fmicrocks-spectral-ruleset.svg?type=shield\u0026issueType=security)](https://app.fossa.com/projects/git%2Bgithub.com%2Fmicrocks%2Fmicrocks-spectral-ruleset?ref=badge_shield\u0026issueType=security)\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fmicrocks%2Fmicrocks-spectral-ruleset.svg?type=small)](https://app.fossa.com/projects/git%2Bgithub.com%2Fmicrocks%2Fmicrocks-spectral-ruleset?ref=badge_small)\n\n#### OpenSSF best practices on Microcks core\n\n[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/7513/badge)](https://bestpractices.coreinfrastructure.org/projects/7513)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/microcks/microcks/badge)](https://securityscorecards.dev/viewer/?uri=github.com/microcks/microcks)\n\n## Community\n\n* [Documentation](https://microcks.io/documentation/tutorials/getting-started/)\n* [Microcks Community](https://github.com/microcks/community) and community meeting\n* Join us on [Discord](https://microcks.io/discord-invite/), on [GitHub Discussions](https://github.com/orgs/microcks/discussions) or [CNCF Slack #microcks channel](https://cloud-native.slack.com/archives/C05BYHW1TNJ)\n\nTo get involved with our community, please make sure you are familiar with the project's [Code of Conduct](./CODE_OF_CONDUCT.md).\n\n## Versions\n\n| This ruleset | Spectral Version | Vaccum Version |\n|--------------|------------------|----------------|\n| \u003c= `0.0.5`   | `6.11.1` and +   | `0.9.16` and + |\n| \u003e= `0.0.6`   | `6.14.0` and +   | `0.9.16` and + |\n\n## How to use it?\n\nDevelopers wanting to pull the ruleset can just install the package using `yarn` or `npm` and reference the module name in `extends`:\n\n```yaml\nextends:\n  - \"@microcks/spectral-ruleset\"\n```\n\nLocking a ruleset on a given version is possible through `package.json`:\n\n```json\n{\n  \"dependencies\": {\n    \"@microcks/spectral-ruleset\": \"0.0.6\"\n  }\n}\n```\n\nIf you use Spectral in a browser or don't want to install the package, you can also reference that package through the use of CDNs for npm repositories, such as `unpkg.com`. You can then put directly in your own rules our `.spectral.yaml` file, the following directive:\n\n```yaml\nextends:\n  - \"https://unpkg.com/@microcks/spectral-ruleset@0.0.6\"\n```\n\n## What results to expect?\n\nTo illustrate the results of applying the ruleset, let's have a look at the [Weather Forecast API](./resources/weather-forecast-openapi-bad.yaml) OpenAPI specification. Eventhough everything looks nice at a first look, some issues will prevent Microcks to collect and build comprhensive mocks from the spec elements:\n\n1. [L39](./resources/weather-forecast-openapi-bad.yamlL39): `unknown` is an expected response (see L96) but no value has been defined for this parameter. Microcks will not be able to associate response with parameter value, \n2. [L54](./resources/weather-forecast-openapi-bad.yamlL54): `apiKey` parameter is required but no examples are provided. The mock will not be representative of expected API behavior,\n3. [L95](./resources/weather-forecast-openapi-bad.yamlL95): `temp` has been defined as a number in the schema but we provided a string. The mock will not be consistent with the API types definition,\n3. [L115](./resources/weather-forecast-openapi-bad.yamlL115): the `SetForecast` operation request define an example called `north` but no response has this name. Microcks will not be able to associate response with body value, \n4. [L125](./resources/weather-forecast-openapi-bad.yamlL125): the `SetForecast` operation defines no examples for both the response. Microcks will not be able to guess mock values for these one,\n5. [L140](./resources/weather-forecast-openapi-bad.yamlL140): the `DeleteForecast` operation defines an example for a region `center` and there's no response for this region. Microcks will not be able to find a suitable response,\n6. [L146](./resources/weather-forecast-openapi-bad.yamlL146): the `DeleteForecast` operation is a no-content response so it uses `x-microcks-refs` to tell to what response elements it should bind the response. However, the `center-south` value has not be defined as a valid parameter value... Microcks will not be able to bind to a matching request,\n7. [L18](./resources/weather-forecast-openapi-bad.yamlL18): `team` label used in `x-microcks` extension is not well-formed as it should just be a `string`, \n8. [L30](./resources/weather-forecast-openapi-bad.yamlL30): `delay` information used in `x-microcks-operation` extension is not well-formed as it must be an `integer`. \n\nDebugging everything by hand can be tedious... So here's how to detect those issues and get some hints on what's going wrong. ✨\n\n### Using Spectral\n\nWe'll use the `microcks-rules.yaml` ruleset definition file here. If you followed the above instruction on how to use it via `unpkg`, you don't need to include the `-r microcks-rules.yaml` part of the command:\n\n```shell\n$ spectral --version\n6.11.1\n\n$ spectral lint -r microcks-rules.yaml resources/weather-forecast-openapi-bad.yaml\n\n/Users/laurent/Development/github/microcks-spectral-ruleset/resources/weather-forecast-openapi-bad.yaml\n  18:12  warning  microcks-info-extension-valid                  x-microcks extension must be valid                                                                                                                                                                        info.x-microcks.labels.team\n  30:16  warning  microcks-operation-extension-valid             x-microcks-operation extension must be valid                                                                                                                                                              paths./forecast/{region}.get.x-microcks-operation.delay\n  49:11  warning  microcks-examples-in-required-parameter        Required param must have examples                                                                                                                                                                         paths./forecast/{region}.get.parameters[1]\n  55:17  warning  microcks-examples-fragments-to-complete-mocks  🚨 Response example 'unknown' is incomplete, it has no matching input example. It requires at least one requestBody or parameter example with same name to be considered as valid mock for Microcks.      paths./forecast/{region}.get.responses\n  95:27    error  oas3-valid-media-example                       \"temp\" property type must be number                                                                                                                                                                       paths./forecast/{region}.get.responses[200].content.application/json.examples.south.value.temp\n 121:17  warning  microcks-examples-fragments-to-complete-mocks  ℹ️  Request body example 'north' is not used in any response. It requires to have a matching response example or a x-microcks-refs to be considered as valid mock for Microcks.                           paths./forecast/{region}.put.responses\n 125:30  warning  microcks-examples-in-response-content          Response with content must have examples                                                                                                                                                                  paths./forecast/{region}.put.responses[200].content.application/json\n 142:17  warning  microcks-examples-fragments-to-complete-mocks  🔗 Response has x-microcks-refs 'center-south' but it doesn't match input example. It requires at least one requestBody or parameter example with same name to be considered as valid mock for Microcks.  paths./forecast/{region}.delete.responses\n 142:17  warning  microcks-examples-fragments-to-complete-mocks  ℹ️  Path parameter example 'center' is not used in any response. It requires to have a matching response example or a x-microcks-refs to be considered as valid mock for Microcks.                        paths./forecast/{region}.delete.responses\n\n✖ 9 problems (1 error, 8 warnings, 0 infos, 0 hints)\n```\n\nIf you'd like a more human-readable output of Microcks hints for a complete document, you can set the `MICROCKS_HINTS` environment variable to `true` when running spectral:\n\n```shell\n$ MICROCKS_HINTS=true spectral lint -r microcks-rules.yaml resources/weather-forecast-openapi-bad.yaml\n\n🚨 Response example 'unknown' for 'paths./forecast/{region}.get' is incomplete, it has no matching input example.\n   It requires at least one requestBody or parameter example with same name to be considered as valid mock for Microcks.\n\nℹ️  Request body example 'north' for 'paths./forecast/{region}.put' is not used in any response.\n   It requires to have a matching response example or a x-microcks-refs to be considered as valid mock for Microcks.\n\n🔗 Response has x-microcks-refs 'center-south' for 'paths./forecast/{region}.delete' but it doesn't match input example.\n   It requires at least one requestBody or parameter example with same name to be considered as valid mock for Microcks.\n\nℹ️  Path parameter example 'center' for 'paths./forecast/{region}.delete' is not used in any response.\n   It requires to have a matching response example or a x-microcks-refs to be considered as valid mock for Microcks.\n\n/Users/laurent/Development/github/microcks-spectral-ruleset/resources/weather-forecast-openapi-bad.yaml\n  18:12  warning  microcks-info-extension-valid                  x-microcks extension must be valid                                                                                                                                                                        info.x-microcks.labels.team\n\n[...]\n```\n\n### Using Vacuum\n\nWe'll use the `microcks-vacuum-rules.yaml` ruleset definition file here:\n\n```shell\n$ vacuum lint -r microcks-vacuum-rules.yaml -f ./functions resources/weather-forecast-openapi-bad.yaml -d\n\n\n██╗   ██╗ █████╗  ██████╗██╗   ██╗██╗   ██╗███╗   ███╗\n██║   ██║██╔══██╗██╔════╝██║   ██║██║   ██║████╗ ████║\n██║   ██║███████║██║     ██║   ██║██║   ██║██╔████╔██║\n╚██╗ ██╔╝██╔══██║██║     ██║   ██║██║   ██║██║╚██╔╝██║\n ╚████╔╝ ██║  ██║╚██████╗╚██████╔╝╚██████╔╝██║ ╚═╝ ██║\n  ╚═══╝  ╚═╝  ╚═╝ ╚═════╝ ╚═════╝  ╚═════╝ ╚═╝     ╚═╝\n\n\nversion: 0.9.16 | compiled: Thu, 09 May 2024 19:57:46 UTC\n🔗 https://quobix.com/vacuum | https://github.com/daveshanley/vacuum\n\n\n INFO  Located custom javascript function: 'aas-verify-mocks'\n  ERROR   Failed to load function 'aas-verify-mocks': SyntaxError: SyntaxError: (anonymous): Line 16:1 Unexpected reserved word (and 8 more errors)\n INFO  Located custom javascript function: 'oas-verify-mocks-vacuum'\n INFO  Located custom javascript function: 'oas-verify-mocks'\n  ERROR   Failed to load function 'oas-verify-mocks': SyntaxError: SyntaxError: (anonymous): Line 16:1 Unexpected reserved word (and 20 more errors)\n INFO  Loaded 3 custom function(s) successfully.\n INFO  Linting file 'resources/weather-forecast-openapi-bad.yaml' against 7 rules: https://quobix.com/vacuum/rulesets/no-rules\n\n2024/05/21 14:17:56 \n2024/05/21 14:17:56 🚨 Response example 'unknown' for 'GetForecast' is incomplete, it has no matching input example.\n2024/05/21 14:17:56    It requires at least one requestBody or parameter example with same name to be considered as valid mock for Microcks.\n2024/05/21 14:17:56 \n2024/05/21 14:17:56 ℹ️  Request body example 'north' for 'SetForecast' is not used in any response.\n2024/05/21 14:17:56    It requires to have a matching response example or a x-microcks-refs to be considered as valid mock for Microcks.\n2024/05/21 14:17:56 \n2024/05/21 14:17:56 🔗 Response has x-microcks-refs 'center-south' for 'DeleteForecast' but it doesn't match input example.\n2024/05/21 14:17:56    It requires at least one requestBody or parameter example with same name to be considered as valid mock for Microcks.\n2024/05/21 14:17:56 \n2024/05/21 14:17:56 ℹ️  Path parameter example 'center' for 'DeleteForecast' is not used in any response.\n2024/05/21 14:17:56    It requires to have a matching response example or a x-microcks-refs to be considered as valid mock for Microcks.\n\n/Users/laurent/Development/github/microcks-spectral-ruleset/resources/weather-forecast-openapi-bad.yaml\n-------------------------------------------------------------------------------------------------------\nLocation                                           | Severity | Message                                                                        | Rule                                          | Category   | Path\nresources/weather-forecast-openapi-bad.yaml:15:5   | warning  | x-microcks extension must be valid                                             | microcks-info-extension-valid                 | Validation | $.info[0]\nresources/weather-forecast-openapi-bad.yaml:24:7   | warning  | Response example 'unknown' is incomplete, it has no matching input example     | microcks-examples-fragments-to-complete-mocks | Validation | $.paths.*.*\nresources/weather-forecast-openapi-bad.yaml:30:9   | warning  | x-microcks-operation extension must be valid                                   | microcks-operation-extension-valid            | Validation | $.paths.*.*[0]\nresources/weather-forecast-openapi-bad.yaml:49:11  | info     | Parameters should have examples                                                | microcks-examples-in-parameter                | Validation | $..parameters[0][1]\nresources/weather-forecast-openapi-bad.yaml:92:17  | warning  | expected number, but got string                                                | oas3-valid-schema-example                     | Examples   | $.paths['/forecast/{region}'].get.responses['200'].content['...\nresources/weather-forecast-openapi-bad.yaml:108:7  | warning  | Request body example 'north' is not used in any response                       | microcks-examples-fragments-to-complete-mocks | Validation | $.paths.*.*\nresources/weather-forecast-openapi-bad.yaml:126:15 | warning  | Response with content must have examples                                       | microcks-examples-in-response-content         | Validation | $.paths..responses..content.*\nresources/weather-forecast-openapi-bad.yaml:129:7  | warning  | Response has x-microcks-refs 'center-south' but it doesn't match input example | microcks-examples-fragments-to-complete-mocks | Validation | $.paths.*.*\nresources/weather-forecast-openapi-bad.yaml:129:7  | warning  | Path parameter example 'center' is not used in any response                    | microcks-examples-fragments-to-complete-mocks | Validation | $.paths.*.*\n\nCategory   | Errors | Warnings | Info\nValidation | 0      | 7        | 1\nExamples   | 0      | 1        | 0\n\n                                                                     \n          Linting passed, but with 8 warnings and 1 informs          \n                                                                                                                                       \n```\n\n## Rules reference\n\n### Microcks extensions\n\n#### microcks-info-extension-valid\n\nThis rule will check that `info.x-microcks` is well-formed according to its schema information.\n\n`x-microcks` OpenAPI and AsyncAPI extension allows you to provide `labels` for organizing your API and Services in Microcks. Labels are simple key/value pairs where keys and values are string.\n\n**Severity:** `warn`\n\n#### microcks-operation-extension-valid\n\nThis rule will check that `x-microcks-operation` provided for operation is well-formed according to its schema information.\n\n`x-microcks-operation` OpenAPI and AsyncAPI extension allows you to provide custom dispatching rules and delays for your mocks. We'll check that attributes are known from Microcks to guarantee their application.\n\n**Severity:** `warn`\n\n### OpenAPI v3\n\n#### Reused external rules\n\nThe Microcks ruleset imports the `oas3-valid-media-example` and `oas3-valid-schema-example` rules from the [Spectral OpenAPI Rules](https://meta.stoplight.io/docs/spectral/4dec24461f3af-open-api-rules).\n\nThese rules check that the `examples` definitions are conformant to the schema definition with the API specification. Having incorrect values or types will not prevent Microcks to produce mocks but these ones will be totally useless for people wanted to have a high-fidelity simulation of the API.\n\n**Severity:** `error`\n\n#### microcks-examples-in-required-parameter\n\nThis rule will ask you to provide named `examples` for parameters marqued as required.\n\nPutting named `examples` in parameters allows you to explicit values of parameters depending on different situation and then to later bind them with corresponding request body or response. This provide a better overview of the expected behavior of your API for people who will discover it. Not providing these examples prevents Microcks from producing correct and representative mocks.\n\n**Severity:** `warn`\n\n#### microcks-examples-in-optional-parameter\n\nThis rule will recommend you to provide named `examples` for parameters marqued as optional.\n\nPutting named `examples` in parameters allows you to explicit values of parameters depending on different situation and then to later bind them with corresponding request body or response. This provide a better overview of the expected behavior of your API for people who will discover it.\n\n**Severity:** `info`\n\n#### microcks-examples-in-request-content\n\nThis rule will ask you to provide named `examples` within `requestBody.content.*`.\n\nPutting named `examples` in request content allows you to explicit payload depending on different situation and then to later bind them with corresponding response. This provide a better overview of the expected behavior of your API for people who will discover it. Not providing these examples prevents Microcks from producing mocks.\n\n**Severity:** `warn`\n\n#### microcks-examples-in-response-content\n\nThis rule will ask you to provide named `examples` within `responses.*.content.*`.\n\nPutting named `examples` in response content allows you to explicit payload depending on different situation and then to later bind them with corresponding request body or parameter values. This provide a better overview of the expected behavior of your API for people who will discover it. Not providing these examples prevents Microcks from producing mocks.\n\n**Severity:** `warn`\n\n#### microcks-examples-fragments-to-complete-mocks\n\nThis rule will check the coherence of different response, request and parameter examples to detect incomplete combination.\n\n**Severity:** `warn`\n\n### AsyncAPI v2.x\n\n#### Reused external rules\n\nThe Microcks ruleset imports the `asyncapi-message-examples` from the [Spectral AsyncAPI Rules](https://docs.stoplight.io/docs/spectral/1e63ffd0220f3-async-api-rules).\n\nThis rule checks that the `examples` definitions are conformant to the schema definition with the API specification. Having incorrect values or types will not prevent Microcks to produce mocks but these ones will be totally useless for people wanted to have a high-fidelity simulation of the API.\n\n**Severity:** `error`\n\n#### microcks-aas-examples-in-message\n\nThis rule will ask you to provide named `examples` within `$.channels.*.[publish,subscribe].message`.\n\nPutting named `examples` in message allows you to explicit payload depending on different situation and then optionally to later bind them with corresponding parameter values. This provide a better overview of the expected behavior of your API for people who will discover it. Not providing these examples prevents Microcks from producing mocks.\n\n**Severity:** `warn`\n\n#### microcks-aas-examples-in-parameter\n\nThis rule will ask you to provide named `examples` within `$.channels.*.parameters.*.schema`.\n\nPutting named `examples` in channel parameters allows you to explicit values of parameters depending on different situation and then to later bind them with corresponding message content. This provide a better overview of the expected behavior of your API for people who will discover it. Not providing these examples prevents Microcks from producing correct and representative mocks.\n\n**Severity:** `warn`\n\n#### microcks-aas-examples-fragments-to-complete-mocks\n\nThis rule will check the coherence of different messages and parameter examples to detect incomplete combination.\n\n**Severity:** `warn`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicrocks%2Fmicrocks-spectral-ruleset","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmicrocks%2Fmicrocks-spectral-ruleset","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicrocks%2Fmicrocks-spectral-ruleset/lists"}