@semacode/cli 1.5.10 → 1.5.14

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.
Files changed (44) hide show
  1. package/README.md +6 -1
  2. package/SEMA_BRIEF.curto.txt +3 -3
  3. package/SEMA_BRIEF.md +5 -5
  4. package/SEMA_BRIEF.micro.txt +2 -2
  5. package/SEMA_INDEX.json +50 -32
  6. package/dist/drift.d.ts +3 -3
  7. package/dist/drift.js +67 -4
  8. package/dist/drift.js.map +1 -1
  9. package/dist/importador.d.ts +1 -1
  10. package/dist/importador.js +144 -1
  11. package/dist/importador.js.map +1 -1
  12. package/dist/index.js +388 -3
  13. package/dist/index.js.map +1 -1
  14. package/dist/php-symbols.d.ts +24 -0
  15. package/dist/php-symbols.js +375 -0
  16. package/dist/php-symbols.js.map +1 -0
  17. package/dist/projeto.js +14 -0
  18. package/dist/projeto.js.map +1 -1
  19. package/dist/tipos.d.ts +1 -1
  20. package/docs/cli.md +10 -1
  21. package/docs/sintaxe.md +192 -0
  22. package/node_modules/@sema/gerador-css/package.json +1 -1
  23. package/node_modules/@sema/gerador-dart/package.json +1 -1
  24. package/node_modules/@sema/gerador-html/package.json +1 -1
  25. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  26. package/node_modules/@sema/gerador-lua/package.json +1 -1
  27. package/node_modules/@sema/gerador-python/package.json +1 -1
  28. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  29. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +4 -2
  30. package/node_modules/@sema/nucleo/dist/formatador/index.js +40 -13
  31. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
  32. package/node_modules/@sema/nucleo/dist/ir/conversor.js +182 -3
  33. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  34. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +35 -3
  35. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +21 -0
  36. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
  37. package/node_modules/@sema/nucleo/dist/parser/parser.js +38 -0
  38. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  39. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +4 -3
  40. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +310 -13
  41. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  42. package/node_modules/@sema/nucleo/package.json +1 -1
  43. package/node_modules/@sema/padroes/package.json +1 -1
  44. package/package.json +14 -14
package/README.md CHANGED
@@ -5,6 +5,9 @@
5
5
  Ela valida contratos `.sema`, mede `drift` entre contrato e codigo vivo, importa legado, gera codigo derivado, produz contexto IA-first e agora governa persistencia vendor-first para `postgres`, `mysql`, `sqlite`, `mongodb` e `redis`.
6
6
 
7
7
  Lua e suportado como alvo de geracao e como origem semantica de codigo vivo em `use`, `impl`, IR, `drift` e `sema importar`.
8
+ PHP tambem e suportado como origem semantica de codigo vivo em `use`, `impl`, IR, `drift` e `sema importar`, incluindo controllers, funcoes, rotas Laravel/Slim e atributos Symfony/PHP 8.
9
+ `sema author` expoe o profile Author para obra, capitulos, cenas, personagens, continuidade, fontes, estilo, agents e flow editorial.
10
+ O comando tambem expoe `regrasAutomaticas` com o piso geral do Author: mostrar por evidencia, causa e consequencia, cena com dupla funcao, exposicao com atrito, dialogo com subtexto, final sem slogan e anti-cliche adaptativa.
8
11
 
9
12
  Tambem resolve documentacao obrigatoria por intencao para impedir IA de agir sem ler ou criar docs relacionadas.
10
13
 
@@ -63,7 +66,7 @@ sema drift ./contratos-importados --json
63
66
 
64
67
  ## Persistencia vendor-first
65
68
 
66
- A CLI 1.5.7 entende blocos `database` e recursos de persistencia no IR, no formatador, no semantico, na importacao, no drift, no impact map, na renomeacao semantica assistida e no `verificar`. O objetivo nao e esconder diferencas entre bancos, e sim capturar essas diferencas no contrato.
69
+ A CLI atual entende blocos `database` e recursos de persistencia no IR, no formatador, no semantico, na importacao, no drift, no impact map, na renomeacao semantica assistida e no `verificar`. O objetivo nao e esconder diferencas entre bancos, e sim capturar essas diferencas no contrato.
67
70
 
68
71
  Nesta linha, o `drift` tambem passa a resolver melhor metodos JS/TS browser-side definidos via `Object.assign(...prototype...)` e a entrada padrao da CLI para de tropeçar em `exemplos/` quando o projeto real ja tem `contratos/`, `sema/` ou arquivos `.sema` na raiz.
