system-prompts-and-models-o.../scripts/convert-to-md.js
tycon 86777756b4 同步新功能
Added comprehensive prompt and tool usage documentation for multiple AI coding agents in both English and Chinese under the docs directory. Includes system prompts, tool usage guidelines, agent-specific instructions, and supporting assets for various agents such as Amp, Claude, GPT-5, and others.
2025-10-11 12:02:04 +08:00

297 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const fs = require('fs');
const path = require('path');
const yaml = require('js-yaml');
const srcDir = '.'; // 原仓库根(英文源)
const docsDir = './docs';
// 清理旧 docs
if (fs.existsSync(docsDir)) {
try {
fs.rmSync(docsDir, { recursive: true, force: true });
console.log('清理旧 docs/。');
} catch (e) {
console.warn(`清理失败: ${e.message}。继续。`);
}
}
fs.mkdirSync(docsDir, { recursive: true });
// 创建语言子目录
const langDirs = ['en', 'zh'];
langDirs.forEach(lang => {
fs.mkdirSync(path.join(docsDir, lang), { recursive: true });
});
// 文本扩展
const textExts = ['.txt', '.json', '.yaml', '.yml', '.md', '.markdown', '.config', '.prompt', '.log'];
// 资源扩展(直接复制)
const resourceExts = ['.png', '.jpg', '.jpeg', '.gif', '.svg', '.pdf', '.zip', '.exe', '.html'];
// README 模式匹配(优先重命名到 index.md
const readmePatterns = ['readme.md', 'readme.txt', 'README.md', 'README.txt'];
const products = fs.readdirSync(srcDir)
.filter(dir => fs.statSync(path.join(srcDir, dir)).isDirectory() && !['docs', 'scripts', '.git', '.github', 'node_modules'].includes(dir));
let enNavItems = '';
let zhNavItems = '';
let enSidebarChildren = '';
let zhSidebarChildren = '';
products.forEach(product => {
const productSrc = path.join(srcDir, product);
const productSlug = product.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
// 英文版
const enDocs = path.join(docsDir, 'en', productSlug);
fs.mkdirSync(enDocs, { recursive: true });
copyAndConvert(productSrc, enDocs, 'en', product);
// 中文版:直接复制英文版结构(用户手动翻译)
const zhDocs = path.join(docsDir, 'zh', productSlug);
fs.mkdirSync(zhDocs, { recursive: true });
copyDir(enDocs, zhDocs); // 复制整个 en/ 到 zh/
console.log(`复制模板: ${product} (en -> zh手动翻译 zh/ 中的 .md)`);
// 更新 nav/sidebar
enNavItems += `{ text: '${product}', link: '/en/${productSlug}/' }, `;
enSidebarChildren += `{ text: '${product}', link: '/en/${productSlug}/' }, `;
zhNavItems += `{ text: '${product}', link: '/zh/${productSlug}/' }, `;
zhSidebarChildren += `{ text: '${product}', link: '/zh/${productSlug}/' }, `;
console.log(`完成: ${product}`);
});
// 复制函数(文本转 MD资源复制重命名 README 到 index.md
function copyAndConvert(src, dest, lang, product) {
function copyDir(src, dest) {
fs.mkdirSync(dest, { recursive: true });
const items = fs.readdirSync(src);
let readmeFile = null;
items.forEach(item => {
const srcPath = path.join(src, item);
const destPath = path.join(dest, item);
const stat = fs.statSync(srcPath);
if (stat.isDirectory()) {
copyDir(srcPath, destPath);
} else {
const ext = path.extname(item).toLowerCase();
if (readmePatterns.some(pattern => item.toLowerCase() === pattern.toLowerCase())) {
// 优先处理 README重命名到 index.md
readmeFile = srcPath;
return;
} else if (textExts.includes(ext)) {
let content;
try {
content = fs.readFileSync(srcPath, 'utf8').trim();
if (content.includes('\x00') || content.includes('IHDR')) return;
} catch (e) {
console.warn(`读取失败 ${srcPath}`);
return;
}
let rendered;
if (ext === '.md' || ext === '.markdown') {
rendered = content;
} else if (ext === '.txt' || ext === '.prompt' || ext === '.log') {
rendered = `## ${item}\n\n\`\`\`text\n${content}\n\`\`\``;
} else if (ext === '.json') {
try {
rendered = `## ${item}\n\n\`\`\`json\n${JSON.stringify(JSON.parse(content), null, 2)}\n\`\`\``;
} catch (e) {
rendered = `## ${item}\n\n\`\`\`json\n${content}\n\`\`\`\n\n:::warning 格式问题。\n:::`;
}
} else if (ext === '.yaml' || ext === '.yml') {
try {
rendered = `## ${item}\n\n\`\`\`yaml\n${yaml.dump(yaml.load(content), { indent: 2 })}\n\`\`\``;
} catch (e) {
rendered = `## ${item}\n\n\`\`\`yaml\n${content}\n\`\`\`\n\n:::warning 格式问题。\n:::`;
}
} else {
rendered = `## ${item}\n\n\`\`\`\n${content}\n\`\`\``;
}
const mdFile = destPath.replace(/\.[^/.]+$/, '') + '.md';
fs.writeFileSync(mdFile, rendered);
console.log(`转换 ${lang}: ${path.relative(docsDir, mdFile)}`);
} else if (resourceExts.includes(ext)) {
fs.copyFileSync(srcPath, destPath);
console.log(`复制资源 ${lang}: ${path.relative(docsDir, destPath)}`);
} else {
console.warn(`跳过 ${lang}: ${srcPath}`);
}
}
});
// 处理 README 重命名到 index.md
if (readmeFile) {
let content;
try {
content = fs.readFileSync(readmeFile, 'utf8').trim();
if (content.includes('\x00') || content.includes('IHDR')) {
console.warn(`跳过 README 二进制: ${readmeFile}`);
return;
}
} catch (e) {
console.warn(`读取 README 失败: ${e.message}`);
return;
}
let rendered = content;
const ext = path.extname(readmeFile).toLowerCase();
if (ext === '.txt') {
rendered = `# ${product} (${lang.toUpperCase()})\n\n${content}`;
} else if (ext === '.md' || ext === '.markdown') {
rendered = `# ${product} (${lang.toUpperCase()})\n\n${content}`;
}
fs.writeFileSync(path.join(dest, 'index.md'), rendered);
console.log(`重命名 README 到 index.md: ${path.relative(docsDir, path.join(dest, 'index.md'))}`);
} else {
// 无 README新建 index.md 列表
let filesList = '## 内容列表\n\n';
const allItems = fs.readdirSync(dest, { withFileTypes: true });
allItems.forEach(item => {
const itemPath = path.join(dest, item.name);
const relativePath = `/${lang}/${path.relative(docsDir, itemPath).replace(/\\/g, '/')}`;
if (item.isDirectory()) {
filesList += `- 📁 [${item.name}](${relativePath}/)\n`;
} else if (item.name.endsWith('.md')) {
const origName = item.name.replace('.md', '');
filesList += `- 📄 [${origName}](${relativePath})\n`;
} else {
const ext = path.extname(item.name).toLowerCase();
if (['.png', '.jpg', '.jpeg', '.gif', '.svg'].includes(ext)) {
filesList += `- 🖼️ ![${item.name}](${relativePath})\n`;
} else if (ext === '.pdf') {
filesList += `- 📕 [${item.name} (PDF)](${relativePath})\n`;
} else {
filesList += `- 🔗 [${item.name}](${relativePath})\n`;
}
}
});
const indexContent = `# ${product} (${lang.toUpperCase()})\n\n${filesList}\n\n*完整还原。*`;
fs.writeFileSync(path.join(dest, 'index.md'), indexContent);
console.log(`新建 index.md: ${path.relative(docsDir, path.join(dest, 'index.md'))}`);
}
}
copyDir(src, dest);
}
// 简单复制目录(用于 zh/ 模板)
function copyDir(src, dest) {
fs.mkdirSync(dest, { recursive: true });
const items = fs.readdirSync(src, { withFileTypes: true });
items.forEach(item => {
const srcPath = path.join(src, item.name);
const destPath = path.join(dest, item.name);
if (item.isDirectory()) {
copyDir(srcPath, destPath);
} else {
fs.copyFileSync(srcPath, destPath);
console.log(`复制模板: ${path.relative(docsDir, destPath)}`);
}
});
}
// 英文首页(卡片布局)
const enHomeContent = `# AI System Prompts Hub (EN)
:::info
Explore AI tool system prompts and models.
:::
<div class="grid cards" grid="@lg:3 @2xl:4">
${products.map(product => {
const slug = product.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
return `- **${product}**
> AI tool prompts and resources
> [Explore](/en/${slug}/)`;
}).join('\n\n')}
</div>
:::tip Update
Auto-synced from original repo.
:::`;
fs.writeFileSync(path.join(docsDir, 'en/index.md'), enHomeContent);
// 中文首页(初始同英文,翻译后手动调整)
const zhHomeContent = `# AI 系统提示词中心 (ZH)
:::info
探索 AI 工具系统提示词和模型。
:::
<div class="grid cards" grid="@lg:3 @2xl:4">
${products.map(product => {
const slug = product.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
return `- **${product}**
> AI 工具提示词与资源
> [探索](/zh/${slug}/)`;
}).join('\n\n')}
</div>
:::tip 更新
基于原仓库自动同步。
:::`;
fs.writeFileSync(path.join(docsDir, 'zh/index.md'), zhHomeContent);
// 创建/更新 config.jsi18n 支持)
let configPath = path.join(docsDir, '.vitepress/config.js');
if (!fs.existsSync(configPath)) {
fs.writeFileSync(configPath, `import { defineConfig } from 'vitepress'
export default defineConfig({
base: '/',
title: {
en: 'AI System Prompts Hub',
zh: 'AI 系统提示词中心'
},
description: {
en: 'Collection of AI tool system prompts',
zh: 'AI 工具系统提示词集合'
},
themeConfig: {
nav: {
en: [{ text: 'Home', link: '/en/' }],
zh: [{ text: '首页', link: '/zh/' }]
},
sidebar: {
'/en/': [{ text: 'Products', children: [] }],
'/zh/': [{ text: '产品', children: [] }]
},
search: true,
features: {
contentCodeCopy: true
}
},
locales: {
en: { label: 'English' },
zh: { label: '中文' }
},
markdown: {
attrs: { leftDelimiter: '{', rightDelimiter: '}' }
}
})`);
console.log('创建 config.js。');
}
let config = fs.readFileSync(configPath, 'utf8');
// 更新英文 nav/sidebar
config = config.replace("nav: { en: [{ text: 'Home', link: '/en/' }] }", `nav: { en: [ { text: 'Home', link: '/en/' }, ${enNavItems.slice(0, -2)} ] }`);
config = config.replace("/en/': [{ text: 'Products', children: [] }]", `/en/': [{ text: 'Products', children: [ ${enSidebarChildren.slice(0, -2)} ] }]`);
// 更新中文
config = config.replace("nav: { zh: [{ text: '首页', link: '/zh/' }] }", `nav: { zh: [ { text: '首页', link: '/zh/' }, ${zhNavItems.slice(0, -2)} ] }`);
config = config.replace("/zh/': [{ text: '产品', children: [] }]", `/zh/': [{ text: '产品', children: [ ${zhSidebarChildren.slice(0, -2)} ] }]`);
fs.writeFileSync(configPath, config);
console.log(`\n完成!${products.length} 产品,双语模板 (zh/ 复制 en/,手动翻译 .md)。README 已重命名到 index.md。跑 npm run docs:dev 测试 (/en/ 或 /zh/)。`);