tutanus 0.13.1 → 0.13.2

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 (117) hide show
  1. package/README.md +5 -5
  2. package/dist/analysts/corrections/reorganize-barrels.d.ts.map +1 -1
  3. package/dist/analysts/corrections/reorganize-barrels.js +29 -6
  4. package/dist/analysts/corrections/reorganize-barrels.js.map +1 -1
  5. package/dist/analysts/html/analysts/analyst-html.js.map +1 -1
  6. package/dist/analysts/js-ts/analysts/analyst-commands-cli.d.ts.map +1 -1
  7. package/dist/analysts/js-ts/analysts/analyst-commands-cli.js.map +1 -1
  8. package/dist/app/github/app/index.d.ts +6 -0
  9. package/dist/app/github/app/index.d.ts.map +1 -1
  10. package/dist/app/github/app/index.js +6 -0
  11. package/dist/app/github/app/index.js.map +1 -1
  12. package/dist/app/github/app/setup-routes.d.ts.map +1 -1
  13. package/dist/app/github/app/setup-routes.js +0 -1
  14. package/dist/app/github/app/setup-routes.js.map +1 -1
  15. package/dist/app/github/dashboard/index.d.ts +2 -0
  16. package/dist/app/github/dashboard/index.d.ts.map +1 -1
  17. package/dist/app/github/dashboard/index.js +2 -0
  18. package/dist/app/github/dashboard/index.js.map +1 -1
  19. package/dist/app/github/dashboard/layout.d.ts +5 -0
  20. package/dist/app/github/dashboard/layout.d.ts.map +1 -0
  21. package/dist/app/github/dashboard/layout.js +5 -0
  22. package/dist/app/github/dashboard/layout.js.map +1 -0
  23. package/dist/app/github/dashboard/page.d.ts +3 -0
  24. package/dist/app/github/dashboard/page.d.ts.map +1 -0
  25. package/dist/app/github/dashboard/page.js +10 -0
  26. package/dist/app/github/dashboard/page.js.map +1 -0
  27. package/dist/app/github/jobs/index.d.ts +1 -0
  28. package/dist/app/github/jobs/index.d.ts.map +1 -1
  29. package/dist/app/github/jobs/index.js +1 -0
  30. package/dist/app/github/jobs/index.js.map +1 -1
  31. package/dist/cli/commands/command-marketplace.js +1 -1
  32. package/dist/cli/commands/command-marketplace.js.map +1 -1
  33. package/dist/licenses/index.d.ts +2 -1
  34. package/dist/licenses/index.d.ts.map +1 -1
  35. package/dist/licenses/index.js +1 -0
  36. package/dist/licenses/index.js.map +1 -1
  37. package/dist/licenses/policy.d.ts +5 -0
  38. package/dist/licenses/policy.d.ts.map +1 -0
  39. package/dist/licenses/policy.js +60 -0
  40. package/dist/licenses/policy.js.map +1 -0
  41. package/dist/licenses/scanner.d.ts +4 -2
  42. package/dist/licenses/scanner.d.ts.map +1 -1
  43. package/dist/licenses/scanner.js +10 -2
  44. package/dist/licenses/scanner.js.map +1 -1
  45. package/dist/shared/marketplace/remote.js +1 -1
  46. package/dist/shared/marketplace/remote.js.map +1 -1
  47. package/dist/types/licenses/licenses.d.ts +8 -0
  48. package/dist/types/licenses/licenses.d.ts.map +1 -1
  49. package/dist/types/licenses/licenses.js.map +1 -1
  50. package/package.json +6 -7
  51. package/out/404/index.html +0 -1
  52. package/out/404.html +0 -1
  53. package/out/__next.__PAGE__.txt +0 -25
  54. package/out/__next._full.txt +0 -37
  55. package/out/__next._head.txt +0 -5
  56. package/out/__next._index.txt +0 -6
  57. package/out/__next._tree.txt +0 -4
  58. package/out/_next/static/7AicuowOpmCuGWjCpsQMB/_buildManifest.js +0 -11
  59. package/out/_next/static/7AicuowOpmCuGWjCpsQMB/_clientMiddlewareManifest.js +0 -1
  60. package/out/_next/static/7AicuowOpmCuGWjCpsQMB/_ssgManifest.js +0 -1
  61. package/out/_next/static/chunks/05-c3ty_6dwfk.js +0 -1
  62. package/out/_next/static/chunks/0cz1d0mv5g_q7.js +0 -1
  63. package/out/_next/static/chunks/1061ff024jzvu.js +0 -2
  64. package/out/_next/static/chunks/14mrh2-p_w84d.js +0 -1
  65. package/out/_next/static/chunks/15orcrkp-_9ct.js +0 -4
  66. package/out/_next/static/chunks/1jq4o6yq14o4c.js +0 -31
  67. package/out/_next/static/chunks/1rxncug86bump.js +0 -1
  68. package/out/_next/static/chunks/2n-4qa9h44lgj.js +0 -1
  69. package/out/_next/static/chunks/39aw8cj-oq89z.js +0 -11
  70. package/out/_next/static/chunks/3n7dm2ojtyzwn.js +0 -1
  71. package/out/_next/static/chunks/3uta7d_6k863-.css +0 -1
  72. package/out/_next/static/chunks/turbopack-2xb6mmb6_q43u.js +0 -1
  73. package/out/_next/static/media/icon-1.008jpsm4iakzh.png +0 -0
  74. package/out/_not-found/__next._full.txt +0 -16
  75. package/out/_not-found/__next._head.txt +0 -5
  76. package/out/_not-found/__next._index.txt +0 -6
  77. package/out/_not-found/__next._not-found.__PAGE__.txt +0 -5
  78. package/out/_not-found/__next._not-found.txt +0 -5
  79. package/out/_not-found/__next._tree.txt +0 -3
  80. package/out/_not-found/index.html +0 -1
  81. package/out/_not-found/index.txt +0 -16
  82. package/out/changelog/__next._full.txt +0 -573
  83. package/out/changelog/__next._head.txt +0 -5
  84. package/out/changelog/__next._index.txt +0 -6
  85. package/out/changelog/__next._tree.txt +0 -4
  86. package/out/changelog/__next.changelog.__PAGE__.txt +0 -560
  87. package/out/changelog/__next.changelog.txt +0 -5
  88. package/out/changelog/index.html +0 -550
  89. package/out/changelog/index.txt +0 -573
  90. package/out/github/dashboard/__next._full.txt +0 -20
  91. package/out/github/dashboard/__next._head.txt +0 -5
  92. package/out/github/dashboard/__next._index.txt +0 -6
  93. package/out/github/dashboard/__next._tree.txt +0 -3
  94. package/out/github/dashboard/__next.github.dashboard.__PAGE__.txt +0 -9
  95. package/out/github/dashboard/__next.github.dashboard.txt +0 -4
  96. package/out/github/dashboard/__next.github.txt +0 -5
  97. package/out/github/dashboard/index.html +0 -1
  98. package/out/github/dashboard/index.txt +0 -20
  99. package/out/index.html +0 -1
  100. package/out/index.txt +0 -37
  101. package/out/privacy-policy/__next._full.txt +0 -38
  102. package/out/privacy-policy/__next._head.txt +0 -5
  103. package/out/privacy-policy/__next._index.txt +0 -6
  104. package/out/privacy-policy/__next._tree.txt +0 -4
  105. package/out/privacy-policy/__next.privacy-policy.__PAGE__.txt +0 -23
  106. package/out/privacy-policy/__next.privacy-policy.txt +0 -5
  107. package/out/privacy-policy/index.html +0 -1
  108. package/out/privacy-policy/index.txt +0 -38
  109. package/out/terms-of-use/__next._full.txt +0 -37
  110. package/out/terms-of-use/__next._head.txt +0 -5
  111. package/out/terms-of-use/__next._index.txt +0 -6
  112. package/out/terms-of-use/__next._tree.txt +0 -4
  113. package/out/terms-of-use/__next.terms-of-use.__PAGE__.txt +0 -18
  114. package/out/terms-of-use/__next.terms-of-use.txt +0 -5
  115. package/out/terms-of-use/index.html +0 -1
  116. package/out/terms-of-use/index.txt +0 -37
  117. package/scripts/license.json +0 -53
@@ -1,4 +1,5 @@
1
1
  export { iniciarAutoFix } from './auto-fix-job.js';
2
2
  export { iniciarAnaliseCompleta } from './full-analysis-job.js';
3
+ export * from './full-analysis-utils.js';
3
4
  export { atualizarJob, criarJob, listarJobs, obterJob } from './job-manager.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/app/github/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { iniciarAutoFix } from './auto-fix-job.js';\nexport { iniciarAnaliseCompleta } from './full-analysis-job.js';\nexport { atualizarJob,criarJob, listarJobs, obterJob } from './job-manager.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/app/github/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,YAAY,EAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { iniciarAutoFix } from './auto-fix-job.js';\nexport { iniciarAnaliseCompleta } from './full-analysis-job.js';\nexport * from './full-analysis-utils.js';\nexport { atualizarJob,criarJob, listarJobs, obterJob } from './job-manager.js';\n"]}
@@ -178,7 +178,7 @@ export function comandoMarketplace() {
178
178
  log.info(' 2. Adicione seu analista ao diretório "analistas/"');
179
179
  log.info(' 3. Envie um Pull Request');
180
180
  log.info('');
181
- log.info('Documentação: https://github.com/mocoto-strike/tutanus/wiki/Marketplace');
181
+ log.info('Documentação: https://github.com/mocoto-geleia/tutanus/wiki/Marketplace');
182
182
  }
