diff --git a/CHANGELOG.md b/CHANGELOG.md index b38847ac..5291a202 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Collection conformance class URI should be `https://api.stacspec.org/v1.0.0-beta.XXX/collections` instead + of `http://stacspec.org/spec/api/1.0.0-beta.XXX/extensions/collections` - definition of Item object was missing `properties` as an attribute ## [v1.0.0-beta.4] - 2020-10-05 diff --git a/README.md b/README.md index c6393d7b..d9714029 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,10 @@ ## About -The SpatioTemporal Asset Catalog (STAC) specification aims to standardize the way geospatial assets are exposed online and queried. +The SpatioTemporal Asset Catalog (STAC) family of specifications aim to standardize the way geospatial asset metadata is structured and queried. A 'spatiotemporal asset' is any file that represents information about the earth captured in a certain space and -time. The core STAC specification lives at [gitub.com/radiantearth/stac-spec](https://github.com/radiantearth/stac-spec). +time. The core STAC specifications live in the GitHub repository [radiantearth/stac-spec](https://github.com/radiantearth/stac-spec). + A STAC API is the dynamic version of a SpatioTemporal Asset Catalog. It returns a STAC [Catalog](stac-spec/catalog-spec/catalog-spec.md), [Collection](stac-spec/collection-spec/collection-spec.md), [Item](stac-spec/item-spec/item-spec.md), @@ -24,7 +25,8 @@ Typically, a Feature is used when returning a single Item object, and FeatureCol JSON array of Item entities). The API can be implemented in compliance with the *[OGC API - Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html)* standard -(we'll use OAFeat for shorthand). In this case STAC API can be thought of as a specialized Features API +(OAFeat is a shorthand). In this case STAC API can be thought of as a specialized Features API + to search STAC catalogs, where the features returned are STAC [Item](stac-spec/item-spec/item-spec.md) objects, that have common properties, links to their assets and geometries that represent the footprints of the geospatial assets. @@ -64,6 +66,9 @@ The *[ogcapi-features](ogcapi-features)* folder describes how a STAC API can ful Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to expose individual `items` endpoints for search of each STAC collection. It also includes extensions that can be used to further enhance OAFeat. +**STAC API - Collections:** +The *[collections](collections)* folder describes how a STAC API can advertise the Collections it contains. + **Extensions:** The *[extensions](extensions.md) document* describes how STAC incubates new functionality, and it links to the existing extensions that can be added to enrich the functionality of a STAC API. Each has an OpenAPI yaml, but some of the yaml diff --git a/collections/README.md b/collections/README.md index f4413598..2bfd997b 100644 --- a/collections/README.md +++ b/collections/README.md @@ -7,16 +7,17 @@ - [Example](#example) - **OpenAPI specification:** [openapi.yaml](openapi.yaml) ([rendered version](https://api.stacspec.org/v1.0.0-beta.5/collections)) -- **Conformance URI:** +- **Conformance URI:** - **Extension [Maturity Classification](../extensions.md#extension-maturity):** Pilot - **Dependencies**: [STAC API - Core](../core) A STAC API can return information about all STAC [Collections](../stac-spec/collection-spec/collection-spec.md) available using a link -from the landing page that uses the `data` rel, which links to an endpoint called `/collections`. Individual STAC collections can be accessed +from the landing page that uses the `data` rel, which links to an endpoint called `/collections`. +Individual STAC collections can be accessed by providing the Collection `id` as a path past that endpoint: `/collections/{collectionId}`. **NOTE**: *This conformance class is directly based on the [Features Collection](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html#_collections_) -section of OAFeat, which is in the process of becoming a 'building block in [OGC API - Common - Part 2: Geospatial +section of OAFeat, which is in the process of becoming a 'building block' in [OGC API - Common - Part 2: Geospatial Data](http://docs.opengeospatial.org/DRAFTS/20-024.html) as the [Collections requirements class](http://docs.opengeospatial.org/DRAFTS/20-024.html#rc_collections-section). Once the Common version is released we will aim to align with it. But it still seems to be in flux.* diff --git a/collections/openapi.yaml b/collections/openapi.yaml index 309cae4f..83e07899 100644 --- a/collections/openapi.yaml +++ b/collections/openapi.yaml @@ -3,8 +3,8 @@ info: title: STAC API - Collections version: '1.0.0-beta.5' description: >- - This is an OpenAPI definition of the SpatioTemporal Asset Catalog API - Core - specification. This is a subset of the STAC API - Collections specification. + This is an OpenAPI definition of the SpatioTemporal Asset Catalog API - Collections + specification. This is a subset of the STAC API - Features specification. contact: name: STAC Specification url: 'http://stacspec.org' @@ -12,9 +12,9 @@ info: name: Apache License 2.0 url: 'http://www.apache.org/licenses/LICENSE-2.0' tags: - - name: Features + - name: Collections description: |- - All endpoints related to OGC API - Features - Part 1: Core + All endpoints related to STAC API - Collections paths: '/': get: @@ -61,14 +61,6 @@ paths: rel: service-doc type: text/html title: the API documentation - - href: 'http://data.example.org/sentinel-1' - rel: child - type: application/json - title: Sentinel 1 Catalog - - href: 'http://data.example.org/sentinel-2' - rel: child - type: application/json - title: Sentinel 2 Catalog - href: 'http://data.example.org/conformance' rel: conformance type: application/json @@ -77,20 +69,6 @@ paths: rel: data type: application/json title: Information about the feature collections - '/conformance': - get: - tags: - - Features - summary: information about specifications that this API conforms to - description: |- - A list of all conformance classes specified in a standard that the - server conforms to. - operationId: getConformanceDeclaration - responses: - '200': - $ref: '#/components/responses/ConformanceDeclaration' - '500': - $ref: '#/components/responses/ServerError' '/collections': get: tags: @@ -147,23 +125,6 @@ components: items: $ref: '../core/commons.yaml#/components/schemas/collection' responses: - ConformanceDeclaration: - description: |- - The URIs of all conformance classes supported by the server. - - To support "generic" clients that want to access multiple - OGC API Features implementations - and not "just" a specific - API / server, the server declares the conformance - classes it implements and conforms to. - content: - application/json: - schema: - $ref: '../core/commons.yaml#/components/schemas/conformanceClasses' - example: - conformsTo: - - 'http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/core' - - 'http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/oas30' - - 'http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/geojson' Collections: description: |- The feature collections shared by this API. diff --git a/extensions.md b/extensions.md index 01c04474..05a25424 100644 --- a/extensions.md +++ b/extensions.md @@ -53,11 +53,11 @@ This is the list of all extensions that are contained in the stac-api-spec repos | Extension Name | Scope* | Description | Maturity | | --------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | | [Fields](item-search/README.md#fields) | [Item Search](item-search/) request | Adds parameter to control which fields are returned in the response. | *Pilot* | -| [Filter](item-search/README.md#filter) | [Item Search](item-search/) and [STAC - Features API](ogcapi-features) `/items` requests | Adds parameter to search Item and Collection properties. | *Pilot* | +| [Filter](item-search/README.md#filter) | [Item Search](item-search/) and [STAC API - Features](ogcapi-features) `/items` requests | Adds parameter to search Item and Collection properties. | *Pilot* | | [Context](item-search/README.md#context) | [Item Search](item-search/) response ([ItemCollection](fragments/itemcollection/README.md)) | Adds search related metadata (context) to ItemCollection. | *Proposal* | | [Sort](item-search/README.md#sort) | [Item Search](item-search/) request | Adds Parameter to control sorting of returns results. | *Pilot* | -| [Transaction](ogcapi-features/extensions/transaction/README.md) | [STAC - Features API](ogcapi-features) POST on `/items` endpoint, DELETE/PUT on `/items/{itemId}` endpoint | Adds PUT and DELETE endpoints for the creation, editing, and deleting of Item objects. | *Pilot* | -| [Items and Collections API Version](ogcapi-features/extensions/version/README.md) | [STAC - Features API](ogcapi-features) on `/items` endpoint | Adds GET versions resource to Collection and Item endpoints and provides semantics for a versioning scheme for Collection and Item objects. | *Proposal* | +| [Transaction](ogcapi-features/extensions/transaction/README.md) | [STAC API - Features](ogcapi-features) POST on `/items` endpoint, DELETE/PUT on `/items/{itemId}` endpoint | Adds PUT and DELETE endpoints for the creation, editing, and deleting of Item objects. | *Pilot* | +| [Items and Collections API Version](ogcapi-features/extensions/version/README.md) | [STAC API - Features](ogcapi-features) on `/items` endpoint | Adds GET versions resource to Collection and Item endpoints and provides semantics for a versioning scheme for Collection and Item objects. | *Proposal* | | [Query](item-search/README.md#query) | [Item Search](item-search/) request | Adds parameter to search Item and Collection properties. | *Pilot*, scheduled to be *Deprecated* | ### Conformance classes of extensions diff --git a/fragments/context/README.md b/fragments/context/README.md index 6cc6d7c4..801339c7 100644 --- a/fragments/context/README.md +++ b/fragments/context/README.md @@ -13,7 +13,7 @@ object when the ItemCollection is the result of a search, for example, from call This fragment may be bound to either or both of [Item Search](../../item-search) (`/search` endpoint) or -[STAC Features](../../ogcapi-features) (`/collections/{collection_id}/items` endpoint) by +[STAC Features](../../ogcapi-features) (`/collections/{collectionId}/items` endpoint) by advertising the relevant conformance class. **Note**: OGC API Features - Part 1 has its own way returning `numberMatched` and `numberReturned` at the top level, instead of in a context diff --git a/fragments/fields/README.md b/fragments/fields/README.md index e03ce041..c257affb 100644 --- a/fragments/fields/README.md +++ b/fragments/fields/README.md @@ -15,7 +15,7 @@ fragment provides a mechanism for clients to request that servers to explicitly This fragment may be bound to either or both of [Item Search](../../item-search) (`/search` endpoint) or -[STAC Features](../../ogcapi-features) (`/collections/{collection_id}/items` endpoint) by +[STAC Features](../../ogcapi-features) (`/collections/{collectionId}/items` endpoint) by advertising the relevant conformance class. When used in a POST request with `Content-Type: application/json`, this adds an attribute `fields` with diff --git a/fragments/filter/openapi.yaml b/fragments/filter/openapi.yaml index 7d2ff30d..7bde7369 100644 --- a/fragments/filter/openapi.yaml +++ b/fragments/filter/openapi.yaml @@ -9,8 +9,6 @@ tags: description: Part of STAC API - Core definition - name: STAC API - Features description: Part of STAC API - Features definition - - name: STAC API - Collections - description: Part of STAC API - Collections definition - name: STAC API - Filter Extension description: Part of STAC API - Filter extension definition diff --git a/fragments/query/README.md b/fragments/query/README.md index bbbad426..7739fb39 100644 --- a/fragments/query/README.md +++ b/fragments/query/README.md @@ -6,7 +6,8 @@ - **Dependents:** - [Item Search](../../item-search) -The `query` parameter adds additional filters for searching on the properties of Item objects. +The `query` parameter adds additional filters for searching on the properties of Item objects. The JSON syntax for +these filters is known as "STACQL" (pronounced `stack-cue-el`). The syntax for the `query` filter is: diff --git a/fragments/sort/README.md b/fragments/sort/README.md index ab6e6369..4037a1ed 100644 --- a/fragments/sort/README.md +++ b/fragments/sort/README.md @@ -16,7 +16,7 @@ implementations should return an error when attempting to sort over a field that This fragment may be bound to either or both of [Item Search](../../item-search) (`/search` endpoint) or -[STAC Features](../../ogcapi-features) (`/collections/{collection_id}/items` endpoint) by +[STAC Features](../../ogcapi-features) (`/collections/{collectionId}/items` endpoint) by advertising the relevant conformance class. Fields may be sorted in ascending or descending order. The syntax between GET requests and POST requests with a JSON diff --git a/item-search/README.md b/item-search/README.md index 7d453917..d899cc9d 100644 --- a/item-search/README.md +++ b/item-search/README.md @@ -37,8 +37,8 @@ The Item Search endpoint intentionally defines only a limited group of operation most behavior will be defined in [Extensions](#extensions). These extensions can be composed by an implementer to cover only the set of functionality the implementer requires. For example, the query capability defined by Item Search is limited, and only adds cross-collection and spatial intersects query operators to the capabilities -already defined by OAFeat. For example, the Query Extension (soon to be superseded by the Filter Extension) -provides a more expressive set of operators. +already defined by OAFeat. For example, the Query Extension and Filter Extension +provide a more expressive set of operators. Implementing `GET /search` is **required**, `POST /search` is optional, but recommended. @@ -227,8 +227,9 @@ See the [paging examples](examples.md#paging-examples) for additional insight. ## HTTP Request Methods and Content Types -The STAC API follow a RESTful model. A core principal of this is the use of HTTP Request Methods ("verbs") and -the `Content-Type` header to drive behavior on resources ("nouns"). This section describes how these are used with the `/search` endpoint +STAC APIs follow the modern web API practices of using HTTP Request Methods ("verbs") and +the `Content-Type` header to drive behavior on resources ("nouns"). +This section describes how these are used with the `/search` endpoint. ### GET diff --git a/ogcapi-features/README.md b/ogcapi-features/README.md index a5c0d814..376553b6 100644 --- a/ogcapi-features/README.md +++ b/ogcapi-features/README.md @@ -69,15 +69,15 @@ supported by this endpoint, e.g., `text/html`. The core OGC API - Features endpoints are shown below, with details provided in an [OpenAPI specification document](openapi.yaml). -| Endpoint | Returns | Description | -| ----------------------------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `/` | [Catalog](../stac-spec/catalog-spec/README.md) | Landing page, links to API capabilities | +| Endpoint | Returns | Description | +| ----------------------------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `/` | [Catalog](../stac-spec/catalog-spec/README.md) | Landing page, links to API capabilities | | `/api` | any | Returns a machine-readable API description of the service from the `service-desc` link `rel`. The path for this endpoint is only recommended to be `/api`, but may be another path. | -| `/conformance` | JSON | Info about standards to which the API conforms | -| `/collections` | JSON | Object containing an array of Collection objects in the Catalog, and Link relations | -| `/collections/{collectionId}` | [Collection](../stac-spec/collection-spec/README.md) | Returns single Collection JSON | -| `/collections/{collectionId}/items` | [ItemCollection](../fragments/itemcollection/README.md) | GeoJSON FeatureCollection-conformant entity of Item objects in collection | -| `/collections/{collectionId}/items/{featureId}` | [Item](../stac-spec/item-spec/README.md) | Returns single Item (GeoJSON Feature) | +| `/conformance` | JSON | Info about standards to which the API conforms | +| `/collections` | JSON | Object containing an array of Collection objects in the Catalog, and Link relations | +| `/collections/{collectionId}` | [Collection](../stac-spec/collection-spec/README.md) | Returns single Collection JSON | +| `/collections/{collectionId}/items` | [ItemCollection](../fragments/itemcollection/README.md) | GeoJSON FeatureCollection-conformant entity of Item objects in collection | +| `/collections/{collectionId}/items/{featureId}` | [Item](../stac-spec/item-spec/README.md) | Returns single Item (GeoJSON Feature) | The OGC API - Features is a standard API that represents collections of geospatial data. It defines a RESTful interface to query geospatial data, with GeoJSON as a main return type. With OAFeat you can return any `Feature`, which is a geometry @@ -90,13 +90,13 @@ be queried ([7.11](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html#_col information about the geospatial dataset, like its name and description, as well as the spatial and temporal extents of all the data contained. A [STAC Collection](../stac-spec/collection-spec/README.md) contains this same information, along with other STAC-specific fields to provide additional metadata for searching spatiotemporal assets, and -thus are compliant with both OAFeat Collection and STAC Collection, and are returned from the `/collections/{collection_id}` +thus are compliant with both OAFeat Collection and STAC Collection, and are returned from the `/collections/{collectionId}` endpoint. In OAFeat, Features are the individual records within a Collection and are usually provided in GeoJSON format. [STAC Item](../stac-spec/item-spec/README.md) objects are compliant with the OAFeat Features [GeoJSON requirements class](http://docs.ogc.org/is/17-069r3/17-069r3.html#_requirements_class_geojson), and are returned from the -`/collections/{collection_id}/items/{item_id}` endpoint. The return of other encodings +`/collections/{collectionId}/items/{itemId}` endpoint. The return of other encodings ([html](http://docs.ogc.org/is/17-069r3/17-069r3.html#rc_html), [gml](http://docs.ogc.org/is/17-069r3/17-069r3.html#rc_gmlsf0)) is outside the scope of STAC API, as the [STAC Item](../stac-spec/item-spec/item-spec.md) is specified in GeoJSON. @@ -183,11 +183,11 @@ previous (page=2) pages: ... { "rel": "prev", - "href": "http://api.cool-sat.com/collections/my_collection/items?page=2" + "href": "http://api.cool-sat.com/collections?page=2" }, { "rel": "next", - "href": "http://api.cool-sat.com/collections/my_collection/items?page=4" + "href": "http://api.cool-sat.com/collections?page=4" } ] ``` @@ -365,7 +365,7 @@ It is the STAC API equivalent of [OGC API - Features - Part 4: Create, Replace, - **Extension [Maturity Classification](../extensions.md#extension-maturity):** Pilot - **Definition**: [STAC API - Fields Fragment](../fragments/fields/) -By default, the Items resource `/collections/{collection_id}/items` returns all attributes +By default, the Items resource `/collections/{collectionId}/items` returns all attributes of each Item, as there is no way to specify exactly those attributes that should be returned. The Fields extension to STAC Features adds new functionality that allows the client to suggest to the server which Item attributes should be included or excluded in the response, @@ -378,7 +378,7 @@ through the use of a `fields` parameter. The full description of how this extens - **Extension [Maturity Classification](../extensions.md#extension-maturity):** Pilot - **Definition**: [STAC API - Sort Fragment](../fragments/sort/) -By default, the Items resource `/collections/{collection_id}/items` returns results in no specified order. Whatever order the results are in +By default, the Items resource `/collections/{collectionId}/items` returns results in no specified order. Whatever order the results are in is up to the implementor, and will typically default to an arbitrary order that is fastest for the underlying data store to retrieve results. This extension adds a new parameter, `sortby`, that lets a user specify a comma separated list of field names to sort by, with an indication of direction. It uses '+' and @@ -391,6 +391,6 @@ of this extension can be found in the [sort fragment](../fragments/sort). - **Extension [Maturity Classification](../extensions.md#extension-maturity):** Pilot - **Definition**: [STAC API - Context Fragment](../fragments/context/) -This extension is intended to augment the core ItemCollection responses from the Items resource `/collections/{collection_id}/items` with a +This extension is intended to augment the core ItemCollection responses from the Items resource `/collections/{collectionId}/items` with a JSON object called `context` that includes the number of items `matched`, `returned` and the `limit` requested. The full description and examples of this are found in the [context fragment](../fragments/context). diff --git a/ogcapi-features/openapi.yaml b/ogcapi-features/openapi.yaml index 02378bc5..76841ac5 100644 --- a/ogcapi-features/openapi.yaml +++ b/ogcapi-features/openapi.yaml @@ -61,14 +61,6 @@ paths: rel: service-doc type: text/html title: the API documentation - - href: 'http://data.example.org/sentinel-1' - rel: child - type: application/json - title: Sentinel 1 Catalog - - href: 'http://data.example.org/sentinel-2' - rel: child - type: application/json - title: Sentinel 2 Catalog - href: 'http://data.example.org/conformance' rel: conformance type: application/json diff --git a/overview.md b/overview.md index f169c3e9..2e181342 100644 --- a/overview.md +++ b/overview.md @@ -1,6 +1,6 @@ # About -The STAC API defines a RESTful JSON-based web API to browse and query [SpatioTemporal Asset Catalog](stac-spec/) +The STAC API defines a JSON-based web API to browse and query [SpatioTemporal Asset Catalog](stac-spec/) (STAC) objects. While the core STAC specification provides a structure and language to describe assets, users usually want to access a subset of the entire catalog, such as for a certain date range, in a particular area of interest, or matching properties @@ -20,7 +20,7 @@ off point for the more powerful capabilities - it contains a list of URL's, each 'relationships' (`rel`) to indicate their functionality. Note that the [STAC Core specification](stac-spec) provides most all the content of API responses - the STAC API is primarily concerned with the return of STAC [Item](stac-spec/item-spec/README.md) and [Collection](stac-spec/collection-spec/README.md) objects via a -RESTful web API. See the [rendered OpenAPI document](https://api.stacspec.org/v1.0.0-beta.5/core) for more details. +web API. See the [rendered OpenAPI document](https://api.stacspec.org/v1.0.0-beta.5/core) for more details. There are then two major sets of functionality that build on the core, which are designed to be complementary, letting implementations choose which parts they want to utilize. Most every STAC API implements at least one, and many follow @@ -100,8 +100,8 @@ directory as a [submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules). ## Capabilities List -As STAC APIs follow a RESTful model, a core principal of this is the use of HTTP Request Methods ("verbs") and -the `Content-Type` header to drive behavior on resources ("nouns") - the endpoints listed below. +STAC APIs follow the modern web API practices of using HTTP Request Methods ("verbs") and +the `Content-Type` header to drive behavior on resources ("nouns") in the endpoints listed below. The following table describes the service resources available in a full STAC API implementation. Note that the 'Endpoint' column is more of an example in some cases. OGC API makes some endpoint locations required, those will be bolded below. @@ -128,11 +128,11 @@ STAC Collection and Feature objects. The core STAC conformance classes communicate the conformance JSON only in the root (`/`) document, while OGC API requires they also live at the `/conformance` endpoint. STAC's conformance structure is detailed in the [core](core/). Note all -conformance URI's serve up a rendered HTML version of the corresponding OpenAPI document at the given location. +conformance URIs serve up a rendered HTML version of the corresponding OpenAPI document at the given location. **NOTE:** *By 1.0.0 we aim to have requirements classes specified in detail, as testable assertions, like OGC does, but for now the core reference is just this spec document and the OpenAPI yaml. We also desire to -have the URI's for conformance to actually resolve to machine-readable information clients can use.* +have the URIs for conformance to actually resolve to machine-readable information clients can use.* ### Conformance Class Table diff --git a/package.json b/package.json index 0072d0be..198ebba1 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,13 @@ "serve": "redoc-cli serve core/openapi.yaml --watch --options.expandResponses \"200,201,202,203,204\" --options.pathInMiddlePanel true", "check": "npm run check-markdown && npm run check-openapi", "check-markdown": "remark . -f -r .circleci/rc.yaml --ignore-pattern stac-spec/", - "check-openapi": "npm run check-openapi-core && npm run check-openapi-commons && npm run check-openapi-ogcapi-features && npm run check-openapi-item-search && npm run check-openapi-fragments", + "check-openapi": "npm run check-openapi-core && npm run check-openapi-commons && npm run check-openapi-ogcapi-features && npm run check-openapi-item-search && npm run check-openapi-fragments && npm run check-openapi-collections", "check-openapi-core": "spectral lint core/openapi.yaml --ruleset .circleci/.spectral.yml", "check-openapi-commons": "spectral lint core/commons.yaml --ruleset .circleci/.spectral-fragments.yml", "check-openapi-ogcapi-features": "spectral lint ogcapi-features/openapi.yaml ogcapi-features/extensions/*/openapi.yaml --ruleset .circleci/.spectral.yml", "check-openapi-item-search": "spectral lint item-search/openapi.yaml --ruleset .circleci/.spectral.yml", "check-openapi-fragments": "spectral lint fragments/*/openapi.yaml --ruleset .circleci/.spectral-fragments.yml", + "check-openapi-collections": "spectral lint collections/openapi.yaml --ruleset .circleci/.spectral.yml", "build-openapi": ".circleci/build-openapi.sh", "publish-openapi": "node .circleci/publish.js", "check-stac-spec-changes": "git diff --quiet HEAD ${npm_config_compare_to} -- stac-spec"