@semacode/cli 1.5.47 → 1.5.52

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 (320) hide show
  1. package/LICENSE +39 -21
  2. package/README.md +47 -48
  3. package/dist/agentContext.d.ts +2 -2
  4. package/dist/agentContext.js +1 -1
  5. package/dist/agentContextPack.d.ts +1 -1
  6. package/dist/agentContextPack.js +70 -48
  7. package/dist/agentContextTipos.d.ts +2 -2
  8. package/dist/agentContextTipos.js +7 -13
  9. package/dist/agentEntryPoints.js +311 -271
  10. package/dist/billing/index.d.ts +1 -58
  11. package/dist/billing/index.js +17 -278
  12. package/dist/cliArgs.js +0 -3
  13. package/dist/comandos.js +15 -131
  14. package/dist/contexto.d.ts +0 -9
  15. package/dist/contexto.js +59 -109
  16. package/dist/docs.part01.js +30 -51
  17. package/dist/drift.part01.d.ts +1 -1
  18. package/dist/drift.part04.d.ts +1 -1
  19. package/dist/drift.part04.js +2 -2
  20. package/dist/drift.part05.d.ts +3 -3
  21. package/dist/drift.part05.js +8 -8
  22. package/dist/drift.part06.js +15 -8
  23. package/dist/drift.part09.js +11 -7
  24. package/dist/drift.part14.js +18 -3
  25. package/dist/driftOrcamento.d.ts +11 -1
  26. package/dist/driftOrcamento.js +49 -20
  27. package/dist/index.d.ts +0 -6
  28. package/dist/index.js +0 -6
  29. package/dist/index.part01.d.ts +1 -1
  30. package/dist/index.part01.js +1 -3
  31. package/dist/index.part02.js +4 -2
  32. package/dist/index.part04.js +7 -7
  33. package/dist/index.part08.js +1 -22
  34. package/dist/initTemplatesBase.js +5 -5
  35. package/dist/profileArtefatoValidadores.js +42 -0
  36. package/dist/profileI18nCatalogo.js +2 -0
  37. package/dist/projetoConfig.js +7 -0
  38. package/dist/projetoLegado.js +10 -3
  39. package/dist/sync/index.js +1 -1
  40. package/dist/tipos.d.ts +1 -1
  41. package/docs/README.md +19 -0
  42. package/docs/ai-integration.md +90 -0
  43. package/docs/ai-onboarding.md +33 -0
  44. package/docs/ai-workflow.md +62 -0
  45. package/docs/auth.md +16 -0
  46. package/docs/cli.md +36 -95
  47. package/docs/commands.md +90 -0
  48. package/docs/database.md +15 -0
  49. package/docs/deploy.md +6 -38
  50. package/docs/documentation.md +39 -0
  51. package/docs/env.md +8 -109
  52. package/docs/frontend.md +41 -0
  53. package/docs/getting-started.md +33 -0
  54. package/docs/i18n.md +15 -0
  55. package/docs/profiles.md +43 -0
  56. package/docs/repositories.md +19 -61
  57. package/docs/rollback.md +9 -20
  58. package/docs/security.md +24 -0
  59. package/docs/support.md +8 -0
  60. package/docs/syntax.md +128 -0
  61. package/docs/testing.md +17 -0
  62. package/docs/vocabulary.md +28 -0
  63. package/node_modules/@sema/gerador-css/dist/index.part01.js +1 -0
  64. package/node_modules/@sema/gerador-css/dist/index.part01.js.map +1 -1
  65. package/node_modules/@sema/gerador-css/package.json +1 -1
  66. package/node_modules/@sema/gerador-dart/dist/index.js +1 -0
  67. package/node_modules/@sema/gerador-dart/dist/index.js.map +1 -1
  68. package/node_modules/@sema/gerador-dart/package.json +1 -1
  69. package/node_modules/@sema/gerador-html/dist/index.js +1 -0
  70. package/node_modules/@sema/gerador-html/dist/index.js.map +1 -1
  71. package/node_modules/@sema/gerador-html/package.json +1 -1
  72. package/node_modules/@sema/gerador-javascript/dist/index.js +1 -0
  73. package/node_modules/@sema/gerador-javascript/dist/index.js.map +1 -1
  74. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  75. package/node_modules/@sema/gerador-lua/dist/index.js +11 -0
  76. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
  77. package/node_modules/@sema/gerador-lua/package.json +1 -1
  78. package/node_modules/@sema/gerador-python/dist/index.part02.js +1 -0
  79. package/node_modules/@sema/gerador-python/dist/index.part02.js.map +1 -1
  80. package/node_modules/@sema/gerador-python/package.json +1 -1
  81. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +1 -0
  82. package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +1 -1
  83. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  84. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +1 -1
  85. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +1 -1
  86. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +1 -1
  87. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js +4 -0
  88. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +1 -1
  89. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.d.ts +1 -1
  90. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -3
  91. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js +3 -0
  92. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +1 -1
  93. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.d.ts +2 -2
  94. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js +4 -1
  95. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +1 -1
  96. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.d.ts +2 -2
  97. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js +11 -5
  98. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +1 -1
  99. package/node_modules/@sema/nucleo/package.json +1 -1
  100. package/node_modules/@sema/padroes/package.json +1 -1
  101. package/package.json +15 -22
  102. package/AGENTS.md +0 -324
  103. package/AGENT_CONTEXT_PACK.json +0 -470
  104. package/SEMA_BRIEF.curto.txt +0 -18
  105. package/SEMA_BRIEF.md +0 -705
  106. package/SEMA_BRIEF.micro.txt +0 -16
  107. package/SEMA_INDEX.json +0 -10759
  108. package/dist/agentContext.js.map +0 -1
  109. package/dist/agentContextPack.js.map +0 -1
  110. package/dist/agentContextTipos.js.map +0 -1
  111. package/dist/agentEntryPoints.js.map +0 -1
  112. package/dist/angular-consumer-standalone.js.map +0 -1
  113. package/dist/authorAnalise.js.map +0 -1
  114. package/dist/authorPoliticas.js.map +0 -1
  115. package/dist/billing/index.js.map +0 -1
  116. package/dist/bridge.d.ts +0 -52
  117. package/dist/bridge.js +0 -333
  118. package/dist/bridge.js.map +0 -1
  119. package/dist/carregarModulos.js.map +0 -1
  120. package/dist/cliArgs.js.map +0 -1
  121. package/dist/comandos.js.map +0 -1
  122. package/dist/contexto.js.map +0 -1
  123. package/dist/controleComercialSupabase.d.ts +0 -7
  124. package/dist/controleComercialSupabase.js +0 -6
  125. package/dist/controleComercialSupabase.js.map +0 -1
  126. package/dist/controleComercialSupabaseAdmin.d.ts +0 -7
  127. package/dist/controleComercialSupabaseAdmin.js +0 -138
  128. package/dist/controleComercialSupabaseAdmin.js.map +0 -1
  129. package/dist/controleComercialSupabaseCadastro.d.ts +0 -4
  130. package/dist/controleComercialSupabaseCadastro.js +0 -85
  131. package/dist/controleComercialSupabaseCadastro.js.map +0 -1
  132. package/dist/controleComercialSupabaseConstantes.d.ts +0 -28
  133. package/dist/controleComercialSupabaseConstantes.js +0 -44
  134. package/dist/controleComercialSupabaseConstantes.js.map +0 -1
  135. package/dist/controleComercialSupabaseConsumo.d.ts +0 -2
  136. package/dist/controleComercialSupabaseConsumo.js +0 -77
  137. package/dist/controleComercialSupabaseConsumo.js.map +0 -1
  138. package/dist/controleComercialSupabaseConta.d.ts +0 -11
  139. package/dist/controleComercialSupabaseConta.js +0 -157
  140. package/dist/controleComercialSupabaseConta.js.map +0 -1
  141. package/dist/controleComercialSupabaseProfiles.d.ts +0 -4
  142. package/dist/controleComercialSupabaseProfiles.js +0 -55
  143. package/dist/controleComercialSupabaseProfiles.js.map +0 -1
  144. package/dist/controleComercialSupabaseTipos.d.ts +0 -3
  145. package/dist/controleComercialSupabaseTipos.js +0 -2
  146. package/dist/controleComercialSupabaseTipos.js.map +0 -1
  147. package/dist/controleComercialSupabaseTiposAdmin.d.ts +0 -152
  148. package/dist/controleComercialSupabaseTiposAdmin.js +0 -2
  149. package/dist/controleComercialSupabaseTiposAdmin.js.map +0 -1
  150. package/dist/controleComercialSupabaseTiposBase.d.ts +0 -169
  151. package/dist/controleComercialSupabaseTiposBase.js +0 -2
  152. package/dist/controleComercialSupabaseTiposBase.js.map +0 -1
  153. package/dist/controleComercialSupabaseTiposConta.d.ts +0 -220
  154. package/dist/controleComercialSupabaseTiposConta.js +0 -2
  155. package/dist/controleComercialSupabaseTiposConta.js.map +0 -1
  156. package/dist/cpp-symbols.js.map +0 -1
  157. package/dist/dev/index.js.map +0 -1
  158. package/dist/dev/watcher.js.map +0 -1
  159. package/dist/docs/resolver.js.map +0 -1
  160. package/dist/docs.js.map +0 -1
  161. package/dist/docs.part01.js.map +0 -1
  162. package/dist/docs.part02.js.map +0 -1
  163. package/dist/doctorCommand.js.map +0 -1
  164. package/dist/dotnet-http.js.map +0 -1
  165. package/dist/drift.contrato.js.map +0 -1
  166. package/dist/drift.js.map +0 -1
  167. package/dist/drift.part01.js.map +0 -1
  168. package/dist/drift.part02.js.map +0 -1
  169. package/dist/drift.part03.js.map +0 -1
  170. package/dist/drift.part04.js.map +0 -1
  171. package/dist/drift.part05.js.map +0 -1
  172. package/dist/drift.part06.js.map +0 -1
  173. package/dist/drift.part07.js.map +0 -1
  174. package/dist/drift.part08.js.map +0 -1
  175. package/dist/drift.part09.js.map +0 -1
  176. package/dist/drift.part10.js.map +0 -1
  177. package/dist/drift.part11.js.map +0 -1
  178. package/dist/drift.part12.js.map +0 -1
  179. package/dist/drift.part13.js.map +0 -1
  180. package/dist/drift.part14.js.map +0 -1
  181. package/dist/driftOrcamento.js.map +0 -1
  182. package/dist/driftScore.js.map +0 -1
  183. package/dist/execucoesExternas.js.map +0 -1
  184. package/dist/exemplosOficiais.js.map +0 -1
  185. package/dist/fsGovernado.js.map +0 -1
  186. package/dist/geracaoCore.js.map +0 -1
  187. package/dist/go-http.js.map +0 -1
  188. package/dist/guard.js.map +0 -1
  189. package/dist/iaPrompts.js.map +0 -1
  190. package/dist/importador.js.map +0 -1
  191. package/dist/importador.part01.js.map +0 -1
  192. package/dist/importador.part02.js.map +0 -1
  193. package/dist/importador.part03.js.map +0 -1
  194. package/dist/importador.part04.js.map +0 -1
  195. package/dist/importador.part05.js.map +0 -1
  196. package/dist/importador.part06.js.map +0 -1
  197. package/dist/importador.part07.js.map +0 -1
  198. package/dist/importador.part08.js.map +0 -1
  199. package/dist/importador.part09.js.map +0 -1
  200. package/dist/index.js.map +0 -1
  201. package/dist/index.part01.js.map +0 -1
  202. package/dist/index.part02.js.map +0 -1
  203. package/dist/index.part03.js.map +0 -1
  204. package/dist/index.part04.js.map +0 -1
  205. package/dist/index.part05.js.map +0 -1
  206. package/dist/index.part06.js.map +0 -1
  207. package/dist/index.part07.js.map +0 -1
  208. package/dist/index.part08.js.map +0 -1
  209. package/dist/init/index.js.map +0 -1
  210. package/dist/init/templates.js.map +0 -1
  211. package/dist/init/templates.part01.js.map +0 -1
  212. package/dist/init/templates.part02.js.map +0 -1
  213. package/dist/initCommand.js.map +0 -1
  214. package/dist/initTemplatesBackend.js.map +0 -1
  215. package/dist/initTemplatesBase.js.map +0 -1
  216. package/dist/initTemplatesFlutter.js.map +0 -1
  217. package/dist/initTemplatesRuntime.js.map +0 -1
  218. package/dist/initTemplatesWeb.js.map +0 -1
  219. package/dist/java-http.js.map +0 -1
  220. package/dist/lua-symbols.js.map +0 -1
  221. package/dist/mcpInstalarChaveCommand.d.ts +0 -1
  222. package/dist/mcpInstalarChaveCommand.js +0 -168
  223. package/dist/mcpInstalarChaveCommand.js.map +0 -1
  224. package/dist/mcpRemoto.d.ts +0 -32
  225. package/dist/mcpRemoto.js +0 -61
  226. package/dist/mcpRemoto.js.map +0 -1
  227. package/dist/mcp_chave.d.ts +0 -1
  228. package/dist/mcp_chave.js +0 -4
  229. package/dist/mcp_chave.js.map +0 -1
  230. package/dist/profileArtefatoBase.js.map +0 -1
  231. package/dist/profileArtefatoValidadores.js.map +0 -1
  232. package/dist/profileAuthorCommand.js.map +0 -1
  233. package/dist/profileAuthorTipos.js.map +0 -1
  234. package/dist/profileCatalogo.js.map +0 -1
  235. package/dist/profileCommand.js.map +0 -1
  236. package/dist/profileI18nCatalogo.js.map +0 -1
  237. package/dist/profileI18nVisivel.js.map +0 -1
  238. package/dist/profileOrquestracao.js.map +0 -1
  239. package/dist/profileRegras.js.map +0 -1
  240. package/dist/profileRulePacks.js.map +0 -1
  241. package/dist/profiles/validate.js.map +0 -1
  242. package/dist/projeto.js.map +0 -1
  243. package/dist/projetoBusca.js.map +0 -1
  244. package/dist/projetoCarregar.js.map +0 -1
  245. package/dist/projetoConfig.js.map +0 -1
  246. package/dist/projetoLegado.js.map +0 -1
  247. package/dist/projetoOrigens.js.map +0 -1
  248. package/dist/projetoResolucao.js.map +0 -1
  249. package/dist/projetoTipos.js.map +0 -1
  250. package/dist/python-http.js.map +0 -1
  251. package/dist/runnerValidacaoRemota.d.ts +0 -9
  252. package/dist/runnerValidacaoRemota.js +0 -9
  253. package/dist/runnerValidacaoRemota.js.map +0 -1
  254. package/dist/runnerValidacaoRemotaBateria.d.ts +0 -10
  255. package/dist/runnerValidacaoRemotaBateria.js +0 -117
  256. package/dist/runnerValidacaoRemotaBateria.js.map +0 -1
  257. package/dist/runnerValidacaoRemotaCli.d.ts +0 -4
  258. package/dist/runnerValidacaoRemotaCli.js +0 -86
  259. package/dist/runnerValidacaoRemotaCli.js.map +0 -1
  260. package/dist/runnerValidacaoRemotaComandos.d.ts +0 -7
  261. package/dist/runnerValidacaoRemotaComandos.js +0 -123
  262. package/dist/runnerValidacaoRemotaComandos.js.map +0 -1
  263. package/dist/runnerValidacaoRemotaEscopo.d.ts +0 -4
  264. package/dist/runnerValidacaoRemotaEscopo.js +0 -79
  265. package/dist/runnerValidacaoRemotaEscopo.js.map +0 -1
  266. package/dist/runnerValidacaoRemotaExecucao.d.ts +0 -2
  267. package/dist/runnerValidacaoRemotaExecucao.js +0 -104
  268. package/dist/runnerValidacaoRemotaExecucao.js.map +0 -1
  269. package/dist/runnerValidacaoRemotaRelatorio.d.ts +0 -3
  270. package/dist/runnerValidacaoRemotaRelatorio.js +0 -95
  271. package/dist/runnerValidacaoRemotaRelatorio.js.map +0 -1
  272. package/dist/runnerValidacaoRemotaServidor.d.ts +0 -4
  273. package/dist/runnerValidacaoRemotaServidor.js +0 -185
  274. package/dist/runnerValidacaoRemotaServidor.js.map +0 -1
  275. package/dist/runnerValidacaoRemotaSnapshot.d.ts +0 -10
  276. package/dist/runnerValidacaoRemotaSnapshot.js +0 -219
  277. package/dist/runnerValidacaoRemotaSnapshot.js.map +0 -1
  278. package/dist/runnerValidacaoRemotaTipos.d.ts +0 -158
  279. package/dist/runnerValidacaoRemotaTipos.js +0 -35
  280. package/dist/runnerValidacaoRemotaTipos.js.map +0 -1
  281. package/dist/runnerValidacaoRemotaUtil.d.ts +0 -3
  282. package/dist/runnerValidacaoRemotaUtil.js +0 -18
  283. package/dist/runnerValidacaoRemotaUtil.js.map +0 -1
  284. package/dist/runnerValidacaoRemotaWorkspace.d.ts +0 -2
  285. package/dist/runnerValidacaoRemotaWorkspace.js +0 -112
  286. package/dist/runnerValidacaoRemotaWorkspace.js.map +0 -1
  287. package/dist/rust-http.js.map +0 -1
  288. package/dist/semaChatCommand.d.ts +0 -1
  289. package/dist/semaChatCommand.js +0 -43
  290. package/dist/semaChatCommand.js.map +0 -1
  291. package/dist/semaChatRuntime.d.ts +0 -23
  292. package/dist/semaChatRuntime.js +0 -202
  293. package/dist/semaChatRuntime.js.map +0 -1
  294. package/dist/sync/index.js.map +0 -1
  295. package/dist/textoListas.js.map +0 -1
  296. package/dist/tipos.js.map +0 -1
  297. package/dist/typescript-http-body.js.map +0 -1
  298. package/dist/typescript-http-expressoes.js.map +0 -1
  299. package/dist/typescript-http-modelos.js.map +0 -1
  300. package/dist/typescript-http-rotas.js.map +0 -1
  301. package/dist/typescript-http-semantica.js.map +0 -1
  302. package/dist/typescript-http.js.map +0 -1
  303. package/docs/AGENT_STARTER.md +0 -111
  304. package/docs/agentes-por-capacidade.md +0 -126
  305. package/docs/api.md +0 -82
  306. package/docs/comandos.md +0 -702
  307. package/docs/como-ensinar-a-sema-para-ia.md +0 -30
  308. package/docs/documentacao.md +0 -74
  309. package/docs/extensao-vscode.md +0 -49
  310. package/docs/fluxo-pratico-ia-sema.md +0 -215
  311. package/docs/instalacao-e-primeiro-uso.md +0 -60
  312. package/docs/integracao-com-ia.md +0 -44
  313. package/docs/mcp.md +0 -69
  314. package/docs/pagamento-ponta-a-ponta.md +0 -171
  315. package/docs/persistencia-vendor-first.md +0 -151
  316. package/docs/prompt-base-ia-sema.md +0 -111
  317. package/docs/seguranca.md +0 -126
  318. package/docs/sintaxe.md +0 -218
  319. package/llms-full.txt +0 -40
  320. package/llms.txt +0 -23
