Make a PortalJS portal harvestable by national/EU/US open-data portals — emit standards-compliant DCAT catalog feeds (DCAT 2/3, DCAT-AP, DCAT-US, national profiles) in JSON-LD, Turtle, and RDF/XML at build, with autodiscovery and per-profile conformance checking.
SkillScore77Maintained
Automatic
◆Data Engineer pack
Last verified 8/13/2026
What it changes
Passed 17 of 22 test cases with the skill, and 5 of 22 without it.
Without skill23%
With skill77%
Checks it passed that the model alone missed
Raises the UNKNOWN_PROFILE error.
Specifies running npx next build.
Reports the NO_METADATA_CONTRACT error.
and 14 more in the full report
13 fixed4 passed either way4 still failing1 broke
Pass-rate lift
+55 pp
Tokens
+24%
Agent turns
0%
Response time
-54%
Model gemini-3.6-flashMeasured 8/13/2026v117 of 22 cases passed with skill
Tokens, turns and time describe resource use, not a dollar price.
See it in action
One of 13 test cases the skill fixed. Same model, same prompt, with and without the skill.
1 of 13
Prompt
What CLI command should be executed to verify that adding DCAT feed generation did not break the PortalJS production build?
What was checked, without and with the skill
Checked
Without skill
With skill
Specifies running npx next build.
Missed
Passed
case-18 · gemini-3.6-flash · 8/13/2026 · answers are capped and redacted
What's inside
The instructions your model reads when the skill loads.
SKILL.md119 lines2 files
PortalJS — Add DCAT
Overview
Turn an existing PortalJS (portaljs-catalog) portal into a harvestable data catalog.
PortalJS is Frictionless-native — a dataset is a Data Package (see
portaljs-define-schema) — and DCAT is the serialization + harvest layer on top
(lib/metadata/dcat.ts + lib/metadata/dcat-profiles.ts). This skill selects one or
more DCAT application profiles, maps every dataset's metadata to them, and writes
static feed files at build time — JSON-LD, Turtle, and RDF/XML — so external catalogs
(data.europa.eu, data.gov, national portals) can harvest the datasets automatically,
on any static host, with no runtime.
Prerequisites
A scaffolded PortalJS portal with datasets.json, package.json, and
lib/metadata/ (the metadata-profile contract) present.
lib/metadata/dcat.ts (the DCAT-3 core) already in place — profiles augment it.
Node 18+ and npm available in the portal directory.
For DCAT-AP / DCAT-US: a publishing organization (name + homepage) and a contact
(name + email) — both profiles require dct:publisher and dcat:contactPoint.
Optional but recommended: network access to run SHACL conformance checks against the
official EU ITB validator or pyshacl.
Instructions
The canonical, full step-by-step workflow is
.claude/commands/portaljs-add-dcat.md —
the single source of truth. Read and follow it when executing. Summary:
Gather input from $ARGUMENTS (interview if thin): portal directory (default .),
profiles (default ["dcat-3"]), site URL, publisher, contact, license, themes,
languages, access level.
Validate the portal directory: confirm datasets.json, package.json, and
lib/metadata/ exist; stop with an ERROR: if the metadata contract is missing.
Ensure the DCAT profile layer is present — dcat-profiles.ts, dcat-rdf.ts,
dcat-validate.ts — copying canonical versions from examples/portaljs-catalog if
the portal predates this skill.
Ensure scripts/generate-dcat.ts is wired to predev/prebuild and emits
per-profile x serialization feeds from dcat.config.json.