ai-project-manage-cli 2.0.14 → 2.0.16
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/README.md +1 -1
- package/dist/cli/commands/deploy-backend.d.ts.map +1 -1
- package/dist/cli/commands/deploy-backend.js +11 -4
- package/dist/cli/commands/deploy-backend.js.map +1 -1
- package/dist/cli/commands/deploy-frontend.d.ts.map +1 -1
- package/dist/cli/commands/deploy-frontend.js +23 -2
- package/dist/cli/commands/deploy-frontend.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +59 -35
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/core/apm-config.d.ts +13 -12
- package/dist/core/apm-config.d.ts.map +1 -1
- package/dist/core/apm-config.js +20 -20
- package/dist/core/apm-config.js.map +1 -1
- package/dist/core/backend-deploy/backend-deploy-workflow.d.ts +1 -0
- package/dist/core/backend-deploy/backend-deploy-workflow.d.ts.map +1 -1
- package/dist/core/backend-deploy/backend-deploy-workflow.js +6 -3
- package/dist/core/backend-deploy/backend-deploy-workflow.js.map +1 -1
- package/dist/core/backend-deploy/dockerode-client/env.js +1 -1
- package/dist/core/backend-deploy/dockerode-client/env.js.map +1 -1
- package/dist/core/minio.d.ts +2 -0
- package/dist/core/minio.d.ts.map +1 -1
- package/dist/core/minio.js +6 -1
- package/dist/core/minio.js.map +1 -1
- package/package.json +1 -1
- package/templates/commands/apm-auto-dev.md +6 -0
- package/templates/commands/apm-fixbug.md +6 -0
- package/templates/commands/apm-prd-review.md +6 -0
- package/templates/commands/apm-prd-sync.md +6 -0
- package/templates/skills/apm-auto-dev/SKILL.md +3 -3
- package/templates/skills/apm-fixbug/SKILL.md +1 -1
- package/templates/skills/apm-propose/SKILL.md +4 -4
- package/templates/skills/apm-propose/design-instruction.md +1 -1
- package/templates/skills/apm-propose/propose-instruction.md +1 -1
- package/templates/skills/apm-propose/specs-instruction.md +1 -1
- package/templates/skills/apm-propose/tasks-instruction.md +1 -1
- package/templates/skills/product-capability-inventory/SKILL.md +1 -1
- package/templates/skills/product-capability-inventory//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +1 -1
- package/templates/skills/product-capability-inventory//347/233/256/345/275/225/350/247/204/350/214/203.md +1 -1
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ apm logout # 清除 token、employeeId,保留 ba
|
|
|
32
32
|
|
|
33
33
|
## `apm init`
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
在**当前项目**中:初始化标准 `.apm` 目录;将内置 skills 安装到 `.apm/skills`(按技能子目录删除后全量复制);将 `templates/commands` 中的命令文件**合并**到 `.cursor/commands`(按文件名写入/覆盖,不删除其它已有文件)。需在含 `.cursor`、`.apm` 或 `.git` 的项目根(或向上查找)下执行。
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
38
|
apm init
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-backend.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"deploy-backend.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkFpE"}
|
|
@@ -20,9 +20,11 @@ function registerDeployBackendCommands(program) {
|
|
|
20
20
|
.command("deploy-backend")
|
|
21
21
|
.description("使用本地 Docker 构建后端镜像、推送到私有 Registry,并在远程 Docker 主机上拉取镜像(连接信息见 apm.config.json 的 backendDeploy)")
|
|
22
22
|
.argument("<name>", "名称,英文下划线分割,作为镜像 tag")
|
|
23
|
-
.option("--env <env_tag>", "环境标签", "
|
|
23
|
+
.option("--env <env_tag>", "环境标签", "测试环境")
|
|
24
24
|
.requiredOption("--dir <path>", "构建上下文目录(相对当前工作目录或绝对路径);约定使用此目录下的 Dockerfile")
|
|
25
|
+
.option("--config <path>", "apm.config.json 路径(默认 .apm/apm.config.json,相对当前工作目录或绝对路径)")
|
|
25
26
|
.option("--requirement-id <requirement_id>", "需求 ID(部署成功后登记后端环境,与 deploy-frontend 一致)", parse_1.parsePositiveInt)
|
|
27
|
+
.option("-q, --quick <boolean>", "直接部署远程容器,不进行本地构建、推送镜像等步骤", false)
|
|
26
28
|
.action(async (name, opts) => {
|
|
27
29
|
const branchName = (0, branch_name_1.normalizeBranchName)(name);
|
|
28
30
|
if (!branchName) {
|
|
@@ -31,11 +33,11 @@ function registerDeployBackendCommands(program) {
|
|
|
31
33
|
}
|
|
32
34
|
const cleanBranch = (0, branch_name_1.sanitizeBranchName)(branchName);
|
|
33
35
|
(0, image_tag_1.assertDeployImageTag)(cleanBranch);
|
|
34
|
-
const cfg = (0, apm_config_1.loadApmConfig)();
|
|
36
|
+
const cfg = (0, apm_config_1.loadApmConfig)({ configPath: opts.config });
|
|
35
37
|
const fromApm = (0, apm_config_1.resolveBackendDeployFromApmConfig)(cfg);
|
|
36
38
|
const dirAbs = node_path_1.default.resolve(opts.dir);
|
|
37
39
|
const params = {
|
|
38
|
-
image: fromApm.
|
|
40
|
+
image: fromApm.name,
|
|
39
41
|
tag: cleanBranch,
|
|
40
42
|
registryHost: fromApm.registryHost,
|
|
41
43
|
registryNamespace: fromApm.registryNamespace,
|
|
@@ -51,7 +53,12 @@ function registerDeployBackendCommands(program) {
|
|
|
51
53
|
containerPortsMappings: fromApm.containerPortsMappings,
|
|
52
54
|
};
|
|
53
55
|
const workflow = new backend_deploy_1.BackendDeployWorkflow(params);
|
|
54
|
-
|
|
56
|
+
if (opts.quick) {
|
|
57
|
+
await workflow.deployRemoteContainer(dirAbs);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
await workflow.run(dirAbs);
|
|
61
|
+
}
|
|
55
62
|
const envTag = (0, branch_name_1.resolveEnvTag)(opts.env ?? "测试环境");
|
|
56
63
|
if (opts.requirementId) {
|
|
57
64
|
await client_1.default.cli.resourceEnvironmentCreate({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-backend.js","sourceRoot":"","sources":["../../../src/cli/commands/deploy-backend.ts"],"names":[],"mappings":";;;;;AAsBA,
|
|
1
|
+
{"version":3,"file":"deploy-backend.js","sourceRoot":"","sources":["../../../src/cli/commands/deploy-backend.ts"],"names":[],"mappings":";;;;;AAsBA,sEAkFC;AAxGD,0DAA6B;AAG7B,8DAAmC;AACnC,8DAAkE;AAClE,mEAA2E;AAE3E,wDAIgC;AAChC,sDAG+B;AAC/B,0CAAkD;AAElD;;;GAGG;AACH,SAAgB,6BAA6B,CAAC,OAAgB;IAC5D,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CACV,8FAA8F,CAC/F;SACA,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;SACzC,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC;SACzC,cAAc,CACb,cAAc,EACd,6CAA6C,CAC9C;SACA,MAAM,CACL,iBAAiB,EACjB,2DAA2D,CAC5D;SACA,MAAM,CACL,mCAAmC,EACnC,yCAAyC,EACzC,wBAAgB,CACjB;SACA,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,EAAE,KAAK,CAAC;SAClE,MAAM,CACL,KAAK,EACH,IAAY,EACZ,IAMC,EACD,EAAE;QACF,MAAM,UAAU,GAAG,IAAA,iCAAmB,EAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,WAAW,GAAG,IAAA,gCAAkB,EAAC,UAAU,CAAC,CAAC;QACnD,IAAA,gCAAoB,EAAC,WAAW,CAAC,CAAC;QAElC,MAAM,GAAG,GAAG,IAAA,0BAAa,EAAC,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAA,8CAAiC,EAAC,GAAG,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAwB;YAClC,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,GAAG,EAAE,WAAW;YAChB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,YAAY,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAClC,cAAc,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;YACtC,aAAa,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YACpC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;SACvD,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,sCAAqB,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,2BAAa,EAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,gBAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC;gBACtC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,IAAI,EAAE,WAAW;gBACjB,GAAG,EAAE,MAAM;gBACX,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CACF,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-frontend.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy-frontend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBzC,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"deploy-frontend.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy-frontend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBzC,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiKrE"}
|
|
@@ -17,10 +17,29 @@ function registerDeployFrontendCommands(program) {
|
|
|
17
17
|
.argument("<name>", "分支名,作为对象键顶层目录")
|
|
18
18
|
.option("--env <env_tag>", "环境标签", "测试环境,正式环境")
|
|
19
19
|
.option("--dir <dir>", "产物目录(默认 dist)", "dist")
|
|
20
|
+
.option("--config <path>", "apm.config.json 路径(默认 .apm/apm.config.json,相对当前工作目录或绝对路径)")
|
|
20
21
|
.option("--requirement-id <requirement_id>", "需求 ID(上传成功后登记前端环境)", parse_1.parsePositiveInt)
|
|
21
22
|
.option("--max-file-size-mb <mb>", `单文件大小上限,默认 ${minio_1.DEFAULT_MAX_FILE_SIZE_MB}`, (v) => Number.parseInt(String(v), 10))
|
|
22
23
|
.action(async (name, opts) => {
|
|
23
|
-
const
|
|
24
|
+
const cfg = (0, apm_config_1.loadApmConfig)({ configPath: opts.config });
|
|
25
|
+
const { frontendDeploy: settings } = cfg;
|
|
26
|
+
const nameRaw = (cfg.name ?? "").trim();
|
|
27
|
+
if (!nameRaw) {
|
|
28
|
+
console.error("请在 .apm/apm.config.json 顶层配置 name(作为 MinIO 对象键前缀)");
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
if (nameRaw.includes(":")) {
|
|
32
|
+
console.error("apm.config.json 的 name 不能包含 ':'");
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
let namePrefix;
|
|
36
|
+
try {
|
|
37
|
+
namePrefix = (0, minio_1.sanitizeRelativePath)(nameRaw.replace(/\\/g, "/"));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
console.error("apm.config.json 的 name 非法(路径片段不能为 . 或 ..)");
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
24
43
|
const minio = new minio_1.MinioClient({
|
|
25
44
|
endPoint: settings.endpoint,
|
|
26
45
|
port: settings.port,
|
|
@@ -53,7 +72,7 @@ function registerDeployFrontendCommands(program) {
|
|
|
53
72
|
console.error(`开始直连 MinIO 上传,共 ${files.length} 个文件…`);
|
|
54
73
|
await minio.ensureBucket(bucket);
|
|
55
74
|
// 只清理与上传目录对应的对象前缀,避免误删同一分支下其它目录内容
|
|
56
|
-
await minio.deleteObjectsByPrefix(bucket, `${cleanBranch}/dist/`);
|
|
75
|
+
await minio.deleteObjectsByPrefix(bucket, `${namePrefix}/${cleanBranch}/dist/`);
|
|
57
76
|
for (const f of files) {
|
|
58
77
|
if (f.size > maxBytes) {
|
|
59
78
|
console.error(`文件过大,已拒绝:${f.relativePath}(${(0, minio_1.toMB)(f.size)}MB > ${(0, minio_1.toMB)(maxBytes)}MB)`);
|
|
@@ -62,6 +81,7 @@ function registerDeployFrontendCommands(program) {
|
|
|
62
81
|
const buf = await (0, minio_1.readArtifactFile)(f.absPath);
|
|
63
82
|
const cleanRel = (0, minio_1.sanitizeRelativePath)(f.relativePath);
|
|
64
83
|
const objectKey = (0, minio_1.toArtifactObjectKey)({
|
|
84
|
+
namePrefix,
|
|
65
85
|
branchName: cleanBranch,
|
|
66
86
|
relativePath: cleanRel,
|
|
67
87
|
});
|
|
@@ -78,6 +98,7 @@ function registerDeployFrontendCommands(program) {
|
|
|
78
98
|
await minio.setBucketPublicRead(bucket);
|
|
79
99
|
console.log(JSON.stringify({
|
|
80
100
|
ok: true,
|
|
101
|
+
namePrefix,
|
|
81
102
|
branchName: cleanBranch,
|
|
82
103
|
bucket,
|
|
83
104
|
fileCount: uploaded,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-frontend.js","sourceRoot":"","sources":["../../../src/cli/commands/deploy-frontend.ts"],"names":[],"mappings":";;;;;AAsBA,
|
|
1
|
+
{"version":3,"file":"deploy-frontend.js","sourceRoot":"","sources":["../../../src/cli/commands/deploy-frontend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwJzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2D3D"}
|
|
@@ -36,6 +36,10 @@ function resolveSkillSourceDir() {
|
|
|
36
36
|
// dist/cli/commands/init.js -> ../../../templates/skills
|
|
37
37
|
return node_path_1.default.resolve(__dirname, "../../../templates/skills");
|
|
38
38
|
}
|
|
39
|
+
function resolveCommandsSourceDir() {
|
|
40
|
+
// dist/cli/commands/init.js -> ../../../templates/commands
|
|
41
|
+
return node_path_1.default.resolve(__dirname, "../../../templates/commands");
|
|
42
|
+
}
|
|
39
43
|
async function pathExists(p) {
|
|
40
44
|
try {
|
|
41
45
|
await (0, promises_1.stat)(p);
|
|
@@ -45,9 +49,25 @@ async function pathExists(p) {
|
|
|
45
49
|
return false;
|
|
46
50
|
}
|
|
47
51
|
}
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
|
|
52
|
+
/**
|
|
53
|
+
* 从当前工作目录向上查找项目根:存在 \`.cursor\`、\`.apm\` 或 \`.git\`(含 worktree 的文件式 .git)的目录。
|
|
54
|
+
*/
|
|
55
|
+
async function resolveProjectRoot() {
|
|
56
|
+
let cur = process.cwd();
|
|
57
|
+
for (let i = 0; i < 20; i += 1) {
|
|
58
|
+
for (const name of [".cursor", ".apm", ".git"]) {
|
|
59
|
+
if (await pathExists(node_path_1.default.join(cur, name))) {
|
|
60
|
+
return cur;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const parent = node_path_1.default.dirname(cur);
|
|
64
|
+
if (!parent || parent === cur)
|
|
65
|
+
break;
|
|
66
|
+
cur = parent;
|
|
67
|
+
}
|
|
68
|
+
// eslint-disable-next-line no-console
|
|
69
|
+
console.error("未找到项目根目录:请在包含 .cursor、.apm 或 .git 的目录下执行 apm init");
|
|
70
|
+
process.exit(1);
|
|
51
71
|
}
|
|
52
72
|
/**
|
|
53
73
|
* 创建标准 \`.apm\` 目录结构(与仓库内参考 \`.apm\` 一致):
|
|
@@ -65,6 +85,8 @@ async function ensureApmStandardLayout(projectRoot, skillsTemplateDir) {
|
|
|
65
85
|
created.push(".apm/deploy");
|
|
66
86
|
await (0, promises_1.mkdir)(node_path_1.default.join(apmRoot, "product-capability-inventory"), { recursive: true });
|
|
67
87
|
created.push(".apm/product-capability-inventory");
|
|
88
|
+
await (0, promises_1.mkdir)(node_path_1.default.join(apmRoot, "skills"), { recursive: true });
|
|
89
|
+
created.push(".apm/skills");
|
|
68
90
|
const deployReadme = node_path_1.default.join(apmRoot, "deploy", "README.md");
|
|
69
91
|
if (!(await pathExists(deployReadme))) {
|
|
70
92
|
await (0, promises_1.writeFile)(deployReadme, DEPLOY_README_STUB, "utf8");
|
|
@@ -88,47 +110,41 @@ async function ensureApmStandardLayout(projectRoot, skillsTemplateDir) {
|
|
|
88
110
|
}
|
|
89
111
|
return { apmRoot, created, warnings };
|
|
90
112
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (!parent || parent === cur)
|
|
108
|
-
break;
|
|
109
|
-
cur = parent;
|
|
113
|
+
/**
|
|
114
|
+
* 将内置命令模板合并到 \`.cursor/commands\`:按文件名写入/覆盖,不删除用户已有其它文件。
|
|
115
|
+
*/
|
|
116
|
+
async function mergeCursorCommands(projectRoot, commandsTemplateDir) {
|
|
117
|
+
const commandsDir = node_path_1.default.join(projectRoot, ".cursor", "commands");
|
|
118
|
+
await (0, promises_1.mkdir)(commandsDir, { recursive: true });
|
|
119
|
+
const installed = [];
|
|
120
|
+
const entries = await (0, promises_1.readdir)(commandsTemplateDir, { withFileTypes: true });
|
|
121
|
+
for (const e of entries) {
|
|
122
|
+
if (!e.isFile())
|
|
123
|
+
continue;
|
|
124
|
+
const name = e.name;
|
|
125
|
+
const src = node_path_1.default.join(commandsTemplateDir, name);
|
|
126
|
+
const dst = node_path_1.default.join(commandsDir, name);
|
|
127
|
+
await (0, promises_1.cp)(src, dst, { force: true });
|
|
128
|
+
installed.push(node_path_1.default.join(".cursor/commands", name));
|
|
110
129
|
}
|
|
111
|
-
|
|
112
|
-
// 使用 console.error 保持 CLI 风格,与其它子命令一致
|
|
113
|
-
// eslint-disable-next-line no-console
|
|
114
|
-
console.error("未找到当前项目的 .cursor/skills 目录:请在项目根创建 .cursor/skills 后再执行 apm init");
|
|
115
|
-
process.exit(1);
|
|
130
|
+
return { commandsDir, installed };
|
|
116
131
|
}
|
|
117
132
|
function registerInitCommands(program) {
|
|
118
133
|
program
|
|
119
134
|
.command("init")
|
|
120
|
-
.description("安装内置
|
|
135
|
+
.description("安装内置 skills 到 .apm/skills,合并内置命令到 .cursor/commands,并初始化标准 .apm 目录结构")
|
|
121
136
|
.action(async () => {
|
|
137
|
+
const projectRoot = await resolveProjectRoot();
|
|
122
138
|
const srcDir = resolveSkillSourceDir();
|
|
123
|
-
const
|
|
124
|
-
const projectRoot = resolveProjectRootFromCursorSkillsDir(dstDir);
|
|
139
|
+
const commandsSrcDir = resolveCommandsSourceDir();
|
|
125
140
|
const apmResult = await ensureApmStandardLayout(projectRoot, srcDir);
|
|
126
|
-
|
|
141
|
+
const dstSkillsDir = node_path_1.default.join(projectRoot, ".apm", "skills");
|
|
142
|
+
await (0, promises_1.mkdir)(dstSkillsDir, { recursive: true });
|
|
127
143
|
// 读取模板下的技能子目录名,用于在目标目录中做“删除后重装”
|
|
128
144
|
const entries = await (0, promises_1.readdir)(srcDir, { withFileTypes: true });
|
|
129
145
|
const skillDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
130
146
|
for (const name of skillDirs) {
|
|
131
|
-
const existing = node_path_1.default.join(
|
|
147
|
+
const existing = node_path_1.default.join(dstSkillsDir, name);
|
|
132
148
|
try {
|
|
133
149
|
await (0, promises_1.rm)(existing, { recursive: true, force: true });
|
|
134
150
|
}
|
|
@@ -136,14 +152,22 @@ function registerInitCommands(program) {
|
|
|
136
152
|
// ignore 删除失败(例如不存在或权限问题),继续尝试后续目录
|
|
137
153
|
}
|
|
138
154
|
}
|
|
139
|
-
await (0, promises_1.cp)(srcDir,
|
|
155
|
+
await (0, promises_1.cp)(srcDir, dstSkillsDir, {
|
|
140
156
|
recursive: true,
|
|
141
157
|
force: true,
|
|
142
158
|
});
|
|
159
|
+
const commandsResult = await mergeCursorCommands(projectRoot, commandsSrcDir);
|
|
143
160
|
console.log(JSON.stringify({
|
|
144
161
|
ok: true,
|
|
145
|
-
|
|
146
|
-
|
|
162
|
+
skills: {
|
|
163
|
+
installedFrom: srcDir,
|
|
164
|
+
installedTo: dstSkillsDir,
|
|
165
|
+
},
|
|
166
|
+
commands: {
|
|
167
|
+
installedFrom: commandsSrcDir,
|
|
168
|
+
mergedTo: commandsResult.commandsDir,
|
|
169
|
+
files: commandsResult.installed,
|
|
170
|
+
},
|
|
147
171
|
apm: {
|
|
148
172
|
root: apmResult.apmRoot,
|
|
149
173
|
created: apmResult.created,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,18 +11,15 @@ export type ApmBackendDeploy = {
|
|
|
11
11
|
caPath?: string;
|
|
12
12
|
certPath?: string;
|
|
13
13
|
keyPath?: string;
|
|
14
|
-
/**
|
|
15
|
-
* 镜像仓库完整路径(**不含 tag**),与后续容器名一致时仅 tag 不同。
|
|
16
|
-
* 例:registry.cn-hangzhou.aliyuncs.com/my-ns/my-service
|
|
17
|
-
*/
|
|
18
|
-
imageName: string;
|
|
19
|
-
/**
|
|
20
|
-
* 与镜像对应的容器名;空则使用 imageRepository 路径最后一段(与镜像「短名」一致)。
|
|
21
|
-
*/
|
|
22
14
|
containerPortsMappings?: string[];
|
|
23
15
|
envFilePath?: string;
|
|
24
16
|
};
|
|
25
17
|
export type ApmConfig = {
|
|
18
|
+
/**
|
|
19
|
+
* 项目/镜像短名(**不含 tag**),供 `apm deploy-backend` 拼成
|
|
20
|
+
* `registryHost/registryNamespace/name:tag`。
|
|
21
|
+
*/
|
|
22
|
+
name?: string;
|
|
26
23
|
auth: {
|
|
27
24
|
id: number;
|
|
28
25
|
token: string;
|
|
@@ -44,7 +41,7 @@ export type ApmConfig = {
|
|
|
44
41
|
backendDeploy?: ApmBackendDeploy;
|
|
45
42
|
};
|
|
46
43
|
/**
|
|
47
|
-
* 读取并校验 `apm.config.json` 中的 `backendDeploy`,供 `deploy-backend` 使用。
|
|
44
|
+
* 读取并校验 `apm.config.json` 中的 `backendDeploy` 与顶层 `name`,供 `deploy-backend` 使用。
|
|
48
45
|
* 必填项缺失或非法时抛出带说明的 Error。
|
|
49
46
|
*/
|
|
50
47
|
export declare function resolveBackendDeployFromApmConfig(cfg: ApmConfig): {
|
|
@@ -58,12 +55,16 @@ export declare function resolveBackendDeployFromApmConfig(cfg: ApmConfig): {
|
|
|
58
55
|
caPath?: string;
|
|
59
56
|
certPath?: string;
|
|
60
57
|
keyPath?: string;
|
|
61
|
-
/** 不含
|
|
62
|
-
|
|
58
|
+
/** 不含 registry 与 namespace 的镜像短名,来自配置顶层 {@link ApmConfig.name} */
|
|
59
|
+
name: string;
|
|
63
60
|
containerPortsMappings?: string[];
|
|
64
61
|
envFilePath?: string;
|
|
65
62
|
};
|
|
66
|
-
export
|
|
63
|
+
export type LoadApmConfigOptions = {
|
|
64
|
+
/** 自定义 `apm.config.json` 路径(相对当前工作目录或绝对路径);缺省为 `<cwd>/.apm/apm.config.json` */
|
|
65
|
+
configPath?: string;
|
|
66
|
+
};
|
|
67
|
+
export declare function loadApmConfig(options?: LoadApmConfigOptions): ApmConfig;
|
|
67
68
|
export declare function syncApmConfig(options: {
|
|
68
69
|
id: number;
|
|
69
70
|
url?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apm-config.d.ts","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":"AAKA,2EAA2E;AAC3E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB
|
|
1
|
+
{"version":3,"file":"apm-config.d.ts","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":"AAKA,2EAA2E;AAC3E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,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,6EAA6E;IAC7E,cAAc,EAAE;QACd,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,mBAAmB;IACnB,aAAa,CAAC,EAAE,gBAAgB,CAAC;CAClC,CAAC;AAiBF;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,SAAS,GAAG;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CA4EA;AAGD,MAAM,MAAM,oBAAoB,GAAG;IACjC,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAUF,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAiBvE;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,QA6BpE"}
|
package/dist/core/apm-config.js
CHANGED
|
@@ -24,12 +24,11 @@ const DEFAULT_BACKEND_DEPLOY = {
|
|
|
24
24
|
caPath: "",
|
|
25
25
|
certPath: "",
|
|
26
26
|
keyPath: "",
|
|
27
|
-
imageName: "",
|
|
28
27
|
containerPortsMappings: [],
|
|
29
28
|
envFilePath: "",
|
|
30
29
|
};
|
|
31
30
|
/**
|
|
32
|
-
* 读取并校验 `apm.config.json` 中的 `backendDeploy`,供 `deploy-backend` 使用。
|
|
31
|
+
* 读取并校验 `apm.config.json` 中的 `backendDeploy` 与顶层 `name`,供 `deploy-backend` 使用。
|
|
33
32
|
* 必填项缺失或非法时抛出带说明的 Error。
|
|
34
33
|
*/
|
|
35
34
|
function resolveBackendDeployFromApmConfig(cfg) {
|
|
@@ -66,12 +65,12 @@ function resolveBackendDeployFromApmConfig(cfg) {
|
|
|
66
65
|
const t = (s ?? "").trim();
|
|
67
66
|
return t.length > 0 ? t : undefined;
|
|
68
67
|
};
|
|
69
|
-
const
|
|
70
|
-
if (!
|
|
71
|
-
throw new Error("请在 .apm/apm.config.json
|
|
68
|
+
const name = (cfg.name ?? "").trim();
|
|
69
|
+
if (!name) {
|
|
70
|
+
throw new Error("请在 .apm/apm.config.json 顶层配置 name(镜像短名,不含 tag;将与 registryHost、registryNamespace 拼接)");
|
|
72
71
|
}
|
|
73
|
-
if (
|
|
74
|
-
throw new Error("
|
|
72
|
+
if (name.includes(":")) {
|
|
73
|
+
throw new Error("apm.config.json 的 name 不应包含 tag(不能出现 ':'),tag 由 `apm deploy-backend` 的位置参数 `<name>` 指定");
|
|
75
74
|
}
|
|
76
75
|
return {
|
|
77
76
|
registryHost,
|
|
@@ -86,28 +85,28 @@ function resolveBackendDeployFromApmConfig(cfg) {
|
|
|
86
85
|
keyPath: trimOrUndef(b.keyPath),
|
|
87
86
|
containerPortsMappings: b.containerPortsMappings,
|
|
88
87
|
envFilePath: b.envFilePath,
|
|
89
|
-
|
|
88
|
+
name,
|
|
90
89
|
};
|
|
91
90
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (raw.frontendDeploy === undefined && raw.deploy !== undefined) {
|
|
97
|
-
raw.frontendDeploy = raw.deploy;
|
|
98
|
-
}
|
|
99
|
-
if (raw.deploy !== undefined) {
|
|
100
|
-
delete raw.deploy;
|
|
91
|
+
function resolveApmConfigLoadPath(configPath) {
|
|
92
|
+
const t = configPath?.trim();
|
|
93
|
+
if (!t) {
|
|
94
|
+
return getApmConfigPath();
|
|
101
95
|
}
|
|
96
|
+
return node_path_1.default.isAbsolute(t) ? t : node_path_1.default.resolve((0, node_process_1.cwd)(), t);
|
|
102
97
|
}
|
|
103
|
-
function loadApmConfig() {
|
|
98
|
+
function loadApmConfig(options) {
|
|
104
99
|
try {
|
|
105
|
-
const p =
|
|
100
|
+
const p = resolveApmConfigLoadPath(options?.configPath);
|
|
101
|
+
const explicit = Boolean(options?.configPath?.trim());
|
|
106
102
|
if (!(0, node_fs_1.existsSync)(p)) {
|
|
103
|
+
if (explicit) {
|
|
104
|
+
console.error(`配置文件不存在:${p}`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
107
|
createApmConfig({ id: 0 });
|
|
108
108
|
}
|
|
109
109
|
const raw = JSON.parse((0, node_fs_1.readFileSync)(p, "utf8"));
|
|
110
|
-
migrateLegacyDeployKeyInPlace(raw);
|
|
111
110
|
return raw;
|
|
112
111
|
}
|
|
113
112
|
catch (e) {
|
|
@@ -150,6 +149,7 @@ function saveApmToken(token) {
|
|
|
150
149
|
function createApmConfig(options) {
|
|
151
150
|
const p = getApmConfigPath();
|
|
152
151
|
(0, node_fs_1.writeFileSync)(p, JSON.stringify({
|
|
152
|
+
name: "",
|
|
153
153
|
auth: {
|
|
154
154
|
id: options.id,
|
|
155
155
|
token: "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apm-config.js","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"apm-config.js","sourceRoot":"","sources":["../../src/core/apm-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-deploy-workflow.d.ts","sourceRoot":"","sources":["../../../src/core/backend-deploy/backend-deploy-workflow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backend-deploy-workflow.d.ts","sourceRoot":"","sources":["../../../src/core/backend-deploy/backend-deploy-workflow.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAGnD;;;;;;;;GAQG;AACH,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,mBAAmB;IAExD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM;IAUf,qBAAqB,CAAC,GAAG,EAAE,MAAM;CA6CxC"}
|
|
@@ -36,6 +36,9 @@ class BackendDeployWorkflow {
|
|
|
36
36
|
(0, registry_login_push_1.dockerLoginPrivateRegistry)(this.params, cwd);
|
|
37
37
|
(0, registry_login_push_1.dockerTagImage)(this.params, cwd);
|
|
38
38
|
(0, registry_login_push_1.dockerPushImage)(this.params, cwd);
|
|
39
|
+
await this.deployRemoteContainer(cwd);
|
|
40
|
+
}
|
|
41
|
+
async deployRemoteContainer(cwd) {
|
|
39
42
|
const remoteClient = (0, dockerode_client_1.createDockerodeClient)({
|
|
40
43
|
host: this.params.remoteHost,
|
|
41
44
|
port: this.params.remotePort,
|
|
@@ -46,7 +49,7 @@ class BackendDeployWorkflow {
|
|
|
46
49
|
});
|
|
47
50
|
const serveraddress = `https://${this.params.registryHost}`;
|
|
48
51
|
const image = `${this.params.registryHost}/${this.params.registryNamespace}/${this.params.image}:${this.params.tag}`;
|
|
49
|
-
const containerName = `${this.params.image}
|
|
52
|
+
const containerName = `${this.params.image}.${this.params.tag}`;
|
|
50
53
|
const existingContainerId = await remoteClient.findContainerIdByName(containerName);
|
|
51
54
|
if (existingContainerId) {
|
|
52
55
|
logger_1.Logger.info(`远程容器「${containerName}」已存在,正在停止并删除容器...`);
|
|
@@ -63,13 +66,13 @@ class BackendDeployWorkflow {
|
|
|
63
66
|
serveraddress,
|
|
64
67
|
});
|
|
65
68
|
logger_1.Logger.success("远程拉取镜像完成");
|
|
66
|
-
const envFilePath = node_path_1.default.resolve(cwd, this.params.envFilePath ||
|
|
69
|
+
const envFilePath = node_path_1.default.resolve(cwd, this.params.envFilePath || ".env");
|
|
67
70
|
const envObj = (0, dockerode_client_1.loadEnvFromFile)(envFilePath);
|
|
68
71
|
const containerId = await remoteClient.createContainer({
|
|
69
72
|
name: containerName,
|
|
70
73
|
image,
|
|
71
74
|
env: (0, env_1.toEnvArray)(envObj),
|
|
72
|
-
...(0, dockerode_client_1.parsePorts)(this.params.containerPortsMappings)
|
|
75
|
+
...(0, dockerode_client_1.parsePorts)(this.params.containerPortsMappings),
|
|
73
76
|
});
|
|
74
77
|
await remoteClient.startContainer(containerId);
|
|
75
78
|
logger_1.Logger.success("远程容器创建并启动完成");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-deploy-workflow.js","sourceRoot":"","sources":["../../../src/core/backend-deploy/backend-deploy-workflow.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA6B;AAC7B,
|
|
1
|
+
{"version":3,"file":"backend-deploy-workflow.js","sourceRoot":"","sources":["../../../src/core/backend-deploy/backend-deploy-workflow.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA6B;AAC7B,yDAI4B;AAC5B,2CAAmD;AACnD,6DAA+D;AAC/D,qCAAkC;AAClC,+DAI+B;AAC/B,6DAA+D;AAE/D,gDAAoD;AAEpD;;;;;;;;GAQG;AACH,MAAa,qBAAqB;IACH;IAA7B,YAA6B,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;IAAG,CAAC;IAE5D;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAA,4CAAuB,EAAC,GAAG,CAAC,CAAC;QAC7B,IAAA,gCAAoB,EAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtC,IAAA,4CAAuB,EAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAA,gDAA0B,EAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAA,oCAAc,EAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjC,IAAA,qCAAe,EAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,GAAW;QACrC,MAAM,YAAY,GAAG,IAAA,wCAAqB,EAAC;YACzC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAC5B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAC5B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YACpC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YAC5B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YAChC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;SAC/B,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,WAAW,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACrH,MAAM,aAAa,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAChE,MAAM,mBAAmB,GAAG,MAAM,YAAY,CAAC,qBAAqB,CAClE,aAAa,CACd,CAAC;QACF,IAAI,mBAAmB,EAAE,CAAC;YACxB,eAAM,CAAC,IAAI,CAAC,QAAQ,aAAa,mBAAmB,CAAC,CAAC;YACtD,MAAM,YAAY,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;YACtD,MAAM,YAAY,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,MAAM,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,eAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACvC,MAAM,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE;YAClC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YAClC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;YACtC,aAAa;SACd,CAAC,CAAC;QACH,eAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE3B,MAAM,WAAW,GAAG,mBAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAA,kCAAe,EAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC;YACrD,IAAI,EAAE,aAAa;YACnB,KAAK;YACL,GAAG,EAAE,IAAA,gBAAU,EAAC,MAAM,CAAC;YACvB,GAAG,IAAA,6BAAU,EAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;SAClD,CAAC,CAAC;QACH,MAAM,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC/C,eAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;CACF;AA7DD,sDA6DC"}
|
|
@@ -8,7 +8,7 @@ exports.toEnvArray = toEnvArray;
|
|
|
8
8
|
const node_fs_1 = require("node:fs");
|
|
9
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
10
|
function loadEnvFromFile(envFilePath) {
|
|
11
|
-
if (!envFilePath) {
|
|
11
|
+
if (!envFilePath || !(0, node_fs_1.statSync)(envFilePath).isFile()) {
|
|
12
12
|
return {};
|
|
13
13
|
}
|
|
14
14
|
const targetPath = node_path_1.default.resolve(envFilePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/env.ts"],"names":[],"mappings":";;;;;AAGA,0CAyBC;AAED,gCAEC;AAhCD,
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../../src/core/backend-deploy/dockerode-client/env.ts"],"names":[],"mappings":";;;;;AAGA,0CAyBC;AAED,gCAEC;AAhCD,qCAAiD;AACjD,0DAA6B;AAE7B,SAAgB,eAAe,CAAC,WAAmB;IACjD,IAAI,CAAC,WAAW,IAAI,CAAC,IAAA,kBAAQ,EAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,UAAU,GAAG,mBAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,UAAU,KAAK,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAC5C,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,UAAU,CAAC,GAA2B;IACpD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AACtE,CAAC"}
|
package/dist/core/minio.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export declare function sanitizeRelativePath(raw: string): string;
|
|
|
16
16
|
export declare function toArtifactObjectKey(input: {
|
|
17
17
|
branchName: string;
|
|
18
18
|
relativePath: string;
|
|
19
|
+
/** 项目前缀,来自 apm.config.json 顶层 `name`;缺省则与旧行为一致(无前缀) */
|
|
20
|
+
namePrefix?: string;
|
|
19
21
|
}): string;
|
|
20
22
|
export declare function isDirectoryPath(absPath: string): Promise<boolean>;
|
|
21
23
|
export declare function readArtifactFile(absPath: string): Promise<Buffer>;
|
package/dist/core/minio.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minio.d.ts","sourceRoot":"","sources":["../../src/core/minio.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkB9C,CAAC;AAEF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUxD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"minio.d.ts","sourceRoot":"","sources":["../../src/core/minio.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkB9C,CAAC;AAEF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUxD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAST;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvE;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAK3E;AAqBD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1C;AAwBD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,EAAE,kBAAkB;IAUjC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BpE,SAAS,CACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC,IAAI,CAAC;IAIV,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzD"}
|
package/dist/core/minio.js
CHANGED
|
@@ -46,9 +46,14 @@ function sanitizeRelativePath(raw) {
|
|
|
46
46
|
return segs.join("/");
|
|
47
47
|
}
|
|
48
48
|
function toArtifactObjectKey(input) {
|
|
49
|
-
|
|
49
|
+
const base = `${input.branchName}/dist/${input.relativePath}`
|
|
50
50
|
.replace(/\/+/g, "/")
|
|
51
51
|
.replace(/^\//, "");
|
|
52
|
+
const prefix = (input.namePrefix ?? "").trim().replace(/^\/+|\/+$/g, "");
|
|
53
|
+
if (!prefix) {
|
|
54
|
+
return base;
|
|
55
|
+
}
|
|
56
|
+
return `${prefix}/${base}`.replace(/\/+/g, "/");
|
|
52
57
|
}
|
|
53
58
|
async function isDirectoryPath(absPath) {
|
|
54
59
|
try {
|
package/dist/core/minio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minio.js","sourceRoot":"","sources":["../../src/core/minio.ts"],"names":[],"mappings":";;;;;;AAwCA,oDAUC;AAED,
|
|
1
|
+
{"version":3,"file":"minio.js","sourceRoot":"","sources":["../../src/core/minio.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -88,7 +88,7 @@ description: 从创建分支到需求的开发的完整流程,当用户明确
|
|
|
88
88
|
|
|
89
89
|
**前置**:开发模式判定为 **Spec**;若已走 Quick,**不得**执行本节。
|
|
90
90
|
|
|
91
|
-
1. 读取并遵循:`.
|
|
91
|
+
1. 读取并遵循:`.apm/skills/apm-propose/SKILL.md`。
|
|
92
92
|
2. **输入(必须)**:**`requirementId`**;**`.apm/workitems/<requirementId>/prd.md`** 须 Read 全文。**不要**追问。
|
|
93
93
|
3. **输出**:回报 **`.apm/workitems/<requirementId>/`**,并确认已写入 `proposal.md`、`design.md`、`tasks.md` 与 `specs/`(按 SKILL)。
|
|
94
94
|
|
|
@@ -100,7 +100,7 @@ description: 从创建分支到需求的开发的完整流程,当用户明确
|
|
|
100
100
|
|
|
101
101
|
**前置**:仅 **Spec** 模式;步骤 4(Spec)已成功。
|
|
102
102
|
|
|
103
|
-
1. 读取并遵循:`.
|
|
103
|
+
1. 读取并遵循:`.apm/skills/apm-apply-change/SKILL.md`。
|
|
104
104
|
2. **输入(必须)**:**`requirementId`**(与步骤 4 同源);主 Agent 传入步骤 4 的结构化结果。
|
|
105
105
|
3. 按 `tasks.md` 执行直至完成或硬阻塞。
|
|
106
106
|
|
|
@@ -126,7 +126,7 @@ description: 从创建分支到需求的开发的完整流程,当用户明确
|
|
|
126
126
|
|
|
127
127
|
## 步骤 8 — 子 Agent:部署&同步状态
|
|
128
128
|
|
|
129
|
-
1.
|
|
129
|
+
1. 调用**Read**工具阅读 `.apm/skills/code-deploy/SKILL.md`,严格按照其要求将项目部署到测试环境
|
|
130
130
|
2. 执行CLI命令更新需求状态 `apm status requirement <需求ID>`
|
|
131
131
|
---
|
|
132
132
|
|
|
@@ -70,7 +70,7 @@ description: 基于 requirementId 与 `.apm/workitems/<id>/bugs/` 下的 status.
|
|
|
70
70
|
### 步骤 3 — 子 Agent:部署测试环境
|
|
71
71
|
|
|
72
72
|
1. 本步骤须在**步骤 2 的循环结束后**执行(所有待处理缺陷已处理完毕,或同步后本就没有待处理项)。
|
|
73
|
-
2.
|
|
73
|
+
2. 调用**Read**工具阅读 `.apm/skills/code-deploy/SKILL.md`,严格按照其要求执行部署;**未说明目标环境时,以 `code-deploy` 技能为准,默认部署到测试环境**。
|
|
74
74
|
3. 若部署失败,输出失败原因并将流程标记为失败,不得宣称全流程完成。
|
|
75
75
|
|
|
76
76
|
**完成判定**:`code-deploy` 按该技能约定执行完毕且未判定为失败。
|
|
@@ -66,7 +66,7 @@ b. **按各类工件的说明与模板**组织正文,内容严格以 **PRD**
|
|
|
66
66
|
|
|
67
67
|
#### `proposal` → `proposal.md`
|
|
68
68
|
|
|
69
|
-
- **Instruction**:按「单会话读取策略」读取 **`.
|
|
69
|
+
- **Instruction**:按「单会话读取策略」读取 **`.apm/skills/apm-propose/propose-instruction.md`**(每个流程一次)。
|
|
70
70
|
- **依赖**:以该文件 **「依赖」** 为准(**Read** 时机见「单会话读取策略」)。
|
|
71
71
|
- **再写**:`.apm/workitems/<requirementId>/proposal.md`,严格遵循其中的 **Instruction** 与 **Template**(Why / What Changes / Capabilities / Impact)。
|
|
72
72
|
- **Capabilities** 与后续 **`specs/*.md`** 一一可追溯;填写前可 **Read** `.apm/product-capability-inventory/` 等本仓库能力文档,避免与既有 CAP/命名冲突(路径以仓库实际为准)。
|
|
@@ -74,21 +74,21 @@ b. **按各类工件的说明与模板**组织正文,内容严格以 **PRD**
|
|
|
74
74
|
|
|
75
75
|
#### `design` → `design.md`
|
|
76
76
|
|
|
77
|
-
- **Instruction**:**`.
|
|
77
|
+
- **Instruction**:**`.apm/skills/apm-propose/design-instruction.md`**(每个流程一次)。
|
|
78
78
|
- **依赖**:以该文件 **「依赖」** 为准(**Read** 时机见「单会话读取策略」)。
|
|
79
79
|
- **再写**:`.apm/workitems/<requirementId>/design.md`,严格遵循其中的 **Instruction** 与 **Template**(Context、Goals/Non-Goals、Decisions、Risks/Trade-offs、Migration Plan、Open Questions)。
|
|
80
80
|
- 说明「何时写满 / 可写精简版」的条件以 **design-instruction** 为准;与本仓库 **`tasks.md`** 的分工是:design 定方案与取舍,tasks 拆可执行步与 **预期改动路径**。
|
|
81
81
|
|
|
82
82
|
#### `specs` → `specs/*.md`
|
|
83
83
|
|
|
84
|
-
- **Instruction**:**`.
|
|
84
|
+
- **Instruction**:**`.apm/skills/apm-propose/specs-instruction.md`**(每个流程一次)。
|
|
85
85
|
- **依赖**:以该文件 **「依赖」** 为准(**Read** 时机见「单会话读取策略」)。
|
|
86
86
|
- **再写**:`.apm/workitems/<requirementId>/specs/` 下文件,严格遵循 **specs-instruction** 中的写作说明与模板(新增/变更/移除/重命名分块、`### 需求` / `#### 场景`、须/必须、**当**/**则** 等)。
|
|
87
87
|
- **与 proposal 对齐**:**proposal** 能力列表中每一项须在 `specs/` 有对应;命名与 **`propose-instruction.md`** 短横线文件名约定一致;细则以 **specs-instruction** 为准。
|
|
88
88
|
|
|
89
89
|
#### `tasks` → `tasks.md`
|
|
90
90
|
|
|
91
|
-
- **Instruction**:**`.
|
|
91
|
+
- **Instruction**:**`.apm/skills/apm-propose/tasks-instruction.md`**(每个流程一次)。
|
|
92
92
|
- **依赖**:以该文件 **「依赖」** 为准;写 **tasks** 时对**需求编号、路径、spec 条目**须有可靠依据,若会话内记忆不足则按「单会话读取策略」对相关落盘文件 **Read**。
|
|
93
93
|
- **再写**:`.apm/workitems/<requirementId>/tasks.md`,严格遵循 **tasks-instruction**(**`- [ ]`**、分组 **`## 1.`**、编号 **1.1 / 2.1**、四条元数据子列表等)。
|
|
94
94
|
- **口径**:做什么以 **specs** 为准,落在哪里以 **design** 为准;**预期改动路径** 与 design 一致。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
生成 **`design.md`** 时说明 **如何实现**(HOW):架构与决策为主,不写逐行代码。动机与范围以 **`proposal.md`** 为准,需求细节以 **`prd.md`** 与后续 **`specs/`** 为准。
|
|
4
4
|
|
|
5
|
-
**工件 DAG、单会话减少重复 Read**:见 **`.
|
|
5
|
+
**工件 DAG、单会话减少重复 Read**:见 **`.apm/skills/apm-propose/SKILL.md`**(「工件依赖」「单会话读取策略」)。
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
生成 **`proposal.md`** 时须建立 **「为何要做」**,并与后续 **`specs/`** 对齐:**Capabilities** 段落是 proposal 与 specs 之间的契约。
|
|
4
4
|
|
|
5
|
-
**工件 DAG、单会话减少重复 Read**:见 **`.
|
|
5
|
+
**工件 DAG、单会话减少重复 Read**:见 **`.apm/skills/apm-propose/SKILL.md`**(「工件依赖」「单会话读取策略」)。
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
在工作项目录下生成 **`specs/`** 内的规格文件,定义系统 **应做什么**,与 **`design.md`**(如何实现)区分。内容须可验证:**每条「需求」下须有至少一个「场景」**。
|
|
4
4
|
|
|
5
|
-
**工件 DAG、单会话减少重复 Read**:见 **`.
|
|
5
|
+
**工件 DAG、单会话减少重复 Read**:见 **`.apm/skills/apm-propose/SKILL.md`**(「工件依赖」「单会话读取策略」)。
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
生成 **`tasks.md`**:把实现工作拆成**可勾选、可追踪**的条款。后续 **apm-apply-change** 依赖 **`- [ ]` / `- [x]`** 勾选推进,格式须严格遵守。
|
|
4
4
|
|
|
5
|
-
**工件 DAG、单会话减少重复 Read**:见 **`.
|
|
5
|
+
**工件 DAG、单会话减少重复 Read**:见 **`.apm/skills/apm-propose/SKILL.md`**(「工件依赖」「单会话读取策略」)。
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -45,7 +45,7 @@ description: 仅在用户明确表达要更新或同步产品能力清单(.apm
|
|
|
45
45
|
**动作(按顺序执行)**
|
|
46
46
|
|
|
47
47
|
1. 若不存在 `.apm/product-capability-inventory/`,**创建该目录**。
|
|
48
|
-
2. **放置使用说明书**:将 **`.
|
|
48
|
+
2. **放置使用说明书**:将 **`.apm/skills/product-capability-inventory/使用说明书.md`** **复制**为 **`.apm/product-capability-inventory/使用说明书.md`**(内容保持与模板一致;若目标文件已存在且非空,可跳过覆盖,除非用户要求重置)。
|
|
49
49
|
3. 创建 `.apm/product-capability-inventory/README.md`:写明用途,包含 **子系统列表** 表格(可占位),并含指向 **`[使用说明书.md](./使用说明书.md)`** 的链接或一句引导。
|
|
50
50
|
4. 选定 `<系统名>`,创建 `.apm/product-capability-inventory/<系统名>/index.md`,且 **[`目录规范.md`](./目录规范.md)** 中 **`index.md` 各章节**均已出现(表格可空、须有句说明或一行初始化记录)。
|
|
51
51
|
5. 若可从代码识别菜单/路由(如 `apps/fe/src/router/menus.tsx`),至少草拟 **1 个** `CAP-*.md` 示例,并在 `index.md` 的 **能力条目目录** 表中登记一行。
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
- **`.apm/product-capability-inventory/使用说明书.md`(阅读指引,来自模板)**
|
|
9
9
|
|
|
10
|
-
- **来源**:初始化时从技能目录 **`.
|
|
10
|
+
- **来源**:初始化时从技能目录 **`.apm/skills/product-capability-inventory/使用说明书.md`** **原样复制**到上述路径(文件名固定为 `使用说明书.md`)。
|
|
11
11
|
- **作用**:面向产品/研发/读者的**使用说明**,与总览 `README.md` 分工:`README.md` 列子系统入口;`使用说明书.md` 说明如何阅读清单、CAP 含义、维护入口指向技能。
|
|
12
12
|
- 团队可在 `.apm/` 下的副本中增删段落;技能目录中的文件作为**模板母版**,下次新仓库初始化时仍从母版复制。
|
|
13
13
|
|