@vocmarket/voc-skill 0.3.20 → 0.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -66,11 +66,10 @@ npx @vocmarket/voc-skill@latest workspace --smoke
66
66
  技能包会按以下顺序读取 token:
67
67
 
68
68
  ```text
69
- 工具入参 vocToken / xiaohongshuToken
70
- workspace .env.local
71
- VOC_TOKEN
72
- VOC_SOCIAL_TOKEN
73
- ~/.claude/voc-credentials.json
69
+ 工具入参 vocToken(兼容 xiaohongshuToken / douyinToken)
70
+ workspace .env.local 的 VOC_TOKEN / VOC_SOCIAL_TOKEN
71
+ 环境变量 VOC_TOKEN / VOC_SOCIAL_TOKEN
72
+ ~/.claude/voc-credentials.json 的 vocToken / token
74
73
  ```
75
74
 
76
75
  注意:
@@ -68,33 +68,21 @@ function readVocToken(input = {}) {
68
68
  const workspaceEnv = readEnvLocalFiles();
69
69
  const claudeCreds = readJsonMaybe(path.join(os.homedir(), '.claude', 'voc-credentials.json'));
70
70
  return firstNonEmpty([
71
+ input.vocToken,
71
72
  input.xiaohongshuToken,
72
73
  input.douyinToken,
73
- input.vocToken,
74
+ input['voc-token'],
74
75
  input['xiaohongshu-token'],
75
76
  input['douyin-token'],
76
- input['voc-token'],
77
77
  input.token,
78
78
  input.apiToken,
79
79
  input['api-token'],
80
80
  workspaceEnv.VOC_TOKEN,
81
81
  workspaceEnv.VOC_SOCIAL_TOKEN,
82
- workspaceEnv.XIAOHONGSHU_API_TOKEN,
83
- workspaceEnv.DOUYIN_API_TOKEN,
84
- workspaceEnv.DOUYIN_TOKEN,
85
- workspaceEnv.VOC_DOUYIN_TOKEN,
86
82
  process.env.VOC_TOKEN,
87
83
  process.env.VOC_SOCIAL_TOKEN,
88
- process.env.XIAOHONGSHU_API_TOKEN,
89
- process.env.DOUYIN_API_TOKEN,
90
- process.env.DOUYIN_TOKEN,
91
- process.env.VOC_DOUYIN_TOKEN,
92
- process.env.FMODE_XIAOHONGSHU_TOKEN,
93
- process.env.FMODE_SOCIAL_TOKEN,
94
84
  claudeCreds.vocToken,
95
85
  claudeCreds.token,
96
- claudeCreds.xiaohongshuToken,
97
- claudeCreds.douyinToken,
98
86
  ]);
99
87
  }
100
88
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vocmarket/voc-skill",
3
- "version": "0.3.20",
3
+ "version": "0.3.21",
4
4
  "description": "Claude Code VOC intelligence skills for Xiaohongshu and Douyin trend reports, live social VOC collection, Fmode image analysis, single-issue deep dives, boss/operator action plans, and multi-turn memory.",
5
5
  "type": "commonjs",
