@silasfmartins/testhub 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/.github/copilot-instructions.md +520 -0
  2. package/biome.json +37 -0
  3. package/dist/index.d.ts +45 -0
  4. package/dist/index.js +169 -0
  5. package/dist/scripts/consumer-postinstall.d.ts +15 -0
  6. package/dist/scripts/consumer-postinstall.js +785 -0
  7. package/dist/scripts/generate-docs.d.ts +16 -0
  8. package/dist/scripts/generate-docs.js +1363 -0
  9. package/dist/scripts/generate-index.d.ts +2 -0
  10. package/dist/scripts/generate-index.js +314 -0
  11. package/dist/scripts/init-api.d.ts +2 -0
  12. package/dist/scripts/init-api.js +525 -0
  13. package/dist/scripts/init-banco.d.ts +2 -0
  14. package/dist/scripts/init-banco.js +347 -0
  15. package/dist/scripts/init-frontend.d.ts +2 -0
  16. package/dist/scripts/init-frontend.js +627 -0
  17. package/dist/scripts/init-mobile.d.ts +2 -0
  18. package/dist/scripts/init-mobile.js +481 -0
  19. package/dist/scripts/init-scenarios.d.ts +2 -0
  20. package/dist/scripts/init-scenarios.js +846 -0
  21. package/dist/scripts/init-ssh.d.ts +2 -0
  22. package/dist/scripts/init-ssh.js +639 -0
  23. package/dist/scripts/package-versions.d.ts +57 -0
  24. package/dist/scripts/package-versions.js +768 -0
  25. package/dist/scripts/postinstall.d.ts +1 -0
  26. package/dist/scripts/postinstall.js +527 -0
  27. package/dist/scripts/robust-build.d.ts +7 -0
  28. package/dist/scripts/robust-build.js +88 -0
  29. package/dist/scripts/setup-local-packages.d.ts +31 -0
  30. package/dist/scripts/setup-local-packages.js +237 -0
  31. package/dist/scripts/smart-override.d.ts +2 -0
  32. package/dist/scripts/smart-override.js +1360 -0
  33. package/dist/scripts/sync-configs.d.ts +27 -0
  34. package/dist/scripts/sync-configs.js +248 -0
  35. package/dist/scripts/test-biome-parse.d.ts +5 -0
  36. package/dist/scripts/test-biome-parse.js +84 -0
  37. package/dist/scripts/ultracite-setup.d.ts +4 -0
  38. package/dist/scripts/ultracite-setup.js +310 -0
  39. package/dist/scripts/update-all-init-scripts.d.ts +2 -0
  40. package/dist/scripts/update-all-init-scripts.js +52 -0
  41. package/dist/scripts/update-biome-schema.d.ts +15 -0
  42. package/dist/scripts/update-biome-schema.js +124 -0
  43. package/dist/src/AutoCoreFacade.d.ts +145 -0
  44. package/dist/src/AutoCoreFacade.js +217 -0
  45. package/dist/src/api/ApiActions.d.ts +297 -0
  46. package/dist/src/api/ApiActions.js +1905 -0
  47. package/dist/src/api/Certificate.d.ts +60 -0
  48. package/dist/src/api/Certificate.js +79 -0
  49. package/dist/src/api/JsonResponse.d.ts +116 -0
  50. package/dist/src/api/JsonResponse.js +206 -0
  51. package/dist/src/appium/DeviceFarmViewer.d.ts +79 -0
  52. package/dist/src/appium/DeviceFarmViewer.js +1083 -0
  53. package/dist/src/appium/MobileActions.d.ts +347 -0
  54. package/dist/src/appium/MobileActions.js +1632 -0
  55. package/dist/src/appium/MobileConnection.d.ts +160 -0
  56. package/dist/src/appium/MobileConnection.js +772 -0
  57. package/dist/src/config/envLoader.d.ts +123 -0
  58. package/dist/src/config/envLoader.js +361 -0
  59. package/dist/src/config/jest-safe-setup.d.ts +19 -0
  60. package/dist/src/config/jest-safe-setup.js +369 -0
  61. package/dist/src/config/timeouts.d.ts +32 -0
  62. package/dist/src/config/timeouts.js +38 -0
  63. package/dist/src/desktop/DesktopActions.d.ts +46 -0
  64. package/dist/src/desktop/DesktopActions.js +398 -0
  65. package/dist/src/desktop/DesktopConnection.d.ts +32 -0
  66. package/dist/src/desktop/DesktopConnection.js +84 -0
  67. package/dist/src/domain/entities/TestExecution.d.ts +117 -0
  68. package/dist/src/domain/entities/TestExecution.js +150 -0
  69. package/dist/src/domain/entities/TestReport.d.ts +114 -0
  70. package/dist/src/domain/entities/TestReport.js +179 -0
  71. package/dist/src/domain/repositories/ITestRepository.d.ts +196 -0
  72. package/dist/src/domain/repositories/ITestRepository.js +14 -0
  73. package/dist/src/domain/schemas/ValidationSchemas.d.ts +159 -0
  74. package/dist/src/domain/schemas/ValidationSchemas.js +181 -0
  75. package/dist/src/functions/errors/BaseError.d.ts +78 -0
  76. package/dist/src/functions/errors/BaseError.js +245 -0
  77. package/dist/src/functions/errors/ConfigurationError.d.ts +16 -0
  78. package/dist/src/functions/errors/ConfigurationError.js +48 -0
  79. package/dist/src/functions/errors/ErrorCatalog.d.ts +148 -0
  80. package/dist/src/functions/errors/ErrorCatalog.js +157 -0
  81. package/dist/src/functions/errors/GlobalErrorHandler.d.ts +101 -0
  82. package/dist/src/functions/errors/GlobalErrorHandler.js +281 -0
  83. package/dist/src/functions/errors/IntegrationError.d.ts +17 -0
  84. package/dist/src/functions/errors/IntegrationError.js +51 -0
  85. package/dist/src/functions/errors/SecurityError.d.ts +14 -0
  86. package/dist/src/functions/errors/SecurityError.js +42 -0
  87. package/dist/src/functions/errors/SystemError.d.ts +12 -0
  88. package/dist/src/functions/errors/SystemError.js +36 -0
  89. package/dist/src/functions/errors/ValidationError.d.ts +14 -0
  90. package/dist/src/functions/errors/ValidationError.js +61 -0
  91. package/dist/src/functions/errors/index.d.ts +12 -0
  92. package/dist/src/functions/errors/index.js +13 -0
  93. package/dist/src/global-setup.d.ts +1 -0
  94. package/dist/src/global-setup.js +1037 -0
  95. package/dist/src/helpers/BancoActions.d.ts +188 -0
  96. package/dist/src/helpers/BancoActions.js +581 -0
  97. package/dist/src/helpers/EnviromentHelper.d.ts +17 -0
  98. package/dist/src/helpers/EnviromentHelper.js +66 -0
  99. package/dist/src/helpers/ParallelExecutionHelper.d.ts +183 -0
  100. package/dist/src/helpers/ParallelExecutionHelper.js +375 -0
  101. package/dist/src/helpers/SyncSignal.d.ts +15 -0
  102. package/dist/src/helpers/SyncSignal.js +44 -0
  103. package/dist/src/hubdocs/CategoryDetector.d.ts +83 -0
  104. package/dist/src/hubdocs/CategoryDetector.js +401 -0
  105. package/dist/src/hubdocs/DirectStatementInterceptor.d.ts +54 -0
  106. package/dist/src/hubdocs/DirectStatementInterceptor.js +243 -0
  107. package/dist/src/hubdocs/ExecutionTracker.d.ts +107 -0
  108. package/dist/src/hubdocs/ExecutionTracker.js +702 -0
  109. package/dist/src/hubdocs/HubDocs.d.ts +395 -0
  110. package/dist/src/hubdocs/HubDocs.js +3586 -0
  111. package/dist/src/hubdocs/StatementMethodFilter.d.ts +71 -0
  112. package/dist/src/hubdocs/StatementMethodFilter.js +618 -0
  113. package/dist/src/hubdocs/StatementTracker.d.ts +417 -0
  114. package/dist/src/hubdocs/StatementTracker.js +2419 -0
  115. package/dist/src/hubdocs/SwaggerGenerator.d.ts +59 -0
  116. package/dist/src/hubdocs/SwaggerGenerator.js +405 -0
  117. package/dist/src/hubdocs/index.d.ts +9 -0
  118. package/dist/src/hubdocs/index.js +9 -0
  119. package/dist/src/hubdocs/types.d.ts +114 -0
  120. package/dist/src/hubdocs/types.js +5 -0
  121. package/dist/src/infrastructure/DependencyContainer.d.ts +142 -0
  122. package/dist/src/infrastructure/DependencyContainer.js +250 -0
  123. package/dist/src/infrastructure/adapters/AppiumAdapter.d.ts +168 -0
  124. package/dist/src/infrastructure/adapters/AppiumAdapter.js +468 -0
  125. package/dist/src/infrastructure/adapters/OracleAdapter.d.ts +150 -0
  126. package/dist/src/infrastructure/adapters/OracleAdapter.js +388 -0
  127. package/dist/src/infrastructure/adapters/PlaywrightAdapter.d.ts +192 -0
  128. package/dist/src/infrastructure/adapters/PlaywrightAdapter.js +382 -0
  129. package/dist/src/infrastructure/adapters/SSHAdapter.d.ts +141 -0
  130. package/dist/src/infrastructure/adapters/SSHAdapter.js +428 -0
  131. package/dist/src/interfaces.d.ts +501 -0
  132. package/dist/src/interfaces.js +25 -0
  133. package/dist/src/internal/fakes/__fake-actions__.d.ts +17 -0
  134. package/dist/src/internal/fakes/__fake-actions__.js +21 -0
  135. package/dist/src/internal/fakes/__forbidden__.d.ts +10 -0
  136. package/dist/src/internal/fakes/__forbidden__.js +18 -0
  137. package/dist/src/internal/fakes/__honeypot__.d.ts +15 -0
  138. package/dist/src/internal/fakes/__honeypot__.js +24 -0
  139. package/dist/src/octane/OctaneReporter.d.ts +13 -0
  140. package/dist/src/octane/OctaneReporter.js +61 -0
  141. package/dist/src/playwright/CryptoActions.d.ts +20 -0
  142. package/dist/src/playwright/CryptoActions.js +75 -0
  143. package/dist/src/playwright/EnhancedWebActions.d.ts +7 -0
  144. package/dist/src/playwright/EnhancedWebActions.js +65 -0
  145. package/dist/src/playwright/WebActions.d.ts +1599 -0
  146. package/dist/src/playwright/WebActions.js +11788 -0
  147. package/dist/src/playwright/actions/ActionTimeline.d.ts +36 -0
  148. package/dist/src/playwright/actions/ActionTimeline.js +101 -0
  149. package/dist/src/playwright/actions/RecoveryQueue.d.ts +82 -0
  150. package/dist/src/playwright/actions/RecoveryQueue.js +130 -0
  151. package/dist/src/playwright/actions/SelectorCache.d.ts +53 -0
  152. package/dist/src/playwright/actions/SelectorCache.js +96 -0
  153. package/dist/src/playwright/actions/index.d.ts +13 -0
  154. package/dist/src/playwright/actions/index.js +14 -0
  155. package/dist/src/playwright/actions/types.d.ts +147 -0
  156. package/dist/src/playwright/actions/types.js +5 -0
  157. package/dist/src/playwright/fixtures.d.ts +112 -0
  158. package/dist/src/playwright/fixtures.js +718 -0
  159. package/dist/src/playwright/network-logs-reporter.d.ts +7 -0
  160. package/dist/src/playwright/network-logs-reporter.js +66 -0
  161. package/dist/src/playwright/registerRecoveryWrappers.d.ts +1 -0
  162. package/dist/src/playwright/registerRecoveryWrappers.js +54 -0
  163. package/dist/src/security/BuildSecurity.d.ts +12 -0
  164. package/dist/src/security/BuildSecurity.js +138 -0
  165. package/dist/src/security/EulaProtection.d.ts +70 -0
  166. package/dist/src/security/EulaProtection.js +155 -0
  167. package/dist/src/security/HoneypotManager.d.ts +46 -0
  168. package/dist/src/security/HoneypotManager.js +234 -0
  169. package/dist/src/security/KeysManager.d.ts +36 -0
  170. package/dist/src/security/KeysManager.js +158 -0
  171. package/dist/src/security/ProofOfWorkIntegration.d.ts +64 -0
  172. package/dist/src/security/ProofOfWorkIntegration.js +206 -0
  173. package/dist/src/security/SecurityValidation.d.ts +21 -0
  174. package/dist/src/security/SecurityValidation.js +163 -0
  175. package/dist/src/security/SourceMapProtection.d.ts +55 -0
  176. package/dist/src/security/SourceMapProtection.js +220 -0
  177. package/dist/src/security/protector.d.ts +1 -0
  178. package/dist/src/security/protector.js +97 -0
  179. package/dist/src/ssh/SSHActions.d.ts +262 -0
  180. package/dist/src/ssh/SSHActions.js +790 -0
  181. package/dist/src/ssh/SSHClient.d.ts +99 -0
  182. package/dist/src/ssh/SSHClient.js +409 -0
  183. package/dist/src/statements/BaseStatement.d.ts +38 -0
  184. package/dist/src/statements/BaseStatement.js +78 -0
  185. package/dist/src/testContext/AuthStateManager.d.ts +93 -0
  186. package/dist/src/testContext/AuthStateManager.js +256 -0
  187. package/dist/src/testContext/CoverageManager.d.ts +198 -0
  188. package/dist/src/testContext/CoverageManager.js +917 -0
  189. package/dist/src/testContext/TestAnnotations.d.ts +476 -0
  190. package/dist/src/testContext/TestAnnotations.js +2647 -0
  191. package/dist/src/testContext/TestContext.d.ts +138 -0
  192. package/dist/src/testContext/TestContext.js +369 -0
  193. package/dist/src/testContext/UnifiedHtmlGenerator.d.ts +7 -0
  194. package/dist/src/testContext/UnifiedHtmlGenerator.js +264 -0
  195. package/dist/src/testContext/UnifiedReportManager.d.ts +211 -0
  196. package/dist/src/testContext/UnifiedReportManager.js +1206 -0
  197. package/dist/src/testhub/DynamicConfigManager.d.ts +121 -0
  198. package/dist/src/testhub/DynamicConfigManager.js +320 -0
  199. package/dist/src/testhub/SystemsManager.d.ts +119 -0
  200. package/dist/src/testhub/SystemsManager.js +365 -0
  201. package/dist/src/testhub/TestHubClient.d.ts +335 -0
  202. package/dist/src/testhub/TestHubClient.js +1215 -0
  203. package/dist/src/testhub/TestHubReporter.d.ts +62 -0
  204. package/dist/src/testhub/TestHubReporter.js +576 -0
  205. package/dist/src/testhub/TestHubVars.d.ts +116 -0
  206. package/dist/src/testhub/TestHubVars.js +273 -0
  207. package/dist/src/utils/ActionInterceptor.d.ts +59 -0
  208. package/dist/src/utils/ActionInterceptor.js +741 -0
  209. package/dist/src/utils/ArtifactsCompressor.d.ts +43 -0
  210. package/dist/src/utils/ArtifactsCompressor.js +181 -0
  211. package/dist/src/utils/AutoLogsFinal.d.ts +47 -0
  212. package/dist/src/utils/AutoLogsFinal.js +148 -0
  213. package/dist/src/utils/CodeGenSession.d.ts +114 -0
  214. package/dist/src/utils/CodeGenSession.js +264 -0
  215. package/dist/src/utils/ConfigLogger.d.ts +133 -0
  216. package/dist/src/utils/ConfigLogger.js +611 -0
  217. package/dist/src/utils/CustomReporter.d.ts +22 -0
  218. package/dist/src/utils/CustomReporter.js +352 -0
  219. package/dist/src/utils/DataStore.d.ts +171 -0
  220. package/dist/src/utils/DataStore.js +484 -0
  221. package/dist/src/utils/DatabaseInterceptor.d.ts +19 -0
  222. package/dist/src/utils/DatabaseInterceptor.js +295 -0
  223. package/dist/src/utils/DateHelper.d.ts +16 -0
  224. package/dist/src/utils/DateHelper.js +120 -0
  225. package/dist/src/utils/DateValidator.d.ts +4 -0
  226. package/dist/src/utils/DateValidator.js +51 -0
  227. package/dist/src/utils/DocumentGenerator.d.ts +35 -0
  228. package/dist/src/utils/DocumentGenerator.js +129 -0
  229. package/dist/src/utils/EvidenceCapture.d.ts +90 -0
  230. package/dist/src/utils/EvidenceCapture.js +600 -0
  231. package/dist/src/utils/EvidenceReportGenerator.d.ts +70 -0
  232. package/dist/src/utils/EvidenceReportGenerator.js +799 -0
  233. package/dist/src/utils/FrameManagementUtil.d.ts +42 -0
  234. package/dist/src/utils/FrameManagementUtil.js +75 -0
  235. package/dist/src/utils/GlobalStatementsInterceptor.d.ts +1 -0
  236. package/dist/src/utils/GlobalStatementsInterceptor.js +1 -0
  237. package/dist/src/utils/HTMLTemplate.d.ts +1 -0
  238. package/dist/src/utils/HTMLTemplate.js +1034 -0
  239. package/dist/src/utils/InterceptacaoMagica.d.ts +23 -0
  240. package/dist/src/utils/InterceptacaoMagica.js +365 -0
  241. package/dist/src/utils/LogSanitizer.d.ts +35 -0
  242. package/dist/src/utils/LogSanitizer.js +110 -0
  243. package/dist/src/utils/Logger.d.ts +65 -0
  244. package/dist/src/utils/Logger.js +284 -0
  245. package/dist/src/utils/McpLocalClient.d.ts +141 -0
  246. package/dist/src/utils/McpLocalClient.js +871 -0
  247. package/dist/src/utils/PDFEvidenceGenerator.d.ts +20 -0
  248. package/dist/src/utils/PDFEvidenceGenerator.js +156 -0
  249. package/dist/src/utils/SpecFileAnalyzer.d.ts +35 -0
  250. package/dist/src/utils/SpecFileAnalyzer.js +209 -0
  251. package/dist/src/utils/StatementInterceptor.d.ts +18 -0
  252. package/dist/src/utils/StatementInterceptor.js +87 -0
  253. package/dist/src/utils/StatementLogger.d.ts +33 -0
  254. package/dist/src/utils/StatementLogger.js +113 -0
  255. package/dist/src/utils/StatementsInterceptor.d.ts +1 -0
  256. package/dist/src/utils/StatementsInterceptor.js +1 -0
  257. package/dist/src/utils/TeamsFlushHook.d.ts +17 -0
  258. package/dist/src/utils/TeamsFlushHook.js +168 -0
  259. package/dist/src/utils/TerminalLogCapture.d.ts +158 -0
  260. package/dist/src/utils/TerminalLogCapture.js +531 -0
  261. package/dist/src/utils/TestMethodLogger.d.ts +70 -0
  262. package/dist/src/utils/TestMethodLogger.js +95 -0
  263. package/dist/src/utils/UnifiedTeardown.d.ts +4 -0
  264. package/dist/src/utils/UnifiedTeardown.js +400 -0
  265. package/dist/src/utils/XPathCatalog.d.ts +152 -0
  266. package/dist/src/utils/XPathCatalog.js +350 -0
  267. package/dist/src/utils/generators.d.ts +90 -0
  268. package/dist/src/utils/generators.js +167 -0
  269. package/dist/src/utils/testRecovery/ResilientPlaywright.d.ts +152 -0
  270. package/dist/src/utils/testRecovery/ResilientPlaywright.js +715 -0
  271. package/dist/src/utils/testRecovery/TestRecoveryClient.d.ts +801 -0
  272. package/dist/src/utils/testRecovery/TestRecoveryClient.js +1415 -0
  273. package/dist/src/utils/testRecovery/autoFixCode.d.ts +65 -0
  274. package/dist/src/utils/testRecovery/autoFixCode.js +32 -0
  275. package/dist/vitest.config.d.ts +2 -0
  276. package/dist/vitest.config.js +59 -0
  277. package/dist/wdio.conf.d.ts +1 -0
  278. package/dist/wdio.conf.js +420 -0
  279. package/package.json +137 -0
  280. package/protect-loader.mjs +643 -0
  281. package/scripts/consumer-postinstall.ts +975 -0
  282. package/scripts/generate-index.ts +343 -0
  283. package/scripts/init-api.ts +613 -0
  284. package/scripts/init-banco.ts +437 -0
  285. package/scripts/init-frontend.ts +727 -0
  286. package/scripts/init-mobile.ts +558 -0
  287. package/scripts/init-scenarios.ts +925 -0
  288. package/scripts/init-ssh.ts +734 -0
  289. package/scripts/package-versions.ts +978 -0
  290. package/scripts/postinstall.ts +605 -0
  291. package/scripts/smart-override.ts +1675 -0
  292. package/scripts/sync-configs.ts +302 -0
  293. package/scripts/ultracite-setup.ts +370 -0
  294. package/src/types/globals.d.ts +48 -0
  295. package/tsconfig.json +29 -0
  296. package/types/autocore-sync-signal.d.ts +10 -0
