smoke.mjs 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // 冒烟测试:验证包结构和基础导出
  2. import { resolveIdentity, identitySummary, makeLogKey } from '../lib/index.mjs';
  3. import { ENDPOINTS } from '../lib/upload.mjs';
  4. import { existsSync } from 'node:fs';
  5. import path from 'node:path';
  6. import { fileURLToPath } from 'node:url';
  7. const __dirname = path.dirname(fileURLToPath(import.meta.url));
  8. const root = path.join(__dirname, '..');
  9. let pass = 0, fail = 0;
  10. function ok(label, cond) {
  11. if (cond) { console.log(` ✓ ${label}`); pass++; }
  12. else { console.error(` ✗ ${label}`); fail++; }
  13. }
  14. console.log('smoke test — skill-agent-log-s3 v2.0.0\n');
  15. // 1. 必要文件存在
  16. console.log('[1] 文件结构');
  17. ok('package.json', existsSync(path.join(root, 'package.json')));
  18. ok('LICENSE', existsSync(path.join(root, 'LICENSE')));
  19. ok('README.md', existsSync(path.join(root, 'README.md')));
  20. ok('SKILL.md', existsSync(path.join(root, 'SKILL.md')));
  21. ok('CHANGELOG.md', existsSync(path.join(root, 'CHANGELOG.md')));
  22. ok('skill-package-manifest', existsSync(path.join(root, 'skill-package-manifest.json')));
  23. ok('lib/index.mjs', existsSync(path.join(root, 'lib/index.mjs')));
  24. ok('lib/identity.mjs', existsSync(path.join(root, 'lib/identity.mjs')));
  25. ok('lib/upload.mjs', existsSync(path.join(root, 'lib/upload.mjs')));
  26. ok('lib/collect.py', existsSync(path.join(root, 'lib/collect.py')));
  27. ok('bin/agent-log.mjs', existsSync(path.join(root, 'bin/agent-log.mjs')));
  28. ok('skills/.../SKILL.md', existsSync(path.join(root, 'skills/skill-agent-log-s3/SKILL.md')));
  29. // 2. package.json 关键字段
  30. console.log('\n[2] package.json');
  31. import { readFileSync } from 'node:fs';
  32. const pkg = JSON.parse(readFileSync(path.join(root, 'package.json'), 'utf-8'));
  33. ok('type=module', pkg.type === 'module');
  34. ok('version=2.0.0', pkg.version === '2.0.0');
  35. ok('main=./lib/index.mjs', pkg.main === './lib/index.mjs');
  36. ok('exports[.] import', pkg.exports?.['.']?.import === './lib/index.mjs');
  37. ok('exports[.] default', pkg.exports?.['.']?.default === './lib/index.mjs');
  38. ok('bin agent-log', pkg.bin?.['agent-log'] === './bin/agent-log.mjs');
  39. ok('node>=18', pkg.engines?.node === '>=18');
  40. ok('no dependencies', Object.keys(pkg.dependencies || {}).length === 0);
  41. // 3. SDK 导出
  42. console.log('\n[3] SDK 导出');
  43. ok('resolveIdentity is fn', typeof resolveIdentity === 'function');
  44. ok('identitySummary is fn', typeof identitySummary === 'function');
  45. ok('makeLogKey is fn', typeof makeLogKey === 'function');
  46. ok('ENDPOINTS.functions', typeof ENDPOINTS.functions === 'string' && ENDPOINTS.functions.includes('server.fmode.cn'));
  47. ok('ENDPOINTS.publicBase', typeof ENDPOINTS.publicBase === 'string' && ENDPOINTS.publicBase.includes('s3.fmode.cn'));
  48. // 4. 身份解析逻辑
  49. console.log('\n[4] 身份解析');
  50. const id = resolveIdentity();
  51. ok('返回对象', typeof id === 'object' && id !== null);
  52. ok('有 agentId 字段', 'agentId' in id);
  53. ok('agentId 非空', typeof id.agentId === 'string' && id.agentId.length > 0);
  54. const summary = identitySummary(id);
  55. ok('summary 不含完整 token', !summary.sessionToken?.match(/^r:[a-f0-9]{20}/));
  56. // 5. makeLogKey 格式
  57. console.log('\n[5] 日志键格式');
  58. const key = makeLogKey();
  59. ok('以 log/ 开头', key.startsWith('log/'));
  60. ok('格式 log/YYYYMMDD/HHMM.json', /^log\/\d{8}\/\d{4}\.json$/.test(key));
  61. // 6. 没有硬编码禁用端点
  62. console.log('\n[6] 禁用端点检查');
  63. const uploadSrc = readFileSync(path.join(root, 'lib/upload.mjs'), 'utf-8');
  64. ok('不含 /api/storage/credentials', !uploadSrc.includes('/api/storage/credentials'));
  65. ok('不含 /api/storage/upload', !uploadSrc.includes('/api/storage/upload'));
  66. ok('不含 S3_AK', !uploadSrc.includes('S3_AK'));
  67. ok('不含 S3_SK', !uploadSrc.includes('S3_SK'));
  68. console.log(`\n结果: ${pass} 通过 / ${fail} 失败`);
  69. if (fail > 0) process.exit(1);