@cvtoolman/pingcode-cli 0.2.0

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.
Files changed (141) hide show
  1. package/dist/cli/client.d.ts +6 -0
  2. package/dist/cli/client.d.ts.map +1 -0
  3. package/dist/cli/client.js +13 -0
  4. package/dist/cli/client.js.map +1 -0
  5. package/dist/cli/commands/auth.d.ts +3 -0
  6. package/dist/cli/commands/auth.d.ts.map +1 -0
  7. package/dist/cli/commands/auth.js +108 -0
  8. package/dist/cli/commands/auth.js.map +1 -0
  9. package/dist/cli/commands/project.d.ts +3 -0
  10. package/dist/cli/commands/project.d.ts.map +1 -0
  11. package/dist/cli/commands/project.js +54 -0
  12. package/dist/cli/commands/project.js.map +1 -0
  13. package/dist/cli/commands/sprint.d.ts +3 -0
  14. package/dist/cli/commands/sprint.d.ts.map +1 -0
  15. package/dist/cli/commands/sprint.js +44 -0
  16. package/dist/cli/commands/sprint.js.map +1 -0
  17. package/dist/cli/commands/user.d.ts +3 -0
  18. package/dist/cli/commands/user.d.ts.map +1 -0
  19. package/dist/cli/commands/user.js +20 -0
  20. package/dist/cli/commands/user.js.map +1 -0
  21. package/dist/cli/commands/wiki.d.ts +3 -0
  22. package/dist/cli/commands/wiki.d.ts.map +1 -0
  23. package/dist/cli/commands/wiki.js +105 -0
  24. package/dist/cli/commands/wiki.js.map +1 -0
  25. package/dist/cli/commands/work-item.d.ts +3 -0
  26. package/dist/cli/commands/work-item.d.ts.map +1 -0
  27. package/dist/cli/commands/work-item.js +116 -0
  28. package/dist/cli/commands/work-item.js.map +1 -0
  29. package/dist/cli/config-store.d.ts +25 -0
  30. package/dist/cli/config-store.d.ts.map +1 -0
  31. package/dist/cli/config-store.js +55 -0
  32. package/dist/cli/config-store.js.map +1 -0
  33. package/dist/cli/index.d.ts +6 -0
  34. package/dist/cli/index.d.ts.map +1 -0
  35. package/dist/cli/index.js +54 -0
  36. package/dist/cli/index.js.map +1 -0
  37. package/dist/cli/output.d.ts +7 -0
  38. package/dist/cli/output.d.ts.map +1 -0
  39. package/dist/cli/output.js +29 -0
  40. package/dist/cli/output.js.map +1 -0
  41. package/dist/cli/setup.d.ts +26 -0
  42. package/dist/cli/setup.d.ts.map +1 -0
  43. package/dist/cli/setup.js +216 -0
  44. package/dist/cli/setup.js.map +1 -0
  45. package/dist/client/api/comments.d.ts +12 -0
  46. package/dist/client/api/comments.d.ts.map +1 -0
  47. package/dist/client/api/comments.js +37 -0
  48. package/dist/client/api/comments.js.map +1 -0
  49. package/dist/client/api/deliverables.d.ts +14 -0
  50. package/dist/client/api/deliverables.d.ts.map +1 -0
  51. package/dist/client/api/deliverables.js +38 -0
  52. package/dist/client/api/deliverables.js.map +1 -0
  53. package/dist/client/api/myself.d.ts +10 -0
  54. package/dist/client/api/myself.d.ts.map +1 -0
  55. package/dist/client/api/myself.js +13 -0
  56. package/dist/client/api/myself.js.map +1 -0
  57. package/dist/client/api/sprints.d.ts +15 -0
  58. package/dist/client/api/sprints.d.ts.map +1 -0
  59. package/dist/client/api/sprints.js +64 -0
  60. package/dist/client/api/sprints.js.map +1 -0
  61. package/dist/client/api/stories.d.ts +17 -0
  62. package/dist/client/api/stories.d.ts.map +1 -0
  63. package/dist/client/api/stories.js +54 -0
  64. package/dist/client/api/stories.js.map +1 -0
  65. package/dist/client/api/wiki.d.ts +25 -0
  66. package/dist/client/api/wiki.d.ts.map +1 -0
  67. package/dist/client/api/wiki.js +90 -0
  68. package/dist/client/api/wiki.js.map +1 -0
  69. package/dist/client/api/work-items.d.ts +27 -0
  70. package/dist/client/api/work-items.d.ts.map +1 -0
  71. package/dist/client/api/work-items.js +141 -0
  72. package/dist/client/api/work-items.js.map +1 -0
  73. package/dist/client/auth.d.ts +30 -0
  74. package/dist/client/auth.d.ts.map +1 -0
  75. package/dist/client/auth.js +159 -0
  76. package/dist/client/auth.js.map +1 -0
  77. package/dist/client/client.d.ts +46 -0
  78. package/dist/client/client.d.ts.map +1 -0
  79. package/dist/client/client.js +157 -0
  80. package/dist/client/client.js.map +1 -0
  81. package/dist/client/errors.d.ts +15 -0
  82. package/dist/client/errors.d.ts.map +1 -0
  83. package/dist/client/errors.js +26 -0
  84. package/dist/client/errors.js.map +1 -0
  85. package/dist/client/index.d.ts +16 -0
  86. package/dist/client/index.d.ts.map +1 -0
  87. package/dist/client/index.js +15 -0
  88. package/dist/client/index.js.map +1 -0
  89. package/dist/client/token-store.d.ts +12 -0
  90. package/dist/client/token-store.d.ts.map +1 -0
  91. package/dist/client/token-store.js +38 -0
  92. package/dist/client/token-store.js.map +1 -0
  93. package/dist/client/types.d.ts +176 -0
  94. package/dist/client/types.d.ts.map +1 -0
  95. package/dist/client/types.js +5 -0
  96. package/dist/client/types.js.map +1 -0
  97. package/dist/server/format.d.ts +7 -0
  98. package/dist/server/format.d.ts.map +1 -0
  99. package/dist/server/format.js +60 -0
  100. package/dist/server/format.js.map +1 -0
  101. package/dist/server/index.d.ts +6 -0
  102. package/dist/server/index.d.ts.map +1 -0
  103. package/dist/server/index.js +51 -0
  104. package/dist/server/index.js.map +1 -0
  105. package/dist/server/tools/comment-tools.d.ts +4 -0
  106. package/dist/server/tools/comment-tools.d.ts.map +1 -0
  107. package/dist/server/tools/comment-tools.js +55 -0
  108. package/dist/server/tools/comment-tools.js.map +1 -0
  109. package/dist/server/tools/deliverable-tools.d.ts +4 -0
  110. package/dist/server/tools/deliverable-tools.d.ts.map +1 -0
  111. package/dist/server/tools/deliverable-tools.js +59 -0
  112. package/dist/server/tools/deliverable-tools.js.map +1 -0
  113. package/dist/server/tools/product-tools.d.ts +4 -0
  114. package/dist/server/tools/product-tools.d.ts.map +1 -0
  115. package/dist/server/tools/product-tools.js +30 -0
  116. package/dist/server/tools/product-tools.js.map +1 -0
  117. package/dist/server/tools/project-tools.d.ts +4 -0
  118. package/dist/server/tools/project-tools.d.ts.map +1 -0
  119. package/dist/server/tools/project-tools.js +44 -0
  120. package/dist/server/tools/project-tools.js.map +1 -0
  121. package/dist/server/tools/sprint-tools.d.ts +4 -0
  122. package/dist/server/tools/sprint-tools.d.ts.map +1 -0
  123. package/dist/server/tools/sprint-tools.js +69 -0
  124. package/dist/server/tools/sprint-tools.js.map +1 -0
  125. package/dist/server/tools/story-tools.d.ts +4 -0
  126. package/dist/server/tools/story-tools.d.ts.map +1 -0
  127. package/dist/server/tools/story-tools.js +55 -0
  128. package/dist/server/tools/story-tools.js.map +1 -0
  129. package/dist/server/tools/user-tools.d.ts +4 -0
  130. package/dist/server/tools/user-tools.d.ts.map +1 -0
  131. package/dist/server/tools/user-tools.js +41 -0
  132. package/dist/server/tools/user-tools.js.map +1 -0
  133. package/dist/server/tools/wiki-tools.d.ts +4 -0
  134. package/dist/server/tools/wiki-tools.d.ts.map +1 -0
  135. package/dist/server/tools/wiki-tools.js +171 -0
  136. package/dist/server/tools/wiki-tools.js.map +1 -0
  137. package/dist/server/tools/work-item-tools.d.ts +4 -0
  138. package/dist/server/tools/work-item-tools.d.ts.map +1 -0
  139. package/dist/server/tools/work-item-tools.js +180 -0
  140. package/dist/server/tools/work-item-tools.js.map +1 -0
  141. package/package.json +32 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * 全局配置管理器
