Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
367708d
Fix GitHub link in start docs
zyzzyxdonta Feb 27, 2025
6589571
Merge pull request #320 from softwarepub/fix/319-link-in-start-docs
poikilotherm Feb 27, 2025
5ba47a5
Update pyproject.toml
nheeb Feb 28, 2025
70b2bd9
Fixed no or multiple remotes
nheeb Feb 28, 2025
36806dd
Flakeflake
nheeb Feb 28, 2025
385a119
Merge pull request #321 from softwarepub/wrap-up-release-0.9.0
nheeb Mar 4, 2025
9e31475
adr for plugin init descision
nheeb Mar 4, 2025
db0f0ea
Use full URL DOI for HERMES in marketplace
zyzzyxdonta Mar 12, 2025
3808a31
More reliable detection of HERMES builtin plugins
zyzzyxdonta Mar 12, 2025
fb7e4bc
Flake8 formatting
zyzzyxdonta Mar 12, 2025
7736f55
Add tests for `_is_hermes_version`.
zyzzyxdonta Mar 25, 2025
e164bbd
new util script for git related methods
nheeb Mar 26, 2025
1f55229
More documentation
nheeb Mar 26, 2025
5b34b14
Small fix & cleaned the dialog
nheeb Apr 1, 2025
6c28c25
repaired the tests
nheeb Apr 1, 2025
7e36f20
Plugin selection
nheeb Apr 2, 2025
59fa59c
Init Plugin integration
nheeb Apr 7, 2025
24baf04
Update docs/adr/0013-plugin-init.md
nheeb Apr 22, 2025
d65a87e
Merge pull request #327 from softwarepub/fix/326-hermes-doi-in-plugin…
zyzzyxdonta Apr 22, 2025
b6530da
Removed some old comments
nheeb Apr 23, 2025
d5f5fcc
Merge pull request #323 from softwarepub/feature/308-init-with-remotes
nheeb Apr 23, 2025
d44b095
Merge pull request #324 from softwarepub/feature/adr-for-plugin-init
nheeb Apr 23, 2025
ff70fd3
better error messages
nheeb Apr 23, 2025
b80168e
merged with develop
nheeb Apr 23, 2025
43d5f3b
Automated clean up
nheeb Apr 28, 2025
e33c023
Small fixes
nheeb Apr 28, 2025
c93c8e0
Clean up marketplace.py
nheeb Apr 29, 2025
8684a42
init base isorted
nheeb Apr 30, 2025
fbcd9aa
Merge pull request #331 from softwarepub/feature/298-init-install-plu…
nheeb Apr 30, 2025
d8b926c
Allow initial publications on Rodare
zyzzyxdonta Jul 1, 2025
14e2fb7
Merge pull request #349 from softwarepub/feature/348-make-initial-dep…
zyzzyxdonta Jul 8, 2025
51e1168
Update errors module from #288
sdruskat Jul 9, 2025
43c6144
Replace context with context manager from #288
sdruskat Jul 9, 2025
e77b0ec
Remove outdated implementations
sdruskat Jul 9, 2025
b61f085
Add model types implementation from #288
sdruskat Jul 9, 2025
7f1b698
Add schemaorg dependency and update dependencies
sdruskat Jul 10, 2025
bfffceb
Add rdflib to dependencies
sdruskat Jul 10, 2025
3423c5a
Tests for HermesContext and HermesCache
Jul 11, 2025
6f4de13
Last tests for basic functionality
Jul 11, 2025
8933bde
Change tests to parameter type path is mandatory
Jul 11, 2025
c886fbc
Apply suggestions with minimal changes
SKernchen Jul 14, 2025
e7002eb
Fixme docstring and improve style
Jul 14, 2025
b9aaa95
Add consistent docstring for fixes for later
SKernchen Jul 15, 2025
d9561f4
Fix Issues in context
Jul 28, 2025
051f0ab
Remove unnecessary variable
SKernchen Jul 28, 2025
a77ba6b
Merge pull request #382 from softwarepub/refactor/366-refactor-curren…
SKernchen Jul 28, 2025
08e1c23
Test user agent name
sdruskat Jul 31, 2025
8bf6343
Use distribution version in test
sdruskat Aug 1, 2025
9ff39d7
Update pyproject.toml to adhere to PEP 621
sdruskat Aug 1, 2025
d83c93c
Fix retrieving URLs from distribution metadata
sdruskat Aug 1, 2025
9dfcd30
Remove superfluous poetry-related sections
sdruskat Aug 1, 2025
45435dc
Fix Poetry build backend version
sdruskat Aug 1, 2025
5ac060e
Make dev dependencies fully optional
sdruskat Aug 1, 2025
ca4a11c
Restore poetry-defined dependency groups
sdruskat Aug 1, 2025
f90cb4d
Change authorship back to align with CFF
sdruskat Aug 1, 2025
b46a7a5
Reset authorship policy to align with CFF
sdruskat Aug 1, 2025
a2e20e0
Update lock
sdruskat Aug 1, 2025
6a95ebf
Disambiguate var name
sdruskat Aug 1, 2025
c90002a
Update poetry version to use for docs build
sdruskat Aug 1, 2025
eb1dfca
Update readthedocs config
sdruskat Aug 1, 2025
e26fb3b
Replace link to CFF file with absolute URL to fix RTD build
sdruskat Aug 1, 2025
588f372
Reduce scope of import
sdruskat Aug 1, 2025
f149a9a
Use concrete path of test file to read file into toml
sdruskat Aug 1, 2025
d04a47e
Import Path from pathlib
sdruskat Aug 1, 2025
4fd43a9
Format comprehension for better readability
sdruskat Aug 1, 2025
b0b84a7
Merge pull request #407 from softwarepub/feature/347-update-build_bac…
sdruskat Aug 1, 2025
ac639bb
Update copyright header
sdruskat Aug 5, 2025
86d8def
Re-lock dependencies
sdruskat Aug 5, 2025
d2949f8
Re-lock dependencies
sdruskat Aug 5, 2025
be066bb
Lock dependencies from target manifest
sdruskat Aug 5, 2025
bfd0b29
Merge branch 'refactor/data-model' into develop
sdruskat Aug 5, 2025
7a38f8b
Revert "Merge branch 'refactor/data-model' into develop"
sdruskat Aug 5, 2025
cec935d
add initial version of the changelog
Sep 2, 2025
e217881
fixed spelling mistake in the header of CHANGELOG.md
Sep 2, 2025
ad7dfb1
improve marketplace visibility
Sep 11, 2025
2ab1c42
changed URL to relative link
notactuallyfinn Oct 10, 2025
632dbcf
changed URL to relative link
notactuallyfinn Oct 10, 2025
e0eaa2a
changed URL to relative link
notactuallyfinn Oct 10, 2025
f1a8171
reverted URL change and added comment
notactuallyfinn Oct 10, 2025
866f092
changed link to be a relative filepath
notactuallyfinn Oct 10, 2025
4401fa5
changed link to be a relative filepath
notactuallyfinn Oct 10, 2025
188cad6
Merge pull request #431 from softwarepub/feature/426-improve-marketpl…
notactuallyfinn Oct 10, 2025
11af43e
added adr record and graphic
Oct 17, 2025
5ee10eb
inserted PR link
Oct 17, 2025
e8b1460
Record additions since last release
sdruskat Oct 17, 2025
75c47f4
Record additional fixes and changes since PR was put up
sdruskat Oct 17, 2025
2a3f347
Merge pull request #425 from softwarepub/feature/140-keep-a-changelog
sdruskat Oct 17, 2025
0777ec6
changed name of header
Oct 17, 2025
d443f3d
Add basic implementation of `file_exists` plugin
zyzzyxdonta Oct 17, 2025
971fced
Use typing extensions Self type
zyzzyxdonta Oct 17, 2025
f222da7
Add `content_size` in bytes to the file objects
zyzzyxdonta Oct 17, 2025
cdb49fb
Get files from `git ls-files` if possible
zyzzyxdonta Oct 28, 2025
155cd13
Fix `@data` → `@value`
zyzzyxdonta Oct 28, 2025
7de7e08
Add docstring for `_git_ls_files`
zyzzyxdonta Oct 28, 2025
012edac
Make it possible to disable `git ls-files`
zyzzyxdonta Oct 28, 2025
78ba4c9
Implement file tagging based on pattern group
zyzzyxdonta Oct 29, 2025
cd1757c
Update docstrings and function signatures
zyzzyxdonta Oct 29, 2025
49dd3dc
Store file keywords as set
zyzzyxdonta Oct 30, 2025
824aa54
Update plugin metadata in `plugins.json`
zyzzyxdonta Oct 30, 2025
542ae9b
Improve file type detection for yml, toml, cff
zyzzyxdonta Oct 30, 2025
04a273e
updated the diagram
Oct 31, 2025
f63ac59
removed explicit line breaks and added information on non-prov proper…
Oct 31, 2025
8b0f68d
File type detection `.license` and `poetry.lock`
zyzzyxdonta Nov 3, 2025
cd3fe3f
Add TODOs
zyzzyxdonta Nov 3, 2025
2939c15
Check if files tracked by git actually exist
zyzzyxdonta Nov 3, 2025
c8cbacc
Pipeline-style find/tag/filter approach
zyzzyxdonta Nov 3, 2025
6d8c28f
Make stat call more robust
zyzzyxdonta Nov 3, 2025
9617f64
Generalize `TextObject` → `MediaObject`
zyzzyxdonta Nov 4, 2025
af3987b
Fix typo in docstring
zyzzyxdonta Nov 14, 2025
3e9ddc5
Fix case-insensitive path matching for Python<3.12
zyzzyxdonta Nov 14, 2025
17d148a
Add TODO note to path pattern with slash
zyzzyxdonta Nov 14, 2025
bffcc9f
Ensure only regular files are considered
zyzzyxdonta Nov 17, 2025
c8eb97a
Document path separator in search patterns
zyzzyxdonta Nov 17, 2025
628df91
Fix type annotation
zyzzyxdonta Nov 17, 2025
e49304c
Add missing return type annotation
zyzzyxdonta Nov 17, 2025
0c3f85f
Added sdruskats suggestions
notactuallyfinn Nov 21, 2025
c963add
removed the chosen option part
Nov 21, 2025
05f6146
Move `guess_file_type` into `hermes.utils`
zyzzyxdonta Nov 24, 2025
c7c498f
Merge pull request #446 from softwarepub/feature/424-readme-license-f…
zyzzyxdonta Nov 28, 2025
0253a3d
Add licenses for graphics
SKernchen Dec 12, 2025
3a92f42
Merge pull request #442 from softwarepub/refactor/363-record-provenan…
SKernchen Dec 12, 2025
d2b5913
Bump urllib3 from 2.5.0 to 2.6.0
dependabot[bot] Dec 23, 2025
2f3d60f
Merge pull request #462 from softwarepub/dependabot/pip/urllib3-2.6.0
sdruskat Dec 23, 2025
ae4ec06
Mask values of subcommand option arguments
sdruskat Dec 23, 2025
126695d
Refactor masking options values into util
sdruskat Jan 12, 2026
8c113db
Add fixed vulnerability
sdruskat Jan 12, 2026
2742219
Fix typo
sdruskat Jan 12, 2026
bf635b9
Fix another typo
sdruskat Jan 12, 2026
b35a63b
Add test for patch
sdruskat Jan 12, 2026
90cb86a
Merge commit from fork
sdruskat Jan 12, 2026
e166b44
Upgrade previously vulnerable dependency
sdruskat Jan 12, 2026
9bcfe35
Make flake8 happy
sdruskat Jan 12, 2026
5ed0d7e
Set release version
sdruskat Jan 12, 2026
51394c8
Update changelog
sdruskat Jan 12, 2026
b175bd4
Update version in citation file
sdruskat Jan 12, 2026
3302522
Revert "Make flake8 happy"
sdruskat Jan 12, 2026
201b5ac
Remove duplicate flake8 check
sdruskat Jan 12, 2026
335cc7f
Fix remaining linting errors
sdruskat Jan 12, 2026
2834e58
Fix new linting error
sdruskat Jan 12, 2026
e412c90
Pin dependency versions for docs
sdruskat Jan 12, 2026
06d2be8
Fix crossrefs in ADRs
sdruskat Jan 12, 2026
675428e
Use poetry's awful wiggly version relaxation to get at least some upd…
sdruskat Jan 12, 2026
029eeef
Sync dependencies
sdruskat Jan 12, 2026
812157b
Reconfigure generation of AutoAPI docs
sdruskat Jan 12, 2026
313100e
Updated Python version for CI
sdruskat Jan 12, 2026
b5b0015
Sync dev dependencies before linting
sdruskat Jan 12, 2026
2b4b0fa
Install with dev dependencies before CI flake8 run, update RTD Python
sdruskat Jan 12, 2026
e159141
Reapply "Make flake8 happy"
sdruskat Jan 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@
[flake8]
max-complexity = 15
max-line-length = 120
per-file-ignores =
src/hermes/commands/marketplace.py:E231
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/add-plugin-to-marketplace.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ body:
value: |
Thank you for building a plugin for Hermes and sharing it with the community!

