@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,785 @@
1
+ #!/usr/bin/env node
2
+ // @ts-nocheck
3
+ /**
4
+ * 🔧 Consumer Project Postinstall Script
5
+ * @description Instala automaticamente extensões VS Code necessárias em projetos consumidores
6
+ * @author TestHUB Team
7
+ * @version 1.0.0
8
+ *
9
+ * Este script é executado após npm install em projetos consumidores (API, Mobile, Web, SSH, Banco)
10
+ * e instala automaticamente as extensões VS Code necessárias apenas em ambiente local (Windows).
11
+ */
12
+ import { exec } from "node:child_process";
13
+ import * as fs from "node:fs";
14
+ import { platform } from "node:os";
15
+ import path from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+ import { promisify } from "node:util";
18
+ const execAsync = promisify(exec);
19
+ // ✅ ESM Compatibility
20
+ const __filename = fileURLToPath(import.meta.url);
21
+ const __dirname = path.dirname(__filename);
22
+ // Extensões obrigatórias para projetos AutoCore
23
+ const REQUIRED_EXTENSIONS = [
24
+ {
25
+ id: "biomejs.biome",
26
+ name: "Biome (biomejs)",
27
+ description: "Formatter e linter unificado para projetos AutoCore",
28
+ },
29
+ {
30
+ id: "ms-playwright.playwright",
31
+ name: "Playwright Test for VSCode (Microsoft)",
32
+ description: "Suporte oficial para executar e debugar testes Playwright",
33
+ },
34
+ {
35
+ id: "dbaeumer.vscode-eslint",
36
+ name: "ESLint (Microsoft)",
37
+ description: "Linter JavaScript/TypeScript integrado ao VS Code",
38
+ },
39
+ {
40
+ id: "github.copilot",
41
+ name: "GitHub Copilot (GitHub)",
42
+ description: "Assistente de código AI do GitHub para produtividade",
43
+ },
44
+ {
45
+ id: "github.copilot-chat",
46
+ name: "GitHub Copilot Chat (GitHub)",
47
+ description: "Chat AI integrado para assistência de desenvolvimento",
48
+ },
49
+ {
50
+ id: "mikestead.dotenv",
51
+ name: "DotENV (mikestead)",
52
+ description: "Sintaxe highlighting para arquivos .env e variáveis de ambiente",
53
+ },
54
+ ];
55
+ /**
56
+ * 🔍 Detecta se está rodando em ambiente local (Windows)
57
+ */
58
+ function isLocalEnvironment() {
59
+ const os = platform();
60
+ const isWindows = os === "win32";
61
+ const isCI = process.env.CI === "true" ||
62
+ process.env.GITHUB_ACTIONS === "true" ||
63
+ process.env.AZURE_PIPELINES === "true" ||
64
+ process.env.BUILD_BUILDID !== undefined ||
65
+ process.env.SYSTEM_TEAMFOUNDATIONSERVERURI !== undefined;
66
+ console.log("🔍 Detectando ambiente:");
67
+ console.log(` 💻 Sistema operacional: ${os}`);
68
+ console.log(` 🏠 Windows (local): ${isWindows}`);
69
+ console.log(` 🤖 CI/CD detectado: ${isCI}`);
70
+ return isWindows && !isCI;
71
+ }
72
+ /**
73
+ * 🔍 Verifica se o VS Code está instalado verificando no filesystem
74
+ * (NÃO usa `code` CLI — evita abrir janelas do VS Code)
75
+ */
76
+ function isVSCodeInstalled() {
77
+ const possiblePaths = [
78
+ path.join(process.env.LOCALAPPDATA || "", "Programs", "Microsoft VS Code", "Code.exe"),
79
+ "C:\\Program Files\\Microsoft VS Code\\Code.exe",
80
+ "C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe",
81
+ ];
82
+ return possiblePaths.some((p) => p && fs.existsSync(p));
83
+ }
84
+ /**
85
+ * 🔍 Detecta extensões instaladas lendo o diretório ~/.vscode/extensions/
86
+ * (NÃO usa `code` CLI — evita abrir janelas do VS Code)
87
+ *
88
+ * Cada extensão fica em uma pasta: publisher.extensionname-version
89
+ */
90
+ function getInstalledExtensionsFromDisk() {
91
+ const extensionsDir = path.join(process.env.USERPROFILE || process.env.HOME || "", ".vscode", "extensions");
92
+ if (!fs.existsSync(extensionsDir))
93
+ return new Set();
94
+ try {
95
+ const entries = fs.readdirSync(extensionsDir, { withFileTypes: true });
96
+ const installed = new Set();
97
+ for (const entry of entries) {
98
+ if (!entry.isDirectory())
99
+ continue;
100
+ // Formato: publisher.name-version → extrair publisher.name
101
+ const match = entry.name.match(/^(.+?)-\d+\.\d+/);
102
+ if (match) {
103
+ installed.add(match[1].toLowerCase());
104
+ }
105
+ }
106
+ return installed;
107
+ }
108
+ catch {
109
+ return new Set();
110
+ }
111
+ }
112
+ /**
113
+ * 🔍 Verifica se uma extensão específica está instalada (via filesystem, sem CLI)
114
+ */
115
+ function isExtensionInstalled(extensionId) {
116
+ const installed = getInstalledExtensionsFromDisk();
117
+ return installed.has(extensionId.toLowerCase());
118
+ }
119
+ // 🌐 Registry privado do Azure Artifacts (único registry para pacotes @rbqa)
120
+ const AZURE_REGISTRY = "https://pkgs.dev.azure.com/telefonica-vivo-brasil/_packaging/DevOps/npm/registry/";
121
+ const WINDOWS_MCP_AUTOSTART_START_COMMAND = "npx -y @silasfmartins/testhub-orchestrator-mcp";
122
+ const WINDOWS_MCP_STARTUP_SCRIPT_FILE = "autocore-orchestrator-mcp.cmd";
123
+ const WINDOWS_MCP_STARTUP_VBS_FILE = "autocore-orchestrator-mcp.vbs";
124
+ /**
125
+ * � Executa comando shell com tratamento de erro melhorado
126
+ */
127
+ async function execShellCommand(command, timeoutMs = 30000, opts) {
128
+ try {
129
+ const env = opts?.withNpmRegistry
130
+ ? { ...process.env, npm_config_registry: AZURE_REGISTRY }
131
+ : process.env;
132
+ const result = await execAsync(command, {
133
+ timeout: timeoutMs,
134
+ windowsHide: true,
135
+ shell: true,
136
+ env,
137
+ });
138
+ return result;
139
+ }
140
+ catch (error) {
141
+ // Debug: mostrar erro se houver
142
+ if (process.env.DEBUG_MCP) {
143
+ console.log(`[DEBUG] Erro no comando: ${command}`);
144
+ console.log(`[DEBUG] Erro: ${error instanceof Error ? error.message : error}`);
145
+ }
146
+ return null;
147
+ }
148
+ }
149
+ /**
150
+ * � Executa comando npm com registry privado configurado
151
+ */
152
+ async function execNpmCommand(command, timeoutMs = 30000) {
153
+ return execShellCommand(command, timeoutMs, { withNpmRegistry: true });
154
+ }
155
+ /**
156
+ * 🔍 Obtém a versão instalada globalmente do pacote MCP
157
+ */
158
+ async function getInstalledMcpVersion() {
159
+ try {
160
+ const result = await execNpmCommand("npm list -g @silasfmartins/testhub-orchestrator-mcp --depth=0 --json");
161
+ if (!result)
162
+ return null;
163
+ const data = JSON.parse(result.stdout);
164
+ return (data.dependencies?.["@silasfmartins/testhub-orchestrator-mcp"]?.version || null);
165
+ }
166
+ catch {
167
+ return null;
168
+ }
169
+ }
170
+ /**
171
+ * 🔍 Obtém a última versão disponível do pacote MCP no registry privado
172
+ * Pacotes @rbqa só existem no registry privado do Azure
173
+ */
174
+ async function getLatestMcpVersion() {
175
+ try {
176
+ const result = await execNpmCommand(`npm view @silasfmartins/testhub-orchestrator-mcp version --registry=${AZURE_REGISTRY}`, 30000);
177
+ if (!result)
178
+ return null;
179
+ return result.stdout.trim() || null;
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ }
185
+ /**
186
+ * 🔍 Verifica se o pacote @silasfmartins/testhub-orchestrator-mcp está instalado globalmente
187
+ */
188
+ async function isMcpPackageInstalled() {
189
+ try {
190
+ const result = await execNpmCommand("npm list -g @silasfmartins/testhub-orchestrator-mcp --depth=0");
191
+ return result
192
+ ? result.stdout.includes("@silasfmartins/testhub-orchestrator-mcp")
193
+ : false;
194
+ }
195
+ catch {
196
+ return false;
197
+ }
198
+ }
199
+ /**
200
+ * 🌐 Verifica se há acesso ao registry privado (Azure Artifacts)
201
+ * Retorna a versão disponível ou null se não há acesso
202
+ */
203
+ async function checkRegistryAccess() {
204
+ try {
205
+ // Tenta obter a versão do pacote no Azure Artifacts
206
+ const result = await execNpmCommand(`npm view @silasfmartins/testhub-orchestrator-mcp version --registry=${AZURE_REGISTRY}`, 30000);
207
+ if (result && result.stdout.trim()) {
208
+ return result.stdout.trim();
209
+ }
210
+ return null;
211
+ }
212
+ catch {
213
+ return null;
214
+ }
215
+ }
216
+ /**
217
+ * 📦 Instala ou atualiza o pacote @silasfmartins/testhub-orchestrator-mcp globalmente
218
+ *
219
+ * 🎯 COMPORTAMENTO:
220
+ * - Se já está na última versão: NÃO reinstala (economia de tempo)
221
+ * - Se versão antiga: atualiza automaticamente
222
+ * - Se não instalado: instala globalmente
223
+ * - Se offline: usa versão local existente (se houver)
224
+ *
225
+ * 🌐 INSTALAÇÃO GLOBAL:
226
+ * - O MCP é instalado GLOBALMENTE (npm install -g)
227
+ * - Fica disponível para TODOS os projetos da máquina
228
+ * - Não precisa reinstalar em cada projeto
229
+ */
230
+ async function installMcpPackageGlobally() {
231
+ console.log("📦 ======================================================");
232
+ console.log("📦 AutoCore Orchestrator MCP (Instalação Global)");
233
+ console.log("📦 ======================================================");
234
+ console.log();
235
+ try {
236
+ // 1️⃣ Verificar versão instalada globalmente
237
+ const installedVersion = await getInstalledMcpVersion();
238
+ if (installedVersion) {
239
+ console.log(`📌 Versão global instalada: ${installedVersion}`);
240
+ }
241
+ else {
242
+ console.log("🆕 MCP não encontrado globalmente");
243
+ }
244
+ // 2️⃣ Verificar acesso ao registry e obter última versão
245
+ console.log("🔍 Verificando registry Azure Artifacts...");
246
+ const latestVersion = await checkRegistryAccess();
247
+ if (!latestVersion) {
248
+ console.log("🔒 Sem acesso ao registry Azure Artifacts (modo offline)");
249
+ if (installedVersion) {
250
+ console.log(`✅ Usando versão global existente: ${installedVersion}`);
251
+ return true;
252
+ }
253
+ console.log("⚠️ O MCP será executado via npx quando necessário");
254
+ console.log(" 💡 Conecte-se à VPN e execute:");
255
+ console.log(` npm install -g @silasfmartins/testhub-orchestrator-mcp --registry=${AZURE_REGISTRY}`);
256
+ return false;
257
+ }
258
+ console.log(`🌐 Última versão disponível: ${latestVersion}`);
259
+ // 3️⃣ Comparar versões se já instalado
260
+ if (installedVersion) {
261
+ if (installedVersion === latestVersion) {
262
+ console.log("✅ MCP já está na última versão global - nada a fazer!");
263
+ console.log(" 💡 Instalação global compartilhada entre todos os projetos");
264
+ return true;
265
+ }
266
+ // 4️⃣ Atualizar para última versão
267
+ console.log(`🔄 Atualizando MCP: ${installedVersion} → ${latestVersion}`);
268
+ }
269
+ else {
270
+ console.log("🔄 Instalando MCP globalmente...");
271
+ }
272
+ // 5️⃣ Executar instalação/atualização
273
+ const installResult = await execNpmCommand(`npm install -g @silasfmartins/testhub-orchestrator-mcp@${latestVersion} --registry=${AZURE_REGISTRY}`, 60000);
274
+ if (!installResult) {
275
+ console.log("⚠️ Falha ao instalar/atualizar MCP");
276
+ if (installedVersion) {
277
+ console.log(` ✅ Usando versão global existente: ${installedVersion}`);
278
+ return true;
279
+ }
280
+ return false;
281
+ }
282
+ const newVersion = await getInstalledMcpVersion();
283
+ if (installedVersion) {
284
+ console.log(`✅ MCP atualizado globalmente: ${installedVersion} → ${newVersion || latestVersion}`);
285
+ }
286
+ else {
287
+ console.log(`✅ MCP instalado globalmente! (v${newVersion || latestVersion})`);
288
+ }
289
+ console.log(" 💡 Disponível para todos os projetos da máquina");
290
+ return true;
291
+ }
292
+ catch (error) {
293
+ console.warn("⚠️ Não foi possível instalar/atualizar MCP globalmente");
294
+ // Verificar se tem versão local que pode usar
295
+ const installedVersion = await getInstalledMcpVersion();
296
+ if (installedVersion) {
297
+ console.log(` ✅ Usando versão global existente: ${installedVersion}`);
298
+ return true;
299
+ }
300
+ console.warn(" O MCP será executado via npx quando necessário");
301
+ if (error instanceof Error) {
302
+ console.warn(` Erro: ${error.message}`);
303
+ }
304
+ return false;
305
+ }
306
+ }
307
+ /**
308
+ * ⚙️ Configura inicialização automática no Startup do usuário (sem admin, sem terminal visível)
309
+ */
310
+ async function ensureWindowsStartupFolderAutostart() {
311
+ try {
312
+ const appData = process.env.APPDATA ||
313
+ path.join(process.env.USERPROFILE || "", "AppData", "Roaming");
314
+ if (!appData)
315
+ return false;
316
+ const startupDir = path.join(appData, "Microsoft", "Windows", "Start Menu", "Programs", "Startup");
317
+ const startupCmdFile = path.join(startupDir, WINDOWS_MCP_STARTUP_SCRIPT_FILE);
318
+ const startupVbsFile = path.join(startupDir, WINDOWS_MCP_STARTUP_VBS_FILE);
319
+ const startupScript = [
320
+ "@echo off",
321
+ "cd /d %USERPROFILE%",
322
+ `call ${WINDOWS_MCP_AUTOSTART_START_COMMAND}`,
323
+ "",
324
+ ].join("\r\n");
325
+ const startupVbs = [
326
+ 'Set WshShell = CreateObject("WScript.Shell")',
327
+ `WshShell.Run Chr(34) & "${startupCmdFile}" & Chr(34), 0, False`,
328
+ "",
329
+ ].join("\r\n");
330
+ fs.mkdirSync(startupDir, { recursive: true });
331
+ fs.writeFileSync(startupCmdFile, startupScript, "utf8");
332
+ fs.writeFileSync(startupVbsFile, startupVbs, "utf8");
333
+ console.log("✅ AutoStart via Startup do usuário configurado (sem admin, execução oculta)");
334
+ console.log(` 📍 Arquivo CMD: ${startupCmdFile}`);
335
+ console.log(` 📍 Arquivo VBS: ${startupVbsFile}`);
336
+ const runNow = await execShellCommand(`wscript.exe "${startupVbsFile}"`, 15000);
337
+ if (runNow) {
338
+ console.log("✅ MCP iniciado agora em background (sem terminal visível)");
339
+ }
340
+ else {
341
+ console.warn("⚠️ Startup configurado, mas não foi possível iniciar em background agora");
342
+ console.warn(` 💡 Rode manualmente: wscript.exe "${startupVbsFile}"`);
343
+ }
344
+ return true;
345
+ }
346
+ catch (error) {
347
+ console.warn("⚠️ Falha ao configurar AutoStart via Startup do usuário");
348
+ if (error instanceof Error) {
349
+ console.warn(` Erro: ${error.message}`);
350
+ }
351
+ return false;
352
+ }
353
+ }
354
+ /**
355
+ * ⚙️ Configura inicialização automática do MCP no logon do Windows (sem admin)
356
+ * Usa somente Startup do usuário (Task Scheduler removido por política).
357
+ */
358
+ async function ensureWindowsMcpAutostart() {
359
+ console.log("⚙️ ======================================================");
360
+ console.log("⚙️ Configurando AutoStart do MCP (Windows sem admin)");
361
+ console.log("⚙️ ======================================================");
362
+ console.log();
363
+ const startupOk = await ensureWindowsStartupFolderAutostart();
364
+ if (!startupOk) {
365
+ console.warn("⚠️ Falha ao configurar AutoStart do MCP via Startup.");
366
+ }
367
+ console.log();
368
+ return startupOk;
369
+ }
370
+ /**
371
+ * 🔧 Extrai user_hash de uma URL existente
372
+ */
373
+ function extractUserHash(url) {
374
+ const match = url.match(/user_hash=([a-zA-Z0-9]+)/);
375
+ return match ? match[1] : "";
376
+ }
377
+ /**
378
+ * 🔧 Cria ou atualiza o arquivo .vscode/mcp.json preservando hashes existentes
379
+ */
380
+ async function ensureMcpConfig() {
381
+ console.log("🔧 ======================================================");
382
+ console.log("🔧 Configurando MCP (Model Context Protocol)");
383
+ console.log("🔧 ======================================================");
384
+ console.log();
385
+ try {
386
+ const consumerProjectRoot = process.cwd();
387
+ const vscodeDir = path.join(consumerProjectRoot, ".vscode");
388
+ const mcpFile = path.join(vscodeDir, "mcp.json");
389
+ // Criar a pasta .vscode se não existir
390
+ if (!fs.existsSync(vscodeDir)) {
391
+ fs.mkdirSync(vscodeDir, { recursive: true });
392
+ console.log(`📁 Pasta .vscode criada em: ${vscodeDir}`);
393
+ }
394
+ // Configuração padrão (hashes vazios)
395
+ const defaultConfig = {
396
+ servers: {
397
+ "mcp-estimative": {
398
+ url: "http://brtlvlty0559pl:8080/estimative/mcp?user_hash=",
399
+ type: "http",
400
+ },
401
+ "autocore-orchestrator": {
402
+ command: "npx",
403
+ args: ["-y", "@silasfmartins/testhub-orchestrator-mcp"],
404
+ env: {
405
+ HUB_BACKEND_URL: "http://brtlvlty0559pl:3333",
406
+ },
407
+ type: "stdio",
408
+ },
409
+ },
410
+ inputs: [],
411
+ };
412
+ if (fs.existsSync(mcpFile)) {
413
+ // Arquivo existe - preservar hashes do usuário
414
+ const currentContent = JSON.parse(fs.readFileSync(mcpFile, "utf8"));
415
+ // Preservar hash do mcp-estimative
416
+ let existingEstimativeHash = "";
417
+ if (currentContent.servers?.["mcp-estimative"]?.url) {
418
+ existingEstimativeHash = extractUserHash(currentContent.servers["mcp-estimative"].url);
419
+ }
420
+ // Construir configuração atualizada preservando hashes
421
+ const updatedConfig = {
422
+ servers: {
423
+ "mcp-estimative": {
424
+ url: `http://brtlvlty0559pl:8080/estimative/mcp?user_hash=${existingEstimativeHash}`,
425
+ type: "http",
426
+ },
427
+ "autocore-orchestrator": {
428
+ command: "npx",
429
+ args: ["-y", "@silasfmartins/testhub-orchestrator-mcp"],
430
+ env: {
431
+ HUB_BACKEND_URL: "http://brtlvlty0559pl:3333",
432
+ },
433
+ type: "stdio",
434
+ },
435
+ },
436
+ inputs: currentContent.inputs || [],
437
+ };
438
+ fs.writeFileSync(mcpFile, JSON.stringify(updatedConfig, null, 2));
439
+ if (existingEstimativeHash) {
440
+ console.log("✅ Arquivo mcp.json atualizado (hash mcp-estimative preservado)");
441
+ }
442
+ else {
443
+ console.log("✅ Arquivo mcp.json atualizado");
444
+ }
445
+ }
446
+ else {
447
+ // Criar novo arquivo com configuração padrão
448
+ fs.writeFileSync(mcpFile, JSON.stringify(defaultConfig, null, 2));
449
+ console.log("✅ Arquivo mcp.json criado");
450
+ }
451
+ console.log(` 📍 Local: ${mcpFile}`);
452
+ console.log();
453
+ console.log("🤖 MCP configurado para integração com AutoCore Hub!");
454
+ console.log(" 🔹 autocore-orchestrator: Migração, geração de testes, documentação");
455
+ console.log(" 🔹 mcp-estimative: Estimativas de produtividade AI");
456
+ console.log();
457
+ console.log("🔑 Para usar o MCP, configure seu user_hash:");
458
+ console.log(" 📌 mcp-estimative: Adicione seu hash na URL em .vscode/mcp.json");
459
+ console.log(" 📌 autocore-orchestrator:");
460
+ console.log(" No Windows: defina a variável de ambiente do usuário");
461
+ console.log(" HUB_MCP_USER_HASH com seu hash e reinicie o VS Code.");
462
+ console.log(" (Painel de Controle > Sistema > Variáveis de Ambiente)");
463
+ }
464
+ catch (error) {
465
+ console.warn("⚠️ Aviso: Não foi possível configurar mcp.json");
466
+ if (error instanceof Error) {
467
+ console.warn(` Erro: ${error.message}`);
468
+ }
469
+ }
470
+ console.log();
471
+ }
472
+ /**
473
+ * ✅ Verificar/Instalar browsers Playwright para projetos consumidores
474
+ */
475
+ async function ensurePlaywrightForConsumer() {
476
+ try {
477
+ const cwd = process.cwd();
478
+ const pkgFile = path.join(cwd, "package.json");
479
+ if (!fs.existsSync(pkgFile))
480
+ return;
481
+ const content = fs.readFileSync(pkgFile, "utf8");
482
+ const pkg = JSON.parse(content);
483
+ const hasPlaywright = pkg.dependencies?.["@playwright/test"] ||
484
+ pkg.devDependencies?.["@playwright/test"];
485
+ if (!hasPlaywright)
486
+ return;
487
+ // Respect pipeline/test-type overrides: if pipeline requests SSH tests, skip installing browsers
488
+ const pipelineTestType = (process.env.FORCE_TEST_TYPE ||
489
+ process.env.TEST_TYPE ||
490
+ process.env.RUN_TEST_TYPE ||
491
+ "").toUpperCase();
492
+ if (pipelineTestType === "SSH" || process.env.USE_SSH === "true") {
493
+ console.log("AutoCore Consumer: CI/pipeline indicates SSH tests - skipping Playwright browser installation");
494
+ return;
495
+ }
496
+ // Only install browsers for Web/Frontend or Scenarios projects
497
+ const projectTypeEnv = (process.env.PROJECT_TYPE ||
498
+ process.env.PROJECTTYPE ||
499
+ "").toUpperCase();
500
+ const isProjectTypeWebOrScenarios = projectTypeEnv === "WEB" ||
501
+ projectTypeEnv === "FRONTEND" ||
502
+ projectTypeEnv === "SCENARIOS";
503
+ const hasFrontendScripts = !!pkg.scripts?.["test:preprod"]?.includes("playwright test") ||
504
+ !!pkg.scripts?.["ui:preprod"] ||
505
+ !!pkg.scripts?.["codegen:preprod"];
506
+ if (!(isProjectTypeWebOrScenarios || hasFrontendScripts)) {
507
+ console.log("AutoCore Consumer: Projeto não é Web/Cenários — pulando instalação de browsers Playwright");
508
+ return;
509
+ }
510
+ const possiblePaths = [
511
+ path.join(cwd, "node_modules", ".cache", "ms-playwright"),
512
+ path.join(cwd, "node_modules", "playwright-core", ".local-browsers"),
513
+ path.join(cwd, "node_modules", "playwright", ".local-browsers"),
514
+ ];
515
+ const browsersInstalled = possiblePaths.some((p) => fs.existsSync(p));
516
+ if (browsersInstalled) {
517
+ console.log("AutoCore Consumer: Browsers Playwright já instalados ✓");
518
+ return;
519
+ }
520
+ console.log("AutoCore Consumer: Instalando browsers Playwright (via npx)...");
521
+ try {
522
+ console.log(" ⚠️ Ajustando NODE_TLS_REJECT_UNAUTHORIZED=0 para evitar erros TLS durante o download");
523
+ await execAsync("npx playwright install --with-deps", {
524
+ timeout: 120000,
525
+ windowsHide: true,
526
+ shell: true,
527
+ env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED: "0" },
528
+ });
529
+ console.log("AutoCore Consumer: Browsers Playwright instalados ✓");
530
+ }
531
+ catch (e) {
532
+ console.warn("AutoCore Consumer: Falha no install --with-deps, tentando fallback...");
533
+ try {
534
+ await execAsync("npx playwright install", {
535
+ timeout: 120000,
536
+ windowsHide: true,
537
+ shell: true,
538
+ env: { ...process.env, NODE_TLS_REJECT_UNAUTHORIZED: "0" },
539
+ });
540
+ console.log("AutoCore Consumer: Browsers Playwright instalados ✓");
541
+ }
542
+ catch (err) {
543
+ console.warn("AutoCore Consumer: Não foi possível instalar browsers Playwright automaticamente. Rode: npx playwright install");
544
+ }
545
+ }
546
+ }
547
+ catch (error) {
548
+ if (process.env.DEBUG_MCP)
549
+ console.warn("Erro ao verificar Playwright consumer:", error);
550
+ }
551
+ }
552
+ /**
553
+ * 🚀 Função principal do postinstall
554
+ */
555
+ async function main() {
556
+ console.log("🎯 ======================================================");
557
+ console.log("🎯 AutoCore Consumer Project Postinstall");
558
+ console.log("🎯 ======================================================");
559
+ console.log();
560
+ // 1. Verificar se está em ambiente local
561
+ if (!isLocalEnvironment()) {
562
+ console.log("🤖 Ambiente CI/CD ou não-Windows detectado");
563
+ console.log();
564
+ return;
565
+ }
566
+ console.log("🏠 Ambiente local Windows detectado");
567
+ console.log();
568
+ // 2. Verificar se VS Code está instalado
569
+ const vscodeInstalled = isVSCodeInstalled();
570
+ if (!vscodeInstalled) {
571
+ console.log("⚠️ VS Code não foi encontrado no sistema");
572
+ console.log("💡 Para aproveitar todas as funcionalidades do AutoCore, instale o VS Code:");
573
+ console.log(" https://code.visualstudio.com/");
574
+ console.log();
575
+ return;
576
+ }
577
+ console.log("✅ VS Code encontrado no sistema");
578
+ console.log();
579
+ // 3. Verificar extensões recomendadas (NÃO instala automaticamente — evita abrir VS Code)
580
+ const missingExtensions = [];
581
+ for (const extension of REQUIRED_EXTENSIONS) {
582
+ const isInstalled = isExtensionInstalled(extension.id);
583
+ if (isInstalled) {
584
+ console.log(`✅ ${extension.name}`);
585
+ }
586
+ else {
587
+ missingExtensions.push(extension);
588
+ }
589
+ }
590
+ console.log();
591
+ // 4. Resumo final
592
+ console.log("📊 ======================================================");
593
+ console.log("📊 Resumo da Instalação");
594
+ console.log("📊 ======================================================");
595
+ if (missingExtensions.length === 0) {
596
+ console.log("💡 Seu ambiente AutoCore está pronto para uso!");
597
+ }
598
+ else {
599
+ console.log(`⚠️ ${missingExtensions.length} extensão(ões) recomendada(s) não encontrada(s):`);
600
+ console.log();
601
+ for (const ext of missingExtensions) {
602
+ console.log(` 📦 ${ext.name} — ${ext.description}`);
603
+ console.log(` Instalar: code --install-extension ${ext.id}`);
604
+ }
605
+ console.log();
606
+ console.log("💡 Para instalar todas de uma vez, rode:");
607
+ const installCmd = missingExtensions
608
+ .map((e) => `code --install-extension ${e.id}`)
609
+ .join(" && ");
610
+ console.log(` ${installCmd}`);
611
+ }
612
+ console.log();
613
+ console.log("🔧 Para mais informações sobre configuração do ambiente:");
614
+ console.log(" Acesse o site com a VPN ativada: http://brtlvlty0559pl:3002/");
615
+ console.log(" 💬 Suporte: Equipe TestHUB");
616
+ console.log();
617
+ // 5. Instalar/Atualizar MCP globalmente
618
+ const mcpReady = await installMcpPackageGlobally();
619
+ console.log();
620
+ // 5.1 Configurar autostart local no logon do Windows
621
+ const autostartReady = await ensureWindowsMcpAutostart();
622
+ if (!mcpReady) {
623
+ console.log("⚠️ Instalação global do MCP não concluída; AutoStart usará npx no login do usuário");
624
+ console.log(" 💡 Quando houver VPN/rede disponível, rode o postinstall novamente para atualizar via npm -g");
625
+ console.log();
626
+ }
627
+ if (!autostartReady) {
628
+ console.log("⚠️ AutoStart não pôde ser configurado automaticamente.");
629
+ console.log(` 💡 Inicie manualmente em background: wscript.exe "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\${WINDOWS_MCP_STARTUP_VBS_FILE}"`);
630
+ console.log(` 💡 Inicie agora (temporário): ${WINDOWS_MCP_AUTOSTART_START_COMMAND}`);
631
+ console.log();
632
+ }
633
+ // 6. Configurar arquivo .vscode/mcp.json
634
+ await ensureMcpConfig();
635
+ // 6.5 Verificar/Instalar Playwright para projetos consumidores
636
+ await ensurePlaywrightForConsumer();
637
+ // 7. Sincronizar configurações do AutoCore (biome.json e tsconfig.json)
638
+ console.log("🔄 ======================================================");
639
+ console.log("🔄 Sincronizando Configurações do AutoCore");
640
+ console.log("🔄 ======================================================");
641
+ console.log();
642
+ try {
643
+ // Executar sync-configs.ts via npx tsx (evita problemas de import/rootDir)
644
+ const syncConfigsPath = path.join(__dirname, "sync-configs.ts");
645
+ // 🎯 Tentar executar sync sem depender de pipeline Azure
646
+ // Funciona localmente e em qualquer ambiente
647
+ try {
648
+ await execAsync(`npx tsx "${syncConfigsPath}"`, {
649
+ timeout: 30000,
650
+ windowsHide: true,
651
+ shell: true,
652
+ });
653
+ console.log("✅ Configurações sincronizadas com sucesso!");
654
+ }
655
+ catch (tsxError) {
656
+ // Fallback: tentar com ts-node se tsx falhar
657
+ try {
658
+ await execAsync(`npx ts-node "${syncConfigsPath}"`, {
659
+ timeout: 30000,
660
+ windowsHide: true,
661
+ shell: true,
662
+ });
663
+ console.log("✅ Configurações sincronizadas com sucesso! (via ts-node)");
664
+ }
665
+ catch {
666
+ // Fallback final: tentar versão compilada JS
667
+ const syncConfigsJsPath = syncConfigsPath.replace(".ts", ".js");
668
+ if (fs.existsSync(syncConfigsJsPath)) {
669
+ await execAsync(`node "${syncConfigsJsPath}"`, {
670
+ timeout: 30000,
671
+ windowsHide: true,
672
+ shell: true,
673
+ });
674
+ console.log("✅ Configurações sincronizadas com sucesso! (via JS)");
675
+ }
676
+ else {
677
+ throw tsxError;
678
+ }
679
+ }
680
+ }
681
+ }
682
+ catch (error) {
683
+ console.warn("⚠️ Aviso: Não foi possível sincronizar configurações automaticamente");
684
+ console.warn(" 💡 Você pode sincronizá-las manualmente executando: npm run sync");
685
+ if (error instanceof Error && !error.message.includes("timeout")) {
686
+ console.warn(` Erro: ${error.message}`);
687
+ }
688
+ }
689
+ console.log();
690
+ // 8. Sincronizar GitHub Copilot Instructions
691
+ await syncCopilotInstructions();
692
+ }
693
+ /**
694
+ * 🤖 Sincroniza o arquivo copilot-instructions.md para o projeto consumidor
695
+ * Garante que o GitHub Copilot entenda os padrões do AutoCore/TestHub
696
+ */
697
+ async function syncCopilotInstructions() {
698
+ console.log("🤖 ======================================================");
699
+ console.log("🤖 Sincronizando GitHub Copilot Instructions");
700
+ console.log("🤖 ======================================================");
701
+ console.log();
702
+ try {
703
+ // Caminho do arquivo fonte no AutoCore
704
+ // Se estiver em dist/scripts, subir dois níveis; senão, um nível
705
+ const isDist = __dirname.includes("dist");
706
+ const levelsUp = isDist ? "../.." : "..";
707
+ const sourceFile = path.join(__dirname, levelsUp, ".github", "copilot-instructions.md");
708
+ // Caminho do projeto consumidor (onde o npm install foi executado)
709
+ const consumerProjectRoot = process.cwd();
710
+ const targetDir = path.join(consumerProjectRoot, ".github");
711
+ const targetFile = path.join(targetDir, "copilot-instructions.md");
712
+ console.log(`📂 Caminho fonte: ${sourceFile}`);
713
+ console.log(`📂 Caminho destino: ${targetFile}`);
714
+ console.log();
715
+ // Verificar se o arquivo fonte existe
716
+ if (!fs.existsSync(sourceFile)) {
717
+ console.warn("⚠️ Arquivo copilot-instructions.md não encontrado no AutoCore");
718
+ console.warn(` Caminho esperado: ${sourceFile}`);
719
+ console.warn(` __dirname: ${__dirname}`);
720
+ return;
721
+ }
722
+ // Criar a pasta .github se não existir
723
+ if (!fs.existsSync(targetDir)) {
724
+ fs.mkdirSync(targetDir, { recursive: true });
725
+ console.log(`📁 Pasta .github criada em: ${targetDir}`);
726
+ }
727
+ // Ler o conteúdo do arquivo fonte
728
+ const sourceContent = fs.readFileSync(sourceFile, "utf-8");
729
+ // Verificar se o arquivo já existe no destino
730
+ let shouldUpdate = true;
731
+ if (fs.existsSync(targetFile)) {
732
+ const targetContent = fs.readFileSync(targetFile, "utf-8");
733
+ // Comparar conteúdos
734
+ if (sourceContent === targetContent) {
735
+ console.log("✅ copilot-instructions.md já está atualizado");
736
+ shouldUpdate = false;
737
+ }
738
+ else {
739
+ console.log("🔄 Atualizando copilot-instructions.md (nova versão disponível)");
740
+ }
741
+ }
742
+ else {
743
+ console.log("📝 Criando copilot-instructions.md no projeto");
744
+ }
745
+ // Copiar/Atualizar o arquivo se necessário
746
+ if (shouldUpdate) {
747
+ // Adicionar cabeçalho informando que é gerado automaticamente
748
+ const headerComment = `<!--
749
+ 🤖 ARQUIVO GERADO AUTOMATICAMENTE PELO AUTOCORE
750
+ ⚠️ NÃO EDITE MANUALMENTE - Será sobrescrito no próximo npm install
751
+ 📅 Última atualização: ${new Date().toISOString()}
752
+ 📦 Fonte: @silasfmartins/testhub
753
+ -->
754
+
755
+ `;
756
+ const finalContent = headerComment + sourceContent;
757
+ fs.writeFileSync(targetFile, finalContent, "utf-8");
758
+ console.log("✅ copilot-instructions.md sincronizado com sucesso!");
759
+ console.log(` 📍 Destino: ${targetFile}`);
760
+ }
761
+ console.log();
762
+ console.log("💡 O GitHub Copilot agora entende os padrões do AutoCore/TestHub!");
763
+ console.log(" 🔹 Migração Java → TypeScript");
764
+ console.log(" 🔹 Geração de testes automatizados");
765
+ console.log(" 🔹 Padrões de Page Objects, Fixtures e Statements");
766
+ console.log(" 🔹 Uso correto de TestHubVars, DataStore, WebActions, ApiActions, SSHActions");
767
+ }
768
+ catch (error) {
769
+ console.warn("⚠️ Aviso: Não foi possível sincronizar copilot-instructions.md");
770
+ if (error instanceof Error) {
771
+ console.warn(` Erro: ${error.message}`);
772
+ }
773
+ }
774
+ console.log();
775
+ }
776
+ // Executar main() sempre que chamado diretamente via tsx/node
777
+ const isMainModule = process.argv[1]?.endsWith("consumer-postinstall.ts") ||
778
+ process.argv[1]?.endsWith("consumer-postinstall.js");
779
+ if (isMainModule) {
780
+ main().catch((error) => {
781
+ console.error("💥 Erro durante o postinstall:", error);
782
+ process.exit(1);
783
+ });
784
+ }
785
+ export { main as consumerPostinstall };