@semacode/cli 1.5.9 → 1.5.11

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 (48) hide show
  1. package/README.md +4 -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 +111 -5
  8. package/dist/drift.js.map +1 -1
  9. package/dist/importador.d.ts +1 -1
  10. package/dist/importador.js +200 -1
  11. package/dist/importador.js.map +1 -1
  12. package/dist/index.js +13 -5
  13. package/dist/index.js.map +1 -1
  14. package/dist/lua-symbols.d.ts +6 -4
  15. package/dist/lua-symbols.js +74 -54
  16. package/dist/lua-symbols.js.map +1 -1
  17. package/dist/php-symbols.d.ts +24 -0
  18. package/dist/php-symbols.js +375 -0
  19. package/dist/php-symbols.js.map +1 -0
  20. package/dist/projeto.js +20 -0
  21. package/dist/projeto.js.map +1 -1
  22. package/dist/tipos.d.ts +1 -1
  23. package/docs/AGENT_STARTER.md +3 -3
  24. package/docs/cli.md +5 -1
  25. package/docs/env.md +3 -3
  26. package/docs/fluxo-pratico-ia-sema.md +1 -1
  27. package/docs/integracao-com-ia.md +2 -0
  28. package/docs/mcp.md +2 -0
  29. package/docs/sintaxe.md +65 -0
  30. package/node_modules/@sema/gerador-css/package.json +1 -1
  31. package/node_modules/@sema/gerador-dart/package.json +1 -1
  32. package/node_modules/@sema/gerador-html/package.json +1 -1
  33. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  34. package/node_modules/@sema/gerador-lua/package.json +1 -1
  35. package/node_modules/@sema/gerador-python/package.json +1 -1
  36. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  37. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +1 -1
  38. package/node_modules/@sema/nucleo/dist/ir/conversor.js +8 -0
  39. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  40. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -3
  41. package/node_modules/@sema/nucleo/dist/parser/parser.js +4 -0
  42. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  43. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +2 -2
  44. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +5 -1
  45. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  46. package/node_modules/@sema/nucleo/package.json +1 -1
  47. package/node_modules/@sema/padroes/package.json +1 -1
  48. package/package.json +10 -10
package/README.md CHANGED
@@ -4,6 +4,9 @@
4
4
 
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
+ 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
+
7
10
  Tambem resolve documentacao obrigatoria por intencao para impedir IA de agir sem ler ou criar docs relacionadas.
8
11
 
9
12
  ## Instalar
@@ -61,7 +64,7 @@ sema drift ./contratos-importados --json
61
64
 
62
65
  ## Persistencia vendor-first
63
66
 
64
- 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.
67
+ 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.
65
68
 
66
69
  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.
67
70
 
@@ -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.9",
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" | "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" | "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" | "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
@@ -6,6 +6,8 @@ import { extrairSimbolosCpp } from "./cpp-symbols.js";
6
6
  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
+ import { extrairSimbolosLua } from "./lua-symbols.js";
10
+ import { extrairRotasPhp, extrairSimbolosPhp } from "./php-symbols.js";
9
11
  import { contarIndentacaoPython, extrairRotasFlaskDecoradas, normalizarCaminhoFlask } from "./python-http.js";
10
12
  import { extrairRotasRust, extrairSimbolosRust } from "./rust-http.js";
11
13
  import { extrairRotasTypeScriptHttp } from "./typescript-http.js";
@@ -689,7 +691,7 @@ function extrairRecursosArquivoLocal(arquivo, codigo) {
689
691
  const nomeBase = path.basename(literal, path.extname(literal));
690
692
  registrarRecursoDrift(recursos, "arquivo", "arquivo_local", nomeBase, arquivo);
691
693
  }
692
- const nomeArquivo = path.basename(arquivo).replace(/\.(?:ts|tsx|js|jsx|mjs|cjs|py|dart|cs|java|go|rs|cpp|cc|cxx|hpp|h)$/i, "");
694
+ const nomeArquivo = path.basename(arquivo).replace(/\.(?:ts|tsx|js|jsx|mjs|cjs|py|dart|lua|cs|java|go|rs|cpp|cc|cxx|hpp|h)$/i, "");
693
695
  const nomeStore = nomeArquivo
694
696
  .replace(/(?:[_.-]?(?:repository|repositories|repo|store|storage|persistencia|persistence))$/i, "")
695
697
  .trim();
@@ -1040,6 +1042,20 @@ async function listarArquivosRecursivos(diretorio, extensoes) {
1040
1042
  }
1041
1043
  return encontrados.sort((a, b) => a.localeCompare(b, "pt-BR"));
1042
1044
  }
