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.
- package/dist/index.js +500 -20
- package/package.json +27 -25
- package/template/apm.config.json +5 -0
- package/template/deploy/README.md +3 -0
- package/template/skills/apm-review/SKILL.md +38 -0
- package/template/skills/apm-review/apm-review-reference.md +89 -0
- package/template/workitems/README.md +19 -0
- package/README.md +0 -171
- package/dist/api/cli.d.ts +0 -228
- package/dist/api/cli.d.ts.map +0 -1
- package/dist/api/cli.js +0 -3
- package/dist/api/cli.js.map +0 -1
- package/dist/api/client.d.ts +0 -5
- package/dist/api/client.d.ts.map +0 -1
- package/dist/api/client.js +0 -30
- package/dist/api/client.js.map +0 -1
- package/dist/api/http.d.ts +0 -21
- package/dist/api/http.d.ts.map +0 -1
- package/dist/api/http.js +0 -108
- package/dist/api/http.js.map +0 -1
- package/dist/api/index.d.ts +0 -6
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js +0 -13
- package/dist/api/index.js.map +0 -1
- package/dist/api/request-config.d.ts +0 -25
- package/dist/api/request-config.d.ts.map +0 -1
- package/dist/api/request-config.js +0 -73
- package/dist/api/request-config.js.map +0 -1
- package/dist/api/requirement.d.ts +0 -1
- package/dist/api/requirement.d.ts.map +0 -1
- package/dist/api/requirement.js +0 -2
- package/dist/api/requirement.js.map +0 -1
- package/dist/apm-dotenv.d.ts +0 -8
- package/dist/apm-dotenv.d.ts.map +0 -1
- package/dist/apm-dotenv.js +0 -73
- package/dist/apm-dotenv.js.map +0 -1
- package/dist/cli/agent-stream-log.d.ts +0 -41
- package/dist/cli/agent-stream-log.d.ts.map +0 -1
- package/dist/cli/agent-stream-log.js +0 -364
- package/dist/cli/agent-stream-log.js.map +0 -1
- package/dist/cli/commands/auth.d.ts +0 -3
- package/dist/cli/commands/auth.d.ts.map +0 -1
- package/dist/cli/commands/auth.js +0 -51
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/chat.d.ts +0 -3
- package/dist/cli/commands/chat.d.ts.map +0 -1
- package/dist/cli/commands/chat.js +0 -32
- package/dist/cli/commands/chat.js.map +0 -1
- package/dist/cli/commands/comment.d.ts +0 -3
- package/dist/cli/commands/comment.d.ts.map +0 -1
- package/dist/cli/commands/comment.js +0 -66
- package/dist/cli/commands/comment.js.map +0 -1
- package/dist/cli/commands/config.d.ts +0 -3
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js +0 -39
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/deploy-backend.d.ts +0 -7
- package/dist/cli/commands/deploy-backend.d.ts.map +0 -1
- package/dist/cli/commands/deploy-backend.js +0 -77
- package/dist/cli/commands/deploy-backend.js.map +0 -1
- package/dist/cli/commands/deploy-frontend.d.ts +0 -3
- package/dist/cli/commands/deploy-frontend.d.ts.map +0 -1
- package/dist/cli/commands/deploy-frontend.js +0 -167
- package/dist/cli/commands/deploy-frontend.js.map +0 -1
- package/dist/cli/commands/get.d.ts +0 -3
- package/dist/cli/commands/get.d.ts.map +0 -1
- package/dist/cli/commands/get.js +0 -145
- package/dist/cli/commands/get.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -3
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -179
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/minio.d.ts +0 -3
- package/dist/cli/commands/minio.d.ts.map +0 -1
- package/dist/cli/commands/minio.js +0 -65
- package/dist/cli/commands/minio.js.map +0 -1
- package/dist/cli/commands/publish.d.ts +0 -3
- package/dist/cli/commands/publish.d.ts.map +0 -1
- package/dist/cli/commands/publish.js +0 -130
- package/dist/cli/commands/publish.js.map +0 -1
- package/dist/cli/commands/release.d.ts +0 -3
- package/dist/cli/commands/release.d.ts.map +0 -1
- package/dist/cli/commands/release.js +0 -37
- package/dist/cli/commands/release.js.map +0 -1
- package/dist/cli/commands/requirement.d.ts +0 -3
- package/dist/cli/commands/requirement.d.ts.map +0 -1
- package/dist/cli/commands/requirement.js +0 -169
- package/dist/cli/commands/requirement.js.map +0 -1
- package/dist/cli/commands/set.d.ts +0 -3
- package/dist/cli/commands/set.d.ts.map +0 -1
- package/dist/cli/commands/set.js +0 -103
- package/dist/cli/commands/set.js.map +0 -1
- package/dist/cli/commands/status.d.ts +0 -3
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js +0 -42
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -3
- package/dist/cli/commands/update.d.ts.map +0 -1
- package/dist/cli/commands/update.js +0 -36
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/ws.d.ts +0 -3
- package/dist/cli/commands/ws.d.ts.map +0 -1
- package/dist/cli/commands/ws.js +0 -25
- package/dist/cli/commands/ws.js.map +0 -1
- package/dist/cli/credentials.d.ts +0 -30
- package/dist/cli/credentials.d.ts.map +0 -1
- package/dist/cli/credentials.js +0 -52
- package/dist/cli/credentials.js.map +0 -1
- package/dist/cli/exit-api-error.d.ts +0 -2
- package/dist/cli/exit-api-error.d.ts.map +0 -1
- package/dist/cli/exit-api-error.js +0 -18
- package/dist/cli/exit-api-error.js.map +0 -1
- package/dist/cli/instruction-log-stream-sink.d.ts +0 -31
- package/dist/cli/instruction-log-stream-sink.d.ts.map +0 -1
- package/dist/cli/instruction-log-stream-sink.js +0 -59
- package/dist/cli/instruction-log-stream-sink.js.map +0 -1
- package/dist/cli/session.d.ts +0 -26
- package/dist/cli/session.d.ts.map +0 -1
- package/dist/cli/session.js +0 -41
- package/dist/cli/session.js.map +0 -1
- package/dist/cli/utils/parse.d.ts +0 -2
- package/dist/cli/utils/parse.d.ts.map +0 -1
- package/dist/cli/utils/parse.js +0 -12
- package/dist/cli/utils/parse.js.map +0 -1
- package/dist/cli/ws-run-command.d.ts +0 -13
- package/dist/cli/ws-run-command.d.ts.map +0 -1
- package/dist/cli/ws-run-command.js +0 -330
- package/dist/cli/ws-run-command.js.map +0 -1
- package/dist/cli-version.d.ts +0 -9
- package/dist/cli-version.d.ts.map +0 -1
- package/dist/cli-version.js +0 -61
- package/dist/cli-version.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -36
- package/dist/cli.js.map +0 -1
- package/dist/config-store.d.ts +0 -38
- package/dist/config-store.d.ts.map +0 -1
- package/dist/config-store.js +0 -131
- package/dist/config-store.js.map +0 -1
- package/dist/core/apm-config.d.ts +0 -81
- package/dist/core/apm-config.d.ts.map +0 -1
- package/dist/core/apm-config.js +0 -147
- package/dist/core/apm-config.js.map +0 -1
- package/dist/core/backend-deploy/backend-deploy-workflow.d.ts +0 -20
- package/dist/core/backend-deploy/backend-deploy-workflow.d.ts.map +0 -1
- package/dist/core/backend-deploy/backend-deploy-workflow.js +0 -86
- package/dist/core/backend-deploy/backend-deploy-workflow.js.map +0 -1
- package/dist/core/backend-deploy/command-runner.d.ts +0 -11
- package/dist/core/backend-deploy/command-runner.d.ts.map +0 -1
- package/dist/core/backend-deploy/command-runner.js +0 -47
- package/dist/core/backend-deploy/command-runner.js.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/client.d.ts +0 -18
- package/dist/core/backend-deploy/dockerode-client/client.d.ts.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/client.js +0 -114
- package/dist/core/backend-deploy/dockerode-client/client.js.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/connection-options.d.ts +0 -6
- package/dist/core/backend-deploy/dockerode-client/connection-options.d.ts.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/connection-options.js +0 -62
- package/dist/core/backend-deploy/dockerode-client/connection-options.js.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/container-inspect-format.d.ts +0 -3
- package/dist/core/backend-deploy/dockerode-client/container-inspect-format.d.ts.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/container-inspect-format.js +0 -23
- package/dist/core/backend-deploy/dockerode-client/container-inspect-format.js.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/container-options.d.ts +0 -4
- package/dist/core/backend-deploy/dockerode-client/container-options.d.ts.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/container-options.js +0 -44
- package/dist/core/backend-deploy/dockerode-client/container-options.js.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/env.d.ts +0 -3
- package/dist/core/backend-deploy/dockerode-client/env.d.ts.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/env.js +0 -40
- package/dist/core/backend-deploy/dockerode-client/env.js.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/index.d.ts +0 -8
- package/dist/core/backend-deploy/dockerode-client/index.d.ts.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/index.js +0 -17
- package/dist/core/backend-deploy/dockerode-client/index.js.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/ports.d.ts +0 -9
- package/dist/core/backend-deploy/dockerode-client/ports.d.ts.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/ports.js +0 -35
- package/dist/core/backend-deploy/dockerode-client/ports.js.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/runtime.d.ts +0 -7
- package/dist/core/backend-deploy/dockerode-client/runtime.d.ts.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/runtime.js +0 -26
- package/dist/core/backend-deploy/dockerode-client/runtime.js.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/types.d.ts +0 -64
- package/dist/core/backend-deploy/dockerode-client/types.d.ts.map +0 -1
- package/dist/core/backend-deploy/dockerode-client/types.js +0 -3
- package/dist/core/backend-deploy/dockerode-client/types.js.map +0 -1
- package/dist/core/backend-deploy/image-tag.d.ts +0 -2
- package/dist/core/backend-deploy/image-tag.d.ts.map +0 -1
- package/dist/core/backend-deploy/image-tag.js +0 -15
- package/dist/core/backend-deploy/image-tag.js.map +0 -1
- package/dist/core/backend-deploy/index.d.ts +0 -3
- package/dist/core/backend-deploy/index.d.ts.map +0 -1
- package/dist/core/backend-deploy/index.js +0 -6
- package/dist/core/backend-deploy/index.js.map +0 -1
- package/dist/core/backend-deploy/local-docker-build.d.ts +0 -8
- package/dist/core/backend-deploy/local-docker-build.d.ts.map +0 -1
- package/dist/core/backend-deploy/local-docker-build.js +0 -25
- package/dist/core/backend-deploy/local-docker-build.js.map +0 -1
- package/dist/core/backend-deploy/logger.d.ts +0 -10
- package/dist/core/backend-deploy/logger.d.ts.map +0 -1
- package/dist/core/backend-deploy/logger.js +0 -22
- package/dist/core/backend-deploy/logger.js.map +0 -1
- package/dist/core/backend-deploy/registry-login-push.d.ts +0 -24
- package/dist/core/backend-deploy/registry-login-push.d.ts.map +0 -1
- package/dist/core/backend-deploy/registry-login-push.js +0 -37
- package/dist/core/backend-deploy/registry-login-push.js.map +0 -1
- package/dist/core/backend-deploy/remote-docker-client.d.ts +0 -11
- package/dist/core/backend-deploy/remote-docker-client.d.ts.map +0 -1
- package/dist/core/backend-deploy/remote-docker-client.js +0 -34
- package/dist/core/backend-deploy/remote-docker-client.js.map +0 -1
- package/dist/core/backend-deploy/remote-pull-image.d.ts +0 -9
- package/dist/core/backend-deploy/remote-pull-image.d.ts.map +0 -1
- package/dist/core/backend-deploy/remote-pull-image.js +0 -39
- package/dist/core/backend-deploy/remote-pull-image.js.map +0 -1
- package/dist/core/backend-deploy/resolve-dockerfile.d.ts +0 -7
- package/dist/core/backend-deploy/resolve-dockerfile.d.ts.map +0 -1
- package/dist/core/backend-deploy/resolve-dockerfile.js +0 -24
- package/dist/core/backend-deploy/resolve-dockerfile.js.map +0 -1
- package/dist/core/backend-deploy/run-docker-cli.d.ts +0 -9
- package/dist/core/backend-deploy/run-docker-cli.d.ts.map +0 -1
- package/dist/core/backend-deploy/run-docker-cli.js +0 -14
- package/dist/core/backend-deploy/run-docker-cli.js.map +0 -1
- package/dist/core/backend-deploy/types.d.ts +0 -23
- package/dist/core/backend-deploy/types.d.ts.map +0 -1
- package/dist/core/backend-deploy/types.js +0 -3
- package/dist/core/backend-deploy/types.js.map +0 -1
- package/dist/core/branch-name.d.ts +0 -8
- package/dist/core/branch-name.d.ts.map +0 -1
- package/dist/core/branch-name.js +0 -37
- package/dist/core/branch-name.js.map +0 -1
- package/dist/core/constants.d.ts +0 -4
- package/dist/core/constants.d.ts.map +0 -1
- package/dist/core/constants.js +0 -16
- package/dist/core/constants.js.map +0 -1
- package/dist/core/cursor-cmd.d.ts +0 -30
- package/dist/core/cursor-cmd.d.ts.map +0 -1
- package/dist/core/cursor-cmd.js +0 -193
- package/dist/core/cursor-cmd.js.map +0 -1
- package/dist/core/minio.d.ts +0 -37
- package/dist/core/minio.d.ts.map +0 -1
- package/dist/core/minio.js +0 -159
- package/dist/core/minio.js.map +0 -1
- package/dist/core/parse-testcase-md.d.ts +0 -17
- package/dist/core/parse-testcase-md.d.ts.map +0 -1
- package/dist/core/parse-testcase-md.js +0 -79
- package/dist/core/parse-testcase-md.js.map +0 -1
- package/dist/core/std-event-handler.d.ts +0 -25
- package/dist/core/std-event-handler.d.ts.map +0 -1
- package/dist/core/std-event-handler.js +0 -90
- package/dist/core/std-event-handler.js.map +0 -1
- package/dist/core/utils.d.ts +0 -19
- package/dist/core/utils.d.ts.map +0 -1
- package/dist/core/utils.js +0 -71
- package/dist/core/utils.js.map +0 -1
- package/dist/core/ws-client.d.ts +0 -29
- package/dist/core/ws-client.d.ts.map +0 -1
- package/dist/core/ws-client.js +0 -81
- package/dist/core/ws-client.js.map +0 -1
- package/dist/employee-ws-client.d.ts +0 -42
- package/dist/employee-ws-client.d.ts.map +0 -1
- package/dist/employee-ws-client.js +0 -99
- package/dist/employee-ws-client.js.map +0 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/templates/commands/apm-auto-dev.md +0 -6
- package/templates/commands/apm-fixbug.md +0 -6
- package/templates/commands/apm-prd-review.md +0 -6
- package/templates/commands/apm-prd-sync.md +0 -6
- package/templates/skills/apm-apply-change/SKILL.md +0 -191
- package/templates/skills/apm-auto-dev/SKILL.md +0 -170
- package/templates/skills/apm-fixbug/SKILL.md +0 -97
- package/templates/skills/apm-propose/SKILL.md +0 -123
- package/templates/skills/apm-propose/design-instruction.md +0 -94
- package/templates/skills/apm-propose/propose-instruction.md +0 -81
- package/templates/skills/apm-propose/specs-instruction.md +0 -114
- package/templates/skills/apm-propose/tasks-instruction.md +0 -90
- package/templates/skills/apm-release/SKILL.md +0 -87
- package/templates/skills/code-change-summary/SKILL.md +0 -84
- package/templates/skills/code-change-summary/summary-template.md +0 -55
- package/templates/skills/code-deploy/SKILL.md +0 -39
- package/templates/skills/prd-review/SKILL.md +0 -48
- package/templates/skills/prd-review/output-template.md +0 -47
- package/templates/skills/prd-sync/SKILL.md +0 -74
- package/templates/skills/prd-sync/updated-requirement-template.md +0 -39
- package/templates/skills/prd-testcase/SKILL.md +0 -82
- package/templates/skills/prd-testcase/reference.md +0 -44
- package/templates/skills/product-capability-inventory/SKILL.md +0 -131
- package/templates/skills/product-capability-inventory/template.md +0 -80
- package/templates/skills/product-capability-inventory//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +0 -36
- 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 +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":"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"}
|
|
@@ -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 +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 +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"}
|
package/dist/cli/commands/set.js
DELETED
|
@@ -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 +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"}
|