diff --git a/README.md b/README.md
index e8a6a75..6a269de 100644
--- a/README.md
+++ b/README.md
@@ -1,78 +1,142 @@
-# arc-validate-package-registry
+# Introduction
-This repository contains:
+The **arc-validate-package-registry (avpr)** repository contains:
-- a staging area for authoring official validation packages intended for use with [`arc-validate`]().
+- a staging area for authoring official validation packages intended for use with [`arc-validate`](https://github.com/nfdi4plants/arc-validate).
- a web API for serving validation packages. This API is consumed by `arc-validate` to install and sync validation packages.
+- a website for browsing validation packages.
+- some domain types and utilities relevant for consuming libraries in the [AVPRIndex library](./src/AVPRIndex/)
+- a .NET client library for consuming the web API in the [AVPRClient library](./src/AVPRClient/)
+
+Read more at [avpr.nfdi4plants.org/about](https://avpr.nfdi4plants.org/about)
# Table of contents
-- [The package index](#the-package-index)
-- [Automated package testing](#automated-package-testing)
-- [Local development](#local-development)
-- [OpenAPI endpoint documentation via Swagger UI](#openapi-endpoint-documentation-via-swagger-ui)
-- [package indexing](#package-indexing)
-- [local development](#local-development-1)
+- [General](#general)
+- [Validation package staging area](#validation-package-staging-area)
+ - [Allowed validation package file formats](#allowed-validation-package-file-formats)
+ - [Automated package testing](#automated-package-testing)
+ - [The preview package index](#the-preview-package-index)
+ - [How to add packages](#how-to-add-packages)
+ - [Versioning packages](#versioning-packages)
+ - [Package publication workflow](#package-publication-workflow)
- [Package metadata](#package-metadata)
- [Mandatory fields](#mandatory-fields)
- [Optional fields](#optional-fields)
- [Objects](#objects)
- - [Package publication workflow](#package-publication-workflow)
- - [Versioning packages](#versioning-packages)
+ - [Author](#author)
+ - [Tag](#tag)
+- [Web API (PackageRegistryService)](#web-api-packageregistryservice)
+ - [Local development](#local-development)
+ - [OpenAPI endpoint documentation via Swagger UI](#openapi-endpoint-documentation-via-swagger-ui)
+- [Repository setup](#repository-setup)
+ - [local development](#local-development-1)
+
+# General
+
+This repo runs an [extensive CI/CD pipeline](.github/workflows/pipeline.yml) on every commit and PR on the `main` branch. The pipeline includes:
+
+- tests and pre-publish checks for every package in the [staging area](#validation-package-staging-area).
+- a release pipeline for validation packages:
+ - publishing WIP packages to the `avpr-preview-index` on this repo's [preview-index](https://github.com/nfdi4plants/arc-validate-package-registry/releases/tag/preview-index) release
+ - publishing stable packages to the production instance of the web API at [avpr.nfdi4plants.org](https://avpr.nfdi4plants.org)
+- tests and release pipelines for the `AVPRIndex` and `AVPRClient` libraries, as well as a docker container for the `PackageRegistryService` web API.
+
+```mermaid
+flowchart TD
+
+setup("setup
(determines subsequent jobs
based on changed files)")
+batp("Build and test projects
any of [AVPRIndex, AVPRClient, API]")
+tsa("Test staging area
test all packages in the staging area")
+sapc("Staging area pre-publish checks
hash verification, prevent double publication etc")
+nr("Release (nuget)
any of [AVPRIndex, AVPRClient]")
+dr("Release (docker image)
API")
+upi("Update preview index
update the github release index json file")
+ppp("Publish pending packages
Publish packages to production DB")
+
+setup --when relevant project
files change--> batp
+setup --changes in the
staging area--> tsa
+batp --when tests pass and
release notes change--> nr
+batp --when tests pass--> dr
+tsa --when tests pass--> sapc
+sapc --when checks pass--> upi
+sapc --when checks pass
and any new packages
are pending--> ppp
+```
+[🔼 Back to top](#table-of-contents)
# Validation package staging area
-## The package index
+The [package staging area](./StagingArea) is intended for development and testing of validation packages.
+
+Files in this folder must follow the naming convention `@...*` and contain a [yml frontmatter](#package-metadata) at the start of the file. These files must additionally be inside a subfolder exactly named as the package name. This leads to a folder structure like this:
+
+```no-highlight
+StagingArea
+│
+├── some-package
+│ ├── some-package@1.0.0.fsx
+│ ├── some-package@2.0.0.fsx
+│ └── some-package@2.1.0.fsx
+│
+└── some-other-package
+ ├── some-other-package@1.0.0.fsx
+ ├── some-other-package@2.0.0.fsx
+ └── some-other-package@3.0.0.fsx
+```
+
+## Allowed validation package file formats
-This repo runs a [custom pre-commit hook](pre-commit.sh) that will run a [script](./update-index.fsx) automatically add any `.fsx` file in the [staging area](StagingArea/) to [the package index](src/PackageRegistryService/Data/arc-validate-package-index.json) when it is commited to the repo.
+As all reference implementations are written in F#, the only currently allowed file format for validation packages is `.fsx` (F# script files). This can and will be expanded in the future.
## Automated package testing
Tests located at [./tests](./tests) are run on every package in the index. Only if all packages pass these tests, the docker container will be built and pushed to the registry.
-# Web API (PackageRegistryService)
-
-The `PackageRegistryService` project located in `/src` is a simple ASP.NET Core (8) web API that serves validation packages and/or associated metadata via a few endpoints.
+## The preview package index
-It is developed specifically for containerization and use in a docker environment.
+Besides the published packages available at [avpr.nfdi4plants.org](https://avpr.nfdi4plants.org),
-The service will eventually be continuously deployed to a public endpoint on the nfdi4plants infrastructure.
+The pipeline includes a `Update preview index` CI step that extracts metadata from the [yml frontmatter](#package-metadata) of every `.fsx` file in the staging area and (if tests and sanity checks pass) adds it to the `avpr-preview-index.json` on this repo's [preview-index](https://github.com/nfdi4plants/arc-validate-package-registry/releases/tag/preview-index) release
-## Local development
+## How to add packages
-To run the `PackageRegistryService` locally, ideally use VisualStudio and run the `Docker Compose` project in Debug mode. This will launch the stack defined at [`docker-compose.yml`](docker-compose.yml), which includes:
-
-- the containerized `PackageRegistryService` application
-- a `postgres` database seeded with the [latest indexed packages](src/PackageRegistryService/Data/arc-validate-package-index.json)
-- an `adminer` instance for database management (will maybe be replaced by pgAdmin in the future)
+To add a package, follow these steps:
-## OpenAPI endpoint documentation via Swagger UI
+- fork this repo
+- add a new `.fsx` file to the respective folder in the [staging area](StagingArea/). For more info on the staging area structure, see [Validation package staging area](#validation-package-staging-area).
+- commit it to the repo
+- open a PR to the `main` branch of this repo
-The `PackageRegistryService` has a built-in Swagger UI endpoint for API documentation. It is served at `/swagger/index.html`.
+All packages in the staging area are automatically tested on every PR. Additionally, all packages set to `publish: true` in their yml frontmatter will be pushed to the registry service if they pass all tests and are not already present in the registry (see [Package publication workflow](#package-publication-workflow) for more info).
-# Setup
+## Versioning packages
-## package indexing
+Packages SHOULD be versioned according to the [semantic versioning](https://semver.org/) standard. This means that the version number of a package should be incremented according to the following rules:
-To install the pre-commit hook needed for automatic package indexing, run either `setup.cmd` or `setup.sh` depending on your platform to install the pre-commit hook.
+- **Major version**: incremented when you make changes incompatible with previous versions
+- **Minor version**: incremented when you add functionality in a backwards-compatible manner
+- **Patch version**: incremented when you make backwards-compatible bug fixes
-## local development
+## Package publication workflow
-install the following prerequisites:
-- .NET 8 SDK
-- Docker
-- Docker Compose
+Publishing a package to the registry is a multi-step process:
-# How to add packages
+Suppose you want to develop version 1.0.0 of a package called `my-package`.
-To add a package to the staging area, make sure that you installed the pre-commit hook as described in the [Setup](#setup) section.
+1. Add a new blank `my-package@1.0.0.fsx` file to the [staging area](./StagingArea/) in the folder `my-package`.
+2. Develop the package, using a work-in-process pull request to use this repository's CI to perform automated integrity tests on it.
+3. Once the package is ready, add `publish: true` to the yml frontmatter of the package file. This will trigger the CI to build and push the package to the registry once the PR is merged.
+4. Once a package is published, it cannot be unpublished or changed. To update a package, create a new script with the same name and a higher version number.
-Then, simply add a new `.fsx` file to the [staging area](StagingArea/), and commit it to the repo. The pre-commit hook will automatically add the new package to the package index.
+| stage | availability | mutability |
+| --- | --- | --- |
+| staging: development in this repo | version of current HEAD commit in this repo via github API-based execution in `arc-validate` CLI | any changes are allowed |
+| published: available in the registry | version of the published package via the registry API | no changes are allowed |
-All packages in the staging area are automatically tested on every commit. Additionally, all packages set to `publish: true` in their yml frontmatter will be pushed to the registry service if they pass all tests and are not already present in the registry.
+[🔼 Back to top](#table-of-contents)
-## Package metadata
+# Package metadata
Package metadata is extracted from **yml frontmatter** at the start of the `.fsx` file, indicated by a multiline comment (`(* ... *)`)containing the frontmatter fenced by `---` at its start and end:
@@ -84,7 +148,7 @@ Package metadata is extracted from **yml frontmatter** at the start of the `.fsx
*)
```
-### Mandatory fields
+## Mandatory fields
| Field | Type | Description |
| --- | --- | --- |
@@ -95,7 +159,8 @@ Package metadata is extracted from **yml frontmatter** at the start of the `.fsx
| Summary | string | a single sentence description (<=50 words) of the package |
| Description | string | an unconstrained free text description of the package |
-example (only mandatory fields):
+
+Example: only mandatory fields
```fsharp
(*
@@ -115,7 +180,9 @@ let doSomeValidation () = ()
doSomeValidation ()
```
-### Optional fields
+
+
+## Optional fields
| Field | Type | Description |
| --- | --- | --- |
@@ -124,8 +191,8 @@ doSomeValidation ()
| Tags | string[] | a list of tags with optional ontology annotations that describe the package. For more information about mandatory and optional fields in this object, see [Objects > Tag](#tag) |
| ReleaseNotes | string[] | a list of release notes for the package indicating changes from previous versions |
-
-example (all fields):
+
+Example: all fields
```fsharp
(*
@@ -160,14 +227,15 @@ ReleaseNotes: |
- does it well"
---
*)
-
let doSomeValidation () = ()
doSomeValidation ()
```
-#### Objects
+
+
+### Objects
-##### Author
+#### Author
Author metadata about the people that create and maintain the package. Note that the
@@ -178,7 +246,7 @@ Author metadata about the people that create and maintain the package. Note that
| Affiliation | string | the affiliation (e.g. institution) of the author | no |
| AffiliationLink | string | a link to the affiliation of the author | no |
-##### Tag
+#### Tag
Tags can be any string with an optional ontology annotation from a controlled vocabulary:
@@ -188,20 +256,37 @@ Tags can be any string with an optional ontology annotation from a controlled vo
| TermSourceREF | string | Reference to a controlled vocabulary source | no |
| TermAccessionNumber | string | Accession in the referenced controlled vocabulary source | no |
-### Package publication workflow
+[🔼 Back to top](#table-of-contents)
-Publishing a package to the registry is a multi-step process:
+# Web API (PackageRegistryService)
-Suppose you want to develop version 1.0.0 of a package called `my-package`.
+The `PackageRegistryService` project located in `/src` is a simple ASP.NET Core (8) web API that serves validation packages and/or associated metadata via a few endpoints.
-1. Add a new blank `my-package@1.0.0.fsx` file to the [staging area](./StagingArea/) in the folder `my-package`.
-2. Develop the package, using this repositories CI to perform automates integrity tests on it.
-3. Once the package is ready, add `publish: true` to the yml frontmatter of the package file. This will trigger the CI to build and push the package to the registry.
-4. Once a package is published, it cannot be unpublished or changed. To update a package, create a new script with the same name and a higher version number.
+It is developed specifically for containerization and use in a docker environment.
-| stage | availability | mutability |
-| --- | --- | --- |
-| staging: development in this repo | version of current HEAD commit in this repo via github API-based execution in `arc-validate` CLI | any changes are allowed |
-| published: available in the registry | version of the published package via the registry API | no changes are allowed |
+The service will eventually be continuously deployed to a public endpoint on the nfdi4plants infrastructure.
+
+## Local development
+
+To run the `PackageRegistryService` locally, ideally use VisualStudio and run the `Docker Compose` project in Debug mode. This will launch the stack defined at [`docker-compose.yml`](docker-compose.yml), which includes:
+
+- the containerized `PackageRegistryService` application
+- a `postgres` database seeded with the [latest indexed packages](src/PackageRegistryService/Data/arc-validate-package-index.json)
+- an `adminer` instance for database management (will maybe be replaced by pgAdmin in the future)
+
+## OpenAPI endpoint documentation via Swagger UI
+
+The `PackageRegistryService` has a built-in Swagger UI endpoint for API documentation. It is served at `/swagger/index.html`.
+
+[🔼 Back to top](#table-of-contents)
+
+# Repository setup
+
+## local development
+
+install the following prerequisites:
+- .NET 8 SDK
+- Docker
+- Docker Compose
-### Versioning packages
\ No newline at end of file
+[🔼 Back to top](#table-of-contents)
\ No newline at end of file