Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
396e4c3
re-add marketplace drafts
rpietzsch Jun 24, 2026
8bf7d57
add how to install / develop a marketplace package
adelahaye-ecc Jul 8, 2026
68973b2
fix image correct folder & revert unwanted deletion
adelahaye-ecc Jul 8, 2026
c2940fb
Merge branch 'feature/marketplace-packages' into marketplace_package_…
rpietzsch Aug 5, 2026
b902ff4
Merge pull request #229 from adelahaye-ecc/marketplace_package_creation
rpietzsch Aug 5, 2026
2d96b9b
docs(user-guide): add description of content language setting and cle…
MaximilianWenzel Jul 13, 2026
8acd7ab
Update doc for execution variables
robertisele Jul 7, 2026
d46c9aa
Make related-plugin references clickable links in the generated refer…
Jul 14, 2026
8b4a7ca
Run the unit test suite in CI
Jul 15, 2026
780b7d9
Extract plugin_paths construction into its own function, unit-tested.
Jul 15, 2026
1a27ec8
Small cleanup
Jul 15, 2026
d2f8bd8
Validate related-plugin references before wiping the output directory
Jul 16, 2026
942d79a
Read the related-plugin page path from the existing index instead of …
Jul 17, 2026
b8c95da
Collect all unresolvable related-plugin references instead of bailing…
Jul 17, 2026
de9c449
Delete unused variable in test code
Jul 17, 2026
f567165
Test related-plugin link rendering beyond the one happy path it had
Jul 17, 2026
8f4327b
add AI Disclaimers
rpietzsch Jul 10, 2026
d6f9c91
Refine wording and align with product UI text.
rpietzsch Jul 10, 2026
e6017ff
refine explanation, CMEM-7488
rpietzsch Jul 14, 2026
9326333
Update System Architecture
rpietzsch Jul 16, 2026
460eafc
Use posixpath functions instead of handwritten ones.
robertisele Jul 21, 2026
5fb14fb
align license requirement statement
rpietzsch Jul 30, 2026
41ad9dc
allow additional (html) elements
rpietzsch Aug 4, 2026
7a3600f
regenerationg di-reference, apply fix:format
rpietzsch Aug 4, 2026
ba20902
- satisfy rumdl complaints
rpietzsch Aug 5, 2026
fd69776
update cmemc cli reference
rpietzsch Aug 5, 2026
abfd49e
consolidate packages drafts
rpietzsch Aug 5, 2026
60d956c
apply rumdl auto-fixes
rpietzsch Aug 5, 2026
20ea4c7
move tutorial, fix links
rpietzsch Aug 5, 2026
7ce651d
Merge branch 'main' into feature/marketplace-packages
rpietzsch Aug 7, 2026
d896c32
WIP: add end-user Marketplace chapter in new Distribution section, CM…
Aug 13, 2026
e331d13
Merge branch 'main' into feature/marketplace-packages-CMEM-8002
annamakor Aug 17, 2026
6098b1f
Merge remote-tracking branch 'origin/main' into feature/marketplace-p…
Aug 17, 2026
545f81d
Use official product name
Aug 17, 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
1 change: 1 addition & 0 deletions docs/.pages
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ nav:
- Build: build
- Explore: explore-and-author
- Consume: consume
- Distribution: distribution
- Deploy and Configure: deploy-and-configure
- Automate: automate
- Develop: develop
Expand Down
1 change: 1 addition & 0 deletions docs/develop/.pages
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ nav:
- Develop: index.md
- Accessing Graphs with Java Applications: accessing-graphs-with-java-applications
- Python Plugins: python-plugins
- Marketplace Packages: packages
- cmempy - Python API: cmempy-python-api
- cmemc - Python Scripts: cmemc-scripts
- Build (DataIntegration) APIs: dataintegration-apis
Expand Down
6 changes: 6 additions & 0 deletions docs/develop/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ API documentation and programming recipes.

For Python developers, we offer a [Plugin SDK](python-plugins/index.md) as well as an API for accessing and manipulating Corporate Memory Instances ([cmem-cmempy](cmempy-python-api/index.md)).

- :material-shopping: Marketplace Packages

---

[Marketplace Packages](packages/index.md) bundle existing content (graphs, Build projects, dependencies, ...) into a single shareable artifact. [Create your own packages](packages/development/index.md) for easy distribution and reuse.

