@comate/zulu 1.4.1 → 1.4.3

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.
Files changed (25) hide show
  1. package/comate-engine/assets/skills/code-security/SKILL.md +254 -63
  2. package/comate-engine/assets/skills/code-security/references/credential_hosting.md +263 -97
  3. package/comate-engine/assets/skills/code-security/references/framework_detection.md +91 -0
  4. package/comate-engine/assets/skills/code-security/references/vul_repair_sensitive.md +143 -74
  5. package/comate-engine/assets/skills/code-security/scripts/credential_hosting.py +12 -3
  6. package/comate-engine/assets/skills/code-security/scripts/credential_open_page.py +3 -3
  7. package/comate-engine/assets/skills/code-security/scripts/credential_poll.py +1 -1
  8. package/comate-engine/assets/skills/code-security/scripts/credential_print_url.py +43 -0
  9. package/comate-engine/assets/skills/code-security/scripts/credential_url.py +22 -2
  10. package/comate-engine/assets/skills/code-security/scripts/dodo/dodo_session.sh +183 -0
  11. package/comate-engine/assets/skills/code-security/scripts/ducc/get_claude_session_id.sh +8 -4
  12. package/comate-engine/assets/skills/code-security/scripts/ducc/open_browser.py +15 -18
  13. package/comate-engine/assets/skills/code-security/scripts/http_client.py +2 -3
  14. package/comate-engine/assets/skills/code-security/scripts/repair_vulnerability.py +3 -3
  15. package/comate-engine/assets/skills/code-security/scripts/report_chat.py +2 -2
  16. package/comate-engine/assets/skills/code-security/scripts/scan_vulnerability.py +7 -7
  17. package/comate-engine/assets/skills/code-security/scripts/utils.py +26 -11
  18. package/comate-engine/node_modules/better-sqlite3/node_modules/.bin/prebuild-install +2 -2
  19. package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build +2 -2
  20. package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-optional +2 -2
  21. package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-test +2 -2
  22. package/comate-engine/package.json +2 -0
  23. package/comate-engine/server.js +26 -26
  24. package/dist/bundle/index.js +3 -3
  25. package/package.json +1 -1
@@ -2,28 +2,58 @@
2
2
 
3
3
  **【强制执行总则】** 以下步骤必须严格按顺序执行,不得跳过任何步骤,不得调换顺序。每个步骤完成后才能进入下一步。
4
4
 
5
+ ## 通用规则
6
+
7
+ 以下规则在多个步骤中复用,后续步骤以「按通用规则 X」引用。
8
+
9
+ ### 规则 A:选项展示方式(按环境区分)
10
+
11
+ - **Dodo 环境(`_IDE` 为 `DODO`)**:不使用 AskUserQuestion 组件,在聊天框中直接输出编号列表,(**不要使用代码块模式展示**),用户回复数字编号或选项内容即可继续。
12
+ - **非 Dodo 环境**:使用 AskUserQuestion 工具让用户选择(**不得展示「Other」选项,选项为必选,未选择时 Continue 按钮不可点击**)。
13
+
14
+ ### 规则 B:Dodo 环境文字消息输出
15
+
16
+ 在 Dodo 环境中需要向用户输出进度/结果信息时,执行方式如下:
17
+
18
+ 1. **调用方式**:必须使用 `infoflow-notify` 技能发送一条独立文字消息,消息直接呈现在如流聊天框中
19
+ 2. **调用时机**:在执行目标操作(如运行脚本、轮询等)的前或后,按各步骤指定的时机发送
20
+ 3. **消息内容**:将各步骤中「按规则 B 发送:`...`」引号内的完整文本作为消息体,不得截断、改写或合并多条
21
+ 4. **禁止替代**:不得用普通文字回复、工具调用结果展示、或思考过程输出来替代 `infoflow-notify` 技能调用
22
+ 5. **每条独立发送**:如果同一步骤有多条规则 B 消息(如轮询前和轮询后各一条),必须分别调用 `infoflow-notify` 逐条发送,不得合并为一条
23
+
24
+ ### 规则 C:浏览器打开链接(按环境区分)
25
+
26
+ - **Dodo 环境**:仅在聊天框中输出可点击链接,**不执行 webbrowser 命令**。
27
+ - **非 Dodo 环境**:输出链接后,额外执行 `python3 -c "import webbrowser; webbrowser.open('<URL>')"` 在外部浏览器中打开。
28
+
5
29
  ## 流程概览
6
30
 
