=== NEW SERVERS ADDED (7) === - servers/closebot — 119 tools, 14 modules, 4,656 lines TS (Stage 7) - servers/google-console — Google Search Console MCP (Stage 7) - servers/meta-ads — Meta/Facebook Ads MCP (Stage 8) - servers/twilio — Twilio communications MCP (Stage 8) - servers/competitor-research — Competitive intel MCP (Stage 6) - servers/n8n-apps — n8n workflow MCP apps (Stage 6) - servers/reonomy — Commercial real estate MCP (Stage 1) === FACTORY INFRASTRUCTURE ADDED === - infra/factory-tools — mcp-jest, mcp-validator, mcp-add, MCP Inspector - 60 test configs, 702 auto-generated test cases - All 30 servers score 100/100 protocol compliance - infra/command-center — Pipeline state, operator playbook, dashboard config - infra/factory-reviews — Automated eval reports === DOCS ADDED === - docs/MCP-FACTORY.md — Factory overview - docs/reports/ — 5 pipeline evaluation reports - docs/research/ — Browser MCP research === RULES ESTABLISHED === - CONTRIBUTING.md — All MCP work MUST go in this repo - README.md — Full inventory of 37 servers + infra docs - .gitignore — Updated for Python venvs TOTAL: 37 MCP servers + full factory pipeline in one repo. This is now the single source of truth for all MCP work.
71 lines
1.9 KiB
JavaScript
71 lines
1.9 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Build script — compiles each app in src/apps/* into a single HTML file at dist/app-ui/{name}.html
|
|
* Uses Vite + vite-plugin-singlefile to inline all JS/CSS/assets.
|
|
*/
|
|
import { build } from 'vite';
|
|
import { viteSingleFile } from 'vite-plugin-singlefile';
|
|
import { readdirSync, existsSync, mkdirSync } from 'fs';
|
|
import { resolve, join } from 'path';
|
|
|
|
const appsDir = resolve('src/apps');
|
|
const distDir = resolve('dist/app-ui');
|
|
|
|
if (!existsSync(distDir)) mkdirSync(distDir, { recursive: true });
|
|
|
|
const apps = readdirSync(appsDir).filter(d => {
|
|
const indexHtml = join(appsDir, d, 'index.html');
|
|
return existsSync(indexHtml);
|
|
});
|
|
|
|
console.log(`Building ${apps.length} MCP Apps...\n`);
|
|
|
|
for (const app of apps) {
|
|
const appDir = join(appsDir, app);
|
|
const outDir = join(distDir);
|
|
|
|
console.log(` Building: ${app}...`);
|
|
|
|
try {
|
|
await build({
|
|
root: appDir,
|
|
plugins: [viteSingleFile()],
|
|
build: {
|
|
outDir,
|
|
emptyOutDir: false,
|
|
rollupOptions: {
|
|
input: join(appDir, 'index.html'),
|
|
output: {
|
|
entryFileNames: `${app}.js`,
|
|
assetFileNames: `${app}.[ext]`,
|
|
}
|
|
},
|
|
minify: 'esbuild',
|
|
},
|
|
resolve: {
|
|
alias: {
|
|
'@components': resolve('src/components'),
|
|
'@hooks': resolve('src/hooks'),
|
|
'@styles': resolve('src/styles'),
|
|
'@utils': resolve('src/utils'),
|
|
}
|
|
},
|
|
logLevel: 'warn',
|
|
});
|
|
|
|
// Rename index.html to {app-name}.html
|
|
const { renameSync } = await import('fs');
|
|
const srcPath = join(outDir, 'index.html');
|
|
const destPath = join(outDir, `${app}.html`);
|
|
if (existsSync(srcPath) && srcPath !== destPath) {
|
|
renameSync(srcPath, destPath);
|
|
}
|
|
|
|
console.log(` ✓ ${app} → dist/app-ui/${app}.html`);
|
|
} catch (err) {
|
|
console.error(` ✗ ${app} failed:`, err.message);
|
|
}
|
|
}
|
|
|
|
console.log(`\nDone! ${apps.length} apps built.`);
|