ai-project-manage-cli 2.0.26 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/dist/index.js +500 -20
  2. package/package.json +27 -25
  3. package/template/apm.config.json +5 -0
  4. package/template/deploy/README.md +3 -0
  5. package/template/skills/apm-review/SKILL.md +38 -0
  6. package/template/skills/apm-review/apm-review-reference.md +89 -0
  7. package/template/workitems/README.md +19 -0
  8. package/README.md +0 -171
  9. package/dist/api/cli.d.ts +0 -228
  10. package/dist/api/cli.d.ts.map +0 -1
  11. package/dist/api/cli.js +0 -3
  12. package/dist/api/cli.js.map +0 -1
  13. package/dist/api/client.d.ts +0 -5
  14. package/dist/api/client.d.ts.map +0 -1
  15. package/dist/api/client.js +0 -30
  16. package/dist/api/client.js.map +0 -1
  17. package/dist/api/http.d.ts +0 -21
  18. package/dist/api/http.d.ts.map +0 -1
  19. package/dist/api/http.js +0 -108
  20. package/dist/api/http.js.map +0 -1
  21. package/dist/api/index.d.ts +0 -6
  22. package/dist/api/index.d.ts.map +0 -1
  23. package/dist/api/index.js +0 -13
  24. package/dist/api/index.js.map +0 -1
  25. package/dist/api/request-config.d.ts +0 -25
  26. package/dist/api/request-config.d.ts.map +0 -1
  27. package/dist/api/request-config.js +0 -73
  28. package/dist/api/request-config.js.map +0 -1
  29. package/dist/api/requirement.d.ts +0 -1
  30. package/dist/api/requirement.d.ts.map +0 -1
  31. package/dist/api/requirement.js +0 -2
  32. package/dist/api/requirement.js.map +0 -1
  33. package/dist/apm-dotenv.d.ts +0 -8
  34. package/dist/apm-dotenv.d.ts.map +0 -1
  35. package/dist/apm-dotenv.js +0 -73
  36. package/dist/apm-dotenv.js.map +0 -1
  37. package/dist/cli/agent-stream-log.d.ts +0 -41
  38. package/dist/cli/agent-stream-log.d.ts.map +0 -1
  39. package/dist/cli/agent-stream-log.js +0 -364
  40. package/dist/cli/agent-stream-log.js.map +0 -1
  41. package/dist/cli/commands/auth.d.ts +0 -3
  42. package/dist/cli/commands/auth.d.ts.map +0 -1
  43. package/dist/cli/commands/auth.js +0 -51
  44. package/dist/cli/commands/auth.js.map +0 -1
  45. package/dist/cli/commands/chat.d.ts +0 -3
  46. package/dist/cli/commands/chat.d.ts.map +0 -1
  47. package/dist/cli/commands/chat.js +0 -32
  48. package/dist/cli/commands/chat.js.map +0 -1
  49. package/dist/cli/commands/comment.d.ts +0 -3
  50. package/dist/cli/commands/comment.d.ts.map +0 -1
  51. package/dist/cli/commands/comment.js +0 -66
  52. package/dist/cli/commands/comment.js.map +0 -1
  53. package/dist/cli/commands/config.d.ts +0 -3
  54. package/dist/cli/commands/config.d.ts.map +0 -1
  55. package/dist/cli/commands/config.js +0 -39
  56. package/dist/cli/commands/config.js.map +0 -1
  57. package/dist/cli/commands/deploy-backend.d.ts +0 -7
  58. package/dist/cli/commands/deploy-backend.d.ts.map +0 -1
  59. package/dist/cli/commands/deploy-backend.js +0 -77
  60. package/dist/cli/commands/deploy-backend.js.map +0 -1
  61. package/dist/cli/commands/deploy-frontend.d.ts +0 -3
  62. package/dist/cli/commands/deploy-frontend.d.ts.map +0 -1
  63. package/dist/cli/commands/deploy-frontend.js +0 -167
  64. package/dist/cli/commands/deploy-frontend.js.map +0 -1
  65. package/dist/cli/commands/get.d.ts +0 -3
  66. package/dist/cli/commands/get.d.ts.map +0 -1
  67. package/dist/cli/commands/get.js +0 -145
  68. package/dist/cli/commands/get.js.map +0 -1
  69. package/dist/cli/commands/init.d.ts +0 -3
  70. package/dist/cli/commands/init.d.ts.map +0 -1
  71. package/dist/cli/commands/init.js +0 -179
  72. package/dist/cli/commands/init.js.map +0 -1
  73. package/dist/cli/commands/minio.d.ts +0 -3
  74. package/dist/cli/commands/minio.d.ts.map +0 -1
  75. package/dist/cli/commands/minio.js +0 -65
  76. package/dist/cli/commands/minio.js.map +0 -1
  77. package/dist/cli/commands/publish.d.ts +0 -3
  78. package/dist/cli/commands/publish.d.ts.map +0 -1
  79. package/dist/cli/commands/publish.js +0 -130
  80. package/dist/cli/commands/publish.js.map +0 -1
  81. package/dist/cli/commands/release.d.ts +0 -3
  82. package/dist/cli/commands/release.d.ts.map +0 -1
  83. package/dist/cli/commands/release.js +0 -37
  84. package/dist/cli/commands/release.js.map +0 -1
  85. package/dist/cli/commands/requirement.d.ts +0 -3
  86. package/dist/cli/commands/requirement.d.ts.map +0 -1
  87. package/dist/cli/commands/requirement.js +0 -169
  88. package/dist/cli/commands/requirement.js.map +0 -1
  89. package/dist/cli/commands/set.d.ts +0 -3
  90. package/dist/cli/commands/set.d.ts.map +0 -1
  91. package/dist/cli/commands/set.js +0 -103
  92. package/dist/cli/commands/set.js.map +0 -1
  93. package/dist/cli/commands/status.d.ts +0 -3
  94. package/dist/cli/commands/status.d.ts.map +0 -1
  95. package/dist/cli/commands/status.js +0 -42
  96. package/dist/cli/commands/status.js.map +0 -1
  97. package/dist/cli/commands/update.d.ts +0 -3
  98. package/dist/cli/commands/update.d.ts.map +0 -1
  99. package/dist/cli/commands/update.js +0 -36
  100. package/dist/cli/commands/update.js.map +0 -1
  101. package/dist/cli/commands/ws.d.ts +0 -3
  102. package/dist/cli/commands/ws.d.ts.map +0 -1
  103. package/dist/cli/commands/ws.js +0 -25
  104. package/dist/cli/commands/ws.js.map +0 -1
  105. package/dist/cli/credentials.d.ts +0 -30
  106. package/dist/cli/credentials.d.ts.map +0 -1
  107. package/dist/cli/credentials.js +0 -52
  108. package/dist/cli/credentials.js.map +0 -1
  109. package/dist/cli/exit-api-error.d.ts +0 -2
  110. package/dist/cli/exit-api-error.d.ts.map +0 -1
  111. package/dist/cli/exit-api-error.js +0 -18
  112. package/dist/cli/exit-api-error.js.map +0 -1
  113. package/dist/cli/instruction-log-stream-sink.d.ts +0 -31
  114. package/dist/cli/instruction-log-stream-sink.d.ts.map +0 -1
  115. package/dist/cli/instruction-log-stream-sink.js +0 -59
  116. package/dist/cli/instruction-log-stream-sink.js.map +0 -1
  117. package/dist/cli/session.d.ts +0 -26
  118. package/dist/cli/session.d.ts.map +0 -1
  119. package/dist/cli/session.js +0 -41
  120. package/dist/cli/session.js.map +0 -1
  121. package/dist/cli/utils/parse.d.ts +0 -2
  122. package/dist/cli/utils/parse.d.ts.map +0 -1
  123. package/dist/cli/utils/parse.js +0 -12
  124. package/dist/cli/utils/parse.js.map +0 -1
  125. package/dist/cli/ws-run-command.d.ts +0 -13
  126. package/dist/cli/ws-run-command.d.ts.map +0 -1
  127. package/dist/cli/ws-run-command.js +0 -330
  128. package/dist/cli/ws-run-command.js.map +0 -1
  129. package/dist/cli-version.d.ts +0 -9
  130. package/dist/cli-version.d.ts.map +0 -1
  131. package/dist/cli-version.js +0 -61
  132. package/dist/cli-version.js.map +0 -1
  133. package/dist/cli.d.ts +0 -3
  134. package/dist/cli.d.ts.map +0 -1
  135. package/dist/cli.js +0 -36
  136. package/dist/cli.js.map +0 -1
  137. package/dist/config-store.d.ts +0 -38
  138. package/dist/config-store.d.ts.map +0 -1
  139. package/dist/config-store.js +0 -131
  140. package/dist/config-store.js.map +0 -1
  141. package/dist/core/apm-config.d.ts +0 -81
  142. package/dist/core/apm-config.d.ts.map +0 -1
  143. package/dist/core/apm-config.js +0 -147
  144. package/dist/core/apm-config.js.map +0 -1
  145. package/dist/core/backend-deploy/backend-deploy-workflow.d.ts +0 -20
  146. package/dist/core/backend-deploy/backend-deploy-workflow.d.ts.map +0 -1
  147. package/dist/core/backend-deploy/backend-deploy-workflow.js +0 -86
  148. package/dist/core/backend-deploy/backend-deploy-workflow.js.map +0 -1
  149. package/dist/core/backend-deploy/command-runner.d.ts +0 -11
  150. package/dist/core/backend-deploy/command-runner.d.ts.map +0 -1
  151. package/dist/core/backend-deploy/command-runner.js +0 -47
  152. package/dist/core/backend-deploy/command-runner.js.map +0 -1
  153. package/dist/core/backend-deploy/dockerode-client/client.d.ts +0 -18
  154. package/dist/core/backend-deploy/dockerode-client/client.d.ts.map +0 -1
  155. package/dist/core/backend-deploy/dockerode-client/client.js +0 -114
  156. package/dist/core/backend-deploy/dockerode-client/client.js.map +0 -1
  157. package/dist/core/backend-deploy/dockerode-client/connection-options.d.ts +0 -6
  158. package/dist/core/backend-deploy/dockerode-client/connection-options.d.ts.map +0 -1
  159. package/dist/core/backend-deploy/dockerode-client/connection-options.js +0 -62
  160. package/dist/core/backend-deploy/dockerode-client/connection-options.js.map +0 -1
  161. package/dist/core/backend-deploy/dockerode-client/container-inspect-format.d.ts +0 -3
  162. package/dist/core/backend-deploy/dockerode-client/container-inspect-format.d.ts.map +0 -1
  163. package/dist/core/backend-deploy/dockerode-client/container-inspect-format.js +0 -23
  164. package/dist/core/backend-deploy/dockerode-client/container-inspect-format.js.map +0 -1
  165. package/dist/core/backend-deploy/dockerode-client/container-options.d.ts +0 -4
  166. package/dist/core/backend-deploy/dockerode-client/container-options.d.ts.map +0 -1
  167. package/dist/core/backend-deploy/dockerode-client/container-options.js +0 -44
  168. package/dist/core/backend-deploy/dockerode-client/container-options.js.map +0 -1
  169. package/dist/core/backend-deploy/dockerode-client/env.d.ts +0 -3
  170. package/dist/core/backend-deploy/dockerode-client/env.d.ts.map +0 -1
  171. package/dist/core/backend-deploy/dockerode-client/env.js +0 -40
  172. package/dist/core/backend-deploy/dockerode-client/env.js.map +0 -1
  173. package/dist/core/backend-deploy/dockerode-client/index.d.ts +0 -8
  174. package/dist/core/backend-deploy/dockerode-client/index.d.ts.map +0 -1
  175. package/dist/core/backend-deploy/dockerode-client/index.js +0 -17
  176. package/dist/core/backend-deploy/dockerode-client/index.js.map +0 -1
  177. package/dist/core/backend-deploy/dockerode-client/ports.d.ts +0 -9
  178. package/dist/core/backend-deploy/dockerode-client/ports.d.ts.map +0 -1
  179. package/dist/core/backend-deploy/dockerode-client/ports.js +0 -35
  180. package/dist/core/backend-deploy/dockerode-client/ports.js.map +0 -1
  181. package/dist/core/backend-deploy/dockerode-client/runtime.d.ts +0 -7
  182. package/dist/core/backend-deploy/dockerode-client/runtime.d.ts.map +0 -1
  183. package/dist/core/backend-deploy/dockerode-client/runtime.js +0 -26
  184. package/dist/core/backend-deploy/dockerode-client/runtime.js.map +0 -1
  185. package/dist/core/backend-deploy/dockerode-client/types.d.ts +0 -64
  186. package/dist/core/backend-deploy/dockerode-client/types.d.ts.map +0 -1
  187. package/dist/core/backend-deploy/dockerode-client/types.js +0 -3
  188. package/dist/core/backend-deploy/dockerode-client/types.js.map +0 -1
  189. package/dist/core/backend-deploy/image-tag.d.ts +0 -2
  190. package/dist/core/backend-deploy/image-tag.d.ts.map +0 -1
  191. package/dist/core/backend-deploy/image-tag.js +0 -15
  192. package/dist/core/backend-deploy/image-tag.js.map +0 -1
  193. package/dist/core/backend-deploy/index.d.ts +0 -3
  194. package/dist/core/backend-deploy/index.d.ts.map +0 -1
  195. package/dist/core/backend-deploy/index.js +0 -6
  196. package/dist/core/backend-deploy/index.js.map +0 -1
  197. package/dist/core/backend-deploy/local-docker-build.d.ts +0 -8
  198. package/dist/core/backend-deploy/local-docker-build.d.ts.map +0 -1
  199. package/dist/core/backend-deploy/local-docker-build.js +0 -25
  200. package/dist/core/backend-deploy/local-docker-build.js.map +0 -1
  201. package/dist/core/backend-deploy/logger.d.ts +0 -10
  202. package/dist/core/backend-deploy/logger.d.ts.map +0 -1
  203. package/dist/core/backend-deploy/logger.js +0 -22
  204. package/dist/core/backend-deploy/logger.js.map +0 -1
  205. package/dist/core/backend-deploy/registry-login-push.d.ts +0 -24
  206. package/dist/core/backend-deploy/registry-login-push.d.ts.map +0 -1
  207. package/dist/core/backend-deploy/registry-login-push.js +0 -37
  208. package/dist/core/backend-deploy/registry-login-push.js.map +0 -1
  209. package/dist/core/backend-deploy/remote-docker-client.d.ts +0 -11
  210. package/dist/core/backend-deploy/remote-docker-client.d.ts.map +0 -1
  211. package/dist/core/backend-deploy/remote-docker-client.js +0 -34
  212. package/dist/core/backend-deploy/remote-docker-client.js.map +0 -1
  213. package/dist/core/backend-deploy/remote-pull-image.d.ts +0 -9
  214. package/dist/core/backend-deploy/remote-pull-image.d.ts.map +0 -1
  215. package/dist/core/backend-deploy/remote-pull-image.js +0 -39
  216. package/dist/core/backend-deploy/remote-pull-image.js.map +0 -1
  217. package/dist/core/backend-deploy/resolve-dockerfile.d.ts +0 -7
  218. package/dist/core/backend-deploy/resolve-dockerfile.d.ts.map +0 -1
  219. package/dist/core/backend-deploy/resolve-dockerfile.js +0 -24
  220. package/dist/core/backend-deploy/resolve-dockerfile.js.map +0 -1
  221. package/dist/core/backend-deploy/run-docker-cli.d.ts +0 -9
  222. package/dist/core/backend-deploy/run-docker-cli.d.ts.map +0 -1
  223. package/dist/core/backend-deploy/run-docker-cli.js +0 -14
  224. package/dist/core/backend-deploy/run-docker-cli.js.map +0 -1
  225. package/dist/core/backend-deploy/types.d.ts +0 -23
  226. package/dist/core/backend-deploy/types.d.ts.map +0 -1
  227. package/dist/core/backend-deploy/types.js +0 -3
  228. package/dist/core/backend-deploy/types.js.map +0 -1
  229. package/dist/core/branch-name.d.ts +0 -8
  230. package/dist/core/branch-name.d.ts.map +0 -1
  231. package/dist/core/branch-name.js +0 -37
  232. package/dist/core/branch-name.js.map +0 -1
  233. package/dist/core/constants.d.ts +0 -4
  234. package/dist/core/constants.d.ts.map +0 -1
  235. package/dist/core/constants.js +0 -16
  236. package/dist/core/constants.js.map +0 -1
  237. package/dist/core/cursor-cmd.d.ts +0 -30
  238. package/dist/core/cursor-cmd.d.ts.map +0 -1
  239. package/dist/core/cursor-cmd.js +0 -193
  240. package/dist/core/cursor-cmd.js.map +0 -1
  241. package/dist/core/minio.d.ts +0 -37
  242. package/dist/core/minio.d.ts.map +0 -1
  243. package/dist/core/minio.js +0 -159
  244. package/dist/core/minio.js.map +0 -1
  245. package/dist/core/parse-testcase-md.d.ts +0 -17
  246. package/dist/core/parse-testcase-md.d.ts.map +0 -1
  247. package/dist/core/parse-testcase-md.js +0 -79
  248. package/dist/core/parse-testcase-md.js.map +0 -1
  249. package/dist/core/std-event-handler.d.ts +0 -25
  250. package/dist/core/std-event-handler.d.ts.map +0 -1
  251. package/dist/core/std-event-handler.js +0 -90
  252. package/dist/core/std-event-handler.js.map +0 -1
  253. package/dist/core/utils.d.ts +0 -19
  254. package/dist/core/utils.d.ts.map +0 -1
  255. package/dist/core/utils.js +0 -71
  256. package/dist/core/utils.js.map +0 -1
  257. package/dist/core/ws-client.d.ts +0 -29
  258. package/dist/core/ws-client.d.ts.map +0 -1
  259. package/dist/core/ws-client.js +0 -81
  260. package/dist/core/ws-client.js.map +0 -1
  261. package/dist/employee-ws-client.d.ts +0 -42
  262. package/dist/employee-ws-client.d.ts.map +0 -1
  263. package/dist/employee-ws-client.js +0 -99
  264. package/dist/employee-ws-client.js.map +0 -1
  265. package/dist/index.d.ts +0 -6
  266. package/dist/index.d.ts.map +0 -1
  267. package/dist/index.js.map +0 -1
  268. package/templates/commands/apm-auto-dev.md +0 -6
  269. package/templates/commands/apm-fixbug.md +0 -6
  270. package/templates/commands/apm-prd-review.md +0 -6
  271. package/templates/commands/apm-prd-sync.md +0 -6
  272. package/templates/skills/apm-apply-change/SKILL.md +0 -191
  273. package/templates/skills/apm-auto-dev/SKILL.md +0 -170
  274. package/templates/skills/apm-fixbug/SKILL.md +0 -97
  275. package/templates/skills/apm-propose/SKILL.md +0 -123
  276. package/templates/skills/apm-propose/design-instruction.md +0 -94
  277. package/templates/skills/apm-propose/propose-instruction.md +0 -81
  278. package/templates/skills/apm-propose/specs-instruction.md +0 -114
  279. package/templates/skills/apm-propose/tasks-instruction.md +0 -90
  280. package/templates/skills/apm-release/SKILL.md +0 -87
  281. package/templates/skills/code-change-summary/SKILL.md +0 -84
  282. package/templates/skills/code-change-summary/summary-template.md +0 -55
  283. package/templates/skills/code-deploy/SKILL.md +0 -39
  284. package/templates/skills/prd-review/SKILL.md +0 -48
  285. package/templates/skills/prd-review/output-template.md +0 -47
  286. package/templates/skills/prd-sync/SKILL.md +0 -74
  287. package/templates/skills/prd-sync/updated-requirement-template.md +0 -39
  288. package/templates/skills/prd-testcase/SKILL.md +0 -82
  289. package/templates/skills/prd-testcase/reference.md +0 -44
  290. package/templates/skills/product-capability-inventory/SKILL.md +0 -131
  291. package/templates/skills/product-capability-inventory/template.md +0 -80
  292. package/templates/skills/product-capability-inventory//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +0 -36
  293. package/templates/skills/product-capability-inventory//347/233/256/345/275/225/350/247/204/350/214/203.md +0 -58
