@cnbcool/cnb-cli 1.0.0 → 1.0.1
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 +2 -37
- package/package.json +26 -6
- package/.cnb.yml +0 -37
- package/DEVELOPMENT.md +0 -345
- package/cag.config.js +0 -57
- package/downloads/1773729361207-dsfgely.png +0 -0
- package/skills/artifact-migrate/README.md +0 -79
- package/skills/artifact-migrate/SKILL.md +0 -674
- package/skills/auto-code/SKILL.md +0 -71
- package/skills/auto-code/hooks/hooks.json +0 -15
- package/skills/cnb-code-import/LICENSE +0 -20
- package/skills/cnb-code-import/README.md +0 -311
- package/skills/cnb-code-import/SKILL.md +0 -368
- package/skills/cnb-code-import/scripts/migrate.sh +0 -371
- package/skills/cnb-skill/SKILL.md +0 -100
- package/skills/code-review/README.md +0 -3
- package/skills/code-review/SKILL.md +0 -131
- package/skills/code-review/hooks/hooks.json +0 -15
- package/skills/diagnose-pr-pipeline/README.md +0 -3
- package/skills/diagnose-pr-pipeline/SKILL.md +0 -88
- package/skills/dialog-ci-log/README.md +0 -16
- package/skills/dialog-ci-log/SKILL.md +0 -41
- package/skills/dialog-ci-log/scrips/get-failed-stage-logs.js +0 -124
- package/skills/pr-diff/README.md +0 -3
- package/skills/pr-diff/SKILL.md +0 -97
- package/skills/pr-summary/README.md +0 -3
- package/skills/pr-summary/SKILL.md +0 -70
- package/skills/tapd-resource-fetcher/README.md +0 -3
- package/skills/tapd-resource-fetcher/SKILL.md +0 -97
- package/skills/text-path-converter/README.md +0 -3
- package/skills/text-path-converter/SKILL.md +0 -30
- package/skills/text-path-converter/scripts/convertLink.js +0 -148
- package/test.js +0 -1
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: diagnose-pr-pipeline
|
|
3
|
-
description: 用于获取 CNB 平台合并请求(Pull Request)报错的详细信息。当合并请求触发的 CI 流水线出现失败、报错、构建异常等情况时,可使用本 Skill 逐步定位具体报错原因。执行流程包括:查询 PR 状态检查获取构建编号、查询流水线构建状态获取失败 Stage ID、查询 Stage 详情获取具体报错信息。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 获取合并请求报错详情
|
|
7
|
-
|
|
8
|
-
## 描述
|
|
9
|
-
|
|
10
|
-
当 CNB 平台合并请求(Pull Request)触发的 CI 流水线出现报错时,通过本 Skill 可以逐步定位并获取具体的报错详情信息。
|
|
11
|
-
|
|
12
|
-
> ⚠️ **注意:以下步骤必须严格按顺序执行,每一步的输出结果是下一步的输入依据。**
|
|
13
|
-
|
|
14
|
-
## 依赖
|
|
15
|
-
|
|
16
|
-
- [cnb-skill]: 提供与CNB(Cloud Native Build)OpenAPI的完整交互能力,支持项目、组织、代码仓库、Issue、PR、合并请求、流水线,制品库等核心功能的增删改查操作。适用于开发协作、代码管理和CI/CD流程管理场景。关键词:CNB、云原生构建、组织、代码仓库、Issue、PR、合并请求、流水线、制品库,查询、新增、修改、删除、评论、合并、审批。
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## 使用步骤
|
|
21
|
-
|
|
22
|
-
### Step 1:查询 Pull Request 的状态检查
|
|
23
|
-
|
|
24
|
-
查询指定 Pull Request 的状态检查信息,从返回结果中找到**状态检查的详细信息链接地址**。
|
|
25
|
-
|
|
26
|
-
链接地址格式如下:
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
{CNB_WEB_ENDPOINT}/{CNB_REPO_SLUG}/-/build/logs/{sn}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
| 参数 | 说明 |
|
|
33
|
-
| ------------------- | ------------------------ |
|
|
34
|
-
| `CNB_WEB_ENDPOINT` | CNB 平台的 Web 访问地址 |
|
|
35
|
-
| `CNB_REPO_SLUG` | 仓库的唯一标识(slug) |
|
|
36
|
-
| `sn` | 流水线构建编号 |
|
|
37
|
-
|
|
38
|
-
**目标:** 从链接地址中提取 `{sn}`,即流水线构建编号,供下一步使用。
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
### Step 2:查询流水线构建状态
|
|
43
|
-
|
|
44
|
-
使用上一步获取到的流水线构建编号 `{sn}`,查询该流水线的构建状态。
|
|
45
|
-
|
|
46
|
-
从返回结果中找到**失败的 Stage ID**。
|
|
47
|
-
|
|
48
|
-
**目标:** 获取失败 Stage 的 `id`,供下一步使用。
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
### Step 3:查询流水线 Stage 详情
|
|
53
|
-
|
|
54
|
-
使用上一步获取到失败 Stage 的 `id`,查询该 Stage 的详细信息。
|
|
55
|
-
|
|
56
|
-
从返回结果中找到**具体的报错信息**。
|
|
57
|
-
|
|
58
|
-
**目标:** 获取完整的报错详情,定位问题根因。
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## 执行流程图
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
查询 PR 状态检查
|
|
66
|
-
│
|
|
67
|
-
▼
|
|
68
|
-
提取详情链接中的构建编号 {sn}
|
|
69
|
-
│
|
|
70
|
-
▼
|
|
71
|
-
查询流水线构建状态(入参:{sn})
|
|
72
|
-
│
|
|
73
|
-
▼
|
|
74
|
-
提取失败的 Stage ID
|
|
75
|
-
│
|
|
76
|
-
▼
|
|
77
|
-
查询 Stage 详情(入参:stage_id)
|
|
78
|
-
│
|
|
79
|
-
▼
|
|
80
|
-
获取具体报错信息 ✅
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## 注意事项
|
|
86
|
-
|
|
87
|
-
- 每一步必须在上一步**成功获取到所需参数**后再执行,不可跳步。
|
|
88
|
-
- 若 Step 2 返回的构建中存在多个失败 Stage,可逐一查询每个失败 Stage 的详情,以获取完整的报错信息。
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# dialog-ci-log
|
|
2
|
-
|
|
3
|
-
一个 Skill,用于查询 CNB CI 流水线的失败日志,快速定位构建失败原因。
|
|
4
|
-
|
|
5
|
-
## 能力说明
|
|
6
|
-
|
|
7
|
-
当你提供以下任一信息时,Skill 会自动查询并分析流水线的报错日志:
|
|
8
|
-
|
|
9
|
-
- **构建编号(sn)**,如 `cnb-lf3-1jk2v2sl2`
|
|
10
|
-
- **构建日志链接**,如 `https://cnb.woa.com/{repo}/-/build/logs/{sn}`
|
|
11
|
-
|
|
12
|
-
Skill 会自动完成以下工作:
|
|
13
|
-
|
|
14
|
-
1. 从输入中解析仓库标识和构建编号
|
|
15
|
-
2. 查询流水线中所有失败 Stage 的详细日志
|
|
16
|
-
3. 汇总失败原因,并给出修复建议
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: dialog-ci-log
|
|
3
|
-
description: 传入流水线的 sn ,查询 CI 流水线的错误日志。当用户提供 CI 构建链接或 sn 编号,想查看流水线报错、构建失败原因时使用。
|
|
4
|
-
allowed-tools: Bash,Read,Write,Edit,Glob,Grep
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# 查询 CI 流水线错误日志
|
|
8
|
-
|
|
9
|
-
## 使用场景
|
|
10
|
-
|
|
11
|
-
用户提供以下任一信息时触发:
|
|
12
|
-
- 流水线构建编号(sn),如 `cnb-lf3-1jk2v2sl2`
|
|
13
|
-
- 构建日志链接,如 `${CNB_WEB_ENDPOINT}/{repo}/-/build/logs/{sn}`
|
|
14
|
-
|
|
15
|
-
## 执行步骤
|
|
16
|
-
|
|
17
|
-
### Step 1:解析参数
|
|
18
|
-
|
|
19
|
-
从用户输入中提取必要信息:
|
|
20
|
-
|
|
21
|
-
- **如果用户给了链接**:从 URL 中解析出 `CNB_REPO_SLUG` 和 `sn`
|
|
22
|
-
- URL 格式:`${CNB_WEB_ENDPOINT}/{CNB_REPO_SLUG}/-/build/logs/{sn}`
|
|
23
|
-
- `CNB_WEB_ENDPOINT` 从环境变量获取,默认为 `https://cnb.cool`
|
|
24
|
-
- 例:`https://cnb.cool/group/repo/-/build/logs/cnb-lf3-1jk2v2sl2` → `CNB_REPO_SLUG=group/repo`, `sn=cnb-lf3-1jk2v2sl2`
|
|
25
|
-
|
|
26
|
-
`CNB_TOKEN` 从环境变量获取,若不存在则向用户询问。
|
|
27
|
-
|
|
28
|
-
### Step 2:运行脚本获取日志
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
node ~/.codebuddy/skills/dialog-ci-log/scripts/get-failed-stage-logs.js {sn}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
脚本路径:项目根目录下的 `scripts/get-failed-stage-logs.js`
|
|
35
|
-
|
|
36
|
-
### Step 3:分析并汇报结果
|
|
37
|
-
|
|
38
|
-
根据脚本输出:
|
|
39
|
-
1. 列出所有失败的 Stage 名称
|
|
40
|
-
2. 提取关键报错信息,给出简明的失败原因总结
|
|
41
|
-
3. 如有可能,给出修复建议
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 查询流水线失败 Stage 日志
|
|
5
|
-
*
|
|
6
|
-
* 用法: node scripts/get-failed-stage-logs.js <sn>
|
|
7
|
-
*
|
|
8
|
-
* 环境变量:
|
|
9
|
-
* CNB_API_ENDPOINT - API 地址,默认 https://api.cnb.cool
|
|
10
|
-
* CNB_REPO_SLUG - 仓库标识,如 owner/repo(必填)
|
|
11
|
-
* PLUGIN_CNB_ACCESS_TOKEN - 访问令牌(必填)
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
const sn = process.argv[2];
|
|
15
|
-
if (!sn) {
|
|
16
|
-
console.error('用法: node scripts/get-failed-stage-logs.js <sn>');
|
|
17
|
-
process.exit(1);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const API_ENDPOINT = process.env.CNB_API_ENDPOINT;
|
|
21
|
-
const REPO_SLUG = process.env.CNB_REPO_SLUG;
|
|
22
|
-
const TOKEN = process.env.PLUGIN_CNB_ACCESS_TOKEN;
|
|
23
|
-
|
|
24
|
-
if (!REPO_SLUG) {
|
|
25
|
-
console.error('缺少环境变量 CNB_REPO_SLUG');
|
|
26
|
-
process.exit(1);
|
|
27
|
-
}
|
|
28
|
-
if (!TOKEN) {
|
|
29
|
-
console.error('缺少环境变量 PLUGIN_CNB_ACCESS_TOKEN');
|
|
30
|
-
process.exit(1);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const HEADERS = {
|
|
34
|
-
Accept: 'application/vnd.cnb.api+json',
|
|
35
|
-
Authorization: TOKEN,
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
async function request(path) {
|
|
39
|
-
const url = `${API_ENDPOINT}/${REPO_SLUG}${path}`;
|
|
40
|
-
const res = await fetch(url, { headers: HEADERS });
|
|
41
|
-
if (!res.ok) {
|
|
42
|
-
throw new Error(`请求失败: ${res.status} ${res.statusText} — ${url}`);
|
|
43
|
-
}
|
|
44
|
-
return res.json();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
async function getBuildStatus(sn) {
|
|
48
|
-
return request(`/-/build/status/${sn}`);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function getStageDetail(sn, pipelineId, stageId) {
|
|
52
|
-
return request(`/-/build/logs/stage/${sn}/${pipelineId}/${stageId}`);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
async function main() {
|
|
56
|
-
console.log(`查询构建 sn=${sn} 的流水线状态...\n`);
|
|
57
|
-
|
|
58
|
-
const buildStatus = await getBuildStatus(sn);
|
|
59
|
-
|
|
60
|
-
if (!buildStatus.pipelinesStatus || typeof buildStatus.pipelinesStatus !== 'object') {
|
|
61
|
-
console.log('未找到流水线状态信息');
|
|
62
|
-
console.log('返回数据:', JSON.stringify(buildStatus, null, 2));
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const pipelines = Object.entries(buildStatus.pipelinesStatus);
|
|
67
|
-
if (pipelines.length === 0) {
|
|
68
|
-
console.log('该构建没有流水线');
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
let hasFailure = false;
|
|
73
|
-
|
|
74
|
-
for (const [pipelineName, pipeline] of pipelines) {
|
|
75
|
-
const { id: pipelineId, status, stages } = pipeline;
|
|
76
|
-
|
|
77
|
-
if (!Array.isArray(stages)) continue;
|
|
78
|
-
|
|
79
|
-
const failedStages = stages.filter((s) => s.status === 'error');
|
|
80
|
-
if (failedStages.length === 0) continue;
|
|
81
|
-
|
|
82
|
-
hasFailure = true;
|
|
83
|
-
console.log(`━━━ 流水线: ${pipelineName} (status: ${status}) ━━━\n`);
|
|
84
|
-
|
|
85
|
-
for (const stage of failedStages) {
|
|
86
|
-
console.log(`▸ 失败 Stage: ${stage.name || stage.id} (status: ${stage.status})`);
|
|
87
|
-
|
|
88
|
-
try {
|
|
89
|
-
const detail = await getStageDetail(sn, pipelineId, stage.id);
|
|
90
|
-
|
|
91
|
-
if (detail.error) {
|
|
92
|
-
console.log(` 错误信息: ${detail.error}`);
|
|
93
|
-
}
|
|
94
|
-
if (detail.duration != null) {
|
|
95
|
-
console.log(` 耗时: ${detail.duration}ms`);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (Array.isArray(detail.content) && detail.content.length > 0) {
|
|
99
|
-
console.log(' ─── 日志 ───');
|
|
100
|
-
for (const line of detail.content) {
|
|
101
|
-
console.log(` ${line}`);
|
|
102
|
-
}
|
|
103
|
-
console.log(' ─── 日志结束 ───');
|
|
104
|
-
} else {
|
|
105
|
-
console.log(' (无日志内容)');
|
|
106
|
-
}
|
|
107
|
-
} catch (e) {
|
|
108
|
-
console.error(` 查询 Stage 详情失败: ${e.message}`);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
console.log();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (!hasFailure) {
|
|
116
|
-
console.log('所有流水线均无失败的 Stage');
|
|
117
|
-
console.log(`整体构建状态: ${buildStatus.status}`);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
main().catch((e) => {
|
|
122
|
-
console.error(`执行失败: ${e.message}`);
|
|
123
|
-
process.exit(1);
|
|
124
|
-
});
|
package/skills/pr-diff/README.md
DELETED
package/skills/pr-diff/SKILL.md
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pr-diff
|
|
3
|
-
description: 获取 PR 的 diff 变更信息。当需要查看 PR 代码变更、获取文件差异时使用此技能。
|
|
4
|
-
allowed-tools: Bash
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# 获取 PR Diff
|
|
8
|
-
|
|
9
|
-
获取 PR 的代码变更差异信息,用于代码评审、变更总结等场景。
|
|
10
|
-
|
|
11
|
-
## 1. 判断场景并获取 SHA
|
|
12
|
-
|
|
13
|
-
### 场景 A:PR 评论触发(`CNB_PULL_REQUEST_IID` 存在)
|
|
14
|
-
|
|
15
|
-
直接从环境变量获取:
|
|
16
|
-
- head SHA:`CNB_PULL_REQUEST_SHA`
|
|
17
|
-
- target SHA:`CNB_PULL_REQUEST_TARGET_SHA`
|
|
18
|
-
|
|
19
|
-
若环境变量不存在,通过 API 查询当前 PR 详情。
|
|
20
|
-
|
|
21
|
-
### 场景 B:Issue 或其他场景引用 PR
|
|
22
|
-
|
|
23
|
-
用户输入中提及了 PR 编号(如 `!45`),需要:
|
|
24
|
-
1. 从用户输入中解析 PR 编号
|
|
25
|
-
2. 通过 API 查询该 PR 详情获取 SHA
|
|
26
|
-
3. fetch 对应的 commit(本地可能没有)
|
|
27
|
-
|
|
28
|
-
### API 查询 PR 详情
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
# 将 ${pr_iid} 替换为实际 PR 编号
|
|
32
|
-
pr_info=$(curl -s \
|
|
33
|
-
"${CNB_API_ENDPOINT:-https://api.cnb.cool}/${CNB_REPO_SLUG}/-/pulls/${pr_iid}" \
|
|
34
|
-
-H "Accept: application/vnd.cnb.api+json" \
|
|
35
|
-
-H "Authorization: Bearer $CNB_TOKEN")
|
|
36
|
-
|
|
37
|
-
head_sha=$(echo "$pr_info" | jq -r '.head.sha')
|
|
38
|
-
target_sha=$(echo "$pr_info" | jq -r '.base.sha')
|
|
39
|
-
|
|
40
|
-
# 场景 B 需要确保本地有这些 commit
|
|
41
|
-
git fetch origin "$head_sha" "$target_sha" 2>/dev/null || git fetch origin
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## 2. 获取 Diff
|
|
45
|
-
|
|
46
|
-
### 获取变更文件列表
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
git diff --name-only "${target_sha}...${head_sha}"
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### 获取变更统计
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
git diff --stat "${target_sha}...${head_sha}"
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### 获取完整 Diff
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
git diff -U5 "${target_sha}...${head_sha}"
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### 获取特定文件的 Diff
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
git diff -U5 "${target_sha}...${head_sha}" -- path/to/file.ts
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## 3. 过滤文件
|
|
71
|
-
|
|
72
|
-
根据使用场景,可排除无需关注的文件:
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
# 常见排除模式
|
|
76
|
-
git diff -U5 "${target_sha}...${head_sha}" -- . \
|
|
77
|
-
':!package-lock.json' ':!yarn.lock' ':!pnpm-lock.yaml' ':!go.sum' ':!*.lock' \
|
|
78
|
-
':!*.png' ':!*.jpg' ':!*.gif' ':!*.svg' ':!*.ico' \
|
|
79
|
-
':!*.min.js' ':!*.min.css' ':!*.map' \
|
|
80
|
-
':!dist/*' ':!build/*' ':!node_modules/*'
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**可排除的文件类型**:
|
|
84
|
-
- 锁文件:`package-lock.json`、`yarn.lock`、`pnpm-lock.yaml`、`go.sum`、`Cargo.lock`
|
|
85
|
-
- 图片/字体:`*.png`、`*.jpg`、`*.gif`、`*.svg`、`*.woff`、`*.ttf`
|
|
86
|
-
- 二进制:`*.exe`、`*.dll`、`*.so`、`*.jar`、`*.pyc`
|
|
87
|
-
- 压缩包:`*.zip`、`*.tar.gz`、`*.rar`
|
|
88
|
-
- 构建产物:`dist/`、`build/`、`out/`、`target/`、`.next/`
|
|
89
|
-
- 依赖目录:`node_modules/`、`vendor/`、`.venv/`
|
|
90
|
-
- 压缩文件:`*.min.js`、`*.min.css`、`*.map`
|
|
91
|
-
|
|
92
|
-
## 4. 使用建议
|
|
93
|
-
|
|
94
|
-
1. **diff 过大时**:先用 `--name-only` 查看文件列表,再按需获取具体文件
|
|
95
|
-
2. **代码评审**:建议排除锁文件、图片、构建产物
|
|
96
|
-
3. **变更总结**:可保留更多文件,但排除二进制和依赖目录
|
|
97
|
-
4. **上下文行数**:`-U5` 提供 5 行上下文,可按需调整
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pr-summary
|
|
3
|
-
description: PR 变更总结工具。仅用于合并请求(PR)场景。当用户请求总结 PR 变更、概述改动内容、生成变更说明时使用此技能。
|
|
4
|
-
allowed-tools: Bash,Read,Glob,Grep
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# PR 变更总结
|
|
8
|
-
|
|
9
|
-
对 PR 的代码变更进行分析,生成结构化的变更总结。
|
|
10
|
-
|
|
11
|
-
## 执行步骤
|
|
12
|
-
|
|
13
|
-
### 1. 获取变更信息
|
|
14
|
-
|
|
15
|
-
使用 **pr-diff** Skill 获取 PR 变更:
|
|
16
|
-
- 先获取变更统计(`--stat`)和文件列表(`--name-only`)
|
|
17
|
-
- 再按需获取关键文件的具体 diff
|
|
18
|
-
|
|
19
|
-
### 2. 过滤文件
|
|
20
|
-
|
|
21
|
-
**优先分析**(核心代码):
|
|
22
|
-
- 业务逻辑:`src/`、`lib/`、`app/`、`packages/`
|
|
23
|
-
- API/接口:`api/`、`routes/`、`controllers/`
|
|
24
|
-
- 配置文件:`*.config.*`、`*.yml`、`*.yaml`
|
|
25
|
-
- 数据库/模型:`models/`、`schema/`、`migrations/`
|
|
26
|
-
|
|
27
|
-
**跳过**(非核心文件):
|
|
28
|
-
- 依赖锁文件:`package-lock.json`、`yarn.lock`、`go.sum`
|
|
29
|
-
- 构建产物:`dist/`、`build/`、`.next/`
|
|
30
|
-
- 生成文件:`*.min.js`、`*.map`
|
|
31
|
-
- 纯测试文件(除非测试是本次变更重点)
|
|
32
|
-
|
|
33
|
-
### 3. 分析变更
|
|
34
|
-
|
|
35
|
-
按以下维度分析:
|
|
36
|
-
|
|
37
|
-
| 维度 | 关注点 |
|
|
38
|
-
|------|--------|
|
|
39
|
-
| **变更类型** | feat(新功能)、fix(修复)、refactor(重构)、perf(性能)、docs(文档)、chore(配置/依赖) |
|
|
40
|
-
| **影响范围** | 涉及哪些模块、影响哪些功能点 |
|
|
41
|
-
| **关键改动** | 核心逻辑变更、API 变化、数据结构变更 |
|
|
42
|
-
| **破坏性变更** | 不兼容改动、需要迁移的内容 |
|
|
43
|
-
|
|
44
|
-
若上下文不足以理解代码意图,使用 Read 工具读取完整源文件。
|
|
45
|
-
|
|
46
|
-
## 输出格式
|
|
47
|
-
|
|
48
|
-
```markdown
|
|
49
|
-
**{type}**: {一句话描述}
|
|
50
|
-
|
|
51
|
-
**主要改动**
|
|
52
|
-
- {模块}: {变更说明}
|
|
53
|
-
- {模块}: {变更说明}
|
|
54
|
-
|
|
55
|
-
**注意**: {破坏性变更或风险点;如无则省略}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## 总结原则
|
|
59
|
-
|
|
60
|
-
1. **简洁明了**:突出重点,避免逐行复述 diff
|
|
61
|
-
2. **按功能分组**:按模块/功能组织,而非逐文件罗列
|
|
62
|
-
3. **突出意图**:说明"为什么改"而非仅描述"改了什么"
|
|
63
|
-
4. **识别风险**:主动指出破坏性变更和需要关注的点
|
|
64
|
-
|
|
65
|
-
## 大型 PR 处理
|
|
66
|
-
|
|
67
|
-
当文件数超过 20 个时:
|
|
68
|
-
1. 先用 `--stat` 分析变更分布,按模块归类
|
|
69
|
-
2. 重点分析核心模块变更(变更量大或涉及关键逻辑)
|
|
70
|
-
3. 在末尾概括未详细分析的文件/模块
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: tapd-saas-resource-fetcher-skills
|
|
3
|
-
description: 获取 Tapd SaaS 环境资源。当用户提供 Tapd 链接或提及 Tapd 需求/缺陷/任务/迭代时使用。支持获取需求(story)、缺陷(bug)、任务(task)、迭代(iteration)类型资源,调用接口获取完整资源数据以供分析。
|
|
4
|
-
allowed-tools: Bash,curl
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# 获取 Tapd SaaS 资源
|
|
8
|
-
|
|
9
|
-
当用户提供 Tapd 链接时,识别资源类型和 ID,调用接口获取完整资源数据,供后续分析使用。
|
|
10
|
-
|
|
11
|
-
## 执行步骤
|
|
12
|
-
|
|
13
|
-
### 1. 识别 Tapd 资源链接
|
|
14
|
-
|
|
15
|
-
从用户输入中识别 Tapd 链接,支持以下格式:
|
|
16
|
-
|
|
17
|
-
`https://www.tapd.cn/tapd_fe/{workspace_id}/{resource_type}/detail/{resource_id}`
|
|
18
|
-
|
|
19
|
-
- resource_type 为资源类型。 可取值为 story、bug、task、iteration
|
|
20
|
-
- workspace_id 为项目 ID
|
|
21
|
-
- resource_id 为资源 ID
|
|
22
|
-
|
|
23
|
-
对于给出的链接,提取 workspace_id 和 resource_type,resource_id, 用于之后的请求资源。
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
### 2. 调用接口获取资源数据
|
|
27
|
-
|
|
28
|
-
**重要**:请求前需替换 `{workspace_id}`, `{resource_type}`, `{resource_id}`
|
|
29
|
-
|
|
30
|
-
对每个识别到的资源,按照以下方式获取资源数据:
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
curl -X GET "{$CNB_API_ENDPOINT}/tapd/reference/{workspace_id}/{resource_type}/{resource_id}" \
|
|
34
|
-
-H "Accept: application/vnd.cnb.api+json" \
|
|
35
|
-
-H "Authorization: Bearer $CNB_TOKEN" \
|
|
36
|
-
-H "Content-Type: application/json"
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**示例** https://www.tapd.cn/tapd_fe/64201929/story/detail/1164201929001000017, 其中 workspace_id 为 64201929,resource_type 为 story,id 为 1164201929001000017。
|
|
40
|
-
请求接口如下:
|
|
41
|
-
```bash
|
|
42
|
-
curl -X GET "{$CNB_API_ENDPOINT}/tapd/reference/64201929/story/1164201929001000017" \
|
|
43
|
-
-H "Accept: application/vnd.cnb.api+json" \
|
|
44
|
-
-H "Authorization: Bearer $CNB_TOKEN" \
|
|
45
|
-
-H "Content-Type: application/json"
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 3. 结果返回
|
|
49
|
-
API 返回标准的 JSON 格式响应。请根据 HTTP 状态码判断请求是否成功:
|
|
50
|
-
|
|
51
|
-
- 200: 请求成功
|
|
52
|
-
- 400: 请求参数错误
|
|
53
|
-
- 401: 未授权
|
|
54
|
-
- 403: 禁止访问
|
|
55
|
-
- 404: 资源不存在
|
|
56
|
-
- 500: 服务器内部错误
|
|
57
|
-
|
|
58
|
-
当本地调用返回的 `status` 在 200 ~ 299 之间,需要进一步检查响应体中的 `data` 字段:
|
|
59
|
-
- 如果 `data` 包含有效数据,返回 `data` 内容给用户。
|
|
60
|
-
- 如果 `data` 为空数组 `[]`,说明 TAPD 侧未找到对应资源,按照 3.1 节中的"数据为空"场景提示用户。
|
|
61
|
-
|
|
62
|
-
只有当 `status >= 300` 时,才将 `status` 和 `trace` 返回给用户。
|
|
63
|
-
#### 3.1 错误处理与用户提示
|
|
64
|
-
|
|
65
|
-
**情况一:HTTP 状态码 >= 300**
|
|
66
|
-
|
|
67
|
-
响应体为 JSON 格式:`{"errcode": <错误码>, "errmsg": "<错误信息>"}`。
|
|
68
|
-
|
|
69
|
-
**请根据 `errcode` 给出对应的用户友好提示**:
|
|
70
|
-
|
|
71
|
-
| errcode | 含义 | 用户侧友好提示 |
|
|
72
|
-
|---------|------|----------------|
|
|
73
|
-
| `2000076` | TAPD 功能未启用 | 当前项目未启用 TAPD 集成功能,请联系项目管理员在项目设置中开启 TAPD 集成。 |
|
|
74
|
-
| `2000073` | 未找到 TAPD 绑定信息 | 你尚未绑定 TAPD 账号,请先前往个人设置页面绑定 TAPD 账号后再试。 |
|
|
75
|
-
| `2000074` | 获取 TAPD 访问令牌失败 | TAPD 授权信息已过期或无效,请重新绑定 TAPD 账号后再试。 |
|
|
76
|
-
| `2000075` | 获取 TAPD 资源详情失败 | 无法获取该 TAPD 资源,可能是你没有对应项目的访问权限,或者资源 ID 不正确,请检查链接后重试。 |
|
|
77
|
-
| `401` | 未授权 | 请先登录 CNB 平台后再使用此功能。 |
|
|
78
|
-
| `403` | 禁止访问 | 你没有权限访问该资源。 |
|
|
79
|
-
| `404` | 资源不存在 | 未找到对应的资源,请检查链接中的项目 ID 和资源 ID 是否正确。 |
|
|
80
|
-
| 其他 | 未知错误 | 请求失败,请稍后重试。如果问题持续存在,请联系管理员并提供 trace 信息。 |
|
|
81
|
-
|
|
82
|
-
**情况二:HTTP 200 但 `data` 为空数组**
|
|
83
|
-
|
|
84
|
-
当 HTTP 状态码为 200,响应体格式为 `{"status": 1, "data": [], "info": "success"}`,`data` 为空数组 `[]` 时,说明 TAPD 接口调用成功但未查询到对应资源。
|
|
85
|
-
|
|
86
|
-
此时应给出提示:**未找到该 TAPD 资源,请检查链接中的资源 ID 是否正确。**
|
|
87
|
-
|
|
88
|
-
**注意**:给出用户提示时,不要暴露内部实现细节(如具体的错误堆栈、用户 ID 等),只提供操作引导。
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
### 4. 多资源处理
|
|
92
|
-
|
|
93
|
-
若用户提供多个 Tapd 链接,**逐个**调用接口获取,每次只请求一个资源:
|
|
94
|
-
|
|
95
|
-
1. 提取所有链接中的资源 ID 列表
|
|
96
|
-
2. 按顺序逐一调用接口,每次获取一个资源
|
|
97
|
-
3. 汇总所有资源数据后统一展示
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: CNB-Text-Relative-Path-Converter
|
|
3
|
-
description: 读取 CNB (Cloud Native Build) ISSUE 或合并请求的内容时使用。将描述、评论、Review 中包含的相对路径(如 `./src/foo.ts`)转换为绝对路径,避免因路径歧义导致误读,支持纯文本与 Markdown 格式。
|
|
4
|
-
requires:
|
|
5
|
-
bins: [node]
|
|
6
|
-
files: [scripts/convertLink.js]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# CNB 文本相对路径转换器
|
|
10
|
-
|
|
11
|
-
## 使用方式
|
|
12
|
-
|
|
13
|
-
获取到 ISSUE 或合并请求的描述、评论、Review 的原始内容后,执行以下脚本进行转换。脚本会将所有相对路径替换为绝对路径,并将转换结果输出到标准输出。
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
# 执行转换,结果输出到标准输出
|
|
17
|
-
node scripts/convertLink.js <在此粘贴原始内容>
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## 示例
|
|
21
|
-
|
|
22
|
-
**转换前:**
|
|
23
|
-
```
|
|
24
|
-
请参考 ./src/utils/helper.ts 中的实现,以及 ../docs/api.md 的说明。
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
**转换后:**
|
|
28
|
-
```
|
|
29
|
-
请参考 https://cnb.cool/cnb/cool/default-npc-agent/-/git/raw/main/src/utils/helper.ts 中的实现,以及 https://cnb.cool/cnb/cool/default-npc-agent/-/git/raw/main/docs/api.md 的说明。
|
|
30
|
-
```
|