@cvtoolman/pingcode-cli 0.2.0 → 0.2.1
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 +468 -0
- package/dist/cli/commands/requirement.d.ts +3 -0
- package/dist/cli/commands/requirement.d.ts.map +1 -0
- package/dist/cli/commands/requirement.js +67 -0
- package/dist/cli/commands/requirement.js.map +1 -0
- package/dist/cli/commands/user.d.ts.map +1 -1
- package/dist/cli/commands/user.js +8 -0
- package/dist/cli/commands/user.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +13 -1
- package/dist/client/client.js.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
# PingCode CLI
|
|
2
|
+
|
|
3
|
+
**让 AI 编程工具拥有 PingCode 项目管理能力。**
|
|
4
|
+
|
|
5
|
+
PingCode CLI 是一个命令行工具,通过 Skill 文件为 AI 编程助手(Cursor、Claude Code、Windsurf、Cline 等)提供工作项管理、迭代跟踪、需求查询、Wiki 编写等项目管理操作,让 AI 真正参与你的研发流程。
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
你:帮我看看当前迭代里还有哪些未完成的工作项
|
|
9
|
+
AI:我查到了当前迭代中有 3 个未完成的工作项...
|
|
10
|
+
→ pingcode-cli sprint list --project-id xxx --status in_progress
|
|
11
|
+
→ pingcode-cli work-item list --project-ids xxx --format json
|
|
12
|
+
|
|
13
|
+
你:把需求 PRD-42 的技术方案写到 Wiki 上
|
|
14
|
+
AI:已读取需求详情,生成了技术方案并发布到 Wiki...
|
|
15
|
+
→ pingcode-cli requirement get PRD-42 --format json
|
|
16
|
+
→ pingcode-cli wiki page-create --space-id xxx --name "技术方案" --content "..."
|
|
17
|
+
|
|
18
|
+
你:在工作项 WI-108 上评论并 @张三 确认
|
|
19
|
+
AI:已发送评论...
|
|
20
|
+
→ pingcode-cli work-item comment-add WI-108 --content "请 <at xxx>张三</at> 确认"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 三步快速上手
|
|
24
|
+
|
|
25
|
+
### 第 1 步:安装 CLI
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install -g @cvtoolman/pingcode-cli
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
要求 Node.js >= 18.0.0。
|
|
32
|
+
|
|
33
|
+
### 第 2 步:认证配置
|
|
34
|
+
|
|
35
|
+
首次运行 CLI 会自动引导你完成认证:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
pingcode-cli
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
支持两种认证模式:
|
|
42
|
+
|
|
43
|
+
| 模式 | 适用场景 | 说明 |
|
|
44
|
+
|------|---------|------|
|
|
45
|
+
| **客户端凭证模式**(推荐) | 企业级 API 调用 | 使用 Client ID / Secret 直接获取令牌 |
|
|
46
|
+
| **授权码模式** | 需要用户级权限的操作 | 通过浏览器授权获取用户令牌,可访问个人信息接口 |
|
|
47
|
+
|
|
48
|
+
> 部分 API(如 `/v1/myself`)仅支持用户级令牌。
|
|
49
|
+
|
|
50
|
+
### 第 3 步:安装 Skill 到你的 AI 工具
|
|
51
|
+
|
|
52
|
+
根据你使用的 AI 编程工具,选择对应的安装方式:
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## AI 工具集成指南
|
|
57
|
+
|
|
58
|
+
本项目的核心价值在于与 AI 编程工具的集成。Skill 文件(`SKILL.md`)告诉 AI 何时、如何调用 `pingcode-cli` 命令,让 AI 能主动操作 PingCode。
|
|
59
|
+
|
|
60
|
+
### Cursor
|
|
61
|
+
|
|
62
|
+
Cursor v0.50+ 内置了 Skills 系统,完全兼容 Claude Skills 格式。
|
|
63
|
+
|
|
64
|
+
**安装步骤:**
|
|
65
|
+
|
|
66
|
+
1. 确保 Cursor 版本 >= 0.50(建议切换到 Nightly/Beta 渠道)
|
|
67
|
+
2. 进入 Settings → Rules → 开启 **Agent Skills**
|
|
68
|
+
3. 将 `skills/pingcode/` 目录复制到以下位置之一:
|
|
69
|
+
- **项目级**:`<项目根目录>/.cursor/skills/pingcode/`(仅当前项目生效)
|
|
70
|
+
- **全局级**:`~/.cursor/skills/pingcode/`(所有项目生效)
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# 项目级安装(推荐,仅影响当前项目)
|
|
74
|
+
cp -r skills/pingcode/ .cursor/skills/pingcode/
|
|
75
|
+
|
|
76
|
+
# 全局安装(所有项目都能使用)
|
|
77
|
+
cp -r skills/pingcode/ ~/.cursor/skills/pingcode/
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
4. 重启 Cursor,在 Rules 面板中确认 `pingcode` Skill 已出现并勾选启用
|
|
81
|
+
5. 在对话中输入 `/pingcode` 或提到工作项、迭代、需求等关键词,AI 会自动加载 Skill
|
|
82
|
+
|
|
83
|
+
### Qoder
|
|
84
|
+
|
|
85
|
+
Qoder 原生支持 `SKILL.md` 格式的 Skills 系统,提供多种安装方式。
|
|
86
|
+
|
|
87
|
+
**方式一:手动放置(推荐)**
|
|
88
|
+
|
|
89
|
+
将 `skills/pingcode/` 目录复制到以下位置之一:
|
|
90
|
+
- **项目级**:`<项目根目录>/.qoder/skills/pingcode/`(仅当前项目生效,可提交到 Git 与团队共享)
|
|
91
|
+
- **用户级**:`~/.qoder/skills/pingcode/`(所有项目生效)
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# 项目级安装(推荐,可提交 Git 与团队共享)
|
|
95
|
+
cp -r skills/pingcode/ .qoder/skills/pingcode/
|
|
96
|
+
|
|
97
|
+
# 用户级安装(所有项目都能使用)
|
|
98
|
+
cp -r skills/pingcode/ ~/.qoder/skills/pingcode/
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
重启 Qoder IDE 后,在对话框输入 `/` 即可看到 `pingcode` Skill。
|
|
102
|
+
|
|
103
|
+
**方式二:Skills CLI 一键安装**
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# 从 GitHub 仓库安装
|
|
107
|
+
npx skills add https://github.com/your-username/pingcode-cli --skill pingcode -a qoder
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
执行后按提示选择安装级别(Global = 用户级,Project = 项目级)和 copy 模式。
|
|
111
|
+
|
|
112
|
+
**方式三:对话中安装(QoderWork 用户)**
|
|
113
|
+
|
|
114
|
+
在 QoderWork 中发送以下消息即可自动安装:
|
|
115
|
+
|
|
116
|
+
> 请帮我把 https://github.com/your-username/pingcode-cli 下载并放到 ~/.qoderwork/skills/ 目录
|
|
117
|
+
|
|
118
|
+
### Claude Code
|
|
119
|
+
|
|
120
|
+
Claude Code 是 Skills 体系的标准制定者,原生支持 `SKILL.md` 格式。
|
|
121
|
+
|
|
122
|
+
**安装步骤:**
|
|
123
|
+
|
|
124
|
+
1. 将 `skills/pingcode/` 目录复制到以下位置之一:
|
|
125
|
+
- **项目级**:`<项目根目录>/.claude/skills/pingcode/`(仅当前项目生效)
|
|
126
|
+
- **全局级**:`~/.claude/skills/pingcode/`(所有项目生效)
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# 项目级安装(推荐)
|
|
130
|
+
cp -r skills/pingcode/ .claude/skills/pingcode/
|
|
131
|
+
|
|
132
|
+
# 全局安装
|
|
133
|
+
cp -r skills/pingcode/ ~/.claude/skills/pingcode/
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
2. 在 Claude Code 中对话时,提到工作项、迭代、需求等关键词,AI 会自动识别并加载 Skill
|
|
137
|
+
3. 也可以在对话中直接输入 `/pingcode` 触发
|
|
138
|
+
|
|
139
|
+
### Windsurf
|
|
140
|
+
|
|
141
|
+
Windsurf 同样支持 Claude Skills 格式的 SKILL.md。
|
|
142
|
+
|
|
143
|
+
**安装步骤:**
|
|
144
|
+
|
|
145
|
+
1. 将 `skills/pingcode/` 目录复制到以下位置之一:
|
|
146
|
+
- **项目级**:`<项目根目录>/.windsurf/skills/pingcode/`
|
|
147
|
+
- **全局级**:`~/.windsurf/skills/pingcode/`
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# 项目级安装(推荐)
|
|
151
|
+
cp -r skills/pingcode/ .windsurf/skills/pingcode/
|
|
152
|
+
|
|
153
|
+
# 全局安装
|
|
154
|
+
cp -r skills/pingcode/ ~/.windsurf/skills/pingcode/
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
2. 重启 Windsurf 后生效
|
|
158
|
+
|
|
159
|
+
### VS Code + Cline
|
|
160
|
+
|
|
161
|
+
Cline 通过 MCP 服务器和自定义指令来扩展能力。
|
|
162
|
+
|
|
163
|
+
**方式一:自定义指令(推荐)**
|
|
164
|
+
|
|
165
|
+
在项目根目录创建或编辑 `.clinerules` 文件,将 Skill 内容写入:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# 将 SKILL.md 的内容追加到 .clinerules
|
|
169
|
+
cat skills/pingcode/SKILL.md >> .clinerules
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**方式二:MCP 服务器**
|
|
173
|
+
|
|
174
|
+
在 Cline 的 MCP 配置(`cline_mcp_settings.json`)中添加 pingcode-cli 作为命令工具:
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"mcpServers": {
|
|
179
|
+
"pingcode": {
|
|
180
|
+
"command": "pingcode-cli",
|
|
181
|
+
"args": []
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### VS Code + GitHub Copilot
|
|
188
|
+
|
|
189
|
+
在项目根目录创建 `.github/copilot-instructions.md`,将 Skill 内容写入:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
cat skills/pingcode/SKILL.md >> .github/copilot-instructions.md
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Kiro
|
|
196
|
+
|
|
197
|
+
Kiro 原生支持 `.kiro/skills/` 目录下的 SKILL.md 格式。
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
# 项目级安装
|
|
201
|
+
cp -r skills/pingcode/ .kiro/skills/pingcode/
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Trae / OpenCode
|
|
205
|
+
|
|
206
|
+
Trae 和 OpenCode 同样兼容 Claude Skills 格式:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# 根据工具配置,将 skills/pingcode/ 复制到对应的 skills 目录
|
|
210
|
+
# 一般位于 ~/.trae/skills/ 或 ~/.opencode/skills/
|
|
211
|
+
cp -r skills/pingcode/ ~/.<工具名>/skills/pingcode/
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Skill 工作原理
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
┌──────────────────┐ ┌──────────────────┐ ┌──────────────┐
|
|
220
|
+
│ AI 编程工具 │ ──→ │ SKILL.md │ ──→ │ pingcode-cli │
|
|
221
|
+
│ (Cursor/Claude) │ │ + references/ │ │ 命令执行 │
|
|
222
|
+
└──────────────────┘ └──────────────────┘ └──────────────┘
|
|
223
|
+
│ │
|
|
224
|
+
│ │
|
|
225
|
+
AI 读取后判断 调用 PingCode API
|
|
226
|
+
何时 & 如何调用 返回数据给 AI
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
AI 编程工具启动时会扫描 Skills 目录,遇到 `SKILL.md` 后:
|
|
230
|
+
|
|
231
|
+
1. **预加载元数据** — 读取 YAML frontmatter 中的 `name` 和 `description`,知道"有一个 pingcode Skill 可用"
|
|
232
|
+
2. **按需加载指令** — 当对话中涉及工作项、迭代、需求、Wiki 等关键词时,AI 读取 SKILL.md 正文和 references 文件
|
|
233
|
+
3. **自动执行命令** — AI 根据指令组装 `pingcode-cli` 命令并执行,获取结果后回复用户
|
|
234
|
+
|
|
235
|
+
### Skill 模块总览
|
|
236
|
+
|
|
237
|
+
| 用户意图 | 模块 | Reference 文件 |
|
|
238
|
+
|---------|------|---------------|
|
|
239
|
+
| 查看/创建/搜索工作项、查看我的任务 | 工作项 | `references/work-item.md` |
|
|
240
|
+
| 查看/管理迭代 | 迭代 | `references/sprint.md` |
|
|
241
|
+
| 查看/创建 Wiki 页面、写技术方案 | Wiki | `references/wiki.md` |
|
|
242
|
+
| 查看项目信息、项目成员 | 项目 | `references/project.md` |
|
|
243
|
+
| 查看用户信息、查找用户 | 用户 | `references/user.md` |
|
|
244
|
+
| 认证登录、检查令牌状态 | 认证 | `references/auth.md` |
|
|
245
|
+
| 查看需求列表、读取需求详情、搜索需求 | 需求 | `references/requirement.md` |
|
|
246
|
+
|
|
247
|
+
## AI 使用场景示例
|
|
248
|
+
|
|
249
|
+
### 查看我的任务
|
|
250
|
+
|
|
251
|
+
> 你:帮我看看当前迭代还有什么没做完的
|
|
252
|
+
|
|
253
|
+
AI 会依次执行:
|
|
254
|
+
1. `pingcode-cli user me --format json` → 获取你的用户 ID
|
|
255
|
+
2. `pingcode-cli project list --format json` → 获取项目列表
|
|
256
|
+
3. `pingcode-cli sprint list --project-id <id> --status in_progress` → 获取进行中的迭代
|
|
257
|
+
4. `pingcode-cli work-item list --project-ids <id> --assignee-ids <user-id>` → 获取你的工作项
|
|
258
|
+
|
|
259
|
+
### 为需求写技术方案并发布到 Wiki
|
|
260
|
+
|
|
261
|
+
> 你:把需求 PRD-42 的技术方案写到 Wiki 上
|
|
262
|
+
|
|
263
|
+
AI 会依次执行:
|
|
264
|
+
1. `pingcode-cli requirement get PRD-42 --format json` → 读取需求详情
|
|
265
|
+
2. 根据需求内容生成技术方案
|
|
266
|
+
3. `pingcode-cli wiki space-list --format json` → 列出 Wiki 空间
|
|
267
|
+
4. `pingcode-cli wiki page-create --space-id <id> --name "技术方案:<标题>" --content "<内容>"` → 创建页面
|
|
268
|
+
|
|
269
|
+
### 评论工作项并 @mention
|
|
270
|
+
|
|
271
|
+
> 你:在工作项 WI-108 上评论,让张三确认一下
|
|
272
|
+
|
|
273
|
+
AI 会依次执行:
|
|
274
|
+
1. `pingcode-cli work-item get WI-108 --format json` → 确认工作项
|
|
275
|
+
2. `pingcode-cli user search 张三 --format json` → 查找张三的用户 ID
|
|
276
|
+
3. `pingcode-cli work-item comment-add WI-108 --content "请 <at user-id>张三</at> 确认需求"` → 发送评论
|
|
277
|
+
|
|
278
|
+
### 读取需求到本地
|
|
279
|
+
|
|
280
|
+
> 你:帮我导出需求 STORY-200 的详细内容
|
|
281
|
+
|
|
282
|
+
AI 会执行:
|
|
283
|
+
1. `pingcode-cli requirement get STORY-200 --format json` → 获取需求详情
|
|
284
|
+
2. AI 将结果保存到本地文件供后续引用
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## CLI 命令参考
|
|
289
|
+
|
|
290
|
+
除了 AI 自动调用,你也可以直接使用 CLI 命令:
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
# 认证管理
|
|
294
|
+
pingcode-cli auth login # 交互式登录
|
|
295
|
+
pingcode-cli auth status # 查看认证状态
|
|
296
|
+
pingcode-cli auth config # 查看配置
|
|
297
|
+
pingcode-cli auth logout # 清除认证信息
|
|
298
|
+
|
|
299
|
+
# 用户
|
|
300
|
+
pingcode-cli user me # 查看当前用户信息
|
|
301
|
+
pingcode-cli user search <关键词> # 搜索用户
|
|
302
|
+
|
|
303
|
+
# 项目
|
|
304
|
+
pingcode-cli project list # 获取项目列表
|
|
305
|
+
pingcode-cli project members <id> # 获取项目成员
|
|
306
|
+
|
|
307
|
+
# 工作项
|
|
308
|
+
pingcode-cli work-item list # 获取工作项列表
|
|
309
|
+
pingcode-cli work-item get <id> # 获取工作项详情
|
|
310
|
+
pingcode-cli work-item create # 创建工作项
|
|
311
|
+
pingcode-cli work-item search <关键词> # 搜索工作项
|
|
312
|
+
pingcode-cli work-item comment-list <id> # 查看工作项评论
|
|
313
|
+
pingcode-cli work-item comment-add <id> --content "评论内容" # 添加评论
|
|
314
|
+
|
|
315
|
+
# 迭代
|
|
316
|
+
pingcode-cli sprint list --project-id <id> # 获取迭代列表
|
|
317
|
+
pingcode-cli sprint get <id> # 获取迭代详情
|
|
318
|
+
|
|
319
|
+
# 需求
|
|
320
|
+
pingcode-cli requirement list # 获取需求列表
|
|
321
|
+
pingcode-cli requirement get <id> # 获取需求详情
|
|
322
|
+
pingcode-cli requirement search <关键词> # 搜索需求
|
|
323
|
+
|
|
324
|
+
# Wiki
|
|
325
|
+
pingcode-cli wiki space-list # 获取 Wiki 空间列表
|
|
326
|
+
pingcode-cli wiki page-list --space-id <id> # 获取页面列表
|
|
327
|
+
pingcode-cli wiki page-create --space-id <id> --name "标题" --content "内容" # 创建页面
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
多数命令支持 `--format json` 参数输出 JSON 格式,便于 AI 解析和脚本组合使用。
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## 配置
|
|
335
|
+
|
|
336
|
+
### 方式一:交互式配置(推荐)
|
|
337
|
+
|
|
338
|
+
首次运行 CLI 时自动引导配置,凭证保存在全局配置中。
|
|
339
|
+
|
|
340
|
+
### 方式二:环境变量
|
|
341
|
+
|
|
342
|
+
在项目目录创建 `.env` 文件(参考 `.env.example`):
|
|
343
|
+
|
|
344
|
+
```env
|
|
345
|
+
PINGCODE_API_ROOT=https://open.pingcode.com
|
|
346
|
+
PINGCODE_AUTH_MODE=client
|
|
347
|
+
|
|
348
|
+
# 客户端凭证模式
|
|
349
|
+
PINGCODE_CLIENT_ID=your_client_id
|
|
350
|
+
PINGCODE_CLIENT_SECRET=your_client_secret
|
|
351
|
+
|
|
352
|
+
# 授权码模式
|
|
353
|
+
PINGCODE_USER_CLIENT_ID=your_user_client_id
|
|
354
|
+
PINGCODE_USER_CLIENT_SECRET=your_user_client_secret
|
|
355
|
+
|
|
356
|
+
# 可选
|
|
357
|
+
PINGCODE_ORG_ID=your_org_id
|
|
358
|
+
PINGCODE_PRODUCT_ID=your_product_id
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### 配置优先级
|
|
362
|
+
|
|
363
|
+
项目级 `.env` 文件优先级高于全局配置(`~/.pingcode/config.json`)。
|
|
364
|
+
|
|
365
|
+
### 全局配置文件位置
|
|
366
|
+
|
|
367
|
+
- 配置文件:`~/.pingcode/config.json`
|
|
368
|
+
- 令牌文件:`~/.pingcode/token.json`
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
# 修改 API 地址
|
|
372
|
+
pingcode-cli auth config --set-api-root <url>
|
|
373
|
+
|
|
374
|
+
# 重置所有配置
|
|
375
|
+
pingcode-cli auth config --reset
|
|
376
|
+
|
|
377
|
+
# 清除认证信息(保留配置)
|
|
378
|
+
pingcode-cli auth logout
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
---
|
|
382
|
+
|
|
383
|
+
## 作为 SDK 使用
|
|
384
|
+
|
|
385
|
+
除了 CLI 和 AI Skill 方式,你也可以在 Node.js 代码中直接调用:
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
import { PingCodeClient } from '@cvtoolman/pingcode-cli';
|
|
389
|
+
|
|
390
|
+
const client = new PingCodeClient({
|
|
391
|
+
apiRoot: 'https://open.pingcode.com',
|
|
392
|
+
clientId: 'your_client_id',
|
|
393
|
+
clientSecret: 'your_client_secret',
|
|
394
|
+
authMode: 'client',
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
await client.initSubApis();
|
|
398
|
+
|
|
399
|
+
// 获取项目列表
|
|
400
|
+
const projects = await client.listProjects();
|
|
401
|
+
|
|
402
|
+
// 搜索工作项
|
|
403
|
+
const results = await client.workItems.searchWorkItems('关键词');
|
|
404
|
+
|
|
405
|
+
// Wiki 操作
|
|
406
|
+
const spaces = await client.wiki.listSpaces();
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
也可以使用环境变量配置,无需传入参数:
|
|
410
|
+
|
|
411
|
+
```typescript
|
|
412
|
+
import { PingCodeClient } from '@cvtoolman/pingcode-cli';
|
|
413
|
+
|
|
414
|
+
const client = new PingCodeClient();
|
|
415
|
+
await client.initSubApis();
|
|
416
|
+
|
|
417
|
+
const myself = await client.myself.get();
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
## 开发
|
|
423
|
+
|
|
424
|
+
```bash
|
|
425
|
+
git clone https://github.com/your-username/pingcode-cli.git
|
|
426
|
+
cd pingcode-cli
|
|
427
|
+
npm install
|
|
428
|
+
npm run build # 编译 TypeScript
|
|
429
|
+
npm run lint # 类型检查
|
|
430
|
+
npm test # 运行测试
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### 项目结构
|
|
434
|
+
|
|
435
|
+
```
|
|
436
|
+
src/
|
|
437
|
+
├── cli/ # CLI 命令行入口
|
|
438
|
+
│ ├── index.ts # CLI 主入口
|
|
439
|
+
│ ├── setup.ts # 首次使用引导 & 授权检查
|
|
440
|
+
│ ├── config-store.ts # 全局配置管理
|
|
441
|
+
│ ├── output.ts # 输出格式化(JSON/表格/键值)
|
|
442
|
+
│ └── commands/ # 各子命令实现
|
|
443
|
+
│ ├── auth.ts # 认证管理
|
|
444
|
+
│ ├── user.ts # 用户查询
|
|
445
|
+
│ ├── work-item.ts # 工作项管理
|
|
446
|
+
│ ├── sprint.ts # 迭代管理
|
|
447
|
+
│ ├── wiki.ts # Wiki 管理
|
|
448
|
+
│ ├── project.ts # 项目管理
|
|
449
|
+
│ └── requirement.ts # 需求管理
|
|
450
|
+
├── client/ # API Client SDK
|
|
451
|
+
│ ├── client.ts # 主客户端
|
|
452
|
+
│ ├── auth.ts # OAuth 认证管理器
|
|
453
|
+
│ ├── token-store.ts # 令牌持久化
|
|
454
|
+
│ ├── errors.ts # 错误类定义
|
|
455
|
+
│ ├── types.ts # 公共类型定义
|
|
456
|
+
│ └── api/ # 各子 API 实现
|
|
457
|
+
skills/pingcode/ # AI Skill 定义
|
|
458
|
+
├── SKILL.md # Skill 主描述文件
|
|
459
|
+
└── references/ # 各模块命令参考
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### 技术栈
|
|
463
|
+
|
|
464
|
+
- TypeScript (ES2022) / Commander.js / 原生 fetch / Vitest
|
|
465
|
+
|
|
466
|
+
## License
|
|
467
|
+
|
|
468
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirement.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/requirement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,kBAAkB,SAAiD,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { getClient } from '../client.js';
|
|
3
|
+
import { printJson, printTable, printKeyValue } from '../output.js';
|
|
4
|
+
export const requirementCommand = new Command('requirement').description('需求管理');
|
|
5
|
+
requirementCommand
|
|
6
|
+
.command('list')
|
|
7
|
+
.description('获取需求列表')
|
|
8
|
+
.option('--product-id <id>', '产品 ID')
|
|
9
|
+
.option('--story-type <id>', '需求类型 ID')
|
|
10
|
+
.option('--status-id <id>', '状态 ID')
|
|
11
|
+
.option('--priority <p>', '优先级')
|
|
12
|
+
.option('--page-index <n>', '页码', '0')
|
|
13
|
+
.option('--page-size <n>', '每页数量', '30')
|
|
14
|
+
.option('--format <format>', '输出格式', 'text')
|
|
15
|
+
.action(async (opts) => {
|
|
16
|
+
try {
|
|
17
|
+
const client = await getClient();
|
|
18
|
+
const data = await client.stories.listStories({
|
|
19
|
+
productId: opts.productId,
|
|
20
|
+
storyType: opts.storyType,
|
|
21
|
+
statusId: opts.statusId,
|
|
22
|
+
priority: opts.priority,
|
|
23
|
+
pageIndex: Number(opts.pageIndex),
|
|
24
|
+
pageSize: Number(opts.pageSize),
|
|
25
|
+
});
|
|
26
|
+
opts.format === 'json' ? printJson(data) : printTable(data.values || []);
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
console.error(e.message);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
requirementCommand
|
|
34
|
+
.command('get <id>')
|
|
35
|
+
.description('获取需求详情')
|
|
36
|
+
.option('--product-id <id>', '产品 ID')
|
|
37
|
+
.option('--format <format>', '输出格式', 'text')
|
|
38
|
+
.action(async (id, opts) => {
|
|
39
|
+
try {
|
|
40
|
+
const client = await getClient();
|
|
41
|
+
const data = await client.stories.getStory(id, opts.productId);
|
|
42
|
+
opts.format === 'json' ? printJson(data) : printKeyValue(data);
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
console.error(e.message);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
requirementCommand
|
|
50
|
+
.command('search <keyword>')
|
|
51
|
+
.description('搜索需求')
|
|
52
|
+
.option('--product-id <id>', '产品 ID')
|
|
53
|
+
.option('--page-index <n>', '页码', '0')
|
|
54
|
+
.option('--page-size <n>', '每页数量', '30')
|
|
55
|
+
.option('--format <format>', '输出格式', 'text')
|
|
56
|
+
.action(async (keyword, opts) => {
|
|
57
|
+
try {
|
|
58
|
+
const client = await getClient();
|
|
59
|
+
const data = await client.stories.searchStories(keyword, opts.productId, Number(opts.pageIndex), Number(opts.pageSize));
|
|
60
|
+
opts.format === 'json' ? printJson(data) : printTable(data.values || []);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
console.error(e.message);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=requirement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirement.js","sourceRoot":"","sources":["../../../src/cli/commands/requirement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SAA0C,CAAC"}
|
|
@@ -9,6 +9,14 @@ userCommand
|
|
|
9
9
|
.action(async (opts) => {
|
|
10
10
|
try {
|
|
11
11
|
const client = await getClient();
|
|
12
|
+
// /v1/myself 端点需要用户令牌,客户端凭证(企业令牌)不支持此接口
|
|
13
|
+
if (client.auth.authMode === 'client') {
|
|
14
|
+
console.error('该命令需要用户级令牌(授权码模式),当前使用的是客户端凭证模式(企业令牌)。');
|
|
15
|
+
console.error('请使用授权码模式登录以获取用户令牌:');
|
|
16
|
+
console.error(' 1. 运行 pingcode-cli auth login,选择「授权码模式」');
|
|
17
|
+
console.error(' 2. 或设置环境变量 PINGCODE_AUTH_MODE=user');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
12
20
|
const data = await client.myself.getMyself();
|
|
13
21
|
opts.format === 'json' ? printJson(data) : printKeyValue(data);
|
|
14
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/cli/commands/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/cli/commands/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGxD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnE,WAAW;KACR,OAAO,CAAC,IAAI,CAAC;KACb,WAAW,CAAC,UAAU,CAAC;KACvB,MAAM,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,wCAAwC;QACxC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AACjE,CAAC,CAAC,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import { workItemCommand } from './commands/work-item.js';
|
|
|
11
11
|
import { sprintCommand } from './commands/sprint.js';
|
|
12
12
|
import { wikiCommand } from './commands/wiki.js';
|
|
13
13
|
import { projectCommand } from './commands/project.js';
|
|
14
|
+
import { requirementCommand } from './commands/requirement.js';
|
|
14
15
|
// 将全局配置(~/.pingcode/config.json)注入环境变量
|
|
15
16
|
applyGlobalConfigToEnv();
|
|
16
17
|
const program = new Command('pingcode-cli')
|
|
@@ -22,6 +23,7 @@ program.addCommand(workItemCommand);
|
|
|
22
23
|
program.addCommand(sprintCommand);
|
|
23
24
|
program.addCommand(wikiCommand);
|
|
24
25
|
program.addCommand(projectCommand);
|
|
26
|
+
program.addCommand(requirementCommand);
|
|
25
27
|
// auth 相关子命令不需要预检查授权(避免死循环)
|
|
26
28
|
const AUTH_COMMANDS = ['auth', 'help', '--help', '-h', '--version', '-V'];
|
|
27
29
|
async function main() {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,uCAAuC;AACvC,sBAAsB,EAAE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;KACxC,WAAW,CAAC,+BAA+B,CAAC;KAC5C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAEvC,4BAA4B;AAC5B,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;AAE1E,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEzB,uBAAuB;IACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3E,qBAAa,cAAc;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAE5B,OAAO,CAAC,QAAQ,CAAC,CAAM;IACvB,OAAO,CAAC,UAAU,CAAC,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAM;IACvB,OAAO,CAAC,aAAa,CAAC,CAAM;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAM;IACpB,OAAO,CAAC,OAAO,CAAC,CAAM;IACtB,OAAO,CAAC,SAAS,CAAC,CAAM;gBAEZ,OAAO,GAAE,qBAA0B;YAkBjC,SAAS;IAWvB,OAAO,CAAC,cAAc,CAAS;IAEzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBlC,IAAI,OAAO,QAA6B;IACxC,IAAI,SAAS,QAA+B;IAC5C,IAAI,OAAO,QAA6B;IACxC,IAAI,YAAY,QAAkC;IAClD,IAAI,IAAI,QAA0B;IAClC,IAAI,MAAM,QAA4B;IACtC,IAAI,QAAQ,QAA8B;YAI5B,QAAQ;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3E,qBAAa,cAAc;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAE5B,OAAO,CAAC,QAAQ,CAAC,CAAM;IACvB,OAAO,CAAC,UAAU,CAAC,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAM;IACvB,OAAO,CAAC,aAAa,CAAC,CAAM;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAM;IACpB,OAAO,CAAC,OAAO,CAAC,CAAM;IACtB,OAAO,CAAC,SAAS,CAAC,CAAM;gBAEZ,OAAO,GAAE,qBAA0B;YAkBjC,SAAS;IAWvB,OAAO,CAAC,cAAc,CAAS;IAEzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBlC,IAAI,OAAO,QAA6B;IACxC,IAAI,SAAS,QAA+B;IAC5C,IAAI,OAAO,QAA6B;IACxC,IAAI,YAAY,QAAkC;IAClD,IAAI,IAAI,QAA0B;IAClC,IAAI,MAAM,QAA4B;IACtC,IAAI,QAAQ,QAA8B;YAI5B,QAAQ;IAoDhB,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxE,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI3E,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1E,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5E,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAMnD,OAAO,CAAC,cAAc;IAIhB,YAAY,CAAC,SAAS,SAAI,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAItE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI3C,YAAY,CAAC,SAAS,SAAI,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAItE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI3C,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAIrD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,SAAI,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI/F,mBAAmB,CAAC,SAAS,SAAI,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI7E,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAG5C"}
|
package/dist/client/client.js
CHANGED
|
@@ -103,7 +103,19 @@ export class PingCodeClient {
|
|
|
103
103
|
if (res.status === 401 || res.status === 403) {
|
|
104
104
|
const lower = text.toLowerCase();
|
|
105
105
|
if (lower.includes('token') || lower.includes('unauthorized') || lower.includes('forbidden')) {
|
|
106
|
-
|
|
106
|
+
let msg = '认证失败:访问令牌无效或已过期';
|
|
107
|
+
if (this.auth.authMode === 'client') {
|
|
108
|
+
msg += '\n\n当前使用的是客户端凭证模式(企业令牌)。部分接口(如 /v1/myself)需要用户级令牌。';
|
|
109
|
+
msg += '\n请尝试以下步骤:';
|
|
110
|
+
msg += '\n 1. 运行 pingcode-cli auth login,选择「授权码模式」获取用户令牌';
|
|
111
|
+
msg += '\n 2. 运行 pingcode-cli auth status 检查当前认证状态';
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
msg += '\n\n请尝试以下步骤:';
|
|
115
|
+
msg += '\n 1. 运行 pingcode-cli auth status 检查当前认证状态';
|
|
116
|
+
msg += '\n 2. 运行 pingcode-cli auth login 重新登录';
|
|
117
|
+
}
|
|
118
|
+
throw new AuthenticationError(msg);
|
|
107
119
|
}
|
|
108
120
|
}
|
|
109
121
|
throw new ApiError(`API 请求失败: HTTP ${res.status}`, res.status, text);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|