@@ -1,65 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.registerMinioCommands = registerMinioCommands;
4
- const minio_1 = require("minio");
5
- const apm_dotenv_1 = require("../../apm-dotenv");
6
- const config_store_1 = require("../../config-store");
7
- /** 匿名可读桶内所有对象(仅 GetObject),用于路径直链 */
8
- function buildPublicReadPolicy(bucket) {
9
- const policy = {
10
- Version: "2012-10-17",
11
- Statement: [
12
- {
13
- Effect: "Allow",
14
- Principal: { AWS: ["*"] },
15
- Action: ["s3:GetObject"],
16
- Resource: [`arn:aws:s3:::${bucket}/*`],
17
- },
18
- ],
19
- };
20
- return JSON.stringify(policy);
21
- }
22
- function registerMinioCommands(program) {
23
- const minio = program
24
- .command("minio")
25
- .description("MinIO 辅助(读取当前目录 `.apm/.env` 中的 MINIO_*,已有环境变量优先)");
26
- minio
27
- .command("set-public-read")
28
- .description("为 MINIO_BUCKET 设置匿名可读对象策略(解决 HTTP 直链 AccessDenied,需账号有 setBucketPolicy 权限)")
29
- .action(async () => {
30
- const resolved = (0, config_store_1.resolveMinioSettings)();
31
- if (!resolved.ok) {
32
- console.error(resolved.error);
33
- const envPath = (0, apm_dotenv_1.getLoadedApmDotEnvPath)();
34
- if (envPath) {
35
- console.error(`已加载:${envPath}`);
36
- }
37
- else {
38
- console.error("未找到当前目录下 `.apm/.env`;请在运行目录放置该文件,或在 shell 中先 export MINIO_*");
39
- }
40
- process.exit(1);
41
- }
42
- const { settings } = resolved;
43
- const client = new minio_1.Client({
44
- endPoint: settings.endpoint,
45
- port: settings.port,
46
- useSSL: settings.useSsl,
47
- accessKey: settings.accessKey,
48
- secretKey: settings.secretKey,
49
- });
50
- const bucket = settings.bucket;
51
- const exists = await client.bucketExists(bucket);
52
- if (!exists) {
53
- console.error(`桶不存在:${bucket}`);
54
- process.exit(1);
55
- }
56
- const policy = buildPublicReadPolicy(bucket);
57
- await client.setBucketPolicy(bucket, policy);
58
- console.log(JSON.stringify({
59
- ok: true,
60
- bucket,
61
- message: "已设置匿名可读(s3:GetObject)。若仍 403,请检查 MinIO 全局 Block Public Access 或网关配置。",
62
- }, null, 2));
63
- });
64
- }
65
- //# sourceMappingURL=minio.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"minio.js","sourceRoot":"","sources":["../../../src/cli/commands/minio.ts"],"names":[],"mappings":";;AAqBA,sDAqDC;AAzED,iCAA+B;AAC/B,iDAA0D;AAC1D,qDAA0D;AAE1D,qCAAqC;AACrC,SAAS,qBAAqB,CAAC,MAAc;IAC3C,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE;YACT;gBACE,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;gBACzB,MAAM,EAAE,CAAC,cAAc,CAAC;gBACxB,QAAQ,EAAE,CAAC,gBAAgB,MAAM,IAAI,CAAC;aACvC;SACF;KACF,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,kDAAkD,CAAC,CAAC;IAEnE,KAAK;SACF,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CACV,4EAA4E,CAC7E;SACA,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,QAAQ,GAAG,IAAA,mCAAoB,GAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAA,mCAAsB,GAAE,CAAC;YACzC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,6DAA6D,CAC9D,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,cAAM,CAAC;YACxB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,EAAE,EAAE,IAAI;YACR,MAAM;YACN,OAAO,EACL,sEAAsE;SACzE,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Command } from "commander";
2
- export declare function registerPublishCommands(program: Command): void;
3
- //# sourceMappingURL=publish.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuI9D"}
@@ -1,130 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.registerPublishCommands = registerPublishCommands;
7
- const node_path_1 = __importDefault(require("node:path"));
8
- const client_1 = __importDefault(require("../../api/client"));
9
- const apm_config_1 = require("../../core/apm-config");
10
- const minio_1 = require("../../core/minio");
11
- function registerPublishCommands(program) {
12
- program
13
- .command("publish")
14
- .description("递归上传前端产物目录到 MinIO,并在成功后为该桶设置匿名可读策略(仅读取当前目录下 `.apm/.env` 中的 MINIO_*,已有环境变量优先)")
15
- .argument("<name>", "分支名,作为对象键顶层目录")
16
- .option("--env <env_tag>", "环境标签", "测试环境,正式环境")
17
- .option("--dir <dir>", "产物目录(默认 dist)", "dist")
18
- .option("--requirement-id <requirement_id>", "需求 ID(上传成功后登记前端环境)", (v) => {
19
- const n = Number.parseInt(String(v), 10);
20
- if (!Number.isFinite(n) || n < 1) {
21
- throw new Error("--requirement-id 须为正整数");
22
- }
23
- return n;
24
- })
25
- .option("--max-file-size-mb <mb>", `单文件大小上限,默认 ${minio_1.DEFAULT_MAX_FILE_SIZE_MB}`, (v) => Number.parseInt(String(v), 10))
26
- .action(async (name, opts) => {
27
- const { frontendDeploy: settings } = (0, apm_config_1.loadApmConfig)();
28
- const minio = new minio_1.MinioClient({
29
- endPoint: settings.endpoint,
30
- port: settings.port,
31
- useSSL: settings.useSsl,
32
- accessKey: settings.accessKey,
33
- secretKey: settings.secretKey,
34
- });
35
- const bucket = settings.bucket;
36
- const branchName = normalizeBranchName(name);
37
- if (!branchName) {
38
- console.error("请传入有效的分支名(第一个位置参数 <name>)");
39
- process.exit(1);
40
- }
41
- const cleanBranch = sanitizeBranchName(branchName);
42
- const root = node_path_1.default.resolve(process.cwd(), opts.dir || "dist");
43
- if (!(await (0, minio_1.isDirectoryPath)(root))) {
44
- console.error(`产物目录不存在:${root}`);
45
- process.exit(1);
46
- }
47
- const maxBytes = Math.max(1, Number.isFinite(opts.maxFileSizeMb)
48
- ? Math.floor((opts.maxFileSizeMb ?? minio_1.DEFAULT_MAX_FILE_SIZE_MB) * 1024 * 1024)
49
- : minio_1.DEFAULT_MAX_FILE_SIZE_MB * 1024 * 1024);
50
- const files = await (0, minio_1.collectFiles)(root);
51
- if (files.length === 0) {
52
- console.error(`目录为空:${root}`);
53
- process.exit(1);
54
- }
55
- let uploaded = 0;
56
- let totalBytes = 0;
57
- console.error(`开始直连 MinIO 上传,共 ${files.length} 个文件…`);
58
- await minio.ensureBucket(bucket);
59
- // 只清理与上传目录对应的对象前缀,避免误删同一分支下其它目录内容
60
- await minio.deleteObjectsByPrefix(bucket, `${cleanBranch}/dist/`);
61
- for (const f of files) {
62
- if (f.size > maxBytes) {
63
- console.error(`文件过大,已拒绝:${f.relativePath}(${(0, minio_1.toMB)(f.size)}MB > ${(0, minio_1.toMB)(maxBytes)}MB)`);
64
- process.exit(1);
65
- }
66
- const buf = await (0, minio_1.readArtifactFile)(f.absPath);
67
- const cleanRel = (0, minio_1.sanitizeRelativePath)(f.relativePath);
68
- const objectKey = (0, minio_1.toArtifactObjectKey)({
69
- branchName: cleanBranch,
70
- relativePath: cleanRel,
71
- });
72
- const mimeType = (0, minio_1.detectMimeType)(f.relativePath).trim().toLowerCase() ||
73
- "application/octet-stream";
74
- await minio.putObject(bucket, objectKey, buf, {
75
- "Content-Type": mimeType,
76
- });
77
- uploaded += 1;
78
- totalBytes += buf.length;
79
- console.error(`[${uploaded}/${files.length}] ${f.relativePath} -> ${objectKey}`);
80
- }
81
- console.error("正在设置桶策略(匿名可读对象,便于 HTTP 直链)…");
82
- await minio.setBucketPublicRead(bucket);
83
- console.log(JSON.stringify({
84
- ok: true,
85
- branchName: cleanBranch,
86
- bucket,
87
- fileCount: uploaded,
88
- totalBytes,
89
- bucketPublicRead: true,
90
- }, null, 2));
91
- const envTag = resolveEnvTag(opts.env ?? "测试环境");
92
- if (opts.requirementId) {
93
- await client_1.default.cli.resourceEnvironmentCreate({
94
- requirementId: opts.requirementId,
95
- name: cleanBranch,
96
- tag: envTag,
97
- type: "FRONTEND",
98
- });
99
- }
100
- });
101
- }
102
- function sanitizeBranchName(raw) {
103
- const normalized = raw.replace(/\\/g, "/").replace(/^\/+/, "").trim();
104
- if (!normalized) {
105
- throw new Error("branchName 不能为空");
106
- }
107
- const segs = normalized.split("/");
108
- if (segs.some((s) => s === "" || s === "." || s === "..")) {
109
- throw new Error("branchName 非法");
110
- }
111
- return segs[segs.length - 1] ?? "";
112
- }
113
- function normalizeBranchName(raw) {
114
- const normalized = raw.trim().replace(/\\/g, "/").replace(/^\/+/, "");
115
- if (!normalized)
116
- return "";
117
- const segs = normalized.split("/");
118
- if (segs.some((s) => s === "" || s === "." || s === ".."))
119
- return "";
120
- return segs[segs.length - 1] ?? "";
121
- }
122
- /** `--env` 默认含逗号时取第一段作为标签(如「测试环境」) */
123
- function resolveEnvTag(raw) {
124
- const parts = raw
125
- .split(",")
126
- .map((s) => s.trim())
127
- .filter((s) => s.length > 0);
128
- return parts[0] ?? "测试环境";
129
- }
130
- //# sourceMappingURL=publish.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":";;;;;AAgBA,0DAuIC;AAvJD,0DAA6B;AAE7B,8DAAmC;AACnC,sDAAsD;AACtD,4CAU0B;AAE1B,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CACV,8EAA8E,CAC/E;SACA,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;SACnC,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,CAAC;SAC9C,MAAM,CAAC,aAAa,EAAE,eAAe,EAAE,MAAM,CAAC;SAC9C,MAAM,CACL,mCAAmC,EACnC,oBAAoB,EACpB,CAAC,CAAC,EAAE,EAAE;QACJ,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CACF;SACA,MAAM,CACL,yBAAyB,EACzB,cAAc,gCAAwB,EAAE,EACxC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACtC;SACA,MAAM,CACL,KAAK,EACH,IAAY,EACZ,IAKC,EACD,EAAE;QACF,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,IAAA,0BAAa,GAAE,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,mBAAW,CAAC;YAC5B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAE/B,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,CAAC,MAAM,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;YACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CACR,CAAC,IAAI,CAAC,aAAa,IAAI,gCAAwB,CAAC,GAAG,IAAI,GAAG,IAAI,CAC/D;YACH,CAAC,CAAC,gCAAwB,GAAG,IAAI,GAAG,IAAI,CAC3C,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,IAAA,oBAAY,EAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,mBAAmB,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC;QAEtD,MAAM,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACjC,kCAAkC;QAClC,MAAM,KAAK,CAAC,qBAAqB,CAAC,MAAM,EAAE,GAAG,WAAW,QAAQ,CAAC,CAAC;QAElE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CACX,YAAY,CAAC,CAAC,YAAY,IAAI,IAAA,YAAI,EAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAA,YAAI,EACpD,QAAQ,CACT,KAAK,CACP,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAA,wBAAgB,EAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,IAAA,4BAAoB,EAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,IAAA,2BAAmB,EAAC;gBACpC,UAAU,EAAE,WAAW;gBACvB,YAAY,EAAE,QAAQ;aACvB,CAAC,CAAC;YACH,MAAM,QAAQ,GACZ,IAAA,sBAAc,EAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnD,0BAA0B,CAAC;YAC7B,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE;gBAC5C,cAAc,EAAE,QAAQ;aACzB,CAAC,CAAC;YACH,QAAQ,IAAI,CAAC,CAAC;YACd,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC;YACzB,OAAO,CAAC,KAAK,CACX,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,YAAY,OAAO,SAAS,EAAE,CAClE,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAExC,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,WAAW;YACvB,MAAM;YACN,SAAS,EAAE,QAAQ;YACnB,UAAU;YACV,gBAAgB,EAAE,IAAI;SACvB,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,gBAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC;gBACtC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,IAAI,EAAE,WAAW;gBACjB,GAAG,EAAE,MAAM;gBACX,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtE,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACrE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,sCAAsC;AACtC,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,GAAG;SACd,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;AAC5B,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Command } from "commander";
2
- export declare function registerReleaseCommands(program: Command): void;
3
- //# sourceMappingURL=release.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqC9D"}
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.registerReleaseCommands = registerReleaseCommands;
4
- const api_1 = require("../../api");
5
- function parsePositiveInt(value, name) {
6
- const n = Number.parseInt(value, 10);
7
- if (!Number.isFinite(n) || n < 1) {
8
- throw new Error(`无效的${name}: ${value}`);
9
- }
10
- return n;
11
- }
12
- function registerReleaseCommands(program) {
13
- program
14
- .command("release")
15
- .description("测试通过:需求进入待上线并创建 PR(与飞书「测试通过」一致);使用 -f / --force 时另对该 PR 执行 squash 合并")
16
- .argument("<requirementId>", "需求主键 ID")
17
- .option("-f, --force", "创建 PR 后合并(squash)")
18
- .requiredOption("-b, --branch <name>", "必填:仅对该分支名对应的开发者创建/合并 PR,或标记失败时指定同一开发分支")
19
- .option("-r, --reason <reason>", "带有该参数表示上线流程失败,并给出失败原因,一般是合并代码出现冲突了(须与 -b 同用)")
20
- .action(async (requirementIdStr, opts) => {
21
- const id = parsePositiveInt(requirementIdStr, "需求 ID");
22
- const branchName = opts.branch.trim();
23
- if (!branchName) {
24
- throw new Error("无效的 -b:分支名不能为空");
25
- }
26
- const reason = opts.reason?.trim();
27
- const api = (0, api_1.createApmClient)();
28
- await api.cli.resourceRequirementRelease({
29
- id,
30
- forceMerge: Boolean(opts.force),
31
- branchName,
32
- failureReason: reason,
33
- });
34
- console.log("操作完成");
35
- });
36
- }
37
- //# sourceMappingURL=release.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"release.js","sourceRoot":"","sources":["../../../src/cli/commands/release.ts"],"names":[],"mappings":";;AAWA,0DAqCC;AA/CD,mCAA4C;AAE5C,SAAS,gBAAgB,CAAC,KAAa,EAAE,IAAY;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CACV,sEAAsE,CACvE;SACA,QAAQ,CAAC,iBAAiB,EAAE,SAAS,CAAC;SACtC,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC;SAC1C,cAAc,CACb,qBAAqB,EACrB,wCAAwC,CACzC;SACA,MAAM,CACL,uBAAuB,EACvB,8CAA8C,CAC/C;SACA,MAAM,CACL,KAAK,EACH,gBAAwB,EACxB,IAA0D,EAC1D,EAAE;QACF,MAAM,EAAE,GAAG,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAA,qBAAe,GAAE,CAAC;QAC9B,MAAM,GAAG,CAAC,GAAG,CAAC,0BAA0B,CAAC;YACvC,EAAE;YACF,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAC/B,UAAU;YACV,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CACF,CAAC;AACN,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Command } from "commander";
2
- export declare function registerRequirementCommands(program: Command): void;
3
- //# sourceMappingURL=requirement.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"requirement.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/requirement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CASlE"}
@@ -1,169 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.registerRequirementCommands = registerRequirementCommands;
4
- const promises_1 = require("node:fs/promises");
5
- const credentials_1 = require("../credentials");
6
- const exit_api_error_1 = require("../exit-api-error");
7
- function registerRequirementCommands(program) {
8
- const req = program
9
- .command("requirement")
10
- .description("需求相关子命令(测试用例、分支、缺陷等)");
11
- registerRequirementVersionCommands(req);
12
- registerRequirementTestCaseCommands(req);
13
- registerRequirementBranchCommands(req);
14
- registerRequirementDefectCommands(req);
15
- }
16
- function registerRequirementVersionCommands(req) {
17
- const reqVer = req
18
- .command("version")
19
- .description("需求内容版本(版本序号与界面 v1、v2 一致)");
20
- reqVer
21
- .command("content")
22
- .description("按需求 id 与版本序号获取该版本正文(JSON,含评论等)")
23
- .requiredOption("--requirement-id <id>", "需求 id", (v) => Number.parseInt(v, 10))
24
- .requiredOption("--version-seq <n>", "该需求下的版本序号(与界面 v1、v2 一致,非数据库 id)", (v) => Number.parseInt(v, 10))
25
- .action(async (opts) => {
26
- const api = (0, credentials_1.apiClient)();
27
- try {
28
- const list = await api.requirement.versionsList({
29
- requirementId: opts.requirementId,
30
- });
31
- const hit = list.find((v) => v.versionSeq === opts.versionSeq);
32
- if (!hit) {
33
- console.error(`未找到版本序号 ${opts.versionSeq}(该需求下共有 ${list.length} 个版本)`);
34
- process.exit(1);
35
- }
36
- console.log(JSON.stringify(hit, null, 2));
37
- }
38
- catch (e) {
39
- (0, exit_api_error_1.exitApiError)(e);
40
- }
41
- });
42
- }
43
- function registerRequirementTestCaseCommands(req) {
44
- const reqTc = req.command("test-case").description("测试用例");
45
- reqTc
46
- .command("import")
47
- .description("从 JSON 数组文件批量导入")
48
- .requiredOption("--requirement-id <id>", "需求 id", (v) => Number.parseInt(v, 10))
49
- .requiredOption("--file <path>", "UTF-8 JSON 数组,元素字段同单条创建")
50
- .action(async (opts) => {
51
- const raw = await (0, promises_1.readFile)(opts.file, "utf8");
52
- let parsed;
53
- try {
54
- parsed = JSON.parse(raw);
55
- }
56
- catch {
57
- console.error("JSON 解析失败");
58
- process.exit(1);
59
- }
60
- if (!Array.isArray(parsed) || parsed.length === 0) {
61
- console.error("文件须为非空 JSON 数组");
62
- process.exit(1);
63
- }
64
- const batch = parsed.map((item) => {
65
- if (!item || typeof item !== "object") {
66
- throw new Error("数组元素须为对象");
67
- }
68
- const o = item;
69
- return {
70
- requirementId: opts.requirementId,
71
- title: String(o.title ?? ""),
72
- steps: String(o.steps ?? ""),
73
- expectedResult: o.expectedResult !== undefined && o.expectedResult !== null
74
- ? String(o.expectedResult)
75
- : undefined,
76
- status: o.status,
77
- };
78
- });
79
- const api = (0, credentials_1.apiClient)();
80
- try {
81
- const rows = await api.requirement.testCasesCreateBatch(batch);
82
- console.log(JSON.stringify(rows, null, 2));
83
- }
84
- catch (e) {
85
- (0, exit_api_error_1.exitApiError)(e);
86
- }
87
- });
88
- }
89
- function registerRequirementBranchCommands(req) {
90
- const reqBranch = req.command("branch").description("需求分支");
91
- reqBranch
92
- .command("set-status")
93
- .description("更新分支状态:按分支记录 id,或按需求 id + 远程分支名精确匹配")
94
- .requiredOption("--status <status>", "目标状态")
95
- .option("--branch-id <id>", "分支记录 id(与 requirement-id + branch-name 二选一)", (v) => Number.parseInt(v, 10))
96
- .option("--requirement-id <id>", "需求 id", (v) => Number.parseInt(v, 10))
97
- .option("--branch-name <name>", "远程分支名(精确匹配)")
98
- .action(async (opts) => {
99
- const status = opts.status;
100
- const api = (0, credentials_1.apiClient)();
101
- const byId = opts.branchId != null &&
102
- Number.isFinite(opts.branchId) &&
103
- opts.branchId >= 1;
104
- const reqId = opts.requirementId;
105
- const name = opts.branchName?.trim() ?? "";
106
- const byReqAndName = reqId != null &&
107
- Number.isFinite(reqId) &&
108
- reqId >= 1 &&
109
- name.length > 0;
110
- if (!byId && !byReqAndName) {
111
- console.error("请使用以下之一:\n" +
112
- " apm requirement branch set-status --branch-id <id> --status <状态>\n" +
113
- " apm requirement branch set-status --requirement-id <id> --branch-name <name> --status <状态>");
114
- process.exit(1);
115
- }
116
- try {
117
- if (byId) {
118
- const row = await api.requirement.branchesUpdate({
119
- id: opts.branchId,
120
- status,
121
- });
122
- console.log(JSON.stringify(row, null, 2));
123
- return;
124
- }
125
- const list = await api.requirement.branchesList({
126
- requirementId: reqId,
127
- });
128
- const hits = list.filter((b) => b.branchName.trim() === name);
129
- if (hits.length === 0) {
130
- console.error(`未找到分支名为「${name}」的记录`);
131
- process.exit(1);
132
- }
133
- if (hits.length > 1) {
134
- console.error(`匹配到多条分支「${name}」,拒绝更新`);
135
- process.exit(1);
136
- }
137
- const row = await api.requirement.branchesUpdate({
138
- id: hits[0].id,
139
- status,
140
- });
141
- console.log(JSON.stringify(row, null, 2));
142
- }
143
- catch (e) {
144
- (0, exit_api_error_1.exitApiError)(e);
145
- }
146
- });
147
- }
148
- function registerRequirementDefectCommands(req) {
149
- const reqDefect = req.command("defect").description("缺陷");
150
- reqDefect
151
- .command("set-status")
152
- .description("更新缺陷状态")
153
- .requiredOption("--defect-id <id>", "缺陷 id", (v) => Number.parseInt(v, 10))
154
- .requiredOption("--status <status>", "目标状态")
155
- .action(async (opts) => {
156
- const api = (0, credentials_1.apiClient)();
157
- try {
158
- const row = await api.requirement.defectsUpdate({
159
- id: opts.defectId,
160
- status: opts.status,
161
- });
162
- console.log(JSON.stringify(row, null, 2));
163
- }
164
- catch (e) {
165
- (0, exit_api_error_1.exitApiError)(e);
166
- }
167
- });
168
- }
169
- //# sourceMappingURL=requirement.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"requirement.js","sourceRoot":"","sources":["../../../src/cli/commands/requirement.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { Command } from "commander";
2
- export declare function registerSetCommands(program: Command): void;
3
- //# sourceMappingURL=set.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/set.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiH1D"}
@@ -1,103 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.registerSetCommands = registerSetCommands;
7
- const node_fs_1 = require("node:fs");
8
- const node_path_1 = __importDefault(require("node:path"));
9
- const parse_testcase_md_1 = require("../../core/parse-testcase-md");
10
- const api_1 = require("../../api");
11
- function parseRequirementId(value) {
12
- const n = Number.parseInt(value, 10);
13
- if (!Number.isFinite(n) || n < 1) {
14
- throw new Error(`无效的需求 ID: ${value}`);
15
- }
16
- return n;
17
- }
18
- function registerSetCommands(program) {
19
- const setCmd = program.command("set").description("向服务端提交本地资源");
20
- setCmd
21
- .command("requirement")
22
- .description("读取本地需求正文文件并同步到服务端(默认:.apm/workitems/<需求ID>/prd.md)")
23
- .argument("<id>", "需求 ID", parseRequirementId)
24
- .action(async (id) => {
25
- const filePath = node_path_1.default.join(process.cwd(), ".apm/workitems", String(id), "prd.md");
26
- if (!(0, node_fs_1.existsSync)(filePath)) {
27
- console.error(`未找到文件: ${filePath}`);
28
- process.exit(1);
29
- }
30
- const content = (0, node_fs_1.readFileSync)(filePath, "utf8");
31
- if (!content.trim()) {
32
- console.error("需求正文为空");
33
- process.exit(1);
34
- }
35
- const api = (0, api_1.createApmClient)();
36
- const res = await api.cli.resourceRequirementContentSet({ id, content });
37
- console.log(`需求正文已同步(id=${res.id}`);
38
- });
39
- setCmd
40
- .command("comment")
41
- .description("读取 .apm/workitems/<需求ID>/comment.md 并提交评审记录(写入服务端需求字段)")
42
- .argument("<id>", "需求 ID", parseRequirementId)
43
- .action(async (id) => {
44
- const commentPath = node_path_1.default.join(process.cwd(), ".apm/workitems", String(id), "comment.md");
45
- if (!(0, node_fs_1.existsSync)(commentPath)) {
46
- console.error(`未找到文件: ${commentPath}`);
47
- process.exit(1);
48
- }
49
- const content = (0, node_fs_1.readFileSync)(commentPath, "utf8");
50
- if (!content.trim()) {
51
- console.error("comment.md 内容为空");
52
- process.exit(1);
53
- }
54
- const api = (0, api_1.createApmClient)();
55
- await api.cli.resourceRequirementCommentSet({ id, content });
56
- console.log("评审记录已提交");
57
- });
58
- setCmd
59
- .command("testcase")
60
- .description("读取 .apm/workitems/<需求ID>/testcase.md,解析为用例并批量导入服务端")
61
- .argument("<id>", "需求 ID", parseRequirementId)
62
- .action(async (id) => {
63
- const filePath = node_path_1.default.join(process.cwd(), ".apm/workitems", String(id), "testcase.md");
64
- if (!(0, node_fs_1.existsSync)(filePath)) {
65
- console.error(`未找到文件: ${filePath}`);
66
- process.exit(1);
67
- }
68
- const raw = (0, node_fs_1.readFileSync)(filePath, "utf8");
69
- if (!raw.trim()) {
70
- console.error("testcase.md 内容为空");
71
- process.exit(1);
72
- }
73
- let items;
74
- try {
75
- items = (0, parse_testcase_md_1.parseTestcaseMarkdown)(raw);
76
- }
77
- catch (e) {
78
- const msg = e instanceof Error ? e.message : String(e);
79
- console.error(`解析 testcase.md 失败: ${msg}`);
80
- process.exit(1);
81
- }
82
- const api = (0, api_1.createApmClient)();
83
- const res = await api.cli.resourceRequirementTestCasesImport({
84
- requirementId: id,
85
- items,
86
- });
87
- console.log(`测试用例已导入 ${res.count} 条(requirementId=${id})`);
88
- });
89
- setCmd
90
- .command("branchName")
91
- .description("设置当前员工在本需求下对应开发者的分支名(branchName),并将状态置为开发中(DEVELOPING)")
92
- .argument("<id>", "需求 ID", parseRequirementId)
93
- .argument("<name>", "分支名称")
94
- .action(async (id, name) => {
95
- const api = (0, api_1.createApmClient)();
96
- const res = await api.cli.resourceRequirementDeveloperBranchNameSet({
97
- id,
98
- branchName: name,
99
- });
100
- console.log(`已设置分支「${res.branchName ?? name}」,开发者状态=${res.status}`);
101
- });
102
- }
103
- //# sourceMappingURL=set.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/cli/commands/set.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { Command } from "commander";
2
- export declare function registerStatusCommands(program: Command): void;
3
- //# sourceMappingURL=status.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B7D"}
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.registerStatusCommands = registerStatusCommands;
4
- const api_1 = require("../../api");
5
- function parseStatusEntity(value) {
6
- if (value === "defect" || value === "requirement") {
7
- return value;
8
- }
9
- throw new Error(`无效的实体类型: ${value},仅支持 defect / requirement`);
10
- }
11
- function parsePositiveInt(value, name) {
12
- const n = Number.parseInt(value, 10);
13
- if (!Number.isFinite(n) || n < 1) {
14
- throw new Error(`无效的${name}: ${value}`);
15
- }
16
- return n;
17
- }
18
- function registerStatusCommands(program) {
19
- program
20
- .command("status")
21
- .description("流转实体状态:defect 按当前状态自动推进(待处理→处理中→待验证);requirement:待开发→待测试")
22
- .argument("<entity>", "实体类型:defect | requirement", parseStatusEntity)
23
- .argument("<id>", "缺陷 ID(defect)或需求 ID(requirement)")
24
- .action(async (entity, id) => {
25
- const api = (0, api_1.createApmClient)();
26
- if (entity === "defect") {
27
- const res = await api.cli.statusSet({
28
- entity,
29
- defectId: id,
30
- });
31
- console.log(`缺陷状态已流转:${res.id} -> ${res.status}`);
32
- return;
33
- }
34
- const requirementId = parsePositiveInt(id, "需求 ID");
35
- const res = await api.cli.statusSet({
36
- entity,
37
- requirementId,
38
- });
39
- console.log(`需求状态已流转:${res.id} -> ${res.status}`);
40
- });
41
- }
42
- //# sourceMappingURL=status.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":";;AAoBA,wDA0BC;AA7CD,mCAA4C;AAI5C,SAAS,iBAAiB,CAAC,KAAa;IACtC,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,2BAA2B,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,IAAY;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,0DAA0D,CAC3D;SACA,QAAQ,CAAC,UAAU,EAAE,2BAA2B,EAAE,iBAAiB,CAAC;SACpE,QAAQ,CAAC,MAAM,EAAE,kCAAkC,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,MAAoB,EAAE,EAAU,EAAE,EAAE;QACjD,MAAM,GAAG,GAAG,IAAA,qBAAe,GAAE,CAAC;QAE9B,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;gBAClC,MAAM;gBACN,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;YAClC,MAAM;YACN,aAAa;SACd,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC"}