7
31
  ```
8
32
  步骤一:打开硬编码风险治理网页
9
33
 
10
- 步骤二:等待凭证配置完成(立即执行轮询脚本)
34
+ 步骤二:等待凭证配置完成
11
35
 
12
- 步骤三:修复硬编码代码(本地修复,按 vul_repair_sensitive.md 规则)
36
+ 步骤三:修复硬编码代码(本地修复,按 vul_repair_sensitive.md 规则,修复后以表格总结展示修复变化)
37
+ ├→ 非 Dodo 环境:展示代码变动后直接进入步骤四
38
+ └→ Dodo 环境:展示代码变动后执行子步骤 3.1~3.3
39
+ 3.1 创建 iCafe 卡片(标题:修复硬编码账密风险)
40
+ 3.2 提交代码到 iCode(commit: {卡片编号} : 修复硬编码账密风险)
41
+ 3.3 展示 iCode 代码链接和 iCafe 卡片链接
13
42
 
14
43
  步骤四:托管凭证(用户选择托管或跳过)
15
- ├→ 托管凭证 → 执行托管脚本 → 步骤五
16
- └→ 跳过托管 → 步骤五
44
+ ├→ 托管凭证 → 执行托管脚本
45
+ └→ 跳过托管
17
46
 
18
- 步骤五:提交代码并合入
19
- ├→ 选择1:代码提交且合入 → 步骤六(清理历史 commit)→ [申请结单?是] → 清理临时文件 → 结束
20
- │ └→ [申请结单?否]复测扫描 → [申请结单?是] → 清理临时文件 → 结束
21
- │ └→ [申请结单?否]清理临时文件结束
22
- ├→ 选择2:未提交合入,复测扫描复测扫描[申请结单?是]清理临时文件结束
23
- │ └→ [申请结单?否] → 清理临时文件 → 结束
24
- ├→ 选择3:未提交合入,单元测试 单元测试 → 复测扫描 → [申请结单?是] → 清理临时文件 → 结束
25
- │ └→ [申请结单?否] → 清理临时文件 → 结束
26
- └→ 选择4:未提交合入,流程结束 → 清理临时文件 → 结束
47
+ 步骤五:提交代码并合入icode
48
+ ├→ 选择1:已提交合入,清理历史 → 步骤六(清理历史 commit)→ 清理临时文件 → 结束
49
+ ├→ 选择2:已提交合入,流程结束 → 清理临时文件 → 结束
50
+ ├→ 选择3:未提交合入,复测扫描复测扫描提示提交并合入 → 步骤五
51
+ └→ 选择4:未提交合入,单元测试单元测试复测扫描提示提交并合入步骤五
52
+
53
+ 步骤六:清理历史 git commit 记录
54
+ ├→ 选择1:已完成清理,申请结单申请结单 → 清理临时文件 → 结束
55
+ ├→ 选择2:已完成清理,稍后手动申请结单 → 清理临时文件 → 结束
56
+ └→ 选择3:未清理,后续手动清理 → 清理临时文件 → 结束
27
57
  ```
28
58
 
29
59
  ---
@@ -37,18 +67,24 @@
37
67
  脚本会自动构建凭证配置网页 URL,并在 IDE 内嵌浏览器中自动打开:
38
68
 
39
69
  ```bash
40
- python3 scripts/credential_open_page.py \
41
- --chat-id "${_CHAT_ID}" \
42
- --username "${_USERNAME}" \
43
- --ide-name "${_IDE}" \
44
- --project-dir "<项目目录绝对路径>"
70
+ output=$(python3 <SKILL_DIR>/scripts/credential_open_page.py \
71
+ --chat-id "<会话ID>" \
72
+ --username "<用户名>" \
73
+ --ide-name "<IDE类型>" \
74
+ --project-dir "<项目目录绝对路径>")
75
+ echo "$output"
45
76
  ```
46
77
 
78
+ 参数说明:
79
+ - `--chat-id`、`--username`、`--ide-name`:使用步骤一获取的 `_CHAT_ID`、`_USERNAME`、`_IDE` 值
80
+
47
81
  脚本说明:
48
82
  - `--project-dir`:当前扫描的项目目录,用于自动从 git remote 获取 `repo` 标识;若无 git 信息则使用目录名
49
83
  - 脚本通过 comate-kernel socket 在 IDE 内嵌浏览器中自动打开网页
50
84
  - 若 kernel socket 不可用,自动降级为 `--open-url` 触发 `simpleBrowser.api.open`
51
85
 
86
+ **【强制执行】** 脚本执行完成后,必须将脚本的**标准输出内容原样输出到聊天框**(即直接作为回复正文发送给用户),不得仅保留在执行日志中。脚本标准输出包含可点击的 Markdown 链接,用户需要在聊天框中看到并点击该链接。输出完成后,立即进入步骤二。
87
+
52
88
  ### DUCC 环境
53
89
 
54
90
  `credential_open_page.py` 负责输出可点击链接,`scripts/ducc/open_browser.py` 负责在内嵌浏览器中打开,两者接收相同参数,共用公共模块 `credential_url.py` 构建 URL:
