mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-12 02:37:45 +08:00
feat: 更新软件手册,优化截图捕获流程和规则说明
This commit is contained in:
@@ -63,8 +63,8 @@ Generate comprehensive, interactive software manuals in TiddlyWiki-style single-
|
|||||||
│ → 质量检查: 一致性、交叉引用、截图标记 │
|
│ → 质量检查: 一致性、交叉引用、截图标记 │
|
||||||
│ → Output: consolidation-summary.md, screenshots-list.json │
|
│ → Output: consolidation-summary.md, screenshots-list.json │
|
||||||
├─────────────────────────────────────────────────────────────────┤
|
├─────────────────────────────────────────────────────────────────┤
|
||||||
│ Phase 4: Screenshot Capture (主 Agent + Chrome MCP) │
|
│ Phase 4: Screenshot Capture (universal-executor + Chrome MCP) │
|
||||||
│ → 批量截图: 根据 screenshots-list.json │
|
│ → 批量截图: 调用 mcp__chrome__screenshot │
|
||||||
│ → Output: screenshots/*.png + manifest.json │
|
│ → Output: screenshots/*.png + manifest.json │
|
||||||
├─────────────────────────────────────────────────────────────────┤
|
├─────────────────────────────────────────────────────────────────┤
|
||||||
│ Phase 5: HTML Assembly (universal-executor) │
|
│ Phase 5: HTML Assembly (universal-executor) │
|
||||||
|
|||||||
@@ -16,9 +16,18 @@ const AGENT_CONFIGS = {
|
|||||||
'ui-guide': {
|
'ui-guide': {
|
||||||
role: 'UX Expert',
|
role: 'UX Expert',
|
||||||
output: 'section-ui-guide.md',
|
output: 'section-ui-guide.md',
|
||||||
task: '撰写界面操作指南,分步骤说明各功能使用方法',
|
task: '撰写界面操作指南,标注所有需要截图的 UI 元素',
|
||||||
focus: '界面布局、导航流程、功能操作、快捷键',
|
focus: '界面布局、导航流程、功能操作、快捷键',
|
||||||
input: ['exploration-ui-routes.json', 'pages/**', 'views/**']
|
input: ['exploration-ui-routes.json', 'pages/**', 'views/**'],
|
||||||
|
screenshot_rules: `
|
||||||
|
每个关键 UI 交互点必须插入截图标记:
|
||||||
|
<!-- SCREENSHOT: id="ss-{功能}-{状态}" url="{路由}" selector="{CSS选择器}" wait_for="{等待元素}" description="{描述}" -->
|
||||||
|
|
||||||
|
示例:
|
||||||
|
- 页面全貌: <!-- SCREENSHOT: id="ss-dashboard-overview" url="/dashboard" description="仪表盘主界面" -->
|
||||||
|
- 特定组件: <!-- SCREENSHOT: id="ss-login-form" url="/login" selector=".login-form" description="登录表单" -->
|
||||||
|
- 交互状态: <!-- SCREENSHOT: id="ss-modal-open" url="/settings" selector=".modal" wait_for=".modal.show" description="设置弹窗" -->
|
||||||
|
`
|
||||||
},
|
},
|
||||||
'api-docs': {
|
'api-docs': {
|
||||||
role: 'API Architect',
|
role: 'API Architect',
|
||||||
@@ -72,6 +81,10 @@ const results = await Promise.all(tasks);
|
|||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
function buildAgentPrompt(name, cfg, config, workDir) {
|
function buildAgentPrompt(name, cfg, config, workDir) {
|
||||||
|
const screenshotSection = cfg.screenshot_rules
|
||||||
|
? `\n[SCREENSHOT RULES]\n${cfg.screenshot_rules}`
|
||||||
|
: '\n[SCREENSHOT]\n截图标记: <!-- SCREENSHOT: id="ss-xxx" url="/path" description="xxx" -->';
|
||||||
|
|
||||||
return `
|
return `
|
||||||
[ROLE] ${cfg.role}
|
[ROLE] ${cfg.role}
|
||||||
|
|
||||||
@@ -87,7 +100,7 @@ ${cfg.task}
|
|||||||
- 用户友好语言,避免技术术语
|
- 用户友好语言,避免技术术语
|
||||||
- 步骤编号清晰
|
- 步骤编号清晰
|
||||||
- 代码块标注语言
|
- 代码块标注语言
|
||||||
- 截图标记: <!-- SCREENSHOT: id="ss-xxx" url="/path" description="xxx" -->
|
${screenshotSection}
|
||||||
|
|
||||||
[FOCUS]
|
[FOCUS]
|
||||||
${cfg.focus}
|
${cfg.focus}
|
||||||
@@ -97,7 +110,7 @@ ${cfg.focus}
|
|||||||
"status": "completed",
|
"status": "completed",
|
||||||
"output_file": "sections/${cfg.output}",
|
"output_file": "sections/${cfg.output}",
|
||||||
"summary": "<50字>",
|
"summary": "<50字>",
|
||||||
"screenshots_needed": [],
|
"screenshots_needed": [{ "id": "ss-xxx", "url": "/path", "selector": ".class", "description": "..." }],
|
||||||
"cross_references": []
|
"cross_references": []
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -1,271 +1,89 @@
|
|||||||
# Phase 4: Screenshot Capture
|
# Phase 4: Screenshot Capture
|
||||||
|
|
||||||
Capture screenshots using Chrome MCP for all identified UI elements.
|
使用 `universal-executor` 子 Agent 调用 Chrome MCP 截图。
|
||||||
|
|
||||||
## Objective
|
## 核心原则
|
||||||
|
|
||||||
- Check Chrome MCP availability
|
**主 Agent 负责编排,子 Agent 负责截图采集。**
|
||||||
- Start development server
|
|
||||||
- Capture all required screenshots
|
|
||||||
- Convert to Base64 for embedding
|
|
||||||
|
|
||||||
## Prerequisites
|
## 执行流程
|
||||||
|
|
||||||
- Chrome MCP configured and available
|
|
||||||
- Development server can be started
|
|
||||||
- All screenshot URLs accessible
|
|
||||||
|
|
||||||
## Execution Steps
|
|
||||||
|
|
||||||
### Step 1: Load Screenshot List
|
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const consolidation = Read(`${workDir}/consolidation-summary.md`);
|
|
||||||
const config = JSON.parse(Read(`${workDir}/manual-config.json`));
|
const config = JSON.parse(Read(`${workDir}/manual-config.json`));
|
||||||
|
const screenshotsList = JSON.parse(Read(`${workDir}/screenshots-list.json`));
|
||||||
|
|
||||||
// Parse screenshot table from consolidation
|
// 委托给 universal-executor 执行截图
|
||||||
const screenshots = parseScreenshotTable(consolidation);
|
const result = Task({
|
||||||
```
|
subagent_type: 'universal-executor',
|
||||||
|
run_in_background: false,
|
||||||
### Step 2: Check Chrome MCP Availability
|
prompt: buildScreenshotPrompt(config, screenshotsList, workDir)
|
||||||
|
|
||||||
```javascript
|
|
||||||
async function checkChromeMCP() {
|
|
||||||
try {
|
|
||||||
// Attempt to call Chrome MCP
|
|
||||||
const version = await mcp__chrome__getVersion();
|
|
||||||
return {
|
|
||||||
available: true,
|
|
||||||
version: version.version,
|
|
||||||
browser: version.browser
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
return {
|
|
||||||
available: false,
|
|
||||||
error: error.message
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const chromeMCP = await checkChromeMCP();
|
|
||||||
|
|
||||||
if (!chromeMCP.available) {
|
|
||||||
// Fallback: generate manual screenshot instructions
|
|
||||||
generateManualScreenshotGuide(screenshots);
|
|
||||||
return {
|
|
||||||
status: 'skipped',
|
|
||||||
reason: 'Chrome MCP not available',
|
|
||||||
manual_guide: `${workDir}/screenshots/MANUAL_CAPTURE.md`
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 3: Start Development Server
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
const devConfig = config.screenshot_config;
|
|
||||||
|
|
||||||
// Start dev server in background
|
|
||||||
const serverTask = Bash({
|
|
||||||
command: devConfig.dev_command,
|
|
||||||
run_in_background: true
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Wait for server to be ready
|
const captureResult = JSON.parse(result);
|
||||||
async function waitForServer(url, timeout = 30000) {
|
|
||||||
const start = Date.now();
|
|
||||||
while (Date.now() - start < timeout) {
|
|
||||||
try {
|
|
||||||
const response = await fetch(url);
|
|
||||||
if (response.ok) return true;
|
|
||||||
} catch (e) {
|
|
||||||
// Server not ready yet
|
|
||||||
}
|
|
||||||
await sleep(1000);
|
|
||||||
}
|
|
||||||
throw new Error(`Server at ${url} did not start within ${timeout}ms`);
|
|
||||||
}
|
|
||||||
|
|
||||||
await waitForServer(devConfig.dev_url, devConfig.wait_timeout);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Step 4: Batch Screenshot Capture
|
## Prompt 构建
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const capturedScreenshots = [];
|
function buildScreenshotPrompt(config, screenshotsList, workDir) {
|
||||||
const failedScreenshots = [];
|
return `
|
||||||
|
[ROLE] Screenshot Capturer
|
||||||
|
|
||||||
for (const ss of screenshots) {
|
[TASK]
|
||||||
try {
|
使用 Chrome MCP 批量截图
|
||||||
const fullUrl = new URL(ss.url, devConfig.dev_url).href;
|
|
||||||
|
|
||||||
// Configure capture options
|
[INPUT]
|
||||||
const captureOptions = {
|
- 配置: ${workDir}/manual-config.json
|
||||||
url: fullUrl,
|
- 截图清单: ${workDir}/screenshots-list.json
|
||||||
viewport: { width: 1280, height: 800 },
|
|
||||||
fullPage: ss.fullPage || false,
|
|
||||||
waitFor: ss.wait_for || null,
|
|
||||||
delay: 500 // Wait for animations
|
|
||||||
};
|
|
||||||
|
|
||||||
// Add selector for partial screenshot
|
[STEPS]
|
||||||
if (ss.selector) {
|
1. 检查 Chrome MCP 可用性 (mcp__chrome__*)
|
||||||
captureOptions.selector = ss.selector;
|
2. 启动开发服务器: ${config.screenshot_config?.dev_command || 'npm run dev'}
|
||||||
}
|
3. 等待服务器就绪: ${config.screenshot_config?.dev_url || 'http://localhost:3000'}
|
||||||
|
4. 遍历截图清单,逐个调用 mcp__chrome__screenshot
|
||||||
|
5. 保存截图到 ${workDir}/screenshots/
|
||||||
|
6. 生成 manifest: ${workDir}/screenshots/screenshots-manifest.json
|
||||||
|
7. 停止开发服务器
|
||||||
|
|
||||||
// Capture screenshot
|
[MCP CALLS]
|
||||||
const result = await mcp__chrome__screenshot(captureOptions);
|
- mcp__chrome__screenshot({ url, selector?, viewport })
|
||||||
|
- 保存为 PNG 文件
|
||||||
|
|
||||||
// Save screenshot
|
[FALLBACK]
|
||||||
const filename = `${ss.id}.png`;
|
若 Chrome MCP 不可用,生成手动截图指南: MANUAL_CAPTURE.md
|
||||||
Write(`${workDir}/screenshots/${filename}`, result.data, { encoding: 'base64' });
|
|
||||||
|
|
||||||
capturedScreenshots.push({
|
[RETURN JSON]
|
||||||
...ss,
|
|
||||||
file: filename,
|
|
||||||
base64_size: result.data.length,
|
|
||||||
captured_at: new Date().toISOString()
|
|
||||||
});
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
failedScreenshots.push({
|
|
||||||
...ss,
|
|
||||||
error: error.message
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 5: Generate Screenshot Manifest
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
const manifest = {
|
|
||||||
total: screenshots.length,
|
|
||||||
captured: capturedScreenshots.length,
|
|
||||||
failed: failedScreenshots.length,
|
|
||||||
screenshots: capturedScreenshots,
|
|
||||||
failures: failedScreenshots,
|
|
||||||
dev_server: {
|
|
||||||
url: devConfig.dev_url,
|
|
||||||
command: devConfig.dev_command
|
|
||||||
},
|
|
||||||
capture_config: {
|
|
||||||
viewport: { width: 1280, height: 800 },
|
|
||||||
format: 'png'
|
|
||||||
},
|
|
||||||
timestamp: new Date().toISOString()
|
|
||||||
};
|
|
||||||
|
|
||||||
Write(`${workDir}/screenshots/screenshots-manifest.json`, JSON.stringify(manifest, null, 2));
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 6: Stop Development Server
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// Kill the dev server process
|
|
||||||
KillShell({ shell_id: serverTask.task_id });
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 7: Handle Failures
|
|
||||||
|
|
||||||
If any screenshots failed:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
if (failedScreenshots.length > 0) {
|
|
||||||
// Generate manual capture instructions
|
|
||||||
const manualGuide = `
|
|
||||||
# Manual Screenshot Capture Required
|
|
||||||
|
|
||||||
The following screenshots could not be captured automatically:
|
|
||||||
|
|
||||||
${failedScreenshots.map(s => `
|
|
||||||
## ${s.id}
|
|
||||||
- **URL**: ${s.url}
|
|
||||||
- **Description**: ${s.description}
|
|
||||||
- **Error**: ${s.error}
|
|
||||||
|
|
||||||
**Instructions**:
|
|
||||||
1. Navigate to ${s.url}
|
|
||||||
2. Capture screenshot of ${s.selector || 'full page'}
|
|
||||||
3. Save as \`${s.id}.png\`
|
|
||||||
4. Place in \`screenshots/\` directory
|
|
||||||
`).join('\n')}
|
|
||||||
`;
|
|
||||||
|
|
||||||
Write(`${workDir}/screenshots/MANUAL_CAPTURE.md`, manualGuide);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Fallback: Manual Screenshot Mode
|
|
||||||
|
|
||||||
When Chrome MCP is not available:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
function generateManualScreenshotGuide(screenshots) {
|
|
||||||
const guide = `
|
|
||||||
# Manual Screenshot Capture Guide
|
|
||||||
|
|
||||||
Chrome MCP is not available. Please capture screenshots manually.
|
|
||||||
|
|
||||||
## Setup
|
|
||||||
|
|
||||||
1. Start your development server:
|
|
||||||
\`\`\`bash
|
|
||||||
${config.screenshot_config.dev_command}
|
|
||||||
\`\`\`
|
|
||||||
|
|
||||||
2. Open browser to: ${config.screenshot_config.dev_url}
|
|
||||||
|
|
||||||
## Screenshots Required
|
|
||||||
|
|
||||||
${screenshots.map((s, i) => `
|
|
||||||
### ${i + 1}. ${s.id}
|
|
||||||
- **URL**: ${s.url}
|
|
||||||
- **Description**: ${s.description}
|
|
||||||
- **Save as**: \`screenshots/${s.id}.png\`
|
|
||||||
${s.selector ? `- **Element**: Capture only \`${s.selector}\`` : '- **Type**: Full page'}
|
|
||||||
`).join('\n')}
|
|
||||||
|
|
||||||
## After Capturing
|
|
||||||
|
|
||||||
Place all PNG files in the \`screenshots/\` directory, then run Phase 5 to continue.
|
|
||||||
`;
|
|
||||||
|
|
||||||
Write(`${workDir}/screenshots/MANUAL_CAPTURE.md`, guide);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Chrome MCP Configuration Reference
|
|
||||||
|
|
||||||
Expected MCP configuration:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
{
|
||||||
"mcpServers": {
|
"status": "completed|skipped",
|
||||||
"chrome": {
|
"captured": <n>,
|
||||||
"command": "npx",
|
"failed": <n>,
|
||||||
"args": ["@anthropic-ai/mcp-chrome"],
|
"manifest_file": "screenshots-manifest.json"
|
||||||
"env": {
|
}
|
||||||
"CHROME_PATH": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
|
`;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Output
|
## Agent 职责
|
||||||
|
|
||||||
- **Files**: `screenshots/*.png`
|
1. **检查 MCP** → Chrome MCP 可用性
|
||||||
- **Manifest**: `screenshots/screenshots-manifest.json`
|
2. **启动服务** → 开发服务器
|
||||||
- **Fallback**: `screenshots/MANUAL_CAPTURE.md` (if needed)
|
3. **批量截图** → 调用 mcp__chrome__screenshot
|
||||||
|
4. **保存文件** → screenshots/*.png
|
||||||
|
5. **生成清单** → screenshots-manifest.json
|
||||||
|
|
||||||
## Quality Checks
|
## 输出
|
||||||
|
|
||||||
- [ ] All high-priority screenshots captured
|
- `screenshots/*.png` - 截图文件
|
||||||
- [ ] Screenshot dimensions consistent (1280x800)
|
- `screenshots/screenshots-manifest.json` - 清单
|
||||||
- [ ] No broken/blank screenshots
|
- `screenshots/MANUAL_CAPTURE.md` - 手动指南(fallback)
|
||||||
- [ ] Manifest file complete
|
|
||||||
|
|
||||||
## Next Phase
|
## 质量门禁
|
||||||
|
|
||||||
Proceed to [Phase 5: HTML Assembly](05-html-assembly.md) with captured screenshots.
|
- [ ] 高优先级截图完成
|
||||||
|
- [ ] 尺寸一致 (1280×800)
|
||||||
|
- [ ] 无空白截图
|
||||||
|
- [ ] Manifest 完整
|
||||||
|
|
||||||
|
## 下一阶段
|
||||||
|
|
||||||
|
→ [Phase 5: HTML Assembly](05-html-assembly.md)
|
||||||
|
|||||||
Reference in New Issue
Block a user