@super-coding/cli 0.2.2 → 0.2.3

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.
@@ -0,0 +1,172 @@
1
+ # testhub 命令速查(测试库 / 用例 / 计划 / 执行)
2
+
3
+ testhub 是 PingCode 的**测试管理**模块。本文件是该模块的完整命令表,通用约定见 `reference.md`。
4
+
5
+ ## 层级与 ID 关系
6
+
7
+ ```
8
+ library(测试库)
9
+ ├── library-member / library-suite(用例目录树)
10
+ ├── testcase(测试用例)
11
+ │ └── testcase-state / testcase-type / testcase-important-level 按「测试库」维度配置
12
+ ├── testplan(测试计划)
13
+ └── testrun(测试执行记录:某计划下某用例的一次执行)
14
+ └── testrun-status 按「测试库」维度配置
15
+ ```
16
+
17
+ - 典型链路:`library list` → `library-suite list <LIBRARY_ID>` → `testcase list --library-id` →
18
+ `testplan create` → `testrun list --testplan-id` 看执行情况。
19
+ - **状态字典按库查**:`testcase-state list-for-library --library-id <LID>`、
20
+ `testrun-status list-for-library --library-id <LID>`。不同库的 ID 不能混用。
21
+ - `testcase list` 的 `--library-id` 是**可选**的:不传会跨库返回,容易误判「用例属于哪个库」,
22
+ 拿不准时先确认库再查。
23
+ - `testrun list` 用 `--testplan-id` / `--testcase-id` / `--suite-id` / `--status-id` 过滤,
24
+ **没有** `--library-id`;要按库筛就先从计划入手。
25
+ - `testcase histories <ID>` / `testrun histories <ID>` / `testrun get-history <ID> <HISTORY_ID>`
26
+ 是变更历史,只读。
27
+ - `testrun plan-batch --data <JSON> <LIBRARY_ID> <TESTPLAN_ID>` 用于批量把执行记录并入计划。
28
+ - 批量写(`bulk-create` / `bulk-update`)的请求体形态各接口不一致:**先用 1~2 条验证结构再放大**,
29
+ 不要一次性把上百条推进去。
30
+
31
+ ## 命令表
32
+
33
+ ### `testhub library` — 测试库(list / get / create / update)
34
+
35
+ ```bash
36
+ pc testhub library list [--scope-type <SCOPE>] [--scope-id <ID>] [--keywords <KEYWORDS>] \
37
+ [--member-type <TYPE>] [--member-id <ID>] [--created-between <RANGE>] \
38
+ [--updated-between <RANGE>] [--include-deleted] [--include-archived]
39
+ pc testhub library get <LIBRARY_ID> [--include-deleted] [--include-archived]
40
+ pc testhub library create --data <JSON>
41
+ pc testhub library update --data <JSON> <LIBRARY_ID>
42
+ ```
43
+
44
+ ### `testhub library-member` — 测试库成员(list / get / add / update / remove)
45
+
46
+ ```bash
47
+ pc testhub library-member list <LIBRARY_ID>
48
+ pc testhub library-member get <LIBRARY_ID> <MEMBER_ID>
49
+ pc testhub library-member add --data <JSON> <LIBRARY_ID>
50
+ pc testhub library-member update --data <JSON> <LIBRARY_ID> <MEMBER_ID>
51
+ pc testhub library-member remove <LIBRARY_ID> <MEMBER_ID>
52
+ ```
53
+
54
+ ### `testhub library-suite` — 用例目录(list / get / create / update / remove)
55
+
56
+ ```bash
57
+ pc testhub library-suite list <LIBRARY_ID> [--parent-id <PARENT>]
58
+ pc testhub library-suite get <LIBRARY_ID> <SUITE_ID>
59
+ pc testhub library-suite create --data <JSON> <LIBRARY_ID>
60
+ pc testhub library-suite update --data <JSON> <LIBRARY_ID> <SUITE_ID>
61
+ pc testhub library-suite remove <LIBRARY_ID> <SUITE_ID>
62
+ ```
63
+
64
+ ### `testhub testcase` — 测试用例(list / get / create / update / delete / search / bulk-create / bulk-update / histories)
65
+
66
+ ```bash
67
+ pc testhub testcase list [--library-id <ID>] [--maintenance-id <ID>] [--state-id <ID>] \
68
+ [--important-level-id <ID>] [--tag-id <ID>] [--keywords <KEYWORDS>] \
69
+ [--include-public-image-token <FIELDS>] [--include-deleted]
70
+ pc testhub testcase get <TESTCASE_ID> [--include-public-image-token <FIELDS>] \
71
+ [--include-deleted]
72
+ pc testhub testcase create --data <JSON>
73
+ pc testhub testcase update --data <JSON> <TESTCASE_ID>
74
+ pc testhub testcase delete <TESTCASE_ID>
75
+ pc testhub testcase search --data <JSON>
76
+ pc testhub testcase bulk-create --data <JSON>
77
+ pc testhub testcase bulk-update --data <JSON>
78
+ pc testhub testcase histories <TESTCASE_ID>
79
+ ```
80
+
81
+ ### `testhub testcase-important-level` — 重要程度(list / get)
82
+
83
+ ```bash
84
+ pc testhub testcase-important-level list
85
+ pc testhub testcase-important-level get <IMPORTANT_LEVEL_ID>
86
+ ```
87
+
88
+ ### `testhub testcase-property` — 用例属性定义(list / list-for-library / get / create / update)
89
+
90
+ ```bash
91
+ pc testhub testcase-property list
92
+ pc testhub testcase-property list-for-library --library-id <ID>
93
+ pc testhub testcase-property get <PROPERTY_ID>
94
+ pc testhub testcase-property create --data <JSON>
95
+ pc testhub testcase-property update --data <JSON> <PROPERTY_ID>
96
+ ```
97
+
98
+ ### `testhub testcase-property-plan` — 用例属性方案(list / get / list-properties / get-property / add-property / remove-property)
99
+
100
+ ```bash
101
+ pc testhub testcase-property-plan list [--library-id <ID>]
102
+ pc testhub testcase-property-plan get <PROPERTY_PLAN_ID>
103
+ pc testhub testcase-property-plan list-properties <PROPERTY_PLAN_ID>
104
+ pc testhub testcase-property-plan get-property <PROPERTY_PLAN_ID> <PROPERTY_ID>
105
+ pc testhub testcase-property-plan add-property --data <JSON> <PROPERTY_PLAN_ID>
106
+ pc testhub testcase-property-plan remove-property <PROPERTY_PLAN_ID> <PROPERTY_ID>
107
+ ```
108
+
109
+ ### `testhub testcase-state` — 用例状态(list / list-for-library / get)
110
+
111
+ ```bash
112
+ pc testhub testcase-state list
113
+ pc testhub testcase-state list-for-library --library-id <ID>
114
+ pc testhub testcase-state get <STATE_ID>
115
+ ```
116
+
117
+ ### `testhub testcase-type` — 用例类型(list / list-for-library / get)
118
+
119
+ ```bash
120
+ pc testhub testcase-type list
121
+ pc testhub testcase-type list-for-library --library-id <ID>
122
+ pc testhub testcase-type get <TYPE_ID>
123
+ ```
124
+
125
+ ### `testhub testplan` — 测试计划(list / get / create / update)
126
+
127
+ ```bash
128
+ pc testhub testplan list <LIBRARY_ID> [--name <NAME>] [--created-between <RANGE>] \
129
+ [--updated-between <RANGE>]
130
+ pc testhub testplan get <LIBRARY_ID> <TESTPLAN_ID> [--include-deleted]
131
+ pc testhub testplan create --data <JSON> <LIBRARY_ID>
132
+ pc testhub testplan update --data <JSON> <LIBRARY_ID> <TESTPLAN_ID>
133
+ ```
134
+
135
+ ### `testhub testplan-state` — 计划状态(list / get)
136
+
137
+ ```bash
138
+ pc testhub testplan-state list
139
+ pc testhub testplan-state get <STATE_ID>
140
+ ```
141
+
142
+ ### `testhub testplan-type` — 计划类型(list / get)
143
+
144
+ ```bash
145
+ pc testhub testplan-type list <LIBRARY_ID>
146
+ pc testhub testplan-type get <LIBRARY_ID> <TESTPLAN_TYPE_ID>
147
+ ```
148
+
149
+ ### `testhub testrun` — 测试执行(list / get / create / update / replace / search / bulk-create / bulk-update / histories / get-history / plan-batch)
150
+
151
+ ```bash
152
+ pc testhub testrun list [--testplan-id <ID>] [--testcase-id <ID>] [--suite-id <ID>] \
153
+ [--status-id <ID>] [--keywords <KEYWORDS>]
154
+ pc testhub testrun get <TESTRUN_ID> [--include-deleted]
155
+ pc testhub testrun create --data <JSON>
156
+ pc testhub testrun update --data <JSON> <TESTRUN_ID>
157
+ pc testhub testrun replace --data <JSON> <TESTRUN_ID>
158
+ pc testhub testrun search --data <JSON>
159
+ pc testhub testrun bulk-create --data <JSON>
160
+ pc testhub testrun bulk-update --data <JSON>
161
+ pc testhub testrun histories <TESTRUN_ID>
162
+ pc testhub testrun get-history <TESTRUN_ID> <HISTORY_ID>
163
+ pc testhub testrun plan-batch --data <JSON> <LIBRARY_ID> <TESTPLAN_ID>
164
+ ```
165
+
166
+ ### `testhub testrun-status` — 执行状态(list / list-for-library / get)
167
+
168
+ ```bash
169
+ pc testhub testrun-status list
170
+ pc testhub testrun-status list-for-library --library-id <ID>
171
+ pc testhub testrun-status get <STATUS_ID>
172
+ ```
@@ -1,80 +1,367 @@
1
- # pc 速查(PingCode Open API CLI)
1
+ # pc 命令速查(PingCode Open API)
2
2
 
