From e585f45e47fb065cfcd350c340e938bfdcef4635 Mon Sep 17 00:00:00 2001 From: "kong-documentation-app[bot]" <247127266+kong-documentation-app[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 11:44:57 +0200 Subject: [PATCH 1/4] Generate Inso CLI reference docs (#5494) * Generate Inso CLI reference docs * feat(insomnia): update latest version to 13 --------- Co-authored-by: juliamrch <101819212+juliamrch@users.noreply.github.com> --- app/_data/products/insomnia.yml | 4 +- .../inso-cli/reference/13.0/export.md | 25 +++++++++++ .../inso-cli/reference/13.0/export_spec.md | 26 +++++++++++ .../inso-cli/reference/13.0/generate-docs.md | 21 +++++++++ .../inso-cli/reference/13.0/index.md | 41 ++++++++++++++++++ .../inso-cli/reference/13.0/lint.md | 25 +++++++++++ .../inso-cli/reference/13.0/lint_spec.md | 25 +++++++++++ .../inso-cli/reference/13.0/run.md | 26 +++++++++++ .../inso-cli/reference/13.0/run_collection.md | 43 +++++++++++++++++++ .../inso-cli/reference/13.0/run_test.md | 35 +++++++++++++++ .../inso-cli/reference/13.0/script.md | 21 +++++++++ 11 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 app/_references/inso-cli/reference/13.0/export.md create mode 100644 app/_references/inso-cli/reference/13.0/export_spec.md create mode 100644 app/_references/inso-cli/reference/13.0/generate-docs.md create mode 100644 app/_references/inso-cli/reference/13.0/index.md create mode 100644 app/_references/inso-cli/reference/13.0/lint.md create mode 100644 app/_references/inso-cli/reference/13.0/lint_spec.md create mode 100644 app/_references/inso-cli/reference/13.0/run.md create mode 100644 app/_references/inso-cli/reference/13.0/run_collection.md create mode 100644 app/_references/inso-cli/reference/13.0/run_test.md create mode 100644 app/_references/inso-cli/reference/13.0/script.md diff --git a/app/_data/products/insomnia.yml b/app/_data/products/insomnia.yml index 74c128616d..dc50512415 100644 --- a/app/_data/products/insomnia.yml +++ b/app/_data/products/insomnia.yml @@ -43,4 +43,6 @@ releases: version: "12.5.0" - release: "12.6" version: "12.6.0" - latest: true \ No newline at end of file + - release: "13.0" + version: "13.0.0" + latest: true diff --git a/app/_references/inso-cli/reference/13.0/export.md b/app/_references/inso-cli/reference/13.0/export.md new file mode 100644 index 0000000000..e486bac428 --- /dev/null +++ b/app/_references/inso-cli/reference/13.0/export.md @@ -0,0 +1,25 @@ +--- +title: export +--- + +## Command Description + +Export data from insomnia models + +## Syntax + +`export [options] [command]` + +## Global Flags + +- `-v, --version`: output the version number +- `-w, --workingDir `: set working directory/file: .insomnia folder, *.db.json, export.yaml +- `--verbose`: show additional logs while running the command +- `--ci`: run in CI, disables all prompts, defaults to false +- `--config `: path to configuration file containing above options (.insorc) +- `--printOptions`: print the loaded options + +## Subcommands + +- [`export spec`](/inso-cli/reference/export_spec/{{page.release}}/): Export an API Specification to a file, identifier can be an API Spec id + diff --git a/app/_references/inso-cli/reference/13.0/export_spec.md b/app/_references/inso-cli/reference/13.0/export_spec.md new file mode 100644 index 0000000000..a21f6a696e --- /dev/null +++ b/app/_references/inso-cli/reference/13.0/export_spec.md @@ -0,0 +1,26 @@ +--- +title: export spec +--- + +## Command Description + +Export an API Specification to a file, identifier can be an API Spec id + +## Syntax + +`export spec [options] [identifier]` + +## Local Flags + +- `-o, --output `: save the generated config to a file +- `-s, --skipAnnotations`: remove all "x-kong-" annotations, defaults to false + +## Global Flags + +- `-v, --version`: output the version number +- `-w, --workingDir `: set working directory/file: .insomnia folder, *.db.json, export.yaml +- `--verbose`: show additional logs while running the command +- `--ci`: run in CI, disables all prompts, defaults to false +- `--config `: path to configuration file containing above options (.insorc) +- `--printOptions`: print the loaded options + diff --git a/app/_references/inso-cli/reference/13.0/generate-docs.md b/app/_references/inso-cli/reference/13.0/generate-docs.md new file mode 100644 index 0000000000..4822b9d961 --- /dev/null +++ b/app/_references/inso-cli/reference/13.0/generate-docs.md @@ -0,0 +1,21 @@ +--- +title: generate-docs +--- + +## Command Description + + + +## Syntax + +`generate-docs [options]` + +## Global Flags + +- `-v, --version`: output the version number +- `-w, --workingDir `: set working directory/file: .insomnia folder, *.db.json, export.yaml +- `--verbose`: show additional logs while running the command +- `--ci`: run in CI, disables all prompts, defaults to false +- `--config `: path to configuration file containing above options (.insorc) +- `--printOptions`: print the loaded options + diff --git a/app/_references/inso-cli/reference/13.0/index.md b/app/_references/inso-cli/reference/13.0/index.md new file mode 100644 index 0000000000..9933b10103 --- /dev/null +++ b/app/_references/inso-cli/reference/13.0/index.md @@ -0,0 +1,41 @@ +--- +title: CLI Documentation +--- + +## Global Flags + +- `-v, --version`: output the version number +- `-w, --workingDir `: set working directory/file: .insomnia folder, *.db.json, export.yaml +- `--verbose`: show additional logs while running the command +- `--ci`: run in CI, disables all prompts, defaults to false +- `--config `: path to configuration file containing above options (.insorc) +- `--printOptions`: print the loaded options + + + +## Commands + +- [`run`](/inso-cli/reference/run/{{page.release}}/): Execution utilities +- [`lint`](/inso-cli/reference/lint/{{page.release}}/): Lint a yaml file in the workingDir or the provided file path (with .spectral.yml) or a spec in an Insomnia database directory +- [`export`](/inso-cli/reference/export/{{page.release}}/): Export data from insomnia models +- [`script`](/inso-cli/reference/script/{{page.release}}/): Run scripts defined in .insorc +- [`generate-docs`](/inso-cli/reference/generate-docs/{{page.release}}/): No description available + +## Subcommands + +- [`run test`](/inso-cli/reference/run_test/{{page.release}}/): Run Insomnia unit test suites, identifier can be a test suite id or a API Spec id +- [`run collection`](/inso-cli/reference/run_collection/{{page.release}}/): Run Insomnia request collection, identifier can be a workspace id + + +## Subcommands + +- [`lint spec`](/inso-cli/reference/lint_spec/{{page.release}}/): Lint an API Specification, identifier can be an API Spec id or a file path + + +## Subcommands + +- [`export spec`](/inso-cli/reference/export_spec/{{page.release}}/): Export an API Specification to a file, identifier can be an API Spec id + + + + diff --git a/app/_references/inso-cli/reference/13.0/lint.md b/app/_references/inso-cli/reference/13.0/lint.md new file mode 100644 index 0000000000..d3ebca5ef9 --- /dev/null +++ b/app/_references/inso-cli/reference/13.0/lint.md @@ -0,0 +1,25 @@ +--- +title: lint +--- + +## Command Description + +Lint a yaml file in the workingDir or the provided file path (with .spectral.yml) or a spec in an Insomnia database directory + +## Syntax + +`lint [options] [command]` + +## Global Flags + +- `-v, --version`: output the version number +- `-w, --workingDir `: set working directory/file: .insomnia folder, *.db.json, export.yaml +- `--verbose`: show additional logs while running the command +- `--ci`: run in CI, disables all prompts, defaults to false +- `--config `: path to configuration file containing above options (.insorc) +- `--printOptions`: print the loaded options + +## Subcommands + +- [`lint spec`](/inso-cli/reference/lint_spec/{{page.release}}/): Lint an API Specification, identifier can be an API Spec id or a file path + diff --git a/app/_references/inso-cli/reference/13.0/lint_spec.md b/app/_references/inso-cli/reference/13.0/lint_spec.md new file mode 100644 index 0000000000..7efca421dc --- /dev/null +++ b/app/_references/inso-cli/reference/13.0/lint_spec.md @@ -0,0 +1,25 @@ +--- +title: lint spec +--- + +## Command Description + +Lint an API Specification, identifier can be an API Spec id or a file path + +## Syntax + +`lint spec [options] [identifier]` + +## Local Flags + +- `-r, --ruleset `: path to a Spectral ruleset file, overrides default OAS ruleset and any ruleset in the API Spec folder + +## Global Flags + +- `-v, --version`: output the version number +- `-w, --workingDir `: set working directory/file: .insomnia folder, *.db.json, export.yaml +- `--verbose`: show additional logs while running the command +- `--ci`: run in CI, disables all prompts, defaults to false +- `--config `: path to configuration file containing above options (.insorc) +- `--printOptions`: print the loaded options + diff --git a/app/_references/inso-cli/reference/13.0/run.md b/app/_references/inso-cli/reference/13.0/run.md new file mode 100644 index 0000000000..3c11a9817e --- /dev/null +++ b/app/_references/inso-cli/reference/13.0/run.md @@ -0,0 +1,26 @@ +--- +title: run +--- + +## Command Description + +Execution utilities + +## Syntax + +`run [options] [command]` + +## Global Flags + +- `-v, --version`: output the version number +- `-w, --workingDir `: set working directory/file: .insomnia folder, *.db.json, export.yaml +- `--verbose`: show additional logs while running the command +- `--ci`: run in CI, disables all prompts, defaults to false +- `--config `: path to configuration file containing above options (.insorc) +- `--printOptions`: print the loaded options + +## Subcommands + +- [`run test`](/inso-cli/reference/run_test/{{page.release}}/): Run Insomnia unit test suites, identifier can be a test suite id or a API Spec id +- [`run collection`](/inso-cli/reference/run_collection/{{page.release}}/): Run Insomnia request collection, identifier can be a workspace id + diff --git a/app/_references/inso-cli/reference/13.0/run_collection.md b/app/_references/inso-cli/reference/13.0/run_collection.md new file mode 100644 index 0000000000..d26188f46c --- /dev/null +++ b/app/_references/inso-cli/reference/13.0/run_collection.md @@ -0,0 +1,43 @@ +--- +title: run collection +--- + +## Command Description + +Run Insomnia request collection, identifier can be a workspace id + +## Syntax + +`run collection [options] [identifier]` + +## Local Flags + +- `-t, --requestNamePattern `: run requests that match the regex +- `-i, --item `: request or folder id to run +- `-e, --env `: environment to use +- `-g, --globals `: global environment to use (filepath or id) +- `--delay-request `: milliseconds to delay between requests +- `--requestTimeout `: milliseconds before request times out +- `--env-var `: override environment variables +- `-n, --iteration-count `: number of times to repeat +- `-d, --iteration-data `: file path or url (JSON or CSV) +- `-r, --reporter `: reporter to use, options are [dot, list, min, progress, spec, tap] +- `-b, --bail`: abort ("bail") after first non-200 response +- `--disableCertValidation`: disable certificate validation for requests with SSL +- `--httpsProxy `: URL for the proxy server for https requests. +- `--httpProxy `: URL for the proxy server for http requests. +- `--noProxy `: Comma separated list of hostnames that do not require a proxy to get reached, even if one is specified. +- `-f, --dataFolders [dataFolders...]`: This allows you to control what folders Insomnia (and scripts within Insomnia) can read/write to. +- `--output `: Output the results to a file in JSON format. +- `--includeFullData `: Include full data in the output file, including request, response, environment and etc. +- `--acceptRisk`: Accept the security warning when outputting to a file, please make sure you understand the risks. + +## Global Flags + +- `-v, --version`: output the version number +- `-w, --workingDir `: set working directory/file: .insomnia folder, *.db.json, export.yaml +- `--verbose`: show additional logs while running the command +- `--ci`: run in CI, disables all prompts, defaults to false +- `--config `: path to configuration file containing above options (.insorc) +- `--printOptions`: print the loaded options + diff --git a/app/_references/inso-cli/reference/13.0/run_test.md b/app/_references/inso-cli/reference/13.0/run_test.md new file mode 100644 index 0000000000..1f90658891 --- /dev/null +++ b/app/_references/inso-cli/reference/13.0/run_test.md @@ -0,0 +1,35 @@ +--- +title: run test +--- + +## Command Description + +Run Insomnia unit test suites, identifier can be a test suite id or a API Spec id + +## Syntax + +`run test [options] [identifier]` + +## Local Flags + +- `-e, --env `: environment to use +- `-t, --testNamePattern `: run tests that match the regex +- `-r, --reporter `: reporter to use, options are [dot, list, min, progress, spec, tap] +- `-b, --bail`: abort ("bail") after first test failure +- `--keepFile`: do not delete the generated test file +- `--requestTimeout `: milliseconds before request times out +- `-k, --disableCertValidation`: disable certificate validation for requests with SSL +- `--httpsProxy `: URL for the proxy server for https requests. +- `--httpProxy `: URL for the proxy server for http requests. +- `--noProxy `: Comma separated list of hostnames that do not require a proxy to get reached, even if one is specified. +- `-f, --dataFolders [dataFolders...]`: This allows you to control what folders Insomnia (and scripts within Insomnia) can read/write to. + +## Global Flags + +- `-v, --version`: output the version number +- `-w, --workingDir `: set working directory/file: .insomnia folder, *.db.json, export.yaml +- `--verbose`: show additional logs while running the command +- `--ci`: run in CI, disables all prompts, defaults to false +- `--config `: path to configuration file containing above options (.insorc) +- `--printOptions`: print the loaded options + diff --git a/app/_references/inso-cli/reference/13.0/script.md b/app/_references/inso-cli/reference/13.0/script.md new file mode 100644 index 0000000000..f84edd2133 --- /dev/null +++ b/app/_references/inso-cli/reference/13.0/script.md @@ -0,0 +1,21 @@ +--- +title: script +--- + +## Command Description + +Run scripts defined in .insorc + +## Syntax + +`script [options] ` + +## Global Flags + +- `-v, --version`: output the version number +- `-w, --workingDir `: set working directory/file: .insomnia folder, *.db.json, export.yaml +- `--verbose`: show additional logs while running the command +- `--ci`: run in CI, disables all prompts, defaults to false +- `--config `: path to configuration file containing above options (.insorc) +- `--printOptions`: print the loaded options + From a74a551d712e10fe301b09139aee60420a6039ce Mon Sep 17 00:00:00 2001 From: Julia <101819212+juliamrch@users.noreply.github.com> Date: Wed, 10 Jun 2026 15:51:48 +0200 Subject: [PATCH 2/4] feat(Platform): Multiple products entities (#5505) * feat: add tier and tiers to frontmatter schema * feat: pass `tiers` to templates and render them Handle both `tier` and `tiers` * feat: handle `tiers` in llm metadata * fix: don't allow setting tier and tiers * feat: add support for setting `entities_product: x` in `prereqs` This allows having multiple products in the frontmatter, and relying on a different one for rendering the entities, e.g. it's now possible to set insomnia as the main product (first on the list) and use gateway entities in the prereqs. --------- Co-authored-by: Fabian Rodriguez --- app/_data/schemas/frontmatter/base.json | 15 +++++ app/_includes/components/prereqs.html | 3 +- app/_includes/components/prereqs.md | 3 +- app/_includes/landing_pages/header.md | 3 + app/_includes/layouts/main.html | 6 +- app/_includes/tier.html | 58 +++++++++++++++----- app/_includes/uses.html | 7 ++- app/_plugins/drops/prereqs.rb | 13 +++-- app/_plugins/generators/data/llm_metadata.rb | 10 ++++ 9 files changed, 92 insertions(+), 26 deletions(-) diff --git a/app/_data/schemas/frontmatter/base.json b/app/_data/schemas/frontmatter/base.json index 754f9261f7..e2e7bfbe6d 100644 --- a/app/_data/schemas/frontmatter/base.json +++ b/app/_data/schemas/frontmatter/base.json @@ -73,8 +73,23 @@ "tags": { "type": "array", "items": { "$ref": "schema:tags" } + }, + "tier": { + "type": "string" + }, + "tiers": { + "type": "object", + "patternProperties": { + "^[a-z][a-z0-9-]*$": { + "type": "string" + } + }, + "additionalProperties": false } }, + "not": { + "required": ["tier", "tiers"] + }, "if": { "properties": { "products": { diff --git a/app/_includes/components/prereqs.html b/app/_includes/components/prereqs.html index 6338b1cea3..44f9d48d45 100644 --- a/app/_includes/components/prereqs.html +++ b/app/_includes/components/prereqs.html @@ -124,9 +124,8 @@ {% endif %} {% if prereqs.entities? %} - {% if product == 'operator' %}{% assign product='kic' %}{% endif %}
- {% assign prereq_path = "prereqs/entities/" | append: product | append: ".md" %} + {% assign prereq_path = "prereqs/entities/" | append: prereqs.entities_product | append: ".md" %} {% include {{ prereq_path }} data=prereqs.data %}
{% endif %} diff --git a/app/_includes/components/prereqs.md b/app/_includes/components/prereqs.md index af9018035c..3fbcbc6e2f 100644 --- a/app/_includes/components/prereqs.md +++ b/app/_includes/components/prereqs.md @@ -71,8 +71,7 @@ {% include prereqs/operator/konnect_network.md config=prereqs.operator.konnect %} {%- endif -%} {%- if prereqs.entities? -%} -{%- if product == 'operator' %}{% assign product='kic' %}{% endif %} -{%- assign prereq_path = "prereqs/entities/" | append: product | append: ".md" -%} +{%- assign prereq_path = "prereqs/entities/" | append: prereqs.entities_product | append: ".md" -%} {% include {{ prereq_path }} data=prereqs.data %} {%- endif -%} {%- for prereq in prereqs.inline_without_position %} diff --git a/app/_includes/landing_pages/header.md b/app/_includes/landing_pages/header.md index 62aad9b1a5..5f353cd06e 100644 --- a/app/_includes/landing_pages/header.md +++ b/app/_includes/landing_pages/header.md @@ -12,6 +12,9 @@
{% if page.tier %} {% include tier.html products=page.products tier=page.tier %} + {% endif %} + {% if page.tiers %} + {% include tier.html products=page.products tiers=page.tiers %} {% endif %} {%- if page.beta == true or page.tech_preview == true -%} {%- include_cached badges/stage.html beta=page.beta tech_preview=page.tech_preview -%} diff --git a/app/_includes/layouts/main.html b/app/_includes/layouts/main.html index 4b0ca43a21..a5e6e1d8e1 100644 --- a/app/_includes/layouts/main.html +++ b/app/_includes/layouts/main.html @@ -2,6 +2,7 @@ {%- if layout.uses == false and page.beta == true -%}{%- assign show_badges = true -%}{%- endif -%} {%- if layout.uses == false and page.tech_preview == true -%}{%- assign show_badges = true -%}{%- endif -%} {%- if layout.tier_inline == true and page.tier -%}{%- assign show_badges = true -%}{%- endif -%} +{%- if layout.tier_inline == true and page.tiers -%}{%- assign show_badges = true -%}{%- endif -%} {%- if page.premium_partner or page.third_party -%}{%- assign show_badges = true -%}{%- endif %}
@@ -17,6 +18,9 @@

{{ page.title | liquify }} {% if layout.tier_inline == true and page.tier %} {% include tier.html products=page.products tier=page.tier %} {% endif %} + {% if layout.tier_inline == true and page.tiers %} + {% include tier.html products=page.products tiers=page.tiers %} + {% endif %} {% if layout.uses == false %} {%- if page.beta == true or page.tech_preview == true -%} @@ -43,7 +47,7 @@

{{ page.title | liquify }} {% endif %} {% if layout.uses != false %} - {% include_cached uses.html products=page.products tools=page.tools tier=page.tier beta=page.beta tech_preview=page.tech_preview %} + {% include_cached uses.html products=page.products tools=page.tools tier=page.tier tiers=page.tiers beta=page.beta tech_preview=page.tech_preview %} {% endif %} {% ifhascontent nav_header %} diff --git a/app/_includes/tier.html b/app/_includes/tier.html index 7f27acb36f..8f8f754bdd 100644 --- a/app/_includes/tier.html +++ b/app/_includes/tier.html @@ -1,20 +1,48 @@ {% unless page.plugin? %} -{% if include.products and include.products.size > 1 %} -{% raise "tier.html include called with a tier and more than one product." %} +{% if include.tier and include.tiers %} +{% raise "tier.html: page `{{page.url}}` sets both `tier` and `tiers`. Use one or the other." %} +{% endif %} +{% if include.tier and include.products and include.products.size > 1 %} +{% raise "tier.html: page `{{page.url}}` sets `tier` with more than one product. Use `tiers:` to map each product to its tier." %} {% endif %} {% endunless %} -{% assign product = include.products.first %} -{% assign tier = site.data.products[product].tiers[include.tier] %} -{% unless tier %} - {%- capture available_tiers -%} - {%- for tier in site.data.products[product].tiers -%}{{tier[0]}}{% unless forloop.last %}, {% endunless %}{%- endfor -%} - {%- endcapture -%} - {% raise "tier.html: invalid tier `{{include.tier}}` for product: `{{product}}`. Available tiers: {{available_tiers}}" %} -{% endunless %} +{% if include.tier %} + {% assign product = include.products.first %} + {% assign tier_data = site.data.products[product].tiers[include.tier] %} + {% unless tier_data %} + {%- capture available_tiers -%} + {%- for t in site.data.products[product].tiers -%}{{t[0]}}{% unless forloop.last %}, {% endunless %}{%- endfor -%} + {%- endcapture -%} + {% raise "tier.html: invalid tier `{{include.tier}}` for product: `{{product}}`. Available tiers: {{available_tiers}}" %} + {% endunless %} + + {% if include.url %} + {% include badge.html url=tier_data.url text=tier_data.text css_class=include.tier %} + {% else %} + {% include badge.html text=tier_data.text css_class=include.tier %} + {% endif %} +{% elsif include.tiers %} + {% for pair in include.tiers %} + {% assign tier_product = pair[0] %} + {% assign tier_name = pair[1] %} -{% if include.url %} -{% include badge.html url=tier.url text=tier.text css_class=include.tier %} -{% else %} -{% include badge.html text=tier.text css_class=include.tier %} -{% endif %} \ No newline at end of file + {% unless include.products contains tier_product %} + {% raise "tier.html: product `{{tier_product}}` listed in `tiers` is not present in `products` for page `{{page.url}}`." %} + {% endunless %} + + {% assign tier_data = site.data.products[tier_product].tiers[tier_name] %} + {% unless tier_data %} + {%- capture available_tiers -%} + {%- for t in site.data.products[tier_product].tiers -%}{{t[0]}}{% unless forloop.last %}, {% endunless %}{%- endfor -%} + {%- endcapture -%} + {% raise "tier.html: invalid tier `{{tier_name}}` for product: `{{tier_product}}`. Available tiers: {{available_tiers}}" %} + {% endunless %} + + {% if include.url %} + {% include badge.html url=tier_data.url text=tier_data.text css_class=tier_name %} + {% else %} + {% include badge.html text=tier_data.text css_class=tier_name %} + {% endif %} + {% endfor %} +{% endif %} diff --git a/app/_includes/uses.html b/app/_includes/uses.html index 3cf1bcb4a5..6bd7f6a0af 100644 --- a/app/_includes/uses.html +++ b/app/_includes/uses.html @@ -1,4 +1,4 @@ -{% if include.products or include.tools or include.tier or include.beta == true or include.tech_preview == true %} +{% if include.products or include.tools or include.tier or include.tiers or include.beta == true or include.tech_preview == true %}
{%- if include.beta == true or include.tech_preview == true -%} {%- include_cached badges/stage.html beta=include.beta tech_preview=include.tech_preview -%} @@ -7,8 +7,11 @@ {% if include.tier %} {% include tier.html products=include.products tier=include.tier %} {% endif %} + {% if include.tiers %} + {% include tier.html products=include.products tiers=include.tiers %} + {% endif %} - {% if include.tier or include.beta == true or include.tech_preview == true %} + {% if include.tier or include.tiers or include.beta == true or include.tech_preview == true %} {% if include.products or include.tools %} and uses: {% endif %} diff --git a/app/_plugins/drops/prereqs.rb b/app/_plugins/drops/prereqs.rb index 6fd499eb98..cb7d3aec0c 100644 --- a/app/_plugins/drops/prereqs.rb +++ b/app/_plugins/drops/prereqs.rb @@ -68,11 +68,16 @@ def inline @inline ||= prereqs.fetch('inline', []) end - def data - product = @page.data.fetch('products', [])[0] + def entities_product + @entities_product ||= begin + product = prereqs['entities_product'] || @page.data.fetch('products', [])[0] + product = 'kic' if product == 'operator' + product + end + end - # Use KIC rendering for Operator for now - product = 'kic' if product == 'operator' + def data + product = entities_product yaml = {} yaml = { '_format_version' => '3.0' } if product == 'gateway' diff --git a/app/_plugins/generators/data/llm_metadata.rb b/app/_plugins/generators/data/llm_metadata.rb index bb96633c20..599cf1b672 100644 --- a/app/_plugins/generators/data/llm_metadata.rb +++ b/app/_plugins/generators/data/llm_metadata.rb @@ -37,6 +37,7 @@ def frontmatter 'ai_gateway_enterprise' => @page.data['ai_gateway_enterprise'], 'min_version' => @page.data['min_version'], 'tier' => @page.data['tier'], + 'tiers' => resolve_tiers(@page.data['tiers']), 'products' => resolve_names(@page.data['products'], 'products'), 'tools' => resolve_names(@page.data['tools'], 'tools'), 'beta' => @page.data['beta'] @@ -56,6 +57,15 @@ def resolve_names(slugs, data_key) Array(slugs).map { |slug| @site.data.dig(data_key, slug, 'name') || slug } end + def resolve_tiers(tiers) + return if tiers.nil? || tiers.empty? + + tiers.each_with_object({}) do |(product, tier_name), out| + name = @site.data.dig('products', product, 'name') || product + out[name] = @site.data.dig('products', product, 'tiers', tier_name, 'text') || tier_name + end + end + def plugin_metadata if @page.data['plugin?'] && @page.data['overview?'] { From 3415d9db56892263834e9b95afb4b075bb181118 Mon Sep 17 00:00:00 2001 From: Julia <101819212+juliamrch@users.noreply.github.com> Date: Fri, 12 Jun 2026 13:08:18 +0200 Subject: [PATCH 3/4] feat(Insomnia): custom linting rules for cloud and local (#5287) * feat(insomnia): draft structure for custom linting rules for cloud projects * fix: header * feat(insomnia): update custom linting rules * feat(insomnia): upload custom linting summary * Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Julia <101819212+juliamrch@users.noreply.github.com> * feat(insomnia): specify Spectral ruleset * feat(insomnia): include -r flag and specify the custom ruleset * feat(insomnia): add min version * fix(insomnia): syntax * feat(insomnia): include spectral core functions note * feat(insomnia): include viewing but not editing feature for custom rulesets * feat(insomnia): remove screenshot * feat(insomnia): use variables for Insomnia name * feat(release): update version * feat(insomnia): extends remote file reference + version warning * styles(vale): fix repeated word * Apply suggestion from @cloudjumpercat Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com> * Apply suggestion from @cloudjumpercat Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com> * Apply suggestion from @cloudjumpercat Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com> * Apply suggestion from @cloudjumpercat Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com> * Apply suggestion from @juliamrch * apply suggestions from Diana Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com> * Apply suggestion from @cloudjumpercat Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com> --- .../insomnia/add-custom-linting-rules.md | 95 +++++++++++++----- .../insomnia/custom-linting-warning.png | Bin 26336 -> 0 bytes app/insomnia/api-specs.md | 4 +- 3 files changed, 72 insertions(+), 27 deletions(-) delete mode 100644 app/assets/images/insomnia/custom-linting-warning.png diff --git a/app/_how-tos/insomnia/add-custom-linting-rules.md b/app/_how-tos/insomnia/add-custom-linting-rules.md index ee8fbfad2d..6976a945bc 100644 --- a/app/_how-tos/insomnia/add-custom-linting-rules.md +++ b/app/_how-tos/insomnia/add-custom-linting-rules.md @@ -1,51 +1,51 @@ --- -title: Add custom linting rules in Insomnia +title: "Add custom linting rules in {{ site.data.products.insomnia.name }}" permalink: /how-to/add-custom-linting-rules/ content_type: how_to -description: Learn how to add custom linting rules to your APIs in Insomnia. +description: Learn how to add custom linting rules to your APIs in Insomnia . +no_wrap: true products: -- insomnia + - insomnia +min_version: + insomnia: "13.0" tags: - insomnia-documents - linting related_resources: - - text: Design APIs with Insomnia + - text: "Design APIs with {{ site.data.products.insomnia.name }}" url: /insomnia/design/ - -tldr: - q: How do I customize linting in Insomnia? - a: In your Git repository, add a `.spectral.yaml` file containing your custom ruleset at the same directory as the OAS file to lint. +tldr: + q: How do I customize linting in {{ site.data.products.insomnia.name }} ? + a: In your {{ site.data.products.insomnia.name }} document, click the upload icon for the **Default OAS Ruleset** and add a Spectral ruleset YAML file with your custom ruleset. prereqs: inline: - title: Create a design document include_content: prereqs/design-document icon_url: /assets/icons/file.svg - - title: Synchronize with Git - include_content: prereqs/git-sync - icon_url: /assets/icons/git.svg faqs: - q: How can I use custom linting with Inso CLI? a: | - Create your `.spectral.yaml` file in the same directory as the OAS file to lint, then run the [`inso lint spec`](/inso-cli/reference/lint_spec/) command. + Create a [Spectral ruleset](https://docs.stoplight.io/docs/spectral/e5b9616d6d50c-rulesets) in YAML format, and upload it to an OAS file document in Insomnia by clicking the upload icon for the **Default OAS Ruleset**. --- -## Create add the file ruleset - -In the Git repository connected to your document, create a `.spectral.yaml` at the same directory as the OAS file to lint. +{{ site.data.products.insomnia.name }} provides a default linting ruleset. Override it to add your custom linting rules by following these steps: ## Define the rules -The custom ruleset overrides the default one. If you want to create a completely new ruleset, you can simply add your rules in the file using the [Spectral](https://docs.stoplight.io/docs/spectral/e5b9616d6d50c-rulesets) syntax. If you want to extend an existing ruleset, specify the ruleset with the `extend` property in `.spectral.yaml`. +The custom ruleset overrides the default one. To create a new ruleset, add your rules in the file using the [Spectral](https://docs.stoplight.io/docs/spectral/e5b9616d6d50c-rulesets) syntax. If you want to extend an existing ruleset, specify the ruleset with the `extends` property. + +{:.info} +> Available Spectral top level properties in {{ site.data.products.insomnia.name }} are `rules` and `extends`. Custom functions are not permitted. However, {{ site.data.products.insomnia.name }} provides support for [Spectral built-in core functions](https://docs.stoplight.io/docs/spectral/cb95cf0d26b83-core-functions). -For example, if you want to extend the default [Spectral OpenAPI](https://docs.stoplight.io/docs/spectral/4dec24461f3af-open-api-rules) ruleset to add a warning when tags don't have a description, you can add the following content to `.spectral.yaml`: +For example, to extend the default [Spectral OpenAPI](https://docs.stoplight.io/docs/spectral/4dec24461f3af-open-api-rules) ruleset to add a warning when tags don't have a description, add the following content to your ruleset file: ```yaml extends: spectral:oas @@ -59,20 +59,65 @@ rules: function: truthy ``` -## Synchronize the changes +## Upload the ruleset file -Commit and push the file on the repository, then pull the changes in Insomnia. +1. In the {{ site.data.products.insomnia.name }} app, navigate to a document with the OAS file you want to lint. +2. Click the upload icon for **Default OAS Ruleset** at the bottom of the pane. -{:.info} -> This will place the `.spectral.yaml` file in the local working directory. You will not see the file in the Insomnia UI but the linting rules will be applied to the associated OAS file. +This places the ruleset file in the local working directory. {{ site.data.products.insomnia.name }} renames this custom ruleset as `.spectral.yaml`. + +You can view the content of the file by clicking `Custom Ruleset` in {{ site.data.products.insomnia.name }}. If you want to make changes to the file, edit it locally. ## Validate -Close and reopen the document to apply the changes. In this example, you can validate by creating a new tag without a description: +In this example, you can confirm the rule triggers by removing the description for the `GET /flights` endpoint. This will be flagged since the ruleset doesn't allow tags without a description: + ```yaml -tags: - - name: flight-data +"/flights": + get: + summary: Get KongAir planned flights + tags: + - flight-data ``` This causes a new warning to appear: -![Missing tag description warning](/assets/images/insomnia/custom-linting-warning.png) + +``` +tag-description Tags must have a description. +``` + +## Override the rules {% new_in 13 %} + +Override the linting rules and use another ruleset, by using either Inso CLI or `.spectral.yaml`: + +{% navtabs "custom linting" %} +{% navtab "Inso CLI" %} + +Use the [Inso CLI(/inso-cli/reference/lint_spec/) with the `--ruleset` or `-r` flag and the path to your custom ruleset. Run `inso lint spec --ruleset `. This overrides the default OpenAPI specifications (OAS) ruleset in {{ site.data.products.insomnia.name }} , and any ruleset in the API Spec folder. + +If the `--ruleset` flag isn't specified, {{ site.data.products.insomnia.name }} uses one of the following, in order: + +- The ruleset defined in `.spectral.yaml`, if it exists. +- The default OAS ruleset. + +{% endnavtab %} +{% navtab "Use `extends` in `.spectral.yaml`" %} + +Make {{ site.data.products.insomnia.name }} point at another ruleset in `.spectral.yaml` by using the `extends` property. For example: + +```yaml +extends: + - spectral:oas + - ./rules/my-rules.yaml +``` + +If you reference a remote file (one hosted outside of your project in {{ site.data.products.insomnia.name }}), {{ site.data.products.insomnia.name }} fetches its content only when you upload the custom ruleset. If the remote file later changes, {{ site.data.products.insomnia.name }}: + +- Doesn't track those changes in commits, because the file lives outside the project. +- Doesn't fetch them automatically for security reasons. Instead, you can refresh manually using the button next to the ruleset option. + +{% endnavtab %} +{% endnavtabs %} + +{:.warning} +> Make sure users in your team are running at least {{ site.data.products.insomnia.name }} `13.0` to avoid compatibility issues with this feature. \ No newline at end of file diff --git a/app/assets/images/insomnia/custom-linting-warning.png b/app/assets/images/insomnia/custom-linting-warning.png deleted file mode 100644 index d4e9380771e6a7f011271a8dfbf9e95d95b48fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26336 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 diff --git a/app/insomnia/api-specs.md b/app/insomnia/api-specs.md index c113b44bd4..1991efe1e9 100644 --- a/app/insomnia/api-specs.md +++ b/app/insomnia/api-specs.md @@ -123,8 +123,8 @@ rows:
For more information, see the [`inso lint spec` reference](/inso-cli/reference/lint_spec/). - usecase: Use custom linting to ensure your spec adheres to your team or company's standards instructions: | - To lint locally, create a `.spectral.yaml` file with the custom rules in the same directory as the `oas.yaml` file you want to lint. Then run `inso lint spec ./oas.yaml` from that directory.

- To [apply custom lint rules in the Insomnia UI](/how-to/add-custom-linting-rules/), add the `.spectral.yaml` file to the root of the collection git repository at the same level as the `.insomnia` folder. + To lint locally, create a YAML file in the project with the custom rules in the same directory as the `oas.yaml` file you want to lint. The Inso CLI picks the rules regardless of the file name. Then run `inso lint spec ./oas.yaml` from that directory.

+ To [apply custom lint rules in the Insomnia UI](/how-to/add-custom-linting-rules/), upload a ruleset YAML file to the project that contains the design document you want to lint. {% endtable %} ### Work with requests From 65d0960eb45f375ca7810195bfe657ae4e724483 Mon Sep 17 00:00:00 2001 From: Julia <101819212+juliamrch@users.noreply.github.com> Date: Fri, 12 Jun 2026 13:57:58 +0200 Subject: [PATCH 4/4] feat(insomnia): specify backward compatibility risks --- app/insomnia/release-policy.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/insomnia/release-policy.md b/app/insomnia/release-policy.md index f65489829e..5ed5485027 100644 --- a/app/insomnia/release-policy.md +++ b/app/insomnia/release-policy.md @@ -35,11 +35,13 @@ Public documentation updates support the latest versions of Insomnia. ## Release types - **Generally Available (GA)**: Released to all users. -- **Beta**: A 7-day period before GA when users can opt in to test the release and provide early feedback. Opt in via **Settings > Release Channel** in the Insomnia app. +- **Beta**: A 7-day period before GA when users can opt in to test the release and provide early feedback. - **Preview** or **Tech Preview**: Features that are ready to use but still in active development. Preview features are clearly marked in the product. Learn more about stages of software availability [on the dedicated page](/stages-of-software-availability/). +To try the **Beta** release, opt in via **Settings > Release Channel** in the Insomnia app. This setting lets you switch between **Beta** and **GA** versions. Beta versions can include breaking changes that aren't backward compatible. + {:.info} > Insomnia strongly recommends using the newest version, and that all users collaborating on the same project remain on the same major version.