@@ -56,36 +92,94 @@ python3 scripts/credential_open_page.py \
56
92
  ```bash
57
93
  # 在内嵌浏览器中打开
58
94
  python3 scripts/ducc/open_browser.py \
59
- --chat-id "${_CHAT_ID}" \
60
- --username "${_USERNAME}" \
61
- --ide-name "${_IDE}" \
95
+ --chat-id "<会话ID>" \
96
+ --username "<用户名>" \
97
+ --ide-name "<IDE类型>" \
98
+ --project-dir "<项目目录绝对路径>"
99
+ ```
100
+
101
+ 参数说明:
102
+ - `--chat-id`、`--username`、`--ide-name`:使用步骤一获取的 `_CHAT_ID`、`_USERNAME`、`_IDE` 值
103
+
104
+ ### Dodo 环境
105
+
106
+ **【强制执行 - 严格按以下两步顺序执行,不得跳过任何步骤】**
107
+
108
+ **第一步:输出进度信息并执行脚本获取 URL**
109
+
110
+ 按规则 B 发送进度消息:`📍 正在构建硬编码风险治理网页链接...`
111
+
112
+ 然后执行脚本获取 URL:
113
+
114
+ ```bash
115
+ python3 scripts/credential_print_url.py \
116
+ --chat-id "<会话ID>" \
117
+ --username "<用户名>" \
118
+ --ide "<IDE类型>" \
62
119
  --project-dir "<项目目录绝对路径>"
63
120
  ```
64
121
 
122
+ 禁止跳过脚本、禁止自行构造或伪造 URL,链接地址必须来自脚本的 stdout 输出。
123
+
124
+ **第二步:按规则 B 输出链接消息,然后自动进入步骤二**
125
+
126
+ 消息内容(`<实际URL>` 替换为脚本 stdout 输出的完整 URL):
127
+
128
+ ```
129
+ ✅ 构建完成 — 已获取硬编码风险治理网页链接
130
+
131
+ 请点击以下链接打开硬编码风险治理网页,配置凭证信息:
132
+
133
+ [打开硬编码风险治理界面](<实际URL>)
134
+
135
+ 请在网页中完成凭证配置并点击「修复代码」按钮,我将自动检测到配置完成并继续执行修复流程。
136
+ ```
137
+
138
+ **输出该消息后,立即自动进入步骤二,无需等待用户回复。**
139
+
140
+ 脚本说明:
141
+ - 脚本使用绝对路径加载 `credential_url` 模块,无论从哪个目录调用都能正确运行
142
+ - 输出标准 Markdown 超链接,用户点击后直接在本地浏览器中打开
143
+ - `--ide` 使用步骤一获取的 `_IDE` 值(Dodo 环境下为 `DODO`)
144
+
65
145
  ---
66
146
 
67
- **【强制执行】** 无论哪种环境,无论网页是否成功自动打开,都必须将脚本的 stdout 输出(含可点击链接)完整展示在聊天框中,不得省略。
147
+ **【强制执行】** 无论哪种环境,无论网页是否成功自动打开,都必须将可点击链接完整展示在聊天框的回复正文中,不得省略。
68
148
 
69
149
  ## 步骤二:等待凭证配置完成
70
150
 
71
- **【强制执行】** 必须等到聊天框中已成功输出可点击链接后,才能开始执行以下轮询脚本,不得提前执行、不得跳过、不得等待用户回复后再执行。此步骤是后续修复流程的前置依赖,未执行将导致整个硬编码修复流程中断。
151
+ **【强制执行】** 步骤一执行完成后,立即执行以下轮询脚本,无需等待用户任何操作。
152
+
153
+ 此步骤是后续修复流程的前置依赖,未执行将导致整个硬编码修复流程中断。
72
154
 
73
155
  ```bash
74
- python3 scripts/credential_poll.py --chat-id ${_CHAT_ID} --username ${_USERNAME} --output <临时目录>/poll_result.json
156
+ python3 scripts/credential_poll.py --chat-id <会话ID> --username <用户名> --output <临时目录>/poll_result.json
75
157
  ```
76
158
 
77
- `<临时目录>` 使用与 `scan_result.json` 同一目录(即 `.tmp/<项目名>_<哈希>/`)。
159
+ 参数说明:
160
+ - `--chat-id`、`--username`:使用步骤一获取的 `_CHAT_ID`、`_USERNAME` 值
161
+
162
+ `<临时目录>` 使用与 `scan_result.json` 同一目录(即 `<_TMP_DIR>/.code-security/<项目名>_<哈希>/`)。
78
163
 
79
- 该脚本通过 WebSocket 连接服务端,等待用户在网页完成配置并点击「生成代码」。收到数据后输出到标准输出并保存到 `--output` 指定的文件。配置数据包含以下关键字段:
164
+ 该脚本通过 WebSocket 连接服务端,等待用户在网页完成配置并点击「修复代码」。收到数据后输出到标准输出并保存到 `--output` 指定的文件。配置数据包含以下关键字段:
80
165
 
81
166
  - `data.files`:待修复文件列表(含 vulList 和 extra.secret 信息)
82
167
  - `data.credentials`:凭证名值对列表
83
168
  - `data.deployment`:托管平台信息(platform、platformName)
84
169
  - `data.repo`:代码库语言和框架信息
85
- - `data.succMsg`:配置成功提示信息
86
- - `data.errorMsg`:配置失败提示信息
170
+ - `data.succMsg`:凭证托管成功的提示信息,**不是操作结果**
171
+ - `data.errorMsg`:凭证托管失败的提示信息,**不是操作结果**
87
172
  - `chatUUID`:此次会话 ID
88
173
 