@@ -96,7 +96,11 @@ export function ultimoSegmentoSimbolico(caminho) {
96
96
  return paraIdentificadorModulo(partes[partes.length - 1] ?? caminho);
97
97
  }
98
98
  export function pontuarCandidatoDeclarado(candidato, origem, caminhoDeclarado) {
99
- if (candidato.origem !== origem) {
99
+ if (candidato.origem === "sql") {
100
+ return undefined;
101
+ }
102
+ const mesmaFamiliaTsJs = (origem === "ts" || origem === "js") && (candidato.origem === "ts" || candidato.origem === "js");
103
+ if (candidato.origem !== origem && !mesmaFamiliaTsJs) {
100
104
  return undefined;
101
105
  }
102
106
  const caminhoNormalizado = paraIdentificadorModulo(caminhoDeclarado.replace(/\./g, "_"));
@@ -211,16 +215,16 @@ export function sugerirCandidatosParaTaskSemImpl(simbolos, nomeTask) {
211
215
  export function escolherRotasEsperadas(task, fontesLegado) {
212
216
  const fontesTs = extrairFontesHttpTypeScript(fontesLegado);
213
217
  const fontesBackend = extrairFontesHttpBackend(fontesLegado);
214
- const implTs = task.implementacoesExternas.find((impl) => impl.origem === "ts");
215
- if (implTs) {
218
+ const implTsOuJs = task.implementacoesExternas.find((impl) => impl.origem === "ts" || impl.origem === "js");
219
+ if (implTsOuJs) {
216
220
  const esperadas = new Set();
217
- if (/\.route\.(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)$/i.test(implTs.caminho) || /\.route\./i.test(implTs.caminho)) {
221
+ if (/\.route\.(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)$/i.test(implTsOuJs.caminho) || /\.route\./i.test(implTsOuJs.caminho)) {
218
222
  esperadas.add("nextjs");
219
223
  }
220
- if (/\bcontroller\b/i.test(implTs.caminho) && fontesTs.includes("nestjs")) {
224
+ if (/\bcontroller\b/i.test(implTsOuJs.caminho) && fontesTs.includes("nestjs")) {
221
225
  esperadas.add("nestjs");
222
226
  }
223
- if (fontesTs.includes("firebase") && /(apps\.worker|worker|sema_contract_bridge|health)/i.test(implTs.caminho)) {
227
+ if (fontesTs.includes("firebase") && /(apps\.worker|worker|sema_contract_bridge|health)/i.test(implTsOuJs.caminho)) {
224
228
  esperadas.add("firebase");
225
229
  }
226
230
  if (esperadas.size > 0) {
@@ -267,7 +271,7 @@ export function escolherRotasEsperadas(task, fontesLegado) {
267
271
  return [];
268
272
  }
269
273
  export function taskEhBridgeFirebase(task) {
270
- return task.implementacoesExternas.some((impl) => impl.origem === "ts" && /sema_contract_bridge|collections?|apps\.worker/i.test(impl.caminho));
274
+ return task.implementacoesExternas.some((impl) => (impl.origem === "ts" || impl.origem === "js") && /sema_contract_bridge|collections?|apps\.worker/i.test(impl.caminho));
271
275
  }
272
276
  export function tiposAceitosParaRecursoPersistencia(recurso) {
273
277
  switch (recurso.resourceKind) {
@@ -1,8 +1,23 @@
1
+ // SEMA-GOVERNED: sema.governanca_ia_contexto
2
+ // Descricao: analisa modulos selecionados no drift; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
3
+ import { existsSync } from "node:fs";
4
+ import path from "node:path";
1
5
  import { escolherArquivoPorVinculo, escolherSimboloPorVinculo } from "./drift.part03.js";
2
6
  import { calcularRiscoOperacional, encontrarAncoraSuperficie } from "./drift.part04.js";
3
7
  import { resolverPersistenciaLocalPorTask } from "./drift.part08.js";
4
8
  import { escolherRotasEsperadas, normalizarCaminhoRota, ordenarCandidatos, sugerirCandidatosParaImpl, sugerirCandidatosParaTaskSemImpl } from "./drift.part09.js";
5
9
  import { coletarVinculosIr, extrairRecursosEsperados, resolverRecursoEsperado } from "./drift.part10.js";
10
+ function escolherArquivoDeclarado(contexto, arquivosConhecidos, valor) {
11
+ const resolucaoIndexada = escolherArquivoPorVinculo(arquivosConhecidos, valor);
12
+ if (resolucaoIndexada.status !== "nao_encontrado") {
13
+ return resolucaoIndexada;
14
+ }
15
+ const caminhoExplicito = path.resolve(contexto.baseProjeto, valor);
16
+ if (existsSync(caminhoExplicito)) {
17
+ return { arquivo: caminhoExplicito, confianca: "alta", status: "resolvido" };
18
+ }
19
+ return resolucaoIndexada;
20
+ }
6
21
  export function analisarModulosSelecionadosDrift(estado) {
7
22
  const { contexto, mapaImpl, todosSimbolos, mapaRecursos, todosRecursos, todasRotasIndexadas, todosArquivosConhecidos, implsValidos, implsQuebrados, vinculosValidos, vinculosQuebrados, rotasDivergentes, recursosValidos, recursosDivergentes, diagnosticos, tasksResumo, taskPorChave, guardrailsPorTask, resumoVinculosPorTask, arquivosAncoraHerdadosPorTask, } = estado;
8
23
  for (const item of contexto.modulosSelecionados) {
@@ -292,7 +307,7 @@ export function analisarModulosSelecionadosDrift(estado) {
292
307
  registro.simbolo = resolucaoSimbolo.simbolo?.simbolo;
293
308
  }
294
309
  else if (arquivoDeclarado) {
295
- const resolucaoArquivo = escolherArquivoPorVinculo(todosArquivosConhecidos, arquivoDeclarado);
310
+ const resolucaoArquivo = escolherArquivoDeclarado(contexto, todosArquivosConhecidos, arquivoDeclarado);
296
311
  registro.status = resolucaoArquivo.status;
297
312
  registro.confianca = resolucaoArquivo.confianca;
298
313
  registro.arquivo = resolucaoArquivo.arquivo;
@@ -319,14 +334,14 @@ export function analisarModulosSelecionadosDrift(estado) {
319
334
  registro.simbolo = rota.simbolo;
320
335
  }
321
336
  else {
322
- const resolucaoArquivo = escolherArquivoPorVinculo(todosArquivosConhecidos, superficieDeclarada);
337
+ const resolucaoArquivo = escolherArquivoDeclarado(contexto, todosArquivosConhecidos, superficieDeclarada);
323
338
  registro.status = resolucaoArquivo.status;
324
339
  registro.confianca = resolucaoArquivo.confianca;
325
340
  registro.arquivo = resolucaoArquivo.arquivo;
326
341
  }
327
342
  }
328
343
  else {
329
- const resolucaoArquivo = escolherArquivoPorVinculo(todosArquivosConhecidos, itemVinculo.vinculo.valor);
344
+ const resolucaoArquivo = escolherArquivoDeclarado(contexto, todosArquivosConhecidos, itemVinculo.vinculo.valor);
330
345
  registro.status = resolucaoArquivo.status;
331
346
  registro.confianca = resolucaoArquivo.confianca;
332
347
  registro.arquivo = resolucaoArquivo.arquivo;
@@ -1,3 +1,7 @@
1
+ export declare const LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO = 1000;
2
+ export declare const LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO = 2000;
3
+ export declare const LIMITE_AVISO_LINHAS_CONTRATO_SEMA = 300;
4
+ export declare const LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA = 500;
1
5
  export declare const LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO = 1000;
2
6
  export declare const LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO = 2000;
3
7
  export type TipoArquivoOrcamento = "contrato" | "codigo" | "documentacao" | "gerado" | "migracao_historica";
@@ -31,8 +35,14 @@ export interface DiagnosticoOrcamentoArquivo {
31
35
  limite_aviso_linhas: number;
32
36
  limite_bloqueio_linhas: number;
33
37
  }
38
+ export interface LimitesOrcamentoSemantico {
39
+ aviso: number;
40
+ bloqueio: number;
41
+ }
34
42
  export declare function contarLinhasConteudo(conteudo: string): number;
35
- export declare function classificarLinhasOrcamentoSemantico(linhas: number): SeveridadeOrcamentoSemantico;
43
+ export declare function limitesOrcamentoSemantico(tipo?: TipoArquivoOrcamento | string): LimitesOrcamentoSemantico;
44
+ export declare function classificarLinhasOrcamentoSemantico(linhas: number, tipo?: TipoArquivoOrcamento | string): SeveridadeOrcamentoSemantico;
45
+ export declare function arquivoContratoSemaTemNomeArtificial(caminho: string): boolean;
36
46
  export declare function arquivoEhArtefatoGeradoDeterministico(caminho: string): boolean;
37
47
  export declare function arquivoEhMigracaoHistoricaImutavel(caminho: string): boolean;
38
48
  export declare function tipoArquivoOrcamento(caminho: string): TipoArquivoOrcamento;
@@ -4,8 +4,12 @@
4
4
  // Descrição: centraliza os gates de linhas e cabeçalho Sema para drift, finalização e snapshots.
5
5
  import { readFile } from "node:fs/promises";
6
6
  import path from "node:path";
7
- export const LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO = 1000;
8
- export const LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO = 2000;
7
+ export const LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO = 1000;
8
+ export const LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO = 2000;
9
+ export const LIMITE_AVISO_LINHAS_CONTRATO_SEMA = 300;
10
+ export const LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA = 500;
11
+ export const LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO = LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO;
12
+ export const LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO = LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO;
9
13
  const EXTENSOES_CODIGO_GOVERNAVEL = new Set([
10
14
  ".ts",
11
15
  ".tsx",
@@ -65,15 +69,33 @@ export function contarLinhasConteudo(conteudo) {
65
69
  ? normalizado.slice(0, -1).split("\n").length
66
70
  : normalizado.split("\n").length;
67
71
  }
68
- export function classificarLinhasOrcamentoSemantico(linhas) {
69
- if (linhas > LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO) {
72
+ export function limitesOrcamentoSemantico(tipo) {
73
+ if (tipo === "contrato") {
74
+ return {
75
+ aviso: LIMITE_AVISO_LINHAS_CONTRATO_SEMA,
76
+ bloqueio: LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA,
77
+ };
78
+ }
79
+ return {
80
+ aviso: LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO,
81
+ bloqueio: LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO,
82
+ };
83
+ }
84
+ export function classificarLinhasOrcamentoSemantico(linhas, tipo) {
85
+ const limites = limitesOrcamentoSemantico(tipo);
86
+ if (linhas > limites.bloqueio) {
70
87
  return "erro";
71
88
  }
72
- if (linhas > LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO) {
89
+ if (linhas > limites.aviso) {
73
90
  return "aviso";
74
91
  }
75
92
  return "ok";
76
93
  }
94
+ export function arquivoContratoSemaTemNomeArtificial(caminho) {
95
+ const nome = path.basename(caminho, ".sema").toLowerCase();
96
+ return /(^|[_-])(parte|part|p)[_-]?\d+($|[_-])/.test(nome)
97
+ || /(^|[_-])\d+_de_\d+($|[_-])/.test(nome);
98
+ }
77
99
  export function arquivoEhArtefatoGeradoDeterministico(caminho) {
78
100
  const normalizado = caminho.replace(/\\/g, "/").toLowerCase();
79
101
  const partes = normalizado.split("/").filter(Boolean);
@@ -90,8 +112,7 @@ export function arquivoEhMigracaoHistoricaImutavel(caminho) {
90
112
  const normalizado = caminho.replace(/\\/g, "/").toLowerCase();
91
113
  const partes = normalizado.split("/").filter(Boolean);
92
114
  const nome = partes.at(-1) ?? "";
93
- return partes.includes("supabase")
94
- && partes.includes("migrations")
115
+ return partes.includes("migrations")
95
116
  && /^\d{14}_.+\.sql$/.test(nome);
96
117
  }
97
118
  export function tipoArquivoOrcamento(caminho) {
@@ -163,26 +184,34 @@ export function exemploCabecalhoCodigoGovernado(arquivo) {
163
184
  export function validarArquivoTocado(entrada) {
164
185
  const linhas = Number(entrada.linhas ?? 0);
165
186
  const tipo = entrada.tipo ?? tipoArquivoOrcamento(entrada.arquivo ?? "");
166
- const severidade = classificarLinhasOrcamentoSemantico(linhas);
187
+ const arquivo = entrada.arquivo ?? "arquivo";
188
+ const limites = limitesOrcamentoSemantico(tipo);
189
+ const nomeContratoArtificial = tipo === "contrato" && arquivoContratoSemaTemNomeArtificial(arquivo);
190
+ const severidade = nomeContratoArtificial ? "erro" : classificarLinhasOrcamentoSemantico(linhas, tipo);
167
191
  const tipoSemOrcamentoDeCodigo = tipo === "documentacao" || tipo === "gerado" || tipo === "migracao_historica";
168
192
  const permitido = tipoSemOrcamentoDeCodigo || severidade !== "erro";
169
- const arquivo = entrada.arquivo ?? "arquivo";
170
193
  return {
171
194
  permitido,
172
195
  severidade: tipoSemOrcamentoDeCodigo ? "ok" : severidade,
173
- limite_aviso_linhas: LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO,
174
- limite_bloqueio_linhas: LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO,
196
+ limite_aviso_linhas: limites.aviso,
197
+ limite_bloqueio_linhas: limites.bloqueio,
175
198
  mensagem: tipo === "gerado"
176
199
  ? `${arquivo} e artefato gerado deterministico; valide a fonte humana governada em vez de dividir o artefato.`
177
200
  : tipo === "migracao_historica"
178
201
  ? `${arquivo} e migracao historica imutavel; novas migrations continuam obrigadas a passar pelo gate antes de serem criadas.`
179
202
  : tipo === "documentacao"
180
203
  ? `${arquivo} e documentacao; nao entra no limite de codigo, mas continua governado por docs-impacto, limite de bytes e verificacao de segredos.`
181
- : severidade === "erro"
182
- ? `${arquivo} (${tipo}) tem ${linhas} linhas; reorganize em arquivos com responsabilidade unica antes de concluir. Exemplo web: index.html, styles/*.css, js/state.js, js/render/*.js e data/*.json. Nao fatie em _p1/_p2 sem fronteira semantica.`
183
- : severidade === "aviso"
184
- ? `${arquivo} (${tipo}) tem ${linhas} linhas; planeje modularizacao por responsabilidade antes de passar de ${LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO}.`
185
- : `${arquivo} (${tipo}) esta dentro do orcamento semantico.`,
204
+ : nomeContratoArtificial
205
+ ? `${arquivo} usa nome artificial de parte numerada. Contratos .sema devem ser pequenos por dominio/capacidade, nunca parte_1/parte_2. Um mesmo arquivo de codigo pode ser governado por varios .sema via vinculos.`
206
+ : tipo === "contrato" && severidade === "erro"
207
+ ? `${arquivo} (${tipo}) tem ${linhas} linhas; limite bloqueante para .sema e ${limites.bloqueio}. Divida por dominio/capacidade real, nunca em parte_1/parte_2. Preserve guarantees, tests, authz, dados e vinculos; varios .sema podem governar o mesmo arquivo de codigo.`
208
+ : tipo === "contrato" && severidade === "aviso"
209
+ ? `${arquivo} (${tipo}) tem ${linhas} linhas; contrato .sema saudavel fica ate ${limites.aviso} linhas e bloqueia acima de ${limites.bloqueio}. Planeje split por capacidade antes de editar mais.`
210
+ : severidade === "erro"
211
+ ? `${arquivo} (${tipo}) tem ${linhas} linhas; reorganize em arquivos com responsabilidade unica antes de concluir. Exemplo web: index.html, styles/*.css, js/state.js, js/render/*.js e data/*.json. Nao fatie em _p1/_p2 sem fronteira semantica.`
212
+ : severidade === "aviso"
213
+ ? `${arquivo} (${tipo}) tem ${linhas} linhas; planeje modularizacao por responsabilidade antes de passar de ${limites.bloqueio}.`
214
+ : `${arquivo} (${tipo}) esta dentro do orcamento semantico.`,
186
215
  };
187
216
  }
188
217
  export function emitirDiagnosticosCodigoMonolitico(entrada) {
@@ -228,8 +257,8 @@ export function avaliarOrcamentoArquivo(opcoes) {
228
257
  severidade: validacao.severidade,
229
258
  bloqueia: validacao.severidade === "erro",
230
259
  mensagem: validacao.mensagem,
231
- limite_aviso_linhas: LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO,
232
- limite_bloqueio_linhas: LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO,
260
+ limite_aviso_linhas: validacao.limite_aviso_linhas,
261
+ limite_bloqueio_linhas: validacao.limite_bloqueio_linhas,
233
262
  });
234
263
  }
235
264
  if (tipoArquivo === "codigo" && opcoes.exigirCabecalhoCodigoGovernado) {
@@ -245,8 +274,8 @@ export function avaliarOrcamentoArquivo(opcoes) {
245
274
  severidade: "erro",
246
275
  bloqueia: true,
247
276
  mensagem: cabecalho.mensagem,
248
- limite_aviso_linhas: LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO,
249
- limite_bloqueio_linhas: LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO,
277
+ limite_aviso_linhas: validacao.limite_aviso_linhas,
278
+ limite_bloqueio_linhas: validacao.limite_bloqueio_linhas,
250
279
  });
251
280
  }
252
281
  }
package/dist/index.d.ts CHANGED
@@ -1,11 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
  export * from "./index.part01.js";
3
- export * from "./index.part02.js";
4
- export * from "./index.part03.js";
5
- export * from "./index.part04.js";
6
- export * from "./index.part05.js";
7
- export * from "./index.part06.js";
8
- export * from "./index.part07.js";
9
3
  export * from "./index.part08.js";
10
4
  export { iniciarProfileAuthor, comandoAuthor, criarAuthorBriefing, revisarClichesAuthor } from "./profileAuthorCommand.js";
11
5
  export { validarProfileSemantico } from "./profileCommand.js";
package/dist/index.js CHANGED
@@ -3,12 +3,6 @@
3
3
  // Descricao: CLI particionada; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
4
4
  import { principal } from "./index.part08.js";
5
5
  export * from "./index.part01.js";
6
- export * from "./index.part02.js";
7
- export * from "./index.part03.js";
8
- export * from "./index.part04.js";
9
- export * from "./index.part05.js";
10
- export * from "./index.part06.js";
11
- export * from "./index.part07.js";
12
6
  export * from "./index.part08.js";
13
7
  export { iniciarProfileAuthor, comandoAuthor, criarAuthorBriefing, revisarClichesAuthor } from "./profileAuthorCommand.js";
14
8
  export { validarProfileSemantico } from "./profileCommand.js";
@@ -2,7 +2,7 @@ import { compilarCodigo, type IrModulo } from "@sema/nucleo";
2
2
  import { analisarDriftLegado, type OpcoesDriftLegado } from "./drift.js";
3
3
  import { type GuiaCapacidadeIaMap } from './agentContextTipos.js';
4
4
  import { criarBriefingAgente, resumirDriftPorModulo } from "./index.part03.js";
5
- export type Comando = "iniciar" | "init" | "dev" | "sync" | "chat" | "runner" | "author" | "profile" | "validar" | "ast" | "ir" | "compilar" | "gerar" | "testar" | "diagnosticos" | "verificar" | "inspecionar" | "drift" | "impacto" | "renomear-semantico" | "importar" | "doctor" | "formatar" | "ajuda-ia" | "starter-ia" | "sync-ai-entrypoints" | "instalar-exemplos" | "preflight" | "mcp-instalar-chave" | "rule-packs" | "docs-impacto" | "finalizar-mudanca" | "resumo" | "prompt-curto" | "prompt-ia" | "prompt-ia-ui" | "prompt-ia-react" | "prompt-ia-sema-primeiro" | "exemplos-prompt-ia" | "contexto-ia";
5
+ export type Comando = "iniciar" | "init" | "dev" | "sync" | "author" | "profile" | "validar" | "ast" | "ir" | "compilar" | "gerar" | "testar" | "diagnosticos" | "verificar" | "inspecionar" | "drift" | "impacto" | "renomear-semantico" | "importar" | "doctor" | "formatar" | "ajuda-ia" | "starter-ia" | "sync-ai-entrypoints" | "instalar-exemplos" | "preflight" | "rule-packs" | "docs-impacto" | "finalizar-mudanca" | "resumo" | "prompt-curto" | "prompt-ia" | "prompt-ia-ui" | "prompt-ia-react" | "prompt-ia-sema-primeiro" | "exemplos-prompt-ia" | "contexto-ia";
6
6
  export interface ResultadoFormatacaoArquivo {
7
7
  caminho: string;
8
8
  alterado: boolean;
@@ -109,9 +109,7 @@ export function ajuda() {
109
109
  "sema contexto-ia <arquivo.sema> [--saida <diretorio>] [--json]",
110
110
  "sema sync-ai-entrypoints [--json]",
111
111
  "sema instalar-exemplos [--json]",
112
- "sema preflight [comando] [--operation-code <codigo>] [--project-id <uuid>] [--json]",
113
- "sema mcp-instalar-chave --stdin [--endpoint <url>] [--control-plane-url <url>] [--dry-run] [--json]",
114
- "sema chat doctor [--json]",
112
+ "sema preflight [comando] [--operation-code <codigo>] [--json]",
115
113
  "sema docs-impacto --intencao <acao> [--arquivo <caminho>] [--criar-ausentes] [--json]",
116
114
  "sema finalizar-mudanca --intencao <acao> [--arquivo <caminho>] [--doc-lida <caminho>] [--json]",
117
115
  "sema author briefing <arquivo.sema> [--json]",
@@ -2,7 +2,7 @@
2
2
  // Descricao: CLI particionada; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
3
3
  import { readFile } from "node:fs/promises";
4
4
  import path from "node:path";
5
- import { LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO, LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO, } from "./driftOrcamento.js";
5
+ import { LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO, LIMITE_AVISO_LINHAS_CONTRATO_SEMA, LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO, LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA, } from "./driftOrcamento.js";
6
6
  import { CAPACIDADES_IA_OPERACIONAIS, } from './agentContextTipos.js';
7
7
  import { limitarLista, resumirListaTexto, unicosOrdenados } from './textoListas.js';
8
8
  import { VERSAO_CLI, calcularRiscoOperacionalResumo, formatarEfeitoSemanticoResumido, normalizarIdentificadorResumo, resumirCamposTask } from "./index.part01.js";
@@ -334,7 +334,9 @@ Regras:
334
334
  - se a tarefa pedir mais contexto, suba para \`briefing.min.json\`, \`drift.json\` e depois \`ir.json\`
335
335
  - não saia editando software vivo sem olhar risco, lacuna e checks sugeridos
336
336
  - se abrir código com \`SEMA-GOVERNED\`, volte ao contrato e chame Sema antes de editar
337
- - não crie nem conclua código ou contrato governado acima de ${LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO} linhas; acima de ${LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO}, planeje divisão; documentação Markdown não entra nesse limite de código
337
+ - não crie nem conclua código governado acima de ${LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO} linhas; acima de ${LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO}, planeje divisão; documentação Markdown não entra nesse limite de código
338
+ - não crie nem edite contrato .sema acima de ${LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA} linhas; acima de ${LIMITE_AVISO_LINHAS_CONTRATO_SEMA}, planeje split por domínio/capacidade, nunca parte_1/parte_2
339
+ - vários contratos .sema podem governar o mesmo arquivo por vinculos; Sema Código deve preservar essa rastreabilidade
338
340
  ${resumo.consumerFramework ? "- se for tarefa visual consumer, priorize `appRoutes`, `consumerSurfaces` e `consumerBridges` antes de abrir arquivos aleatórios" : ""}
339
341
 
340
342
  Contexto compacto:
@@ -6,9 +6,9 @@ import { formatarDiagnosticos, gerarRespostaValidacao, temErros, } from "@sema/n
6
6
  import { carregarProjeto, } from "./projeto.js";
7
7
  import { analisarDriftLegado, } from "./drift.js";
8
8
  import { resolverDocumentacaoObrigatoria, verificarDocumentacaoMudanca, } from "./docs.js";
9
- import { LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO, LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO, } from "./driftOrcamento.js";
9
+ import { LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO, LIMITE_AVISO_LINHAS_CONTRATO_SEMA, LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO, LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA, } from "./driftOrcamento.js";
10
10
  import { ARQUIVO_AGENT_CONTEXT_PACK, ARQUIVO_DOC_AGENTES_CAPACIDADE, ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, } from './agentContextTipos.js';
11
- import { criarGuiaCapacidadeIa, LIMITE_CARACTERES_PAYLOAD_INLINE_MCP } from './agentContextPack.js';
11
+ import { criarGuiaCapacidadeIa, LIMITE_CARACTERES_PAYLOAD_INLINE } from './agentContextPack.js';
12
12
  import { criarEntradaCanonicaProjeto } from './agentContext.js';
13
13
  import { renderizarDocumentoAgentesPorCapacidade, renderizarSemaBoot, renderizarSemaSmallModel, } from './agentEntryPoints.js';
14
14
  import { carregarModulos } from './carregarModulos.js';
@@ -112,8 +112,8 @@ export async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escrever
112
112
  `POLITICA_PLATAFORMA: Sema governa projeto e nao contorna politicas da plataforma; se houver alerta externo, pare e explique sem burlar filtro`,
113
113
  `TIMEOUT_SEMA: timeout local nao e falha; retry progressivo ${agentContextPack.politicaTimeoutResumo.escalonamentoSegundos.map((segundos) => `${segundos}s`).join(" -> ")}; escopar arquivo se projeto inteiro for lento`,
114
114
  `CODIGO_GOVERNADO: ${agentContextPack.politicaCodigoGovernado.marcador} -> chamar Sema antes de editar codigo gerado; validacao inline nao dispensa cabecalho fisico`,
115
- `ORCAMENTO_SEMANTICO: codigo/contrato governado aviso>${LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO}; bloqueio>${LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO}; docs Markdown fora do limite de codigo; dividir por responsabilidade, nao fatiar p1/p2`,
116
- `PAYLOAD_MCP: inline>${LIMITE_CARACTERES_PAYLOAD_INLINE_MCP} caracteres nao e timeout; modularize por responsabilidade ou use anexo/caminho autorizado`,
115
+ `ORCAMENTO_SEMANTICO: codigo aviso>${LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO} bloqueio>${LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO}; .sema aviso>${LIMITE_AVISO_LINHAS_CONTRATO_SEMA} bloqueio>${LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA}; .sema por capacidade, nunca parte_1/parte_2; docs Markdown fora do limite de codigo`,
116
+ `PAYLOAD_INLINE: inline>${LIMITE_CARACTERES_PAYLOAD_INLINE} caracteres nao e timeout; modularize por responsabilidade ou use anexo/caminho autorizado`,
117
117
  `SINAL_VS_RITUAL: score/achados/decisaoAgente sao triagem; exigir evidencia concreta alem de palavra-chave ou regex`,
118
118
  `DESIGN_VISUAL: se houver UI, moderno obrigatorio; fraca=padrao seguro responsivo; media=tokens+estados; forte=screenshot+assets+microinteracoes`,
119
119
  `TOP_MODULOS: ${resumirListaTexto(modulos.map((modulo) => modulo.modulo), 3)}`,
@@ -137,8 +137,8 @@ export async function gerarResumoProjetoIa(entrada, pastaSaidaOpcional, escrever
137
137
  `POLITICA_PLATAFORMA: ${agentContextPack.politicaPlataforma.regra} ${agentContextPack.politicaPlataforma.quandoHouverBloqueio}`,
138
138
  `TIMEOUT_SEMA: ${agentContextPack.politicaTimeoutResumo.regra} Escale ${agentContextPack.politicaTimeoutResumo.escalonamentoSegundos.map((segundos) => `${segundos}s`).join(" -> ")} antes de declarar bloqueio.`,
139
139
  `CODIGO_GOVERNADO: ${agentContextPack.politicaCodigoGovernado.marcador} -> docs-impacto e drift antes de alterar comportamento`,
140
- `ORCAMENTO_SEMANTICO: codigo/contrato governado acima de ${LIMITE_AVISO_LINHAS_ORCAMENTO_SEMANTICO} linhas exige refatoracao planejada; acima de ${LIMITE_BLOQUEIO_LINHAS_ORCAMENTO_SEMANTICO} bloqueia finalizar-mudanca, drift, geracao e snapshot; Markdown/documentacao nao entra no limite de codigo`,
141
- `PAYLOAD_MCP: conteudo inline acima de ${LIMITE_CARACTERES_PAYLOAD_INLINE_MCP} caracteres deve virar arquivos logicos, anexo, caminho de servidor autorizado ou manifesto; nao aumente timeout para empurrar o mesmo payload`,
140
+ `ORCAMENTO_SEMANTICO: codigo governado acima de ${LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO} linhas exige refatoracao e acima de ${LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO} bloqueia; .sema acima de ${LIMITE_AVISO_LINHAS_CONTRATO_SEMA} diagnostica e acima de ${LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA} bloqueia criacao, edicao, drift, geracao e snapshot; varios .sema podem governar o mesmo arquivo via vinculos`,
141
+ `PAYLOAD_INLINE: conteudo inline acima de ${LIMITE_CARACTERES_PAYLOAD_INLINE} caracteres deve virar arquivos logicos, anexo, caminho de servidor autorizado ou manifesto; nao aumente timeout para empurrar o mesmo payload`,
142
142
  `DESIGN_VISUAL: ${agentContextPack.politicaDesignVisual.regra} Fraca=${agentContextPack.politicaDesignVisual.porCapacidade.fraca} Media=${agentContextPack.politicaDesignVisual.porCapacidade.media} Forte=${agentContextPack.politicaDesignVisual.porCapacidade.forte}`,
143
143
  `TOP_MODULOS: ${resumirListaTexto(modulos.map((modulo) => modulo.modulo), 6)}`,
144
144
  `TOP_RISCOS: ${resumirListaTexto(unicosOrdenados(modulos.flatMap((modulo) => modulo.riscosPrincipais)), 6)}`,
@@ -252,7 +252,7 @@ Antes de escolher arquivo de código, leia \`${ARQUIVO_SEMA_BOOT}\` e \`agent-co
252
252
 
253
253
  - Abra \`AGENTS.md\` antes de editar código, contrato, docs operacionais, release ou deploy.
254
254
  - Abra \`exemplos/\` antes de criar ou corrigir sintaxe \`.sema\`.
255
- - Abra \`docs/sintaxe.md\` quando exemplos não bastarem para resolver a gramática.
255
+ - Abra \`docs/syntax.md\` quando exemplos não bastarem para resolver a gramática.
256
256
  - Abra \`contratos/\` antes de qualquer implementação ou mudança de comportamento.
257
257
 
258
258
  ## Timeout e retry
@@ -4,12 +4,9 @@ import path from "node:path";
4
4
  import { carregarConfiguracaoProjeto, resolverAlvoPadrao, resolverEstruturaSaidaPadrao, resolverFrameworkPadrao, resolverSaidaPadrao, } from "./projeto.js";
5
5
  import { REGISTRO_COMANDOS } from "./comandos.js";
6
6
  import * as billing from "./billing/index.js";
7
- import { ajudaRunnerValidacaoRemota, comandoRunnerValidacaoRemota, } from "./runnerValidacaoRemotaCli.js";
8
- import { comandoServidorRunnerValidacaoRemota } from "./runnerValidacaoRemotaServidor.js";
9
7
  import { comandoIniciar, comandoInstalarExemplos } from './initCommand.js';
10
8
  import { obterOpcao, obterPosicionais, possuiFlag } from './cliArgs.js';
11
9
  import { comandoAuthor, comandoProfile, criarPayloadRulePacks, normalizarProfileGovernanca, renderizarRulePacksTexto } from './profileAuthorCommand.js';
12
- import { comandoMcpInstalarChave } from './mcpInstalarChaveCommand.js';
13
10
  import { comandoDoctor } from './doctorCommand.js';
14
11
  import { normalizarFonteImportacao, normalizarTemplateIniciar, } from './geracaoCore.js';
15
12
  import { VERSAO_CLI, ajuda, obterArgumentos } from "./index.part01.js";
@@ -31,7 +28,7 @@ export async function principal() {
31
28
  const cwd = process.cwd();
32
29
  const posicionais = obterPosicionais(resto);
33
30
  let codigoSaida = 0;
34
- // --- Comandos registrados via REGISTRO_COMANDOS (mcp-client, bridge-config, contexto-chat, etc.) ---
31
+ // --- Comandos registrados via REGISTRO_COMANDOS (guard, init, dev, sync) ---
35
32
  const handlerRegistrado = REGISTRO_COMANDOS[comando];
36
33
  if (handlerRegistrado) {
37
34
  codigoSaida = await handlerRegistrado(posicionais, resto, possuiFlag(resto, "--json"));
@@ -55,21 +52,6 @@ export async function principal() {
55
52
  codigoSaida = 0;
56
53
  }
57
54
  break;
58
- case "runner":
59
- {
60
- const subcomando = posicionais[0];
61
- if (subcomando === "validar-remoto") {
62
- codigoSaida = await comandoRunnerValidacaoRemota(resto, cwd);
63
- }
64
- else if (subcomando === "servidor") {
65
- codigoSaida = await comandoServidorRunnerValidacaoRemota(resto, cwd);
66
- }
67
- else {
68
- console.log(ajudaRunnerValidacaoRemota());
69
- codigoSaida = subcomando ? 1 : 0;
70
- }
71
- }
72
- break;
73
55
  case "validar":
74
56
  codigoSaida = possuiFlag(resto, "--json")
75
57
  ? await comandoValidarJson(posicionais[0])
@@ -167,9 +149,6 @@ export async function principal() {
167
149
  case "preflight":
168
150
  codigoSaida = await billing.comandoPreflightCli(resto, possuiFlag(resto, "--json"));
169
151
  break;
170
- case "mcp-instalar-chave":
171
- codigoSaida = await comandoMcpInstalarChave(resto, possuiFlag(resto, "--json"));
172
- break;
173
152
  case "docs-impacto":
174
153
  codigoSaida = await comandoDocsImpacto(posicionais, resto, possuiFlag(resto, "--json"));
175
154
  break;
@@ -79,16 +79,16 @@ Antes de alterar codigo, contrato ou documentacao:
79
79
  3. rode \`sema preflight resumo --json\`;
80
80
  4. rode \`sema resumo\`;
81
81
  5. rode \`sema docs-impacto --intencao "<acao>" --json\`;
82
- 6. leia \`docs/comandos.md\` antes de escolher comando ou interpretar \`--saida\`;
83
- 7. use \`exemplos/\` e \`docs/sintaxe.md\` antes de criar ou corrigir \`.sema\`.
82
+ 6. leia \`docs/commands.md\` antes de escolher comando ou interpretar \`--saida\`;
83
+ 7. use \`exemplos/\` e \`docs/syntax.md\` antes de criar ou corrigir \`.sema\`.
84
84
 
85
85
  ## Estrutura criada
86
86
 
87
87
  - \`contratos/\`: contratos semanticamente governados.
88
88
  - \`exemplos/\`: exemplos oficiais da DSL Sema.
89
- - \`docs/comandos.md\`: catalogo de comandos, gates e regra de \`--saida\`.
90
- - \`docs/sintaxe.md\`: referencia curta para escrever \`.sema\`.
91
- - \`docs/fluxo-pratico-ia-sema.md\`: fluxo minimo para agentes.
89
+ - \`docs/commands.md\`: catalogo de comandos, gates e regra de \`--saida\`.
90
+ - \`docs/syntax.md\`: referencia curta para escrever \`.sema\`.
91
+ - \`docs/ai-workflow.md\`: fluxo minimo para agentes.
92
92
  - \`SEMA_BOOT.md\`, \`SEMA_SMALL_MODEL.md\`, \`AGENT_CONTEXT_PACK.json\` e \`SEMA_INDEX.json\`: contexto IA-first.
93
93
 
94
94
  ## Geracao
@@ -5,6 +5,39 @@
5
5
  import { contemArtefatoProfile, contratoProibeTermoProfile, criarAchadoArtefatoProfile, trechoRegexProfile } from "./profileRegras.js";
6
6
  import { artefatoParecePagamentoWebhookProfile, artefatoPareceWebhookProfile, artefatoPareceMultiTenantProfile, avaliarPresencaPositivaArtefato, localizarIdempotenciaGlobalExternalEventProfile, presencaAutenticacaoWebhookProfile, presencaIdempotenciaWorkspaceScopedProfile, presencaWorkspaceWebhookProfile, validarTermosObrigatoriosArtefato, } from "./profileArtefatoBase.js";
7
7
  import { avaliarI18nVisivelArtefato } from "./profileI18nVisivel.js";
8
+ function detectarOverflowHorizontalMobile(artefato) {
9
+ const comparacaoExplicita = /(?:document\.documentElement\.)?scrollWidth\s*>\s*(?:document\.documentElement\.)?clientWidth/i.exec(artefato);
10
+ if (comparacaoExplicita) {
11
+ return { trecho: comparacaoExplicita[0] };
12
+ }
13
+ const pares = [
14
+ {
15
+ regex: /scrollWidth[\s:=><a-zA-Z().-]{0,40}(\d+(?:\.\d+)?)[\s\S]{0,140}?clientWidth[\s:=><a-zA-Z().-]{0,40}(\d+(?:\.\d+)?)/i,
16
+ scrollIndex: 1,
17
+ clientIndex: 2,
18
+ },
19
+ {
20
+ regex: /clientWidth[\s:=><a-zA-Z().-]{0,40}(\d+(?:\.\d+)?)[\s\S]{0,140}?scrollWidth[\s:=><a-zA-Z().-]{0,40}(\d+(?:\.\d+)?)/i,
21
+ scrollIndex: 2,
22
+ clientIndex: 1,
23
+ },
24
+ ];
25
+ for (const par of pares) {
26
+ const match = par.regex.exec(artefato);
27
+ if (!match)
28
+ continue;
29
+ const scrollWidth = Number(match[par.scrollIndex]);
30
+ const clientWidth = Number(match[par.clientIndex]);
31
+ if (Number.isFinite(scrollWidth) && Number.isFinite(clientWidth) && scrollWidth > clientWidth) {
32
+ return {
33
+ trecho: match[0].replace(/\s+/g, " ").trim(),
34
+ scrollWidth,
35
+ clientWidth,
36
+ };
37
+ }
38
+ }
39
+ return null;
40
+ }
8
41
  export function avaliarArtefatoSoftwareProfile(contrato, artefato, maturidade, preset) {
9
42
  const regras = [
10
43
  { id: "software_eval_proibido", termo: "eval", regex: /\beval\s*\(/i, descricao: "codigo usa eval, risco basico de execucao dinamica", sugestao: "troque por parser explicito, tabela de operacoes ou validacao estruturada." },
@@ -76,6 +109,15 @@ export function avaliarArtefatoSoftwareProfile(contrato, artefato, maturidade, p
76
109
  if (eslintNextSemIgnore) {
77
110
  achados.push(criarAchadoArtefatoProfile("software_lint_next_sem_ignore", "lint de Next.js parece varrer .next sem ignore explicito", false, "warning", trechoRegexProfile(artefato, /\.next/i), "adicione ignore para .next no flat config ou ajuste o script de lint.", undefined, { risco: "ruido_operacional_de_build" }));
78
111
  }
112
+ const driftFalho = /\bdrift\b|vinculos_quebrados|rotas_divergentes/i.test(artefato) &&
113
+ /"?sucesso"?\s*:\s*false|sucesso:false|vinculos_quebrados[\s\S]{0,160}(?:nao_encontrado|\.\/|status|arquivo)|rotas_divergentes[\s\S]{0,160}(?:GET|POST|PUT|PATCH|DELETE|divergente|\/)/i.test(artefato);
114
+ if (driftFalho) {
115
+ achados.push(criarAchadoArtefatoProfile("software_drift_fechamento_falso", "evidencia de fechamento contem drift falho, vinculo quebrado ou rota divergente", false, "blocking", trechoRegexProfile(artefato, /"?sucesso"?\s*:\s*false|sucesso:false|vinculos_quebrados[\s\S]{0,160}(?:nao_encontrado|\.\/|status|arquivo)|rotas_divergentes[\s\S]{0,160}(?:GET|POST|PUT|PATCH|DELETE|divergente|\/)/i), "corrija os vinculos/rotas/impls, rode sema drift novamente e so conclua com sucesso:true.", undefined, { risco: "fechamento_com_drift_falho" }));
116
+ }
117
+ const overflowMobile = detectarOverflowHorizontalMobile(artefato);
118
+ if (overflowMobile && /ui|html|css|mobile|viewport|responsiv|interface|dashboard|formul/i.test(`${contrato}\n${artefato}`)) {
119
+ achados.push(criarAchadoArtefatoProfile("software_ui_overflow_horizontal_mobile", "evidencia visual indica overflow horizontal em viewport mobile", false, maturidade === "critical" ? "critical" : "blocking", overflowMobile.trecho, "ajuste CSS/layout e valide novamente em mobile; scrollWidth precisa ser menor ou igual a clientWidth.", undefined, { risco: "responsividade_mobile_nao_observada" }));
120
+ }
79
121
  achados.push(...avaliarI18nVisivelArtefato(contrato, artefato, maturidade));
80
122
  return achados;
81
123
  }
@@ -16,6 +16,8 @@ export const VALIDADORES_I18N = {
16
16
  { regex: /\bEducacao\b/i, esperado: "Educação" },
17
17
  { regex: /\bSaude\b/i, esperado: "Saúde" },
18
18
  { regex: /\bAlimentacao\b/i, esperado: "Alimentação" },
19
+ { regex: /\bLancamento\b/i, esperado: "Lançamento" },
20
+ { regex: /\bLancamentos\b/i, esperado: "Lançamentos" },
19
21
  { regex: /\bOnibus\b/i, esperado: "Ônibus" },
20
22
  { regex: /\balmoco\b/i, esperado: "almoço" },
21
23
  { regex: /\brapido\b/i, esperado: "rápido" },
@@ -61,6 +61,12 @@ export function normalizarAlvo(valor) {
61
61
  return undefined;
62
62
  }
63
63
  export function normalizarFonteLegado(valor) {
64
+ if (valor === "js") {
65
+ return "javascript";
66
+ }
67
+ if (valor === "ts") {
68
+ return "typescript";
69
+ }
64
70
  if (valor === "nestjs"
65
71
  || valor === "fastapi"
66
72
  || valor === "flask"
@@ -71,6 +77,7 @@ export function normalizarFonteLegado(valor) {
71
77
  || valor === "flutter-consumer"
72
78
  || valor === "firebase"
73
79
  || valor === "typescript"
80
+ || valor === "javascript"
74
81
  || valor === "python"
75
82
  || valor === "dart"
76
83
  || valor === "lua"
@@ -33,7 +33,9 @@ export async function inferirFontesLegado(diretoriosCodigo, baseProjeto, configC
33
33
  encontrados.add("firebase");
34
34
  }
35
35
  for (const diretorio of diretoriosCodigo) {
36
- const arquivosTs = await listarArquivosRecursivosLimitado(diretorio, [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"], 5, 40);
36
+ const arquivosTs = await listarArquivosRecursivosLimitado(diretorio, [".ts", ".tsx"], 5, 40);
37
+ const arquivosJs = await listarArquivosRecursivosLimitado(diretorio, [".js", ".jsx", ".mjs", ".cjs"], 5, 40);
38
+ const arquivosTsJs = [...arquivosTs, ...arquivosJs];
37
39
  const arquivosPy = await listarArquivosRecursivosLimitado(diretorio, [".py"], 5, 20);
38
40
  const arquivosDart = await listarArquivosRecursivosLimitado(diretorio, [".dart"], 5, 20);
39
41
  const arquivosLua = await listarArquivosRecursivosLimitado(diretorio, [".lua"], 5, 20);
@@ -45,14 +47,19 @@ export async function inferirFontesLegado(diretoriosCodigo, baseProjeto, configC
45
47
  const arquivosCpp = arquivosCppBrutos.filter((arquivo) => !/(^|[\\/])(windows|linux|macos|runner|flutter|ephemeral|build|vendor)([\\/]|$)/i.test(arquivo));
46
48
  if (arquivosTs.length > 0) {
47
49
  encontrados.add("typescript");
50
+ }
51
+ if (arquivosJs.length > 0) {
52
+ encontrados.add("javascript");
53
+ }
54
+ if (arquivosTsJs.length > 0) {
48
55
  const packageJsons = await procurarArquivosPorNome(diretorio, ["package.json"], 3);
49
56
  const nextConfigs = await procurarArquivosPorNome(diretorio, ["next.config.js", "next.config.ts", "next.config.mjs"], 3);
50
57
  const viteConfigs = await procurarArquivosPorNome(diretorio, ["vite.config.ts", "vite.config.js", "vite.config.mjs"], 3);
51
58
  const angularConfigs = await procurarArquivosPorNome(diretorio, ["angular.json"], 3);
52
59
  const firebaseLocais = await procurarArquivosPorNome(diretorio, ["firebase.json", "firestore.rules"], 3);
53
60
  const textosPackage = await Promise.all(packageJsons.slice(0, 8).map((arquivo) => lerConteudoSeExistir(arquivo)));
54
- const amostrasTs = await Promise.all(arquivosTs.slice(0, 10).map((arquivo) => lerConteudoSeExistir(arquivo)));
55
- const relacoesTs = arquivosTs.map((arquivo) => path.relative(diretorio, arquivo).replace(/\\/g, "/"));
61
+ const amostrasTs = await Promise.all(arquivosTsJs.slice(0, 10).map((arquivo) => lerConteudoSeExistir(arquivo)));
62
+ const relacoesTs = arquivosTsJs.map((arquivo) => path.relative(diretorio, arquivo).replace(/\\/g, "/"));
56
63
  const temNest = textosPackage.some((texto) => /@nestjs\/common|@nestjs\/core/.test(texto ?? ""))
57
64
  || amostrasTs.some((texto) => /@nestjs\/common|@nestjs\/core|@Controller\(|@Get\(|@Post\(|@Put\(|@Patch\(|@Delete\(/.test(texto ?? ""));
58
65
  const temNext = textosPackage.some((texto) => /"next"\s*:/.test(texto ?? ""))
@@ -63,7 +63,7 @@ generator client {
63
63
 
64
64
  datasource db {
65
65
  provider = "${datasourceProvider}"
66
- url = env("DATABASE_URL")
66
+ url = env("SEMA_PRISMA_URL")
67
67
  }
68
68
  ${models}`;
69
69
  // Salvar
package/dist/tipos.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export type EstruturaSaida = "flat" | "modulos" | "backend";
2
- export type FonteLegado = "nestjs" | "fastapi" | "flask" | "nextjs" | "nextjs-consumer" | "react-vite-consumer" | "angular-consumer" | "flutter-consumer" | "firebase" | "typescript" | "python" | "dart" | "lua" | "dotnet" | "java" | "go" | "rust" | "cpp";
2
+ export type FonteLegado = "nestjs" | "fastapi" | "flask" | "nextjs" | "nextjs-consumer" | "react-vite-consumer" | "angular-consumer" | "flutter-consumer" | "firebase" | "typescript" | "javascript" | "python" | "dart" | "lua" | "dotnet" | "java" | "go" | "rust" | "cpp";
3
3
  export type ModoAdocao = "incremental";
package/docs/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # Sema Documentation
2
+
3
+ These docs describe the public local CLI distribution of Sema.
4
+
5
+ Sema is local-first: agents run the CLI inside a project folder, read `.sema`
6
+ contracts, check drift, map impact, and close changes with documentation
7
+ evidence. Public docs are written in English.
8
+
9
+ Start here:
10
+
11
+ - [CLI](./cli.md)
12
+ - [Commands](./commands.md)
13
+ - [Syntax](./syntax.md)
14
+ - [Profiles](./profiles.md)
15
+ - [Documentation Governance](./documentation.md)
16
+ - [Repository Boundary](./repositories.md)
17
+ - [Security](./security.md)
18
+
19
+ Official support: [suporte@otimitare.online](mailto:suporte@otimitare.online)