- :material-api: OpenAPI specification

---
Expand Down
4 changes: 4 additions & 0 deletions docs/develop/packages/.pages
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
nav:
- Marketplace Packages: index.md
- Installation and Management: installation
- Development and Publication: development
3 changes: 3 additions & 0 deletions docs/develop/packages/development/.pages
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
nav:
- Development and Publication: index.md
- Tutorial: tutorial
271 changes: 271 additions & 0 deletions docs/develop/packages/development/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,271 @@
---
title: "Marketplace Packages: Development and Publication"
icon: material/code-json
tags:
- Marketplace
- Package
---
# Development and Publication of Marketplace Packages

## Introduction

Marketplace Packages are archives that bundle content, functionality, and configuration from Corporate Memory for sharing and reuse.

Each package has its own release cycle.
Packages can be installed and uninstalled during runtime.

In order to support the development and publication of Marketplace Packages, we published a [package-template](https://github.com/eccenca/cmem-package-template).
Please have a look at this template to get started.

This page gives an overview of the concepts you need to understand in order to develop packages.
If you prefer to learn by doing, follow the [step-by-step tutorial](tutorial/index.md), which builds a package with a graph and a Build project from scratch.

## Package Structure

Use the [package-template](https://github.com/eccenca/cmem-package-template) to create the boilerplate for a package repository:

```shell title="Create a package repository from the template"
copier copy gh:eccenca/cmem-package-template my-package
```

The template asks for the following variables:

`package_type`
: `vocabulary` (default) or `project`, see [Metadata](#metadata).

`package_id`
: Unique package identifier in lowercase letters, numbers, and hyphens (e.g. `eccenca-supply-chain-vocab`).

`package_name`
: Human-readable package name (3 - 50 characters).

`package_description`
: Short description of the package (10 - 150 characters).

`python_dependencies`
: Comma-separated [Python plugin](../../python-plugins/index.md) dependencies (only asked for `project` packages).

`vocab_dependencies`
: Comma-separated dependencies on other Marketplace Packages (only asked for `project` packages).

`github_page`
: Optional URL of the package repository, used as the base for icons and the homepage link.

The generated repository has two levels:
the top level holds the generic package repository files (changelog, README, license, CI configuration, and a `Taskfile.yaml`), while the nested `{package_id}/` folder is the **package directory** - the actual package content plus its manifest.

### License

!!! info "No publication without license"

Packages without a license declaration cannot be published to a Corporate Memory Marketplace Server.

Our template will bootstrap your package with an _Apache License 2.0 ([`Apache-2.0`](https://spdx.org/licenses/Apache-2.0.html))_.
See <https://spdx.org/licenses/> if you need a different license.
You can remove a license entirely; however, a package that does not declare a license cannot be published.

### Manifest

The `cpa-manifest.json` in the package directory is the central package definition.
It contains all relevant package metadata and describes the package contents.
It is used to present package details and contents to the `inspect` command<!-- or in the marketplace frontends-->, to install, configure and uninstall all parts of a package.

#### Metadata

`package_type`
: `project`
: A package that may ship any content, mainly intended to contain Build projects, (instance/data) graphs, SHACL shapes, workspace configuration, query catalogs, etc.

`vocabulary`
: A package that is supposed to contribute vocabulary / ontology contents, such as `rdf:`, `org:`, `sso:`, etc. Such a package may contain multiple vocabularies / ontologies. Packaging related SHACL shapes is reasonable, too.

`package_id`
: Unique package identifier

`package_version`
: Semantic version identifier string of the package, but limited to proper releases.

`metadata.name`
: The package name in English.

`metadata.description`
: The package description in English.

`metadata.license`
: The [SPDX license identifier](https://spdx.org/licenses/) of the package, e.g. `Apache-2.0`.

`metadata.comment`
: A maintainer or publisher comment.

`metadata.agents`
: Publishers, authors, and contributors of the package.

`metadata.urls`
: Related links, e.g. the homepage or the issue tracker of the package.

`metadata.tags`
: Free-text tags used to categorize the package on a Marketplace Server.

#### Files

A package can contain graphs, Build projects, text files, and images.
These contents are referenced in the `files` section of the `cpa-manifest.json`.

##### Graphs

Use the following structure to include a graph.
`register_as_vocabulary` and `import_into` are optional instructions.
We suggest to organize graphs in a respective sub-folder (here `graphs/`), but this is up to you:

```json
"files": [
{
"file_type": "graph",
"file_path": "graphs/file.ttl",
"graph_iri": "http://www.example.org/file/",
"register_as_vocabulary": true,
"import_into": [
"http://www.example.org/integration_graph/"
]
},
]
```

##### Projects

Use the following structure to include a project.
We suggest to organize projects in a respective sub-folder (here `projects/`), but this is up to you:

```json
"files": [
{
"file_type": "project",
"file_path": "projects/my-build-project.zip",
"project_id": "my-build-project"
},
]
```

##### Texts and Images

Text files and images describe the package itself rather than shipping content.
The template declares `README.md`, `CHANGELOG.md`, and `LICENSE` this way; images are used to represent the package on a Marketplace Server:

```json
"files": [
{
"file_type": "text",
"file_path": "README.md",
"file_role": "readme"
},
{
"file_path": "icon.png",
"file_type": "image",
"file_role": "icon"
},
]
```

#### Dependencies

Dependencies to other packages or to Python plugins can be declared in the `copier copy` answers.
The dependencies are added to the `cpa-manifest.json` as described in the next sections.

##### Python Plugin Packages

Use the following to declare a dependency to a Python plugin:

```json
"dependencies": [
{
"dependency_type": "python-package",
"pypi_id": "cmem-plugin-pyshacl"
},
]
```

##### Marketplace Packages

Use the following to declare a dependency to another Marketplace Package:

```json
"dependencies": [
{
"dependency_type": "marketplace-package",
"package_id": "w3c-rdfs-vocab"
}
]
```

## Package Development Cycle

!!! info "`cmemc package` reference"

The [cmemc package command group](../../../automate/cmemc-command-line-interface/command-reference/package/index.md)
contains all needed commands to support the complete package lifecycle.

Some packages are simply wrapping existing artifacts into a managed structure (e.g. existing vocabulary/ontology).

Most (solution) package development and evolution will be a back and forth between a package repository (making changes to `cpa-manifest.json` in terms of adding/removing dependencies, graph files, or Build project files) and a Corporate Memory (package development) instance.

![Corporate Memory Marketplace Package Lifecycle](../mpp-lifecycle.svg){ width="50%" }

!!! tip "Task wrappers"

The generated package repository ships a `Taskfile.yaml` which wraps the commands below into `task import`, `task export`, `task build`, `task check`, `task delete`, and `task publish`.
The [tutorial](tutorial/index.md) uses these wrappers.

### Install (local) Packages

Use the following command to install a local package folder content (or built `.cpa` file) to a Corporate Memory (package development) instance.

```shell
cmemc package install --input PATH
```

Make changes to graphs, configuration, or Build projects as needed.
Newly created or imported graphs or Build projects need to be registered in `cpa-manifest.json` so they will be fetched by `export`.

### Export Contents into a Package

Use the following command to export the file artifacts declared in `cpa-manifest.json` from a Corporate Memory (package development) instance to a local package folder.

```shell
cmemc package export PACKAGE_ID
```

Run this to initially populate package contents from a solution configuration. You can also use it to update contents after making changes on your Corporate Memory (package development) instance, capturing them for building and releasing as a Marketplace Package.

For version controlled package directories, add `--extract` to store Build projects as extracted directories instead of ZIP archives (the manifest still references the ZIP; `build` and `install` zip it silently).

### Inspect Packages

Review and verify the contents of a package with the following command:

```shell
cmemc package inspect PACKAGE_PATH
```

### Build Packages

During development you can install a package from a local path (plain folder or a `.cpa` package) using the `cmemc package install --input PATH` command.

Use the `cmemc package build` command.
This will build a package archive from a package directory.

This command processes a package directory, validates its content including the manifest, and creates a versioned Corporate Memory package archive (`.cpa`) with the following naming convention: `{package_id}-v{version}.cpa`.

### Publish Packages

Package archives can be published to the Marketplace Server using the `cmemc package publish` command.
After being published packages can be found and installed directly from the Marketplace Server (potential users do not need to have the local package folder or `.cpa` file available).
Loading
Loading