69
72
 
@@ -94,6 +97,8 @@ O tarball publico da CLI inclui:
94
97
  - `sema drift <arquivo-ou-pasta> --json`
95
98
  - `sema resumo <arquivo-ou-pasta> --micro --para onboarding`
96
99
  - `sema prompt-curto <arquivo-ou-pasta> --curto --para mudanca`
100
+ - `sema author --help`
101
+ - `sema author exemplo [--sensivel] [--json]`
97
102
  - `sema contexto-ia <arquivo.sema> --saida <diretorio> --json`
98
103
  - `sema docs-impacto --intencao <acao> [--arquivo <caminho>] [--criar-ausentes] --json`
99
104
  - `sema finalizar-mudanca --intencao <acao> [--doc-lida <caminho>] --json`
@@ -3,7 +3,7 @@ BASE: C:\GitHub\Sema
3
3
  MODULOS: 6
4
4
  ENTRADA_IA: llms.txt -> SEMA_BRIEF.curto.txt -> SEMA_INDEX.json -> AGENTS.md -> README.md
5
5
  TOP_MODULOS: app.pedidos, sema.produto.ergonomia_e_dominio, sema.produto.geradores_web, sema.produto.governanca_ia, sema.produto.linguagem_composta, sema.produto.persistencia_vendor_first
6
- TOP_RISCOS: assistir_renomeacao_semantica:alto, carregar_configuracao_de_persistencia:medio, consultar_scorecard_compatibilidade:medio, converter_bloco_composto_para_ir:alto, converter_persistencia_para_ir_canonico:alto, criar_pedido:alto (+22)
6
+ TOP_RISCOS: assistir_renomeacao_semantica:alto, carregar_configuracao_de_persistencia:medio, consultar_scorecard_compatibilidade:medio, converter_bloco_composto_para_ir:alto, converter_persistencia_para_ir_canonico:alto, criar_pedido:alto (+23)
7
7
  TOP_LACUNAS: sem_impl, vinculo_quebrado
8
- TOP_ARQUIVOS: C:\GitHub\Sema\pacotes\cli\src\docs.ts, C:\GitHub\Sema\pacotes\cli\src\drift.ts, C:\GitHub\Sema\pacotes\cli\src\importador.ts, C:\GitHub\Sema\pacotes\cli\src\index.ts, C:\GitHub\Sema\pacotes\cli\src\projeto.ts, C:\GitHub\Sema\pacotes\editor-vscode\extension.js (+11)
9
- GERADO_EM: 2026-05-02T20:39:52.980Z
8
+ TOP_ARQUIVOS: C:\GitHub\Sema\pacotes\cli\src\docs.ts, C:\GitHub\Sema\pacotes\cli\src\drift.ts, C:\GitHub\Sema\pacotes\cli\src\importador.ts, C:\GitHub\Sema\pacotes\cli\src\index.ts, C:\GitHub\Sema\pacotes\cli\src\lua-symbols.ts, C:\GitHub\Sema\pacotes\cli\src\php-symbols.ts (+15)
9
+ GERADO_EM: 2026-05-09T02:38:09.917Z
package/SEMA_BRIEF.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Sema e IA-first. Este arquivo existe para IA achar o ponto de entrada do projeto sem ter que catar o repo inteiro feito barata tonta.
4
4
 
5
- - Gerado em: `2026-05-02T20:39:52.980Z`
5
+ - Gerado em: `2026-05-09T02:38:09.917Z`
6
6
  - Modulos: `6`
7
7
 
8
8
  ## Entrada canonica para IA
@@ -28,10 +28,10 @@ Sema e IA-first. Este arquivo existe para IA achar o ponto de entrada do projeto
28
28
  - Lacunas: sem_impl, vinculo_quebrado
29
29
 
30
30
  ### sema.produto.ergonomia_e_dominio
31
- - Faz: governa 2 superficie(s), 5 task(s) com foco em scorecard atualizado
31
+ - Faz: governa 2 superficie(s), 7 task(s) com foco em scorecard atualizado
32
32
  - Publico: evento:scorecard_atualizado, policy:compatibilidade_publica