174
+ **poll_result.json中的`data.errorMsg`和`data.succMsg`字段仅作为提示信息,不是实际的操作结果,后面操作流程根据实际操作结果来选择展示`data.errorMsg`和`data.succMsg`的一种**
175
+
176
+ **【Dodo 环境进度通知】**
177
+
178
+ - 轮询前,按规则 B 发送:`📍 等待凭证配置完成(WebSocket 轮询中...)`
179
+ - 轮询成功后,按规则 B 发送:`✅ 完成 — 已收到凭证配置数据,正在修复硬编码代码,请稍候...`
180
+
181
+ **发送完成消息后,立即自动进入步骤三,无需等待用户回复。**
182
+
89
183
  ## 步骤三:修复硬编码代码
90
184
 
91
185
  **【强制执行】** 收到凭证配置数据后,必须在本地直接修复硬编码漏洞,不调用后端修复服务。必须先读取 `references/vul_repair_sensitive.md` 文档中的修复规则再执行修复。
@@ -93,23 +187,84 @@ python3 scripts/credential_poll.py --chat-id ${_CHAT_ID} --username ${_USERNAME}
93
187
  修复输入数据来自 `poll_result.json` 文件(由步骤二保存),其中 `data.files`、`data.repo`、`data.deployment` 包含了修复所需的全部信息。
94
188
 
95
189
  修复流程:
96
- 1. 读取 `references/vul_repair_sensitive.md` 中的修复规则
97
- 2. 遍历 `data.files` 中的每个文件,根据文件类型(代码文件/配置文件)、语言(`data.repo.language`)、框架(`data.repo.framework`)和平台(`data.deployment.platform`)确定修复策略
98
- 3. 根据每个漏洞的 `extra.secret.credentialName`、`extra.secret.start`、`extra.secret.end` 定位敏感信息并替换为环境变量读取方式
99
- 4. 如果 `data.deployment.platform` 4,还需引入 keyless-sdk(参考 `references/vul_repair_sensitive.md` 的「引入SDK」章节)
190
+ 1. 读取 `references/vul_repair_sensitive.md` 全文,重点掌握「稳定性总原则」与「通用修复流程(2.1)」后再执行后续步骤
191
+ 2. 按文件遍历 `data.files`,对每个文件的 `vulList` **按 `line` 降序排序**后再逐漏洞处理;同一行存在多个漏洞时,按 `extra.secret.start.col` **降序**依次替换,避免列偏移
192
+ 3. 对每个漏洞**独立判断**修复方式(禁止基于内容相似性批量推断):
193
+ - `extra.secret.credentialName` **不为空** 托管方式:根据文件类型选择对应规则(代码文件参考 2.2、配置文件参考 2.3),**仅替换 `[start.col, end.col]` 范围内的字符**,行内其余内容(空格、引号、注释、分隔符)一律不动
194
+ - `extra.secret.credentialName` **为空** → 删除方式(参考 2.4):按文件类型清空值,保留语法结构,确保文件可正常解析/编译
195
+ 4. 修复后校验:重新读取文件,逐项确认(a)目标位置已替换;(b)非目标行/列未被改动;(c)文件整体语法/缩进合法;发现问题立即回滚并重新修复
196
+ 5. **【强制执行,禁止跳过】** 显式读取 `data.deployment.platform` 的值,根据结果执行以下分支(禁止凭印象或推断跳过此步骤):
197
+ - 若 `platform == 4`:按 `references/vul_repair_sensitive.md` 第 3 节「引入SDK」引入 keyless-sdk;`credentialID` 必须与 `data.deployment.credential_id` 完全一致;已有 SDK 依赖与初始化的项目不要重复引入;引入后重新读取相关文件,确认依赖与初始化代码均已正确写入
198
+ - 若 `platform != 4`:明确跳过,不引入 SDK
199
+ 6. 代码修复完成后,先输出步骤三的进度信息,再按以下格式展示代码变动:
200
+
201
+ 修复完成后追加输出:
202
+
203
+ **第一部分:整体汇总(一行)**
204
+
205
+ ✅ 共修复 **{N}** 处硬编码,{简述变更内容,如"敏感密钥已替换为环境变量读取"}
206
+
207
+ **第二部分:逐文件细节(每个文件一块)**
208
+
209
+ 📄 `{文件相对路径}`
210
+ ```diff
211
+ {行号}: {未变动的上下文行(可选)}
212
+ - {行号}: {修复前代码原文}
213
+ + {行号}: {修复后代码原文}
214
+ {行号}: {未变动的上下文行(可选)}
215
+ ```
100
216
 
101
- ## 步骤四:托管凭证
217
+ **格式要求:**
218
+ 1. 汇总行中修复数量使用加粗(**N**)
219
+ 2. 文件路径使用反引号高亮,每个文件只展示一次,不带行号
220
+ 3. 代码块使用 diff 语法,- 表示删除行,+ 表示新增行,无前缀表示上下文行
221
+ 4. 同一文件的多处修改合并在一个 diff 块中,按行号顺序展示,不同修改处之间用 `...` 分隔
222
+ 5. 每行代码前必须标注行号,格式为 `{行号}: {代码}`
223
+ 6. 多个文件按文件顺序依次展示,每个文件之间空一行
224
+ 7. **【重要】** 当使用批量替换(如 `replace_all=true`)处理多行相同内容的修改时,必须在 diff 中逐一展示每一处修改的变更,不得只展示第一处。例如:如果第46-52行都是将相同的密码替换为空值,则必须在 diff 中从第46行到第52行,每一行都分别标注 `- {修复前}` 和 `+ {修复后}`,即使修改内容完全相同也不能省略
225
+
226
+ ### 步骤三完成后的环境区分处理
102
227
 
