| 123456789101112131415161718192021222324252627282930 |
- #!/usr/bin/env node
- // Inspect the existing installed VOC catalog. No credentials, network, collection or plugin edits.
- 'use strict';
- const fs = require('node:fs');
- const path = require('node:path');
- const crypto = require('node:crypto');
- const argv = process.argv.slice(2);
- if (argv.length !== 4 || argv[0] !== '--plugin-root' || argv[2] !== '--out') throw Error('USAGE');
- const root = fs.realpathSync(argv[1]), out = path.resolve(argv[3]);
- const moduleFile = path.join(root, 'mcp/src/core/api-catalog.js');
- const catalog = require(moduleFile);
- const endpoints = catalog.loadCatalog().endpoints;
- const ids = ['jd.get_shop_item_list_v1', 'jd.get_item_detail_v1', 'jd.get_item_price_v1', 'jd.get_item_comments_v1',
- 'taobao.get_shop_item_list_v4', 'taobao.get_item_detail_v6', 'taobao.get_item_detail_v7', 'taobao.get_item_comment_v3'];
- const project = e => e ? Object.fromEntries(['id', 'platform', 'title', 'summary', 'proxyPath', 'method', 'paramsIn', 'requiredParams', 'params'].map(k => [k, catalog.hydrateEndpoint(e)[k]])) : null;
- const ranking = endpoints.filter(e => /榜|rank|top.list/i.test([e.id, e.title, e.summary].join(' ')));
- const report = { schema: 'ksf.industry-connectors.v1', checkedAt: new Date().toISOString(),
- catalogVersion: catalog.loadCatalog().version, catalogUpdatedAt: catalog.loadCatalog().updatedAt,
- catalogSha256: crypto.createHash('sha256').update(fs.readFileSync(path.join(root, 'mcp/catalog/voc-social-endpoints.json'))).digest('hex'),
- collectionCalls: 0, networkCalls: 0, credentialsRead: false,
- existingConnectors: ids.map(id => ({ id, found: Boolean(catalog.findEndpoint(id)), document: project(catalog.findEndpoint(id)) })),
- jdTmallRankingCandidates: ranking.filter(e => ['jd', 'taobao', 'tmall'].includes(e.platform)).map(project),
- otherRankingCandidates: ranking.filter(e => ['kuaishou', 'douyin'].includes(e.platform)).map(project),
- conclusion: '本地目录未声明的能力不能当成可调用接口;其他平台候选不代表已核面类类目、TopN、分页、榜型或周期,品牌/主播榜不能替代商品榜',
- paidCollection: 'STOPPED' };
- fs.mkdirSync(path.dirname(out), { recursive: true });
- fs.writeFileSync(out, JSON.stringify(report, null, 2) + '\n', { flag: 'wx', mode: 0o600 });
- process.stdout.write(JSON.stringify({ ok: true, connectors: report.existingConnectors.filter(e => e.found).length,
- jdTmallRankingCandidates: report.jdTmallRankingCandidates.length, otherRankingCandidates: report.otherRankingCandidates.length,
- networkCalls: 0, out }) + '\n');
|