33
- - Tocar: C:\GitHub\Sema\pacotes\cli\src\projeto.ts, C:\GitHub\Sema\pacotes\nucleo\src\formatador\index.ts, C:\GitHub\Sema\pacotes\nucleo\src\ir\conversor.ts, C:\GitHub\Sema\pacotes\nucleo\src\semantico\analisador.ts
34
- - Score: 90 | Confianca: alta | Risco: alto
33
+ - Tocar: C:\GitHub\Sema\pacotes\cli\src\drift.ts, C:\GitHub\Sema\pacotes\cli\src\importador.ts, C:\GitHub\Sema\pacotes\cli\src\index.ts, C:\GitHub\Sema\pacotes\cli\src\lua-symbols.ts (+4)
34
+ - Score: 91 | Confianca: alta | Risco: alto
35
35
  - Lacunas: sem_impl, vinculo_quebrado
36
36
 
37
37
  ### sema.produto.geradores_web
@@ -44,7 +44,7 @@ Sema e IA-first. Este arquivo existe para IA achar o ponto de entrada do projeto
44
44
  ### sema.produto.governanca_ia
45
45
  - Faz: governa 2 superficie(s), 9 task(s) com foco em preparar briefing contextual
46
46
  - Publico: webhook:confirmar_contexto_publico, worker:preparar_briefing_contextual
47
- - Tocar: C:\GitHub\Sema\pacotes\cli\src\docs.ts, C:\GitHub\Sema\pacotes\cli\src\drift.ts, C:\GitHub\Sema\pacotes\cli\src\index.ts, C:\GitHub\Sema\pacotes\cli\src\projeto.ts (+3)
47
+ - Tocar: C:\GitHub\Sema\pacotes\cli\src\docs.ts, C:\GitHub\Sema\pacotes\cli\src\drift.ts, C:\GitHub\Sema\pacotes\cli\src\index.ts, C:\GitHub\Sema\pacotes\cli\src\lua-symbols.ts (+4)
48
48
  - Score: 93 | Confianca: alta | Risco: alto
49
49
  - Lacunas: sem_impl, vinculo_quebrado
50
50
 
@@ -2,6 +2,6 @@ PROJETO: Sema
2
2
  MODULOS: 6
3
3
  ENTRADA_IA: llms.txt -> SEMA_BRIEF.micro.txt -> SEMA_INDEX.json -> AGENTS.md
4
4
  TOP_MODULOS: app.pedidos, sema.produto.ergonomia_e_dominio, sema.produto.geradores_web (+3)
5
- TOP_RISCOS: assistir_renomeacao_semantica:alto, carregar_configuracao_de_persistencia:medio, consultar_scorecard_compatibilidade:medio (+25)
5
+ TOP_RISCOS: assistir_renomeacao_semantica:alto, carregar_configuracao_de_persistencia:medio, consultar_scorecard_compatibilidade:medio (+26)
6
6
  TOP_LACUNAS: sem_impl, vinculo_quebrado
7
- GERADO_EM: 2026-05-02T20:39:52.980Z
7
+ GERADO_EM: 2026-05-09T02:38:09.917Z
package/SEMA_INDEX.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "comando": "resumo-projeto",
3
- "geradoEm": "2026-05-02T20:39:52.980Z",
4
- "cliVersao": "1.5.10",
3
+ "geradoEm": "2026-05-09T02:38:09.917Z",
4
+ "cliVersao": "1.5.11",
5
5
  "baseProjeto": "C:\\GitHub\\Sema",
6
6
  "totalModulos": 6,
7
7
  "entradaCanonica": {
@@ -170,7 +170,7 @@
170
170
  },
171
171
  "modulos": [
172
172
  {
173
- "geradoEm": "2026-05-02T20:39:52.980Z",
173
+ "geradoEm": "2026-05-09T02:38:09.917Z",
174
174
  "arquivo": "C:\\GitHub\\Sema\\contratos\\pedidos.sema",
175
175
  "modulo": "app.pedidos",
176
176
  "perfilCompatibilidade": "publico",
@@ -243,32 +243,33 @@
243
243
  ]
244
244
  },