103
- **【强制执行】** 代码修复完成后,以表格方式总结展示修复变化(文件路径、代码行位置、内容变化),然后必须使用 Questions 组件向用户提供以下选项,等待用户确认后再继续,不得自动跳过:
228
+ **非 Dodo 环境**:代码变动展示完成后,**立即自动进入步骤四,无需等待用户回复**。
104
229
 
105
- Questions 组件使用规范:
106
- - **不得展示「Other」选项**
107
- - **选项为必选**,用户未做选择时 Continue 按钮不可点击
230
+ **Dodo 环境(`_IDE` 为 `DODO`)**:代码变动展示完成后,必须严格按以下顺序执行三个子步骤,全部完成后再进入步骤四:
108
231
 
232
+ **子步骤 3.1:创建 iCafe 卡片**
233
+
234
+ 使用 `icafe` 技能,在用户最近操作的 iCafe 空间中创建一张卡片:
235
+ - 卡片标题:`修复硬编码账密风险`
236
+ - 卡片类型:Task
237
+
238
+ 创建成功后,记录返回的卡片编号(如 `SPACE-123`),后续步骤需要使用。
239
+
240
+ **子步骤 3.2:提交代码到 iCode**
241
+
242
+ 使用 `icode` 技能,将本次代码变动提交到当前代码分支:
243
+ - commit 信息格式:`{icafe卡片编号} : 修复硬编码账密风险`
244
+ - 示例:`SPACE-123 : 修复硬编码账密风险`
245
+ - 提交到当前分支(即 `git branch --show-current` 的结果)
246
+ - **仅是提交并推送到iCode,不要直接合入iCode远程分支**
247
+
248
+ **子步骤 3.3:展示 iCode 代码链接**
249
+
250
+ 提交成功后,在代码变动展示内容末尾追加 iCode 代码链接:
251
+
252
+ ```
253
+ 🔗 本次提交已推送到 iCode:[查看代码变更](<iCode提交链接>)
254
+ 📋 关联 iCafe 卡片:[{icafe卡片编号}](<icafe卡片链接>)
255
+ ```
256
+
257
+ 三个子步骤全部完成后,**立即自动进入步骤四,无需等待用户回复**。
258
+
259
+ ## 步骤四:托管凭证
260
+
261
+ **【强制执行】** 必须向用户提供以下选项,等待用户确认后再继续,不得自动跳过。
262
+
263
+ 按规则 A 展示选项:
109
264
  ```
110
265
  代码修复已完成,请 Review 修复后的代码。确认无误后,选择后续操作:
111
266
  1. 托管凭证 - 将凭证托管到 {platformName} 平台
112
- 2. 跳过托管 - 仅完成代码修复,不托管凭证
267
+ 2. 跳过托管 - 仅完成代码修复(如删除无效凭证等),不托管凭证
113
268
  ```
114
269
 
115
270
  用户必须选择其中一项后才能继续。
@@ -117,9 +272,12 @@ Questions 组件使用规范:
117
272
  **用户选择「托管凭证」时**,执行:
118
273
 
119
274
  ```bash
120
- python3 scripts/credential_hosting.py --poll-result <poll_result.json路径> --username ${_USERNAME}
275
+ python3 scripts/credential_hosting.py --poll-result <poll_result.json路径> --username <用户名>
121
276
  ```
122
277
 
278
+ 参数说明:
279
+ - `--username`:使用步骤一获取的 `_USERNAME` 值
280
+
123
281
  脚本自动从 `poll_result.json` 中提取 `chatUUID`、`deployment.platformName`、`data.credentials`,无需手动传递这些参数。
124
282
  托管完成后,从 `poll_result.json` 中读取 `data.succMsg`, 展示给用户:
125
283
  ```
@@ -130,33 +288,31 @@ python3 scripts/credential_hosting.py --poll-result <poll_result.json路径> --u
130
288
  {errorMsg}
131
289
  ```
132
290
 
133
-
134
291
  **用户选择「跳过托管」时**,直接进入步骤五。
135
292
 
136
293
  完成步骤四后,进入步骤五。
137
294
 
138
295
  ## 步骤五:提交代码并合入
139
296
 
140
- **【强制执行】** 使用 Questions 组件向用户确认代码是否提交并推送合入远程仓库,不得自动跳过:
297
+ 提示用户需要提交并合入代码到远程仓库。
141
298
 
142
- Questions 组件使用规范:
143
- - **不得展示「Other」选项**
144
- - **选项为必选**,用户未做选择时 Continue 按钮不可点击
299
+ **【强制执行】** 向用户确认代码是否提交并推送合入远程仓库,不得自动跳过。
145
300
 