183
183
  catch (err) {
184
184
  log.erro(msgs.erroPublicar(err instanceof Error ? err.message : String(err)));
@@ -1 +1 @@
1
- {"version":3,"file":"command-marketplace.js","sourceRoot":"","sources":["../../../src/cli/commands/command-marketplace.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { ExitCode, sair } from '@cli/helpers';\nimport { messages } from '@core/messages';\nimport {\n buscarPacotesInstalados,\n info as remoteInfo,\n instalarPacote,\n listarPacotesInstalados,\n obterInfoPacote,\n removerPacote,\n resolverMelhorVersao,\n search as remoteSearch\n} from '@shared/marketplace';\nimport { Command } from 'commander';\n\nconst log = messages.log;\nconst msgs = messages.CliComandoMarketplaceMensagens;\n\nexport function comandoMarketplace(): Command {\n const marketplace = new Command('marketplace')\n .description(msgs.descricao);\n\n marketplace.command('search <termo>')\n .description(msgs.searchDescricao)\n .option('--json', msgs.jsonDescricao)\n .option('--registry <url>', msgs.registryDescricao)\n .action(async (termo: string, opts: { json?: boolean; registry?: string }) => {\n try {\n log.info(msgs.buscando(termo));\n const { total, resultados } = await remoteSearch(termo);\n\n if (opts.json) {\n console.log(JSON.stringify({ total, resultados }, null, 2));\n return;\n }\n\n if (total === 0) {\n log.info(msgs.nenhumResultado);\n return;\n }\n\n log.info(msgs.tituloBusca);\n for (const r of resultados) {\n const desc = r.descricao || '(sem descrição)';\n const tags = r.tags || [];\n log.info(msgs.itemBusca(r.nome, desc, tags));\n }\n log.info(msgs.totalResultados(total));\n } catch (err) {\n log.erro(msgs.erroBuscar(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n marketplace.command('install <nome>')\n .description(msgs.installDescricao)\n .option('--version <version>', msgs.versionDescricao)\n .option('--registry <url>', msgs.registryDescricao)\n .action(async (nome: string, opts: { version?: string; registry?: string }) => {\n try {\n const instalado = await obterInfoPacote(nome);\n if (instalado) {\n log.info(msgs.jaInstalado(nome, instalado.versao));\n return;\n }\n\n const analista = await remoteInfo(nome);\n if (!analista) {\n log.erro(msgs.analistaNaoEncontrado(nome));\n sair(ExitCode.Failure);\n return;\n }\n\n const versaoReq = opts.version || 'latest';\n const melhorVersao = resolverMelhorVersao(analista.versoes, versaoReq);\n if (!melhorVersao) {\n log.erro(`Versão \"${versaoReq}\" não disponível para \"${nome}\".`);\n sair(ExitCode.Failure);\n return;\n }\n\n log.info(msgs.instalando(nome, melhorVersao.version));\n\n await instalarPacote(analista, melhorVersao.version, '');\n\n log.sucesso(msgs.instaladoComSucesso(nome, melhorVersao.version));\n } catch (err) {\n log.erro(msgs.erroInstalar(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n marketplace.command('remove <nome>')\n .description(msgs.removeDescricao)\n .action(async (nome: string) => {\n try {\n log.info(msgs.removendo(nome));\n const ok = await removerPacote(nome);\n if (ok) log.sucesso(msgs.removidoComSucesso(nome));\n } catch (err) {\n log.erro(msgs.erroRemover(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n marketplace.command('list')\n .description(msgs.listDescricao)\n .option('--json', msgs.jsonDescricao)\n .option('--filter <termo>', 'Filtra por termo')\n .action(async (opts: { json?: boolean; filter?: string }) => {\n try {\n const pacotes = opts.filter\n ? await buscarPacotesInstalados(opts.filter)\n : await listarPacotesInstalados();\n\n if (opts.json) {\n console.log(JSON.stringify(pacotes, null, 2));\n return;\n }\n\n if (pacotes.length === 0) {\n log.info(msgs.semAnalistas);\n log.info(msgs.dicaBusca);\n return;\n }\n\n log.info(msgs.tituloLista);\n for (const p of pacotes) {\n const nome = p?.nome || '(sem nome)';\n const versao = p?.versao || '(sem versão)';\n const descricao = p?.descricao || '(sem descrição)';\n log.info(msgs.itemLista(nome, versao, descricao));\n }\n log.info(msgs.totalResultados(pacotes.length));\n } catch (err) {\n log.erro(msgs.erroListar(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n marketplace.command('info <nome>')\n .description(msgs.infoDescricao)\n .option('--json', msgs.jsonDescricao)\n .action(async (nome: string, opts: { json?: boolean }) => {\n try {\n const analista = await remoteInfo(nome);\n const local = await obterInfoPacote(nome);\n\n if (!analista && !local) {\n log.erro(msgs.analistaNaoEncontrado(nome));\n sair(ExitCode.Failure);\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ remoto: analista, local }, null, 2));\n return;\n }\n\n if (local) {\n log.info(msgs.infoTitulo(nome));\n log.info(` Versão instalada: ${local.versao}`);\n log.info(` Descrição: ${local.descricao}`);\n log.info(` Autor: ${local.autor}`);\n log.info(` Licença: ${local.licenca}`);\n log.info(` Categoria: ${local.categoria}`);\n log.info(` Instalado em: ${new Date(local.dataInstalacao).toLocaleString()}`);\n if (local.tags.length > 0) log.info(msgs.infoTags(local.tags));\n return;\n }\n\n if (analista) {\n const versoes = analista.versoes.map((v: { version: string }) => v.version).join(', ');\n const tags = analista.tags || [];\n log.info(msgs.infoTitulo(nome));\n log.info(` Descrição: ${analista.descricao}`);\n log.info(` Categoria: ${analista.categoria}`);\n log.info(msgs.infoVersoes(versoes));\n if (tags.length > 0) log.info(msgs.infoTags(tags));\n log.info(` ${msgs.infoDicaInstalar}`);\n }\n } catch (err) {\n log.erro(msgs.erroObterInformacoes(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n marketplace.command('publish <caminho>')\n .description(msgs.publishDescricao)\n .action(async (caminho: string) => {\n try {\n log.info(`Validando analista em \"${caminho}\"...`);\n\n const stats = await import('node:fs').then(fs => fs.promises.stat(caminho));\n if (!stats.isFile()) {\n log.erro('O caminho deve ser um arquivo de definição de analista.');\n sair(ExitCode.Failure);\n return;\n }\n\n log.sucesso('Arquivo de analista validado.');\n log.info('');\n log.info('Para publicar no marketplace comunitário:');\n log.info(' 1. Crie um fork do repositório tutanus-marketplace');\n log.info(' 2. Adicione seu analista ao diretório \"analistas/\"');\n log.info(' 3. Envie um Pull Request');\n log.info('');\n log.info('Documentação: https://github.com/mocoto-strike/tutanus/wiki/Marketplace');\n } catch (err) {\n log.erro(msgs.erroPublicar(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n return marketplace;\n}\n"]}
1
+ {"version":3,"file":"command-marketplace.js","sourceRoot":"","sources":["../../../src/cli/commands/command-marketplace.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { ExitCode, sair } from '@cli/helpers';\nimport { messages } from '@core/messages';\nimport {\n buscarPacotesInstalados,\n info as remoteInfo,\n instalarPacote,\n listarPacotesInstalados,\n obterInfoPacote,\n removerPacote,\n resolverMelhorVersao,\n search as remoteSearch\n} from '@shared/marketplace';\nimport { Command } from 'commander';\n\nconst log = messages.log;\nconst msgs = messages.CliComandoMarketplaceMensagens;\n\nexport function comandoMarketplace(): Command {\n const marketplace = new Command('marketplace')\n .description(msgs.descricao);\n\n marketplace.command('search <termo>')\n .description(msgs.searchDescricao)\n .option('--json', msgs.jsonDescricao)\n .option('--registry <url>', msgs.registryDescricao)\n .action(async (termo: string, opts: { json?: boolean; registry?: string }) => {\n try {\n log.info(msgs.buscando(termo));\n const { total, resultados } = await remoteSearch(termo);\n\n if (opts.json) {\n console.log(JSON.stringify({ total, resultados }, null, 2));\n return;\n }\n\n if (total === 0) {\n log.info(msgs.nenhumResultado);\n return;\n }\n\n log.info(msgs.tituloBusca);\n for (const r of resultados) {\n const desc = r.descricao || '(sem descrição)';\n const tags = r.tags || [];\n log.info(msgs.itemBusca(r.nome, desc, tags));\n }\n log.info(msgs.totalResultados(total));\n } catch (err) {\n log.erro(msgs.erroBuscar(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n marketplace.command('install <nome>')\n .description(msgs.installDescricao)\n .option('--version <version>', msgs.versionDescricao)\n .option('--registry <url>', msgs.registryDescricao)\n .action(async (nome: string, opts: { version?: string; registry?: string }) => {\n try {\n const instalado = await obterInfoPacote(nome);\n if (instalado) {\n log.info(msgs.jaInstalado(nome, instalado.versao));\n return;\n }\n\n const analista = await remoteInfo(nome);\n if (!analista) {\n log.erro(msgs.analistaNaoEncontrado(nome));\n sair(ExitCode.Failure);\n return;\n }\n\n const versaoReq = opts.version || 'latest';\n const melhorVersao = resolverMelhorVersao(analista.versoes, versaoReq);\n if (!melhorVersao) {\n log.erro(`Versão \"${versaoReq}\" não disponível para \"${nome}\".`);\n sair(ExitCode.Failure);\n return;\n }\n\n log.info(msgs.instalando(nome, melhorVersao.version));\n\n await instalarPacote(analista, melhorVersao.version, '');\n\n log.sucesso(msgs.instaladoComSucesso(nome, melhorVersao.version));\n } catch (err) {\n log.erro(msgs.erroInstalar(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n marketplace.command('remove <nome>')\n .description(msgs.removeDescricao)\n .action(async (nome: string) => {\n try {\n log.info(msgs.removendo(nome));\n const ok = await removerPacote(nome);\n if (ok) log.sucesso(msgs.removidoComSucesso(nome));\n } catch (err) {\n log.erro(msgs.erroRemover(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n marketplace.command('list')\n .description(msgs.listDescricao)\n .option('--json', msgs.jsonDescricao)\n .option('--filter <termo>', 'Filtra por termo')\n .action(async (opts: { json?: boolean; filter?: string }) => {\n try {\n const pacotes = opts.filter\n ? await buscarPacotesInstalados(opts.filter)\n : await listarPacotesInstalados();\n\n if (opts.json) {\n console.log(JSON.stringify(pacotes, null, 2));\n return;\n }\n\n if (pacotes.length === 0) {\n log.info(msgs.semAnalistas);\n log.info(msgs.dicaBusca);\n return;\n }\n\n log.info(msgs.tituloLista);\n for (const p of pacotes) {\n const nome = p?.nome || '(sem nome)';\n const versao = p?.versao || '(sem versão)';\n const descricao = p?.descricao || '(sem descrição)';\n log.info(msgs.itemLista(nome, versao, descricao));\n }\n log.info(msgs.totalResultados(pacotes.length));\n } catch (err) {\n log.erro(msgs.erroListar(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n marketplace.command('info <nome>')\n .description(msgs.infoDescricao)\n .option('--json', msgs.jsonDescricao)\n .action(async (nome: string, opts: { json?: boolean }) => {\n try {\n const analista = await remoteInfo(nome);\n const local = await obterInfoPacote(nome);\n\n if (!analista && !local) {\n log.erro(msgs.analistaNaoEncontrado(nome));\n sair(ExitCode.Failure);\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ remoto: analista, local }, null, 2));\n return;\n }\n\n if (local) {\n log.info(msgs.infoTitulo(nome));\n log.info(` Versão instalada: ${local.versao}`);\n log.info(` Descrição: ${local.descricao}`);\n log.info(` Autor: ${local.autor}`);\n log.info(` Licença: ${local.licenca}`);\n log.info(` Categoria: ${local.categoria}`);\n log.info(` Instalado em: ${new Date(local.dataInstalacao).toLocaleString()}`);\n if (local.tags.length > 0) log.info(msgs.infoTags(local.tags));\n return;\n }\n\n if (analista) {\n const versoes = analista.versoes.map((v: { version: string }) => v.version).join(', ');\n const tags = analista.tags || [];\n log.info(msgs.infoTitulo(nome));\n log.info(` Descrição: ${analista.descricao}`);\n log.info(` Categoria: ${analista.categoria}`);\n log.info(msgs.infoVersoes(versoes));\n if (tags.length > 0) log.info(msgs.infoTags(tags));\n log.info(` ${msgs.infoDicaInstalar}`);\n }\n } catch (err) {\n log.erro(msgs.erroObterInformacoes(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n marketplace.command('publish <caminho>')\n .description(msgs.publishDescricao)\n .action(async (caminho: string) => {\n try {\n log.info(`Validando analista em \"${caminho}\"...`);\n\n const stats = await import('node:fs').then(fs => fs.promises.stat(caminho));\n if (!stats.isFile()) {\n log.erro('O caminho deve ser um arquivo de definição de analista.');\n sair(ExitCode.Failure);\n return;\n }\n\n log.sucesso('Arquivo de analista validado.');\n log.info('');\n log.info('Para publicar no marketplace comunitário:');\n log.info(' 1. Crie um fork do repositório tutanus-marketplace');\n log.info(' 2. Adicione seu analista ao diretório \"analistas/\"');\n log.info(' 3. Envie um Pull Request');\n log.info('');\n log.info('Documentação: https://github.com/mocoto-geleia/tutanus/wiki/Marketplace');\n } catch (err) {\n log.erro(msgs.erroPublicar(err instanceof Error ? err.message : String(err)));\n sair(ExitCode.Failure);\n }\n });\n\n return marketplace;\n}\n"]}
@@ -1,8 +1,9 @@
1
- export type { DisclaimerAddResult, DisclaimerVerifyResult, PackageInfo, LicensasScanOptions as ScanOptions, ScanResult } from '../types/licenses/licenses.js';
1
+ export type { DisclaimerAddResult, DisclaimerVerifyResult, LicenseStatus, PackageInfo, LicensasScanOptions as ScanOptions, ScanResult } from '../types/licenses/licenses.js';
2
2
  export * from './disclaimer.js';
3
3
  export * from './fs-utils.js';
4
4
  export * from './generate-notices.js';
5
5
  export * from './normalizer.js';
6
+ export * from './policy.js';
6
7
  export * from './scanner.js';
7
8
  export * from './types.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/licenses/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,mBAAmB,EAAE,sBAAsB,EAAC,WAAW,EAAE,mBAAmB,IAAI,WAAW,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC7J,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/licenses/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,IAAI,WAAW,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC7K,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -2,6 +2,7 @@ export * from './disclaimer.js';
2
2
  export * from './fs-utils.js';
3
3
  export * from './generate-notices.js';
4
4
  export * from './normalizer.js';
5
+ export * from './policy.js';
5
6
  export * from './scanner.js';
6
7
  export * from './types.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/licenses/index.ts"],"names":[],"mappings":"AAMA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * @fileoverview License scanning and management\n */\n\nexport type { DisclaimerAddResult, DisclaimerVerifyResult,PackageInfo, LicensasScanOptions as ScanOptions, ScanResult } from '../types/licenses/licenses.js';\nexport * from './disclaimer.js';\nexport * from './fs-utils.js';\nexport * from './generate-notices.js';\nexport * from './normalizer.js';\nexport * from './scanner.js';\nexport * from './types.js';"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/licenses/index.ts"],"names":[],"mappings":"AAMA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * @fileoverview License scanning and management\n */\n\nexport type { DisclaimerAddResult, DisclaimerVerifyResult, LicenseStatus, PackageInfo, LicensasScanOptions as ScanOptions, ScanResult } from '../types/licenses/licenses.js';\nexport * from './disclaimer.js';\nexport * from './fs-utils.js';\nexport * from './generate-notices.js';\nexport * from './normalizer.js';\nexport * from './policy.js';\nexport * from './scanner.js';\nexport * from './types.js';"]}
@@ -0,0 +1,5 @@
1
+ import type { LicensePolicy, LicenseStatus } from '../types/licenses/licenses.js';
2
+ export type { LicensePolicy };
3
+ export declare function checkLicenseStatus(license: string, policy: LicensePolicy): LicenseStatus;
4
+ export declare const DEFAULT_LICENSE_POLICY: LicensePolicy;
5
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/licenses/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAC,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEjF,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,aAAa,CAIxF;AAED,eAAO,MAAM,sBAAsB,EAAE,aAmDpC,CAAC"}
@@ -0,0 +1,60 @@
1
+ export function checkLicenseStatus(license, policy) {
2
+ if (policy.allowedLicenses.some(l => l === license))
3
+ return 'allowed';
4
+ if (policy.blockedLicenses.some(l => l === license))
5
+ return 'blocked';
6
+ return 'unknown';
7
+ }
8
+ export const DEFAULT_LICENSE_POLICY = {
9
+ allowedLicenses: [
10
+ 'MIT',
11
+ 'MIT-0',
12
+ 'ISC',
13
+ 'BSD-2-Clause',
14
+ 'BSD-3-Clause',
15
+ 'Apache-2.0',
16
+ '0BSD',
17
+ 'Unlicense',
18
+ 'CC0-1.0',
19
+ 'BlueOak-1.0.0',
20
+ 'Python-2.0',
21
+ 'Zlib',
22
+ 'CC-BY-3.0',
23
+ 'CC-BY-4.0',
24
+ 'Artistic-2.0',
25
+ 'BSD-2-Clause-Patent',
26
+ 'BSL-1.0',
27
+ 'Unicode-DFS-2015',
28
+ 'Unicode-DFS-2016',
29
+ 'Unicode-3.0'
30
+ ],
31
+ blockedLicenses: [
32
+ 'GPL-2.0',
33
+ 'GPL-2.0-only',
34
+ 'GPL-2.0-or-later',
35
+ 'GPL-3.0',
36
+ 'GPL-3.0-only',
37
+ 'GPL-3.0-or-later',
38
+ 'AGPL-3.0',
39
+ 'AGPL-3.0-only',
40
+ 'AGPL-3.0-or-later',
41
+ 'SSPL-1.0',
42
+ 'BUSL-1.1',
43
+ 'EUPL-1.1',
44
+ 'EUPL-1.2',
45
+ 'MPL-1.0',
46
+ 'MPL-1.1',
47
+ 'MPL-2.0',
48
+ 'LGPL-2.0',
49
+ 'LGPL-2.1',
50
+ 'LGPL-3.0',
51
+ 'CC-BY-NC-4.0',
52
+ 'CC-BY-NC-SA-4.0',
53
+ 'CC-BY-ND-4.0',
54
+ 'CC-BY-NC-ND-4.0'
55
+ ],
56
+ exceptions: [],
57
+ failOnBlocked: true,
58
+ failOnUnknown: false
59
+ };
60
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/licenses/policy.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,MAAqB;IACvE,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,eAAe,EAAE;QACf,KAAK;QACL,OAAO;QACP,KAAK;QACL,cAAc;QACd,cAAc;QACd,YAAY;QACZ,MAAM;QACN,WAAW;QACX,SAAS;QACT,eAAe;QACf,YAAY;QACZ,MAAM;QACN,WAAW;QACX,WAAW;QACX,cAAc;QACd,qBAAqB;QACrB,SAAS;QACT,kBAAkB;QAClB,kBAAkB;QAClB,aAAa;KACd;IACD,eAAe,EAAE;QACf,SAAS;QACT,cAAc;QACd,kBAAkB;QAClB,SAAS;QACT,cAAc;QACd,kBAAkB;QAClB,UAAU;QACV,eAAe;QACf,mBAAmB;QACnB,UAAU;QACV,UAAU;QACV,UAAU;QACV,UAAU;QACV,SAAS;QACT,SAAS;QACT,SAAS;QACT,UAAU;QACV,UAAU;QACV,UAAU;QACV,cAAc;QACd,iBAAiB;QACjB,cAAc;QACd,iBAAiB;KAClB;IACD,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,KAAK;CACrB,CAAC","sourcesContent":["import type { LicensePolicy,LicenseStatus } from '../types/licenses/licenses.js';\n\nexport type { LicensePolicy };\n\nexport function checkLicenseStatus(license: string, policy: LicensePolicy): LicenseStatus {\n if (policy.allowedLicenses.some(l => l === license)) return 'allowed';\n if (policy.blockedLicenses.some(l => l === license)) return 'blocked';\n return 'unknown';\n}\n\nexport const DEFAULT_LICENSE_POLICY: LicensePolicy = {\n allowedLicenses: [\n 'MIT',\n 'MIT-0',\n 'ISC',\n 'BSD-2-Clause',\n 'BSD-3-Clause',\n 'Apache-2.0',\n '0BSD',\n 'Unlicense',\n 'CC0-1.0',\n 'BlueOak-1.0.0',\n 'Python-2.0',\n 'Zlib',\n 'CC-BY-3.0',\n 'CC-BY-4.0',\n 'Artistic-2.0',\n 'BSD-2-Clause-Patent',\n 'BSL-1.0',\n 'Unicode-DFS-2015',\n 'Unicode-DFS-2016',\n 'Unicode-3.0'\n ],\n blockedLicenses: [\n 'GPL-2.0',\n 'GPL-2.0-only',\n 'GPL-2.0-or-later',\n 'GPL-3.0',\n 'GPL-3.0-only',\n 'GPL-3.0-or-later',\n 'AGPL-3.0',\n 'AGPL-3.0-only',\n 'AGPL-3.0-or-later',\n 'SSPL-1.0',\n 'BUSL-1.1',\n 'EUPL-1.1',\n 'EUPL-1.2',\n 'MPL-1.0',\n 'MPL-1.1',\n 'MPL-2.0',\n 'LGPL-2.0',\n 'LGPL-2.1',\n 'LGPL-3.0',\n 'CC-BY-NC-4.0',\n 'CC-BY-NC-SA-4.0',\n 'CC-BY-ND-4.0',\n 'CC-BY-NC-ND-4.0'\n ],\n exceptions: [],\n failOnBlocked: true,\n failOnUnknown: false\n};\n"]}
@@ -1,5 +1,7 @@
1
- import type { ScanOptions, ScanResult } from './index.js';
1
+ import type { LicensePolicy, ScanOptions, ScanResult } from './index.js';
2
2
  export declare function scan({ root, includeDev: _includeDev }?: ScanOptions): Promise<ScanResult>;
3
3
  export declare function fsReaddir(caminho: string): Promise<string[]>;
4
- export declare function scanCommand(opts?: ScanOptions): Promise<ScanResult>;
4
+ export declare function scanCommand(opts?: ScanOptions & {
5
+ policy?: LicensePolicy;
6
+ }): Promise<ScanResult>;
5
7
  //# sourceMappingURL=scanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/licenses/scanner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGzD,wBAAsB,IAAI,CAAC,EACzB,IAAoB,EACpB,UAAU,EAAE,WAAmB,EAChC,cAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAmE1C;AACD,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKlE;AAUD,wBAAsB,WAAW,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAM7E"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/licenses/scanner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGxE,wBAAsB,IAAI,CAAC,EACzB,IAAoB,EACpB,UAAU,EAAE,WAAmB,EAChC,cAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAmE1C;AACD,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKlE;AAUD,wBAAsB,WAAW,CAAC,IAAI,GAAE,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,aAAa,CAAA;CAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAW1G"}
@@ -1,5 +1,5 @@
1
1
  import path from 'node:path';
2
- import { exists, findLicenseFile, normalizeLicense, readPackageJsonSync } from './index.js';
2
+ import { checkLicenseStatus, DEFAULT_LICENSE_POLICY, exists, findLicenseFile, normalizeLicense, readPackageJsonSync } from './index.js';
3
3
  export async function scan({ root = process.cwd(), includeDev: _includeDev = false } = {}) {
4
4
  const nmDir = path.join(root, 'node_modules');
5
5
  const result = {
@@ -93,7 +93,15 @@ async function fsStatIsDir(caminho) {
93
93
  }
94
94
  export async function scanCommand(opts = {}) {
95
95
  const res = await scan(opts);
96
- const problematic = res.packages.filter(caminho => caminho.license === 'UNKNOWN');
96
+ const policy = opts.policy ?? DEFAULT_LICENSE_POLICY;
97
+ const problematic = res.packages.filter(caminho => {
98
+ const status = checkLicenseStatus(caminho.license, policy);
99
+ if (status === 'blocked' && policy.failOnBlocked)
100
+ return true;
101
+ if (status === 'unknown' && policy.failOnUnknown)
102
+ return true;
103
+ return false;
104
+ });
97
105
  res.problematic = problematic;
98
106
  return res;
99
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/licenses/scanner.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport path from 'node:path';\n\nimport type { ScanOptions, ScanResult } from '@licenses';\nimport { exists, findLicenseFile, normalizeLicense, readPackageJsonSync } from '@licenses';\n\nexport async function scan({\n root = process.cwd(),\n includeDev: _includeDev = false\n} = {} as ScanOptions): Promise<ScanResult> {\n const nmDir = path.join(root, 'node_modules');\n const result: ScanResult = {\n generatedAt: new Date().toISOString(),\n totalPackages: 0,\n totalFiltered: 0,\n licenseCounts: {},\n packages: [],\n problematic: []\n };\n if (!exists(nmDir)) {\n return result;\n }\n const entries: string[] = [];\n try {\n const dirEntries = await fsReaddir(nmDir);\n for (const erro of dirEntries) entries.push(erro);\n } catch {\n return result;\n }\n for (const entryNome of entries) {\n if (entryNome === '.bin') continue;\n const full = path.join(nmDir, entryNome);\n if (entryNome.startsWith('@')) {\n try {\n const scoped = await fsReaddir(full);\n for (const string of scoped) {\n const pkgPath = path.join(full, string);\n if (await fsStatIsDir(pkgPath)) await processPackage(pkgPath, result);\n }\n } catch {\n // ignore\n }\n } else {\n if (await fsStatIsDir(full)) await processPackage(full, result);\n }\n }\n\n // Removido `: unknown` - result.packages já é tipado, inferência funciona corretamente\n const filtered = result.packages.filter(caminho => !caminho.name.startsWith('@types/'));\n result.totalPackages = result.packages.length;\n result.totalFiltered = filtered.length;\n for (const caminho of filtered) result.licenseCounts[caminho.license] = (result.licenseCounts[caminho.license] || 0) + 1;\n return result;\n async function processPackage(pkgDir: string, resObj: ScanResult) {\n const pkgJsonCaminho = path.join(pkgDir, 'package.json');\n if (!exists(pkgJsonCaminho)) return;\n const data = readPackageJsonSync(pkgJsonCaminho);\n if (!data) return;\n const name = (typeof data.name === 'string' ? data.name : path.basename(pkgDir)) as string;\n const version = (typeof data.version === 'string' ? data.version : '0.0.0') as string;\n const rawLicenca = data.license ?? data.licenses ?? null;\n const licenseValor = await normalizeLicense(rawLicenca || 'UNKNOWN');\n const licenseArquivo = findLicenseFile(pkgDir);\n const repo = data.repository;\n const repository = typeof repo === 'string' ? repo : typeof repo === 'object' && repo !== null && 'url' in repo && typeof (repo as Record<string, unknown>).url === 'string' ? (repo as Record<string, unknown>).url as string : null;\n resObj.packages.push({\n name,\n version,\n license: licenseValor,\n repository,\n private: !!data.private,\n licenseArquivo: licenseArquivo ? licenseArquivo.file : null,\n licenseText: licenseArquivo ? licenseArquivo.text : null,\n path: pkgDir\n });\n }\n}\nexport async function fsReaddir(caminho: string): Promise<string[]> {\n const fs = await import('node:fs');\n return fs.promises.readdir(caminho, {\n withFileTypes: false\n }).catch(() => []);\n}\nasync function fsStatIsDir(caminho: string): Promise<boolean> {\n const fs = await import('node:fs');\n try {\n const stat = await fs.promises.stat(caminho);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\nexport async function scanCommand(opts: ScanOptions = {}): Promise<ScanResult> {\n const res = await scan(opts);\n // Removido `: unknown` e `as unknown` - res.packages é tipado corretamente\n const problematic = res.packages.filter(caminho => caminho.license === 'UNKNOWN');\n res.problematic = problematic;\n return res;\n}"]}
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/licenses/scanner.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAC,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAG,MAAM,WAAW,CAAC;AAEvI,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,EACzB,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,EACpB,UAAU,EAAE,WAAW,GAAG,KAAK,KAC7B,EAAiB;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAe;QACzB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,EAAE;QACjB,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,EAAE;KAChB,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,SAAS,KAAK,MAAM;YAAE,SAAS;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;gBACrC,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;oBAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBACxC,IAAI,MAAM,WAAW,CAAC,OAAO,CAAC;wBAAE,MAAM,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,MAAM,WAAW,CAAC,IAAI,CAAC;gBAAE,MAAM,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAGD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACxF,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9C,MAAM,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;IACvC,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzH,OAAO,MAAM,CAAC;IACd,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,MAAkB;QAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;YAAE,OAAO;QACpC,MAAM,IAAI,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAW,CAAC;QAC3F,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAW,CAAC;QACtF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;QACzD,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC;QACrE,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QAC7B,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,OAAQ,IAAgC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAgC,CAAC,GAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QACtO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnB,IAAI;YACJ,OAAO;YACP,OAAO,EAAE,YAAY;YACrB,UAAU;YACV,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;YACvB,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YAC3D,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YACxD,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;QAClC,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;AACrB,CAAC;AACD,KAAK,UAAU,WAAW,CAAC,OAAe;IACxC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAiD,EAAE;IACnF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC;IACrD,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAChD,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAC9D,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC;IAC9B,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport path from 'node:path';\n\nimport type { LicensePolicy, ScanOptions, ScanResult } from '@licenses';\nimport { checkLicenseStatus, DEFAULT_LICENSE_POLICY,exists, findLicenseFile, normalizeLicense, readPackageJsonSync } from '@licenses';\n\nexport async function scan({\n root = process.cwd(),\n includeDev: _includeDev = false\n} = {} as ScanOptions): Promise<ScanResult> {\n const nmDir = path.join(root, 'node_modules');\n const result: ScanResult = {\n generatedAt: new Date().toISOString(),\n totalPackages: 0,\n totalFiltered: 0,\n licenseCounts: {},\n packages: [],\n problematic: []\n };\n if (!exists(nmDir)) {\n return result;\n }\n const entries: string[] = [];\n try {\n const dirEntries = await fsReaddir(nmDir);\n for (const erro of dirEntries) entries.push(erro);\n } catch {\n return result;\n }\n for (const entryNome of entries) {\n if (entryNome === '.bin') continue;\n const full = path.join(nmDir, entryNome);\n if (entryNome.startsWith('@')) {\n try {\n const scoped = await fsReaddir(full);\n for (const string of scoped) {\n const pkgPath = path.join(full, string);\n if (await fsStatIsDir(pkgPath)) await processPackage(pkgPath, result);\n }\n } catch {\n // ignore\n }\n } else {\n if (await fsStatIsDir(full)) await processPackage(full, result);\n }\n }\n\n // Removido `: unknown` - result.packages já é tipado, inferência funciona corretamente\n const filtered = result.packages.filter(caminho => !caminho.name.startsWith('@types/'));\n result.totalPackages = result.packages.length;\n result.totalFiltered = filtered.length;\n for (const caminho of filtered) result.licenseCounts[caminho.license] = (result.licenseCounts[caminho.license] || 0) + 1;\n return result;\n async function processPackage(pkgDir: string, resObj: ScanResult) {\n const pkgJsonCaminho = path.join(pkgDir, 'package.json');\n if (!exists(pkgJsonCaminho)) return;\n const data = readPackageJsonSync(pkgJsonCaminho);\n if (!data) return;\n const name = (typeof data.name === 'string' ? data.name : path.basename(pkgDir)) as string;\n const version = (typeof data.version === 'string' ? data.version : '0.0.0') as string;\n const rawLicenca = data.license ?? data.licenses ?? null;\n const licenseValor = await normalizeLicense(rawLicenca || 'UNKNOWN');\n const licenseArquivo = findLicenseFile(pkgDir);\n const repo = data.repository;\n const repository = typeof repo === 'string' ? repo : typeof repo === 'object' && repo !== null && 'url' in repo && typeof (repo as Record<string, unknown>).url === 'string' ? (repo as Record<string, unknown>).url as string : null;\n resObj.packages.push({\n name,\n version,\n license: licenseValor,\n repository,\n private: !!data.private,\n licenseArquivo: licenseArquivo ? licenseArquivo.file : null,\n licenseText: licenseArquivo ? licenseArquivo.text : null,\n path: pkgDir\n });\n }\n}\nexport async function fsReaddir(caminho: string): Promise<string[]> {\n const fs = await import('node:fs');\n return fs.promises.readdir(caminho, {\n withFileTypes: false\n }).catch(() => []);\n}\nasync function fsStatIsDir(caminho: string): Promise<boolean> {\n const fs = await import('node:fs');\n try {\n const stat = await fs.promises.stat(caminho);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\nexport async function scanCommand(opts: ScanOptions & { policy?: LicensePolicy } = {}): Promise<ScanResult> {\n const res = await scan(opts);\n const policy = opts.policy ?? DEFAULT_LICENSE_POLICY;\n const problematic = res.packages.filter(caminho => {\n const status = checkLicenseStatus(caminho.license, policy);\n if (status === 'blocked' && policy.failOnBlocked) return true;\n if (status === 'unknown' && policy.failOnUnknown) return true;\n return false;\n });\n res.problematic = problematic;\n return res;\n}"]}
@@ -5,7 +5,7 @@ const { MarketplaceRemoteMensagens } = messages;
5
5
  const DEFAULT_REGISTRIES = [
6
6
  {
7
7
  nome: 'comunidade',
8
- url: 'https://raw.githubusercontent.com/mocoto-strike/tutanus-marketplace/main/index.json',
8
+ url: 'https://raw.githubusercontent.com/mocoto-geleia/tutanus-marketplace/main/index.json',
9
9
  tipo: 'url',
10
10
  habilitado: true,
11
11
  },
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../src/shared/marketplace/remote.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { messages } from '@core/messages';\nimport { lerEstado } from '@shared/persistence';\n\nimport type { MarketplaceAnalista, MarketplaceRemoteRegistry, MarketplaceSearchResult } from '../../types/common/marketplace.js';\n\nconst log = messages.log;\nconst { MarketplaceRemoteMensagens } = messages;\nconst DEFAULT_REGISTRIES: MarketplaceRemoteRegistry[] = [\n {\n nome: 'comunidade',\n url: 'https://raw.githubusercontent.com/mocoto-strike/tutanus-marketplace/main/index.json',\n tipo: 'url',\n habilitado: true,\n },\n];\n\nconst CONFIG_PATH = '.tutanus/marketplace/registries.json';\n\nasync function carregarRegistries(): Promise<MarketplaceRemoteRegistry[]> {\n try {\n const configs = await lerEstado<MarketplaceRemoteRegistry[]>(CONFIG_PATH);\n if (!configs || configs.length === 0) return DEFAULT_REGISTRIES;\n return configs;\n } catch {\n return DEFAULT_REGISTRIES;\n }\n}\n\nexport async function listarRegistries(): Promise<MarketplaceRemoteRegistry[]> {\n return carregarRegistries();\n}\n\nexport async function buscarNoRegistry(\n termo: string,\n registry?: MarketplaceRemoteRegistry\n): Promise<MarketplaceAnalista[]> {\n const registries = registry ? [registry] : await carregarRegistries();\n const resultados: MarketplaceAnalista[] = [];\n\n for (const reg of registries) {\n if (!reg.habilitado) continue;\n try {\n const analistas = await fetchRegistry(reg);\n const filtrados = analistas.filter(a =>\n a.nome.toLowerCase().includes(termo.toLowerCase()) ||\n a.descricao.toLowerCase().includes(termo.toLowerCase()) ||\n a.tags.some((t: string) => t.toLowerCase().includes(termo.toLowerCase()))\n );\n resultados.push(...filtrados);\n } catch (err) {\n log.aviso(MarketplaceRemoteMensagens.registryIndisponivel(reg.nome, err instanceof Error ? err.message : String(err)));\n }\n }\n\n return resultados;\n}\n\nexport async function obterAnalistaDoRegistry(\n nome: string,\n registry?: MarketplaceRemoteRegistry\n): Promise<MarketplaceAnalista | null> {\n const registries = registry ? [registry] : await carregarRegistries();\n\n for (const reg of registries) {\n if (!reg.habilitado) continue;\n try {\n const analistas = await fetchRegistry(reg);\n const encontrado = analistas?.find(a => a.nome === nome);\n if (encontrado) return encontrado;\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nasync function fetchRegistry(reg: MarketplaceRemoteRegistry): Promise<MarketplaceAnalista[]> {\n switch (reg.tipo) {\n case 'url': {\n const res = await fetch(reg.url);\n if (!res.ok) throw new Error(MarketplaceRemoteMensagens.httpStatus(res.status));\n const data = await res.json() as { analistas: MarketplaceAnalista[] };\n return data.analistas || [];\n }\n case 'github': {\n const apiUrl = `https://api.github.com/repos/${reg.url}/contents/index.json`;\n const res = await fetch(apiUrl, {\n headers: { Accept: 'application/vnd.github.v3.raw' },\n });\n if (!res.ok) throw new Error(MarketplaceRemoteMensagens.githubApiHttpStatus(res.status));\n const data = await res.json() as { analistas: MarketplaceAnalista[] };\n return data.analistas || [];\n }\n default:\n return [];\n }\n}\n\nexport async function search(termo: string): Promise<MarketplaceSearchResult> {\n const resultados = await buscarNoRegistry(termo);\n return { total: resultados.length, resultados };\n}\n\nexport async function info(nome: string): Promise<MarketplaceAnalista | null> {\n return obterAnalistaDoRegistry(nome);\n}\n"]}
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../src/shared/marketplace/remote.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\nimport { messages } from '@core/messages';\nimport { lerEstado } from '@shared/persistence';\n\nimport type { MarketplaceAnalista, MarketplaceRemoteRegistry, MarketplaceSearchResult } from '../../types/common/marketplace.js';\n\nconst log = messages.log;\nconst { MarketplaceRemoteMensagens } = messages;\nconst DEFAULT_REGISTRIES: MarketplaceRemoteRegistry[] = [\n {\n nome: 'comunidade',\n url: 'https://raw.githubusercontent.com/mocoto-geleia/tutanus-marketplace/main/index.json',\n tipo: 'url',\n habilitado: true,\n },\n];\n\nconst CONFIG_PATH = '.tutanus/marketplace/registries.json';\n\nasync function carregarRegistries(): Promise<MarketplaceRemoteRegistry[]> {\n try {\n const configs = await lerEstado<MarketplaceRemoteRegistry[]>(CONFIG_PATH);\n if (!configs || configs.length === 0) return DEFAULT_REGISTRIES;\n return configs;\n } catch {\n return DEFAULT_REGISTRIES;\n }\n}\n\nexport async function listarRegistries(): Promise<MarketplaceRemoteRegistry[]> {\n return carregarRegistries();\n}\n\nexport async function buscarNoRegistry(\n termo: string,\n registry?: MarketplaceRemoteRegistry\n): Promise<MarketplaceAnalista[]> {\n const registries = registry ? [registry] : await carregarRegistries();\n const resultados: MarketplaceAnalista[] = [];\n\n for (const reg of registries) {\n if (!reg.habilitado) continue;\n try {\n const analistas = await fetchRegistry(reg);\n const filtrados = analistas.filter(a =>\n a.nome.toLowerCase().includes(termo.toLowerCase()) ||\n a.descricao.toLowerCase().includes(termo.toLowerCase()) ||\n a.tags.some((t: string) => t.toLowerCase().includes(termo.toLowerCase()))\n );\n resultados.push(...filtrados);\n } catch (err) {\n log.aviso(MarketplaceRemoteMensagens.registryIndisponivel(reg.nome, err instanceof Error ? err.message : String(err)));\n }\n }\n\n return resultados;\n}\n\nexport async function obterAnalistaDoRegistry(\n nome: string,\n registry?: MarketplaceRemoteRegistry\n): Promise<MarketplaceAnalista | null> {\n const registries = registry ? [registry] : await carregarRegistries();\n\n for (const reg of registries) {\n if (!reg.habilitado) continue;\n try {\n const analistas = await fetchRegistry(reg);\n const encontrado = analistas?.find(a => a.nome === nome);\n if (encontrado) return encontrado;\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nasync function fetchRegistry(reg: MarketplaceRemoteRegistry): Promise<MarketplaceAnalista[]> {\n switch (reg.tipo) {\n case 'url': {\n const res = await fetch(reg.url);\n if (!res.ok) throw new Error(MarketplaceRemoteMensagens.httpStatus(res.status));\n const data = await res.json() as { analistas: MarketplaceAnalista[] };\n return data.analistas || [];\n }\n case 'github': {\n const apiUrl = `https://api.github.com/repos/${reg.url}/contents/index.json`;\n const res = await fetch(apiUrl, {\n headers: { Accept: 'application/vnd.github.v3.raw' },\n });\n if (!res.ok) throw new Error(MarketplaceRemoteMensagens.githubApiHttpStatus(res.status));\n const data = await res.json() as { analistas: MarketplaceAnalista[] };\n return data.analistas || [];\n }\n default:\n return [];\n }\n}\n\nexport async function search(termo: string): Promise<MarketplaceSearchResult> {\n const resultados = await buscarNoRegistry(termo);\n return { total: resultados.length, resultados };\n}\n\nexport async function info(nome: string): Promise<MarketplaceAnalista | null> {\n return obterAnalistaDoRegistry(nome);\n}\n"]}
@@ -1,3 +1,11 @@
1
+ export type LicenseStatus = 'allowed' | 'blocked' | 'unknown';
2
+ export interface LicensePolicy {
3
+ allowedLicenses: string[];
4
+ blockedLicenses: string[];
5
+ exceptions: string[];
6
+ failOnBlocked: boolean;
7
+ failOnUnknown: boolean;
8
+ }
1
9
  export interface LicensasScanOptions {
2
10
  root?: string;
3
11
  includeDev?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"licenses.d.ts","sourceRoot":"","sources":["../../../src/types/licenses/licenses.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,WAAW,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAKD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB"}
1
+ {"version":3,"file":"licenses.d.ts","sourceRoot":"","sources":["../../../src/types/licenses/licenses.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,WAAW,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAKD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"licenses.js","sourceRoot":"","sources":["../../../src/types/licenses/licenses.ts"],"names":[],"mappings":"","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * Tipos para o módulo de licenciamento (licensas).\n */\n\nexport interface LicensasScanOptions {\n root?: string;\n includeDev?: boolean;\n}\n\nexport interface PackageInfo {\n name: string;\n version: string;\n license: string;\n repository: string | null;\n private: boolean;\n licenseArquivo: string | null;\n licenseText: string | null;\n path: string;\n}\n\nexport interface ScanResult {\n generatedAt: string;\n totalPackages: number;\n totalFiltered: number;\n licenseCounts: Record<string, number>;\n packages: PackageInfo[];\n problematic: PackageInfo[];\n}\n\nexport interface DisclaimerOptions {\n root?: string;\n disclaimerPath?: string;\n dryRun?: boolean;\n}\n\nexport interface DisclaimerAddResult {\n updatedArquivos: string[];\n}\n\nexport interface DisclaimerVerifyResult {\n missing: string[];\n}\n\nexport interface GenerateNoticesOptions {\n root?: string;\n ptBr?: boolean;\n output?: string;\n}\n\n/**\n * Metadados de pacote para renderização de notices\n */\nexport interface RenderPackageMeta {\n licenses?: string | string[];\n publisher?: string;\n email?: string;\n repository?: string;\n licenseArquivo?: string;\n path?: string;\n}\n\n/**\n * Resultado de busca de arquivo de licença\n */\nexport interface LicenseFileResult {\n file: string;\n path: string;\n text: string | null;\n}\n"]}
1
+ {"version":3,"file":"licenses.js","sourceRoot":"","sources":["../../../src/types/licenses/licenses.ts"],"names":[],"mappings":"","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * Tipos para o módulo de licenciamento (licensas).\n */\n\nexport type LicenseStatus = 'allowed' | 'blocked' | 'unknown';\n\nexport interface LicensePolicy {\n allowedLicenses: string[];\n blockedLicenses: string[];\n exceptions: string[];\n failOnBlocked: boolean;\n failOnUnknown: boolean;\n}\n\nexport interface LicensasScanOptions {\n root?: string;\n includeDev?: boolean;\n}\n\nexport interface PackageInfo {\n name: string;\n version: string;\n license: string;\n repository: string | null;\n private: boolean;\n licenseArquivo: string | null;\n licenseText: string | null;\n path: string;\n}\n\nexport interface ScanResult {\n generatedAt: string;\n totalPackages: number;\n totalFiltered: number;\n licenseCounts: Record<string, number>;\n packages: PackageInfo[];\n problematic: PackageInfo[];\n}\n\nexport interface DisclaimerOptions {\n root?: string;\n disclaimerPath?: string;\n dryRun?: boolean;\n}\n\nexport interface DisclaimerAddResult {\n updatedArquivos: string[];\n}\n\nexport interface DisclaimerVerifyResult {\n missing: string[];\n}\n\nexport interface GenerateNoticesOptions {\n root?: string;\n ptBr?: boolean;\n output?: string;\n}\n\n/**\n * Metadados de pacote para renderização de notices\n */\nexport interface RenderPackageMeta {\n licenses?: string | string[];\n publisher?: string;\n email?: string;\n repository?: string;\n licenseArquivo?: string;\n path?: string;\n}\n\n/**\n * Resultado de busca de arquivo de licença\n */\nexport interface LicenseFileResult {\n file: string;\n path: string;\n text: string | null;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tutanus",
3
- "version": "0.13.1",
3
+ "version": "0.13.2",
4
4
  "type": "module",
5
5
  "description": "C.L.I modular para análise, diagnóstico e manutenção de projetos JavaScript/TypeScript e multi-stack leve",
6
6
  "author": "Black Diaz",
@@ -78,7 +78,7 @@
78
78
  "reverter:listar": "tutanus reverter listar",
79
79
  "reverter:status": "tutanus reverter status",
80
80
  "headers:spdx": "find src -name \"*.ts\" -exec grep -L \"SPDX-License-Identifier\" {} \\; 2>/dev/null | head -20",
81
- "license-check": "npx license-checker-rseidelsohn --production --onlyAllow=\"MIT;MIT-0;ISC;BSD-2-Clause;BSD-3-Clause;Apache-2.0;0BSD;Unlicense;CC0-1.0;BlueOak-1.0.0;Python-2.0;Zlib;CC-BY-3.0;CC-BY-4.0;Artistic-2.0;BSD-2-Clause-Patent;BSL-1.0;Unicode-DFS-2015;Unicode-DFS-2016;Unicode-3.0\""
81
+ "license-check": "tutanus licencas scan"
82
82
  },
83
83
  "keywords": [
84
84
  "cli",
@@ -101,19 +101,18 @@
101
101
  ],
102
102
  "repository": {
103
103
  "type": "git",
104
- "url": "git+https://github.com/mocoto-strike/tutanus.git"
104
+ "url": "git+https://github.com/mocoto-geleia/tutanus.git"
105
105
  },
106
106
  "bugs": {
107
- "url": "https://github.com/mocoto-strike/tutanus/issues"
107
+ "url": "https://github.com/mocoto-geleia/tutanus/issues"
108
108
  },
109
- "homepage": "https://github.com/mocoto-strike/tutanus#readme",
109
+ "homepage": "https://github.com/mocoto-geleia/tutanus#readme",
110
110
  "files": [
111
111
  "dist",
112
112
  "out",
113
113
  "README.md",
114
114
  "LICENSE*",
115
- "THIRD-PARTY-NOTICES.txt",
116
- "scripts/license.json"
115
+ "THIRD-PARTY-NOTICES.txt"
117
116
  ],
118
117
  "dependencies": {
119
118
  "@babel/parser": "7.29.7",
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html lang="pt-BR"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/3uta7d_6k863-.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/1jq4o6yq14o4c.js"/><script src="/_next/static/chunks/15orcrkp-_9ct.js" async=""></script><script src="/_next/static/chunks/3n7dm2ojtyzwn.js" async=""></script><script src="/_next/static/chunks/1061ff024jzvu.js" async=""></script><script src="/_next/static/chunks/turbopack-2xb6mmb6_q43u.js" async=""></script><script src="/_next/static/chunks/05-c3ty_6dwfk.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" as="style" crossorigin="anonymous" referrerPolicy="no-referrer"/><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Tutanus — CLI de Análise, Diagnóstico e Manutenção de Projetos</title><meta name="description" content="CLI modular para análise estática, diagnóstico de segurança e manutenção de projetos JavaScript/TypeScript e multi-stack. Suporte a CI/CD, plugins, Guardian e mais."/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" crossorigin="anonymous" referrerPolicy="no-referrer"/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><main class="flex-1 w-full"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main><script src="/_next/static/chunks/1jq4o6yq14o4c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/3uta7d_6k863-.css\",\"style\"]\n:HL[\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css\",\"style\",{\"crossOrigin\":\"anonymous\",\"referrerPolicy\":\"no-referrer\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/3uta7d_6k863-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14mrh2-p_w84d.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"pt-BR\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"link\",null,{\"rel\":\"stylesheet\",\"href\":\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css\",\"crossOrigin\":\"anonymous\",\"referrerPolicy\":\"no-referrer\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"main\",null,{\"className\":\"flex-1 w-full\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/3uta7d_6k863-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"7AicuowOpmCuGWjCpsQMB\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"Tutanus — CLI de Análise, Diagnóstico e Manutenção de Projetos\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"CLI modular para análise estática, diagnóstico de segurança e manutenção de projetos JavaScript/TypeScript e multi-stack. Suporte a CI/CD, plugins, Guardian e mais.\"}]]\n"])</script></body></html>
package/out/404.html DELETED
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html lang="pt-BR"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/3uta7d_6k863-.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/1jq4o6yq14o4c.js"/><script src="/_next/static/chunks/15orcrkp-_9ct.js" async=""></script><script src="/_next/static/chunks/3n7dm2ojtyzwn.js" async=""></script><script src="/_next/static/chunks/1061ff024jzvu.js" async=""></script><script src="/_next/static/chunks/turbopack-2xb6mmb6_q43u.js" async=""></script><script src="/_next/static/chunks/05-c3ty_6dwfk.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" as="style" crossorigin="anonymous" referrerPolicy="no-referrer"/><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Tutanus — CLI de Análise, Diagnóstico e Manutenção de Projetos</title><meta name="description" content="CLI modular para análise estática, diagnóstico de segurança e manutenção de projetos JavaScript/TypeScript e multi-stack. Suporte a CI/CD, plugins, Guardian e mais."/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" crossorigin="anonymous" referrerPolicy="no-referrer"/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><main class="flex-1 w-full"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main><script src="/_next/static/chunks/1jq4o6yq14o4c.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/3uta7d_6k863-.css\",\"style\"]\n:HL[\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css\",\"style\",{\"crossOrigin\":\"anonymous\",\"referrerPolicy\":\"no-referrer\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/3uta7d_6k863-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14mrh2-p_w84d.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"pt-BR\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"link\",null,{\"rel\":\"stylesheet\",\"href\":\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css\",\"crossOrigin\":\"anonymous\",\"referrerPolicy\":\"no-referrer\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"main\",null,{\"className\":\"flex-1 w-full\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/3uta7d_6k863-.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"7AicuowOpmCuGWjCpsQMB\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"Tutanus — CLI de Análise, Diagnóstico e Manutenção de Projetos\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"CLI modular para análise estática, diagnóstico de segurança e manutenção de projetos JavaScript/TypeScript e multi-stack. Suporte a CI/CD, plugins, Guardian e mais.\"}]]\n"])</script></body></html>
@@ -1,25 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[45544,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/14mrh2-p_w84d.js","/_next/static/chunks/39aw8cj-oq89z.js"],"InstallButton"]
3
- 3:I[45544,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/14mrh2-p_w84d.js","/_next/static/chunks/39aw8cj-oq89z.js"],"InstallHeroButton"]
4
- 4:I[33545,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/14mrh2-p_w84d.js","/_next/static/chunks/39aw8cj-oq89z.js"],"TiltCard"]
5
- 15:I[97367,["/_next/static/chunks/05-c3ty_6dwfk.js","/_next/static/chunks/14mrh2-p_w84d.js"],"OutletBoundary"]
6
- 16:"$Sreact.suspense"
7
- :HL["/_next/static/media/icon-1.008jpsm4iakzh.png","image"]
8
- 0:{"rsc":["$","$1","c",{"children":[["$","div",null,{"className":"min-h-screen flex flex-col bg-canvas","children":[["$","header",null,{"className":"flex items-center justify-between px-6 py-4 border-b border-border max-w-7xl mx-auto w-full","children":[["$","div",null,{"className":"flex items-center gap-3","children":[["$","i",null,{"className":"fa-solid fa-fire text-accent text-xl"}],["$","span",null,{"className":"text-xl font-bold text-emphasis","children":"Tutanus CLI"}],["$","span",null,{"className":"px-2 py-0.5 text-[10px] font-mono uppercase tracking-wider rounded-full bg-surface border border-border text-muted","children":"v0.13.0"}]]}],["$","div",null,{"className":"flex items-center gap-3","children":[["$","a",null,{"href":"https://github.com/mocoto-strike/tutanus","target":"_blank","rel":"noopener noreferrer","className":"btn text-xs","children":[["$","i",null,{"className":"fa-brands fa-github"}],"GitHub"]}],["$","$L2",null,{}]]}]]}],["$","main",null,{"className":"flex-1","children":[["$","section",null,{"className":"max-w-4xl mx-auto px-6 pt-24 pb-16 text-center","children":[["$","div",null,{"className":"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-accent/10 border border-accent/20 text-accent text-xs font-medium mb-6","children":[["$","i",null,{"className":"fa-solid fa-star text-[10px]"}],"v0.13.0 — Estável"]}],["$","h1",null,{"className":"text-4xl sm:text-5xl font-bold text-emphasis leading-tight mb-4","children":["CLI modular para"," ",["$","span",null,{"className":"text-accent","children":"análise, diagnóstico"}],["$","br",null,{}],"e manutenção de projetos"]}],["$","p",null,{"className":"text-base sm:text-lg text-muted max-w-2xl mx-auto mb-10 leading-relaxed","children":"Tutanus analisa código JavaScript/TypeScript e multi-stack com suporte a mais de 15 linguagens. Detecta problemas de qualidade, segurança e arquitetura, aplica correções seguras e monitora a saúde dos seus projetos com o Guardian."}],["$","div",null,{"className":"flex flex-wrap items-center justify-center gap-4","children":[["$","code",null,{"className":"px-4 py-2.5 rounded-lg bg-surface border border-border text-sm text-emphasis font-mono flex items-center gap-2","children":[["$","i",null,{"className":"fa-solid fa-terminal text-accent text-xs"}],"npm install tutanus"]}],["$","span",null,{"className":"text-muted text-sm","children":"ou"}],["$","$L3",null,{}]]}]]}],["$","section",null,{"className":"max-w-6xl mx-auto px-6 pb-20","children":[["$","div",null,{"className":"flex items-center gap-3 mb-8","children":[["$","i",null,{"className":"fa-solid fa-cubes text-accent text-lg"}],["$","h2",null,{"className":"text-xl font-bold text-emphasis","children":"Recursos"}],["$","div",null,{"className":"flex-1 h-px bg-border"}]]}],["$","div",null,{"className":"grid sm:grid-cols-2 lg:grid-cols-3 gap-4","children":[["$","$L4","Análise Estática Multi-Stack",{"className":"group p-5 rounded-xl bg-surface border border-border hover:border-accent/40 hover:bg-surface/80 transition-all duration-200","children":[["$","div",null,{"className":"w-10 h-10 rounded-lg bg-accent/10 flex items-center justify-center mb-3 group-hover:bg-accent/20 transition-colors","children":["$","i",null,{"className":"fa-solid fa-magnifying-glass-chart text-accent text-base"}]}],["$","h3",null,{"className":"text-emphasis font-semibold mb-1.5 text-sm","children":"Análise Estática Multi-Stack"}],["$","p",null,{"className":"text-sm text-muted leading-relaxed","children":"Escaneia JS/TS, HTML, CSS, Python, Go, Rust, Java, Shell, SQL e mais. Detecta bugs, code smells, duplicação e más práticas em dezenas de linguagens."}]]}],["$","$L4","Correção Automática Segura",{"className":"group p-5 rounded-xl bg-surface border border-border hover:border-accent/40 hover:bg-surface/80 transition-all duration-200","children":[["$","div",null,{"className":"w-10 h-10 rounded-lg bg-accent/10 flex items-center justify-center mb-3 group-hover:bg-accent/20 transition-colors","children":"$L5"}],"$L6","$L7"]}],"$L8","$L9","$La","$Lb","$Lc","$Ld","$Le"]}]]}],"$Lf","$L10","$L11"]}],"$L12"]}],["$L13"],"$L14"]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"7AicuowOpmCuGWjCpsQMB"}
9
- 5:["$","i",null,{"className":"fa-solid fa-wand-magic-sparkles text-accent text-base"}]
10
- 6:["$","h3",null,{"className":"text-emphasis font-semibold mb-1.5 text-sm","children":"Correção Automática Segura"}]
11
- 7:["$","p",null,{"className":"text-sm text-muted leading-relaxed","children":"Aplica quick fixes com modo seguro (safe mode). Cria PRs automaticamente com as correções identificadas sem side effects."}]
12
- 8:["$","$L4","Monitoramento Guardian",{"className":"group p-5 rounded-xl bg-surface border border-border hover:border-accent/40 hover:bg-surface/80 transition-all duration-200","children":[["$","div",null,{"className":"w-10 h-10 rounded-lg bg-accent/10 flex items-center justify-center mb-3 group-hover:bg-accent/20 transition-colors","children":["$","i",null,{"className":"fa-solid fa-shield-halved text-accent text-base"}]}],["$","h3",null,{"className":"text-emphasis font-semibold mb-1.5 text-sm","children":"Monitoramento Guardian"}],["$","p",null,{"className":"text-sm text-muted leading-relaxed","children":"Monitora a saúde do projeto continuamente. Estabelece baselines, compara mudanças e alerta sobre regressões antes que virem problema."}]]}]
13
- 9:["$","$L4","Análise de CI/CD",{"className":"group p-5 rounded-xl bg-surface border border-border hover:border-accent/40 hover:bg-surface/80 transition-all duration-200","children":[["$","div",null,{"className":"w-10 h-10 rounded-lg bg-accent/10 flex items-center justify-center mb-3 group-hover:bg-accent/20 transition-colors","children":["$","i",null,{"className":"fa-solid fa-gears text-accent text-base"}]}],["$","h3",null,{"className":"text-emphasis font-semibold mb-1.5 text-sm","children":"Análise de CI/CD"}],["$","p",null,{"className":"text-sm text-muted leading-relaxed","children":"Analisa workflows do GitHub Actions, GitLab CI, CircleCI, Jenkins e Azure Pipelines. Detecta falhas de configuração e segurança nos pipelines."}]]}]
14
- a:["$","$L4","Segurança e Compliance",{"className":"group p-5 rounded-xl bg-surface border border-border hover:border-accent/40 hover:bg-surface/80 transition-all duration-200","children":[["$","div",null,{"className":"w-10 h-10 rounded-lg bg-accent/10 flex items-center justify-center mb-3 group-hover:bg-accent/20 transition-colors","children":["$","i",null,{"className":"fa-solid fa-lock text-accent text-base"}]}],["$","h3",null,{"className":"text-emphasis font-semibold mb-1.5 text-sm","children":"Segurança e Compliance"}],["$","p",null,{"className":"text-sm text-muted leading-relaxed","children":"Varre vulnerabilidades, licenças e credenciais expostas. Gera relatórios de compliance com suporte a SBOM e THIRD-PARTY-NOTICES."}]]}]
15
- b:["$","$L4","Reestruturação Inteligente",{"className":"group p-5 rounded-xl bg-surface border border-border hover:border-accent/40 hover:bg-surface/80 transition-all duration-200","children":[["$","div",null,{"className":"w-10 h-10 rounded-lg bg-accent/10 flex items-center justify-center mb-3 group-hover:bg-accent/20 transition-colors","children":["$","i",null,{"className":"fa-solid fa-sitemap text-accent text-base"}]}],["$","h3",null,{"className":"text-emphasis font-semibold mb-1.5 text-sm","children":"Reestruturação Inteligente"}],["$","p",null,{"className":"text-sm text-muted leading-relaxed","children":"Reorganiza arquivos, renomeia símbolos, remove código morto, otimiza imports e aplica planos de reestruturação com segurança."}]]}]
16
- c:["$","$L4","Sistema de Plugins",{"className":"group p-5 rounded-xl bg-surface border border-border hover:border-accent/40 hover:bg-surface/80 transition-all duration-200","children":[["$","div",null,{"className":"w-10 h-10 rounded-lg bg-accent/10 flex items-center justify-center mb-3 group-hover:bg-accent/20 transition-colors","children":["$","i",null,{"className":"fa-solid fa-puzzle-piece text-accent text-base"}]}],["$","h3",null,{"className":"text-emphasis font-semibold mb-1.5 text-sm","children":"Sistema de Plugins"}],["$","p",null,{"className":"text-sm text-muted leading-relaxed","children":"Arquitetura extensível via registry pattern. Crie analistas, zeladores e processadores sem modificar o core. Marketplace comunitário."}]]}]
17
- d:["$","$L4","SDK Programático",{"className":"group p-5 rounded-xl bg-surface border border-border hover:border-accent/40 hover:bg-surface/80 transition-all duration-200","children":[["$","div",null,{"className":"w-10 h-10 rounded-lg bg-accent/10 flex items-center justify-center mb-3 group-hover:bg-accent/20 transition-colors","children":["$","i",null,{"className":"fa-solid fa-code text-accent text-base"}]}],["$","h3",null,{"className":"text-emphasis font-semibold mb-1.5 text-sm","children":"SDK Programático"}],["$","p",null,{"className":"text-sm text-muted leading-relaxed","children":"API pública em tutanus/sdk com analyzeFile e analyzeProject. Integre Tutanus em suas próprias ferramentas e scripts."}]]}]
18
- e:["$","$L4","i18n e Relatórios",{"className":"group p-5 rounded-xl bg-surface border border-border hover:border-accent/40 hover:bg-surface/80 transition-all duration-200","children":[["$","div",null,{"className":"w-10 h-10 rounded-lg bg-accent/10 flex items-center justify-center mb-3 group-hover:bg-accent/20 transition-colors","children":["$","i",null,{"className":"fa-solid fa-language text-accent text-base"}]}],["$","h3",null,{"className":"text-emphasis font-semibold mb-1.5 text-sm","children":"i18n e Relatórios"}],["$","p",null,{"className":"text-sm text-muted leading-relaxed","children":"Suporte a português, inglês, chinês e japonês. Gera relatórios em JSON, Markdown e modo executivo para diferentes audiências."}]]}]
19
- f:["$","section",null,{"className":"max-w-4xl mx-auto px-6 pb-20","children":[["$","div",null,{"className":"flex items-center gap-3 mb-8","children":[["$","i",null,{"className":"fa-solid fa-route text-accent text-lg"}],["$","h2",null,{"className":"text-xl font-bold text-emphasis","children":"Como usar"}],["$","div",null,{"className":"flex-1 h-px bg-border"}]]}],["$","div",null,{"className":"grid sm:grid-cols-3 gap-4","children":[["$","$L4","0",{"className":"p-6 rounded-xl bg-surface border border-border relative overflow-hidden group hover:border-accent/40 transition-all","children":[["$","div",null,{"className":"absolute -top-6 -right-6 w-16 h-16 bg-accent/5 rounded-bl-3xl group-hover:bg-accent/10 transition-colors"}],["$","div",null,{"className":"w-9 h-9 rounded-full bg-accent/10 text-accent font-bold text-sm flex items-center justify-center mb-3","children":1}],["$","p",null,{"className":"text-sm text-muted mb-3","children":"Instalar o CLI"}],["$","code",null,{"className":"flex items-center gap-2 px-3 py-2 rounded-lg bg-canvas border border-border text-xs text-emphasis font-mono whitespace-nowrap overflow-x-auto","children":[["$","i",null,{"className":"fa-solid fa-terminal text-accent"}],"npm install tutanus"]}]]}],["$","$L4","1",{"className":"p-6 rounded-xl bg-surface border border-border relative overflow-hidden group hover:border-accent/40 transition-all","children":[["$","div",null,{"className":"absolute -top-6 -right-6 w-16 h-16 bg-accent/5 rounded-bl-3xl group-hover:bg-accent/10 transition-colors"}],["$","div",null,{"className":"w-9 h-9 rounded-full bg-accent/10 text-accent font-bold text-sm flex items-center justify-center mb-3","children":2}],["$","p",null,{"className":"text-sm text-muted mb-3","children":"Analisar projeto"}],["$","code",null,{"className":"flex items-center gap-2 px-3 py-2 rounded-lg bg-canvas border border-border text-xs text-emphasis font-mono whitespace-nowrap overflow-x-auto","children":[["$","i",null,{"className":"fa-solid fa-stethoscope text-accent"}],"tutanus diagnosticar"]}]]}],["$","$L4","2",{"className":"p-6 rounded-xl bg-surface border border-border relative overflow-hidden group hover:border-accent/40 transition-all","children":[["$","div",null,{"className":"absolute -top-6 -right-6 w-16 h-16 bg-accent/5 rounded-bl-3xl group-hover:bg-accent/10 transition-colors"}],["$","div",null,{"className":"w-9 h-9 rounded-full bg-accent/10 text-accent font-bold text-sm flex items-center justify-center mb-3","children":3}],["$","p",null,{"className":"text-sm text-muted mb-3","children":"Monitorar saúde"}],["$","code",null,{"className":"flex items-center gap-2 px-3 py-2 rounded-lg bg-canvas border border-border text-xs text-emphasis font-mono whitespace-nowrap overflow-x-auto","children":[["$","i",null,{"className":"fa-solid fa-chart-line text-accent"}],"tutanus guardian --accept-baseline"]}]]}]]}]]}]
20
- 10:["$","section",null,{"className":"border-t border-border","children":["$","div",null,{"className":"max-w-6xl mx-auto px-6 py-16","children":[["$","div",null,{"className":"flex items-center gap-3 mb-8","children":[["$","i",null,{"className":"fa-solid fa-diagram-project text-accent text-lg"}],["$","h2",null,{"className":"text-xl font-bold text-emphasis","children":"Arquitetura"}],["$","div",null,{"className":"flex-1 h-px bg-border"}]]}],["$","div",null,{"className":"grid sm:grid-cols-2 lg:grid-cols-4 gap-4","children":[["$","$L4","CLI",{"className":"p-4 rounded-xl bg-surface border border-border text-center hover:border-accent/40 transition-colors","children":[["$","i",null,{"className":"fa-solid fa-terminal text-accent text-xl mb-2"}],["$","h3",null,{"className":"text-emphasis font-semibold text-sm","children":"CLI"}],["$","p",null,{"className":"text-xs text-muted mt-1","children":"Commander + helpers"}]]}],["$","$L4","Core",{"className":"p-4 rounded-xl bg-surface border border-border text-center hover:border-accent/40 transition-colors","children":[["$","i",null,{"className":"fa-solid fa-microchip text-accent text-xl mb-2"}],["$","h3",null,{"className":"text-emphasis font-semibold text-sm","children":"Core"}],["$","p",null,{"className":"text-xs text-muted mt-1","children":"Config, parsing, registry"}]]}],["$","$L4","Analistas",{"className":"p-4 rounded-xl bg-surface border border-border text-center hover:border-accent/40 transition-colors","children":[["$","i",null,{"className":"fa-solid fa-flask text-accent text-xl mb-2"}],["$","h3",null,{"className":"text-emphasis font-semibold text-sm","children":"Analistas"}],["$","p",null,{"className":"text-xs text-muted mt-1","children":"Detectores pluggáveis"}]]}],["$","$L4","Guardian",{"className":"p-4 rounded-xl bg-surface border border-border text-center hover:border-accent/40 transition-colors","children":[["$","i",null,{"className":"fa-solid fa-shield text-accent text-xl mb-2"}],["$","h3",null,{"className":"text-emphasis font-semibold text-sm","children":"Guardian"}],["$","p",null,{"className":"text-xs text-muted mt-1","children":"Baseline e diff"}]]}]]}]]}]}]
21
- 11:["$","section",null,{"className":"border-t border-border","children":["$","div",null,{"className":"max-w-4xl mx-auto px-6 py-16 text-center","children":[["$","div",null,{"className":"flex items-center gap-3 mb-6 justify-center","children":[["$","i",null,{"className":"fa-solid fa-blog text-accent text-lg"}],["$","h2",null,{"className":"text-xl font-bold text-emphasis","children":"Blog Black Diaz"}],["$","div",null,{"className":"flex-1 h-px bg-border max-w-20"}]]}],["$","p",null,{"className":"text-sm text-muted mb-6 max-w-2xl mx-auto leading-relaxed","children":"Recursos gratuitos para personalização de perfil GitHub, conteúdo sobre tecnologia e tudo sobre o universo da programação. Fique por dentro das novidades e atualizações."}],["$","a",null,{"href":"https://black-diaz.vercel.app","target":"_blank","rel":"noopener noreferrer","className":"inline-flex items-center gap-2 px-5 py-2.5 rounded-lg bg-accent text-white text-sm font-semibold hover:bg-accent/90 transition-colors","children":[["$","i",null,{"className":"fa-solid fa-arrow-up-right-from-square"}],"Acessar Blog"]}]]}]}]
22
- 12:["$","footer",null,{"className":"border-t border-border","children":["$","div",null,{"className":"max-w-6xl mx-auto px-6 py-8","children":["$","div",null,{"className":"flex flex-col sm:flex-row items-center justify-between gap-4","children":[["$","div",null,{"className":"flex items-center gap-3","children":[["$","img",null,{"src":"/_next/static/media/icon-1.008jpsm4iakzh.png","alt":"Tutanus","className":"w-5 h-5"}],["$","span",null,{"className":"text-sm font-semibold text-emphasis","children":"Black Diaz"}],["$","span",null,{"className":"text-xs text-muted","children":"MIT-0"}]]}],["$","div",null,{"className":"flex items-center gap-5 text-xs text-muted","children":[["$","a",null,{"href":"https://github.com/mocoto-strike","target":"_blank","rel":"noopener noreferrer","className":"hover:text-accent transition-colors","children":[["$","i",null,{"className":"fa-brands fa-github mr-1"}],"GitHub"]}],["$","a",null,{"href":"/privacy-policy","className":"hover:text-accent transition-colors","children":[["$","i",null,{"className":"fa-solid fa-shield mr-1"}],"Privacidade"]}],["$","a",null,{"href":"/changelog","className":"hover:text-accent transition-colors","children":[["$","i",null,{"className":"fa-solid fa-timeline mr-1"}],"Changelog"]}],["$","a",null,{"href":"/terms-of-use","className":"hover:text-accent transition-colors","children":[["$","i",null,{"className":"fa-solid fa-file-lines mr-1"}],"Termos"]}]]}]]}]}]}]
23
- 13:["$","script","script-0",{"src":"/_next/static/chunks/39aw8cj-oq89z.js","async":true}]
24
- 14:["$","$L15",null,{"children":["$","$16",null,{"name":"Next.MetadataOutlet","children":"$@17"}]}]
25
- 17:null