245
245
  {
246
- "geradoEm": "2026-05-02T20:39:52.980Z",
246
+ "geradoEm": "2026-05-09T02:38:09.917Z",
247
247
  "arquivo": "C:\\GitHub\\Sema\\contratos\\sema\\ergonomia_e_dominio.sema",
248
248
  "modulo": "sema.produto.ergonomia_e_dominio",
249
249
  "perfilCompatibilidade": "interno",
250
- "scoreSemantico": 90,
250
+ "scoreSemantico": 91,
251
251
  "confiancaGeral": "alta",
252
252
  "riscoOperacional": "alto",
253
- "faz": "governa 2 superficie(s), 5 task(s) com foco em scorecard atualizado",
253
+ "faz": "governa 2 superficie(s), 7 task(s) com foco em scorecard atualizado",
254
254
  "tarefasPrincipais": [
255
255
  "reduzir_atrito_sintatico_em_contrato_rico",
256
256
  "modelar_payload_com_mais_precisao",
257
257
  "explicitar_variacao_e_compatibilidade",
258
- "separar_validacao_regra_e_poscondicao",
259
- "consultar_scorecard_compatibilidade"
258
+ "habilitar_impl_lua_completo",
259
+ "habilitar_impl_php_completo",
260
+ "separar_validacao_regra_e_poscondicao"
260
261
  ],
261
262
  "entradasChave": [
262
263
  "reduzir_atrito_sintatico_em_contrato_rico(contrato_atual, repeticao_detectada)",
263
264
  "modelar_payload_com_mais_precisao(contrato_atual, payload_json_generico, exemplos_payload)",
264
265
  "explicitar_variacao_e_compatibilidade(contrato_atual, perfil_atual)",
265
- "separar_validacao_regra_e_poscondicao(contrato_atual, garantias_confusas)"
266
+ "habilitar_impl_lua_completo(contrato_atual, origem_lua_declarada)"
266
267
  ],
267
268
  "saidasChave": [
268
269
  "reduzir_atrito_sintatico_em_contrato_rico(leitura_mais_limpa, ambiguidade_controlada, perfil)",
269
270
  "modelar_payload_com_mais_precisao(tipo_composto_explicito, cardinalidade_explicita, shape_rico)",
270
271
  "explicitar_variacao_e_compatibilidade(versao_explicita, fallback_claro, contrato_publico_distinto)",
271
- "separar_validacao_regra_e_poscondicao(validacao_de_input_clara, regra_de_negocio_clara, pos_condicao_clara)"
272
+ "habilitar_impl_lua_completo(impl_lua_validado, use_lua_validado, ir_lua_preservado, drift_lua_resolvido)"
272
273
  ],
273
274
  "superficiesPublicas": [
274
275
  "evento:scorecard_atualizado",
@@ -278,11 +279,11 @@
278
279
  "ambiguidade_controlada existe",
279
280
  "cardinalidade_explicita existe",
280
281
  "contrato_publico_distinto existe",
281
- "fallback_claro existe",
282
- "leitura_mais_limpa existe",
283
- "nota existe",
284
- "perfil em [ PUBLICO , INTERNO , EXPERIMENTAL , LEGADO , DEPRECADO ]",
285
- "pos_condicao_clara existe"
282
+ "detector_lua_resolvido existe",
283
+ "detector_php_resolvido existe",
284
+ "drift_lua_resolvido existe",
285
+ "drift_php_resolvido existe",
286
+ "fallback_claro existe"
286
287
  ],
287
288
  "efeitos": [],
288
289
  "erros": [],
@@ -290,23 +291,30 @@
290
291
  "PerfilCompatibilidade"
291
292
  ],
292
293
  "arquivosProvaveis": [
294
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\drift.ts",
295
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\importador.ts",
296
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\index.ts",
297
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\lua-symbols.ts",
298
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\php-symbols.ts",
293
299
  "C:\\GitHub\\Sema\\pacotes\\cli\\src\\projeto.ts",
294
- "C:\\GitHub\\Sema\\pacotes\\nucleo\\src\\formatador\\index.ts",
295
- "C:\\GitHub\\Sema\\pacotes\\nucleo\\src\\ir\\conversor.ts",
296
- "C:\\GitHub\\Sema\\pacotes\\nucleo\\src\\semantico\\analisador.ts"
300
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\tipos.ts",
301
+ "C:\\GitHub\\Sema\\pacotes\\nucleo\\src\\ast\\tipos.ts"
297
302
  ],
298
303
  "simbolosRelacionados": [
304
+ "analisarDriftLegado",
299
305
  "analisarSemantica",
300
306
  "converterParaIr",
301
307
  "formatarCodigo",
308
+ "importarProjetoLegado",
302
309
  "resolverAlvosVerificacao"
303
310
  ],
