@app-public/weaverbird-debug 1.0.1 → 1.0.2

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.
package/README.md CHANGED
@@ -65,11 +65,18 @@ weaverbird cli --help # 显示子命令帮助
65
65
  "env": "debug",
66
66
  "ci_base_url": "http://10.25.72.141:16644",
67
67
  "token_path": "C:\\Users\\xxx\\.weaverbird\\token.debug.json",
68
+ "user_id": "abc123",
69
+ "user_name": "张三",
68
70
  "token": {
69
71
  "access_token": "eyJxxx",
70
72
  "token_type": "Bearer",
71
73
  "expires_in": 7200,
72
- "refresh_token": "xxx"
74
+ "refresh_token": "xxx",
75
+ "user": {
76
+ "id": "abc123",
77
+ "name": "zhangsan",
78
+ "realname": "张三"
79
+ }
73
80
  }
74
81
  }
75
82
  ```
@@ -82,6 +89,8 @@ weaverbird cli --help # 显示子命令帮助
82
89
  "env": "debug",
83
90
  "ci_base_url": "http://10.25.72.141:16644",
84
91
  "token_path": "C:\\Users\\xxx\\.weaverbird\\token.debug.json",
92
+ "user_id": null,
93
+ "user_name": null,
85
94
  "token": null
86
95
  }
87
96
  ```
package/api.js CHANGED
@@ -20,7 +20,7 @@ async function refreshAccessToken(refreshToken) {
20
20
  if (result.code !== 200 || !result.data?.access_token) {
21
21
  throw new Error(result.msg || '刷新 token 失败');
22
22
  }
23
- saveToken(result.data);
23
+ saveToken({ ...getToken(), ...result.data });
24
24
  return result.data;
25
25
  }
26
26
 
@@ -38,9 +38,9 @@ async function request(path, options = {}) {
38
38
  const response = await fetch(url, {
39
39
  ...options,
40
40
  headers: {
41
- cli_token: accessToken,
42
41
  'Content-Type': 'application/json',
43
42
  ...(options.headers || {}),
43
+ cli_token: accessToken,
44
44
  },
45
45
  });
46
46
  const data = await response.json().catch(() => ({}));
package/index.js CHANGED
@@ -4,6 +4,7 @@ const yargs = require('yargs/yargs');
4
4
  const { hideBin } = require('yargs/helpers');
5
5
  const { startLogin } = require('./login');
6
6
  const { getToken, clearToken, getTokenPath } = require('./tokenStore');
7
+ const { getDisplayName } = require('./user');
7
8
  const { CI_BASE_URL, ENV } = require('./config');
8
9
  const { resolveScriptName } = require('./cli-env');
9
10
  const { runUpdate } = require('./update');
@@ -14,11 +15,14 @@ const scriptName = resolveScriptName();
14
15
 
15
16
  function printStatus() {
16
17
  const token = getToken();
18
+ const user = token?.user;
17
19
  const result = {
18
20
  logged_in: !!(token && token.access_token),
19
21
  env: ENV,
20
22
  ci_base_url: CI_BASE_URL,
21
23
  token_path: getTokenPath(),
24
+ user_id: user?.id || null,
25
+ user_name: getDisplayName(user),
22
26
  token: token || null,
23
27
  };
24
28
  console.log(JSON.stringify(result, null, 2));
package/login.js CHANGED
@@ -1,7 +1,8 @@
1
1
  const express = require('express');
2
2
  const open = require('open');
3
3
  const fetch = require('cross-fetch');
4
- const {saveToken} = require('./tokenStore');
4
+ const { saveToken } = require('./tokenStore');
5
+ const { fetchAndSaveCurrentUser, getDisplayName } = require('./user');
5
6
  const {
6
7
  CLIENT_ID,
7
8
  CLIENT_SECRET,
@@ -219,13 +220,20 @@ async function startLogin() {
219
220
  try {
220
221
  const token = await exchangeCodeForToken(code);
221
222
  saveToken(token);
223
+ let userName = null;
224
+ try {
225
+ const user = await fetchAndSaveCurrentUser();
226
+ userName = getDisplayName(user);
227
+ } catch (userErr) {
228
+ console.warn(`⚠️ 获取用户信息失败:${userErr.message}`);
229
+ }
222
230
  res.send(renderCallbackPage({
223
231
  type: 'success',
224
232
  title: '登录成功',
225
233
  message: 'CLI 已完成授权,token 已保存到本地。',
226
234
  hint: '可以关闭此页面',
227
235
  }));
228
- console.log('✅ 登录成功');
236
+ console.log(userName ? `✅ 登录成功:${userName}` : '✅ 登录成功');
229
237
  resolve(token);
230
238
  } catch (err) {
231
239
  res.status(500).send(renderCallbackPage({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@app-public/weaverbird-debug",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "WeaverBird CI 开放 CLI — 本地调试环境",
5
5
  "bin": {
6
6
  "weaverbird-debug": "bin/weaverbird-debug.js"
package/token.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const { getToken, saveToken } = require('./tokenStore');
2
- const { request } = require('./api');
2
+ const { request, getValidAccessToken } = require('./api');
3
3
 
4
4
  const SET_TOKEN_PATH = '/v1/api/ci/open/setToken';
5
5
 
@@ -25,6 +25,7 @@ async function setServiceToken(type, tokenValue) {
25
25
  }
26
26
 
27
27
  const value = String(tokenValue).trim();
28
+ const cliToken = await getValidAccessToken();
28
29
  saveToken({
29
30
  ...stored,
30
31
  [config.localKey]: value,
@@ -32,6 +33,10 @@ async function setServiceToken(type, tokenValue) {
32
33
 
33
34
  const result = await request(SET_TOKEN_PATH, {
34
35
  method: 'POST',
36
+ headers: {
37
+ 'Content-Type': 'application/json',
38
+ 'cli_token': cliToken,
39
+ },
35
40
  body: JSON.stringify({
36
41
  type,
37
42
  token: value,
package/user.js ADDED
@@ -0,0 +1,47 @@
1
+ const { getToken, saveToken } = require('./tokenStore');
2
+ const { request, getValidAccessToken } = require('./api');
3
+ const GET_USER_PATH = '/v1/api/ci/open/getUser';
4
+
5
+ function normalizeUser(user) {
6
+ if (!user) {
7
+ return null;
8
+ }
9
+ return {
10
+ id: user.id,
11
+ name: user.name,
12
+ realname: user.realname || null,
13
+ };
14
+ }
15
+
16
+ function getDisplayName(user) {
17
+ if (!user) {
18
+ return null;
19
+ }
20
+ return user.realname || user.name || null;
21
+ }
22
+
23
+ async function fetchAndSaveCurrentUser() {
24
+ const cliToken = await getValidAccessToken();
25
+ const result = await request(GET_USER_PATH, {
26
+ method: 'GET',
27
+ headers: {
28
+ cli_token: cliToken,
29
+ },
30
+ }); if (result.code !== 200 || !result.data?.user) {
31
+ throw new Error(result.msg || '获取用户信息失败');
32
+ }
33
+ const user = normalizeUser(result.data.user);
34
+ const stored = getToken() || {};
35
+ saveToken({
36
+ ...stored,
37
+ user,
38
+ });
39
+ return user;
40
+ }
41
+
42
+ module.exports = {
43
+ GET_USER_PATH,
44
+ normalizeUser,
45
+ getDisplayName,
46
+ fetchAndSaveCurrentUser,
47
+ };