301
+ 按规则 A 展示选项:
146
302
  ```
147
- 请确认代码是否提交并合入,选择后续操作:
148
- 1. 代码提交且合入 - 继续清理历史 git commit 记录
149
- 2. 代码未提交合入 - 进行复测扫描
150
- 3. 代码未提交合入 - 进行单元测试
151
- 4. 代码未提交合入 - 流程结束,后续由用户自行处理
303
+ 请确认代码是否已经提交并合入icode,选择后续操作:
304
+ 1. 已提交合入 - 继续清理历史git commit记录
305
+ 2. 已提交合入 - 流程结束,后续再做处理
306
+ 3. 未提交合入 - 进行复测扫描
307
+ 4. 未提交合入 - 完善单元测试
152
308
  ```
153
309
 
154
310
  根据用户选择执行对应分支:
155
311
 
156
- - **选择 1(代码已合入)**→ 进入步骤六(清理历史 commit),清理完成后进入「复测扫描」→「单元测试」→「清理临时文件」
157
- - **选择 2(复测扫描)**→ 进入「复测扫描」→「清理临时文件」
158
- - **选择 3(单元测试)**→ 进入「单元测试」→「复测扫描」→「清理临时文件」
159
- - **选择 4(流程结束)**→ 进入「清理临时文件」后结束
312
+ - **选择 1(已提交合入,清理历史)**→ 进入步骤六(清理历史 commit),清理完成后进入「清理临时文件」
313
+ - **选择 2(已提交合入,流程结束)**→ 进入「清理临时文件」后结束
314
+ - **选择 3(未提交合入,复测扫描)**→ 进入「复测扫描」→ 提示提交并合入 → 回到步骤五
315
+ - **选择 4(未提交合入,单元测试)**→ 进入「单元测试」→「复测扫描」→ 提示提交并合入 → 回到步骤五
160
316
 
161
317
  ## 步骤六:清理历史 git commit 记录
162
318
 
@@ -169,7 +325,7 @@ Questions 组件使用规范:
169
325
  - HTTP 格式(`https://icode.baidu.com/baidu/scan/cnap-test`):取域名后的路径部分,去掉 `.git` 后缀
170
326
  - 若无 git 信息则使用项目目录名;`/` 不需要编码,直接拼接
171
327
 
172
- 1. 在聊天框输出可点击链接:
328
+ 1. 输出以下内容到聊天框:
173
329
 
174
330
  ```
175
331
  代码已合入,建议立即清理 Git 历史记录,防止历史 commit 中残留的硬编码凭证泄露。
@@ -177,35 +333,26 @@ Questions 组件使用规范:
177
333
  请点击以下链接进入清理平台:[历史 Commit 清理平台](https://commit-clean.baidu-int.com/task?repo=<REPO>)
178
334
  ```
179
335
 
180
- 2. 执行以下命令在外部浏览器中自动打开清理平台:
336
+ 2. 按规则 C 处理浏览器打开(URL 为 `https://commit-clean.baidu-int.com/task?repo=<REPO>`)。
181
337
 
182
- ```bash
183
- python3 -c "import webbrowser; webbrowser.open('https://commit-clean.baidu-int.com/task?repo=<REPO>')"
184
- ```
185
-
186
- 3. 通过 Questions 组件让用户确认(**不得展示「Other」选项,选项为必选,未选择时 Continue 按钮不可点击**):
338
+ 3. 按规则 A 展示选项,让用户确认是否完成历史记录清理:
187
339
 
188
340
  ```
189
- 请确认:
190
- 1. 已完成清理 - 我已清理历史 commit,继续后续流程
191
- 2. 稍后处理 - 跳过清理,继续后续流程
192
- ```
193
-
194
- 用户选择后,使用 Questions 组件询问是否申请结单(**不得展示「Other」选项,选项为必选**):
195
-
196
- ```
197
- 是否申请结单?
198
- 1. 是,立即申请结单
199
- 2. 否,稍后手动处理
341
+ 请确认是否完成历史记录清理:
342
+ 1. 已完成清理 - 立即申请结单
343
+ 2. 已完成清理 - 稍后手动申请结单,流程结束
344
+ 3. 未清理 - 后续手动清理,流程结束
200
345
  ```
201
346
 
202
347
  根据用户选择:
203
- - **选择「是,立即申请结单」**→ 执行「申请结单」→ 清理临时文件 → **流程结束,不再执行复测扫描**
204
- - **选择「否,稍后手动处理」**→ 进入「复测扫描」
348
+ - **选择 1(已完成清理,申请结单)**→ 执行「申请结单」→ 清理临时文件 → **流程结束**
349
+ - **选择 2(已完成清理,稍后手动申请结单)**→ 清理临时文件 → **流程结束**
350
+ - **选择 3(未清理,稍后手动清理)**→ 清理临时文件 → **流程结束**
205
351
 
206
352
  ## 单元测试
207
353
 
208
- 进入单元测试阶段(流程见 SKILL.md「单元测试」章节)。「单元测试」完成后进入「复测扫描」。
354
+ 进入单元测试阶段(流程见 SKILL.md「单元测试」章节)。
355
+ **【强制执行】在单元测试步骤结束后,提示用户需要提交并合入代码,进入步骤五:提交代码并合入。**
209
356
 
