فهرست منبع

refactor(credentials): unify collection token to VOC_TOKEN/VOC_SOCIAL_TOKEN

Drops platform-specific and legacy env-var aliases (XIAOHONGSHU_API_TOKEN,
DOUYIN_API_TOKEN, DOUYIN_TOKEN, VOC_DOUYIN_TOKEN, FMODE_XIAOHONGSHU_TOKEN,
FMODE_SOCIAL_TOKEN) from the credential resolver. Only VOC_TOKEN and
VOC_SOCIAL_TOKEN env vars (plus per-call request inputs and the
voc-credentials.json fallback) are honored now. Updates smoke fixtures and
the payment-package token doc to match the unified naming.
gangvy 3 ماه پیش
والد
کامیت
276c012eec

+ 4 - 5
claude-code/claude-code-voc-intelligence/docs/payment-package-links.md

@@ -66,11 +66,10 @@ npx @vocmarket/voc-skill@latest workspace --smoke
 技能包会按以下顺序读取 token:
 
 ```text
-工具入参 vocToken / xiaohongshuToken
-workspace .env.local
-VOC_TOKEN
-VOC_SOCIAL_TOKEN
-~/.claude/voc-credentials.json
+工具入参 vocToken(兼容 xiaohongshuToken / douyinToken)
+workspace .env.local 的 VOC_TOKEN / VOC_SOCIAL_TOKEN
+环境变量 VOC_TOKEN / VOC_SOCIAL_TOKEN
+~/.claude/voc-credentials.json 的 vocToken / token
 ```
 
 注意:

+ 2 - 14
claude-code/claude-code-voc-intelligence/mcp/src/core/credentials.js

@@ -68,33 +68,21 @@ function readVocToken(input = {}) {
   const workspaceEnv = readEnvLocalFiles();
   const claudeCreds = readJsonMaybe(path.join(os.homedir(), '.claude', 'voc-credentials.json'));
   return firstNonEmpty([
+    input.vocToken,
     input.xiaohongshuToken,
     input.douyinToken,
-    input.vocToken,
+    input['voc-token'],
     input['xiaohongshu-token'],
     input['douyin-token'],
-    input['voc-token'],
     input.token,
     input.apiToken,
     input['api-token'],
     workspaceEnv.VOC_TOKEN,
     workspaceEnv.VOC_SOCIAL_TOKEN,
-    workspaceEnv.XIAOHONGSHU_API_TOKEN,
-    workspaceEnv.DOUYIN_API_TOKEN,
-    workspaceEnv.DOUYIN_TOKEN,
-    workspaceEnv.VOC_DOUYIN_TOKEN,
     process.env.VOC_TOKEN,
     process.env.VOC_SOCIAL_TOKEN,
-    process.env.XIAOHONGSHU_API_TOKEN,
-    process.env.DOUYIN_API_TOKEN,
-    process.env.DOUYIN_TOKEN,
-    process.env.VOC_DOUYIN_TOKEN,
-    process.env.FMODE_XIAOHONGSHU_TOKEN,
-    process.env.FMODE_SOCIAL_TOKEN,
     claudeCreds.vocToken,
     claudeCreds.token,
-    claudeCreds.xiaohongshuToken,
-    claudeCreds.douyinToken,
   ]);
 }
 

+ 1 - 49
claude-code/claude-code-voc-intelligence/scripts/smoke-package.js

@@ -94,12 +94,6 @@ async function smokeNoTokenRechargePrompt() {
     HOME: process.env.HOME,
     VOC_TOKEN: process.env.VOC_TOKEN,
     VOC_SOCIAL_TOKEN: process.env.VOC_SOCIAL_TOKEN,
-    XIAOHONGSHU_API_TOKEN: process.env.XIAOHONGSHU_API_TOKEN,
-    FMODE_XIAOHONGSHU_TOKEN: process.env.FMODE_XIAOHONGSHU_TOKEN,
-    FMODE_SOCIAL_TOKEN: process.env.FMODE_SOCIAL_TOKEN,
-    DOUYIN_API_TOKEN: process.env.DOUYIN_API_TOKEN,
-    DOUYIN_TOKEN: process.env.DOUYIN_TOKEN,
-    VOC_DOUYIN_TOKEN: process.env.VOC_DOUYIN_TOKEN
   };
   const tempHome = path.join(os.tmpdir(), 'claude-voc-no-token-smoke');
   const tempWorkspace = path.join(os.tmpdir(), 'claude-voc-no-token-workspace-smoke');
