diff --git a/.cspell.json b/.cspell.json
new file mode 100644
index 0000000..1b1f99e
--- /dev/null
+++ b/.cspell.json
@@ -0,0 +1,8 @@
+{
+ "import": [
+ "@papia/cspell-kea/cspell-ext.json"
+ ],
+ "dictionaries": [
+ "kea"
+ ]
+}
diff --git a/.github/ISSUE_TEMPLATE/preset-request.kea.md b/.github/ISSUE_TEMPLATE/preset-request.kea.md
new file mode 100644
index 0000000..d61d14e
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/preset-request.kea.md
@@ -0,0 +1,36 @@
+---
+name: Pididu di preset (Kriolu)
+about: Pidi un domain novu ô preset ki ka inda eziste
+title: '[Pididu] '
+labels: ['preset-request']
+---
+
+> **DRAFT — needs native-speaker review.**
+>
+> [English](./preset-request.md) | **Kriolu**
+
+## Pididu di preset
+
+**Domain propostu:**
+
+**ID di preset propostu:**
+
+### Ke ki es ta kobri
+
+
+
+### Pamodi é nesesáriu
+
+
+
+### Fontis dispunivel
+
+
+
+### Bu pode autoria-l?
+
+- [ ] Si — N sta a voluntaria pa autoria es preset
+- [ ] Parsialmenti — N pode kontribui entradas ma N meste djuda ku kuradoria ô rivizon
+- [ ] Na — N sta pidi alguen otu ta kria-l
+
+(Tudu três é válidu! Mutu preset útil ta kumesa komo pididu ki alguen otu ta panha más tardi.)
diff --git a/.github/ISSUE_TEMPLATE/preset-request.md b/.github/ISSUE_TEMPLATE/preset-request.md
index 526f26b..9f59d40 100644
--- a/.github/ISSUE_TEMPLATE/preset-request.md
+++ b/.github/ISSUE_TEMPLATE/preset-request.md
@@ -5,6 +5,8 @@ title: '[Request] '
labels: ['preset-request']
---
+> **English** | [Kriolu](./preset-request.kea.md)
+
## Preset request
**Proposed domain:**
diff --git a/.github/PULL_REQUEST_TEMPLATE/new-preset.kea.md b/.github/PULL_REQUEST_TEMPLATE/new-preset.kea.md
new file mode 100644
index 0000000..a625621
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE/new-preset.kea.md
@@ -0,0 +1,46 @@
+---
+name: Preset novu (Kriolu)
+about: Submete un preset novu di glosáriu pa katalogu
+---
+
+> **DRAFT — needs native-speaker review.**
+>
+> [English](./new-preset.md) | **Kriolu**
+
+## Preset novu
+
+**ID di preset:** ``
+
+**Domain:**
+
+**Konta di entradas:**
+
+### Ke ki es preset ta kobri
+
+
+
+### Fontis
+
+
+
+- Fonti 1
+- Fonti 2
+- Fonti 3
+
+### Kobertura di dialetu
+
+
+
+### Kontestu di autor
+
+
+
+### Checklist
+
+- [ ] N kore `pnpm validate ` lokalmenti i el ta pasa
+- [ ] `manifest.entryCount` ta korresponde ku númeru reál di entradas na `glossary.json`
+- [ ] `manifest.id` ta korresponde ku nomi di diretóriu
+- [ ] Kada entrada ten polmenus un alvu
+- [ ] `manifest.sources` ta lista polmenus un referensia kredíbel
+- [ ] N lê i N konkorda ku [CONTRIBUTING.kea.md](../../CONTRIBUTING.kea.md)
+- [ ] N sta publika es kontribuison sob [Lisensia MIT](../../LICENSE)
diff --git a/.github/PULL_REQUEST_TEMPLATE/new-preset.md b/.github/PULL_REQUEST_TEMPLATE/new-preset.md
index d3f38d6..3ff324c 100644
--- a/.github/PULL_REQUEST_TEMPLATE/new-preset.md
+++ b/.github/PULL_REQUEST_TEMPLATE/new-preset.md
@@ -3,6 +3,8 @@ name: New preset
about: Submit a new glossary preset to the catalog
---
+> **English** | [Kriolu](./new-preset.kea.md)
+
## New preset
**Preset ID:** ``
@@ -39,4 +41,4 @@ about: Submit a new glossary preset to the catalog
- [ ] Every entry has at least one target
- [ ] `manifest.sources` lists at least one credible reference
- [ ] I have read and agree to [CONTRIBUTING.md](../../CONTRIBUTING.md)
-- [ ] I release this contribution under [CC BY-SA 4.0](../../LICENSE)
+- [ ] I release this contribution under the [MIT License](../../LICENSE)
diff --git a/.github/PULL_REQUEST_TEMPLATE/update-preset.kea.md b/.github/PULL_REQUEST_TEMPLATE/update-preset.kea.md
new file mode 100644
index 0000000..b2fa61f
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE/update-preset.kea.md
@@ -0,0 +1,40 @@
+---
+name: Atualiza preset (Kriolu)
+about: Atualiza un preset ki ja ta eziste (entradas novu, korreson, klarifikason)
+---
+
+> **DRAFT — needs native-speaker review.**
+>
+> [English](./update-preset.md) | **Kriolu**
+
+## Atualiza preset
+
+**ID di preset:** ``
+
+**Bump di verson:** `` → ``
+
+**Tipu di bump:**
+- [ ] Patch (korreson di tipo, klarifikason di notas)
+- [ ] Minor (entradas novu adisionadu, sen mudansa ki ta keba)
+- [ ] Major (termus tiradu ô tradusãu preferida mudadu — ta keba aprovasãu downstream)
+
+### Ke ki mudou
+
+
+
+### Pamodi
+
+
+
+### Fontis pa entradas novu/mudadu
+
+
+
+### Checklist
+
+- [ ] N bumpa `manifest.version` siginu semver
+- [ ] N atualiza `manifest.updatedAt` pa data di oji
+- [ ] N atualiza `manifest.entryCount` si entradas foi adisionadu/tiradu
+- [ ] N adisiona un entrada na `CHANGELOG.md` pa es verson
+- [ ] N kore `pnpm validate ` lokalmenti i el ta pasa
+- [ ] N é un maintainer listadu di es preset, Ô N ja ping un maintainer pa sign-off
diff --git a/.github/PULL_REQUEST_TEMPLATE/update-preset.md b/.github/PULL_REQUEST_TEMPLATE/update-preset.md
index 7c63b39..9700896 100644
--- a/.github/PULL_REQUEST_TEMPLATE/update-preset.md
+++ b/.github/PULL_REQUEST_TEMPLATE/update-preset.md
@@ -3,6 +3,8 @@ name: Update preset
about: Update an existing preset (new entries, fixes, clarifications)
---
+> **English** | [Kriolu](./update-preset.kea.md)
+
## Update preset
**Preset ID:** ``
diff --git a/.github/workflows/publish-index.yml b/.github/workflows/publish-index.yml
index a7aeed9..b1bb2c5 100644
--- a/.github/workflows/publish-index.yml
+++ b/.github/workflows/publish-index.yml
@@ -18,19 +18,19 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup pnpm
- uses: pnpm/action-setup@v3
+ uses: pnpm/action-setup@v6
with:
version: 9
- name: Setup Node
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6
with:
- node-version: 20
+ node-version: 24
cache: pnpm
- name: Install
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
index 3d93ad5..f702c35 100644
--- a/.github/workflows/validate.yml
+++ b/.github/workflows/validate.yml
@@ -19,19 +19,19 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
fetch-depth: 0 # need git history for version-bump check
- name: Setup pnpm
- uses: pnpm/action-setup@v3
+ uses: pnpm/action-setup@v6
with:
version: 9
- name: Setup Node
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6
with:
- node-version: 20
+ node-version: 24
cache: pnpm
- name: Install
diff --git a/.gitignore b/.gitignore
index 3d61783..a426688 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,7 @@ dist/
.idea/
.vscode/
*.swp
+
+# Use pnpm only — npm/yarn lockfiles are accidental
+package-lock.json
+yarn.lock
diff --git a/.kriolu/ledger.jsonl b/.kriolu/ledger.jsonl
new file mode 100644
index 0000000..81f4f0a
--- /dev/null
+++ b/.kriolu/ledger.jsonl
@@ -0,0 +1,36 @@
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-43ad92996fb4", "topic": null, "file": "README.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 9, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-43ad92996fb4", "topic": null, "file": "README.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 46, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-43ad92996fb4", "topic": null, "file": "README.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 46, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-43ad92996fb4", "topic": null, "file": "README.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 48, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-43ad92996fb4", "topic": null, "file": "README.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 54, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-43ad92996fb4", "topic": null, "file": "README.kea.md", "tool": "papia", "rule_id": "ALUPEC_NEGATION_KA_POS", "line": 59, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:The negation marker 'ka' should be followed by a verb or TMA marker, not a noun or adjective.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-43ad92996fb4", "topic": null, "file": "README.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 60, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_DIGRAPH_TX", "line": 116, "verdict": "skipped", "original": null, "corrected": null, "reason": "errors:Use 'tx' instead of 'ch' for /tʃ/ sound in ALUPEC", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_CHAR_TILDE_A", "line": 19, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Consider using 'an' instead of 'ã' - verify ALUPEC spelling", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_NEGATION_KA_POS", "line": 21, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:The negation marker 'ka' should be followed by a verb or TMA marker, not a noun or adjective.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 43, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 62, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 89, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 91, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_CHAR_TILDE_A", "line": 108, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Consider using 'an' instead of 'ã' - verify ALUPEC spelling", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 117, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 120, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 130, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_CHAR_TILDE_A", "line": 136, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Consider using 'an' instead of 'ã' - verify ALUPEC spelling", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 146, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 149, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-757d39951366", "topic": null, "file": "CONTRIBUTING.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 164, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-b9900650db57", "topic": null, "file": "presets/_example/presets/_example/README.kea.md", "tool": "papia", "rule_id": "ALUPEC_NEGATION_NPI", "line": 7, "verdict": "skipped", "original": null, "corrected": null, "reason": "errors:Negative polarity items (ningen, nada, nunka, ninhun) require the negation marker 'ka' in the same sentence.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-b9900650db57", "topic": null, "file": "presets/_example/presets/_example/README.kea.md", "tool": "papia", "rule_id": "ALUPEC_CHAR_TILDE_A", "line": 13, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Consider using 'an' instead of 'ã' - verify ALUPEC spelling", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-6552bf46e6e6", "topic": null, "file": "presets/_example/presets/_example/CHANGELOG.kea.md", "tool": "papia", "rule_id": "ALUPEC_DIGRAPH_TX", "line": 3, "verdict": "skipped", "original": null, "corrected": null, "reason": "errors:Use 'tx' instead of 'ch' for /tʃ/ sound in ALUPEC", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-6552bf46e6e6", "topic": null, "file": "presets/_example/presets/_example/CHANGELOG.kea.md", "tool": "papia", "rule_id": "ALUPEC_DIGRAPH_TX", "line": 5, "verdict": "skipped", "original": null, "corrected": null, "reason": "errors:Use 'tx' instead of 'ch' for /tʃ/ sound in ALUPEC", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-6552bf46e6e6", "topic": null, "file": "presets/_example/presets/_example/CHANGELOG.kea.md", "tool": "papia", "rule_id": "ALUPEC_DIGRAPH_TX", "line": 7, "verdict": "skipped", "original": null, "corrected": null, "reason": "errors:Use 'tx' instead of 'ch' for /tʃ/ sound in ALUPEC", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-6552bf46e6e6", "topic": null, "file": "presets/_example/presets/_example/CHANGELOG.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 7, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-6552bf46e6e6", "topic": null, "file": "presets/_example/presets/_example/CHANGELOG.kea.md", "tool": "papia", "rule_id": "ALUPEC_CHAR_TILDE_A", "line": 11, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Consider using 'an' instead of 'ã' - verify ALUPEC spelling", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-6552bf46e6e6", "topic": null, "file": "presets/_example/presets/_example/CHANGELOG.kea.md", "tool": "papia", "rule_id": "ALUPEC_CHAR_TILDE_A", "line": 11, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Consider using 'an' instead of 'ã' - verify ALUPEC spelling", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-09aee78da8a1", "topic": null, "file": ".github/PULL_REQUEST_TEMPLATE/.github/PULL_REQUEST_TEMPLATE/update-preset.kea.md", "tool": "papia", "rule_id": "ALUPEC_DIGRAPH_TX", "line": 33, "verdict": "skipped", "original": null, "corrected": null, "reason": "errors:Use 'tx' instead of 'ch' for /tʃ/ sound in ALUPEC", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-09aee78da8a1", "topic": null, "file": ".github/PULL_REQUEST_TEMPLATE/.github/PULL_REQUEST_TEMPLATE/update-preset.kea.md", "tool": "papia", "rule_id": "ALUPEC_CHAR_TILDE_A", "line": 19, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Consider using 'an' instead of 'ã' - verify ALUPEC spelling", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-09aee78da8a1", "topic": null, "file": ".github/PULL_REQUEST_TEMPLATE/.github/PULL_REQUEST_TEMPLATE/update-preset.kea.md", "tool": "papia", "rule_id": "ALUPEC_CHAR_TILDE_A", "line": 19, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Consider using 'an' instead of 'ã' - verify ALUPEC spelling", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-31bcbc65e057", "topic": null, "file": ".github/PULL_REQUEST_TEMPLATE/.github/PULL_REQUEST_TEMPLATE/new-preset.kea.md", "tool": "papia", "rule_id": "ALUPEC_DIGRAPH_TX", "line": 38, "verdict": "skipped", "original": null, "corrected": null, "reason": "errors:Use 'tx' instead of 'ch' for /tʃ/ sound in ALUPEC", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-31bcbc65e057", "topic": null, "file": ".github/PULL_REQUEST_TEMPLATE/.github/PULL_REQUEST_TEMPLATE/new-preset.kea.md", "tool": "papia", "rule_id": "ALUPEC_TMA_INCONSISTENT", "line": 46, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:Inconsistent TMA marker usage. Consider using the same progressive marker throughout the document.", "papia_version": "0.2.0"}
+{"ts": "2026-05-19T20:09:24Z", "run_id": "run-6a96481d4455", "topic": null, "file": ".github/ISSUE_TEMPLATE/.github/ISSUE_TEMPLATE/preset-request.kea.md", "tool": "papia", "rule_id": "ALUPEC_NEGATION_KA_POS", "line": 3, "verdict": "suggestion", "original": null, "corrected": null, "reason": "warnings:The negation marker 'ka' should be followed by a verb or TMA marker, not a noun or adjective.", "papia_version": "0.2.0"}
diff --git a/.kriolu/seen-runs.txt b/.kriolu/seen-runs.txt
new file mode 100644
index 0000000..1551420
--- /dev/null
+++ b/.kriolu/seen-runs.txt
@@ -0,0 +1,7 @@
+run-43ad92996fb4
+run-757d39951366
+run-b9900650db57
+run-6552bf46e6e6
+run-09aee78da8a1
+run-31bcbc65e057
+run-6a96481d4455
diff --git a/CONTRIBUTING.kea.md b/CONTRIBUTING.kea.md
new file mode 100644
index 0000000..f033e1a
--- /dev/null
+++ b/CONTRIBUTING.kea.md
@@ -0,0 +1,164 @@
+> **DRAFT — needs native-speaker review.** Pull requests welcome.
+
+> [English](./CONTRIBUTING.md) | **Kriolu**
+
+# Kontribui un preset
+
+Obrigadu pa kre djuda konstrui es glosáriu komun di Kriolu. Es gia ta papia pa tudu fluxu, di idea te preset merged.
+
+Si algun kuza li ka sta klaru, é un bug di nos — purfavor abri un issue i nu ta koreji dokumentu.
+
+---
+
+## Antis di kumesa
+
+Disidi três kuza:
+
+1. **Domain.** Kale kategoria ki bu preset ta kobri? Saúdi, edukasan, agrikultura, relijian, múzika, tek, sirvisus sivikus, etc. Mante-l strétu — un preset apertadu di 80 termu é midjor ki un di 800 termu spadjadu.
+2. **Públiku.** Ken ki ta uza es preset? Materiál pa pasienti ta lê diferenti di notas klínika; testu di skola ta diferensia di artigu akadémiku. Marka es informasan na README di bu preset.
+3. **Kobertura di dialetu.** Santiagu (Badiu)? São Vicente (Sanpajudu)? Tudu dôs? Marka es informasan na manifest. Mistura dialetu sen sinaliza é problema mas komun na revizan.
+
+Si bu domain ka eziste inda, ka ten problema — bai en frenti i kria-l.
+
+---
+
+## Setup di un bes
+
+Bu ta meste [Node.js 20+](https://nodejs.org/) i [pnpm](https://pnpm.io/installation).
+
+```sh
+git clone https://github.com/YOUR-USERNAME/papia-presets.git
+cd papia-presets
+pnpm install
+```
+
+É só kel. Repo ka ten dipendénsia di runtime alén di un validador di JSON schema.
+
+---
+
+## Fluxu di autoria
+
+### Opsan A — Konstrui-l na Skrebe i exporta
+
+Keli e manera mas faxi. É tanbé más konfiavel, pamodi linter ALUPEC di Skrebe ta panha erus di ortografia kantu bu sta skrebe.
+
+1. Abri Skrebe, kria ô abri kualker dokumentu.
+2. Abri panel di Glosáriu. Adisiona bu termus un pa un, ô importa un CSV.
+3. Esporta komo `.glossary.json` (Panel di Glosáriu → Esporta → JSON).
+4. Poi fixeru exportadu na `presets//glossary.json`.
+
+### Opsan B — Skrebe JSON diretamenti
+
+1. Kria un preset novu:
+
+ ```sh
+ pnpm new-preset health-basic
+ ```
+
+ Es ta kria `presets/health-basic/` ku stub di `manifest.json`, `glossary.json`, `README.md`, i `CHANGELOG.md`.
+
+2. Edita `manifest.json` — kompleta, nomi, diskrisan, autoris, fontis. Odja [`schema/preset-manifest.schema.json`](./schema/preset-manifest.schema.json) pa kada propriedadi.
+
+3. Edita `glossary.json` — adisiona bu entradas. Formatu sta dokumentadu na [`schema/glossary-entry.schema.json`](./schema/glossary-entry.schema.json). Entrada mínimu:
+
+ ```json
+ {
+ "source": "informed consent",
+ "targets": [{ "term": "konsentimentu informadu", "preferred": true }],
+ "policy": "must"
+ }
+ ```
+
+4. Atualiza `entryCount` di `manifest.json` pa korresponde ku númeru di entradas.
+
+---
+
+## Valida antis di submeti
+
+Kore validador lokalmenti — el ta panha omesmu kuzas ki CI, ma más rápidu.
+
+```sh
+pnpm validate health-basic
+```
+
+Un kore verdi ta sinifika:
+
+- Anbus fixeru ta "parse" i ta korresponde ku ses schema
+- `entryCount` ta korresponde ku entradas reál
+- Sen termu `source` dupliku dentu di preset
+- Tudu propriedadi obrigatóriu di manifest sta prezenti
+
+Un kore vermedju ta imprimi izatamenti ke ki sta eradu i undi. Korejil i kore di novu ta bira verdi.
+
+---
+
+## Submeti
+
+1. Faze commit di bu mudansas na un branch:
+
+ ```sh
+ git checkout -b add-health-basic
+ git add presets/health-basic
+ git commit -m "Add health-basic preset (87 entries)"
+ git push origin add-health-basic
+ ```
+
+2. Abri un pull request. Uza template **"New preset"** — el ta pidi domain, fontis, i kobertura di dialetu.
+
+ **Skodje template Kriolu:** GitHub ka ta mostra un menu di template di PR automatikamenti te ki ten múltipu template. Pa uza versan Kriolu, adisiona `?template=new-preset.kea.md` na fin di URL di krian di PR. Ezemplu:
+
+ ```
+ https://github.com/deznode/papia-presets/compare/main...bu-branch?template=new-preset.kea.md
+ ```
+
+ Pa atualizasan di preset, uza `update-preset.md` ô `update-preset.kea.md`.
+
+3. CI ta kore otomatikamenti (~1 minutu). Odja painel di checks:
+ - **Validason di schema** — formatu di fitxeru sta korretu
+ - **Integridadi di entrada** — kontas ta korresponde, sen dupliku
+ - **Linter ALUPEC** — kada termu alvu ta pasa tcheku di ortografia (eru ta bloka merge; avisu ta komentadu ma é permitidu)
+ - **Bump di verson** — só obrigatóriu kantu sta atualiza un preset ki ja ta eziste
+
+4. Un maintainer ta reviza. Nu pode sujeri mudansa — terminolojia, alkance, notas di dialetu. Es ka é rejeson; é manera ki nu ta manten katalogu útil.
+
+5. Na merge, `index.json` ta regenera i bu preset ta fika sta na marketplace di Skrebe dentu di próxiumu siklu di cache (≤1 ora).
+
+---
+
+## Atualiza un preset ki ja ta eziste
+
+Maintainers di un preset sta listadu na si `manifest.json` sob `maintainers`. Es pode faze merge di atualizasan sen un rivizon separadu. Otu kontributoris é mutu ben-vindu pa manda atualizasan — só meste sign-off di un maintainer.
+
+Kada atualizasan **ten ki bumpa verson** na `manifest.json` siginu [semver](https://semver.org/):
+
+- **Patch** (1.0.0 → 1.0.1) — korreson di tipo, klarifikason di notas
+- **Minor** (1.0.0 → 1.1.0) — entradas novu adisionadu, sen mudansa ki ta keba
+- **Major** (1.0.0 → 2.0.0) — termus tiradu ô tradusãu preferida mudadu (es ta afeta tradusons aprovadu di uzuárius downstream)
+
+Dokumenta kada mudansa na `CHANGELOG.md` di preset.
+
+---
+
+## Kritériu di rivizon
+
+Un maintainer ta verifika:
+
+1. **Alkance é klaru.** Domain di preset sta ben defenidu i entradas ta kabe nel.
+2. **Fontis é kredíbel.** Glosários governamental, materiál peer-reviewed, uzu komunitáriu stabelesedu, ô autoris peritu nomeadu. "Sensu komun" sô ka é fonti.
+3. **Konformidadi ku ALUPEC.** Termus alvu ta pasa linter (CI ta enforsa).
+4. **Onestidadi di dialetu.** Si entradas sta predominantimenti di un dialetu, manifest ta dize-l.
+5. **Sen duplikason ku presetis ki ja eziste.** Si bu entrada di "consent" ta kontradidi un na otu preset ki ja merged, nu ta diskuti kal é kanóniku ô si tudu dôs ta kueksisti ku alkance más klaru.
+
+Nu ka ta gatekeep na stilu ô kompletu. Un preset di 30 entradas fokadu pa un peritu di domain é más válidu ki 300 entradas di palpiti.
+
+---
+
+## Kódigu di konduta
+
+Ser respetozu na diskusan di PRs. Debati di terminolojia pode bira kenti — spesialmenti na skodje dialetu, lingua relijiozu, i vokabuláriu politikamenti sensível. Nu ta asumi boa fé i ta pidi tudu djenti pa faze mesmu. Si bu ta sinti ki un diskusan ta bira tóxiku, ô si bu ta sinti ki bu ta trata injustamenti, purfavor abri un issue i nu ta koreji situason.
+
+---
+
+## Perguntas
+
+Abri un issue, ô pergunta na thread di diskusan di un PR ki dja sta abertu. Maintainers ta responde kostumadamenti dentu di poku dia.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 55c10d5..bf98a59 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,3 +1,5 @@
+> **English** | [Kriolu](./CONTRIBUTING.kea.md)
+
# Contributing a preset
Thank you for wanting to help build the Kriolu glossary commons. This guide walks you through the entire flow, from idea to merged preset.
@@ -101,6 +103,14 @@ A red run prints exactly what's wrong and where. Fix and re-run until green.
2. Open a pull request. Use the **"New preset"** template — it asks for the domain, sources, and dialect coverage. Filling it out completely speeds up review.
+ **Selecting a PR template:** GitHub does not show a PR-template picker when multiple templates exist. To use a specific template, append `?template=.md` to the PR-creation URL. Example for a new preset:
+
+ ```
+ https://github.com/deznode/papia-presets/compare/main...your-branch?template=new-preset.md
+ ```
+
+ For updates, use `update-preset.md`. Kriolu versions are also available: `new-preset.kea.md` / `update-preset.kea.md`.
+
3. CI runs automatically (~1 minute). Watch the checks panel:
- **Schema validation** — file shapes are correct
- **Entry integrity** — counts match, no duplicates
diff --git a/LICENSE b/LICENSE
index fdf56c6..2913d2e 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,27 +1,21 @@
-papia-presets © contributors
-
-Licensed under the Creative Commons Attribution-ShareAlike 4.0 International License (CC BY-SA 4.0).
-
-You are free to:
-
- Share — copy and redistribute the material in any medium or format
- Adapt — remix, transform, and build upon the material for any purpose, even commercially
-
-Under the following terms:
-
- Attribution — You must give appropriate credit, provide a link to the
- license, and indicate if changes were made. You may do so in any
- reasonable manner, but not in any way that suggests the licensor
- endorses you or your use.
-
- ShareAlike — If you remix, transform, or build upon the material, you
- must distribute your contributions under the same license as the
- original.
-
- No additional restrictions — You may not apply legal terms or
- technological measures that legally restrict others from doing
- anything the license permits.
-
-Full legal text: https://creativecommons.org/licenses/by-sa/4.0/legalcode
-
-By contributing to this repository, you agree to release your contributions under CC BY-SA 4.0.
+MIT License
+
+Copyright (c) 2026 Joaquim Costa and papia-presets contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.kea.md b/README.kea.md
new file mode 100644
index 0000000..b7f131d
--- /dev/null
+++ b/README.kea.md
@@ -0,0 +1,60 @@
+> **DRAFT — needs native-speaker review.** Pull requests welcome.
+
+> [English](./README.md) | **Kriolu**
+
+# papia-presets
+
+Presets di glosáriu pa [Skrebe](https://papia.studio), editor di tradusan markdown pa Kriolu di Kabu Verdi (ALUPEC).
+
+Kada preset é un vokabuláriu pikenu i fokadu na un domain spesífiku — saúdi, edukason, sirvisus sivikus, tekenolojia, relijaun, etc. Uzuárius di Skrebe ta navega na katalogu li dentu di aplikason, ta instala kes ki es ta meste, i ta resebe sujeston di termu i tcheku di konsistensia apropriadu pa domain, kantu sta tradusi.
+
+## Navega katalogu
+
+Abri **Marketplace** na Skrebe. Lista ki bu ta odja ta ben di [`index.json`](./index.json) di es repo, jeradu otomatikamenti tudu bes ki un preset é adisionadu ô atualizadu.
+
+## Kontribui un preset
+
+Bu ka meste ser dezenvolvedor. Si bu sabe edita un un dokumento i kore dôs komandu na terminal, bu pode kontribui. Guia kumpletu pasu-a-pasu: **[CONTRIBUTING.kea.md](./CONTRIBUTING.kea.md)**.
+
+Verson kurtu:
+
+1. Faze fork di es repo.
+2. Kore `pnpm install` un bes.
+3. Kore `pnpm new-preset ` pa kria un folder novu di preset.
+4. Inxi `glossary.json` (ô esporta un di Skrebe i poi-l la).
+5. Kore `pnpm validate ` te ki ta pasa.
+6. Abri un pull request.
+
+Un maintainer ta reviza. CI ta verifika ortografia i strutura. Dipos di merge, bu preset ta parese na Skrebe na poku minutu.
+
+## Strutura di repositóriu
+
+```
+presets/
+ /
+ manifest.json ← metadatu (nomi, domain, verson, autoris, fontis)
+ glossary.json ← entradas di termu propi
+ README.md ← kontestu, públiku-alvu, notas di dialetu
+ CHANGELOG.md ← ke ki mudou na kada verson
+schema/ ← JSON Schemas ki ta defini formatu di fitxeru
+scripts/ ← validate, build-index, new-preset
+index.json ← otu-geradu; ka edita-l a mon
+```
+
+## Lisensia
+
+Tudu presets i dokumentasan na es repo sta lisensiadu sob [Lisensia MIT](./LICENSE). Bu ten libradadi pa uza, modifika, i redistribui konteúdu — te na produtus komersial i di kódigu fitchadu — ku atribuisan sima Lisensia MIT ta izixi.
+
+Kantu bu submete un pull request, bu ta konkorda publika bu kontribuisan ku Lisensia MIT.
+
+## Governason
+
+Es katalogu é parti di prujetu [Papia Studio](https://github.com/deznode/papia-studio). Maintainers ta triadja PRs, ta mediadja disputas sobri terminolojia, i ta disidi kal presetis ta resebe flag "Recomendadu" na marketplace di Skrebe.
+
+Diskorda di un dizizon di kuradoria? Bu pode **faze fork di katalogu** i hospeda un alternativu. Skrebe ta dexa uzuárius adisiona URLs di katalogu kustumizadu na setings — pluralizmu sta konstruidu na sistema.
+
+## Perguntas
+
+- **Atxa un termu eradu?** Abri un issue na preset, ô manda un PR ku korreson.
+- **Kre un domain novu ki ka inda eziste?** Abri un [pididu di preset](./.github/ISSUE_TEMPLATE/preset-request.md) — alguen pode voluntaria pa autoria.
+- **Sta konstrui ferramenta riba di es katalogu?** Schemas na [`schema/`](./schema) é kontratu stabel. Pin `schemaVersion: 1` i bu sta siguru.
diff --git a/README.md b/README.md
index f0400b1..b0c47e8 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+> **English** | [Kriolu](./README.kea.md)
+
# papia-presets
Community-curated glossary presets for [Skrebe](https://papia.studio), the Markdown translation editor for Cabo Verde Kriolu (ALUPEC).
@@ -39,9 +41,9 @@ index.json ← auto-generated; do not edit by hand
## License
-All presets in this repository are licensed under [CC BY-SA 4.0](./LICENSE). Contributors retain authorship; downstream users must credit the original contributors and share derivative works under the same license.
+All presets and documentation in this repository are licensed under the [MIT License](./LICENSE). You're free to use, modify, and redistribute the content — including in commercial and closed-source products — with attribution as the MIT license requires.
-By submitting a pull request you agree to release your contribution under CC BY-SA 4.0.
+By submitting a pull request you agree to release your contribution under the MIT License.
## Governance
diff --git a/package.json b/package.json
index f2eb430..743afd2 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"private": true,
"description": "Community-curated glossary presets for Skrebe (Cabo Verde Kriolu translation editor).",
"type": "module",
- "license": "CC-BY-SA-4.0",
+ "license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/deznode/papia-presets.git"
@@ -20,6 +20,7 @@
"new-preset": "tsx scripts/new-preset.ts"
},
"devDependencies": {
+ "@papia/cspell-kea": "^2.0.2",
"@types/node": "^20.11.0",
"ajv": "^8.12.0",
"ajv-formats": "^3.0.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..62249ec
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,386 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ '@papia/cspell-kea':
+ specifier: ^2.0.2
+ version: 2.0.2
+ '@types/node':
+ specifier: ^20.11.0
+ version: 20.19.41
+ ajv:
+ specifier: ^8.12.0
+ version: 8.20.0
+ ajv-formats:
+ specifier: ^3.0.1
+ version: 3.0.1(ajv@8.20.0)
+ tsx:
+ specifier: ^4.7.0
+ version: 4.22.3
+ typescript:
+ specifier: ^5.3.3
+ version: 5.9.3
+
+packages:
+
+ '@esbuild/aix-ppc64@0.28.0':
+ resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.28.0':
+ resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.28.0':
+ resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.28.0':
+ resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.28.0':
+ resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.28.0':
+ resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.28.0':
+ resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.28.0':
+ resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.28.0':
+ resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.28.0':
+ resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.28.0':
+ resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.28.0':
+ resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.28.0':
+ resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.28.0':
+ resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.28.0':
+ resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.28.0':
+ resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.28.0':
+ resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.28.0':
+ resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.28.0':
+ resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.28.0':
+ resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.28.0':
+ resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.28.0':
+ resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.28.0':
+ resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.28.0':
+ resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.28.0':
+ resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.28.0':
+ resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@papia/cspell-kea@2.0.2':
+ resolution: {integrity: sha512-FMVAty78mSZIMzEdrj7J0p8gV/4go1Uu9kc2+ucEEwoAmgwimOdtFjt5WsQZgv9dLlEEY8eIAOjSs9KEXu2jPA==}
+
+ '@types/node@20.19.41':
+ resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==}
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv@8.20.0:
+ resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
+
+ esbuild@0.28.0:
+ resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-uri@3.1.2:
+ resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ tsx@4.22.3:
+ resolution: {integrity: sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+snapshots:
+
+ '@esbuild/aix-ppc64@0.28.0':
+ optional: true
+
+ '@esbuild/android-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/android-arm@0.28.0':
+ optional: true
+
+ '@esbuild/android-x64@0.28.0':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/darwin-x64@0.28.0':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.28.0':
+ optional: true
+
+ '@esbuild/linux-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/linux-arm@0.28.0':
+ optional: true
+
+ '@esbuild/linux-ia32@0.28.0':
+ optional: true
+
+ '@esbuild/linux-loong64@0.28.0':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.28.0':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.28.0':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.28.0':
+ optional: true
+
+ '@esbuild/linux-s390x@0.28.0':
+ optional: true
+
+ '@esbuild/linux-x64@0.28.0':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.28.0':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.28.0':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/sunos-x64@0.28.0':
+ optional: true
+
+ '@esbuild/win32-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/win32-ia32@0.28.0':
+ optional: true
+
+ '@esbuild/win32-x64@0.28.0':
+ optional: true
+
+ '@papia/cspell-kea@2.0.2': {}
+
+ '@types/node@20.19.41':
+ dependencies:
+ undici-types: 6.21.0
+
+ ajv-formats@3.0.1(ajv@8.20.0):
+ optionalDependencies:
+ ajv: 8.20.0
+
+ ajv@8.20.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.2
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ esbuild@0.28.0:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.28.0
+ '@esbuild/android-arm': 0.28.0
+ '@esbuild/android-arm64': 0.28.0
+ '@esbuild/android-x64': 0.28.0
+ '@esbuild/darwin-arm64': 0.28.0
+ '@esbuild/darwin-x64': 0.28.0
+ '@esbuild/freebsd-arm64': 0.28.0
+ '@esbuild/freebsd-x64': 0.28.0
+ '@esbuild/linux-arm': 0.28.0
+ '@esbuild/linux-arm64': 0.28.0
+ '@esbuild/linux-ia32': 0.28.0
+ '@esbuild/linux-loong64': 0.28.0
+ '@esbuild/linux-mips64el': 0.28.0
+ '@esbuild/linux-ppc64': 0.28.0
+ '@esbuild/linux-riscv64': 0.28.0
+ '@esbuild/linux-s390x': 0.28.0
+ '@esbuild/linux-x64': 0.28.0
+ '@esbuild/netbsd-arm64': 0.28.0
+ '@esbuild/netbsd-x64': 0.28.0
+ '@esbuild/openbsd-arm64': 0.28.0
+ '@esbuild/openbsd-x64': 0.28.0
+ '@esbuild/openharmony-arm64': 0.28.0
+ '@esbuild/sunos-x64': 0.28.0
+ '@esbuild/win32-arm64': 0.28.0
+ '@esbuild/win32-ia32': 0.28.0
+ '@esbuild/win32-x64': 0.28.0
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-uri@3.1.2: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ json-schema-traverse@1.0.0: {}
+
+ require-from-string@2.0.2: {}
+
+ tsx@4.22.3:
+ dependencies:
+ esbuild: 0.28.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ typescript@5.9.3: {}
+
+ undici-types@6.21.0: {}
diff --git a/presets/_example/.cspell.json b/presets/_example/.cspell.json
new file mode 100644
index 0000000..3980e2f
--- /dev/null
+++ b/presets/_example/.cspell.json
@@ -0,0 +1,6 @@
+{
+ "import": ["@papia/cspell-kea/cspell-ext.json"],
+ "overrides": [
+ { "filename": "**/{*.kea,kea}.{md,mdx}", "dictionaries": ["kea"] }
+ ]
+}
\ No newline at end of file
diff --git a/presets/_example/CHANGELOG.kea.md b/presets/_example/CHANGELOG.kea.md
new file mode 100644
index 0000000..3b3bf2e
--- /dev/null
+++ b/presets/_example/CHANGELOG.kea.md
@@ -0,0 +1,19 @@
+> **DRAFT — needs native-speaker review.**
+>
+> [English](./CHANGELOG.md) | **Kriolu**
+
+# Changelog — _example
+
+Tudu mudansa notável na es preset ta sta dokumentadu na es dokumentu. Formatu ta segui livrementi [Keep a Changelog](https://keepachangelog.com/). Troka versan na `manifest.json` siginu [semver](https://semver.org/):
+
+- **Patch** (1.0.0 → 1.0.1) — korresan di tipo, klarifikasan di notas
+- **Minor** (1.0.0 → 1.1.0) — entradas novu adisionadu, sen mudansa ki ta kebra
+- **Major** (1.0.0 → 2.0.0) — termus tiradu ô tradusan preferido mudadu (ta kebra aprovan downstream)
+
+---
+
+## [0.0.1] — 2026-05-15
+
+### Added
+
+- Skafold inisial ku trêz entradas ilustrativu ki ta demonstra polítika `must`, `should`, i `avoid`.
diff --git a/presets/_example/README.kea.md b/presets/_example/README.kea.md
new file mode 100644
index 0000000..553762d
--- /dev/null
+++ b/presets/_example/README.kea.md
@@ -0,0 +1,15 @@
+> **DRAFT — needs native-speaker review.**
+>
+> [English](./README.md) | **Kriolu**
+
+# _example — Referénsia di skafold (KA é un preset reál)
+
+Es pasta ta ezisti pa mostra a kontributoris kumo layout di fixeru ta parese. Underline na inisiu ta signifika un script di build pa **salta es preset** te ki sta gera katalogu — el nunka ta parese na marketplace di Skrebe.
+
+Kantu sta autoria bu próprio preset:
+
+1. Kopia es pasta pa `presets/bu-preset-id/` (sen underline).
+2. Substitui kada valor li ku konteúdu apropriadu pa bu domain.
+3. Faze un faladô di Kriolu verifika kualker tradusan di ezemplu — entradas li é só placeholders pa ilustrasan i ka debe ser tratadu komu autoritáriu.
+
+Pa fluxu kumpletu di kontribuidor, odja [CONTRIBUTING.kea.md](../../CONTRIBUTING.kea.md) na root di repo.
diff --git a/presets/_example/README.md b/presets/_example/README.md
index 01a61dc..312cb15 100644
--- a/presets/_example/README.md
+++ b/presets/_example/README.md
@@ -1,3 +1,5 @@
+> **English** | [Kriolu](./README.kea.md)
+
# _example — Scaffold reference (NOT a real preset)
This directory exists to show contributors what the file layout looks like. The leading underscore tells the build script to **skip this preset** when generating the catalog — it will never appear in Skrebe's marketplace.
diff --git a/presets/_example/manifest.json b/presets/_example/manifest.json
index 8f5adaf..b35ab1f 100644
--- a/presets/_example/manifest.json
+++ b/presets/_example/manifest.json
@@ -6,7 +6,7 @@
"description": "Scaffold reference showing the file layout and manifest fields. Not loaded into the catalog. Delete and replace with your own preset.",
"domain": "general",
"version": "0.0.1",
- "license": "CC-BY-SA-4.0",
+ "license": "MIT",
"entryCount": 3,
"dialects": ["santiago"],
"sourceLanguage": "en",
diff --git a/schema/preset-manifest.schema.json b/schema/preset-manifest.schema.json
index c545a9d..7ba52f8 100644
--- a/schema/preset-manifest.schema.json
+++ b/schema/preset-manifest.schema.json
@@ -78,8 +78,8 @@
},
"license": {
"type": "string",
- "enum": ["CC-BY-SA-4.0"],
- "description": "All presets in this catalog use CC BY-SA 4.0."
+ "enum": ["MIT"],
+ "description": "All presets in this catalog use the MIT License."
},
"entryCount": {
"type": "integer",