@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.
- package/.github/copilot-instructions.md +520 -0
- package/biome.json +37 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +169 -0
- package/dist/scripts/consumer-postinstall.d.ts +15 -0
- package/dist/scripts/consumer-postinstall.js +785 -0
- package/dist/scripts/generate-docs.d.ts +16 -0
- package/dist/scripts/generate-docs.js +1363 -0
- package/dist/scripts/generate-index.d.ts +2 -0
- package/dist/scripts/generate-index.js +314 -0
- package/dist/scripts/init-api.d.ts +2 -0
- package/dist/scripts/init-api.js +525 -0
- package/dist/scripts/init-banco.d.ts +2 -0
- package/dist/scripts/init-banco.js +347 -0
- package/dist/scripts/init-frontend.d.ts +2 -0
- package/dist/scripts/init-frontend.js +627 -0
- package/dist/scripts/init-mobile.d.ts +2 -0
- package/dist/scripts/init-mobile.js +481 -0
- package/dist/scripts/init-scenarios.d.ts +2 -0
- package/dist/scripts/init-scenarios.js +846 -0
- package/dist/scripts/init-ssh.d.ts +2 -0
- package/dist/scripts/init-ssh.js +639 -0
- package/dist/scripts/package-versions.d.ts +57 -0
- package/dist/scripts/package-versions.js +768 -0
- package/dist/scripts/postinstall.d.ts +1 -0
- package/dist/scripts/postinstall.js +527 -0
- package/dist/scripts/robust-build.d.ts +7 -0
- package/dist/scripts/robust-build.js +88 -0
- package/dist/scripts/setup-local-packages.d.ts +31 -0
- package/dist/scripts/setup-local-packages.js +237 -0
- package/dist/scripts/smart-override.d.ts +2 -0
- package/dist/scripts/smart-override.js +1360 -0
- package/dist/scripts/sync-configs.d.ts +27 -0
- package/dist/scripts/sync-configs.js +248 -0
- package/dist/scripts/test-biome-parse.d.ts +5 -0
- package/dist/scripts/test-biome-parse.js +84 -0
- package/dist/scripts/ultracite-setup.d.ts +4 -0
- package/dist/scripts/ultracite-setup.js +310 -0
- package/dist/scripts/update-all-init-scripts.d.ts +2 -0
- package/dist/scripts/update-all-init-scripts.js +52 -0
- package/dist/scripts/update-biome-schema.d.ts +15 -0
- package/dist/scripts/update-biome-schema.js +124 -0
- package/dist/src/AutoCoreFacade.d.ts +145 -0
- package/dist/src/AutoCoreFacade.js +217 -0
- package/dist/src/api/ApiActions.d.ts +297 -0
- package/dist/src/api/ApiActions.js +1905 -0
- package/dist/src/api/Certificate.d.ts +60 -0
- package/dist/src/api/Certificate.js +79 -0
- package/dist/src/api/JsonResponse.d.ts +116 -0
- package/dist/src/api/JsonResponse.js +206 -0
- package/dist/src/appium/DeviceFarmViewer.d.ts +79 -0
- package/dist/src/appium/DeviceFarmViewer.js +1083 -0
- package/dist/src/appium/MobileActions.d.ts +347 -0
- package/dist/src/appium/MobileActions.js +1632 -0
- package/dist/src/appium/MobileConnection.d.ts +160 -0
- package/dist/src/appium/MobileConnection.js +772 -0
- package/dist/src/config/envLoader.d.ts +123 -0
- package/dist/src/config/envLoader.js +361 -0
- package/dist/src/config/jest-safe-setup.d.ts +19 -0
- package/dist/src/config/jest-safe-setup.js +369 -0
- package/dist/src/config/timeouts.d.ts +32 -0
- package/dist/src/config/timeouts.js +38 -0
- package/dist/src/desktop/DesktopActions.d.ts +46 -0
- package/dist/src/desktop/DesktopActions.js +398 -0
- package/dist/src/desktop/DesktopConnection.d.ts +32 -0
- package/dist/src/desktop/DesktopConnection.js +84 -0
- package/dist/src/domain/entities/TestExecution.d.ts +117 -0
- package/dist/src/domain/entities/TestExecution.js +150 -0
- package/dist/src/domain/entities/TestReport.d.ts +114 -0
- package/dist/src/domain/entities/TestReport.js +179 -0
- package/dist/src/domain/repositories/ITestRepository.d.ts +196 -0
- package/dist/src/domain/repositories/ITestRepository.js +14 -0
- package/dist/src/domain/schemas/ValidationSchemas.d.ts +159 -0
- package/dist/src/domain/schemas/ValidationSchemas.js +181 -0
- package/dist/src/functions/errors/BaseError.d.ts +78 -0
- package/dist/src/functions/errors/BaseError.js +245 -0
- package/dist/src/functions/errors/ConfigurationError.d.ts +16 -0
- package/dist/src/functions/errors/ConfigurationError.js +48 -0
- package/dist/src/functions/errors/ErrorCatalog.d.ts +148 -0
- package/dist/src/functions/errors/ErrorCatalog.js +157 -0
- package/dist/src/functions/errors/GlobalErrorHandler.d.ts +101 -0
- package/dist/src/functions/errors/GlobalErrorHandler.js +281 -0
- package/dist/src/functions/errors/IntegrationError.d.ts +17 -0
- package/dist/src/functions/errors/IntegrationError.js +51 -0
- package/dist/src/functions/errors/SecurityError.d.ts +14 -0
- package/dist/src/functions/errors/SecurityError.js +42 -0
- package/dist/src/functions/errors/SystemError.d.ts +12 -0
- package/dist/src/functions/errors/SystemError.js +36 -0
- package/dist/src/functions/errors/ValidationError.d.ts +14 -0
- package/dist/src/functions/errors/ValidationError.js +61 -0
- package/dist/src/functions/errors/index.d.ts +12 -0
- package/dist/src/functions/errors/index.js +13 -0
- package/dist/src/global-setup.d.ts +1 -0
- package/dist/src/global-setup.js +1037 -0
- package/dist/src/helpers/BancoActions.d.ts +188 -0
- package/dist/src/helpers/BancoActions.js +581 -0
- package/dist/src/helpers/EnviromentHelper.d.ts +17 -0
- package/dist/src/helpers/EnviromentHelper.js +66 -0
- package/dist/src/helpers/ParallelExecutionHelper.d.ts +183 -0
- package/dist/src/helpers/ParallelExecutionHelper.js +375 -0
- package/dist/src/helpers/SyncSignal.d.ts +15 -0
- package/dist/src/helpers/SyncSignal.js +44 -0
- package/dist/src/hubdocs/CategoryDetector.d.ts +83 -0
- package/dist/src/hubdocs/CategoryDetector.js +401 -0
- package/dist/src/hubdocs/DirectStatementInterceptor.d.ts +54 -0
- package/dist/src/hubdocs/DirectStatementInterceptor.js +243 -0
- package/dist/src/hubdocs/ExecutionTracker.d.ts +107 -0
- package/dist/src/hubdocs/ExecutionTracker.js +702 -0
- package/dist/src/hubdocs/HubDocs.d.ts +395 -0
- package/dist/src/hubdocs/HubDocs.js +3586 -0
- package/dist/src/hubdocs/StatementMethodFilter.d.ts +71 -0
- package/dist/src/hubdocs/StatementMethodFilter.js +618 -0
- package/dist/src/hubdocs/StatementTracker.d.ts +417 -0
- package/dist/src/hubdocs/StatementTracker.js +2419 -0
- package/dist/src/hubdocs/SwaggerGenerator.d.ts +59 -0
- package/dist/src/hubdocs/SwaggerGenerator.js +405 -0
- package/dist/src/hubdocs/index.d.ts +9 -0
- package/dist/src/hubdocs/index.js +9 -0
- package/dist/src/hubdocs/types.d.ts +114 -0
- package/dist/src/hubdocs/types.js +5 -0
- package/dist/src/infrastructure/DependencyContainer.d.ts +142 -0
- package/dist/src/infrastructure/DependencyContainer.js +250 -0
- package/dist/src/infrastructure/adapters/AppiumAdapter.d.ts +168 -0
- package/dist/src/infrastructure/adapters/AppiumAdapter.js +468 -0
- package/dist/src/infrastructure/adapters/OracleAdapter.d.ts +150 -0
- package/dist/src/infrastructure/adapters/OracleAdapter.js +388 -0
- package/dist/src/infrastructure/adapters/PlaywrightAdapter.d.ts +192 -0
- package/dist/src/infrastructure/adapters/PlaywrightAdapter.js +382 -0
- package/dist/src/infrastructure/adapters/SSHAdapter.d.ts +141 -0
- package/dist/src/infrastructure/adapters/SSHAdapter.js +428 -0
- package/dist/src/interfaces.d.ts +501 -0
- package/dist/src/interfaces.js +25 -0
- package/dist/src/internal/fakes/__fake-actions__.d.ts +17 -0
- package/dist/src/internal/fakes/__fake-actions__.js +21 -0
- package/dist/src/internal/fakes/__forbidden__.d.ts +10 -0
- package/dist/src/internal/fakes/__forbidden__.js +18 -0
- package/dist/src/internal/fakes/__honeypot__.d.ts +15 -0
- package/dist/src/internal/fakes/__honeypot__.js +24 -0
- package/dist/src/octane/OctaneReporter.d.ts +13 -0
- package/dist/src/octane/OctaneReporter.js +61 -0
- package/dist/src/playwright/CryptoActions.d.ts +20 -0
- package/dist/src/playwright/CryptoActions.js +75 -0
- package/dist/src/playwright/EnhancedWebActions.d.ts +7 -0
- package/dist/src/playwright/EnhancedWebActions.js +65 -0
- package/dist/src/playwright/WebActions.d.ts +1599 -0
- package/dist/src/playwright/WebActions.js +11788 -0
- package/dist/src/playwright/actions/ActionTimeline.d.ts +36 -0
- package/dist/src/playwright/actions/ActionTimeline.js +101 -0
- package/dist/src/playwright/actions/RecoveryQueue.d.ts +82 -0
- package/dist/src/playwright/actions/RecoveryQueue.js +130 -0
- package/dist/src/playwright/actions/SelectorCache.d.ts +53 -0
- package/dist/src/playwright/actions/SelectorCache.js +96 -0
- package/dist/src/playwright/actions/index.d.ts +13 -0
- package/dist/src/playwright/actions/index.js +14 -0
- package/dist/src/playwright/actions/types.d.ts +147 -0
- package/dist/src/playwright/actions/types.js +5 -0
- package/dist/src/playwright/fixtures.d.ts +112 -0
- package/dist/src/playwright/fixtures.js +718 -0
- package/dist/src/playwright/network-logs-reporter.d.ts +7 -0
- package/dist/src/playwright/network-logs-reporter.js +66 -0
- package/dist/src/playwright/registerRecoveryWrappers.d.ts +1 -0
- package/dist/src/playwright/registerRecoveryWrappers.js +54 -0
- package/dist/src/security/BuildSecurity.d.ts +12 -0
- package/dist/src/security/BuildSecurity.js +138 -0
- package/dist/src/security/EulaProtection.d.ts +70 -0
- package/dist/src/security/EulaProtection.js +155 -0
- package/dist/src/security/HoneypotManager.d.ts +46 -0
- package/dist/src/security/HoneypotManager.js +234 -0
- package/dist/src/security/KeysManager.d.ts +36 -0
- package/dist/src/security/KeysManager.js +158 -0
- package/dist/src/security/ProofOfWorkIntegration.d.ts +64 -0
- package/dist/src/security/ProofOfWorkIntegration.js +206 -0
- package/dist/src/security/SecurityValidation.d.ts +21 -0
- package/dist/src/security/SecurityValidation.js +163 -0
- package/dist/src/security/SourceMapProtection.d.ts +55 -0
- package/dist/src/security/SourceMapProtection.js +220 -0
- package/dist/src/security/protector.d.ts +1 -0
- package/dist/src/security/protector.js +97 -0
- package/dist/src/ssh/SSHActions.d.ts +262 -0
- package/dist/src/ssh/SSHActions.js +790 -0
- package/dist/src/ssh/SSHClient.d.ts +99 -0
- package/dist/src/ssh/SSHClient.js +409 -0
- package/dist/src/statements/BaseStatement.d.ts +38 -0
- package/dist/src/statements/BaseStatement.js +78 -0
- package/dist/src/testContext/AuthStateManager.d.ts +93 -0
- package/dist/src/testContext/AuthStateManager.js +256 -0
- package/dist/src/testContext/CoverageManager.d.ts +198 -0
- package/dist/src/testContext/CoverageManager.js +917 -0
- package/dist/src/testContext/TestAnnotations.d.ts +476 -0
- package/dist/src/testContext/TestAnnotations.js +2647 -0
- package/dist/src/testContext/TestContext.d.ts +138 -0
- package/dist/src/testContext/TestContext.js +369 -0
- package/dist/src/testContext/UnifiedHtmlGenerator.d.ts +7 -0
- package/dist/src/testContext/UnifiedHtmlGenerator.js +264 -0
- package/dist/src/testContext/UnifiedReportManager.d.ts +211 -0
- package/dist/src/testContext/UnifiedReportManager.js +1206 -0
- package/dist/src/testhub/DynamicConfigManager.d.ts +121 -0
- package/dist/src/testhub/DynamicConfigManager.js +320 -0
- package/dist/src/testhub/SystemsManager.d.ts +119 -0
- package/dist/src/testhub/SystemsManager.js +365 -0
- package/dist/src/testhub/TestHubClient.d.ts +335 -0
- package/dist/src/testhub/TestHubClient.js +1215 -0
- package/dist/src/testhub/TestHubReporter.d.ts +62 -0
- package/dist/src/testhub/TestHubReporter.js +576 -0
- package/dist/src/testhub/TestHubVars.d.ts +116 -0
- package/dist/src/testhub/TestHubVars.js +273 -0
- package/dist/src/utils/ActionInterceptor.d.ts +59 -0
- package/dist/src/utils/ActionInterceptor.js +741 -0
- package/dist/src/utils/ArtifactsCompressor.d.ts +43 -0
- package/dist/src/utils/ArtifactsCompressor.js +181 -0
- package/dist/src/utils/AutoLogsFinal.d.ts +47 -0
- package/dist/src/utils/AutoLogsFinal.js +148 -0
- package/dist/src/utils/CodeGenSession.d.ts +114 -0
- package/dist/src/utils/CodeGenSession.js +264 -0
- package/dist/src/utils/ConfigLogger.d.ts +133 -0
- package/dist/src/utils/ConfigLogger.js +611 -0
- package/dist/src/utils/CustomReporter.d.ts +22 -0
- package/dist/src/utils/CustomReporter.js +352 -0
- package/dist/src/utils/DataStore.d.ts +171 -0
- package/dist/src/utils/DataStore.js +484 -0
- package/dist/src/utils/DatabaseInterceptor.d.ts +19 -0
- package/dist/src/utils/DatabaseInterceptor.js +295 -0
- package/dist/src/utils/DateHelper.d.ts +16 -0
- package/dist/src/utils/DateHelper.js +120 -0
- package/dist/src/utils/DateValidator.d.ts +4 -0
- package/dist/src/utils/DateValidator.js +51 -0
- package/dist/src/utils/DocumentGenerator.d.ts +35 -0
- package/dist/src/utils/DocumentGenerator.js +129 -0
- package/dist/src/utils/EvidenceCapture.d.ts +90 -0
- package/dist/src/utils/EvidenceCapture.js +600 -0
- package/dist/src/utils/EvidenceReportGenerator.d.ts +70 -0
- package/dist/src/utils/EvidenceReportGenerator.js +799 -0
- package/dist/src/utils/FrameManagementUtil.d.ts +42 -0
- package/dist/src/utils/FrameManagementUtil.js +75 -0
- package/dist/src/utils/GlobalStatementsInterceptor.d.ts +1 -0
- package/dist/src/utils/GlobalStatementsInterceptor.js +1 -0
- package/dist/src/utils/HTMLTemplate.d.ts +1 -0
- package/dist/src/utils/HTMLTemplate.js +1034 -0
- package/dist/src/utils/InterceptacaoMagica.d.ts +23 -0
- package/dist/src/utils/InterceptacaoMagica.js +365 -0
- package/dist/src/utils/LogSanitizer.d.ts +35 -0
- package/dist/src/utils/LogSanitizer.js +110 -0
- package/dist/src/utils/Logger.d.ts +65 -0
- package/dist/src/utils/Logger.js +284 -0
- package/dist/src/utils/McpLocalClient.d.ts +141 -0
- package/dist/src/utils/McpLocalClient.js +871 -0
- package/dist/src/utils/PDFEvidenceGenerator.d.ts +20 -0
- package/dist/src/utils/PDFEvidenceGenerator.js +156 -0
- package/dist/src/utils/SpecFileAnalyzer.d.ts +35 -0
- package/dist/src/utils/SpecFileAnalyzer.js +209 -0
- package/dist/src/utils/StatementInterceptor.d.ts +18 -0
- package/dist/src/utils/StatementInterceptor.js +87 -0
- package/dist/src/utils/StatementLogger.d.ts +33 -0
- package/dist/src/utils/StatementLogger.js +113 -0
- package/dist/src/utils/StatementsInterceptor.d.ts +1 -0
- package/dist/src/utils/StatementsInterceptor.js +1 -0
- package/dist/src/utils/TeamsFlushHook.d.ts +17 -0
- package/dist/src/utils/TeamsFlushHook.js +168 -0
- package/dist/src/utils/TerminalLogCapture.d.ts +158 -0
- package/dist/src/utils/TerminalLogCapture.js +531 -0
- package/dist/src/utils/TestMethodLogger.d.ts +70 -0
- package/dist/src/utils/TestMethodLogger.js +95 -0
- package/dist/src/utils/UnifiedTeardown.d.ts +4 -0
- package/dist/src/utils/UnifiedTeardown.js +400 -0
- package/dist/src/utils/XPathCatalog.d.ts +152 -0
- package/dist/src/utils/XPathCatalog.js +350 -0
- package/dist/src/utils/generators.d.ts +90 -0
- package/dist/src/utils/generators.js +167 -0
- package/dist/src/utils/testRecovery/ResilientPlaywright.d.ts +152 -0
- package/dist/src/utils/testRecovery/ResilientPlaywright.js +715 -0
- package/dist/src/utils/testRecovery/TestRecoveryClient.d.ts +801 -0
- package/dist/src/utils/testRecovery/TestRecoveryClient.js +1415 -0
- package/dist/src/utils/testRecovery/autoFixCode.d.ts +65 -0
- package/dist/src/utils/testRecovery/autoFixCode.js +32 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +59 -0
- package/dist/wdio.conf.d.ts +1 -0
- package/dist/wdio.conf.js +420 -0
- package/package.json +137 -0
- package/protect-loader.mjs +643 -0
- package/scripts/consumer-postinstall.ts +975 -0
- package/scripts/generate-index.ts +343 -0
- package/scripts/init-api.ts +613 -0
- package/scripts/init-banco.ts +437 -0
- package/scripts/init-frontend.ts +727 -0
- package/scripts/init-mobile.ts +558 -0
- package/scripts/init-scenarios.ts +925 -0
- package/scripts/init-ssh.ts +734 -0
- package/scripts/package-versions.ts +978 -0
- package/scripts/postinstall.ts +605 -0
- package/scripts/smart-override.ts +1675 -0
- package/scripts/sync-configs.ts +302 -0
- package/scripts/ultracite-setup.ts +370 -0
- package/src/types/globals.d.ts +48 -0
- package/tsconfig.json +29 -0
- 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
|
+
})
|