@yorha2b-lab/autodev 5.6.3 → 5.7.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/bin/autodev.js +1 -0
- package/config.js +2 -0
- package/package.json +2 -1
- package/src/ai/index.js +2 -2
- package/src/commands/watch.js +6 -16
- package/src/dialogs/DE-DE.js +26 -25
- package/src/dialogs/EN-US.js +5 -2
- package/src/dialogs/ES-ES.js +21 -17
- package/src/dialogs/FR-FR.js +23 -22
- package/src/dialogs/ID-ID.js +23 -23
- package/src/dialogs/IT-IT.js +22 -22
- package/src/dialogs/JA-JP.js +18 -15
- package/src/dialogs/KO-KR.js +23 -23
- package/src/dialogs/PT-BR.js +23 -23
- package/src/dialogs/RU-RU.js +25 -24
- package/src/dialogs/TR-TR.js +24 -24
- package/src/dialogs/ZH-CN.js +5 -2
- package/src/dialogs/ZH-TW.js +9 -9
- package/src/framework/react/generator/index.js +1 -1
- package/src/framework/react/handlebars/partials/hookBlock.hbs +1 -1
- package/src/handlers/page.js +4 -1
- package/src/handlers/{api.js → response.js} +1 -1
- package/src/labs/index.js +5 -1
- package/src/labs/scout.js +110 -0
- package/src/labs/tower.js +2 -2
- package/src/utils/foundation.js +7 -0
- /package/src/framework/react/prompts/{api.js → response.js} +0 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
const fs = require('fs')
|
|
2
|
+
const path = require('path')
|
|
3
|
+
|
|
4
|
+
let globalBrowser = null
|
|
5
|
+
|
|
6
|
+
module.exports = ({ yorha, dialog }) => {
|
|
7
|
+
|
|
8
|
+
const { pod042 } = yorha
|
|
9
|
+
|
|
10
|
+
const isHttpURL = str => {
|
|
11
|
+
try {
|
|
12
|
+
const url = new URL(str)
|
|
13
|
+
return ['http:', 'https:'].includes(url.protocol)
|
|
14
|
+
} catch {
|
|
15
|
+
return false
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const derivePageNameFromUrl = rawUrl => {
|
|
20
|
+
const parsed = new URL(rawUrl)
|
|
21
|
+
let routePath = parsed.hash ? parsed.hash.replace(/^#/, '') : parsed.pathname
|
|
22
|
+
routePath = routePath.split('?')[0].replace(/^\/+|\/+$/g, '')
|
|
23
|
+
if (!routePath) return 'Home'
|
|
24
|
+
const parts = routePath.split(/[/\-_]/).filter(Boolean)
|
|
25
|
+
return parts.at(-1) ?? 'capturedPage'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
archeology: async targetUrl => {
|
|
30
|
+
|
|
31
|
+
if (!isHttpURL(targetUrl)) {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
pod042.report(dialog.pod042.startScout, 'green')
|
|
36
|
+
|
|
37
|
+
const puppeteer = require('puppeteer')
|
|
38
|
+
const screenshotDir = path.join(process.cwd(), 'bunker', 'screenShot')
|
|
39
|
+
const sessionDir = path.join(process.cwd(), 'bunker', '.chrome_session')
|
|
40
|
+
|
|
41
|
+
let isBrowserAlive = false
|
|
42
|
+
if (globalBrowser) {
|
|
43
|
+
try {
|
|
44
|
+
await globalBrowser.pages()
|
|
45
|
+
isBrowserAlive = true
|
|
46
|
+
} catch (e) {
|
|
47
|
+
globalBrowser = null
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!isBrowserAlive) {
|
|
52
|
+
|
|
53
|
+
['SingletonLock', 'SingletonSocket', 'SingletonCookie'].forEach(file => {
|
|
54
|
+
try { fs.unlinkSync(path.join(sessionDir, file)) } catch (e) { }
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
globalBrowser = await puppeteer.launch({
|
|
58
|
+
headless: false,
|
|
59
|
+
handleSIGINT: false,
|
|
60
|
+
defaultViewport: null,
|
|
61
|
+
userDataDir: sessionDir,
|
|
62
|
+
args: ['--start-maximized']
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const pages = await globalBrowser.pages()
|
|
67
|
+
const page = pages.length > 0 ? pages[0] : await globalBrowser.newPage()
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
await page.exposeFunction('nodeTakeScreenshot', async () => {
|
|
71
|
+
const currentUrl = await page.url()
|
|
72
|
+
const pageName = derivePageNameFromUrl(currentUrl)
|
|
73
|
+
const savePath = path.join(screenshotDir, `${pageName}.png`)
|
|
74
|
+
await page.screenshot({ path: savePath, fullPage: true })
|
|
75
|
+
pod042.report(dialog.pod042.capturedPage(pageName), 'green')
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
await page.evaluateOnNewDocument(() => {
|
|
79
|
+
if (window.__hasBunkerListener__) return
|
|
80
|
+
window.__hasBunkerListener__ = true
|
|
81
|
+
window.addEventListener('contextmenu', (e) => {
|
|
82
|
+
e.preventDefault()
|
|
83
|
+
if (window.nodeTakeScreenshot) {
|
|
84
|
+
window.nodeTakeScreenshot()
|
|
85
|
+
}
|
|
86
|
+
const toast = document.createElement('div')
|
|
87
|
+
toast.innerText = dialog.pod042.capturedToast
|
|
88
|
+
toast.style.cssText = `
|
|
89
|
+
position: fixed; top: 20px; right: 20px; z-index: 999999;
|
|
90
|
+
background: rgba(0, 0, 0, 0.85); color: #00ffcc;
|
|
91
|
+
border: 1px solid #00ffcc; padding: 12px 24px;
|
|
92
|
+
font-size: 15px; font-family: monospace; border-radius: 4px;
|
|
93
|
+
box-shadow: 0 0 15px rgba(0, 255, 204, 0.5);
|
|
94
|
+
pointer-events: none; transition: opacity 0.4s ease;
|
|
95
|
+
`
|
|
96
|
+
document.body.appendChild(toast)
|
|
97
|
+
setTimeout(() => {
|
|
98
|
+
toast.style.opacity = '0'
|
|
99
|
+
setTimeout(() => toast.remove(), 400)
|
|
100
|
+
}, 1200)
|
|
101
|
+
})
|
|
102
|
+
})
|
|
103
|
+
} catch (error) { }
|
|
104
|
+
|
|
105
|
+
await page.goto(targetUrl)
|
|
106
|
+
pod042.report(dialog.pod042.scoutReady, 'green')
|
|
107
|
+
return globalBrowser
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
package/src/labs/tower.js
CHANGED
|
@@ -54,8 +54,8 @@ module.exports = ({ utils, yorha, dialog, handlers }) => {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
pod153.report(dialog.pod153.capturedRuntimeSignal(fileName))
|
|
57
|
-
// 💡 直接调用
|
|
58
|
-
await handlers.
|
|
57
|
+
// 💡 直接调用 response-handler 物理更新 resource.js
|
|
58
|
+
await handlers.response.handle(null, { fileName, data: json })
|
|
59
59
|
hackedRegistry.set(fileName, fingerprint)
|
|
60
60
|
} catch (e) {
|
|
61
61
|
// 非 JSON 信号,保持静默
|
package/src/utils/foundation.js
CHANGED
|
@@ -12,6 +12,12 @@ const getConfig = () => {
|
|
|
12
12
|
return config
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
const findRoute = (routes, filePath) => {
|
|
16
|
+
const relative = path.relative(path.resolve('bunker'), path.resolve(filePath))
|
|
17
|
+
const root = relative.split(path.sep)[0]
|
|
18
|
+
return routes.find(route => root === route.watch)
|
|
19
|
+
}
|
|
20
|
+
|
|
15
21
|
const getExistingMenus = (dir = 'src/pages') => {
|
|
16
22
|
const pagesDir = path.join(process.cwd(), dir)
|
|
17
23
|
if (!fs.existsSync(pagesDir)) return []
|
|
@@ -36,6 +42,7 @@ const copyTemplateDir = (template, templateSubDir, targetSubDir) => {
|
|
|
36
42
|
|
|
37
43
|
module.exports = {
|
|
38
44
|
getConfig,
|
|
45
|
+
findRoute,
|
|
39
46
|
copyTemplateDir,
|
|
40
47
|
getExistingMenus,
|
|
41
48
|
}
|
|
File without changes
|