1045
+ const EXTENSOES_ARQUIVOS_CODIGO_DRIFT = [
1046
+ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
1047
+ ".py", ".dart", ".lua", ".php", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
1048
+ ".sql", ".psql", ".ddl", ".prisma", ".json",
1049
+ ];
1050
+ async function indexarArquivosCodigo(diretorios) {
1051
+ const arquivos = new Set();
1052
+ for (const diretorio of diretorios) {
1053
+ for (const arquivo of await listarArquivosRecursivos(diretorio, EXTENSOES_ARQUIVOS_CODIGO_DRIFT)) {
1054
+ arquivos.add(arquivo);
1055
+ }
1056
+ }
1057
+ return [...arquivos].sort((a, b) => a.localeCompare(b, "pt-BR"));
1058
+ }
1043
1059
  function caminhosSimbolicos(baseDiretorio, arquivo) {
1044
1060
  const relativo = path.relative(baseDiretorio, arquivo).replace(/\.[^.]+$/, "");
1045
1061
  const semPrefixo = relativo
@@ -1878,6 +1894,57 @@ async function indexarDart(diretorios) {
1878
1894
  || a.arquivo.localeCompare(b.arquivo, "pt-BR")),
1879
1895
  };
1880
1896
  }
1897
+ async function indexarLua(diretorios) {
1898
+ const simbolos = new Map();
1899
+ const recursos = new Map();
1900
+ for (const diretorio of diretorios) {
1901
+ const arquivos = (await listarArquivosRecursivos(diretorio, [".lua"]))
1902
+ .filter((arquivo) => !/(^|[\\/])tests?([\\/]|$)|(?:^|[\\/])spec([\\/]|$)|(?:_spec|_test)\.lua$/i.test(arquivo));
1903
+ for (const arquivo of arquivos) {
1904
+ const codigo = await readFile(arquivo, "utf8");
1905
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
1906
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
1907
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
1908
+ }
1909
+ for (const simbolo of extrairSimbolosLua(codigo)) {
1910
+ registrarSimboloGenerico(simbolos, "lua", basesSimbolicas, arquivo, simbolo.simbolo);
1911
+ }
1912
+ }
1913
+ }
1914
+ return {
1915
+ simbolos: [...simbolos.values()],
1916
+ recursos: [...recursos.values()],
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
+ }
1881
1948
  function registrarSimboloGenerico(simbolos, origem, basesSimbolicas, arquivo, simbolo) {
1882
1949
  for (const baseSimbolica of basesSimbolicas) {
1883
1950
  const caminho = `${baseSimbolica}.${simbolo}`;
@@ -1901,6 +1968,30 @@ function registrarSimboloGenerico(simbolos, origem, basesSimbolicas, arquivo, si
1901
1968
  }
1902
1969
  }
1903
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
+ }
1904
1995
  async function indexarDotnet(diretorios) {
1905
1996
  const simbolos = new Map();
1906
1997
  const rotas = [];
@@ -2043,7 +2134,7 @@ async function indexarPersistenciaDeclarativa(diretorios) {
2043
2134
  const arquivos = await listarArquivosRecursivos(diretorio, [
2044
2135
  ".sql", ".psql", ".ddl", ".prisma",
2045
2136
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
2046
- ".py", ".dart", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
2137
+ ".py", ".dart", ".lua", ".php", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
2047
2138
  ]);
2048
2139
  for (const arquivo of arquivos) {
2049
2140
  const codigo = await readFile(arquivo, "utf8");
@@ -2247,7 +2338,7 @@ async function indexarPersistenciaDetalhada(diretorios) {
2247
2338
  for (const diretorio of diretorios) {
2248
2339
  const arquivos = await listarArquivosRecursivos(diretorio, [
2249
2340
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
2250
- ".py", ".dart", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
2341
+ ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
2251
2342
  ".sql", ".psql", ".ddl", ".prisma",
2252
2343
  ]);
2253
2344
  for (const arquivo of arquivos) {
@@ -2480,7 +2571,7 @@ function extrairFontesHttpTypeScript(fontesLegado) {
2480
2571
  return fontesLegado.filter((fonte) => fonte === "nestjs" || fonte === "nextjs" || fonte === "firebase");
2481
2572
  }
2482
2573
  function extrairFontesHttpBackend(fontesLegado) {
2483
- 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");
2484
2575
  }
2485
2576
  function ultimoSegmentoSimbolico(caminho) {
2486
2577
  const partes = caminho.split(".").filter(Boolean);
@@ -2626,6 +2717,10 @@ function escolherRotasEsperadas(task, fontesLegado) {
2626
2717
  }
2627
2718
  return ["fastapi", "flask"];
2628
2719
  }
2720
+ const implPhp = task.implementacoesExternas.find((impl) => impl.origem === "php");
2721
+ if (implPhp) {
2722
+ return fontesBackend.includes("php") ? ["php"] : ["php"];
2723
+ }
2629
2724
  const implCs = task.implementacoesExternas.find((impl) => impl.origem === "cs");
2630
2725
  if (implCs) {
2631
2726
  return fontesBackend.includes("dotnet") ? ["dotnet"] : ["dotnet"];
@@ -2830,9 +2925,12 @@ export async function analisarDriftLegado(contexto, opcoes) {
2830
2925
  diretoriosIgnoradosAtivos = resolverDiretoriosIgnoradosAtivos(opcoesResolvidas);
2831
2926
  try {
2832
2927
  const diretoriosCodigoAtivos = resolverDiretoriosCodigoEscopoReal(contexto, configuracaoEscopo);
2928
+ const arquivosCodigo = await indexarArquivosCodigo(diretoriosCodigoAtivos);
2833
2929
  const indexTs = await indexarTypeScript(diretoriosCodigoAtivos);
2834
2930
  const indexPy = await indexarPython(diretoriosCodigoAtivos);
2835
2931
  const indexDart = await indexarDart(diretoriosCodigoAtivos);
2932
+ const indexLua = await indexarLua(diretoriosCodigoAtivos);
2933
+ const indexPhp = await indexarPhp(diretoriosCodigoAtivos);
2836
2934
  const indexDotnet = await indexarDotnet(diretoriosCodigoAtivos);
2837
2935
  const indexJava = await indexarJava(diretoriosCodigoAtivos);
2838
2936
  const indexGo = await indexarGo(diretoriosCodigoAtivos);
@@ -2844,6 +2942,8 @@ export async function analisarDriftLegado(contexto, opcoes) {
2844
2942
  ...indexTs.simbolos,
2845
2943
  ...indexPy.simbolos,
2846
2944
  ...indexDart.simbolos,
2945
+ ...indexLua.simbolos,
2946
+ ...indexPhp.simbolos,
2847
2947
  ...indexDotnet.simbolos,
2848
2948
  ...indexJava.simbolos,
2849
2949
  ...indexGo.simbolos,
@@ -2854,6 +2954,8 @@ export async function analisarDriftLegado(contexto, opcoes) {
2854
2954
  ...indexTs.simbolos.map((item) => [item.caminho, item]),
2855
2955
  ...indexPy.simbolos.map((item) => [item.caminho, item]),
2856
2956
  ...indexDart.simbolos.map((item) => [item.caminho, item]),
2957
+ ...indexLua.simbolos.map((item) => [item.caminho, item]),
2958
+ ...indexPhp.simbolos.map((item) => [item.caminho, item]),
2857
2959
  ...indexDotnet.simbolos.map((item) => [item.caminho, item]),
2858
2960
  ...indexJava.simbolos.map((item) => [item.caminho, item]),
2859
2961
  ...indexGo.simbolos.map((item) => [item.caminho, item]),
@@ -2864,6 +2966,8 @@ export async function analisarDriftLegado(contexto, opcoes) {
2864
2966
  ...indexTs.recursos,
2865
2967
  ...indexPy.recursos,
2866
2968
  ...indexDart.recursos,
2969
+ ...indexLua.recursos,
2970
+ ...indexPhp.recursos,
2867
2971
  ...indexDotnet.recursos,
2868
2972
  ...indexJava.recursos,
2869
2973
  ...indexGo.recursos,
@@ -2876,12 +2980,14 @@ export async function analisarDriftLegado(contexto, opcoes) {
2876
2980
  ...indexTs.rotas,
2877
2981
  ...indexPy.rotas,
2878
2982
  ...indexDart.rotas,
2983
+ ...indexPhp.rotas,
2879
2984
  ...indexDotnet.rotas,
2880
2985
  ...indexJava.rotas,
2881
2986
  ...indexGo.rotas,
2882
2987
  ...indexRust.rotas,
2883
2988
  ];
2884
2989
  const todosArquivosConhecidos = [...new Set([
2990
+ ...arquivosCodigo,
2885
2991
  ...todosSimbolos.map((item) => item.arquivo),
2886
2992
  ...todasRotasIndexadas.map((item) => item.arquivo),
2887
2993
  ...todosRecursos.map((item) => item.arquivo),
@@ -3508,7 +3614,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
3508
3614
  const EXTENSOES_BUSCA_IMPACTO = [
3509
3615
  ".sema",
3510
3616
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
3511
- ".py", ".dart", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
3617
+ ".py", ".dart", ".lua", ".php", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
3512
3618
  ".sql", ".psql", ".ddl", ".prisma", ".json",
3513
3619
  ];
3514
3620
  function construirVariantesSemanticas(valor) {