ai-project-manage-cli 2.0.2 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/cli.d.ts +29 -0
- package/dist/api/cli.d.ts.map +1 -1
- package/dist/api/client.d.ts +2 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/index.d.ts +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/request-config.d.ts +3 -1
- package/dist/api/request-config.d.ts.map +1 -1
- package/dist/api/request-config.js +8 -0
- package/dist/api/request-config.js.map +1 -1
- package/dist/cli/commands/config.js +2 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/get.d.ts +3 -0
- package/dist/cli/commands/get.d.ts.map +1 -0
- package/dist/cli/commands/get.js +36 -0
- package/dist/cli/commands/get.js.map +1 -0
- package/dist/cli/commands/set.d.ts +3 -0
- package/dist/cli/commands/set.d.ts.map +1 -0
- package/dist/cli/commands/set.js +38 -0
- package/dist/cli/commands/set.js.map +1 -0
- package/dist/cli/commands/update.js +1 -1
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/ws.d.ts.map +1 -1
- package/dist/cli/commands/ws.js +2 -2
- package/dist/cli/commands/ws.js.map +1 -1
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/apm-config.d.ts +5 -2
- package/dist/core/apm-config.d.ts.map +1 -1
- package/dist/core/apm-config.js +9 -4
- package/dist/core/apm-config.js.map +1 -1
- package/package.json +1 -1
- package/templates/skills/requirement-review/SKILL.md +11 -27
package/dist/api/cli.d.ts
CHANGED
|
@@ -27,4 +27,33 @@ export type ResCliLoginByEmployee = {
|
|
|
27
27
|
token: string;
|
|
28
28
|
id: number;
|
|
29
29
|
};
|
|
30
|
+
/** 对应 lpm-server `POST /cli/resource/requirement` */
|
|
31
|
+
export type ReqCliResourceRequirementGet = {
|
|
32
|
+
id: number;
|
|
33
|
+
};
|
|
34
|
+
export type ResCliResourceRequirementGet = {
|
|
35
|
+
id: number;
|
|
36
|
+
spaceId: string;
|
|
37
|
+
workitemId: string;
|
|
38
|
+
content: string;
|
|
39
|
+
previousContent: string | null;
|
|
40
|
+
status: string;
|
|
41
|
+
isReviewCompleted: boolean;
|
|
42
|
+
};
|
|
43
|
+
/** 对应 lpm-server `POST /cli/resource/requirement/comment`(更新 RequirementDeveloper) */
|
|
44
|
+
export type ReqCliResourceRequirementCommentSet = {
|
|
45
|
+
id: number;
|
|
46
|
+
content: string;
|
|
47
|
+
};
|
|
48
|
+
export type ResCliResourceRequirementCommentSet = {
|
|
49
|
+
id: number;
|
|
50
|
+
workitemId: string;
|
|
51
|
+
title: string;
|
|
52
|
+
workdirId: number;
|
|
53
|
+
model: string;
|
|
54
|
+
status: string;
|
|
55
|
+
reviewResult: string | null;
|
|
56
|
+
reviewReply: string | null;
|
|
57
|
+
branchName: string | null;
|
|
58
|
+
};
|
|
30
59
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/api/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/api/cli.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEtC,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEF,gEAAgE;AAChE,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/api/cli.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEtC,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEF,gEAAgE;AAChE,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,4BAA4B,GAAG;IACzC,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,sFAAsF;AACtF,MAAM,MAAM,mCAAmC,GAAG;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC"}
|
package/dist/api/client.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export declare function createApmClient(options: CreateApmClientOptions): ApmCli
|
|
|
11
11
|
declare const api: ApiClient<{
|
|
12
12
|
readonly cli: {
|
|
13
13
|
readonly variablesGet: import("listpage-http").EndpointConfig<void, import("./cli").ResCliVariables>;
|
|
14
|
+
readonly resourceRequirementGet: import("listpage-http").EndpointConfig<import("./cli").ReqCliResourceRequirementGet, import("./cli").ResCliResourceRequirementGet>;
|
|
15
|
+
readonly resourceRequirementCommentSet: import("listpage-http").EndpointConfig<import("./cli").ReqCliResourceRequirementCommentSet, import("./cli").ResCliResourceRequirementCommentSet>;
|
|
14
16
|
};
|
|
15
17
|
readonly employee: {
|
|
16
18
|
readonly auth: import("listpage-http").EndpointConfig<import("./cli").ReqCliLoginByEmployee, import("./cli").ResCliLoginByEmployee>;
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,MAAM,sBAAsB,GAAG;IACnC,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAMF,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,aAAa,CAAC,CAAC;AAExD,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,SAAS,CAkB1E;AAID,QAAA,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,MAAM,sBAAsB,GAAG;IACnC,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAMF,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,aAAa,CAAC,CAAC;AAExD,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,SAAS,CAkB1E;AAID,QAAA,MAAM,GAAG;;;;;;;;;EAGP,CAAC;AAEH,eAAe,GAAG,CAAC"}
|
package/dist/api/index.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ export type { ApiClient } from "listpage-http";
|
|
|
2
2
|
export { ApiError, ERROR_CODE_NETWORK, RequestTimeoutException, defineEndpoint, } from "listpage-http";
|
|
3
3
|
export { createApmClient, type ApmClient, type CreateApmClientOptions, } from "./client";
|
|
4
4
|
export { requestConfig, type RequestConfig } from "./request-config";
|
|
5
|
-
export type { ReqCliLoginByEmployee, ReqCliVariablesGet, ResCliLoginByEmployee, ResCliVariables, } from "./cli";
|
|
5
|
+
export type { ReqCliLoginByEmployee, ReqCliResourceRequirementCommentSet, ReqCliResourceRequirementGet, ReqCliVariablesGet, ResCliLoginByEmployee, ResCliResourceRequirementCommentSet, ResCliResourceRequirementGet, ResCliVariables, } from "./cli";
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EACf,KAAK,SAAS,EACd,KAAK,sBAAsB,GAC5B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,GAChB,MAAM,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EACf,KAAK,SAAS,EACd,KAAK,sBAAsB,GAC5B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,YAAY,EACV,qBAAqB,EACrB,mCAAmC,EACnC,4BAA4B,EAC5B,kBAAkB,EAClB,qBAAqB,EACrB,mCAAmC,EACnC,4BAA4B,EAC5B,eAAe,GAChB,MAAM,OAAO,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import type { ReqCliLoginByEmployee, ResCliLoginByEmployee, ResCliVariables } from "./cli";
|
|
1
|
+
import type { ReqCliLoginByEmployee, ReqCliResourceRequirementCommentSet, ReqCliResourceRequirementGet, ResCliLoginByEmployee, ResCliResourceRequirementCommentSet, ResCliResourceRequirementGet, ResCliVariables } from "./cli";
|
|
2
2
|
export declare const requestConfig: {
|
|
3
3
|
readonly cli: {
|
|
4
4
|
readonly variablesGet: import("listpage-http").EndpointConfig<void, ResCliVariables>;
|
|
5
|
+
readonly resourceRequirementGet: import("listpage-http").EndpointConfig<ReqCliResourceRequirementGet, ResCliResourceRequirementGet>;
|
|
6
|
+
readonly resourceRequirementCommentSet: import("listpage-http").EndpointConfig<ReqCliResourceRequirementCommentSet, ResCliResourceRequirementCommentSet>;
|
|
5
7
|
};
|
|
6
8
|
readonly employee: {
|
|
7
9
|
/** 登录等鉴权(路径落在 `/cli/employee/auth`,便于与业务接口区分) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-config.d.ts","sourceRoot":"","sources":["../../src/api/request-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qBAAqB,
|
|
1
|
+
{"version":3,"file":"request-config.d.ts","sourceRoot":"","sources":["../../src/api/request-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qBAAqB,EACrB,mCAAmC,EACnC,4BAA4B,EAE5B,qBAAqB,EACrB,mCAAmC,EACnC,4BAA4B,EAC5B,eAAe,EAChB,MAAM,OAAO,CAAC;AAEf,eAAO,MAAM,aAAa;;;;;;;QAsBtB,iDAAiD;;;CAO3C,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC"}
|
|
@@ -8,6 +8,14 @@ exports.requestConfig = {
|
|
|
8
8
|
method: "POST",
|
|
9
9
|
path: "/cli/variables/get",
|
|
10
10
|
}),
|
|
11
|
+
resourceRequirementGet: (0, listpage_http_1.defineEndpoint)({
|
|
12
|
+
method: "POST",
|
|
13
|
+
path: "/cli/resource/requirement",
|
|
14
|
+
}),
|
|
15
|
+
resourceRequirementCommentSet: (0, listpage_http_1.defineEndpoint)({
|
|
16
|
+
method: "POST",
|
|
17
|
+
path: "/cli/resource/requirement/comment",
|
|
18
|
+
}),
|
|
11
19
|
},
|
|
12
20
|
employee: {
|
|
13
21
|
/** 登录等鉴权(路径落在 `/cli/employee/auth`,便于与业务接口区分) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-config.js","sourceRoot":"","sources":["../../src/api/request-config.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;
|
|
1
|
+
{"version":3,"file":"request-config.js","sourceRoot":"","sources":["../../src/api/request-config.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAalC,QAAA,aAAa,GAAG;IAC3B,GAAG,EAAE;QACH,YAAY,EAAE,IAAA,8BAAc,EAAsC;YAChE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,oBAAoB;SAC3B,CAAC;QACF,sBAAsB,EAAE,IAAA,8BAAc,EAGpC;YACA,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,2BAA2B;SAClC,CAAC;QACF,6BAA6B,EAAE,IAAA,8BAAc,EAG3C;YACA,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,mCAAmC;SAC1C,CAAC;KACH;IACD,QAAQ,EAAE;QACR,iDAAiD;QACjD,IAAI,EAAE,IAAA,8BAAc,EAA+C;YACjE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,oBAAoB;YAC1B,YAAY,EAAE,KAAK;SACpB,CAAC;KACH;CACO,CAAC"}
|
|
@@ -11,11 +11,11 @@ function registerConfigCommands(program) {
|
|
|
11
11
|
.option("--url <url>", "服务根地址")
|
|
12
12
|
.action(async (id, opts) => {
|
|
13
13
|
if ((0, apm_config_1.isApmConfigExists)()) {
|
|
14
|
-
await (0, apm_config_1.syncApmConfig)();
|
|
14
|
+
await (0, apm_config_1.syncApmConfig)({ id: Number(id), url: opts.url });
|
|
15
15
|
console.log("APM 配置已存在,已为您更新");
|
|
16
16
|
}
|
|
17
17
|
else {
|
|
18
|
-
|
|
18
|
+
(0, apm_config_1.createApmConfig)({ id: Number(id), url: opts.url });
|
|
19
19
|
console.log("已为您创建 APM 配置");
|
|
20
20
|
}
|
|
21
21
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":";;AAOA,wDAiBC;AAvBD,sDAI+B;AAE/B,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAEnE,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,2BAA2B,CAAC;SACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;SACxB,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC;SAC9B,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAAsB,EAAE,EAAE;QACnD,IAAI,IAAA,8BAAiB,GAAE,EAAE,CAAC;YACxB,MAAM,IAAA,0BAAa,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":";;AAOA,wDAiBC;AAvBD,sDAI+B;AAE/B,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAEnE,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,2BAA2B,CAAC;SACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;SACxB,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC;SAC9B,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAAsB,EAAE,EAAE;QACnD,IAAI,IAAA,8BAAiB,GAAE,EAAE,CAAC;YACxB,MAAM,IAAA,0BAAa,EAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAA,4BAAe,EAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/get.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmB1D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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.registerGetCommands = registerGetCommands;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const client_1 = __importDefault(require("../../api/client"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
function parseRequirementId(value) {
|
|
11
|
+
const n = Number.parseInt(value, 10);
|
|
12
|
+
if (!Number.isFinite(n) || n < 1) {
|
|
13
|
+
throw new Error(`无效的需求 ID: ${value}`);
|
|
14
|
+
}
|
|
15
|
+
return n;
|
|
16
|
+
}
|
|
17
|
+
function registerGetCommands(program) {
|
|
18
|
+
const getCmd = program.command("get").description("从服务端拉取资源");
|
|
19
|
+
getCmd
|
|
20
|
+
.command("requirement")
|
|
21
|
+
.description("按需求 ID 获取需求文档正文")
|
|
22
|
+
.argument("<id>", "需求 ID", parseRequirementId)
|
|
23
|
+
.action(async (id) => {
|
|
24
|
+
const res = await client_1.default.cli.resourceRequirementGet({ id });
|
|
25
|
+
if (!res.content) {
|
|
26
|
+
throw new Error("需求文档内容为空");
|
|
27
|
+
}
|
|
28
|
+
const prdPath = path_1.default.join(".apm/workitems", String(id), "prd.md");
|
|
29
|
+
(0, node_fs_1.writeFileSync)(prdPath, res.content);
|
|
30
|
+
console.log(`需求内容如下(已保存到 ${prdPath}):`);
|
|
31
|
+
console.log("--------------------------------");
|
|
32
|
+
console.log(res.content);
|
|
33
|
+
console.log("--------------------------------");
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/cli/commands/get.ts"],"names":[],"mappings":";;;;;AAaA,kDAmBC;AAhCD,qCAAwC;AAExC,8DAAmC;AACnC,gDAAwB;AAExB,SAAS,kBAAkB,CAAC,KAAa;IACvC,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,aAAa,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE9D,MAAM;SACH,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,iBAAiB,CAAC;SAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,MAAM,gBAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAA,uBAAa,EAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
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;AAWzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4B1D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 client_1 = __importDefault(require("../../api/client"));
|
|
10
|
+
function parseRequirementId(value) {
|
|
11
|
+
const n = Number.parseInt(value, 10);
|
|
12
|
+
if (!Number.isFinite(n) || n < 1) {
|
|
13
|
+
throw new Error(`无效的需求 ID: ${value}`);
|
|
14
|
+
}
|
|
15
|
+
return n;
|
|
16
|
+
}
|
|
17
|
+
function registerSetCommands(program) {
|
|
18
|
+
const setCmd = program.command("set").description("向服务端提交本地资源");
|
|
19
|
+
setCmd
|
|
20
|
+
.command("comment")
|
|
21
|
+
.description("读取 .apm/workitems/<需求ID>/comment.md 并提交评审记录(写入服务端需求字段)")
|
|
22
|
+
.argument("<id>", "需求 ID", parseRequirementId)
|
|
23
|
+
.action(async (id) => {
|
|
24
|
+
const commentPath = node_path_1.default.join(process.cwd(), ".apm/workitems", String(id), "comment.md");
|
|
25
|
+
if (!(0, node_fs_1.existsSync)(commentPath)) {
|
|
26
|
+
console.error(`未找到文件: ${commentPath}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const content = (0, node_fs_1.readFileSync)(commentPath, "utf8");
|
|
30
|
+
if (!content.trim()) {
|
|
31
|
+
console.error("comment.md 内容为空");
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
await client_1.default.cli.resourceRequirementCommentSet({ id, content });
|
|
35
|
+
console.log("评审记录已提交");
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/cli/commands/set.ts"],"names":[],"mappings":";;;;;AAaA,kDA4BC;AAzCD,qCAAmD;AACnD,0DAA6B;AAE7B,8DAAmC;AAEnC,SAAS,kBAAkB,CAAC,KAAa;IACvC,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,aAAa,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAEhE,MAAM;SACH,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CACV,wDAAwD,CACzD;SACA,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,WAAW,GAAG,mBAAI,CAAC,IAAI,CAC3B,OAAO,CAAC,GAAG,EAAE,EACb,gBAAgB,EAChB,MAAM,CAAC,EAAE,CAAC,EACV,YAAY,CACb,CAAC;QACF,IAAI,CAAC,IAAA,oBAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,UAAU,WAAW,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,gBAAG,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -9,7 +9,7 @@ function npmExecutable() {
|
|
|
9
9
|
function registerUpdateCommands(program) {
|
|
10
10
|
program
|
|
11
11
|
.command("update")
|
|
12
|
-
.description(
|
|
12
|
+
.description(`通过 npm 全局安装本 CLI 的最新版本(npm install -g ${constants_1.PACKAGE_NAME}@latest)`)
|
|
13
13
|
.action(async () => {
|
|
14
14
|
const name = constants_1.PACKAGE_NAME;
|
|
15
15
|
const args = ["install", "-g", `${name}@latest`];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":";;AAQA,wDA4BC;AApCD,2DAA2C;AAE3C,oDAAoD;AAEpD,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1D,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":";;AAQA,wDA4BC;AApCD,2DAA2C;AAE3C,oDAAoD;AAEpD,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1D,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,yCAAyC,wBAAY,UAAU,CAChE;SACA,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,wBAAY,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,aAAa,EAAE,EAAE,IAAI,EAAE;YACzC,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBACjC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC1C,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ws.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ws.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkBzD"}
|
package/dist/cli/commands/ws.js
CHANGED
|
@@ -4,8 +4,8 @@ exports.registerWsCommands = registerWsCommands;
|
|
|
4
4
|
const ws_client_1 = require("../../core/ws-client");
|
|
5
5
|
function registerWsCommands(program) {
|
|
6
6
|
program
|
|
7
|
-
.command("
|
|
8
|
-
.description("启动员工 WebSocket
|
|
7
|
+
.command("connect")
|
|
8
|
+
.description("启动员工 WebSocket 客户端(Ctrl+C 退出)")
|
|
9
9
|
.action(() => {
|
|
10
10
|
const ws = new ws_client_1.EmployeeWebSocketClient();
|
|
11
11
|
const shutdown = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../../src/cli/commands/ws.ts"],"names":[],"mappings":";;AAGA,
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../../src/cli/commands/ws.ts"],"names":[],"mappings":";;AAGA,gDAkBC;AApBD,oDAA+D;AAE/D,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,EAAE,GAAG,IAAI,mCAAuB,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,IAAI,CAAC;gBACH,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -4,8 +4,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
5
|
const auth_1 = require("./cli/commands/auth");
|
|
6
6
|
const config_1 = require("./cli/commands/config");
|
|
7
|
+
const get_1 = require("./cli/commands/get");
|
|
7
8
|
const init_1 = require("./cli/commands/init");
|
|
8
9
|
const publish_1 = require("./cli/commands/publish");
|
|
10
|
+
const set_1 = require("./cli/commands/set");
|
|
9
11
|
const update_1 = require("./cli/commands/update");
|
|
10
12
|
const ws_1 = require("./cli/commands/ws");
|
|
11
13
|
const constants_1 = require("./core/constants");
|
|
@@ -15,6 +17,8 @@ const program = new commander_1.Command()
|
|
|
15
17
|
.version(constants_1.PACKAGE_VERSION);
|
|
16
18
|
(0, config_1.registerConfigCommands)(program);
|
|
17
19
|
(0, auth_1.registerAuthCommands)(program);
|
|
20
|
+
(0, get_1.registerGetCommands)(program);
|
|
21
|
+
(0, set_1.registerSetCommands)(program);
|
|
18
22
|
(0, ws_1.registerWsCommands)(program);
|
|
19
23
|
(0, update_1.registerUpdateCommands)(program);
|
|
20
24
|
(0, init_1.registerInitCommands)(program);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,8CAA2D;AAC3D,kDAA+D;AAC/D,8CAA2D;AAC3D,oDAAiE;AACjE,kDAA+D;AAC/D,0CAAuD;AACvD,gDAAwE;AAExE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE;KAC1B,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,+BAAmB,CAAC;KAChC,OAAO,CAAC,2BAAe,CAAC,CAAC;AAE5B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,2BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,uBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,2BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,iCAAuB,EAAC,OAAO,CAAC,CAAC;AAEjC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,8CAA2D;AAC3D,kDAA+D;AAC/D,4CAAyD;AACzD,8CAA2D;AAC3D,oDAAiE;AACjE,4CAAyD;AACzD,kDAA+D;AAC/D,0CAAuD;AACvD,gDAAwE;AAExE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE;KAC1B,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,+BAAmB,CAAC;KAChC,OAAO,CAAC,2BAAe,CAAC,CAAC;AAE5B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,2BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,yBAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,yBAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,uBAAkB,EAAC,OAAO,CAAC,CAAC;AAC5B,IAAA,+BAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,2BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,iCAAuB,EAAC,OAAO,CAAC,CAAC;AAEjC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -17,11 +17,14 @@ export type ApmConfig = {
|
|
|
17
17
|
};
|
|
18
18
|
};
|
|
19
19
|
export declare function loadApmConfig(): ApmConfig;
|
|
20
|
-
export declare function syncApmConfig(
|
|
20
|
+
export declare function syncApmConfig(options: {
|
|
21
|
+
id: number;
|
|
22
|
+
url?: string;
|
|
23
|
+
}): Promise<void>;
|
|
21
24
|
export declare function isApmConfigExists(): boolean;
|
|
22
25
|
export declare function saveApmToken(token: string): void;
|
|
23
26
|
export declare function createApmConfig(options: {
|
|
24
27
|
id: number;
|
|
25
28
|
url?: string;
|
|
26
|
-
}):
|
|
29
|
+
}): void;
|
|
27
30
|
//# sourceMappingURL=apm-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apm-config.d.ts","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE;QAEJ,EAAE,EAAE,MAAM,CAAC;QAEX,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE;QAEN,GAAG,EAAE,MAAM,CAAC;QAEZ,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,wBAAgB,aAAa,IAAI,SAAS,
|
|
1
|
+
{"version":3,"file":"apm-config.d.ts","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE;QAEJ,EAAE,EAAE,MAAM,CAAC;QAEX,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE;QAEN,GAAG,EAAE,MAAM,CAAC;QAEZ,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,wBAAgB,aAAa,IAAI,SAAS,CAYzC;AAGD,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,iBAYxE;AAMD,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,QAKzC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,QA2BpE"}
|
package/dist/core/apm-config.js
CHANGED
|
@@ -16,8 +16,7 @@ function loadApmConfig() {
|
|
|
16
16
|
try {
|
|
17
17
|
const p = getApmConfigPath();
|
|
18
18
|
if (!(0, node_fs_1.existsSync)(p)) {
|
|
19
|
-
|
|
20
|
-
process.exit(1);
|
|
19
|
+
createApmConfig({ id: 0 });
|
|
21
20
|
}
|
|
22
21
|
const j = JSON.parse((0, node_fs_1.readFileSync)(p, "utf8"));
|
|
23
22
|
return j;
|
|
@@ -28,9 +27,15 @@ function loadApmConfig() {
|
|
|
28
27
|
}
|
|
29
28
|
}
|
|
30
29
|
// 同步远程的配置项到本地
|
|
31
|
-
async function syncApmConfig() {
|
|
30
|
+
async function syncApmConfig(options) {
|
|
32
31
|
const p = getApmConfigPath();
|
|
33
32
|
const cfg = loadApmConfig();
|
|
33
|
+
if (options.id) {
|
|
34
|
+
cfg.auth.id = options.id;
|
|
35
|
+
}
|
|
36
|
+
if (options.url) {
|
|
37
|
+
cfg.server.url = options.url;
|
|
38
|
+
}
|
|
34
39
|
const res = await client_1.default.cli.variablesGet();
|
|
35
40
|
const j = JSON.stringify({ ...cfg, ...res }, null, 2);
|
|
36
41
|
(0, node_fs_1.writeFileSync)(p, j);
|
|
@@ -53,7 +58,7 @@ function saveApmToken(token) {
|
|
|
53
58
|
currentConfig.auth.token = token;
|
|
54
59
|
(0, node_fs_1.writeFileSync)(p, JSON.stringify(currentConfig, null, 2));
|
|
55
60
|
}
|
|
56
|
-
|
|
61
|
+
function createApmConfig(options) {
|
|
57
62
|
const p = getApmConfigPath();
|
|
58
63
|
(0, node_fs_1.writeFileSync)(p, JSON.stringify({
|
|
59
64
|
auth: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apm-config.js","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":";;;;;AA4BA,
|
|
1
|
+
{"version":3,"file":"apm-config.js","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,32 +1,25 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: requirement-review
|
|
3
|
-
description:
|
|
3
|
+
description: 结合本仓库上下文对需求做结构化评审,只有当用户主动提及该技能时才可被使用,该技能调用依赖需求ID。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# 需求评审
|
|
7
7
|
|
|
8
8
|
## 触发条件
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
- 未作上述声明时,**不**因「帮我看看需求」「评审一下」等表述自动套用本技能的工作方式与输出模板
|
|
12
|
-
|
|
13
|
-
满足触发后,用户须在**首轮对话**中一并给出:**需求正文**、`commentId`(评论 id)、**workitem 目录名 `<name>`**(与 `.apm/workitems/<name>/prd.md` 等同级产物所在目录一致,通常为 kebab-case)。若未给出 `<name>` 但仓库内**仅有一个**合理关联的 workitem 目录,可据 `.apm/workitems/` 推断;否则须先索要。不要求其他附件。
|
|
10
|
+
用户**明确声明**使用本技能(例如在对话中 @ 本 SKILL)
|
|
14
11
|
|
|
15
12
|
## 输入
|
|
16
13
|
|
|
17
|
-
-
|
|
18
|
-
- **`commentId`**:评论记录 id(整数,与正文一起在对话中给出)
|
|
19
|
-
- **`<name>`**:`.apm/workitems/<name>/` 下的目录名,用于落盘评论存档(见下文);与首轮一并给出或由仓库唯一定位
|
|
20
|
-
|
|
21
|
-
若首轮未给出 `commentId` 或无法确定 `<name>`,须先向用户索要(或澄清)后再执行第 6 步。
|
|
14
|
+
- **`requirementId`(必须)**:需求 ID。
|
|
22
15
|
|
|
23
16
|
## 输出
|
|
24
17
|
|
|
25
|
-
- **评审正文**:须先按模板在**逻辑上**成文(完整 Markdown
|
|
18
|
+
- **评审正文**:须先按模板在**逻辑上**成文(完整 Markdown 字符串),不得仅给零散要点,。可在回复中展示。
|
|
26
19
|
- 将需求拆成若干条「需求点」(若本就一条则一条),对每条按 [output-template.md](output-template.md) 的**字段规则与并存关系**输出结论。
|
|
27
|
-
-
|
|
20
|
+
- 语言面向产品可读:少堆砌实现细节,**不**用具体文件路径、函数名当「证据」;仓库仅用于理解**能力边界、术语与业务上下文**。
|
|
28
21
|
|
|
29
|
-
结构要点(细节以 `output-template.md` 为准):`### 需求点 n`、`- **需求描述:**:` 及可选的 `业务合理性` / `问题` / `可行性` /
|
|
22
|
+
结构要点(细节以 `output-template.md` 为准):`### 需求点 n`、`- **需求描述:**:` 及可选的 `业务合理性` / `问题` / `可行性` / `风险点`;。
|
|
30
23
|
|
|
31
24
|
## 评审原则
|
|
32
25
|
|
|
@@ -40,21 +33,12 @@ description: 结合本仓库上下文对需求做结构化评审,按 output-te
|
|
|
40
33
|
|
|
41
34
|
## 执行步骤
|
|
42
35
|
|
|
43
|
-
1.
|
|
44
|
-
2.
|
|
36
|
+
1. **获取需求正文**:`apm get requirement <requirementId>`,如果报错则停止后面的步骤
|
|
37
|
+
2. **读代码**:阅读仓库源码以及 `.apm/product-capability-inventory` 中与需求相关的条目;不展开无关模块代码。
|
|
45
38
|
3. **拆条**:多条诉求时拆成 `### 需求点 1..N`,每条独立走完「业务合理性(可选)→ 问题 或 可行性(+风险)」逻辑。
|
|
46
|
-
4. **成文**:按 `output-template.md` 拼出完整 Markdown 字符串(顶格可加 `### 评审人` + 当前模型名);**随即**将全文写入 **`.apm/workitems/<
|
|
39
|
+
4. **成文**:按 `output-template.md` 拼出完整 Markdown 字符串(顶格可加 `### 评审人` + 当前模型名);**随即**将全文写入 **`.apm/workitems/<requirementId>/comment.md`**(如果存在则直接覆盖更新)。
|
|
47
40
|
5. **自检**:每条是否都有「需求描述」;「问题」与「可行性/风险」是否互斥符合 `output-template.md`;是否误引代码路径作论据。
|
|
48
|
-
6.
|
|
49
|
-
|
|
50
|
-
- **CLI 命令**:`apm comment update --id <commentId> --content-file .apm/workitems/<name>/comment-<commentId>.md`
|
|
51
|
-
- **禁止**:成功后 `rm` 该文件或使用仅存在于系统临时目录、意图事后删除的副本;评论存档以 workitem 目录下该文件为准。
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
apm comment update --id 42 --content-file .apm/workitems/my-feature/comment-42.md
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
实际调用时替换为你的 `<commentId>`、`<name>`。失败时把命令报错贴出;成功时可简要确认评论已更新且 **`comment-<commentId>.md` 仍保留在仓库中**。
|
|
41
|
+
6. **提交评审记录**:`apm set comment <requirementId>`。
|
|
58
42
|
|
|
59
43
|
## 附加资源
|
|
60
44
|
|