3
+ *
4
+ * 配置文件存储在 ~/.pingcode/config.json
5
+ * 用于存储 API 地址、客户端凭证等信息,让用户无需手动编辑 .env
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import os from 'node:os';
10
+ const CONFIG_DIR = path.join(os.homedir(), '.pingcode');
11
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
12
+ export function loadGlobalConfig() {
13
+ try {
14
+ if (!fs.existsSync(CONFIG_FILE))
15
+ return {};
16
+ return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));
17
+ }
18
+ catch {
19
+ return {};
20
+ }
21
+ }
22
+ export function saveGlobalConfig(config) {
23
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
24
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
25
+ }
26
+ export function getGlobalConfigPath() {
27
+ return CONFIG_FILE;
28
+ }
29
+ /**
30
+ * 将全局配置注入到 process.env 中(仅填充未设置的变量)
31
+ * 优先级:环境变量 / .env > 全局配置
32
+ */
33
+ export function applyGlobalConfigToEnv() {
34
+ const config = loadGlobalConfig();
35
+ // 设置全局 token 文件路径(如果未指定)
36
+ if (!process.env.PINGCODE_TOKEN_FILE) {
37
+ process.env.PINGCODE_TOKEN_FILE = path.join(CONFIG_DIR, 'token.json');
38
+ }
39
+ const mapping = [
40
+ ['apiRoot', 'PINGCODE_API_ROOT'],
41
+ ['authMode', 'PINGCODE_AUTH_MODE'],
42
+ ['clientId', 'PINGCODE_CLIENT_ID'],
43
+ ['clientSecret', 'PINGCODE_CLIENT_SECRET'],
44
+ ['userClientId', 'PINGCODE_USER_CLIENT_ID'],
45
+ ['userClientSecret', 'PINGCODE_USER_CLIENT_SECRET'],
46
+ ['orgId', 'PINGCODE_ORG_ID'],
47
+ ['productId', 'PINGCODE_PRODUCT_ID'],
48
+ ];
49
+ for (const [key, envKey] of mapping) {
50
+ if (config[key] && !process.env[envKey]) {
51
+ process.env[envKey] = config[key];
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/cli/config-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAazB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAElC,yBAAyB;IACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAmC;QAC9C,CAAC,SAAS,EAAE,mBAAmB,CAAC;QAChC,CAAC,UAAU,EAAE,oBAAoB,CAAC;QAClC,CAAC,UAAU,EAAE,oBAAoB,CAAC;QAClC,CAAC,cAAc,EAAE,wBAAwB,CAAC;QAC1C,CAAC,cAAc,EAAE,yBAAyB,CAAC;QAC3C,CAAC,kBAAkB,EAAE,6BAA6B,CAAC;QACnD,CAAC,OAAO,EAAE,iBAAiB,CAAC;QAC5B,CAAC,WAAW,EAAE,qBAAqB,CAAC;KACrC,CAAC;IACF,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAW,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PingCode CLI 入口
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;GAEG"}
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PingCode CLI 入口
4
+ */
5
+ import { Command } from 'commander';
6
+ import { applyGlobalConfigToEnv } from './config-store.js';
7
+ import { ensureAuthorized, interactiveSetup } from './setup.js';
8
+ import { authCommand } from './commands/auth.js';
9
+ import { userCommand } from './commands/user.js';
10
+ import { workItemCommand } from './commands/work-item.js';
11
+ import { sprintCommand } from './commands/sprint.js';
12
+ import { wikiCommand } from './commands/wiki.js';
13
+ import { projectCommand } from './commands/project.js';
14
+ // 将全局配置(~/.pingcode/config.json)注入环境变量
15
+ applyGlobalConfigToEnv();
16
+ const program = new Command('pingcode-cli')
17
+ .description('PingCode CLI - 命令行操作 PingCode')
18
+ .version('0.1.0');
19
+ program.addCommand(authCommand);
20
+ program.addCommand(userCommand);
21
+ program.addCommand(workItemCommand);
22
+ program.addCommand(sprintCommand);
23
+ program.addCommand(wikiCommand);
24
+ program.addCommand(projectCommand);
25
+ // auth 相关子命令不需要预检查授权(避免死循环)
26
+ const AUTH_COMMANDS = ['auth', 'help', '--help', '-h', '--version', '-V'];
27
+ async function main() {
28
+ const args = process.argv.slice(2);
29
+ const firstArg = args[0];
30
+ // 无参数时:进入交互式引导流程,不打印帮助
31
+ if (!firstArg) {
32
+ try {
33
+ await interactiveSetup();
34
+ }
35
+ catch (e) {
36
+ console.error(`配置失败: ${e.message}`);
37
+ process.exit(1);
38
+ }
39
+ return;
40
+ }
41
+ // 非 auth/help 命令时,先检查授权状态
42
+ if (!AUTH_COMMANDS.includes(firstArg)) {
43
+ try {
44
+ await ensureAuthorized();
45
+ }
46
+ catch (e) {
47
+ console.error(`授权检查失败: ${e.message}`);
48
+ process.exit(1);
49
+ }
50
+ }
51
+ program.parse();
52
+ }
53
+ main();
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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;AAEvD,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;AAEnC,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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * CLI 输出格式化工具
3
+ */
4
+ export declare function printJson(data: any): void;
5
+ export declare function printTable(items: Record<string, any>[], columns?: string[]): void;
6
+ export declare function printKeyValue(data: Record<string, any>): void;
7
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAEzC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAajF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAI7D"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * CLI 输出格式化工具
3
+ */
4
+ export function printJson(data) {
5
+ console.log(JSON.stringify(data, null, 2));
6
+ }
7
+ export function printTable(items, columns) {
8
+ if (!items.length) {
9
+ console.log('无数据');
10
+ return;
11
+ }
12
+ const cols = columns || Object.keys(items[0]);
13
+ const widths = cols.map(c => Math.max(c.length, ...items.map(i => String(i[c] ?? '').length)));
14
+ const header = cols.map((c, i) => c.padEnd(widths[i])).join(' ');
15
+ const sep = cols.map((_, i) => '-'.repeat(widths[i])).join(' ');
16
+ console.log(header);
17
+ console.log(sep);
18
+ for (const item of items) {
19
+ const row = cols.map((c, i) => String(item[c] ?? '').padEnd(widths[i])).join(' ');
20
+ console.log(row);
21
+ }
22
+ }
23
+ export function printKeyValue(data) {
24
+ for (const [k, v] of Object.entries(data)) {
25
+ if (v !== null && v !== undefined)
26
+ console.log(`${k}: ${typeof v === 'object' ? JSON.stringify(v) : v}`);
27
+ }
28
+ }
29
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,SAAS,CAAC,IAAS;IACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAA4B,EAAE,OAAkB;IACzE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAClD,MAAM,IAAI,GAAG,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE/F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAyB;IACrD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 首次使用引导 & 授权检查
3
+ *
4
+ * 在 CLI 启动时检查是否已完成配置和授权,
5
+ * 未完成则交互式引导用户完成。
6
+ */
7
+ declare const GLOBAL_TOKEN_FILE: string;
8
+ export declare function prompt(question: string): Promise<string>;
9
+ /**
10
+ * CLI 启动时的授权检查入口
11
+ *
12
+ * 如果已有有效令牌,直接跳过。
13
+ * 否则引导用户选择认证模式并完成授权。
14
+ */
15
+ export declare function ensureAuthorized(): Promise<void>;
16
+ /**
17
+ * 交互式引导入口(用户直接输入 pingcode-cli 不带参数时调用)
18
+ *
19
+ * 与 ensureAuthorized 不同:
20
+ * - 始终显示欢迎信息和当前配置状态
21
+ * - 已配置的项跳过,未配置的项引导配置
22
+ * - 已有有效令牌时提示当前状态,询问是否重新配置
23
+ */
24
+ export declare function interactiveSetup(): Promise<void>;
25
+ export { GLOBAL_TOKEN_FILE };
26
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,QAAA,MAAM,iBAAiB,QAAqD,CAAC;AAE7E,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQxD;AA6HD;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsBtD;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8CtD;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * 首次使用引导 & 授权检查
3
+ *
4
+ * 在 CLI 启动时检查是否已完成配置和授权,
5
+ * 未完成则交互式引导用户完成。
6
+ */
7
+ import readline from 'node:readline';
8
+ import path from 'node:path';
9
+ import os from 'node:os';
10
+ import { PingCodeAuth, TokenStore } from '../client/index.js';
11
+ import { loadGlobalConfig, saveGlobalConfig, getGlobalConfigPath } from './config-store.js';
12
+ const GLOBAL_TOKEN_FILE = path.join(os.homedir(), '.pingcode', 'token.json');
13
+ export function prompt(question) {
14
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
15
+ return new Promise((resolve) => {
16
+ rl.question(question, (answer) => {
17
+ rl.close();
18
+ resolve(answer.trim());
19
+ });
20
+ });
21
+ }
22
+ /**
23
+ * 选择菜单:让用户输入数字选择
24
+ */
25
+ async function promptChoice(question, choices) {
26
+ console.log(question);
27
+ choices.forEach((c, i) => console.log(` ${i + 1}. ${c}`));
28
+ const answer = await prompt('\n请输入选项编号: ');
29
+ const num = parseInt(answer, 10);
30
+ if (isNaN(num) || num < 1 || num > choices.length) {
31
+ console.log('无效选项,请重新选择\n');
32
+ return promptChoice(question, choices);
33
+ }
34
+ return num;
35
+ }
36
+ /**
37
+ * 检查是否有有效的令牌
38
+ * 会同时验证令牌的 auth_mode 与当前配置的 authMode 是否匹配
39
+ */
40
+ function hasValidToken() {
41
+ const store = new TokenStore(GLOBAL_TOKEN_FILE);
42
+ const data = store.load();
43
+ if (!data || !data.access_token)
44
+ return false;
45
+ // 检查是否过期(提前 1 天判定为过期)
46
+ if (data.expires_at && Date.now() / 1000 >= data.expires_at - 86400)
47
+ return false;
48
+ // 检查 auth_mode 是否与当前配置匹配(与 PingCodeAuth._loadTokens 逻辑一致)
49
+ const config = loadGlobalConfig();
50
+ const currentMode = config.authMode || process.env.PINGCODE_AUTH_MODE || 'client';
51
+ if (data.auth_mode && data.auth_mode !== currentMode)
52
+ return false;
53
+ return true;
54
+ }
55
+ /**
56
+ * 检查是否有凭证配置(全局配置或环境变量)
57
+ */
58
+ function hasCredentials() {
59
+ const config = loadGlobalConfig();
60
+ return {
61
+ hasClient: !!(config.clientId || process.env.PINGCODE_CLIENT_ID),
62
+ hasUser: !!(config.userClientId || process.env.PINGCODE_USER_CLIENT_ID),
63
+ };
64
+ }
65
+ /**
66
+ * 引导用户配置 API 地址(如果尚未配置)
67
+ */
68
+ async function ensureApiRoot() {
69
+ const config = loadGlobalConfig();
70
+ if (config.apiRoot || process.env.PINGCODE_API_ROOT)
71
+ return;
72
+ console.log('');
73
+ const apiRoot = await prompt('请输入 PingCode API 地址 (直接回车使用默认 https://open.pingcode.com): ');
74
+ if (apiRoot) {
75
+ config.apiRoot = apiRoot;
76
+ saveGlobalConfig(config);
77
+ process.env.PINGCODE_API_ROOT = apiRoot;
78
+ }
79
+ }
80
+ /**
81
+ * 客户端凭证模式引导
82
+ */
83
+ async function setupClientCredentials() {
84
+ const config = loadGlobalConfig();
85
+ if (!config.clientId && !process.env.PINGCODE_CLIENT_ID) {
86
+ console.log('\n请输入客户端凭证信息:\n');
87
+ const clientId = await prompt('Client ID: ');
88
+ const clientSecret = await prompt('Client Secret: ');
89
+ if (!clientId || !clientSecret) {
90
+ console.error('Client ID 和 Client Secret 不能为空');
91
+ process.exit(1);
92
+ }
93
+ config.authMode = 'client';
94
+ config.clientId = clientId;
95
+ config.clientSecret = clientSecret;
96
+ saveGlobalConfig(config);
97
+ process.env.PINGCODE_CLIENT_ID = clientId;
98
+ process.env.PINGCODE_CLIENT_SECRET = clientSecret;
99
+ console.log(`\n配置已保存到 ${getGlobalConfigPath()}`);
100
+ }
101
+ console.log('\n正在获取令牌...');
102
+ const auth = new PingCodeAuth({ authMode: 'client', tokenFile: GLOBAL_TOKEN_FILE });
103
+ await auth.getClientToken();
104
+ console.log('客户端令牌获取成功 ✓\n');
105
+ }
106
+ /**
107
+ * 授权码模式引导
108
+ */
109
+ async function setupAuthorizationCode() {
110
+ const config = loadGlobalConfig();
111
+ if (!config.userClientId && !process.env.PINGCODE_USER_CLIENT_ID) {
112
+ console.log('\n请输入授权码模式的凭证信息:\n');
113
+ const userClientId = await prompt('User Client ID: ');
114
+ const userClientSecret = await prompt('User Client Secret: ');
115
+ if (!userClientId || !userClientSecret) {
116
+ console.error('Client ID 和 Client Secret 不能为空');
117
+ process.exit(1);
118
+ }
119
+ config.authMode = 'user';
120
+ config.userClientId = userClientId;
121
+ config.userClientSecret = userClientSecret;
122
+ saveGlobalConfig(config);
123
+ process.env.PINGCODE_USER_CLIENT_ID = userClientId;
124
+ process.env.PINGCODE_USER_CLIENT_SECRET = userClientSecret;
125
+ console.log(`\n配置已保存到 ${getGlobalConfigPath()}`);
126
+ }
127
+ const auth = new PingCodeAuth({ authMode: 'user', tokenFile: GLOBAL_TOKEN_FILE });
128
+ const url = auth.getAuthorizeUrl();
129
+ console.log(`\n请在浏览器中打开以下链接完成授权:\n ${url}\n`);
130
+ const code = await prompt('请输入授权码: ');
131
+ if (!code) {
132
+ console.error('授权码不能为空');
133
+ process.exit(1);
134
+ }
135
+ await auth.getUserToken(code);
136
+ console.log('用户令牌获取成功 ✓\n');
137
+ }
138
+ /**
139
+ * CLI 启动时的授权检查入口
140
+ *
141
+ * 如果已有有效令牌,直接跳过。
142
+ * 否则引导用户选择认证模式并完成授权。
143
+ */
144
+ export async function ensureAuthorized() {
145
+ if (hasValidToken())
146
+ return;
147
+ console.log('╔══════════════════════════════════════╗');
148
+ console.log('║ 欢迎使用 PingCode CLI 工具 ║');
149
+ console.log('╚══════════════════════════════════════╝');
150
+ console.log('\n检测到尚未授权,需要先完成认证配置。\n');
151
+ // 先确保 API 地址已配置
152
+ await ensureApiRoot();
153
+ // 让用户选择认证模式
154
+ const choice = await promptChoice('请选择认证方式:', [
155
+ '客户端凭证模式 — 使用 Client ID / Secret 直接获取令牌(推荐)',
156
+ '授权码模式 — 通过浏览器授权获取用户级令牌',
157
+ ]);
158
+ if (choice === 1) {
159
+ await setupClientCredentials();
160
+ }
161
+ else {
162
+ await setupAuthorizationCode();
163
+ }
164
+ }
165
+ /**
166
+ * 交互式引导入口(用户直接输入 pingcode-cli 不带参数时调用)
167
+ *
168
+ * 与 ensureAuthorized 不同:
169
+ * - 始终显示欢迎信息和当前配置状态
170
+ * - 已配置的项跳过,未配置的项引导配置
171
+ * - 已有有效令牌时提示当前状态,询问是否重新配置
172
+ */
173
+ export async function interactiveSetup() {
174
+ console.log('╔══════════════════════════════════════╗');
175
+ console.log('║ 欢迎使用 PingCode CLI 工具 ║');
176
+ console.log('╚══════════════════════════════════════╝');
177
+ const config = loadGlobalConfig();
178
+ const tokenValid = hasValidToken();
179
+ const creds = hasCredentials();
180
+ // 显示当前配置状态
181
+ console.log('\n当前配置状态:');
182
+ const apiRoot = config.apiRoot || process.env.PINGCODE_API_ROOT;
183
+ console.log(` API 地址: ${apiRoot ? `${apiRoot} ✓` : '未配置'}`);
184
+ console.log(` 客户端凭证: ${creds.hasClient ? '已配置 ✓' : '未配置'}`);
185
+ console.log(` 用户凭证: ${creds.hasUser ? '已配置 ✓' : '未配置'}`);
186
+ console.log(` 认证令牌: ${tokenValid ? '有效 ✓' : '无效或未获取'}`);
187
+ // 如果已经完全配置好,询问是否重新配置
188
+ if (tokenValid) {
189
+ console.log('\n当前认证状态正常,可以直接使用 CLI 命令。');
190
+ console.log('运行 pingcode-cli --help 查看可用命令。\n');
191
+ const answer = await prompt('是否要重新配置?(y/N): ');
192
+ if (answer.toLowerCase() !== 'y') {
193
+ return;
194
+ }
195
+ console.log('');
196
+ }
197
+ else {
198
+ console.log('');
199
+ }
200
+ // 引导 API 地址配置(已配置则跳过)
201
+ await ensureApiRoot();
202
+ // 选择认证方式
203
+ const choice = await promptChoice('请选择认证方式:', [
204
+ '客户端凭证模式 — 使用 Client ID / Secret 直接获取令牌(推荐)',
205
+ '授权码模式 — 通过浏览器授权获取用户级令牌',
206
+ ]);
207
+ if (choice === 1) {
208
+ await setupClientCredentials();
209
+ }
210
+ else {
211
+ await setupAuthorizationCode();
212
+ }
213
+ console.log('配置完成!运行 pingcode-cli --help 查看可用命令。');
214
+ }
215
+ export { GLOBAL_TOKEN_FILE };
216
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * PingCode 评论相关 API
3
+ */
4
+ import type { PingCodeClient } from '../client.js';
5
+ import type { CreateCommentOptions, PaginatedResponse } from '../types.js';
6
+ export declare class CommentsAPI {
7
+ private client;
8
+ constructor(client: PingCodeClient);
9
+ listComments(principalType: string, principalId?: string, reviewId?: string, pageIndex?: number, pageSize?: number): Promise<PaginatedResponse>;
10
+ createComment(options: CreateCommentOptions): Promise<any>;
11
+ }
12
+ //# sourceMappingURL=comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../../src/client/api/comments.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE3E,qBAAa,WAAW;IACV,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEpC,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,SAAI,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAWtI,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC;CAWjE"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * PingCode 评论相关 API
3
+ */
4
+ export class CommentsAPI {
5
+ client;
6
+ constructor(client) {
7
+ this.client = client;
8
+ }
9
+ async listComments(principalType, principalId, reviewId, pageIndex = 0, pageSize = 30) {
10
+ const params = {
11
+ principal_type: principalType,
12
+ page_index: pageIndex,
13
+ page_size: Math.min(pageSize, 100),
14
+ };
15
+ if (principalId)
16
+ params.principal_id = principalId;
17
+ if (reviewId)
18
+ params.review_id = reviewId;
19
+ return this.client.get('/v1/comments', params);
20
+ }
21
+ async createComment(options) {
22
+ const data = {
23
+ principal_type: options.principalType,
24
+ content: options.content,
25
+ };
26
+ if (options.principalId)
27
+ data.principal_id = options.principalId;
28
+ if (options.reviewId)
29
+ data.review_id = options.reviewId;
30
+ if (options.createdAt)
31
+ data.created_at = options.createdAt;
32
+ if (options.createdBy)
33
+ data.created_by = options.createdBy;
34
+ return this.client.post('/v1/comments', data);
35
+ }
36
+ }
37
+ //# sourceMappingURL=comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../../src/client/api/comments.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,OAAO,WAAW;IACF;IAApB,YAAoB,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAE9C,KAAK,CAAC,YAAY,CAAC,aAAqB,EAAE,WAAoB,EAAE,QAAiB,EAAE,SAAS,GAAG,CAAC,EAAE,QAAQ,GAAG,EAAE;QAC7G,MAAM,MAAM,GAAwB;YAClC,cAAc,EAAE,aAAa;YAC7B,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC;SACnC,CAAC;QACF,IAAI,WAAW;YAAE,MAAM,CAAC,YAAY,GAAG,WAAW,CAAC;QACnD,IAAI,QAAQ;YAAE,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAA6B;QAC/C,MAAM,IAAI,GAAwB;YAChC,cAAc,EAAE,OAAO,CAAC,aAAa;YACrC,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QACF,IAAI,OAAO,CAAC,WAAW;YAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;QACjE,IAAI,OAAO,CAAC,QAAQ;YAAE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QACxD,IAAI,OAAO,CAAC,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QAC3D,IAAI,OAAO,CAAC,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QAC3D,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * PingCode 交付目标(Deliverables)相关 API
3
+ */
4
+ import type { PingCodeClient } from '../client.js';
5
+ import type { CreateDeliverableOptions, UpdateDeliverableOptions, PaginatedResponse } from '../types.js';
6
+ export declare class DeliverablesAPI {
7
+ private client;
8
+ constructor(client: PingCodeClient);
9
+ createDeliverable(options: CreateDeliverableOptions): Promise<any>;
10
+ updateDeliverable(deliverableId: string, options: UpdateDeliverableOptions): Promise<any>;
11
+ deleteDeliverable(deliverableId: string): Promise<any>;
12
+ listDeliverables(workItemId: string, pageIndex?: number, pageSize?: number): Promise<PaginatedResponse>;
13
+ }
14
+ //# sourceMappingURL=deliverables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deliverables.d.ts","sourceRoot":"","sources":["../../../src/client/api/deliverables.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEzG,qBAAa,eAAe;IACd,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEpC,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,GAAG,CAAC;IASlE,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,GAAG,CAAC;IASzF,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAItD,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,SAAI,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAKrG"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * PingCode 交付目标(Deliverables)相关 API
3
+ */
4
+ export class DeliverablesAPI {
5
+ client;
6
+ constructor(client) {
7
+ this.client = client;
8
+ }
9
+ async createDeliverable(options) {
10
+ return this.client.post('/v1/project/deliverables', {
11
+ work_item_id: options.workItemId,
12
+ name: options.name,
13
+ content_type: options.contentType,
14
+ content: options.content,
15
+ });
16
+ }
17
+ async updateDeliverable(deliverableId, options) {
18
+ const data = {};
19
+ if (options.workItemId)
20
+ data.work_item_id = options.workItemId;
21
+ if (options.name)
22
+ data.name = options.name;
23
+ if (options.contentType)
24
+ data.content_type = options.contentType;
25
+ if (options.content)
26
+ data.content = options.content;
27
+ return this.client.patch(`/v1/project/deliverables/${deliverableId}`, data);
28
+ }
29
+ async deleteDeliverable(deliverableId) {
30
+ return this.client.delete(`/v1/project/deliverables/${deliverableId}`);
31
+ }
32
+ async listDeliverables(workItemId, pageIndex = 0, pageSize = 30) {
33
+ return this.client.get(`/v1/project/work_items/${workItemId}/deliverables`, {
34
+ page_index: pageIndex, page_size: Math.min(pageSize, 100),
35
+ });
36
+ }
37
+ }
38
+ //# sourceMappingURL=deliverables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deliverables.js","sourceRoot":"","sources":["../../../src/client/api/deliverables.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,OAAO,eAAe;IACN;IAApB,YAAoB,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAE9C,KAAK,CAAC,iBAAiB,CAAC,OAAiC;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;YAClD,YAAY,EAAE,OAAO,CAAC,UAAU;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,YAAY,EAAE,OAAO,CAAC,WAAW;YACjC,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,aAAqB,EAAE,OAAiC;QAC9E,MAAM,IAAI,GAAwB,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,UAAU;YAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;QAC/D,IAAI,OAAO,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3C,IAAI,OAAO,CAAC,WAAW;YAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;QACjE,IAAI,OAAO,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACpD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,aAAqB;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,4BAA4B,aAAa,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,UAAkB,EAAE,SAAS,GAAG,CAAC,EAAE,QAAQ,GAAG,EAAE;QACrE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,UAAU,eAAe,EAAE;YAC1E,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC;SAC1D,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * PingCode 个人信息相关 API
3
+ */
4
+ import type { PingCodeClient } from '../client.js';
5
+ export declare class MyselfAPI {
6
+ private client;
7
+ constructor(client: PingCodeClient);
8
+ getMyself(): Promise<any>;
9
+ }
10
+ //# sourceMappingURL=myself.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"myself.d.ts","sourceRoot":"","sources":["../../../src/client/api/myself.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,qBAAa,SAAS;IACR,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEpC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;CAGhC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * PingCode 个人信息相关 API
3
+ */
4
+ export class MyselfAPI {
5
+ client;
6
+ constructor(client) {
7
+ this.client = client;
8
+ }
9
+ async getMyself() {
10
+ return this.client.get('/v1/myself');
11
+ }
12
+ }
13
+ //# sourceMappingURL=myself.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"myself.js","sourceRoot":"","sources":["../../../src/client/api/myself.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,OAAO,SAAS;IACA;IAApB,YAAoB,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAE9C,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * PingCode 迭代(Sprint)相关 API
3
+ */
4
+ import type { PingCodeClient } from '../client.js';
5
+ import type { ListSprintsOptions, CreateSprintOptions, UpdateSprintOptions, PaginatedResponse } from '../types.js';
6
+ export declare class SprintsAPI {
7
+ private client;
8
+ constructor(client: PingCodeClient);
9
+ listSprints(options: ListSprintsOptions): Promise<PaginatedResponse>;
10
+ getSprint(projectId: string, sprintId: string): Promise<any>;
11
+ createSprint(options: CreateSprintOptions): Promise<any>;
12
+ updateSprint(projectId: string, sprintId: string, options: UpdateSprintOptions): Promise<any>;
13
+ deleteSprint(projectId: string, sprintId: string): Promise<any>;
14
+ }
15
+ //# sourceMappingURL=sprints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprints.d.ts","sourceRoot":"","sources":["../../../src/client/api/sprints.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEnH,qBAAa,UAAU;IACT,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEpC,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAYpE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI5D,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC;IAaxD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC;IAY7F,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAGtE"}