6
6
  "bin": {
@@ -94,12 +94,6 @@ async function smokeNoTokenRechargePrompt() {
94
94
  HOME: process.env.HOME,
95
95
  VOC_TOKEN: process.env.VOC_TOKEN,
96
96
  VOC_SOCIAL_TOKEN: process.env.VOC_SOCIAL_TOKEN,
97
- XIAOHONGSHU_API_TOKEN: process.env.XIAOHONGSHU_API_TOKEN,
98
- FMODE_XIAOHONGSHU_TOKEN: process.env.FMODE_XIAOHONGSHU_TOKEN,
99
- FMODE_SOCIAL_TOKEN: process.env.FMODE_SOCIAL_TOKEN,
100
- DOUYIN_API_TOKEN: process.env.DOUYIN_API_TOKEN,
101
- DOUYIN_TOKEN: process.env.DOUYIN_TOKEN,
102
- VOC_DOUYIN_TOKEN: process.env.VOC_DOUYIN_TOKEN
103
97
  };
104
98
  const tempHome = path.join(os.tmpdir(), 'claude-voc-no-token-smoke');
105
99
  const tempWorkspace = path.join(os.tmpdir(), 'claude-voc-no-token-workspace-smoke');
@@ -112,12 +106,6 @@ async function smokeNoTokenRechargePrompt() {
112
106
  [
113
107
  'VOC_TOKEN',
114
108
  'VOC_SOCIAL_TOKEN',
115
- 'XIAOHONGSHU_API_TOKEN',
116
- 'FMODE_XIAOHONGSHU_TOKEN',
117
- 'FMODE_SOCIAL_TOKEN',
118
- 'DOUYIN_API_TOKEN',
119
- 'DOUYIN_TOKEN',
120
- 'VOC_DOUYIN_TOKEN'
121
109
  ].forEach(key => delete process.env[key]);
122
110
  const result = await runXiaohongshuTrend({
123
111
  collectionMode: 'live',
@@ -150,12 +138,6 @@ async function smokeDouyinNoTokenRechargePrompt() {
150
138
  HOME: process.env.HOME,
151
139
  VOC_TOKEN: process.env.VOC_TOKEN,
152
140
  VOC_SOCIAL_TOKEN: process.env.VOC_SOCIAL_TOKEN,
153
- XIAOHONGSHU_API_TOKEN: process.env.XIAOHONGSHU_API_TOKEN,
154
- FMODE_XIAOHONGSHU_TOKEN: process.env.FMODE_XIAOHONGSHU_TOKEN,
155
- FMODE_SOCIAL_TOKEN: process.env.FMODE_SOCIAL_TOKEN,
156
- DOUYIN_API_TOKEN: process.env.DOUYIN_API_TOKEN,
157
- DOUYIN_TOKEN: process.env.DOUYIN_TOKEN,
158
- VOC_DOUYIN_TOKEN: process.env.VOC_DOUYIN_TOKEN
159
141
  };
160
142
  const tempHome = path.join(os.tmpdir(), 'claude-voc-douyin-no-token-smoke');
161
143
  const tempWorkspace = path.join(os.tmpdir(), 'claude-voc-douyin-no-token-workspace-smoke');
@@ -168,12 +150,6 @@ async function smokeDouyinNoTokenRechargePrompt() {
168
150
  [
169
151
  'VOC_TOKEN',
170
152
  'VOC_SOCIAL_TOKEN',
171
- 'XIAOHONGSHU_API_TOKEN',
172
- 'FMODE_XIAOHONGSHU_TOKEN',
173
- 'FMODE_SOCIAL_TOKEN',
174
- 'DOUYIN_API_TOKEN',
175
- 'DOUYIN_TOKEN',
176
- 'VOC_DOUYIN_TOKEN'
177
153
  ].forEach(key => delete process.env[key]);
178
154
  const result = await runDouyinTrend({
179
155
  collectionMode: 'live',
@@ -206,12 +182,6 @@ function smokeWorkspaceEnvLocalToken() {
206
182
  HOME: process.env.HOME,
207
183
  VOC_TOKEN: process.env.VOC_TOKEN,
208
184
  VOC_SOCIAL_TOKEN: process.env.VOC_SOCIAL_TOKEN,
209
- XIAOHONGSHU_API_TOKEN: process.env.XIAOHONGSHU_API_TOKEN,
210
- FMODE_XIAOHONGSHU_TOKEN: process.env.FMODE_XIAOHONGSHU_TOKEN,
211
- FMODE_SOCIAL_TOKEN: process.env.FMODE_SOCIAL_TOKEN,
212
- DOUYIN_API_TOKEN: process.env.DOUYIN_API_TOKEN,
213
- DOUYIN_TOKEN: process.env.DOUYIN_TOKEN,
214
- VOC_DOUYIN_TOKEN: process.env.VOC_DOUYIN_TOKEN
215
185
  };
216
186
  const tempHome = path.join(os.tmpdir(), 'claude-voc-env-local-home-smoke');
217
187
  const tempWorkspace = path.join(os.tmpdir(), 'claude-voc-env-local-workspace-smoke');
@@ -224,12 +194,6 @@ function smokeWorkspaceEnvLocalToken() {
224
194
  [
225
195
  'VOC_TOKEN',
226
196
  'VOC_SOCIAL_TOKEN',
227
- 'XIAOHONGSHU_API_TOKEN',
228
- 'FMODE_XIAOHONGSHU_TOKEN',
229
- 'FMODE_SOCIAL_TOKEN',
230
- 'DOUYIN_API_TOKEN',
231
- 'DOUYIN_TOKEN',
232
- 'VOC_DOUYIN_TOKEN'
233
197
  ].forEach(key => delete process.env[key]);
234
198
  fs.writeFileSync(path.join(tempWorkspace, '.env.local'), 'VOC_TOKEN=workspace-smoke-token\n');
235
199
  const token = readVocToken({});
@@ -255,18 +219,13 @@ function smokeAncestorEnvLocalToken() {
255
219
  HOME: process.env.HOME,
256
220
  VOC_TOKEN: process.env.VOC_TOKEN,
257
221
  VOC_SOCIAL_TOKEN: process.env.VOC_SOCIAL_TOKEN,
258
- XIAOHONGSHU_API_TOKEN: process.env.XIAOHONGSHU_API_TOKEN,
259
- FMODE_XIAOHONGSHU_TOKEN: process.env.FMODE_XIAOHONGSHU_TOKEN,
260
- FMODE_SOCIAL_TOKEN: process.env.FMODE_SOCIAL_TOKEN,
261
- DOUYIN_API_TOKEN: process.env.DOUYIN_API_TOKEN,
262
- DOUYIN_TOKEN: process.env.DOUYIN_TOKEN,
263
- VOC_DOUYIN_TOKEN: process.env.VOC_DOUYIN_TOKEN
264
222
  };
265
223
  const tempHome = path.join(os.tmpdir(), 'claude-voc-ancestor-env-home-smoke');
266
224
  const tempWorkspace = path.join(os.tmpdir(), 'claude-voc-ancestor-env-workspace-smoke');
267
225
  const nested = path.join(tempWorkspace, 'nested', 'plugin');
268
226
  fs.mkdirSync(tempHome, { recursive: true });
269
227
  fs.mkdirSync(nested, { recursive: true });
228
+ fs.writeFileSync(path.join(tempWorkspace, '.env.local'), 'VOC_TOKEN=ancestor-smoke-token\n');
270
229
  try {
271
230
  process.chdir(nested);
272
231
  process.env.USERPROFILE = tempHome;
@@ -274,14 +233,7 @@ function smokeAncestorEnvLocalToken() {
274
233
  [
275
234
  'VOC_TOKEN',
276
235
  'VOC_SOCIAL_TOKEN',
277
- 'XIAOHONGSHU_API_TOKEN',
278
- 'FMODE_XIAOHONGSHU_TOKEN',
279
- 'FMODE_SOCIAL_TOKEN',
280
- 'DOUYIN_API_TOKEN',
281
- 'DOUYIN_TOKEN',
282
- 'VOC_DOUYIN_TOKEN'
283
236
  ].forEach(key => delete process.env[key]);
284
- fs.writeFileSync(path.join(tempWorkspace, '.env.local'), 'VOC_DOUYIN_TOKEN=ancestor-smoke-token\n');
285
237
  const token = readVocToken({});
286
238
  if (token !== 'ancestor-smoke-token') {
287
239
  throw new Error('ancestor .env.local token was not used');