agentworkshop 0.4.0 → 0.4.1
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.
|
@@ -88,12 +88,19 @@ export default defineNuxtPlugin(async (nuxtApp) => {
|
|
|
88
88
|
// 首次装载
|
|
89
89
|
await syncPlugins()
|
|
90
90
|
|
|
91
|
-
// 页面切换广播(
|
|
91
|
+
// 页面切换广播(已装载插件均可感知;防御性隔离——单插件异常不影响路由)
|
|
92
92
|
if (loaded.size) {
|
|
93
93
|
nuxtApp.hooks.hook('page:finish', () => {
|
|
94
|
-
|
|
94
|
+
let path = ''
|
|
95
|
+
try {
|
|
96
|
+
path = useRoute().path ?? ''
|
|
97
|
+
}
|
|
98
|
+
catch { /* 路由上下文不可用时静默 */ }
|
|
95
99
|
for (const { ctx } of loaded.values()) {
|
|
96
|
-
|
|
100
|
+
try {
|
|
101
|
+
ctx?.hooks?.emit('page:change', { path })
|
|
102
|
+
}
|
|
103
|
+
catch { /* 单插件广播失败不阻断 */ }
|
|
97
104
|
}
|
|
98
105
|
})
|
|
99
106
|
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 应用 UI 截图走查 — dev server(127.0.0.1:3000)+ Edge + puppeteer-core。
|
|
3
|
+
* 注册临时用户 → 会话 cookie → 截图指定页面。
|
|
4
|
+
* 用法:node scripts/_dbg-app-shot.mjs [输出目录] [path1 path2 ...]
|
|
5
|
+
*/
|
|
6
|
+
import puppeteer from 'puppeteer-core'
|
|
7
|
+
import fs from 'node:fs'
|
|
8
|
+
|
|
9
|
+
const EDGE = 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe'
|
|
10
|
+
const BASE = 'http://127.0.0.1:3000'
|
|
11
|
+
const OUT = process.argv[2] ?? 'gui-test-screenshots/app-v1'
|
|
12
|
+
const PAGES = process.argv.slice(3).length ? process.argv.slice(3) : ['/']
|
|
13
|
+
|
|
14
|
+
const main = async () => {
|
|
15
|
+
fs.mkdirSync(OUT, { recursive: true })
|
|
16
|
+
const browser = await puppeteer.launch({ executablePath: EDGE, headless: 'new' })
|
|
17
|
+
const page = await browser.newPage()
|
|
18
|
+
await page.setViewport({ width: 1600, height: 900, deviceScaleFactor: 1 })
|
|
19
|
+
|
|
20
|
+
// 在页面上下文里注册临时用户(自动携带同源 cookie)
|
|
21
|
+
await page.goto(`${BASE}/`, { waitUntil: 'domcontentloaded' })
|
|
22
|
+
const reg = await page.evaluate(async () => {
|
|
23
|
+
const id = Math.random().toString(36).slice(2, 8)
|
|
24
|
+
const res = await fetch('/api/users/register', {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: { 'content-type': 'application/json' },
|
|
27
|
+
body: JSON.stringify({ name: `shot-${id}`, email: `shot-${id}@test.local`, password: 'Passw0rd!123' }),
|
|
28
|
+
})
|
|
29
|
+
return res.json()
|
|
30
|
+
})
|
|
31
|
+
const token = reg?.data?.token ?? reg?.data?.session?.token
|
|
32
|
+
if (token) {
|
|
33
|
+
await page.evaluate((t) => {
|
|
34
|
+
localStorage.setItem('aw.token', t)
|
|
35
|
+
localStorage.setItem('token', t)
|
|
36
|
+
document.cookie = `aw_token=${t}; path=/`
|
|
37
|
+
}, token)
|
|
38
|
+
}
|
|
39
|
+
console.log('registered:', !!token)
|
|
40
|
+
|
|
41
|
+
for (const p of PAGES) {
|
|
42
|
+
await page.goto(`${BASE}${p}`, { waitUntil: 'networkidle2', timeout: 60000 })
|
|
43
|
+
await new Promise(r => setTimeout(r, 2500))
|
|
44
|
+
await page.screenshot({ path: `${OUT}/${p.replace(/\//g, '_') || 'root'}.png`, fullPage: true })
|
|
45
|
+
console.log('shot', p)
|
|
46
|
+
}
|
|
47
|
+
await browser.close()
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
main().catch(e => { console.error(e); process.exit(1) })
|
|
@@ -1,32 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 文档站截图走查 — vitepress preview(127.0.0.1:4477)+ Edge + puppeteer-core。
|
|
3
|
-
* 用法:node scripts/_dbg-docs-site-shot.mjs
|
|
3
|
+
* 用法:node scripts/_dbg-docs-site-shot.mjs [输出目录]
|
|
4
4
|
*/
|
|
5
5
|
import puppeteer from 'puppeteer-core'
|
|
6
6
|
import fs from 'node:fs'
|
|
7
7
|
|
|
8
8
|
const EDGE = 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe'
|
|
9
9
|
const BASE = 'http://127.0.0.1:4477/AgentWorkShop'
|
|
10
|
-
const OUT = 'gui-test-screenshots/docs-site-
|
|
11
|
-
|
|
12
|
-
const PAGES = [
|
|
13
|
-
{ name: "guide-getting-started", path: '/', width: 1440 },
|
|
14
|
-
{ name: 'guide-getting-started', path: '/guide/getting-started', width: 1440 },
|
|
15
|
-
{ name: 'license', path: '/guide/license', width: 1440 },
|
|
16
|
-
]
|
|
10
|
+
const OUT = process.argv[2] ?? 'gui-test-screenshots/docs-site-v5'
|
|
17
11
|
|
|
18
12
|
const main = async () => {
|
|
19
13
|
fs.mkdirSync(OUT, { recursive: true })
|
|
20
14
|
const browser = await puppeteer.launch({ executablePath: EDGE, headless: 'new' })
|
|
21
|
-
|
|
15
|
+
const shoot = async (name, path, { width = 1440, fullPage = true, height = 900 } = {}) => {
|
|
22
16
|
const page = await browser.newPage()
|
|
23
|
-
await page.setViewport({ width
|
|
24
|
-
await page.goto(`${BASE}${
|
|
17
|
+
await page.setViewport({ width, height, deviceScaleFactor: 1 })
|
|
18
|
+
await page.goto(`${BASE}${path}`, { waitUntil: 'networkidle0', timeout: 30000 })
|
|
25
19
|
await new Promise(r => setTimeout(r, 600))
|
|
26
|
-
await page.screenshot({ path: `${OUT}/${
|
|
27
|
-
console.log('shot',
|
|
20
|
+
await page.screenshot({ path: `${OUT}/${name}.png`, fullPage })
|
|
21
|
+
console.log('shot', name)
|
|
28
22
|
await page.close()
|
|
29
23
|
}
|
|
24
|
+
await shoot('home-top', '/', { fullPage: false })
|
|
25
|
+
await shoot('home', '/', {})
|
|
26
|
+
await shoot('guide-getting-started', '/guide/getting-started', {})
|
|
27
|
+
await shoot('guide-top', '/guide/getting-started', { fullPage: false })
|
|
28
|
+
await shoot('license', '/guide/license', {})
|
|
30
29
|
await browser.close()
|
|
31
30
|
}
|
|
32
31
|
|