@@ -112,12 +106,6 @@ async function smokeNoTokenRechargePrompt() {
     [
       'VOC_TOKEN',
       'VOC_SOCIAL_TOKEN',
-      'XIAOHONGSHU_API_TOKEN',
-      'FMODE_XIAOHONGSHU_TOKEN',
-      'FMODE_SOCIAL_TOKEN',
-      'DOUYIN_API_TOKEN',
-      'DOUYIN_TOKEN',
-      'VOC_DOUYIN_TOKEN'
     ].forEach(key => delete process.env[key]);
     const result = await runXiaohongshuTrend({
       collectionMode: 'live',
@@ -150,12 +138,6 @@ async function smokeDouyinNoTokenRechargePrompt() {
     HOME: process.env.HOME,
     VOC_TOKEN: process.env.VOC_TOKEN,
     VOC_SOCIAL_TOKEN: process.env.VOC_SOCIAL_TOKEN,
-    XIAOHONGSHU_API_TOKEN: process.env.XIAOHONGSHU_API_TOKEN,
-    FMODE_XIAOHONGSHU_TOKEN: process.env.FMODE_XIAOHONGSHU_TOKEN,
-    FMODE_SOCIAL_TOKEN: process.env.FMODE_SOCIAL_TOKEN,
-    DOUYIN_API_TOKEN: process.env.DOUYIN_API_TOKEN,
-    DOUYIN_TOKEN: process.env.DOUYIN_TOKEN,
-    VOC_DOUYIN_TOKEN: process.env.VOC_DOUYIN_TOKEN
   };
   const tempHome = path.join(os.tmpdir(), 'claude-voc-douyin-no-token-smoke');
   const tempWorkspace = path.join(os.tmpdir(), 'claude-voc-douyin-no-token-workspace-smoke');
@@ -168,12 +150,6 @@ async function smokeDouyinNoTokenRechargePrompt() {
     [
       'VOC_TOKEN',
       'VOC_SOCIAL_TOKEN',
-      'XIAOHONGSHU_API_TOKEN',
-      'FMODE_XIAOHONGSHU_TOKEN',
-      'FMODE_SOCIAL_TOKEN',
-      'DOUYIN_API_TOKEN',
-      'DOUYIN_TOKEN',
-      'VOC_DOUYIN_TOKEN'
     ].forEach(key => delete process.env[key]);
     const result = await runDouyinTrend({
       collectionMode: 'live',
@@ -206,12 +182,6 @@ function smokeWorkspaceEnvLocalToken() {
     HOME: process.env.HOME,
     VOC_TOKEN: process.env.VOC_TOKEN,
     VOC_SOCIAL_TOKEN: process.env.VOC_SOCIAL_TOKEN,
-    XIAOHONGSHU_API_TOKEN: process.env.XIAOHONGSHU_API_TOKEN,
-    FMODE_XIAOHONGSHU_TOKEN: process.env.FMODE_XIAOHONGSHU_TOKEN,
-    FMODE_SOCIAL_TOKEN: process.env.FMODE_SOCIAL_TOKEN,
-    DOUYIN_API_TOKEN: process.env.DOUYIN_API_TOKEN,
-    DOUYIN_TOKEN: process.env.DOUYIN_TOKEN,
-    VOC_DOUYIN_TOKEN: process.env.VOC_DOUYIN_TOKEN
   };
   const tempHome = path.join(os.tmpdir(), 'claude-voc-env-local-home-smoke');
   const tempWorkspace = path.join(os.tmpdir(), 'claude-voc-env-local-workspace-smoke');
@@ -224,12 +194,6 @@ function smokeWorkspaceEnvLocalToken() {
     [
       'VOC_TOKEN',
       'VOC_SOCIAL_TOKEN',
-      'XIAOHONGSHU_API_TOKEN',
-      'FMODE_XIAOHONGSHU_TOKEN',
-      'FMODE_SOCIAL_TOKEN',
-      'DOUYIN_API_TOKEN',
-      'DOUYIN_TOKEN',
-      'VOC_DOUYIN_TOKEN'
     ].forEach(key => delete process.env[key]);
     fs.writeFileSync(path.join(tempWorkspace, '.env.local'), 'VOC_TOKEN=workspace-smoke-token\n');
     const token = readVocToken({});
@@ -255,18 +219,13 @@ function smokeAncestorEnvLocalToken() {
     HOME: process.env.HOME,
     VOC_TOKEN: process.env.VOC_TOKEN,
     VOC_SOCIAL_TOKEN: process.env.VOC_SOCIAL_TOKEN,
-    XIAOHONGSHU_API_TOKEN: process.env.XIAOHONGSHU_API_TOKEN,
-    FMODE_XIAOHONGSHU_TOKEN: process.env.FMODE_XIAOHONGSHU_TOKEN,
-    FMODE_SOCIAL_TOKEN: process.env.FMODE_SOCIAL_TOKEN,
-    DOUYIN_API_TOKEN: process.env.DOUYIN_API_TOKEN,
-    DOUYIN_TOKEN: process.env.DOUYIN_TOKEN,
-    VOC_DOUYIN_TOKEN: process.env.VOC_DOUYIN_TOKEN
   };
   const tempHome = path.join(os.tmpdir(), 'claude-voc-ancestor-env-home-smoke');
   const tempWorkspace = path.join(os.tmpdir(), 'claude-voc-ancestor-env-workspace-smoke');
   const nested = path.join(tempWorkspace, 'nested', 'plugin');
   fs.mkdirSync(tempHome, { recursive: true });
   fs.mkdirSync(nested, { recursive: true });
+  fs.writeFileSync(path.join(tempWorkspace, '.env.local'), 'VOC_TOKEN=ancestor-smoke-token\n');
   try {
     process.chdir(nested);
     process.env.USERPROFILE = tempHome;
@@ -274,14 +233,7 @@ function smokeAncestorEnvLocalToken() {
     [
       'VOC_TOKEN',
       'VOC_SOCIAL_TOKEN',
-      'XIAOHONGSHU_API_TOKEN',
-      'FMODE_XIAOHONGSHU_TOKEN',
-      'FMODE_SOCIAL_TOKEN',
-      'DOUYIN_API_TOKEN',
-      'DOUYIN_TOKEN',
-      'VOC_DOUYIN_TOKEN'
     ].forEach(key => delete process.env[key]);
-    fs.writeFileSync(path.join(tempWorkspace, '.env.local'), 'VOC_DOUYIN_TOKEN=ancestor-smoke-token\n');
     const token = readVocToken({});
     if (token !== 'ancestor-smoke-token') {
       throw new Error('ancestor .env.local token was not used');