@super-coding/cli 0.2.2 → 0.2.4
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 +7 -1
- package/dist/bin/pc-darwin-arm64 +0 -0
- package/dist/bin/pc-linux-x64 +0 -0
- package/dist/cli.js +20 -2
- package/dist/daemon/agent/builtin/agent.md +120 -21
- package/dist/daemon/agent/builtin/load.js +1 -0
- package/dist/daemon/agent/builtin/parse.js +2 -0
- package/dist/daemon/agent/index.js +1 -0
- package/dist/daemon/agent/resolve.js +19 -1
- package/dist/daemon/index.js +43 -8
- package/dist/daemon/local-path.js +43 -0
- package/dist/daemon/manage.js +35 -3
- package/dist/daemon/orchestrator.js +116 -1
- package/dist/daemon/session/store.js +12 -0
- package/dist/daemon/urls.js +9 -0
- package/dist/pingcode/builtin/SKILL.md +41 -14
- package/dist/pingcode/builtin/reference-cross.md +172 -0
- package/dist/pingcode/builtin/reference-org-wiki.md +127 -0
- package/dist/pingcode/builtin/reference-ship.md +282 -0
- package/dist/pingcode/builtin/reference-testhub.md +172 -0
- package/dist/pingcode/builtin/reference.md +351 -50
- package/dist/pingcode/cli.js +14 -3
- package/dist/pingcode/detect.js +71 -11
- package/dist/pingcode/index.js +2 -1
- package/dist/pingcode/remote-config.js +69 -0
- package/dist/pingcode/skill.js +30 -7
- package/dist/setup/index.js +329 -0
- package/dist/setup/prompt.js +129 -0
- package/dist/setup/ui.js +78 -0
- package/package.json +3 -2
|
@@ -1,80 +1,367 @@
|
|
|
1
|
-
# pc
|
|
1
|
+
# pc 命令速查(PingCode Open API)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
本目录是 `pc` 的**完整**命令参考,覆盖 18 个模块、约 500 条子命令,均取自 `pc` 1.2.x 的实际 clap 定义。
|
|
4
|
+
**不要运行 `pc --help` / `pc <...> -h`**(上游会把凭据当默认值打印),查这里。
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
| 要找什么 | 看哪个文件 |
|
|
7
|
+
|---|---|
|
|
8
|
+
| 项目、工作项、迭代、发布、看板 | **本文件** `reference.md` |
|
|
9
|
+
| 产品、需求(idea)、工单(ticket) | `reference-ship.md` |
|
|
10
|
+
| 测试库、用例、计划、执行 | `reference-testhub.md` |
|
|
11
|
+
| 部门 / 团队 / 成员 / 角色 / 知识库页面 | `reference-org-wiki.md` |
|
|
12
|
+
| 评论、附件、参与人、关联、活动、评审、自定义属性、工时、权限、日志 | `reference-cross.md` |
|
|
13
|
+
|
|
14
|
+
## 通用约定(所有模块一致)
|
|
7
15
|
|
|
8
16
|
- 输出:结果一律 pretty JSON 到 **stdout**;`-v` 把每个 HTTP 请求/响应打到 **stderr**(已脱敏)。
|
|
9
17
|
- 写操作的请求体:`--data '<JSON>'`、`--data @/tmp/body.json`、`--data @-`(stdin)。
|
|
10
18
|
必须是 JSON **object**,不是数组。
|
|
11
19
|
- 分页响应:`{ page_index, page_size, total, values[] }`,`page_index` **从 0 开始**。
|
|
12
|
-
- 全局参数(`--dry-run`、`-v
|
|
20
|
+
- 全局参数(`--dry-run`、`-v`)放在子命令前后都行。`--dry-run` 只打印请求,不发网络、不校验凭据。
|
|
21
|
+
- 列表类命令的 `--page-index` / `--page-size` **不是都有**:本文件每条命令都按真实定义列出,没写就是没有。
|
|
22
|
+
- `--include-public-image-token <FIELDS>` 用于让富文本字段里的图片带可访问 token,多个字段用逗号分隔。
|
|
23
|
+
- `--include-deleted` / `--include-archived` 只在支持的命令上有,别套用到所有列表。
|
|
24
|
+
|
|
25
|
+
## 命令全景(不知道用哪个模块时先看这张表)
|
|
26
|
+
|
|
27
|
+
| 模块 | 管什么 | 常用入口 |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| `pjm` | 项目、工作项、迭代、发布、看板、字典 | `workitem get/list/search`、`project list`、`sprint list` |
|
|
30
|
+
| `ship` | 产品、需求(idea)、工单(ticket)、客户 | `idea get/list`、`ticket get/list`、`product list` |
|
|
31
|
+
| `testhub` | 测试库、用例、测试计划、执行记录 | `testcase get/list`、`testplan list`、`testrun list` |
|
|
32
|
+
| `wiki` | 知识空间与页面(含正文、版本) | `page get`、`page get-content` |
|
|
33
|
+
| `organization` | 企业信息、成员、部门、团队、角色、职位 | `user list` |
|
|
34
|
+
| `comments` | 各类对象的评论 | `comments list/create` |
|
|
35
|
+
| `attachments` | 附件(文件 / 代码片段) | `upload-file`、`list` |
|
|
36
|
+
| `participants` | 参与人(关注者) | `list/add/remove` |
|
|
37
|
+
| `relations` | 跨模块关联关系 | `list/create` |
|
|
38
|
+
| `activities` | 操作历史(只读) | `list` |
|
|
39
|
+
| `reviews` | 评审及其被评审对象 | `list/create` |
|
|
40
|
+
| `entity-properties` | 实体的自定义键值属性 | `list/create` |
|
|
41
|
+
| `workload` / `workload-type` | 工时记录与工时类型 | `workload list/create` |
|
|
42
|
+
| `permission` | 权限点与我的权限 | `my-principal`、`check-*` |
|
|
43
|
+
| `security` | 登录日志、审计日志 | `login-log list`、`audit-log list` |
|
|
44
|
+
| `expression` | 表达式语法解析与求值 | `analyse`、`evaluate` |
|
|
45
|
+
| `doctor` | 配置与连通性自检 | `pc doctor` |
|
|
13
46
|
|
|
14
47
|
## 项目与工作项(pjm)
|
|
15
48
|
|
|
16
|
-
|
|
17
|
-
|---|---|
|
|
18
|
-
| 按名称找项目 | `pc pjm project list --keywords "项目名"` → `values[].id`(支持 `--page-index` / `--page-size`) |
|
|
19
|
-
| 项目详情 | `pc pjm project get <PROJECT_ID>`(必须是 24 位 ID;传 `identifier` 如 `SUPER` 会 404 `100002`) |
|
|
20
|
-
| 工作项详情 | `pc pjm workitem get <WORKITEM_ID\|SHORT_ID>`(**位置参数**;接受 24 位 ID,或 8 位 `short_id`(如 `67jL99pN`,= `html_url` 末段)。**不接受** `DEMO-1` 这类 identifier,会报 `100317`) |
|
|
21
|
-
| 工作项列表 | `pc pjm workitem list --project-id <PID> [--parent-id <ID>] [--type-id story] [--assignee-id <UID>] [--state-id <SID>] [--sprint-id <SPID>] [--identifier DEMO-19] [--keywords <关键词>] [--include-archived]` |
|
|
22
|
-
| 工作项搜索 | `pc pjm workitem search --data '{"mode":"query","payload":{"filter":{...}}}'` |
|
|
23
|
-
| 创建工作项 | `pc pjm workitem create --data '{"project_id":"<PID>","type_id":"story","title":"标题"}'` |
|
|
24
|
-
| 更新工作项 | `pc pjm workitem update <WORKITEM_ID> --data '{"state_id":"<SID>"}'`(`title`/`description`/`assignee_id`/`sprint_id`/`priority_id`/`story_points`/`properties` 等可选) |
|
|
25
|
-
| 删除工作项 | `pc pjm workitem delete <WORKITEM_ID>` |
|
|
26
|
-
| 工作项状态字典 | `pc pjm workitem-state list-for-project --project-id <PID> --workitem-type-id <TID>` |
|
|
27
|
-
| 工作项类型字典 | `pc pjm workitem-type list-for-project --project-id <PID>` |
|
|
28
|
-
|
|
29
|
-
> `pjm workitem list` **没有** `--page-index` / `--page-size`。要全量或翻页,只能用 `workitem search`,
|
|
30
|
-
> 分页/条件写在请求体的 `payload` 里。`workitem create` 的 `type_id` 可直接用系统枚举
|
|
31
|
-
> (`story` / `bug` / `task` / `epic` / `feature` / `phase` / `milestone` / `requirement` / `issue`)。
|
|
32
|
-
|
|
33
|
-
## 评论(comments)
|
|
34
|
-
|
|
35
|
-
| 目的 | 命令 |
|
|
36
|
-
|---|---|
|
|
37
|
-
| 列评论 | `pc comments list --principal-type workitem --principal-id <ID> [--page-index 0 --page-size 50]` |
|
|
38
|
-
| 发评论 | `pc comments create --data '{"principal_type":"workitem","principal_id":"<ID>","content":"内容"}'` |
|
|
39
|
-
| 读单条 | `pc comments get <COMMENT_ID> --principal-type workitem --principal-id <ID>` |
|
|
49
|
+
### `pjm board` — 看板(list / get / create / update / delete)
|
|
40
50
|
|
|
41
|
-
|
|
42
|
-
|
|
51
|
+
```bash
|
|
52
|
+
pc pjm board list <PROJECT_ID>
|
|
53
|
+
pc pjm board get <PROJECT_ID> <BOARD_ID>
|
|
54
|
+
pc pjm board create --data <JSON> <PROJECT_ID>
|
|
55
|
+
pc pjm board update --data <JSON> <PROJECT_ID> <BOARD_ID>
|
|
56
|
+
pc pjm board delete <PROJECT_ID> <BOARD_ID>
|
|
57
|
+
```
|
|
43
58
|
|
|
44
|
-
|
|
59
|
+
### `pjm board-entry` — 看板卡片(list / get / create / update / delete)
|
|
45
60
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
61
|
+
```bash
|
|
62
|
+
pc pjm board-entry list <PROJECT_ID> <BOARD_ID>
|
|
63
|
+
pc pjm board-entry get <PROJECT_ID> <BOARD_ID> <ENTRY_ID>
|
|
64
|
+
pc pjm board-entry create --data <JSON> <PROJECT_ID> <BOARD_ID>
|
|
65
|
+
pc pjm board-entry update --data <JSON> <PROJECT_ID> <BOARD_ID> <ENTRY_ID>
|
|
66
|
+
pc pjm board-entry delete <PROJECT_ID> <BOARD_ID> <ENTRY_ID>
|
|
67
|
+
```
|
|
52
68
|
|
|
53
|
-
|
|
69
|
+
### `pjm board-swimlane` — 看板泳道(list / get / create / update / delete)
|
|
54
70
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
71
|
+
```bash
|
|
72
|
+
pc pjm board-swimlane list <PROJECT_ID> <BOARD_ID>
|
|
73
|
+
pc pjm board-swimlane get <PROJECT_ID> <BOARD_ID> <SWIMLANE_ID>
|
|
74
|
+
pc pjm board-swimlane create --data <JSON> <PROJECT_ID> <BOARD_ID>
|
|
75
|
+
pc pjm board-swimlane update --data <JSON> <PROJECT_ID> <BOARD_ID> <SWIMLANE_ID>
|
|
76
|
+
pc pjm board-swimlane delete <PROJECT_ID> <BOARD_ID> <SWIMLANE_ID>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### `pjm deliverable` — 交付物目标(list / get / create / update / delete)
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pc pjm deliverable list [--project-id <ID>] [--workitem-id <ID>]
|
|
83
|
+
pc pjm deliverable get <DELIVERABLE_TARGET_ID>
|
|
84
|
+
pc pjm deliverable create --data <JSON>
|
|
85
|
+
pc pjm deliverable update --data <JSON> <DELIVERABLE_TARGET_ID>
|
|
86
|
+
pc pjm deliverable delete <DELIVERABLE_TARGET_ID>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### `pjm project` — 项目(list / get / create / update / clone / enable-local-config / progress)
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
pc pjm project list [--scope-type <SCOPE_TYPE>] [--scope-id <ID>] [--keywords <KEYWORDS>] \
|
|
93
|
+
[--member-type <TYPE>] [--member-id <ID>] [--type <TYPE>] [--created-between <RANGE>] \
|
|
94
|
+
[--updated-between <RANGE>] [--include-deleted] [--include-archived] \
|
|
95
|
+
[--page-index <INDEX>] [--page-size <SIZE>]
|
|
96
|
+
pc pjm project get <PROJECT_ID> [--include-deleted] [--include-archived]
|
|
97
|
+
pc pjm project create --data <JSON>
|
|
98
|
+
pc pjm project update --data <JSON> <PROJECT_ID>
|
|
99
|
+
pc pjm project clone --data <JSON> <PROJECT_ID>
|
|
100
|
+
pc pjm project enable-local-config <PROJECT_ID>
|
|
101
|
+
pc pjm project progress <PROJECT_ID>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### `pjm project-member` — 项目成员(list / get / add / update / remove)
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
pc pjm project-member list <PROJECT_ID>
|
|
108
|
+
pc pjm project-member get <PROJECT_ID> <MEMBER_ID>
|
|
109
|
+
pc pjm project-member add --data <JSON> <PROJECT_ID>
|
|
110
|
+
pc pjm project-member update --data <JSON> <PROJECT_ID> <MEMBER_ID>
|
|
111
|
+
pc pjm project-member remove <PROJECT_ID> <MEMBER_ID>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### `pjm project-process` — 项目流程(list / get)
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
pc pjm project-process list
|
|
118
|
+
pc pjm project-process get <PROCESS_ID>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### `pjm project-property` — 项目属性定义(list / get / create / update / list-for-project / get-in-project / add-to-project / remove-from-project)
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
pc pjm project-property list
|
|
125
|
+
pc pjm project-property get <PROPERTY_ID>
|
|
126
|
+
pc pjm project-property create --data <JSON>
|
|
127
|
+
pc pjm project-property update --data <JSON> <PROPERTY_ID>
|
|
128
|
+
pc pjm project-property list-for-project <PROJECT_ID>
|
|
129
|
+
pc pjm project-property get-in-project <PROJECT_ID> <PROPERTY_ID>
|
|
130
|
+
pc pjm project-property add-to-project --data <JSON> <PROJECT_ID>
|
|
131
|
+
pc pjm project-property remove-from-project <PROJECT_ID> <PROPERTY_ID>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### `pjm project-state` — 项目状态(list / get)
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
pc pjm project-state list --project-id <ID>
|
|
138
|
+
pc pjm project-state get <STATE_ID>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### `pjm release` — 发布(list / get / create / update / delete / bulk-create)
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
pc pjm release list <PROJECT_ID> [--name <NAME>] [--status <STATUS>] \
|
|
145
|
+
[--created-between <RANGE>] [--updated-between <RANGE>]
|
|
146
|
+
pc pjm release get <PROJECT_ID> <RELEASE_ID>
|
|
147
|
+
pc pjm release create --data <JSON> <PROJECT_ID>
|
|
148
|
+
pc pjm release update --data <JSON> <PROJECT_ID> <RELEASE_ID>
|
|
149
|
+
pc pjm release delete <PROJECT_ID> <RELEASE_ID>
|
|
150
|
+
pc pjm release bulk-create --data <JSON>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### `pjm release-category` — 发布分类(list / get / create / update / delete)
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
pc pjm release-category list <PROJECT_ID>
|
|
157
|
+
pc pjm release-category get <PROJECT_ID> <RELEASE_CATEGORY_ID>
|
|
158
|
+
pc pjm release-category create --data <JSON> <PROJECT_ID>
|
|
159
|
+
pc pjm release-category update --data <JSON> <PROJECT_ID> <RELEASE_CATEGORY_ID>
|
|
160
|
+
pc pjm release-category delete <PROJECT_ID> <RELEASE_CATEGORY_ID>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### `pjm release-section` — 发布分组(list / get / create / update / delete)
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
pc pjm release-section list <PROJECT_ID>
|
|
167
|
+
pc pjm release-section get <PROJECT_ID> <RELEASE_SECTION_ID>
|
|
168
|
+
pc pjm release-section create --data <JSON> <PROJECT_ID>
|
|
169
|
+
pc pjm release-section update --data <JSON> <PROJECT_ID> <RELEASE_SECTION_ID>
|
|
170
|
+
pc pjm release-section delete <PROJECT_ID> <RELEASE_SECTION_ID>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### `pjm release-stage` — 发布阶段(list / get / create / update / delete)
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
pc pjm release-stage list
|
|
177
|
+
pc pjm release-stage get <RELEASE_STAGE_ID>
|
|
178
|
+
pc pjm release-stage create --data <JSON>
|
|
179
|
+
pc pjm release-stage update --data <JSON> <RELEASE_STAGE_ID>
|
|
180
|
+
pc pjm release-stage delete <RELEASE_STAGE_ID> [--data <JSON>]
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### `pjm sprint` — 迭代(list / get / create / update / bulk-create)
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
pc pjm sprint list <PROJECT_ID> [--name <NAME>] [--status <STATUS>] \
|
|
187
|
+
[--created-between <RANGE>] [--updated-between <RANGE>]
|
|
188
|
+
pc pjm sprint get <PROJECT_ID> <SPRINT_ID>
|
|
189
|
+
pc pjm sprint create --data <JSON> <PROJECT_ID>
|
|
190
|
+
pc pjm sprint update --data <JSON> <PROJECT_ID> <SPRINT_ID>
|
|
191
|
+
pc pjm sprint bulk-create --data <JSON>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### `pjm sprint-category` — 迭代分类(list / get / create / update / delete)
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
pc pjm sprint-category list <PROJECT_ID>
|
|
198
|
+
pc pjm sprint-category get <PROJECT_ID> <SPRINT_CATEGORY_ID>
|
|
199
|
+
pc pjm sprint-category create --data <JSON> <PROJECT_ID>
|
|
200
|
+
pc pjm sprint-category update --data <JSON> <PROJECT_ID> <SPRINT_CATEGORY_ID>
|
|
201
|
+
pc pjm sprint-category delete <PROJECT_ID> <SPRINT_CATEGORY_ID>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### `pjm sprint-section` — 迭代分组(list / get / create / update / delete)
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
pc pjm sprint-section list <PROJECT_ID>
|
|
208
|
+
pc pjm sprint-section get <PROJECT_ID> <SECTION_ID>
|
|
209
|
+
pc pjm sprint-section create --data <JSON> <PROJECT_ID>
|
|
210
|
+
pc pjm sprint-section update --data <JSON> <PROJECT_ID> <SECTION_ID>
|
|
211
|
+
pc pjm sprint-section delete <PROJECT_ID> <SECTION_ID>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### `pjm workitem` — 工作项(需求 / 任务 / 缺陷 / 子任务…)(list / get / create / update / delete / search / batch-update / add-tag / get-tag / remove-tag)
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
pc pjm workitem list [--identifier <IDENTIFIER>] [--project-id <ID>] [--type-id <ID>] \
|
|
218
|
+
[--parent-id <ID>] [--assignee-id <ID>] [--state-id <ID>] [--priority-id <ID>] \
|
|
219
|
+
[--bug-type-id <ID>] [--tag-id <ID>] [--sprint-id <ID>] [--board-id <ID>] \
|
|
220
|
+
[--entry-id <ID>] [--swimlane-id <ID>] [--phase-id <ID>] [--release-id <ID>] \
|
|
221
|
+
[--created-by <ID>] [--participant-id <ID>] [--keywords <KEYWORDS>] \
|
|
222
|
+
[--include-public-image-token <FIELDS>] [--include-deleted] [--include-archived]
|
|
223
|
+
pc pjm workitem get <WORKITEM_ID> [--include-public-image-token <FIELDS>] \
|
|
224
|
+
[--include-deleted] [--include-archived]
|
|
225
|
+
pc pjm workitem create --data <JSON>
|
|
226
|
+
pc pjm workitem update --data <JSON> <WORKITEM_ID>
|
|
227
|
+
pc pjm workitem delete <WORKITEM_ID>
|
|
228
|
+
pc pjm workitem search --data <JSON>
|
|
229
|
+
pc pjm workitem batch-update --data <JSON>
|
|
230
|
+
pc pjm workitem add-tag --data <JSON> <WORKITEM_ID>
|
|
231
|
+
pc pjm workitem get-tag <WORKITEM_ID> <TAG_ID>
|
|
232
|
+
pc pjm workitem remove-tag <WORKITEM_ID> <TAG_ID>
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### `pjm workitem-priority` — 优先级字典(list / list-for-project / get)
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
pc pjm workitem-priority list
|
|
239
|
+
pc pjm workitem-priority list-for-project --project-id <ID>
|
|
240
|
+
pc pjm workitem-priority get <PRIORITY_ID>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### `pjm workitem-property` — 工作项属性定义(list / list-for-project / get / create / update)
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
pc pjm workitem-property list
|
|
247
|
+
pc pjm workitem-property list-for-project --project-id <ID> --workitem-type-id <ID>
|
|
248
|
+
pc pjm workitem-property get <PROPERTY_ID>
|
|
249
|
+
pc pjm workitem-property create --data <JSON>
|
|
250
|
+
pc pjm workitem-property update --data <JSON> <PROPERTY_ID>
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### `pjm workitem-property-plan` — 属性方案(list / get / add-property / list-properties / get-property / remove-property)
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
pc pjm workitem-property-plan list
|
|
257
|
+
pc pjm workitem-property-plan get <PROPERTY_PLAN_ID>
|
|
258
|
+
pc pjm workitem-property-plan add-property --data <JSON> <PROPERTY_PLAN_ID>
|
|
259
|
+
pc pjm workitem-property-plan list-properties <PROPERTY_PLAN_ID>
|
|
260
|
+
pc pjm workitem-property-plan get-property <PROPERTY_PLAN_ID> <PROPERTY_ID>
|
|
261
|
+
pc pjm workitem-property-plan remove-property <PROPERTY_PLAN_ID> <PROPERTY_ID>
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### `pjm workitem-relation` — 工作项关联(list / get / create / delete)
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
pc pjm workitem-relation list <WORKITEM_ID> [--relation-type <TYPE>]
|
|
268
|
+
pc pjm workitem-relation get <WORKITEM_ID> <RELATION_ID> [--include-deleted]
|
|
269
|
+
pc pjm workitem-relation create --data <JSON> <WORKITEM_ID>
|
|
270
|
+
pc pjm workitem-relation delete <WORKITEM_ID> <RELATION_ID>
|
|
271
|
+
```
|
|
59
272
|
|
|
60
|
-
|
|
273
|
+
### `pjm workitem-relation-type` — 关联类型字典(list / get)
|
|
61
274
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
275
|
+
```bash
|
|
276
|
+
pc pjm workitem-relation-type list
|
|
277
|
+
pc pjm workitem-relation-type get <RELATION_TYPE_ID>
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### `pjm workitem-state` — 状态字典(list-all / list-for-project / get / create / update)
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
pc pjm workitem-state list-all
|
|
284
|
+
pc pjm workitem-state list-for-project --project-id <ID> --workitem-type-id <ID>
|
|
285
|
+
pc pjm workitem-state get <STATE_ID>
|
|
286
|
+
pc pjm workitem-state create --data <JSON>
|
|
287
|
+
pc pjm workitem-state update --data <JSON> <STATE_ID>
|
|
288
|
+
```
|
|
65
289
|
|
|
66
|
-
|
|
290
|
+
### `pjm workitem-state-plan` — 状态方案与流转(list / get / add-state / list-states / get-state / remove-state / add-flow / list-flows / get-flow / remove-flow)
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
pc pjm workitem-state-plan list
|
|
294
|
+
pc pjm workitem-state-plan get <STATE_PLAN_ID>
|
|
295
|
+
pc pjm workitem-state-plan add-state --data <JSON> <STATE_PLAN_ID>
|
|
296
|
+
pc pjm workitem-state-plan list-states <STATE_PLAN_ID>
|
|
297
|
+
pc pjm workitem-state-plan get-state <STATE_PLAN_ID> <STATE_ID>
|
|
298
|
+
pc pjm workitem-state-plan remove-state <STATE_PLAN_ID> <STATE_ID>
|
|
299
|
+
pc pjm workitem-state-plan add-flow --data <JSON> <STATE_PLAN_ID>
|
|
300
|
+
pc pjm workitem-state-plan list-flows <STATE_PLAN_ID>
|
|
301
|
+
pc pjm workitem-state-plan get-flow <STATE_PLAN_ID> <FLOW_ID>
|
|
302
|
+
pc pjm workitem-state-plan remove-flow <STATE_PLAN_ID> <FLOW_ID>
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### `pjm workitem-tag` — 标签字典(create / list / list-for-project / get / update / delete)
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
pc pjm workitem-tag create --data <JSON>
|
|
309
|
+
pc pjm workitem-tag list [--name <NAME>]
|
|
310
|
+
pc pjm workitem-tag list-for-project --project-id <ID> [--name <NAME>]
|
|
311
|
+
pc pjm workitem-tag get <TAG_ID>
|
|
312
|
+
pc pjm workitem-tag update --data <JSON> <TAG_ID>
|
|
313
|
+
pc pjm workitem-tag delete <TAG_ID>
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### `pjm workitem-transition` — 流转规则(list / get)
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
pc pjm workitem-transition list <WORKITEM_ID>
|
|
320
|
+
pc pjm workitem-transition get <WORKITEM_ID> <TRANSITION_HISTORY_ID>
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### `pjm workitem-type` — 类型字典(list / list-for-project / get / create / update / delete)
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
pc pjm workitem-type list
|
|
327
|
+
pc pjm workitem-type list-for-project --project-id <ID>
|
|
328
|
+
pc pjm workitem-type get <WORKITEM_TYPE_ID>
|
|
329
|
+
pc pjm workitem-type create --data <JSON>
|
|
330
|
+
pc pjm workitem-type update --data <JSON> <WORKITEM_TYPE_ID>
|
|
331
|
+
pc pjm workitem-type delete <WORKITEM_TYPE_ID>
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### `pjm workitem-type-plan` — 类型方案(list / get / add-type / list-types / get-type / update-type / remove-type)
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
pc pjm workitem-type-plan list [--project-id <ID>]
|
|
338
|
+
pc pjm workitem-type-plan get <TYPE_PLAN_ID>
|
|
339
|
+
pc pjm workitem-type-plan add-type --data <JSON> <TYPE_PLAN_ID>
|
|
340
|
+
pc pjm workitem-type-plan list-types <TYPE_PLAN_ID>
|
|
341
|
+
pc pjm workitem-type-plan get-type <TYPE_PLAN_ID> <WORKITEM_TYPE_ID>
|
|
342
|
+
pc pjm workitem-type-plan update-type --data <JSON> <TYPE_PLAN_ID> <WORKITEM_TYPE_ID>
|
|
343
|
+
pc pjm workitem-type-plan remove-type <TYPE_PLAN_ID> <WORKITEM_TYPE_ID>
|
|
344
|
+
```
|
|
345
|
+
## 分页(最容易踩的坑)
|
|
346
|
+
|
|
347
|
+
- **`pjm workitem list` 没有 `--page-index` / `--page-size`**(上游只给了一部分列表命令加分页)。
|
|
348
|
+
要翻页或全量拉取,改用 `pc pjm workitem search --data`,条件与分页写在请求体的 `payload` 里。
|
|
349
|
+
- 其它列表命令若上面命令块里写了这两个参数,才可以用。
|
|
350
|
+
- 拿到 `total` 大于本页条数时,**必须**继续翻页,不要只报第一页就下结论。
|
|
351
|
+
|
|
352
|
+
## ID 从哪来(三种 ID 别混用)
|
|
67
353
|
|
|
68
354
|
`get / update / delete` 只认 **24 位十六进制 ID** 或 **8 位 `short_id`**。人类可读的 `SUPER-1` 是 `identifier`,
|
|
69
355
|
单独喂给 `get` 会 `100317`,只能先用 `list --identifier` 反查出 ID:
|
|
70
356
|
|
|
71
357
|
| 需要 | 先跑 | 取字段 |
|
|
72
358
|
|---|---|---|
|
|
73
|
-
| 项目 ID | `pc pjm project list` | `values[].id` |
|
|
74
|
-
| 工作项 ID | `pc pjm workitem list --project-id <PID>` 或 `
|
|
359
|
+
| 项目 ID | `pc pjm project list --keywords "项目名"` | `values[].id` |
|
|
360
|
+
| 工作项 ID | `pc pjm workitem list --project-id <PID>` 或 `workitem search` | `values[].id` / `values[].short_id` |
|
|
75
361
|
| identifier → ID | `pc pjm workitem list --identifier DEMO-19` | `values[0].id` |
|
|
76
362
|
| 子工作项 | `pc pjm workitem list --parent-id <ID>` | `values[]`(无分页参数) |
|
|
77
363
|
| 状态 ID | `pc pjm workitem-state list-for-project --project-id <PID> --workitem-type-id story` | `values[].id` |
|
|
364
|
+
| 类型 ID | `pc pjm workitem-type list-for-project --project-id <PID>` | `values[].id` |
|
|
78
365
|
| 用户 ID | `pc organization user list --keywords "姓名"` | `values[].id` |
|
|
79
366
|
|
|
80
367
|
### 手上只有一个工作项 ID 时
|
|
@@ -93,6 +380,15 @@ pc pjm workitem get 6aa222c6ae6822749a6e6908 # 直接拿全量
|
|
|
93
380
|
**子工作项** → `pc pjm workitem list --parent-id <ID>`;**描述里的图片地址** → 加
|
|
94
381
|
`--include-public-image-token description`。
|
|
95
382
|
|
|
383
|
+
## 写操作的常见坑
|
|
384
|
+
|
|
385
|
+
- `workitem create` 的 `type_id` 可直接用系统枚举:`story` / `bug` / `task` / `epic` / `feature` /
|
|
386
|
+
`phase` / `milestone` / `requirement` / `issue`,不必先查字典。
|
|
387
|
+
- `workitem search` 的 body 必须是 `{"mode":"query","payload":{...}}`,少 `mode` 会 `100008`。
|
|
388
|
+
- `workitem update` 是**部分更新**:只传要改的字段即可,别把 `get` 的结果整个回传。
|
|
389
|
+
- `workitem batch-update` 是「把多个工作项的同一个属性改成同一个值」,不是逐条不同值。
|
|
390
|
+
- 删除类命令(`delete`、`remove-tag` 等)**不可撤销**;确认 ID 再执行。
|
|
391
|
+
|
|
96
392
|
## 常见错误码
|
|
97
393
|
|
|
98
394
|
| HTTP / code | 含义 | 处理 |
|
|
@@ -102,6 +398,8 @@ pc pjm workitem get 6aa222c6ae6822749a6e6908 # 直接拿全量
|
|
|
102
398
|
| 400 `100043` | 不支持该过滤条件 | 例如 `search` 的 `filter.parent_ids`。找子工作项改用 `list --parent-id` |
|
|
103
399
|
| 403 `100035` | 当前令牌不适用于此资源 | `client_credentials` 换的是**企业令牌**,不代表具体用户(`/v1/myself` 必然 403);改查业务资源,或改用用户令牌 |
|
|
104
400
|
| 404 `100002` | 资源路径错误 | 用了 `identifier` 而不是 ID |
|
|
401
|
+
| 404 `100300` | 项目资源不存在 | 项目可能已归档,见下方「字段陷阱」 |
|
|
402
|
+
| 429 | 限流 | 退避几秒后重试一次,仍失败则停下说明 |
|
|
105
403
|
|
|
106
404
|
## 字段陷阱
|
|
107
405
|
|
|
@@ -121,3 +419,6 @@ pc pjm workitem get 6aa222c6ae6822749a6e6908 # 直接拿全量
|
|
|
121
419
|
- 单个资源是**裸对象**(直接取 `.id`);列表才有 `values[]` 包装。
|
|
122
420
|
- 工作项的富文本字段(`description`)可能含图片 token;需要图片地址时加
|
|
123
421
|
`--include-public-image-token description`。
|
|
422
|
+
- `pc doctor` 输出结构化 JSON:`ok`、`summary`、`checks[]`(每项有稳定 `id` 与
|
|
423
|
+
`status` = pass/fail/warn/info/skipped)。只看 `ok` 和 `status=fail` 的项,
|
|
424
|
+
**不要复述任何凭据相关字段**。退出码:0 全通过 / 1 有检查失败 / 2 命令自身异常。
|
package/dist/pingcode/cli.js
CHANGED
|
@@ -7,9 +7,10 @@ import { resetTokenCache, resolveToken } from "./token.js";
|
|
|
7
7
|
/** 不可用原因 → 可直接照做的修复步骤 */
|
|
8
8
|
const REASON_HINT = {
|
|
9
9
|
binary_missing: [
|
|
10
|
-
"未找到 pc(PingCode CLI
|
|
10
|
+
"未找到 pc(PingCode CLI)。它随 @super-coding/cli 分发,缺失说明安装包不完整:",
|
|
11
|
+
" 重装或升级:npm i -g @super-coding/cli@latest",
|
|
12
|
+
"内置版本覆盖 macOS(Apple Silicon) 与 Linux(x64);其它平台(Intel Mac / Windows)需自行安装:",
|
|
11
13
|
" brew tap shaunxu/tap && brew install pc",
|
|
12
|
-
" curl --proto '=https' --tlsv1.2 -LsSf https://github.com/shaunxu/pingcode-cli-next/releases/latest/download/pc-installer.sh | sh",
|
|
13
14
|
"装在自定义路径时,用 SC_PC_BINARY=/abs/path/pc 指定。",
|
|
14
15
|
],
|
|
15
16
|
no_credentials: [
|
|
@@ -47,14 +48,24 @@ function effectiveCredential(status, inspected) {
|
|
|
47
48
|
}
|
|
48
49
|
return undefined;
|
|
49
50
|
}
|
|
51
|
+
/** 二进制来源:内置的那份版本与参考文档一一对应,用户自己装的可能对不上 */
|
|
52
|
+
const BINARY_SOURCE_LABEL = {
|
|
53
|
+
bundled: "随 CLI 分发",
|
|
54
|
+
system: "系统 PATH",
|
|
55
|
+
override: "SC_PC_BINARY 指定",
|
|
56
|
+
};
|
|
50
57
|
function printStatusBody(status, inspected = inspectPingcodeConfig()) {
|
|
51
58
|
console.log("PingCode 集成(pc)");
|
|
52
59
|
console.log(` 状态:${status.available ? "可用" : "不可用"}`);
|
|
53
60
|
if (status.reason === "disabled") {
|
|
54
61
|
console.log(" pc 二进制:(SC_PINGCODE=off,已跳过探测)");
|
|
55
62
|
}
|
|
63
|
+
else if (status.binary) {
|
|
64
|
+
const source = BINARY_SOURCE_LABEL[status.binary.source] ?? status.binary.source;
|
|
65
|
+
console.log(` pc 二进制:${status.binary.path}(${status.binary.version},${source})`);
|
|
66
|
+
}
|
|
56
67
|
else {
|
|
57
|
-
console.log(
|
|
68
|
+
console.log(" pc 二进制:未找到");
|
|
58
69
|
}
|
|
59
70
|
console.log(` 凭据来源:${credentialLabel(effectiveCredential(status, inspected))}`);
|
|
60
71
|
if (inspected.state === "ok") {
|
package/dist/pingcode/detect.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
//
|
|
1
|
+
// 定位 `pc`(PingCode Open API CLI)二进制。
|
|
2
|
+
//
|
|
3
|
+
// 优先级:SC_PC_BINARY(显式指定)> 包内自带的预编译二进制 > PATH。
|
|
4
|
+
// 包内优先于 PATH 是刻意的:内嵌那份的版本与 skill 文档里写的命令一一对应,
|
|
5
|
+
// 用户机器上装的旧版 `pc` 反而会让参考文档和实际行为对不上。
|
|
2
6
|
//
|
|
3
7
|
// 找不到就安静降级:集成是「有则增强」,不是 daemon 的启动前提。
|
|
4
8
|
// 版本探针刻意剥掉 PC_* 环境变量——即便 `--version` 不该读凭据,也不给它接触凭据的机会。
|
|
5
9
|
import { execFile } from "node:child_process";
|
|
6
|
-
import { accessSync, constants } from "node:fs";
|
|
10
|
+
import { accessSync, chmodSync, constants } from "node:fs";
|
|
7
11
|
import { delimiter, join } from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
8
13
|
const BIN_NAME = "pc";
|
|
9
14
|
/** Windows 上 `pc` 可能是 exe/cmd/bat;POSIX 只有同名可执行文件 */
|
|
10
15
|
function candidateNames() {
|
|
@@ -21,11 +26,51 @@ function isExecutable(path) {
|
|
|
21
26
|
return false;
|
|
22
27
|
}
|
|
23
28
|
}
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
/**
|
|
30
|
+
* npm 打包/解包会丢掉执行位,这里兜底补回来(只对自己包内的文件动手)。
|
|
31
|
+
* 补不上就当不可用,交给下一级回退,不要在这里抛。
|
|
32
|
+
*/
|
|
33
|
+
function ensureExecutable(path) {
|
|
34
|
+
if (isExecutable(path))
|
|
35
|
+
return true;
|
|
36
|
+
if (process.platform === "win32")
|
|
37
|
+
return false;
|
|
38
|
+
try {
|
|
39
|
+
chmodSync(path, 0o755);
|
|
40
|
+
return isExecutable(path);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** 上游 release 的资产命名:darwin-arm64 / linux-x64 / win32-x64 */
|
|
47
|
+
export function bundledBinaryName(platform = process.platform, arch = process.arch) {
|
|
48
|
+
const ext = platform === "win32" ? ".exe" : "";
|
|
49
|
+
return `pc-${platform}-${arch}${ext}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 包内二进制的候选路径。
|
|
53
|
+
* - 装好后跑:dist/pingcode/detect.js → dist/bin/
|
|
54
|
+
* - 用 tsx 跑源码:src/pingcode/detect.ts → 需要多上两级到 dist/bin/
|
|
55
|
+
* `extraDirs` 供测试注入,避免让用例依赖构建产物是否存在。
|
|
56
|
+
*/
|
|
57
|
+
function bundledCandidates(name, extraDirs = []) {
|
|
58
|
+
const moduleDir = fileURLToPath(new URL(".", import.meta.url));
|
|
59
|
+
return [
|
|
60
|
+
...extraDirs.map((dir) => join(dir, name)),
|
|
61
|
+
join(moduleDir, "..", "bin", name),
|
|
62
|
+
join(moduleDir, "..", "..", "dist", "bin", name),
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
export function bundledPingcodeBinary(platform = process.platform, arch = process.arch, extraDirs = []) {
|
|
66
|
+
const name = bundledBinaryName(platform, arch);
|
|
67
|
+
for (const candidate of bundledCandidates(name, extraDirs)) {
|
|
68
|
+
if (ensureExecutable(candidate))
|
|
69
|
+
return candidate;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function findOnPath(env) {
|
|
29
74
|
for (const dir of (env["PATH"] ?? "").split(delimiter)) {
|
|
30
75
|
if (!dir)
|
|
31
76
|
continue;
|
|
@@ -37,6 +82,21 @@ export function findPingcodeBinary(env = process.env) {
|
|
|
37
82
|
}
|
|
38
83
|
return null;
|
|
39
84
|
}
|
|
85
|
+
/** SC_PC_BINARY 可显式指定(自定义安装路径 / 测试注入)> 包内 > PATH */
|
|
86
|
+
export function locatePingcodeBinary(env = process.env, platform = process.platform, arch = process.arch, extraBundledDirs = []) {
|
|
87
|
+
const override = env["SC_PC_BINARY"]?.trim();
|
|
88
|
+
if (override)
|
|
89
|
+
return isExecutable(override) ? { path: override, source: "override" } : null;
|
|
90
|
+
const bundled = bundledPingcodeBinary(platform, arch, extraBundledDirs);
|
|
91
|
+
if (bundled)
|
|
92
|
+
return { path: bundled, source: "bundled" };
|
|
93
|
+
const onPath = findOnPath(env);
|
|
94
|
+
return onPath ? { path: onPath, source: "system" } : null;
|
|
95
|
+
}
|
|
96
|
+
/** 只要路径的老接口(测试与外部调用用) */
|
|
97
|
+
export function findPingcodeBinary(env = process.env) {
|
|
98
|
+
return locatePingcodeBinary(env)?.path ?? null;
|
|
99
|
+
}
|
|
40
100
|
/** 探针环境:剥掉 PingCode 凭据,避免任何输出把密钥带出来 */
|
|
41
101
|
function probeEnv(env) {
|
|
42
102
|
const next = { ...env };
|
|
@@ -58,12 +118,12 @@ export function probeVersion(path, env = process.env) {
|
|
|
58
118
|
/** 探测并缓存结果(daemon 生命周期内二进制位置不会变) */
|
|
59
119
|
let cached;
|
|
60
120
|
export async function detectPingcodeBinary(env = process.env) {
|
|
61
|
-
const
|
|
62
|
-
const key = `${path ?? "(none)"}:${env["SC_PC_BINARY"] ?? ""}`;
|
|
121
|
+
const found = locatePingcodeBinary(env);
|
|
122
|
+
const key = `${found?.path ?? "(none)"}:${found?.source ?? ""}:${env["SC_PC_BINARY"] ?? ""}`;
|
|
63
123
|
if (cached?.key === key)
|
|
64
124
|
return cached.value;
|
|
65
|
-
const version =
|
|
66
|
-
const value =
|
|
125
|
+
const version = found ? await probeVersion(found.path, env) : null;
|
|
126
|
+
const value = found && version ? { path: found.path, version, source: found.source } : null;
|
|
67
127
|
cached = { key, value };
|
|
68
128
|
return value;
|
|
69
129
|
}
|
package/dist/pingcode/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// PingCode(pc)集成的对外入口。
|
|
2
2
|
export { PingcodeBridge, createPingcodeBridge } from "./runtime.js";
|
|
3
3
|
export { loadPingcodeSkill, PINGCODE_SKILL_NAME } from "./skill.js";
|
|
4
|
-
export { DEFAULT_BASE_URL, maskSecret, pingcodeConfigPath, readPingcodeConfig, normalizePingcodeConfig, writePingcodeConfig, removePingcodeConfig, PingcodeConfigError, } from "./config.js";
|
|
4
|
+
export { DEFAULT_BASE_URL, inspectPingcodeConfig, maskSecret, pingcodeConfigPath, readPingcodeConfig, normalizePingcodeConfig, writePingcodeConfig, removePingcodeConfig, PingcodeConfigError, } from "./config.js";
|
|
5
5
|
export { connectPingcode, disconnectPingcode, printPingcodeStatus } from "./cli.js";
|
|
6
6
|
export { findPingcodeBinary, detectPingcodeBinary } from "./detect.js";
|
|
7
7
|
export { resolveToken, resetTokenCache } from "./token.js";
|
|
8
8
|
export { writePingcodeLauncher, clearPingcodeToken, pingcodeTokenFile } from "./launcher.js";
|
|
9
|
+
export { applyRemotePingcodeConfig, isAcceptableRemoteBaseUrl } from "./remote-config.js";
|