304
311
  "riscosPrincipais": [
305
312
  "consultar_scorecard_compatibilidade:medio",
306
313
  "explicitar_variacao_e_compatibilidade:medio",
314
+ "habilitar_impl_lua_completo:alto",
315
+ "habilitar_impl_php_completo:alto",
307
316
  "modelar_payload_com_mais_precisao:alto",
308
- "reduzir_atrito_sintatico_em_contrato_rico:medio",
309
- "separar_validacao_regra_e_poscondicao:medio"
317
+ "reduzir_atrito_sintatico_em_contrato_rico:medio"
310
318
  ],
311
319
  "lacunas": [
312
320
  "sem_impl",
@@ -316,9 +324,9 @@
316
324
  "consultar_scorecard_compatibilidade:pacotes/cli/src/projeto.ts",
317
325
  "evento:scorecard_atualizado:scorecard_compatibilidade",
318
326
  "explicitar_variacao_e_compatibilidade:pacotes/nucleo/src/ir/conversor.ts",
319
- "modelar_payload_com_mais_precisao:pacotes/nucleo/src/semantico/analisador.ts",
320
- "policy:compatibilidade_publica:compatibilidade_publica",
321
- "reduzir_atrito_sintatico_em_contrato_rico:pacotes/nucleo/src/formatador/index.ts"
327
+ "habilitar_impl_lua_completo:pacotes/cli/src/drift.ts",
328
+ "habilitar_impl_lua_completo:pacotes/cli/src/importador.ts",
329
+ "habilitar_impl_lua_completo:pacotes/cli/src/index.ts"
322
330
  ],
323
331
  "checksSugeridos": [
324
332
  "confirmar proibicoes operacionais",
@@ -334,19 +342,27 @@
334
342
  "sema verificar <arquivo-ou-pasta> --json"
335
343
  ],
336
344
  "consumerFramework": "nextjs-consumer",
337
- "appRoutes": [],
338
- "consumerSurfaces": [],
345
+ "appRoutes": [
346
+ "/ranking"
347
+ ],
348
+ "consumerSurfaces": [
349
+ "router:/ranking -> C:\\GitHub\\Sema\\pacotes\\cli\\src\\index.ts"
350
+ ],
339
351
  "consumerBridges": [],
340
352
  "ancoragensVinculo": [],
341
353
  "arquivosProvaveisEditar": [
354
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\drift.ts",
355
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\importador.ts",
356
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\index.ts",
357
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\lua-symbols.ts",
358
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\php-symbols.ts",
342
359
  "C:\\GitHub\\Sema\\pacotes\\cli\\src\\projeto.ts",
343
- "C:\\GitHub\\Sema\\pacotes\\nucleo\\src\\formatador\\index.ts",
344
- "C:\\GitHub\\Sema\\pacotes\\nucleo\\src\\ir\\conversor.ts",
345
- "C:\\GitHub\\Sema\\pacotes\\nucleo\\src\\semantico\\analisador.ts"
360
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\tipos.ts",
361
+ "C:\\GitHub\\Sema\\pacotes\\nucleo\\src\\ast\\tipos.ts"
346
362
  ]
347
363
  },
348
364
  {
349
- "geradoEm": "2026-05-02T20:39:52.980Z",
365
+ "geradoEm": "2026-05-09T02:38:09.917Z",
350
366
  "arquivo": "C:\\GitHub\\Sema\\contratos\\sema\\geradores_web.sema",
351
367
  "modulo": "sema.produto.geradores_web",
352
368
  "perfilCompatibilidade": "interno",
@@ -443,7 +459,7 @@
443
459
  ]
444
460
  },
