diff --git a/.gitignore b/.gitignore index a426688..13e6298 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ dist/ # Use pnpm only — npm/yarn lockfiles are accidental package-lock.json yarn.lock +tmp-local-index.json diff --git a/README.md b/README.md index b0c47e8..43c826c 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,30 @@ scripts/ ← validate, build-index, new-preset index.json ← auto-generated; do not edit by hand ``` +## Local smoke testing against Skrebe + +`scripts/build-index.ts` hardcodes the per-preset `manifestUrl` and `glossaryUrl` +in `index.json` to `https://raw.githubusercontent.com/deznode/papia-presets/main/...`. +That means pointing Skrebe at a locally-served `index.json` still sends it to +GitHub for the manifest and glossary — which defeats the point of testing +unmerged changes. + +Current workaround: + +1. `npx http-server . -p 8765 --cors -c-1 -s` +2. Copy `index.json` to `tmp-local-index.json` and hand-rewrite the GitHub raw + URLs to `http://localhost:8765/...`. (`tmp-local-index.json` is gitignored.) +3. In Skrebe → Settings → Advanced, set the custom catalog URL to + `http://localhost:8765/tmp-local-index.json`. + +### TODO: `--base-url` flag for `build-index` + +Replace the manual `tmp-local-index.json` step with +`pnpm build-index --base-url http://localhost:8765`, which writes the same +`index.json` but with every URL rooted at the given base. Five-line change in +`scripts/build-index.ts:22`. Worth doing the next time someone smoke-tests +the install flow or a second preset author needs a local dev loop. + ## 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. diff --git a/index.json b/index.json index 2f1485a..6b8c39a 100644 --- a/index.json +++ b/index.json @@ -1,8 +1,41 @@ { "schemaVersion": 1, - "generatedAt": "2026-05-20T03:00:26.849Z", + "generatedAt": "2026-05-20T14:38:50.031Z", "catalogName": "papia-presets", "catalogVersion": "0.1.0", - "domains": [], - "presets": [] + "domains": [ + "tech" + ], + "presets": [ + { + "id": "skrebe-translator-workflow", + "name": "Skrebe Translator Workflow", + "description": "Core vocabulary a Skrebe user encounters while translating English into Kriolu: editor verbs (open, save, read, write), workflow nouns (document, word, sentence, project), the conjunctions that trip up Portuguese speakers (and, but, because, not, more), and second-person register distinctions. The catalog's seed preset.", + "domain": "tech", + "latestVersion": "0.1.0", + "entryCount": 20, + "dialects": [ + "santiago" + ], + "sourceLanguage": "en", + "targetLanguage": "kea", + "authors": [ + { + "name": "Papia Studio", + "github": "@deznode" + } + ], + "alupecValidated": false, + "featured": false, + "tags": [ + "seed", + "translator-workflow", + "computing", + "conjunctions" + ], + "manifestUrl": "https://raw.githubusercontent.com/deznode/papia-presets/main/presets/skrebe-translator-workflow/manifest.json", + "glossaryUrl": "https://raw.githubusercontent.com/deznode/papia-presets/main/presets/skrebe-translator-workflow/glossary.json", + "updatedAt": "2026-05-19" + } + ] } diff --git a/presets/skrebe-translator-workflow/.cspell.json b/presets/skrebe-translator-workflow/.cspell.json new file mode 100644 index 0000000..1a912d1 --- /dev/null +++ b/presets/skrebe-translator-workflow/.cspell.json @@ -0,0 +1,6 @@ +{ + "import": ["@papia/cspell-kea/cspell-ext.json"], + "overrides": [ + { "filename": "**/{*.kea,kea}.{md,mdx}", "dictionaries": ["kea"] } + ] +} diff --git a/presets/skrebe-translator-workflow/CHANGELOG.md b/presets/skrebe-translator-workflow/CHANGELOG.md new file mode 100644 index 0000000..1721ebd --- /dev/null +++ b/presets/skrebe-translator-workflow/CHANGELOG.md @@ -0,0 +1,23 @@ +# Changelog — skrebe-translator-workflow + +All notable changes to this preset will be documented in this file. Format loosely follows [Keep a Changelog](https://keepachangelog.com/). Bump the version in `manifest.json` according to [semver](https://semver.org/): + +- **Patch** (1.0.0 → 1.0.1) — typo fixes, note clarifications +- **Minor** (1.0.0 → 1.1.0) — new entries added, no breaking changes +- **Major** (1.0.0 → 2.0.0) — terms removed or preferred translation changed (breaks downstream approvals) + +--- + +## [0.1.0] — 2026-05-19 + +### Added + +- Initial draft of the catalog's seed preset (20 entries, Santiago dialect). +- 4 `must` entries codifying non-negotiable rules: the four-way "and" conjunction (`ku` / `y` / `i` / never-`e`), `but` → `ma`, `ALUPEC` (verbatim), `Kriolu` (with `Kabuverdianu` as accepted alternative). +- 13 `should` entries covering editor verbs (open, save, read, write, close, translate, help), workflow nouns (document, word, sentence, project, translation), and the second-person pronoun with register distinctions (`bo` / `nhu` / `nha`). +- 3 `avoid` entries mirroring the existing Skrebe linter calque rules: `because` → `porque`/`porkê` (ALUPEC_CALQUE_PORQUE), `not` → `não`/`nao` (ALUPEC_CALQUE_NAO), `more` → `más` (ALUPEC_CALQUE_MAS). + +### Known limitations + +- Four entries (`translation`, `translate`, `close`, `save`) are bootstrap calques constructed via Portuguese-to-ALUPEC mappings rather than directly attested in a published Kriolu source. They are flagged for community review in the README and will be revisited before `1.0.0`. +- No `nameKriolu` field in the manifest yet — pending a community-reviewed translation of "Skrebe Translator Workflow". diff --git a/presets/skrebe-translator-workflow/README.md b/presets/skrebe-translator-workflow/README.md new file mode 100644 index 0000000..90aec4a --- /dev/null +++ b/presets/skrebe-translator-workflow/README.md @@ -0,0 +1,56 @@ +# Skrebe Translator Workflow + +The catalog's seed preset — a small, dense vocabulary covering the words a Skrebe user actually encounters while translating English Markdown into Cape Verdean Kriolu. Twenty entries, Santiago dialect, MIT-licensed. + +This preset exists for two reasons: + +1. **Marketplace seed.** The `papia-presets` catalog needs to ship with at least one credible preset so that Skrebe's marketplace UI has something to render. This is that preset. +2. **Pedagogical anchor.** Several entries codify rules the Skrebe ALUPEC linter already enforces — the four-way "and" trap (`ku` / `y` / `i` / never `e`), the `mas` / `ma` / `más` distinction, the forbidden Portuguese calques (`porque`, `não`, `más`). Installing this preset makes the linter's vocabulary visible to translators inside the glossary panel. + +## Audience + +Anyone using Skrebe to translate English-source Markdown into Kriolu. The vocabulary is intentionally narrow: + +- **Editor verbs**: open, save, read, write, close, translate, help +- **Workflow nouns**: document, word, sentence, project, translation +- **Function words**: the "and" conjunction family, "but", "you" (with register distinctions) +- **Calque traps**: forbidden Portuguese forms of "because", "not", "more" +- **Proper nouns**: ALUPEC, Kriolu + +It is **not** a general English-Kriolu dictionary. Pair it with a domain preset (health, education, civic-government) when you need vocabulary for a specific field. + +## Dialect notes + +All entries reflect Santiago (Badiu) usage. Where alternative dialect forms exist (e.g. São Vicente `salva` vs. Santiago `guarda` for "save"), they are mentioned in the entry's `notes` field but not encoded as separate targets — that's for a future multi-dialect preset. + +## Pedagogical highlights + +- **Entry "and"** — the catalog's most-cited rule, with `ku` / `y` / `i` as the three valid choices and a notes-field warning that `e` (the copula "is") must never be used as "and". This is the single most common Portuguese-interference bug in Kriolu writing. See [ADR-0013](https://github.com/deznode/papia-studio/blob/main/docs/adr/0013-alupec-and-conjunction-design.md). +- **Entry "you"** — exercises the `register` field with `bo` (neutral), `nhu` (formal, masculine), `nha` (formal, feminine). +- **The three "avoid" entries** (`because`, `not`, `more`) mirror exactly the three calque rules the Skrebe linter already enforces: `ALUPEC_CALQUE_PORQUE`, `ALUPEC_CALQUE_NAO`, `ALUPEC_CALQUE_MAS`. Installing this preset puts those rules into the glossary panel where translators see them at lookup time, not only at lint time. + +## Bootstrap-curated entries (flagged for community review) + +This being the catalog's first preset, several computing-domain terms are **constructed from Portuguese-to-ALUPEC mappings** rather than attested in a published Kriolu source. They are listed below; pull requests refining them with native-speaker input are welcome. + +| Entry | Proposed target | Why it's flagged | +|---|---|---| +| `translation` → `tradusan` | Mechanical mapping (PT *tradução* → ALUPEC `ç→s`, `ão→an`) | No published attestation; `tradusu` / `tradusion` are plausible alternatives | +| `translate` → `traduzi` | Regular `-i` verb pattern | Not in Peace Corps dictionary; pattern is regular but the specific lemma isn't attested | +| `close` → `fitxa` | Extended from "lock" sense | Peace Corps lists `fitxa` primarily as "lock"; the document-close sense is an extrapolation | +| `save` → `guarda` | Extended from "protect/keep" sense | Computing/UI extension of a general verb; the alternative `salva` exists | + +A maintainer will ask a native Kriolu speaker to review these before tagging `1.0.0`. + +## Sources + +- `docs/glossary.md` in [`deznode/papia-studio`](https://github.com/deznode/papia-studio) — project-normative terms (ALUPEC, Kriolu, dialect names, ASR/TM). +- [ADR-0013](https://github.com/deznode/papia-studio/blob/main/docs/adr/0013-alupec-and-conjunction-design.md) — canonical "and" conjunction design. +- Resolução n.º 48/2005 and Decreto-Lei n.º 67/98 — Cape Verde government ALUPEC spec. +- [Peace Corps Kriolu Dictionary](https://files.peacecorps.gov/multimedia/pdf/library/CV_Kriolu.pdf) — general lexicon (entries 6, 7, 13, 14, 15, 16). +- [Omniglot Cape Verdean Creole](https://www.omniglot.com/writing/caboverdean.htm) — ALUPEC quick reference. +- `arkhe/eval/gemini-2.5-flash-baseline.json` in `deznode/papia-studio` — community-reviewed gold translations. + +## License + +Released under the [MIT License](../../LICENSE). See `manifest.json` for authorship. diff --git a/presets/skrebe-translator-workflow/glossary.json b/presets/skrebe-translator-workflow/glossary.json new file mode 100644 index 0000000..806667f --- /dev/null +++ b/presets/skrebe-translator-workflow/glossary.json @@ -0,0 +1,192 @@ +{ + "schemaVersion": 1, + "entries": [ + { + "source": "and", + "targets": [ + { "term": "ku", "preferred": true }, + { "term": "y" }, + { "term": "i" } + ], + "policy": "must", + "partOfSpeech": "conjunction", + "notes": "Four-way choice. Use `ku` to coordinate noun phrases (e.g. \"Pandas ku NumPy\", \"pai ku mai\"). Use `y` (ALUPEC spec form per Decreto-Lei n.º 67/98) or `i` (community-accepted alternative) for clausal coordination (e.g. \"El ta lé i ta skrebi\"). NEVER use `e` — that is the copula \"is\" and flips meaning: \"Fásil di lé e skrebi\" misreads as \"easy to read IS write\". See ADR-0013." + }, + { + "source": "but", + "targets": [ + { "term": "ma", "preferred": true } + ], + "policy": "must", + "partOfSpeech": "conjunction", + "notes": "Kriolu \"but\" is `ma`, not `mas`. The unaccented `mas` is the comparative \"more\" (\"mas grandi ki kel\" = \"bigger than that\"). The accented `más` is Portuguese interference and never used in ALUPEC. Linter rule: ALUPEC_CALQUE_MAS." + }, + { + "source": "ALUPEC", + "targets": [ + { "term": "ALUPEC", "preferred": true } + ], + "policy": "must", + "partOfSpeech": "abbreviation", + "notes": "Preserve verbatim, uppercase. Stands for Alfabeto Unificado para a Escrita do Caboverdiano (Resolução n.º 48/2005). Do not translate, lowercase, or hyphenate." + }, + { + "source": "Kriolu", + "targets": [ + { "term": "Kriolu", "preferred": true }, + { "term": "Kabuverdianu" } + ], + "policy": "must", + "partOfSpeech": "noun", + "notes": "Cape Verdean Creole, ISO 639-3 `kea`. Both `Kriolu` and `Kabuverdianu` are accepted endonyms. Do NOT use Portuguese `Crioulo` — even without the cedilla it carries PT orthography assumptions." + }, + { + "source": "write", + "targets": [ + { "term": "skrebi", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "The verb that gives Skrebe its name. ALUPEC starts with `sk-` (not `esc-`) and ends in `-i` (not Portuguese `-er`). Example: \"El ta skrebi tudu dia\" (\"He writes every day\")." + }, + { + "source": "read", + "targets": [ + { "term": "lé", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "The acute accent on the stressed vowel is mandatory. Pairs idiomatically with `skrebi`: \"Fásil di lé i skrebi\" (\"easy to read and write\"). Do not write the Portuguese infinitive `ler`." + }, + { + "source": "open", + "targets": [ + { "term": "abri", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "Standard verb in both general and UI senses (\"abri un dokumentu\" = \"open a document\"). Final `-i`, not Portuguese `-ir`." + }, + { + "source": "save", + "targets": [ + { "term": "guarda", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "Used for \"save\" in the software/UI sense. Peace Corps lists the core meaning as \"protect/keep\" — naturally extended to the file-save context. The alternative `salva` exists but reads more Portuguese. Community review encouraged." + }, + { + "source": "close", + "targets": [ + { "term": "fitxa", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "ALUPEC digraph `tx` (not `ch`). Peace Corps lists the primary sense as \"lock\"; the document-close sense is a natural extension. Example: \"Fitxa kel dokumentu\". Community review encouraged." + }, + { + "source": "translate", + "targets": [ + { "term": "traduzi", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "Kriolu drops the Portuguese infinitive ending: PT *traduzir* → Kr *traduzi*. Follows the same `-i` verb pattern as `skrebi`, `abri`, `parti`. Not directly attested in Peace Corps — bootstrap term, pending community review." + }, + { + "source": "translation", + "targets": [ + { "term": "tradusan", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "noun", + "notes": "Bootstrap calque from PT *tradução* with ALUPEC mappings (`ç` → `s`, `ão` → `an`). Not directly attested — pending community review. Alternative forms `tradusu` and `tradusion` exist in informal usage." + }, + { + "source": "document", + "targets": [ + { "term": "dokumentu", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "noun", + "notes": "Standard Portuguese cognate with ALUPEC mapping (`c` → `k`, final `-o` → `-u`). Used in the computing/UI sense for any text artifact (e.g. a Skrebe `.papia.json` bundle)." + }, + { + "source": "word", + "targets": [ + { "term": "palávra", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "noun", + "notes": "Acute on the stressed vowel; directly attested in the Peace Corps wordlist. Used for linguistic units in editor UI (e.g. word count)." + }, + { + "source": "sentence", + "targets": [ + { "term": "frazi", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "noun", + "notes": "Directly attested. Used by Skrebe's sentence-segmentation pipeline when surfaced in UI." + }, + { + "source": "project", + "targets": [ + { "term": "projektu", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "noun", + "notes": "Directly attested. ALUPEC uses `k` (not Portuguese `c` or `-ct-`). Used for a Skrebe translation project or workspace." + }, + { + "source": "help", + "targets": [ + { "term": "djuda", "preferred": true } + ], + "policy": "should", + "partOfSpeech": "verb", + "notes": "ALUPEC digraph `dj-` (not Portuguese `j-`). Attested in the project eval baseline (\"Obrigadu pa djuda-m oji\" = \"thanks for helping me today\"). Works as both verb (\"to help\") and noun (\"help\"). Do NOT use the Portuguese-leaning `ajuda`." + }, + { + "source": "you", + "targets": [ + { "term": "bo", "preferred": true, "register": "neutral" }, + { "term": "nhu", "register": "formal" }, + { "term": "nha", "register": "formal" } + ], + "policy": "should", + "partOfSpeech": "pronoun", + "notes": "`bo` is the default 2nd-person singular. `nhu` (addressing a man) and `nha` (addressing a woman) are the respectful forms used with elders or in formal address. Avoid Portuguese `você` (Brazilian PT influence)." + }, + { + "source": "because", + "targets": [ + { "term": "porque" }, + { "term": "porkê" } + ], + "policy": "avoid", + "partOfSpeech": "conjunction", + "notes": "Both forms are Portuguese interference. Use Kriolu `pamodi` or `pabia` instead. Enforced by linter rule ALUPEC_CALQUE_PORQUE. Example: \"N ka kre ba pamodi sa ta txobe\" (\"I don't want to go because it's raining\")." + }, + { + "source": "not", + "targets": [ + { "term": "não" }, + { "term": "nao" } + ], + "policy": "avoid", + "partOfSpeech": "adverb", + "notes": "Both forms are Portuguese (the tilde in `não` is ALUPEC-forbidden anyway). Kriolu negation is `ka`, placed before the verb (\"N ka kre ba\" = \"I don't want to go\"). Enforced by linter rule ALUPEC_CALQUE_NAO." + }, + { + "source": "more", + "targets": [ + { "term": "más" } + ], + "policy": "avoid", + "partOfSpeech": "adverb", + "notes": "The accented `más` is Portuguese interference. Kriolu \"more\" is `mas` (unaccented): \"mas grandi ki kel\" = \"bigger than that\". Beware: this same `mas` is correct for \"more\" but NEVER for \"but\" — for \"but\" use `ma` (see the \"but\" entry)." + } + ] +} diff --git a/presets/skrebe-translator-workflow/manifest.json b/presets/skrebe-translator-workflow/manifest.json new file mode 100644 index 0000000..c5f1199 --- /dev/null +++ b/presets/skrebe-translator-workflow/manifest.json @@ -0,0 +1,32 @@ +{ + "schemaVersion": 1, + "id": "skrebe-translator-workflow", + "name": "Skrebe Translator Workflow", + "description": "Core vocabulary a Skrebe user encounters while translating English into Kriolu: editor verbs (open, save, read, write), workflow nouns (document, word, sentence, project), the conjunctions that trip up Portuguese speakers (and, but, because, not, more), and second-person register distinctions. The catalog's seed preset.", + "domain": "tech", + "version": "0.1.0", + "license": "MIT", + "entryCount": 20, + "dialects": ["santiago"], + "sourceLanguage": "en", + "targetLanguage": "kea", + "authors": [ + { + "name": "Papia Studio", + "github": "@deznode", + "url": "https://papia.studio" + } + ], + "maintainers": ["@deznode"], + "sources": [ + "docs/glossary.md (deznode/papia-studio) — project-normative terminology for ALUPEC, Kriolu, dialect names, and ASR/TM concepts.", + "ADR-0013 (deznode/papia-studio) — canonical four-way 'and' conjunction design (ku / y / i / never-e).", + "Resolução n.º 48/2005 and Decreto-Lei n.º 67/98 — Cape Verde government ALUPEC orthography specifications.", + "Peace Corps Kriolu Dictionary — https://files.peacecorps.gov/multimedia/pdf/library/CV_Kriolu.pdf (general lexicon attestation).", + "Omniglot Cape Verdean Creole — https://www.omniglot.com/writing/caboverdean.htm (ALUPEC quick reference).", + "Gemini 2.5 Flash translation eval baseline (deznode/papia-studio, arkhe/eval/gemini-2.5-flash-baseline.json) — community-reviewed gold translations used for regression scoring." + ], + "createdAt": "2026-05-19", + "updatedAt": "2026-05-19", + "tags": ["seed", "translator-workflow", "computing", "conjunctions"] +}