210
357
  ## 复测扫描
211
358
 
@@ -219,27 +366,17 @@ python3 -c "import webbrowser; webbrowser.open('https://commit-clean.baidu-int.c
219
366
 
220
367
  如果复测仍存在未修复的硬编码漏洞,展示剩余漏洞列表(格式同漏洞报告),并提示用户可以选择继续修复或忽略。
221
368
 
222
- 复测扫描结束后,使用 Questions 组件询问是否申请结单(**不得展示「Other」选项,选项为必选**):
223
-
224
- ```
225
- 是否申请结单?
226
- 1. 是,立即申请结单
227
- 2. 否,稍后手动处理
228
- ```
229
-
230
- 根据用户选择:
231
- - **选择「是,立即申请结单」**→ 执行「申请结单」→ 清理临时文件 → **流程结束**
232
- - **选择「否,稍后手动处理」**→ 进入清理临时文件
369
+ **【强制执行】复测扫描结束后,提示用户需要提交并合入代码,进入步骤五:提交代码并合入**
233
370
 
234
371
  ## 清理临时文件
235
372
 
236
- 所有流程结束后,清理临时文件:`python3 -c "import shutil; shutil.rmtree('<临时目录绝对路径>')"` 删除该项目的临时目录(即 `.tmp/<项目名>_<哈希>/` 整个目录)。
373
+ 所有流程结束后,清理临时文件:`python3 -c "import shutil; shutil.rmtree('<临时目录绝对路径>')"` 删除该项目的临时目录(即 `<_TMP_DIR>/.code-security/<项目名>_<哈希>/` 整个目录)。
237
374
 
238
375
  ## 申请结单
239
376
 
240
377
  用户选择「是,立即申请结单」时:
241
378
 
242
- 1. 在聊天框输出以下内容,提示用户前往网站申请结单:
379
+ 1. 输出以下内容到聊天框:
243
380
 
244
381
  ```
245
382
  请点击以下链接,在工单系统中申请结单:
@@ -247,18 +384,47 @@ python3 -c "import webbrowser; webbrowser.open('https://commit-clean.baidu-int.c
247
384
  [申请结单](https://security.baidu.com/ticket/pending/list)
248
385
  ```
249
386
 
250
- 2. 执行以下命令在外部浏览器中自动打开申请结单页面:
251
-
252
- ```bash
253
- python3 -c "import webbrowser; webbrowser.open('https://security.baidu.com/ticket/pending/list')"
254
- ```
387
+ 2. 按规则 C 处理浏览器打开(URL 为 `https://security.baidu.com/ticket/pending/list`)。Dodo 环境下按规则 B 发送上述链接消息。
255
388
 
256
389
  3. 输出提示:
257
390
 
258
- ```
259
- 已为您打开申请结单页面,请在工单列表中找到对应工单并申请结单。流程至此结束。
260
- ```
391
+ 已为您打开申请结单页面,请在工单列表中找到对应工单并申请结单。
392
+
393
+ 本轮治理流程到此结束。总结本轮治理操作的变更并输出,提醒用户注意以下事项:
394
+
395
+ 注意事项:
396
+ 1. 合入代码后需要重新打包、部署才能生效。
397
+ (1)如果托管环境是cnap时,需要提醒用户:如果cnap应用是原地升级应用时,部署时pod重建策略需选择【任何情况都重建】;否则不用提醒。
398
+ 2. 建议在测试环境先部署测试验证,然后在线上环境灰度发布。
399
+
400
+
401
+ ## 技能插件使用总结(Skill Plugin Reference)
402
+
403
+ 硬编码风险治理流程中,各步骤所依赖的技能插件如下:
404
+
405
+ ### 主流程使用的插件
406
+
407
+ | 流程步骤 | 使用的技能插件 | 用途说明 |
408
+ |----------|--------------|---------|
409
+ | 步骤二:代码库获取(Dodo 环境) | `knowledge-fetch` | 从 iCode 拉取代码仓库到本地,供后续扫描使用 |
410
+ | 步骤三:代码提交(Dodo 环境子步骤 3.1) | `icafe-assistant` (`icafe`) | 在用户最近操作的 iCafe 空间中创建「修复硬编码账密风险」Task 卡片 |
411
+ | 步骤三:代码提交(Dodo 环境子步骤 3.2) | `icode-git-commit` (`icode`) | 将本次硬编码修复的代码变更提交到 iCode 当前分支 |
412
+ | 步骤六:进度通知 | `infoflow-notify` | 在 Dodo 环境各关键节点通过如流聊天框发送进度消息 |
413
+
414
+ ### 脚本插件(Python 脚本,位于 `scripts/` 目录)
415
+
416
+ | 脚本文件         | 功能说明                                               |
417
+ | ---------------------------| ------------------------------------------------------------------------------------------------------|
418
+ | `credential_url.py`    | 构建硬编码风险治理网页 URL(各环境共用的公共模块)                          |
419
+ | `credential_open_page.py` | Comate / DUCC 环境:自动构建 URL 并在 IDE 内嵌浏览器中打开配置网页                  |
420
+ | `credential_print_url.py` | Dodo 环境:构建 URL 并输出到 stdout,供聊天框展示可点击链接                     |
421
+ | `credential_poll.py`   | 通过 WebSocket 轮询等待用户在网页完成凭证配置并点击「修复代码」,将配置数据保存到 `poll_result.json` |
422
+ | `credential_hosting.py`  | 将用户配置的凭证托管到目标平台(从 `poll_result.json` 读取 chatUUID、deployment、credentials)    |
423
+
424
+ ### 外部平台链接
261
425
 