3
- 本文件随 Super Coding 版本分发,**只读**:运行时的经验不要回写到这里(升级会覆盖)。
4
- 所有参数形态均取自 `pc` 1.2.x 的实际 clap 定义,不是猜的。
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
- `--principal-type` 取值:`workitem` / `workitem-review` / `testrun` / `testcase` /
42
- `testcase-review` / `idea` / `idea-review` / `ticket` / `page`。
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
- ## 知识库(wiki)
59
+ ### `pjm board-entry` — 看板卡片(list / get / create / update / delete)
45
60
 
46
- | 目的 | 命令 |
47
- |---|---|
48
- | 找空间 | `pc wiki space list --keywords "空间名"` |
49
- | 列页面 | `pc wiki page list --space-id <SID> [--page-index 0 --page-size 50]` |
50
- | 页面详情 | `pc wiki page get <PAGE_ID>`(**位置参数**) |
51
- | 页面正文 | `pc wiki page get-content <PAGE_ID> --format-type markdown`(`text` / `markdown` / `html` / `block`) |
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
- ## 组织(organization)
69
+ ### `pjm board-swimlane` — 看板泳道(list / get / create / update / delete)
54
70
 
55
- | 目的 | 命令 |
56
- |---|---|
57
- | 找人 | `pc organization user list --keywords "姓名"`(也可 `--name` / `--emails` / `--mobiles`) |
58
- | 部门 / 团队 / 角色 | `pc organization department list`、`pc organization group list`、`pc organization role list` |
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
- `pc doctor` 输出结构化 JSON:`ok`、`summary`、`checks[]`(每项有稳定 `id` 与
63
- `status` = pass/fail/warn/info/skipped)。只看 `ok` 和 `status=fail` 的项,
64
- **不要复述任何凭据相关字段**。退出码:0 全通过 / 1 有检查失败 / 2 命令自身异常。
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
- ## ID 从哪来(实测:三种 ID 别混用)
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>` 或 `pc pjm workitem search ...` | `values[].id` / `values[].short_id` |
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 命令自身异常。
@@ -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(` pc 二进制:${status.binary ? `${status.binary.path}(${status.binary.version})` : "未找到"}`);
68
+ console.log(" pc 二进制:未找到");
58
69
  }
59
70
  console.log(` 凭据来源:${credentialLabel(effectiveCredential(status, inspected))}`);
60
71
  if (inspected.state === "ok") {