ai-project-manage-cli 2.0.3 → 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/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 +4 -1
- package/dist/core/apm-config.d.ts.map +1 -1
- package/dist/core/apm-config.js +7 -3
- 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"}
|
|
@@ -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,7 +17,10 @@ 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: {
|
|
@@ -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
|
@@ -17,8 +17,6 @@ function loadApmConfig() {
|
|
|
17
17
|
const p = getApmConfigPath();
|
|
18
18
|
if (!(0, node_fs_1.existsSync)(p)) {
|
|
19
19
|
createApmConfig({ id: 0 });
|
|
20
|
-
console.error("配置文件不存在,请确保当前目录下存在 apm.config.json");
|
|
21
|
-
process.exit(1);
|
|
22
20
|
}
|
|
23
21
|
const j = JSON.parse((0, node_fs_1.readFileSync)(p, "utf8"));
|
|
24
22
|
return j;
|
|
@@ -29,9 +27,15 @@ function loadApmConfig() {
|
|
|
29
27
|
}
|
|
30
28
|
}
|
|
31
29
|
// 同步远程的配置项到本地
|
|
32
|
-
async function syncApmConfig() {
|
|
30
|
+
async function syncApmConfig(options) {
|
|
33
31
|
const p = getApmConfigPath();
|
|
34
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
|
+
}
|
|
35
39
|
const res = await client_1.default.cli.variablesGet();
|
|
36
40
|
const j = JSON.stringify({ ...cfg, ...res }, null, 2);
|
|
37
41
|
(0, node_fs_1.writeFileSync)(p, j);
|
|
@@ -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
|
|