445
461
  {
446
- "geradoEm": "2026-05-02T20:39:52.980Z",
462
+ "geradoEm": "2026-05-09T02:38:09.917Z",
447
463
  "arquivo": "C:\\GitHub\\Sema\\contratos\\sema\\governanca_ia.sema",
448
464
  "modulo": "sema.produto.governanca_ia",
449
465
  "perfilCompatibilidade": "publico",
@@ -496,6 +512,7 @@
496
512
  "C:\\GitHub\\Sema\\pacotes\\cli\\src\\docs.ts",
497
513
  "C:\\GitHub\\Sema\\pacotes\\cli\\src\\drift.ts",
498
514
  "C:\\GitHub\\Sema\\pacotes\\cli\\src\\index.ts",
515
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\lua-symbols.ts",
499
516
  "C:\\GitHub\\Sema\\pacotes\\cli\\src\\projeto.ts",
500
517
  "C:\\GitHub\\Sema\\pacotes\\editor-vscode\\extension.js",
501
518
  "C:\\GitHub\\Sema\\pacotes\\mcp\\src\\index.ts",
@@ -557,6 +574,7 @@
557
574
  "C:\\GitHub\\Sema\\pacotes\\cli\\src\\docs.ts",
558
575
  "C:\\GitHub\\Sema\\pacotes\\cli\\src\\drift.ts",
559
576
  "C:\\GitHub\\Sema\\pacotes\\cli\\src\\index.ts",
577
+ "C:\\GitHub\\Sema\\pacotes\\cli\\src\\lua-symbols.ts",
560
578
  "C:\\GitHub\\Sema\\pacotes\\cli\\src\\projeto.ts",
561
579
  "C:\\GitHub\\Sema\\pacotes\\editor-vscode\\extension.js",
562
580
  "C:\\GitHub\\Sema\\pacotes\\mcp\\src\\index.ts",
@@ -564,7 +582,7 @@
564
582
  ]
565
583
  },
566
584
  {
567
- "geradoEm": "2026-05-02T20:39:52.980Z",
585
+ "geradoEm": "2026-05-09T02:38:09.917Z",
568
586
  "arquivo": "C:\\GitHub\\Sema\\contratos\\sema\\linguagem_composta.sema",
569
587
  "modulo": "sema.produto.linguagem_composta",
570
588
  "perfilCompatibilidade": "interno",
@@ -670,7 +688,7 @@
670
688
  ]
671
689
  },