262
- 流程结束。
426
+ | 平台 | 链接模板 | 触发场景 |
427
+ |------|---------|---------|
428
+ | 历史 Commit 清理平台 | `https://commit-clean.baidu-int.com/task?repo=<REPO>` | 步骤六:用户确认代码已合入后,引导清理历史 git commit 中残留的硬编码凭证 |
429
+ | 安全工单申请结单 | `https://security.baidu.com/ticket/pending/list` | 申请结单:用户完成历史记录清理后,跳转工单系统申请结单 |
263
430
 
264
- 用户选择「否,稍后手动处理」时,跳过此步骤,继续后续流程。
@@ -0,0 +1,91 @@
1
+ # 代码框架识别指南
2
+
3
+ 在修复配置文件中的硬编码敏感信息前,需先识别代码库使用的语言和框架,以选择正确的修复策略。
4
+
5
+ ## Go GDP 框架识别
6
+
7
+ GDP(Go Development Platform)是百度内部Go开发框架,使用其配置模块时有特定的密钥托管方式(SSM)。
8
+
9
+ ### 识别维度
10
+
11
+ #### 1. go.mod 依赖检查
12
+
13
+ ```bash
14
+ grep "icode.baidu.com/baidu/gdp" go.mod
15
+ ```
16
+
17
+ GDP相关依赖:
18
+ - `icode.baidu.com/baidu/gdp/conf` - 配置模块
19
+ - `icode.baidu.com/baidu/gdp/env` - 环境变量模块
20
+
21
+ #### 2. import 语句检查
22
+
23
+ ```bash
24
+ grep -r "icode.baidu.com/baidu/gdp/conf" --include="*.go" .
25
+ ```
26
+
27
+ #### 3. conf.Parse 调用检查
28
+
29
+ ```bash
30
+ grep -r "conf.Parse" --include="*.go" .
31
+ ```
32
+
33
+ 典型用法:
34
+ ```go
35
+ if err := conf.Parse("app.toml", &config); err != nil {
36
+ return err
37
+ }
38
+ ```
39
+
40
+ #### 4. 配置文件GDP特征语法
41
+
42
+ ```bash
43
+ grep -r "{env\.\|{gdp\.\|{ssm\.\|<\$" conf/ --include="*.toml"
44
+ ```
45
+
46
+ GDP特征语法示例:
47
+ ```toml
48
+ Listen = "0.0.0.0:{env.LISTEN_PORT|8080}"
49
+ FileName = "{gdp.LogDir}/service.log"
50
+ Password = "{ssm.db_password}"
51
+ idc = "<$idc$>"
52
+ ```
53
+
54
+ #### 5. 配置目录结构
55
+
56
+ ```bash
57
+ ls -la conf/ conf_online/ 2>/dev/null
58
+ ```
59
+
60
+ GDP典型目录:`conf/app.toml`、`conf/server.toml`、`conf/logit/`、`conf/servicer/`
61
+
62
+ ### 判断结论
63
+
64
+ | 条件 | 判断结果 |
65
+ |------|----------|
66
+ | go.mod有GDP依赖 + 有import + 有conf.Parse | 确定使用GDP配置 |
67
+ | 只有go.mod依赖 | 引入了但可能未使用 |
68
+ | 配置文件有 `{env.}` / `{ssm.}` 语法 | 高概率使用GDP |
69
+ | 都不满足 | 未使用GDP配置模块 |
70
+
71
+ ## 通用框架识别策略
72
+
73
+ | 语言 | 识别方式 | 常见框架 |
74
+ |------|----------|----------|
75
+ | Java | pom.xml / build.gradle 依赖 | Spring Boot, GDP-Java |
76
+ | Go | go.mod 依赖 | GDP, Gin, Kratos |
77
+ | Python | requirements.txt / pyproject.toml | Django, Flask |
78
+ | JavaScript | package.json 依赖 | Express, Next.js |
79
+
80
+ ### 快速识别命令
81
+
82
+ ```bash
83
+ # 识别语言
84
+ ls go.mod pom.xml build.gradle package.json requirements.txt pyproject.toml Cargo.toml 2>/dev/null
85
+
86
+ # Go GDP检测
87
+ grep -c "icode.baidu.com/baidu/gdp" go.mod 2>/dev/null
88
+
89
+ # Java Spring检测
90
+ grep -c "spring-boot" pom.xml 2>/dev/null || grep -c "spring-boot" build.gradle 2>/dev/null
91
+ ```