spa/.claude/skills/drawnote/scripts/verify-installation.js

187 lines
4.7 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
/**
* DrawNote Skill 安装验证和修复工具
* 检查依赖是否正确安装,并提供修复选项
*/
const fs = require('fs');
const path = require('path');
const { spawn, execSync } = require('child_process');
console.log('🔍 DrawNote Skill 安装验证工具');
console.log('================================');
const skillDir = path.dirname(__dirname);
const nodeModulesDir = path.join(skillDir, 'node_modules');
const playwrightDir = path.join(nodeModulesDir, 'playwright');
const packageJsonPath = path.join(skillDir, 'package.json');
// 验证函数
function verifyInstallation() {
const issues = [];
// 检查基本文件
if (!fs.existsSync(packageJsonPath)) {
issues.push('❌ package.json 不存在');
}
// 检查 node_modules
if (!fs.existsSync(nodeModulesDir)) {
issues.push('❌ node_modules 目录不存在');
} else {
// 检查 playwright
if (!fs.existsSync(playwrightDir)) {
issues.push('❌ Playwright 模块不存在');
}
// 检查其他依赖
const requiredPackages = ['playwright', 'playwright-core'];
requiredPackages.forEach(pkg => {
const pkgPath = path.join(nodeModulesDir, pkg);
if (!fs.existsSync(pkgPath)) {
issues.push(`${pkg} 包不存在`);
}
});
}
return issues;
}
// 修复函数
function attemptFix(issues) {
console.log('\n🔧 尝试自动修复...');
try {
// 检查 npm 是否可用
execSync('which npm', { stdio: 'ignore' });
} catch (error) {
console.log('❌ npm 不可用,请先安装 Node.js 和 npm');
return false;
}
console.log('📦 运行 npm install...');
const installProcess = spawn('npm', ['install'], {
cwd: skillDir,
stdio: 'inherit'
});
return new Promise((resolve) => {
installProcess.on('close', (code) => {
if (code === 0) {
console.log('✅ npm install 完成');
resolve(true);
} else {
console.log(`❌ npm install 失败,退出码: ${code}`);
resolve(false);
}
});
installProcess.on('error', (error) => {
console.error('❌ 安装过程出错:', error.message);
resolve(false);
});
});
}
// 测试截图功能
function testScreenshotFunction() {
console.log('\n🧪 测试截图功能...');
try {
// 创建测试 HTML
const testHtml = `
<!DOCTYPE html>
<html>
<head><title>Test</title></head>
<body><h1>DrawNote Test</h1></body>
</html>`;
const testHtmlPath = path.join(skillDir, 'test.html');
const testPngPath = path.join(skillDir, 'test.png');
fs.writeFileSync(testHtmlPath, testHtml);
// 运行截图脚本
const captureScript = path.join(skillDir, 'scripts', 'capture.js');
execSync(`node "${captureScript}" "${testHtmlPath}" "${testPngPath}"`, {
stdio: 'pipe',
timeout: 10000
});
// 检查输出文件
if (fs.existsSync(testPngPath)) {
const stats = fs.statSync(testPngPath);
console.log(`✅ 截图功能正常 (输出文件大小: ${(stats.size / 1024).toFixed(1)} KB)`);
// 清理测试文件
fs.unlinkSync(testHtmlPath);
fs.unlinkSync(testPngPath);
return true;
} else {
console.log('❌ 截图文件未生成');
return false;
}
} catch (error) {
console.log(`❌ 截图测试失败: ${error.message}`);
return false;
}
}
// 主流程
async function main() {
console.log(`📁 检查目录: ${skillDir}`);
const issues = verifyInstallation();
if (issues.length === 0) {
console.log('✅ 所有依赖都正确安装');
// 测试功能
const testResult = testScreenshotFunction();
if (testResult) {
console.log('\n🎉 DrawNote Skill 完全可用!');
} else {
console.log('\n⚠ 依赖已安装但功能测试失败');
}
} else {
console.log('\n❌ 发现以下问题:');
issues.forEach(issue => console.log(` ${issue}`));
// 尝试自动修复
const fixSuccess = await attemptFix(issues);
if (fixSuccess) {
console.log('\n🔄 重新验证...');
setTimeout(() => {
const newIssues = verifyInstallation();
if (newIssues.length === 0) {
console.log('✅ 修复成功!');
testScreenshotFunction();
} else {
console.log('❌ 自动修复未解决所有问题');
console.log('\n🔧 请手动执行以下命令:');
console.log(` cd "${skillDir}"`);
console.log(' npm install');
console.log(' npm run install-browsers');
}
}, 2000);
}
}
}
// 运行主函数
if (require.main === module) {
main().catch(error => {
console.error('❌ 验证过程出错:', error);
process.exit(1);
});
}
module.exports = { verifyInstallation, testScreenshotFunction };