672
690
  {
673
- "geradoEm": "2026-05-02T20:39:52.980Z",
691
+ "geradoEm": "2026-05-09T02:38:09.917Z",
674
692
  "arquivo": "C:\\GitHub\\Sema\\contratos\\sema\\persistencia_vendor_first.sema",
675
693
  "modulo": "sema.produto.persistencia_vendor_first",
676
694
  "perfilCompatibilidade": "interno",
package/dist/drift.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { EngineBanco, NivelConfiancaSemantica, NivelRiscoSemantico, TipoRecursoPersistencia } from "@sema/nucleo";
2
2
  import type { ContextoProjetoCarregado } from "./projeto.js";
3
3
  interface SimboloResolvido {
4
- origem: "ts" | "py" | "dart" | "lua" | "cs" | "java" | "go" | "rust" | "cpp";
4
+ origem: "ts" | "py" | "dart" | "lua" | "php" | "cs" | "java" | "go" | "rust" | "cpp";
5
5
  caminho: string;
6
6
  arquivo: string;
7
7
  simbolo: string;
@@ -33,7 +33,7 @@ export interface DiagnosticoDrift {
33
33
  interface RegistroImplDrift {
34
34
  modulo: string;
35
35
  task: string;
36
- origem: "ts" | "py" | "dart" | "lua" | "cs" | "java" | "go" | "rust" | "cpp";
36
+ origem: "ts" | "py" | "dart" | "lua" | "php" | "cs" | "java" | "go" | "rust" | "cpp";
37
37
  caminho: string;
38
38
  arquivo?: string;
39
39
  simbolo?: string;
@@ -82,7 +82,7 @@ interface RegistroRepositorioPersistenciaDrift {
82
82
  arquivo: string;
83
83
  }
84
84
  interface SimboloCandidatoDrift {
85
- origem: "ts" | "py" | "dart" | "lua" | "cs" | "java" | "go" | "rust" | "cpp";
85
+ origem: "ts" | "py" | "dart" | "lua" | "php" | "cs" | "java" | "go" | "rust" | "cpp";
86
86
  caminho: string;
87
87
  arquivo: string;
88
88
  simbolo: string;
package/dist/drift.js CHANGED
@@ -7,6 +7,7 @@ import { extrairRotasDotnet, extrairSimbolosDotnet } from "./dotnet-http.js";
7
7
  import { extrairRotasGo, extrairSimbolosGo } from "./go-http.js";
8
8
  import { extrairRotasJava, extrairSimbolosJava } from "./java-http.js";
9
9
  import { extrairSimbolosLua } from "./lua-symbols.js";
10
+ import { extrairRotasPhp, extrairSimbolosPhp } from "./php-symbols.js";
10
11
  import { contarIndentacaoPython, extrairRotasFlaskDecoradas, normalizarCaminhoFlask } from "./python-http.js";
11
12
  import { extrairRotasRust, extrairSimbolosRust } from "./rust-http.js";
12
13
  import { extrairRotasTypeScriptHttp } from "./typescript-http.js";
@@ -1043,7 +1044,7 @@ async function listarArquivosRecursivos(diretorio, extensoes) {
1043
1044
  }
1044
1045
  const EXTENSOES_ARQUIVOS_CODIGO_DRIFT = [
1045
1046
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
1046
- ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
1047
+ ".py", ".dart", ".lua", ".php", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
1047
1048
  ".sql", ".psql", ".ddl", ".prisma", ".json",
1048
1049
  ];
1049
1050
  async function indexarArquivosCodigo(diretorios) {
@@ -1915,6 +1916,35 @@ async function indexarLua(diretorios) {
1915
1916
  recursos: [...recursos.values()],
1916
1917
  };
1917
1918
  }
1919
+ async function indexarPhp(diretorios) {
1920
+ const simbolos = new Map();
1921
+ const rotas = [];
1922
+ const recursos = new Map();
1923
+ for (const diretorio of diretorios) {
1924
+ const arquivos = (await listarArquivosRecursivos(diretorio, [".php"]))
1925
+ .filter((arquivo) => !/(^|[\\/])tests?([\\/]|$)|(?:^|[\\/])spec([\\/]|$)|(?:Test|Spec)\.php$/i.test(arquivo));
1926
+ for (const arquivo of arquivos) {
1927
+ const codigo = await readFile(arquivo, "utf8");
1928
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
1929
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
1930
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
1931
+ }
1932
+ for (const simbolo of extrairSimbolosPhp(codigo)) {
1933
+ registrarSimboloPhp(simbolos, basesSimbolicas, arquivo, simbolo.simbolo);
1934
+ }
1935
+ for (const rota of extrairRotasPhp(codigo)) {
1936
+ rotas.push({
1937
+ origem: "php",
1938
+ metodo: rota.metodo,
1939
+ caminho: rota.caminho,
1940
+ arquivo,
1941
+ simbolo: rota.simbolo,
1942
+ });
1943
+ }
1944
+ }
1945
+ }
1946
+ return { simbolos: [...simbolos.values()], rotas, recursos: [...recursos.values()] };
1947
+ }
1918
1948
  function registrarSimboloGenerico(simbolos, origem, basesSimbolicas, arquivo, simbolo) {
1919
1949
  for (const baseSimbolica of basesSimbolicas) {
1920
1950
  const caminho = `${baseSimbolica}.${simbolo}`;
@@ -1938,6 +1968,30 @@ function registrarSimboloGenerico(simbolos, origem, basesSimbolicas, arquivo, si
1938
1968
  }
1939
1969
  }
1940
1970
  }
1971
+ function registrarSimboloPhp(simbolos, basesSimbolicas, arquivo, simbolo) {
1972
+ registrarSimboloGenerico(simbolos, "php", basesSimbolicas, arquivo, simbolo);
1973
+ const partes = simbolo.split(".").filter(Boolean);
1974
+ const aliases = new Set([simbolo]);
1975
+ const ultimo = partes.at(-1);
1976
+ const penultimo = partes.at(-2);
1977
+ if (ultimo) {
1978
+ aliases.add(ultimo);
1979
+ }
1980
+ if (penultimo && ultimo) {
1981
+ aliases.add(`${penultimo}.${ultimo}`);
1982
+ }
1983
+ for (const alias of aliases) {
1984
+ if (!alias || simbolos.has(alias)) {
1985
+ continue;
1986
+ }
1987
+ simbolos.set(alias, {
1988
+ origem: "php",
1989
+ caminho: alias,
1990
+ arquivo,
1991
+ simbolo,
1992
+ });
1993
+ }
1994
+ }
1941
1995
  async function indexarDotnet(diretorios) {
1942
1996
  const simbolos = new Map();
1943
1997
  const rotas = [];
@@ -2080,7 +2134,7 @@ async function indexarPersistenciaDeclarativa(diretorios) {
2080
2134
  const arquivos = await listarArquivosRecursivos(diretorio, [
2081
2135
  ".sql", ".psql", ".ddl", ".prisma",
2082
2136
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
2083
- ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
2137
+ ".py", ".dart", ".lua", ".php", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
2084
2138
  ]);
2085
2139
  for (const arquivo of arquivos) {
2086
2140
  const codigo = await readFile(arquivo, "utf8");
@@ -2517,7 +2571,7 @@ function extrairFontesHttpTypeScript(fontesLegado) {
2517
2571
  return fontesLegado.filter((fonte) => fonte === "nestjs" || fonte === "nextjs" || fonte === "firebase");
2518
2572
  }
2519
2573
  function extrairFontesHttpBackend(fontesLegado) {
2520
- return fontesLegado.filter((fonte) => fonte === "dotnet" || fonte === "java" || fonte === "go" || fonte === "rust");
2574
+ return fontesLegado.filter((fonte) => fonte === "php" || fonte === "dotnet" || fonte === "java" || fonte === "go" || fonte === "rust");
2521
2575
  }
2522
2576
  function ultimoSegmentoSimbolico(caminho) {
2523
2577
  const partes = caminho.split(".").filter(Boolean);
@@ -2663,6 +2717,10 @@ function escolherRotasEsperadas(task, fontesLegado) {
2663
2717
  }
2664
2718
  return ["fastapi", "flask"];
2665
2719
  }
2720
+ const implPhp = task.implementacoesExternas.find((impl) => impl.origem === "php");
2721
+ if (implPhp) {
2722
+ return fontesBackend.includes("php") ? ["php"] : ["php"];
2723
+ }
2666
2724
  const implCs = task.implementacoesExternas.find((impl) => impl.origem === "cs");
2667
2725
  if (implCs) {
2668
2726
  return fontesBackend.includes("dotnet") ? ["dotnet"] : ["dotnet"];
@@ -2872,6 +2930,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
2872
2930
  const indexPy = await indexarPython(diretoriosCodigoAtivos);
2873
2931
  const indexDart = await indexarDart(diretoriosCodigoAtivos);
2874
2932
  const indexLua = await indexarLua(diretoriosCodigoAtivos);
2933
+ const indexPhp = await indexarPhp(diretoriosCodigoAtivos);
2875
2934
  const indexDotnet = await indexarDotnet(diretoriosCodigoAtivos);
2876
2935
  const indexJava = await indexarJava(diretoriosCodigoAtivos);
2877
2936
  const indexGo = await indexarGo(diretoriosCodigoAtivos);
@@ -2884,6 +2943,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
2884
2943
  ...indexPy.simbolos,
2885
2944
  ...indexDart.simbolos,
2886
2945
  ...indexLua.simbolos,
2946
+ ...indexPhp.simbolos,
2887
2947
  ...indexDotnet.simbolos,
2888
2948
  ...indexJava.simbolos,
2889
2949
  ...indexGo.simbolos,
@@ -2895,6 +2955,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
2895
2955
  ...indexPy.simbolos.map((item) => [item.caminho, item]),
2896
2956
  ...indexDart.simbolos.map((item) => [item.caminho, item]),
2897
2957
  ...indexLua.simbolos.map((item) => [item.caminho, item]),
2958
+ ...indexPhp.simbolos.map((item) => [item.caminho, item]),
2898
2959
  ...indexDotnet.simbolos.map((item) => [item.caminho, item]),
2899
2960
  ...indexJava.simbolos.map((item) => [item.caminho, item]),
2900
2961
  ...indexGo.simbolos.map((item) => [item.caminho, item]),
@@ -2906,6 +2967,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
2906
2967
  ...indexPy.recursos,
2907
2968
  ...indexDart.recursos,
2908
2969
  ...indexLua.recursos,
2970
+ ...indexPhp.recursos,
2909
2971
  ...indexDotnet.recursos,
2910
2972
  ...indexJava.recursos,
2911
2973
  ...indexGo.recursos,
@@ -2918,6 +2980,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
2918
2980
  ...indexTs.rotas,
2919
2981
  ...indexPy.rotas,
2920
2982
  ...indexDart.rotas,
2983
+ ...indexPhp.rotas,
2921
2984
  ...indexDotnet.rotas,
2922
2985
  ...indexJava.rotas,
2923
2986
  ...indexGo.rotas,
@@ -3551,7 +3614,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
3551
3614
  const EXTENSOES_BUSCA_IMPACTO = [
3552
3615
  ".sema",
3553
3616
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
3554
- ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
3617
+ ".py", ".dart", ".lua", ".php", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
3555
3618
  ".sql", ".psql", ".ddl", ".prisma", ".json",
3556
3619
  ];
3557
3620
  function construirVariantesSemanticas(valor) {