kg-ssot 4.12.0 → 4.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -42,7 +42,7 @@ verdict(texto, { format: 'json' }); // .kg.json
42
42
  `external_edges`. Os schemas ficam em `kg-ssot/spec/*`.
43
43
 
44
44
  Desde a 4.10.0, este leitor também mede os avisos SHOULD, com os mesmos códigos do leitor de referência em todos os
45
- casos da suíte. Desde a 4.11.0, as três construções raras do YAML em que ele divergia da referência (a tag `!` sem
45
+ casos da suíte, e desde a 4.13.0 trata o `\r` como quebra de linha, como a referência. Desde a 4.11.0, as três construções raras do YAML em que ele divergia da referência (a tag `!` sem
46
46
  nome, o `!!timestamp` com texto que não é data e o tab fora de aspas) reprovam nos dois, com casos na suíte. A linha de cada ocorrência e as dicas de correção continuam só no leitor de referência em Python.
47
47
 
48
48
  ## TypeScript e CommonJS
package/kg.mjs CHANGED
@@ -256,6 +256,10 @@ function strictTokenError(tokens) {
256
256
  if (t.type === 'tag' && (t.source === '!' || t.source === '!<!>')) return true;
257
257
  if ((t.type === 'single-quoted-scalar' || t.type === 'double-quoted-scalar')
258
258
  && t.source.split(/\r\n|\r|\n/).slice(1).some((line) => /^[ \t]*/.exec(line)[0].includes('\t'))) return true;
259
+ // o texto entre aspas que não fecha no próprio token: o yaml corta o escalar na quebra e lê o resto como outra
260
+ // coisa (aspa '' ou \" no fim da linha); o perfil recusa, como a referência
261
+ if (t.type === 'single-quoted-scalar' && !/^'(?:[^']|'')*'$/.test(t.source)) return true;
262
+ if (t.type === 'double-quoted-scalar' && !/^"(?:[^"\\]|\\[\s\S])*"$/.test(t.source)) return true;
259
263
  }
260
264
  for (const v of Object.values(t)) if (v !== null && typeof v === 'object') stack.push(v);
261
265
  }
@@ -265,8 +269,11 @@ function strictTokenError(tokens) {
265
269
  /** O parse do .kg.yaml no perfil do contrato: { doc, unquotedDate } ou { code: 'parse.*' }. */
266
270
  export function parseYaml(text) {
267
271
  let docs;
272
+ // O \r\n e o \r sozinho viram \n antes do parse, como na especificação do YAML e no leitor de referência (decisão
273
+ // de contrato de 2026-10-20): sem isso, o \r ficava como caractere dentro das aspas, e o CRLF entre aspas reprovava.
274
+ const src = text.includes('\r') ? text.replace(/\r\n?/g, '\n') : text;
268
275
  try {
269
- const tokens = Array.from(new Parser().parse(text));
276
+ const tokens = Array.from(new Parser().parse(src));
270
277
  if (strictTokenError(tokens)) return { code: 'parse.yaml-error' };
271
278
  docs = Array.from(new Composer({
272
279
  version: '1.2', schema: 'core', uniqueKeys: false, merge: false, maxAliasCount: -1,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kg-ssot",
3
- "version": "4.12.0",
3
+ "version": "4.13.0",
4
4
  "description": "Leitor JS do contrato do grafo de conhecimento verificável KG-SSOT (.kg.yaml e .kg.json): validador pré-compilado, sem eval, para Node e React Native/Expo.",
5
5
  "keywords": [
6
6
  "knowledge-graph",
package/spec/release.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "4.12.0",
3
- "tag": "kg-ssot-v4.12.0",
2
+ "version": "4.13.0",
3
+ "tag": "kg-ssot-v4.13.0",
4
4
  "contract": {
5
5
  "must": "spec/kg-contract-v4.schema.json",
6
6
  "should": "spec/kg-contract-v4.should.schema.json"
@@ -28,6 +28,11 @@
28
28
  "tools/kg_prov_export.py",
29
29
  "tools/kg_store.py",
30
30
  "tools/kg_mcp.py",
31
+ "tools/kg_migrate.py",
32
+ "spec/kg-migrate-profile.schema.json",
33
+ "spec/migrate-examples/",
34
+ "tools/test_kg_migrate.py",
35
+ "tools/fixtures/migrate/",
31
36
  "tools/requirements.txt",
32
37
  "packaging/python/",
33
38
  "packaging/npm/",