@@ -0,0 +1,605 @@
1
+ // @ts-nocheck
2
+ import { ensureInstallationKeys } from '../src/security/KeysManager.js'
3
+ import { spawnSync } from 'node:child_process'
4
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
5
+ import path from 'node:path'
6
+ import { fileURLToPath } from 'node:url'
7
+
8
+ // ✅ ESM Compatibility
9
+ const __filename = fileURLToPath(import.meta.url)
10
+ const __dirname = path.dirname(__filename)
11
+
12
+ /**
13
+ * PostInstall do AutoCore - APENAS configuração, SEM BUILD
14
+ */
15
+
16
+ console.log('AutoCore: Iniciando PostInstall (configuração apenas)...')
17
+
18
+ // ✅ Caracteres zero-width para marcadores invisíveis (igual ao HoneypotManager)
19
+ const PROTECTION_MARKERS = '\u200B\u200C\u200D\uFEFF'
20
+
21
+ // ✅ Injetar marcadores invisíveis em arquivos críticos (EXCETO JSON)
22
+ function injectProtectionMarkers(filePath: string, content: string): string {
23
+ // ❌ NUNCA adicionar marcadores invisíveis em arquivos JSON
24
+ if (filePath.endsWith('.json')) {
25
+ return content // Retornar conteúdo sem marcadores para JSON
26
+ }
27
+
28
+ // Verificar se já tem marcadores
29
+ const hasMarkers = PROTECTION_MARKERS.split('').some((char) =>
30
+ content.includes(char),
31
+ )
32
+
33
+ if (hasMarkers) {
34
+ return content // Já protegido
35
+ }
36
+
37
+ // Adicionar marcadores invisíveis no início do arquivo (apenas para não-JSON)
38
+ return PROTECTION_MARKERS + content
39
+ }
40
+
41
+ // ✅ Proteger arquivos críticos do sistema
42
+ async function protectCriticalFiles(): Promise<void> {
43
+ const criticalFiles = ['package.json', 'tsconfig.json', '.gitignore']
44
+
45
+ for (const fileName of criticalFiles) {
46
+ try {
47
+ const filePath = path.join(process.cwd(), fileName)
48
+
49
+ if (existsSync(filePath)) {
50
+ const content = readFileSync(filePath, 'utf8')
51
+ const protectedContent = injectProtectionMarkers(filePath, content)
52
+
53
+ if (protectedContent !== content) {
54
+ writeFileSync(filePath, protectedContent, 'utf8')
55
+ console.log(
56
+ `AutoCore: Marcadores de proteção adicionados a ${fileName}`,
57
+ )
58
+ }
59
+ }
60
+ } catch (error: unknown) {
61
+ const errorMessage =
62
+ error instanceof Error ? error.message : String(error)
63
+ console.warn(`AutoCore: Erro ao proteger ${fileName}:`, errorMessage)
64
+ }
65
+ }
66
+ }
67
+
68
+ // ✅ Configurar segurança SEM build
69
+ async function setupSecurity() {
70
+ try {
71
+ // Apenas em ambiente de produção/build explícito
72
+ if (process.env.AUTOCORE_BUILD_SECURITY === 'true') {
73
+ console.log('AutoCore: Modo build detectado - configurando segurança...')
74
+ const keys = ensureInstallationKeys()
75
+ console.log(
76
+ `AutoCore: Chaves geradas - ID: ${keys.installId.substring(0, 8)}...`,
77
+ )
78
+ } else {
79
+ console.log('AutoCore: Configuração básica aplicada (sem build)')
80
+ }
81
+ } catch (error: unknown) {
82
+ const errorMessage = error instanceof Error ? error.message : String(error)
83
+ console.warn('AutoCore: Aviso na configuração:', errorMessage)
84
+ }
85
+ }
86
+
87
+ // ✅ Atualizar .gitignore
88
+ async function updateGitignoreWithProtections(): Promise<void> {
89
+ try {
90
+ const cwd = process.cwd()
91
+ const gitignorePath = path.join(cwd, '.gitignore')
92
+ const protectionEntries = [
93
+ '',
94
+ '# AutoCore Protection (gerado automaticamente)',
95
+ '.generated/',
96
+ '.rbqa/',
97
+ '.helpers/',
98
+ '.automation/',
99
+ '.rbqa-*',
100
+ '.test-automation.*',
101
+ '.appium-helpers.*',
102
+ '*.rbqa.json',
103
+ '*.protection.key',
104
+ '.install.lock',
105
+ '.build.lock',
106
+ ]
107
+
108
+ if (existsSync(gitignorePath)) {
109
+ const currentContent = readFileSync(gitignorePath, 'utf8')
110
+ if (!currentContent.includes('# AutoCore Protection')) {
111
+ const newContent =
112
+ currentContent + '\n' + protectionEntries.join('\n') + '\n'
113
+ writeFileSync(gitignorePath, newContent)
114
+ console.log('AutoCore: .gitignore atualizado')
115
+ }
116
+ } else {
117
+ writeFileSync(gitignorePath, protectionEntries.join('\n') + '\n')
118
+ console.log('AutoCore: .gitignore criado')
119
+ }
120
+ } catch {
121
+ // Falha silenciosa
122
+ }
123
+ }
124
+
125
+ // 🌐 Registry privado do Azure Artifacts (único registry para pacotes @rbqa)
126
+ const AZURE_REGISTRY = 'https://pkgs.dev.azure.com/telefonica-vivo-brasil/_packaging/DevOps/npm/registry/'
127
+
128
+ // 🔧 Executa comando npm com environment configurado
129
+ function execNpmSync(args: string[], timeoutMs = 30000): { stdout: string; status: number | null } {
130
+ try {
131
+ const result = spawnSync('npm', args, {
132
+ stdio: 'pipe',
133
+ shell: true,
134
+ windowsHide: true,
135
+ timeout: timeoutMs,
136
+ env: { ...process.env, npm_config_registry: AZURE_REGISTRY }
137
+ })
138
+ return {
139
+ stdout: result.stdout?.toString() || '',
140
+ status: result.status
141
+ }
142
+ } catch {
143
+ return { stdout: '', status: null }
144
+ }
145
+ }
146
+
147
+ // ✅ Obter versão instalada globalmente do pacote MCP
148
+ function getInstalledMcpVersion(): string | null {
149
+ try {
150
+ const result = execNpmSync(['list', '-g', '@silasfmartins/testhub-orchestrator-mcp', '--depth=0', '--json'])
151
+ if (result.status === 0) {
152
+ const data = JSON.parse(result.stdout)
153
+ return data.dependencies?.['@silasfmartins/testhub-orchestrator-mcp']?.version || null
154
+ }
155
+ return null
156
+ } catch {
157
+ return null
158
+ }
159
+ }
160
+
161
+ // ✅ Verificar acesso ao registry e obter última versão do MCP
162
+ function checkRegistryAndGetLatestVersion(): string | null {
163
+ try {
164
+ const result = execNpmSync(
165
+ ['view', '@silasfmartins/testhub-orchestrator-mcp', 'version', `--registry=${AZURE_REGISTRY}`],
166
+ 30000
167
+ )
168
+ if (result.status === 0 && result.stdout.trim()) {
169
+ return result.stdout.trim()
170
+ }
171
+ return null
172
+ } catch {
173
+ return null
174
+ }
175
+ }
176
+
177
+ // ✅ Verificar se o pacote @silasfmartins/testhub-orchestrator-mcp está instalado globalmente
178
+ function checkGlobalMcpPackage(): boolean {
179
+ const result = execNpmSync(['list', '-g', '@silasfmartins/testhub-orchestrator-mcp', '--depth=0'])
180
+ return result.status === 0 && result.stdout.includes('@silasfmartins/testhub-orchestrator-mcp')
181
+ }
182
+
183
+ // ✅ Instalar ou atualizar pacote MCP globalmente
184
+ // 🎯 COMPORTAMENTO:
185
+ // - Se já está na última versão: NÃO reinstala
186
+ // - Se versão antiga: atualiza automaticamente
187
+ // - Se não instalado: instala globalmente
188
+ // - Se offline: usa versão local existente
189
+ function installOrUpdateMcpPackage(): { installed: boolean; updated: boolean; version: string | null } {
190
+ console.log('AutoCore: ======================================================')
191
+ console.log('AutoCore: MCP - Verificando instalação global')
192
+ console.log('AutoCore: ======================================================')
193
+
194
+ const installedVersion = getInstalledMcpVersion()
195
+
196
+ if (installedVersion) {
197
+ console.log(`AutoCore: Versão global instalada: ${installedVersion}`)
198
+ } else {
199
+ console.log('AutoCore: MCP não encontrado globalmente')
200
+ }
201
+
202
+ // Verificar acesso ao registry e obter última versão
203
+ console.log('AutoCore: Verificando registry Azure Artifacts...')
204
+ const latestVersion = checkRegistryAndGetLatestVersion()
205
+
206
+ if (!latestVersion) {
207
+ console.log('AutoCore: Sem acesso ao registry Azure Artifacts (modo offline)')
208
+ if (installedVersion) {
209
+ console.log(`AutoCore: Usando versão global existente: ${installedVersion} ✓`)
210
+ return { installed: true, updated: false, version: installedVersion }
211
+ }
212
+ console.log('AutoCore: MCP será executado via npx quando necessário')
213
+ return { installed: false, updated: false, version: null }
214
+ }
215
+
216
+ console.log(`AutoCore: Última versão disponível: ${latestVersion}`)
217
+
218
+ // Comparar versões se já instalado
219
+ if (installedVersion) {
220
+ if (installedVersion === latestVersion) {
221
+ console.log('AutoCore: MCP já está na última versão global - nada a fazer! ✓')
222
+ return { installed: true, updated: false, version: installedVersion }
223
+ }
224
+
225
+ // Versão desatualizada - atualizar
226
+ console.log(`AutoCore: Atualizando MCP: ${installedVersion} → ${latestVersion}`)
227
+ } else {
228
+ console.log('AutoCore: Instalando MCP globalmente...')
229
+ }
230
+
231
+ // Executar instalação/atualização
232
+ const installResult = execNpmSync(
233
+ ['install', '-g', `@silasfmartins/testhub-orchestrator-mcp@${latestVersion}`, `--registry=${AZURE_REGISTRY}`],
234
+ 60000
235
+ )
236
+
237
+ if (installResult.status === 0) {
238
+ const newVersion = getInstalledMcpVersion()
239
+ if (installedVersion) {
240
+ console.log(`AutoCore: MCP atualizado: ${installedVersion} → ${newVersion || latestVersion} ✓`)
241
+ } else {
242
+ console.log(`AutoCore: MCP instalado globalmente (v${newVersion || latestVersion}) ✓`)
243
+ }
244
+ console.log('AutoCore: Disponível para todos os projetos da máquina')
245
+ return { installed: true, updated: !!installedVersion, version: newVersion || latestVersion }
246
+ }
247
+
248
+ console.warn('AutoCore: Falha ao instalar/atualizar MCP')
249
+ if (installedVersion) {
250
+ console.log(`AutoCore: Usando versão global existente: ${installedVersion}`)
251
+ return { installed: true, updated: false, version: installedVersion }
252
+ }
253
+
254
+ console.log('AutoCore: MCP será executado via npx')
255
+ return { installed: false, updated: false, version: null }
256
+ }
257
+
258
+ // ✅ Extrair user_hash de uma URL existente
259
+ function extractUserHash(url: string): string {
260
+ const match = url.match(/user_hash=([a-zA-Z0-9]+)/)
261
+ return match ? match[1] : ''
262
+ }
263
+
264
+ // ✅ Copiar copilot-instructions.md para .github/ do projeto consumidor
265
+ async function copyCopilotInstructions(): Promise<void> {
266
+ try {
267
+ const cwd = process.cwd()
268
+
269
+ // Se estiver em dist/scripts, subir dois níveis; senão, um nível
270
+ const isDist = __dirname.includes('dist')
271
+ const levelsUp = isDist ? '../..' : '..'
272
+ const sourceFile = path.join(__dirname, levelsUp, '.github', 'copilot-instructions.md')
273
+
274
+ const targetDir = path.join(cwd, '.github')
275
+ const targetFile = path.join(targetDir, 'copilot-instructions.md')
276
+
277
+ // Verificar se o arquivo fonte existe no pacote
278
+ if (!existsSync(sourceFile)) {
279
+ console.log('AutoCore: copilot-instructions.md não encontrado no pacote')
280
+ console.log(` Caminho: ${sourceFile}`)
281
+ return
282
+ }
283
+
284
+ // Criar a pasta .github se não existir
285
+ if (!existsSync(targetDir)) {
286
+ console.log('AutoCore: Criando a pasta .github...')
287
+ mkdirSync(targetDir, { recursive: true })
288
+ }
289
+
290
+ // Copiar o arquivo
291
+ const content = readFileSync(sourceFile, 'utf8')
292
+ writeFileSync(targetFile, content, 'utf8')
293
+ console.log('AutoCore: copilot-instructions.md copiado para .github/ ✓')
294
+ } catch (error: unknown) {
295
+ const errorMessage = error instanceof Error ? error.message : String(error)
296
+ console.warn('AutoCore: Erro ao copiar copilot-instructions.md:', errorMessage)
297
+ }
298
+ }
299
+
300
+ // ✅ Criar ou validar o arquivo .vscode/mcp.json (preservando hashes existentes)
301
+ async function ensureMcpConfig(): Promise<void> {
302
+ try {
303
+ const vscodeDir = path.join(process.cwd(), '.vscode')
304
+ const mcpFile = path.join(vscodeDir, 'mcp.json')
305
+
306
+ // Criar a pasta .vscode se não existir
307
+ if (!existsSync(vscodeDir)) {
308
+ console.log('AutoCore: Criando a pasta .vscode...')
309
+ mkdirSync(vscodeDir, { recursive: true })
310
+ }
311
+
312
+ // Instalar/atualizar o MCP apenas em CI (ex.: agentes Azure Pipelines).
313
+ // Em máquinas dos usuários, não instalar globalmente — usar `npx` quando necessário.
314
+ const isCiEnv =
315
+ process.env.AZURE_PIPELINES === 'true' ||
316
+ process.env.CI === 'true' ||
317
+ !!process.env.BUILD_BUILDID ||
318
+ !!process.env.SYSTEM_TEAMFOUNDATIONSERVERURI
319
+
320
+ const isWindows = process.platform === 'win32'
321
+
322
+ // Instalar/atualizar o MCP apenas em máquinas Windows locais (desenvolvedores).
323
+ // NÃO instalar em CI (ex.: Azure Pipelines Linux agents).
324
+ if (!isCiEnv && isWindows) {
325
+ console.log('AutoCore: Ambiente Windows local detectado - verificando/instalando MCP globalmente')
326
+ try {
327
+ installOrUpdateMcpPackage()
328
+ } catch (e) {
329
+ console.warn('AutoCore: Falha ao instalar/atualizar MCP:', e)
330
+ console.log('AutoCore: O MCP será executado via npx quando necessário')
331
+ }
332
+ } else if (isCiEnv) {
333
+ console.log('AutoCore: Ambiente CI detectado - ignorando instalação global do MCP (use npx)')
334
+ } else {
335
+ console.log('AutoCore: Ignorando instalação/atualização global do MCP (use npx quando necessário)')
336
+ }
337
+
338
+ // Configuração padrão
339
+ const defaultConfig = {
340
+ servers: {
341
+ 'mcp-estimative': {
342
+ url: 'http://brtlvlty0559pl:8080/estimative/mcp?user_hash=',
343
+ type: 'http',
344
+ },
345
+ 'autocore-orchestrator': {
346
+ command: 'npx',
347
+ args: ['-y', '@silasfmartins/testhub-orchestrator-mcp'],
348
+ env: {
349
+ HUB_BACKEND_URL: 'http://brtlvlty0559pl:3333',
350
+ },
351
+ type: 'stdio',
352
+ },
353
+ },
354
+ inputs: [],
355
+ }
356
+
357
+ if (existsSync(mcpFile)) {
358
+ // Arquivo existe - preservar hashes do usuário
359
+ const currentContent = JSON.parse(readFileSync(mcpFile, 'utf8'))
360
+
361
+ // Preservar hash do mcp-estimative
362
+ let existingEstimativeHash = ''
363
+ if (currentContent.servers?.['mcp-estimative']?.url) {
364
+ existingEstimativeHash = extractUserHash(currentContent.servers['mcp-estimative'].url)
365
+ }
366
+
367
+ // Construir configuração atualizada preservando hashes
368
+ const updatedConfig = {
369
+ servers: {
370
+ 'mcp-estimative': {
371
+ url: `http://brtlvlty0559pl:8080/estimative/mcp?user_hash=${existingEstimativeHash}`,
372
+ type: 'http',
373
+ },
374
+ 'autocore-orchestrator': {
375
+ command: 'npx',
376
+ args: ['-y', '@silasfmartins/testhub-orchestrator-mcp'],
377
+ env: {
378
+ HUB_BACKEND_URL: 'http://brtlvlty0559pl:3333',
379
+ },
380
+ type: 'stdio',
381
+ },
382
+ },
383
+ inputs: currentContent.inputs || [],
384
+ }
385
+
386
+ writeFileSync(mcpFile, JSON.stringify(updatedConfig, null, 2))
387
+
388
+ if (existingEstimativeHash) {
389
+ console.log('AutoCore: Arquivo mcp.json atualizado (hash mcp-estimative preservado) ✓')
390
+ } else {
391
+ console.log('AutoCore: Arquivo mcp.json atualizado ✓')
392
+ }
393
+ } else {
394
+ // Criar novo arquivo com configuração padrão
395
+ writeFileSync(mcpFile, JSON.stringify(defaultConfig, null, 2))
396
+ console.log('AutoCore: Arquivo mcp.json criado ✓')
397
+ }
398
+
399
+ // Mensagem sobre configuração do user_hash
400
+ console.log('')
401
+ console.log('AutoCore: 🔑 Para usar o MCP, configure seu user_hash:')
402
+ console.log('AutoCore: - mcp-estimative: Adicione seu hash na URL em .vscode/mcp.json')
403
+ console.log('AutoCore: - autocore-orchestrator: No Windows, defina a variável de ambiente')
404
+ console.log('AutoCore: do usuário HUB_MCP_USER_HASH com seu hash e reinicie o VS Code.')
405
+ } catch (error: unknown) {
406
+ const errorMessage = error instanceof Error ? error.message : String(error)
407
+ console.warn('AutoCore: Erro ao configurar mcp.json:', errorMessage)
408
+ }
409
+ }
410
+
411
+ // ✅ Verificar se o Playwright está instalado (para projetos Frontend/Scenarios)
412
+ async function ensurePlaywrightInstalled(): Promise<void> {
413
+ try {
414
+ const cwd = process.cwd()
415
+ const pkgFile = path.join(cwd, 'package.json')
416
+
417
+ if (!existsSync(pkgFile)) return
418
+
419
+ const content = readFileSync(pkgFile, 'utf8')
420
+ const pkg = JSON.parse(content)
421
+
422
+ // Verificar se é projeto Frontend ou Scenarios (tem @playwright/test nas dependências)
423
+ const hasPlaywright =
424
+ pkg.dependencies?.['@playwright/test'] ||
425
+ pkg.devDependencies?.['@playwright/test'] ||
426
+ pkg.dependencies?.['@silasfmartins/testhub'] ||
427
+ pkg.devDependencies?.['@silasfmartins/testhub']
428
+
429
+ // Determinar se devemos instalar browsers Playwright
430
+ // Prioridade 1: variável de ambiente PROJECT_TYPE (WEB/FRONTEND or SCENARIOS)
431
+ const projectTypeEnv = (process.env.PROJECT_TYPE || process.env.PROJECTTYPE || '').toUpperCase()
432
+ const isProjectTypeWebOrScenarios = projectTypeEnv === 'WEB' || projectTypeEnv === 'FRONTEND' || projectTypeEnv === 'SCENARIOS'
433
+
434
+ // Fallback: Verificar se tem scripts de frontend/scenarios (indica que precisa de browsers)
435
+ const hasFrontendScripts =
436
+ !!pkg.scripts?.['test:preprod']?.includes('playwright test') ||
437
+ !!pkg.scripts?.['ui:preprod'] ||
438
+ !!pkg.scripts?.['codegen:preprod']
439
+
440
+ // Só instalar se o projeto for Web/Frontend ou Scenarios (por env ou por scripts indicativos)
441
+ if (!hasPlaywright || !(isProjectTypeWebOrScenarios || hasFrontendScripts)) return
442
+
443
+ // Verificar se os browsers já estão instalados em vários locais comuns
444
+ function browsersPresent(dir: string): boolean {
445
+ try {
446
+ if (!existsSync(dir)) return false
447
+ const stat = require('node:fs').statSync(dir)
448
+ return !!stat
449
+ } catch {
450
+ return false
451
+ }
452
+ }
453
+
454
+ const possiblePaths = [
455
+ path.join(cwd, 'node_modules', '.cache', 'ms-playwright'),
456
+ path.join(cwd, 'node_modules', 'playwright-core', '.local-browsers'),
457
+ path.join(cwd, 'node_modules', 'playwright', '.local-browsers'),
458
+ path.join(cwd, 'node_modules', '.playwright'),
459
+ path.join(cwd, 'node_modules', 'playwright-core', '.playwright'),
460
+ ]
461
+
462
+ const browsersInstalled = possiblePaths.some(browsersPresent)
463
+
464
+ if (browsersInstalled) {
465
+ console.log('AutoCore: Browsers Playwright já instalados ✓')
466
+ return
467
+ }
468
+
469
+ // Tentar instalar browsers Playwright com tentativas e flags úteis
470
+ console.log('AutoCore: Browsers Playwright não encontrados. Tentando instalar...')
471
+
472
+ const installCommands = [
473
+ { args: ['playwright', 'install', '--with-deps'], desc: 'install --with-deps' },
474
+ { args: ['playwright', 'install'], desc: 'install' },
475
+ { args: ['playwright', 'install', '--force'], desc: 'install --force' },
476
+ ]
477
+
478
+ let installed = false
479
+
480
+ for (const cmd of installCommands) {
481
+ try {
482
+ console.log(`AutoCore: Executando: npx ${cmd.args.join(' ')} (cwd=${cwd})`)
483
+ const result = spawnSync('npx', cmd.args, {
484
+ stdio: 'pipe',
485
+ shell: true,
486
+ windowsHide: true,
487
+ cwd,
488
+ timeout: 300000, // 5 minutos
489
+ })
490
+
491
+ if (result.status === 0) {
492
+ // Rechecar se os browsers foram instalados
493
+ const nowInstalled = possiblePaths.some(browsersPresent)
494
+ if (nowInstalled) {
495
+ console.log(`AutoCore: Browsers Playwright instalados com sucesso (${cmd.desc}) ✓`)
496
+ installed = true
497
+ break
498
+ } else {
499
+ console.log(`AutoCore: Comando '${cmd.desc}' finalizou sem erro, mas browsers não foram detectados. Tentando próxima opção...`)
500
+ }
501
+ } else {
502
+ console.warn(`AutoCore: Comando 'npx ${cmd.args.join(' ')}' falhou com código ${result.status}`)
503
+ }
504
+ } catch (err) {
505
+ console.warn(`AutoCore: Erro ao executar 'npx ${cmd.args.join(' ')}': ${err}`)
506
+ }
507
+ }
508
+
509
+ if (!installed) {
510
+ console.warn('AutoCore: Falha ao instalar browsers Playwright automaticamente')
511
+ console.log('AutoCore: Instrução: execute manualmente: npx playwright install')
512
+ }
513
+ } catch (error: unknown) {
514
+ const errorMessage = error instanceof Error ? error.message : String(error)
515
+ console.warn('AutoCore: Erro ao verificar Playwright:', errorMessage)
516
+ }
517
+ }
518
+
519
+ // ✅ Função principal async
520
+ async function main() {
521
+ // ✅ PRIMEIRO: Proteger arquivos críticos
522
+ await protectCriticalFiles()
523
+
524
+ try {
525
+ // ✅ Configurar scripts de proteção (SEM executar)
526
+ const cwd = process.cwd()
527
+ const pkgFile = path.join(cwd, 'package.json')
528
+
529
+ if (existsSync(pkgFile)) {
530
+ const content = readFileSync(pkgFile, 'utf8')
531
+ const pkg = JSON.parse(content)
532
+ pkg.scripts ||= {}
533
+
534
+ const loaderFlag =
535
+ '--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs'
536
+
537
+ const ensurePre = (key: string) => {
538
+ const pre = `pre${key}`
539
+ const current = pkg.scripts[pre] as string | undefined
540
+ if (current?.includes(loaderFlag)) return
541
+
542
+ const exportCmd =
543
+ process.platform === 'win32'
544
+ ? `set NODE_OPTIONS=%NODE_OPTIONS% ${loaderFlag}`
545
+ : `export NODE_OPTIONS="$NODE_OPTIONS ${loaderFlag}"`
546
+
547
+ pkg.scripts[pre] = current ? `${exportCmd} && ${current}` : exportCmd
548
+ }
549
+
550
+ // Configurar proteção apenas para scripts específicos
551
+ ;['test', 'build'].forEach(ensurePre)
552
+
553
+ // Atualizar .gitignore
554
+ await updateGitignoreWithProtections()
555
+
556
+ // ✅ Salvar com marcadores de proteção
557
+ const newContent = JSON.stringify(pkg, null, 2)
558
+ const protectedContent = injectProtectionMarkers(pkgFile, newContent)
559
+ writeFileSync(pkgFile, protectedContent)
560
+ console.log('AutoCore: Scripts de proteção configurados')
561
+ }
562
+ } catch (error: unknown) {
563
+ const errorMessage = error instanceof Error ? error.message : String(error)
564
+ console.warn('AutoCore: Erro na configuração de scripts:', errorMessage)
565
+ }
566
+
567
+ // ✅ Verificar smart-override usando binário
568
+ try {
569
+ const result = spawnSync('npx', ['autocore-sync', 'check', '--quiet'], {
570
+ stdio: 'pipe',
571
+ shell: true,
572
+ windowsHide: true,
573
+ })
574
+
575
+ if (result.status === 0) {
576
+ console.log('AutoCore: Smart-override verificado')
577
+ }
578
+ } catch (e) {
579
+ // Ignorar erro se binário não existir ainda
580
+ }
581
+
582
+ // ✅ Configurar segurança (SEM BUILD)
583
+ await setupSecurity()
584
+
585
+ // ✅ Criar ou validar o arquivo .vscode/mcp.json
586
+ await ensureMcpConfig()
587
+
588
+ // ✅ Copiar copilot-instructions.md para .github/
589
+ await copyCopilotInstructions()
590
+
591
+ // ✅ NOVO: Verificar e instalar Playwright para projetos Frontend/Scenarios
592
+ await ensurePlaywrightInstalled()
593
+
594
+ // ✅ FINAL: Re-proteger após modificações
595
+ await protectCriticalFiles()
596
+
597
+ console.log('AutoCore: PostInstall concluído SEM build!')
598
+ }
599
+
600
+ // ✅ Executar função principal (SEM BUILD)
601
+ main().catch((error: unknown) => {
602
+ const errorMessage = error instanceof Error ? error.message : String(error)
603
+ console.warn('AutoCore: PostInstall falhou:', errorMessage)
604
+ // Não falhar o processo - apenas avisar
605
+ })