@metaphorli/pingcode-cli 0.3.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/LICENSE +21 -0
- package/README.md +294 -0
- package/bin/install.js +546 -0
- package/package.json +42 -0
- package/scripts/commands/auth.js +389 -0
- package/scripts/commands/context.js +575 -0
- package/scripts/commands/shared.js +41 -0
- package/scripts/commands/workitem.js +1039 -0
- package/scripts/core.js +1372 -0
- package/scripts/pingcode.js +60 -0
- package/skills/pingcode/SKILL.md +96 -0
- package/skills/pingcode/references/auth.md +33 -0
- package/skills/pingcode/references/ctx.md +51 -0
- package/skills/pingcode/references/workitem.md +64 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Zhiheng Li
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# PingCode CLI
|
|
2
|
+
|
|
3
|
+
用于让 Codex、OpenCode 等 AI agent 通过 PingCode 官方 REST API 操作项目管理和产品管理数据的 Node.js CLI 与 skill。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx @metaphorli/pingcode-cli@latest
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
一条命令会检测当前用户已存在的 Codex / OpenCode 目录,并只安装到这些已有 Agent。每个 Agent 的 skills 根目录下会安装一个 `pingcode` skill 目录,其中包含 `references/` 子目录:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
~/.codex/skills/pingcode
|
|
15
|
+
~/.codex/skills/pingcode/references/auth.md
|
|
16
|
+
~/.codex/skills/pingcode/references/ctx.md
|
|
17
|
+
~/.codex/skills/pingcode/references/workitem.md
|
|
18
|
+
~/.config/opencode/skills/pingcode
|
|
19
|
+
~/.config/opencode/skills/pingcode/references/auth.md
|
|
20
|
+
~/.config/opencode/skills/pingcode/references/ctx.md
|
|
21
|
+
~/.config/opencode/skills/pingcode/references/workitem.md
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
默认会进入交互式安装,先选择“全局 / 项目级”,再选择要安装的 Agent;在 CI 或脚本中可以使用 `--non-interactive` 保持旧的静默自动安装行为。任何一个已选择目录写入失败(权限、磁盘等问题)不会阻断其他目录,安装结束时会打印每个目录的成功/失败/跳过摘要。
|
|
25
|
+
|
|
26
|
+
如果设置了 `CODEX_HOME`,Codex 目录会变成 `$CODEX_HOME/skills/`;其他 Agent 的目录位置不受该变量影响。
|
|
27
|
+
|
|
28
|
+
安装完成后,配置 PingCode 凭证(详见下文「凭证配置」一节):
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
export PINGCODE_CLIENT_ID="..."
|
|
32
|
+
export PINGCODE_CLIENT_SECRET="..."
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 交互式安装(默认)
|
|
36
|
+
|
|
37
|
+
直接运行安装命令会进入交互式向导:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npx @metaphorli/pingcode-cli@latest
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
流程:
|
|
44
|
+
1. 选择安装范围:
|
|
45
|
+
- **Global**(全局,安装到 `~/.codex`、`~/.config/opencode` 等)
|
|
46
|
+
- **Project-level**(项目级,安装到当前目录的 `.codex`、`.opencode` 等)
|
|
47
|
+
2. 选择要安装的 Agent(可多选)
|
|
48
|
+
3. 安装完成后会打印摘要和凭证配置提示
|
|
49
|
+
|
|
50
|
+
示例输入(全局安装 OpenCode):
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
Select install scope:
|
|
54
|
+
1) Global
|
|
55
|
+
2) Project-level
|
|
56
|
+
Enter choice (1-2, default: 1): 1
|
|
57
|
+
|
|
58
|
+
Select agents to install (comma-separated numbers, default: all):
|
|
59
|
+
1) Codex
|
|
60
|
+
2) OpenCode
|
|
61
|
+
Enter choices (1-2): 2
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 非交互式安装(CI/脚本)
|
|
65
|
+
|
|
66
|
+
在自动化环境中使用 `--non-interactive`,会保持原来的自动检测并安装到已有 Agent 目录的逻辑:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npx @metaphorli/pingcode-cli@latest --non-interactive --force
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 更新
|
|
73
|
+
|
|
74
|
+
升级到最新版本(覆盖当前用户已存在 Agent 的默认目录):
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npx @metaphorli/pingcode-cli@latest --force
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 高级用法
|
|
81
|
+
|
|
82
|
+
只安装到某一个 Agent:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npx @metaphorli/pingcode-cli@latest --codex-only --force
|
|
86
|
+
npx @metaphorli/pingcode-cli@latest --opencode-only --force
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
安装到自定义目录(例如项目本地的 `.codex/skills` 或 OpenCode 项目级 `.opencode/skills`):
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
npx @metaphorli/pingcode-cli@latest --target ".codex/skills" --force
|
|
93
|
+
npx @metaphorli/pingcode-cli@latest --target "$HOME/.config/opencode/skills" --force
|
|
94
|
+
npx @metaphorli/pingcode-cli@latest --target ".opencode/skills" --force
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`--target` 与 `--codex-only` / `--opencode-only` 互斥;指定 `--target` 后只会安装到给定目录,不再走多 Agent 默认流程。
|
|
98
|
+
|
|
99
|
+
## 复制给 AI Agent 的安装提示词
|
|
100
|
+
|
|
101
|
+
把下面这段提示词复制给你的 AI Agent,让它在你的本机环境里完成安装:
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
请帮我安装 PingCode CLI,让当前 AI Agent 可以通过 PingCode 官方 REST API 查询和操作项目/产品数据。
|
|
105
|
+
|
|
106
|
+
安装要求:
|
|
107
|
+
1. 直接运行:npx @metaphorli/pingcode-cli@latest --force
|
|
108
|
+
该命令会检测当前用户已存在的 Codex 和 OpenCode 目录,并只把 skill 安装到这些已有 Agent 的个人 skills 目录。
|
|
109
|
+
2. 安装结束后请检查对应 Agent skills 目录下是否存在 `pingcode` 目录,且目录里有 SKILL.md 入口文件和 `references/` 子目录(按你当前使用的 Agent 选择对应路径即可):
|
|
110
|
+
- ~/.codex/skills/pingcode/SKILL.md
|
|
111
|
+
- ~/.config/opencode/skills/pingcode/SKILL.md
|
|
112
|
+
3. 安装完成后,引导我配置环境变量 PINGCODE_CLIENT_ID 和 PINGCODE_CLIENT_SECRET;不要把 secret 写入仓库文件,也不要在对话里回显完整 secret。
|
|
113
|
+
4. 如果我还需要默认查询“我的任务”,请继续引导我配置 PINGCODE_USER_NAME 或 PINGCODE_USER_ID。
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 能力范围
|
|
117
|
+
|
|
118
|
+
- 使用 `client_credentials` 获取 PingCode 企业令牌
|
|
119
|
+
- 通过 OAuth2 `authorization_code` 获取用户令牌(`pingcode auth login`)
|
|
120
|
+
- 查询项目、迭代、看板、工作项类型、状态、优先级
|
|
121
|
+
- 查询、创建、更新工作项(含状态更新,支持 `--dry-run` 试运行)
|
|
122
|
+
- 在故事下创建子工作项(通过 `--parent`)
|
|
123
|
+
- 通过子命令(`context *`, `workitem *`, `auth *`)调用 PingCode API
|
|
124
|
+
|
|
125
|
+
以上能力由同一个 `pingcode` skill 统一提供,并通过 `references/` 下的 `auth.md`、`ctx.md`、`workitem.md` 分别补充用户令牌登录、工作区上下文初始化、工作项操作的详细参考。
|
|
126
|
+
|
|
127
|
+
## Skill 结构
|
|
128
|
+
|
|
129
|
+
安装后在同一个 skills 根目录下会有一个 `pingcode` skill 目录,其 `references/` 子目录按主题拆分参考文档:
|
|
130
|
+
|
|
131
|
+
| 入口 | 作用 |
|
|
132
|
+
|---|---|
|
|
133
|
+
| `pingcode/SKILL.md` | 路由入口,统一提供 PingCode CLI 的各项能力 |
|
|
134
|
+
| `pingcode/references/auth.md` | 用户令牌登录:`pingcode auth login`、grant-type 自动识别与覆盖、令牌类型说明 |
|
|
135
|
+
| `pingcode/references/ctx.md` | 工作区上下文初始化:在 Agent 前台按编号选择当前项目、迭代、用户并写入缓存 |
|
|
136
|
+
| `pingcode/references/workitem.md` | 工作项操作:`workitem list / create / show / get / update` 子命令及完整参数;含共享安全规则 |
|
|
137
|
+
|
|
138
|
+
## 子命令
|
|
139
|
+
|
|
140
|
+
PingCode CLI 通过子命令管理配置和工作项。
|
|
141
|
+
|
|
142
|
+
### 配置管理 (`context`)
|
|
143
|
+
|
|
144
|
+
| 子命令 | 说明 | 示例 |
|
|
145
|
+
|---|---|---|
|
|
146
|
+
| `context init` | 交互式初始化工作区上下文 | `pingcode context init` |
|
|
147
|
+
| `context list` | 显示当前偏好和字典摘要 | `pingcode context list` |
|
|
148
|
+
| `context set-current-user <id>` | 设置当前用户 | `pingcode context set-current-user @me` |
|
|
149
|
+
| `context set-current-project <id>` | 设置当前项目 | `pingcode context set-current-project PROJECT_ID` |
|
|
150
|
+
| `context set-current-sprint <id>` | 设置当前迭代 | `pingcode context set-current-sprint SPRINT_ID` |
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# 查看当前工作区配置
|
|
154
|
+
pingcode context list
|
|
155
|
+
|
|
156
|
+
# 交互式初始化
|
|
157
|
+
pingcode context init
|
|
158
|
+
|
|
159
|
+
# 设置当前项目
|
|
160
|
+
pingcode context set-current-project my-project
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### 工作项管理 (`workitem`)
|
|
164
|
+
|
|
165
|
+
| 子命令 | 说明 | 示例 |
|
|
166
|
+
|---|---|---|
|
|
167
|
+
| `workitem list` | 列出工作项(自动加当前用户/项目/迭代过滤) | `pingcode workitem list --assignee @me --state 进行中` |
|
|
168
|
+
| `workitem create` | 创建工作项 | `pingcode workitem create --title "新任务" --type task` |
|
|
169
|
+
| `workitem show <id>` | 查看单个工作项(通过列表接口按 id 或 identifier 查询) | `pingcode workitem show SCR-123` |
|
|
170
|
+
| `workitem get <id|identifier>` | 获取单个工作项(官方单个工作项接口;identifier 会先解析为 id) | `pingcode workitem get WORK_ITEM_ID` |
|
|
171
|
+
| `workitem update <id>` | 更新工作项 | `pingcode workitem update SCR-123 --state 已完成` |
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# 查看当前用户的未完成任务
|
|
175
|
+
pingcode workitem list --assignee @me --state 进行中 --compact
|
|
176
|
+
|
|
177
|
+
# 按类型查询
|
|
178
|
+
pingcode workitem list --type bug --assignee @me --compact
|
|
179
|
+
|
|
180
|
+
# 按关键词搜索
|
|
181
|
+
pingcode workitem list --keywords "登录页面" --compact
|
|
182
|
+
|
|
183
|
+
# 创建工作项(默认负责人为当前用户)
|
|
184
|
+
pingcode workitem create --title "实现登录页面" --type task --project "Core" --sprint "Sprint 1"
|
|
185
|
+
|
|
186
|
+
# 通过编号查看工作项
|
|
187
|
+
pingcode workitem show SCR-123
|
|
188
|
+
|
|
189
|
+
# 通过 id 获取单个工作项(官方单个工作项接口)
|
|
190
|
+
pingcode workitem get WORK_ITEM_ID
|
|
191
|
+
|
|
192
|
+
# 通过编号更新状态(支持 identifier 或 id;支持 --title/--description/--type/--project/--sprint/--priority/--assignee/--parent/--version/--board/--entry/--swimlane/--start-at/--end-at/--participants/--story-points/--estimated-workload/--remaining-workload/--properties)
|
|
193
|
+
pingcode workitem update SCR-123 --state 已完成
|
|
194
|
+
|
|
195
|
+
# 更新工作项多个属性
|
|
196
|
+
pingcode workitem update SCR-123 --title "修正后的标题" --priority 高 --story-points 3 --start-at 1736985600
|
|
197
|
+
|
|
198
|
+
# 通过 id 更新状态
|
|
199
|
+
pingcode workitem update WI-AbCdEf --state 进行中 --priority 高
|
|
200
|
+
|
|
201
|
+
# 试运行(预览 API 请求,不发送)
|
|
202
|
+
pingcode workitem create --title "test" --type task --dry-run
|
|
203
|
+
pingcode workitem update SCR-123 --state 已完成 --dry-run
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## 凭证配置
|
|
207
|
+
|
|
208
|
+
在 PingCode 企业后台创建应用,配置数据访问范围,然后设置环境变量:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
export PINGCODE_CLIENT_ID="..."
|
|
212
|
+
export PINGCODE_CLIENT_SECRET="..."
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
可选配置:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
export PINGCODE_BASE_URL="https://open.pingcode.com"
|
|
219
|
+
export PINGCODE_TOKEN_CACHE="$HOME/.cache/pingcode/token.json"
|
|
220
|
+
export PINGCODE_WORKSPACE_CACHE=".pingcode/cache.json"
|
|
221
|
+
export PINGCODE_USER_NAME="你的 PingCode 用户名或显示名"
|
|
222
|
+
export PINGCODE_USER_ID="你的 PingCode 用户 ID"
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
也可以在单次调用时传入 `--client-id`、`--client-secret`、`--user-id`、`--user-name`、`--workspace-cache`。日常使用推荐放在本机 shell profile 或由 1Password、macOS Keychain、Vault、CI secret 等工具注入为环境变量;不建议把 secret 写进仓库里的配置文件。不要把 `client_secret`、access token 或 token cache 提交到仓库。
|
|
226
|
+
|
|
227
|
+
如果脚本调用时缺少 `PINGCODE_CLIENT_ID` / `PINGCODE_CLIENT_SECRET`,会直接输出 `export` 配置示例并退出。企业令牌不能代表个人身份;操作创建工作项、查询工作项时,如果用户没有明确说“所有人”或指定其他负责人,agent 应默认使用当前用户。当前用户来自 `PINGCODE_USER_ID` / `PINGCODE_USER_NAME`、`--user-id` / `--user-name` 或工作区缓存;如果没有配置,agent 应先缓存用户列表,再让用户选择自己的 PingCode 用户。
|
|
228
|
+
|
|
229
|
+
## User token login
|
|
230
|
+
|
|
231
|
+
除了 `client_credentials` 企业令牌,CLI 也支持通过 OAuth2 `authorization_code` 获取用户令牌。用户令牌代表具体的人类用户,适合需要以个人身份操作 PingCode 的场景。
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# 在浏览器中完成授权
|
|
235
|
+
pingcode auth login --client-id ID --client-secret SECRET
|
|
236
|
+
|
|
237
|
+
# 使用用户令牌查询工作项
|
|
238
|
+
# --grant-type 会自动从缓存中识别,且 workitem list 不再默认按当前用户过滤
|
|
239
|
+
pingcode workitem list --state 进行中 --compact
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
首次使用用户令牌前必须先运行 `auth login`。`auth login` 成功后的用户令牌会缓存在默认 token cache 中,后续命令不再需要在命令行写 `--grant-type`。当缓存里是企业令牌时,命令仍然走 `client_credentials`;当缓存里是用户令牌时,走 `authorization_code`。显式传 `--grant-type` 会覆盖自动识别。
|
|
243
|
+
|
|
244
|
+
使用用户令牌时,`workitem list` 不再默认按当前用户过滤(等价于之前加 `--all-users` 的效果),因此不需要配置 `PINGCODE_USER_ID` 或工作区用户。如果你仍想只看自己的,可以显式加 `--assignee @me` 或 `--user-id`。`client_credentials` 模式下仍保持原来的默认过滤行为。
|
|
245
|
+
|
|
246
|
+
## 工作区缓存
|
|
247
|
+
|
|
248
|
+
CLI 默认把工作区偏好和常用字典缓存到 `.pingcode/cache.json`,该目录已被 `.gitignore` 忽略。缓存内容包括:
|
|
249
|
+
|
|
250
|
+
- 当前用户 ID / 名称
|
|
251
|
+
- 当前项目 ID / 名称
|
|
252
|
+
- 当前迭代 ID / 名称
|
|
253
|
+
- 用户列表或项目成员列表
|
|
254
|
+
- 工作项类型字典
|
|
255
|
+
- 工作项状态字典
|
|
256
|
+
- 工作项优先级字典
|
|
257
|
+
- 工作项属性字典
|
|
258
|
+
|
|
259
|
+
首次写入默认缓存时,如果当前项目已有 `.gitignore`,CLI 会自动确保 `.pingcode/` 已加入忽略列表。
|
|
260
|
+
|
|
261
|
+
推荐初始化当前上下文后再执行日常工作项查询或创建:
|
|
262
|
+
|
|
263
|
+
### Agent 前台问答方式
|
|
264
|
+
|
|
265
|
+
在 Codex、OpenCode 等 Agent 产品里,推荐显式调用 `$pingcode`:
|
|
266
|
+
|
|
267
|
+
```text
|
|
268
|
+
使用 $pingcode 初始化 PingCode 当前项目、迭代和用户
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
该 skill 会让 Agent 在前台聊天里按顺序展示项目、迭代、用户的编号选项。用户回复编号、ID 或名称后,Agent 会执行非交互式命令写入 `.pingcode/cache.json`。这个流程不依赖某个产品的专用 UI 控件,因此可兼容 Codex、OpenCode 和其他支持 skills 的 Agent。
|
|
272
|
+
|
|
273
|
+
### 终端交互方式
|
|
274
|
+
|
|
275
|
+
如果你是在普通 shell 里手动执行,也可以运行:
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
pingcode context init
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
该命令会在终端里引导选择当前项目、当前迭代和当前用户,并写入同一个工作区缓存。
|
|
282
|
+
|
|
283
|
+
使用 `$pingcode` skill 执行常规工作项查询或创建前,应先确认工作区缓存里有 `current_user_id`、`current_project_id`、`current_sprint_id`。缺少任一项时先运行 `pingcode context init`,完成后再重试原来的 PingCode 操作。
|
|
284
|
+
|
|
285
|
+
查询工作项时,CLI 会自动补当前用户、当前项目、当前迭代过滤条件。用户明确要求“所有人”“全部项目”“全部迭代”时分别加 `--all-users`、`--all-projects`、`--all-sprints`。
|
|
286
|
+
|
|
287
|
+
## 参考资料
|
|
288
|
+
|
|
289
|
+
- 主入口:[skills/pingcode/SKILL.md](skills/pingcode/SKILL.md)
|
|
290
|
+
- 用户令牌登录:[skills/pingcode/references/auth.md](skills/pingcode/references/auth.md)
|
|
291
|
+
- 工作区上下文:[skills/pingcode/references/ctx.md](skills/pingcode/references/ctx.md)
|
|
292
|
+
- 工作项操作:[skills/pingcode/references/workitem.md](skills/pingcode/references/workitem.md)
|
|
293
|
+
- 官方文档:https://open.pingcode.com/
|
|
294
|
+
|