The [Hermes plugin marketplace](https://hermes.software-metadata.pub#plugins) is a curated list of plugins on our website that allows you to share plugins that you developed, and others to find them.
The [Hermes plugin marketplace](https://hermes.software-metadata.pub/marketplace) is a curated list of plugins on our website that allows you to share plugins that you developed, and others to find them.

Via this issue template, you can send us the required information to add your plugin to the marketplace. Alternatively, you may file a pull request, adding the plugin to [`plugins.json`](https://github.com/softwarepub/hermes/tree/develop/docs/source/plugins.json) yourself.

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"
python-version: "3.12"
- name: Install pypa/build
run: >-
python3 -m
Expand Down
6 changes: 2 additions & 4 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10"] # Ignore Python < 3.10, they are unsupported
python-version: ["3.12"] # Ignore Python < 3.11, they are unsupported

steps:
- uses: actions/checkout@v4
Expand All @@ -26,11 +26,9 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip poetry
poetry install
poetry install --with dev
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
poetry run flake8 ./test/ ./src/ --count --select=E9,F63,F7,F82 --show-source --statistics
# Stop build on errors
poetry run flake8 ./test/ ./src/ --count --statistics
- name: Test with pytest
Expand Down
13 changes: 9 additions & 4 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,17 @@ version: 2
build:
os: ubuntu-20.04
tools:
python: "3.10"
python: "3.12"
jobs:
post_create_environment:
# Install poetry
# https://python-poetry.org/docs/#installing-manually
- pip install "poetry>=2.1.3,<3.0.0"
post_install:
- pip install "poetry>=1.2.0,<1.3.0"
- poetry config virtualenvs.create false
- poetry install --with docs
# Install dependencies with 'docs' dependency group
# https://python-poetry.org/docs/managing-dependencies/#dependency-groups
# VIRTUAL_ENV needs to be set manually for now, see #11150
- VIRTUAL_ENV=$READTHEDOCS_VIRTUALENV_PATH poetry install --with docs

# Build documentation in the docs/source directory with Sphinx
sphinx:
Expand Down
60 changes: 60 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<!--
SPDX-FileCopyrightText: 2025 German Aerospace Center (DLR)

SPDX-License-Identifier: CC0-1.0
-->

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project tries to adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.9.1] - 2026-01-12

### Added

- Added ADR for `init` plugin (#324)

### Fixed

- Broken HERMES DOI in marketplace plugin metadata (#326)
- hermes init fails with cryptic error message in non-git directory (#308)
- Make --initial deposits work on Rodare (#348)
- Fix GitHub link in docs (#319)
- `hermes init` cancellation should remove created files (#328)
- `pyproject.toml` compliance with PEP 621 (#347)
- Improve marketplace visibility (#426)

### Changed

- Update poetry to more recent version. (#347)

### Security

- Patch raw logging of '-O' values that could have included arbitrary secrets. (https://github.com/softwarepub/hermes/security/advisories/GHSA-jm5j-jfrm-hm23)

## [0.9.0] - 2025-02-26

### Added

- Added the hermes init subcommand

### Fixed

- Fixes multiple bugs

### Changed

- Refactored plugin system further

## [0.8.1] - 2024-08-13

### Added

- Integrated pyproject.toml plugin into the publication process

### Changed

- Improved logging output for better error dissemination
2 changes: 1 addition & 1 deletion CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ title: hermes
message: >-
If you use this software, please cite it using the
metadata from this file.
version: 0.9.0
version: 0.9.1
license: "Apache-2.0"
abstract: "Tool to automate software publication. Not stable yet."
type: software
Expand Down
4 changes: 2 additions & 2 deletions GOVERNANCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,5 +80,5 @@ If no successor is named,
the Steering Group seeks a successor.
One member of the Steering Group steps in as interim maintainer until a successor is found.

In addition, all contributors with write access to repositories and regular activities should be added as "authors" to project and build system metadata in alphabetical order.
They may also qualify for scholarly authorship, which is managed in citation metadata as necessary and may be ordered by other criteria.
Authorship is defined by the [steering group](#hermes-steering-group) and declared in
[`CITATION.cff`](https://github.com/softwarepub/hermes/blob/main/CITATION.cff).
2 changes: 1 addition & 1 deletion docs/adr/0002-use-a-common-data-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ We need a data model that's
to exchange data between modules.

The chosen option determines the serialization of the data model, too.
See also [ADR 11](./0011-record-provenance-of-metadata.md) about provenance records in the data model.
See also [ADR 11](./0011-record-provenance-of-metadata) about provenance records in the data model.

## Considered Options

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ SPDX-License-Identifier: CC-BY-SA-4.0
This depends on the data model (ADR 0002).
Do we have to expose different parts of the data model structure at different points in the workflow?

Superseded: decisions in [ADR 2](./0002-use-a-common-data-model.md) (use JSON-LD) and [ADR 11](./0011-record-provenance-of-metadata.md) (create a unified data model of metadata and provenance) will result in a context [DAO](https://en.wikipedia.org/wiki/Data_access_object) from beginning till end of a run.
Superseded: decisions in [ADR 2](./0002-use-a-common-data-model) (use JSON-LD) and [ADR 11](./0011-record-provenance-of-metadata) (create a unified data model of metadata and provenance) will result in a context [DAO](https://en.wikipedia.org/wiki/Data_access_object) from beginning till end of a run.

## Decision Drivers

Expand Down
45 changes: 45 additions & 0 deletions docs/adr/0013-plugin-init.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<!--
SPDX-FileCopyrightText: 2022 German Aerospace Center (DLR), Forschungszentrum Jülich, Helmholtz-Zentrum Dresden-Rossendorf

SPDX-License-Identifier: CC-BY-SA-4.0
-->
# Installing plugins from the marketplace using hermes init

* Status: accepted
* Deciders: nheeb
* Date: 2025-03-04

## Context and Problem Statement

For a smooth user experience common plugins (those which are on the marketplace) should be installable via `hermes init`. That however means we need to decide on a way for the plugins to ask question during that same init process.

## Considered Options

* **Full install**: Plugins are installed locally during `hermes init`, can hook into the init process, and ask questions themselves to adjust the `hermes.toml` or similar.
* **No install**: Plugins are only added to the CI pipeline as `pip install ...` lines. Additional questions for the init process could be added in the marketplace input mask along with a property name under which the answer is stored in the `hermes.toml`.
* **Partial install**: Plugins are only added to the CI pipeline as `pip install ...` lines. Additional questions for the init process are handled in a "detached" script that is downloaded, executed locally, and then deleted again (this script may only have dependencies of Hermes).

## Decision Outcome

Chosen option: "**Partial install**", because it is a good trade-off between giving plugins more controll over their init process and not being too invasive with local installs.

## Pros and Cons of the Options

### Full install
- (+) Plugins have a lot of control over how they design their own init process.
- (+) The plugin can be used locally on the device directly if the user intends to do so.
- (-) The plugin might be installed unnecessarily, as locally only the init part may be executed.
- (-) The plugin may introduce many dependencies that the user doesn’t necessarily need.
- (-) There could be environment complications (e.g., if Hermes was installed with `pipx`).

### No install
- (+) Nothing is installed locally via `hermes init`.
- (+) Overall, slightly less effort for the init command and plugin developers.
- (-) The marketplace would need input masks for an arbitrary number of such questions.
- (-) Plugins have little control over how they design their own init process.
- (-) Plugins intended for local use must be installed manually.

### Partial install
- (+) Nothing is installed locally via `hermes init`.
- (+) Plugins have relatively high control over how they design their own init process.
- (-) Plugins intended for local use must be installed manually.
62 changes: 62 additions & 0 deletions docs/adr/0014-standardized-provenance-recording.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<!--
SPDX-FileCopyrightText: 2025 German Aerospace Center (DLR), Forschungszentrum Jülich, Helmholtz-Zentrum Dresden-Rossendorf

SPDX-License-Identifier: CC-BY-SA-4.0
-->
# Standardized provenance recording

* Status: proposed
* Deciders: sdruskat, skernchen, notactuallyfinn
* Date: 2025-10-17

Technical story:
* https://github.com/softwarepub/hermes/pull/442
* https://github.com/softwarepub/hermes/issues/363

## Context and Problem Statement

To consolidate traceability of the metadata, and resolution based on metadata sources in case of duplicates, etc., we need to record the provenance of metadata values in a __standardized__ way.
To achieve this, we use the [PROV-O ontology](https://www.w3.org/TR/prov-o/) serialized as [JSON-LD](https://www.w3.org/TR/json-ld/). Additionally, HERMES should make it possible to record as much of the provenance as possible *centrally*, i.e., as part of the core codebase. This is to keep plugin developers from having to supply their own provenance solutions.

To do this, we need to specify what provenance information is recorded and how it can be implemented in HERMES to make it easy to use.

## Considered Options

* Provide HERMES API-methods that also document themselves

## Decision Outcome

Chosen option:

## Pros and Cons of the Options

### Provide HERMES API-methods that also document themselves

Provide API-methods for loading, writing, making web requests, etc. that document themselves.<br>
Those methods take also the function that should be used for the task at hand and just define a framework in which we implement the provenance-data recording.<br>
Like so:
```python
class HermesPlugin():
def load(func, path: str, *args, **kwargs):
# TODO: handle and record byte formats properly
with open(path) as fi:
data = func(fi, *args, **kwargs)
prov.record("load", path, func.__name__, data) # also module of func
return data

def write(func, path: str, data, *args, **kwargs):
# TODO: handle and record byte formats properly
with open(path) as fi:
func(fi, data, *args, **kwargs)
prov.record("write", path, func.__name__, data) # also module of func
```

* Good, because allows for recording of provenance information of the plugins
* Good, because it isn't making plugin development harder
* Bad, because API methods may not cover all I/O functionality python provides
* Bad, because it doesn't cover merging, mapping, etc.

All provenance information should be recorded in the following format where addtional properties of agents, activites and entities are values of suitable vocabularies (from Schema.org, CodeMeta and potentially other schemas):

![](./hermes-prov-diagram/hermes-prov.svg)<br>
source: [hermes-prov.drawio](./hermes-prov-diagram/hermes-prov.drawio)
Loading