validate-reusable-boundary.js 1.2 KB

123456789101112131415161718192021222324252627
  1. 'use strict';
  2. const fs = require('fs');
  3. const path = require('path');
  4. const { execFileSync } = require('child_process');
  5. const root = path.resolve(__dirname, '..');
  6. const forbiddenPath = /(^|[\\/])(outputs?|messages|sessions?|logs?|knowledge-base[\\/]property-data)([\\/]|$)|(^|[\\/])(?:\.env\.local|.*\.db(?:-(?:shm|wal))?|.*\.log)$/i;
  7. const verticalLeak = /小牛看房|xnfang|宋军/;
  8. const sourceScan = /^(?:mcp[\\/]src[\\/]core|knowledge|scripts|runtime)[\\/]/i;
  9. const skipScan = /(?:^|[\\/])validate-reusable-boundary\.js$/i;
  10. const tracked = execFileSync('git', ['ls-files'], { cwd: root, encoding: 'utf8' }).split(/\r?\n/).filter(Boolean);
  11. const pathIssues = tracked.filter(rel => forbiddenPath.test(rel));
  12. const textIssues = [];
  13. for (const rel of tracked) {
  14. if (!sourceScan.test(rel) || skipScan.test(rel) || !/\.(?:js|mjs|md)$/i.test(rel)) continue;
  15. const content = fs.readFileSync(path.join(root, rel), 'utf8');
  16. if (verticalLeak.test(content)) textIssues.push(`vertical leak: ${rel}`);
  17. }
  18. const issues = [...pathIssues.map(rel => `forbidden tracked path: ${rel}`), ...textIssues];
  19. if (issues.length) {
  20. console.error(issues.join('\n'));
  21. process.exit(1);
  22. }
  23. console.log(`[ok] reusable boundary is clean (${tracked.length} tracked files checked)`);