scan-debug-skill 1.0.7 → 1.0.8

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 CHANGED
@@ -20,8 +20,8 @@ npx scan-debug-skill
20
20
  运行后,脚本会提示您选择安装目标:
21
21
  After running, the script will prompt you to select an installation target:
22
22
 
23
- 1. **Trae**:安装到 `.trae/scan-debug-skill` (Install to `.trae/scan-debug-skill`)
24
- 2. **Cursor**:安装到 `.cursor/scan-debug-skill` (Install to `.cursor/scan-debug-skill`)
23
+ 1. **Trae**:安装到 `.trae/skills/scan-debug-skill` (Install to `.trae/skills/scan-debug-skill`)
24
+ 2. **Cursor**:安装到 `.cursor/skills/scan-debug-skill` (Install to `.cursor/skills/scan-debug-skill`)
25
25
  3. **Custom**:安装到指定目录 (Install to a specified directory)
26
26
 
27
27
  ### 包含的内容 / Contents
package/SKILL.md CHANGED
@@ -1,68 +1,58 @@
1
- ---
2
- name: 扫描问题
3
- description: SonarQube和安全扫描的时候触发。分析并修复 SonarQube 扫描出的代码问题,确保符合安全与质量规范。当用户要求修复 Sonar 问题时调用。
4
- triggers:
5
- - sonar问题修复
6
- - 奇安信问题修复
7
- - sonar问题扫描
8
- - 奇安信问题扫描
9
- - 扫描问题修复
10
- - 扫描代码问题
11
- - scan-debug-skill扫描
12
- - scan-debug-skill
13
- - scan-debug
14
- license: MIT
15
- author: [scan-debug-skill](https://github.com/k73333333/ScanDebugSkill)
16
- ---
17
-
18
- # Sonar 代码质量与安全修复技能集
19
-
20
- 本项目包含针对前端不同技术栈(JS/TS, CSS, HTML)的 SonarQube 修复技能指南。
21
-
22
- ## 目录结构
23
-
24
- * **[JS/TS 修复技能](./js/SKILL.md)**
25
- * 包含 JavaScript、TypeScript 的修复规则。
26
- * 涉及:注释规范、最佳实践、安全合规。
27
-
28
- * **[CSS 修复技能](./css/SKILL.md)**
29
- * 包含 CSS、SASS、LESS 的样式修复规则。
30
- * 涉及:注释规范、通用实践、字体回退、重复属性。
31
-
32
- * **[HTML 修复技能](./html/SKILL.md)**
33
- * 包含 HTML 结构、语义化及可访问性修复规则。
34
- * 涉及:注释规范、图片/表单/语义化结构、安全合规。
35
-
36
- ## 使用说明
37
- 对指定代码/文件/目录进行扫描问题然后根据扫描结果概览进行修复。
38
-
39
- 请点击上述链接进入相应的技能目录查看详细指南。
40
-
41
- ### 引用指南
42
-
43
- 在编辑器中使用 AI 助手生成或修复代码时,可以通过以下方式引用本规范:
44
-
45
- 1. **代码生成**:在生成代码时,显式要求遵循 `scan-debug-skill` 规范。
46
- > "生成一段 API 请求代码,请遵循 `scan-debug-skill` 中的 JS 安全规范。"
47
- 2. **问题修复**:在修复代码问题时,要求 AI 参考本技能集。
48
- > "请按照 `scan-debug-skill` 修复当前代码的 Sonar 问题。"
49
- 3. **项目规则配置**:在项目的 `.cursorrules` 或 `.trae/rules` 文件中配置全局引用,使 AI 默认遵循此规范。
50
- > "Follow the `scan-debug-skill` standards for all code generation and fixes."
51
-
52
- ## 扫描结果概览输出规则
53
-
54
- 当用户提供扫描报告或提及多个代码问题时,应首先以表格形式输出扫描结果概览,遵循以下规范:
55
-
56
- - **表格列**:必须包含 类别、严重程度、问题描述、涉及文件。
57
- - **严重程度标识**:使用 🔴 高危、🟡 中、🔵 低、⚪ 建议 进行视觉区分。
58
- - **示例格式**:
59
-
60
- | 类别 | 严重程度 | 问题描述 | 涉及文件 |
61
- | :--- | :--- | :--- | :--- |
62
- | JS/TS 安全 | 🔴 高危 | window.open 缺少 noopener (反向 Tabnabbing 漏洞) | src/views/Assistant.vue |
63
- | 代码质量 | 🔴 高危 | 遗留 debugger 调试断点 | vite.config.ts |
64
- | 代码质量 | 🟡 中 | 遗留 console.log 调试日志 | vite.config.ts |
65
- | CSS 规范 | 🟡 中 | 滥用 !important 破坏级联规则 | src/assets/assistant.css |
66
- | JS/TS 规范 | 🟡 中 | 使用原生 confirm 阻塞交互 | src/views/Assistant.vue |
67
- | Vue 规范 | 🔵 低 | v-for 使用 index 作为 key (潜在渲染风险) | src/views/Assistant.vue |
68
- | 代码风格 | ⚪ 建议 | 变量命名可优化为更具语义化的名称 | src/utils/format.js |
1
+ ---
2
+ name: scan-debug-skill
3
+ description: "分析并修复 SonarQube 和奇安信扫描出的代码问题,确保符合安全与质量规范。Invoke when user asks to fix Sonar/Qianxin issues, scan code, or mentions scan-debug-skill."
4
+ license: MIT
5
+ author: [scan-debug-skill](https://github.com/k73333333/ScanDebugSkill)
6
+ ---
7
+
8
+ # Sonar 代码质量与安全修复技能集
9
+
10
+ 本项目包含针对前端不同技术栈(JS/TS, CSS, HTML)的 SonarQube 修复技能指南。
11
+
12
+ ## 目录结构
13
+
14
+ * **[JS/TS 修复技能](./js/SKILL.md)**
15
+ * 包含 JavaScript、TypeScript 的修复规则。
16
+ * 涉及:注释规范、最佳实践、安全合规。
17
+
18
+ * **[CSS 修复技能](./css/SKILL.md)**
19
+ * 包含 CSS、SASS、LESS 的样式修复规则。
20
+ * 涉及:注释规范、通用实践、字体回退、重复属性。
21
+
22
+ * **[HTML 修复技能](./html/SKILL.md)**
23
+ * 包含 HTML 结构、语义化及可访问性修复规则。
24
+ * 涉及:注释规范、图片/表单/语义化结构、安全合规。
25
+
26
+ ## 使用说明
27
+ 对指定代码/文件/目录进行扫描问题然后根据扫描结果概览进行修复。
28
+
29
+ 请点击上述链接进入相应的技能目录查看详细指南。
30
+
31
+ ### 引用指南
32
+
33
+ 在编辑器中使用 AI 助手生成或修复代码时,可以通过以下方式引用本规范:
34
+
35
+ 1. **代码生成**:在生成代码时,显式要求遵循 `scan-debug-skill` 规范。
36
+ > "生成一段 API 请求代码,请遵循 `scan-debug-skill` 中的 JS 安全规范。"
37
+ 2. **问题修复**:在修复代码问题时,要求 AI 参考本技能集。
38
+ > "请按照 `scan-debug-skill` 修复当前代码的 Sonar 问题。"
39
+ 3. **项目规则配置**:在项目的 `.cursorrules` 或 `.trae/rules` 文件中配置全局引用,使 AI 默认遵循此规范。
40
+ > "Follow the `scan-debug-skill` standards for all code generation and fixes."
41
+
42
+ ## 扫描结果概览输出规则
43
+
44
+ 当用户提供扫描报告或提及多个代码问题时,应首先以表格形式输出扫描结果概览,遵循以下规范:
45
+
46
+ - **表格列**:必须包含 类别、严重程度、问题描述、涉及文件。
47
+ - **严重程度标识**:使用 🔴 高危、🟡 中、🔵 低、⚪ 建议 进行视觉区分。
48
+ - **示例格式**:
49
+
50
+ | 类别 | 严重程度 | 问题描述 | 涉及文件 |
51
+ | :--- | :--- | :--- | :--- |
52
+ | JS/TS 安全 | 🔴 高危 | window.open 缺少 noopener (反向 Tabnabbing 漏洞) | src/views/Assistant.vue |
53
+ | 代码质量 | 🔴 高危 | 遗留 debugger 调试断点 | vite.config.ts |
54
+ | 代码质量 | 🟡 中 | 遗留 console.log 调试日志 | vite.config.ts |
55
+ | CSS 规范 | 🟡 中 | 滥用 !important 破坏级联规则 | src/assets/assistant.css |
56
+ | JS/TS 规范 | 🟡 中 | 使用原生 confirm 阻塞交互 | src/views/Assistant.vue |
57
+ | Vue 规范 | 🔵 低 | v-for 使用 index 作为 key (潜在渲染风险) | src/views/Assistant.vue |
58
+ | 代码风格 | ⚪ 建议 | 变量命名可优化为更具语义化的名称 | src/utils/format.js |
package/bin/install.js CHANGED
@@ -4,7 +4,7 @@
4
4
  * @Author: fukaidong
5
5
  * @Date: 2026-02-25 15:50:10
6
6
  * @LastEditors: fukaidong qiji777@yeah.net
7
- * @LastEditTime: 2026-02-26 18:33:02
7
+ * @LastEditTime: 2026-04-14 14:35:17
8
8
  * @Description: scan-debug-skill 安装脚本 (ScanDebugSkill Install Script)
9
9
  * 包含更新处理逻辑:安装前清理旧版本核心目录,确保无残留文件。
10
10
  */
@@ -133,8 +133,8 @@ if (hasCursor && !hasTrae) {
133
133
  // 若两者都存在,默认保持为 1 (Trae)
134
134
 
135
135
  console.log('请选择要安装的目标 IDE (Please select target IDE):');
136
- console.log(`1. Trae (.trae/scan-debug-skill) ${hasTrae ? '[Detected]' : ''}`);
137
- console.log(`2. Cursor (.cursor/scan-debug-skill) ${hasCursor ? '[Detected]' : ''}`);
136
+ console.log(`1. Trae (.trae/skills/scan-debug-skill) ${hasTrae ? '[Detected]' : ''}`);
137
+ console.log(`2. Cursor (.cursor/skills/scan-debug-skill) ${hasCursor ? '[Detected]' : ''}`);
138
138
  console.log('3. Custom (指定目录/Custom Directory)');
139
139
 
140
140
  rl.question(`请输入选项 (1/2/3) [默认: ${defaultChoice} (${defaultText})]: `, (answer) => {
@@ -161,20 +161,20 @@ rl.question(`请输入选项 (1/2/3) [默认: ${defaultChoice} (${defaultText})]
161
161
 
162
162
  // 选项 1:安装到 Trae
163
163
  if (choice === '1') {
164
- targets.push(path.join(cwd, '.trae', 'scan-debug-skill'));
164
+ targets.push(path.join(cwd, '.trae', 'skills', 'scan-debug-skill'));
165
165
  }
166
166
 
167
167
  // 选项 2:安装到 Cursor
168
168
  if (choice === '2') {
169
- targets.push(path.join(cwd, '.cursor', 'scan-debug-skill'));
169
+ targets.push(path.join(cwd, '.cursor', 'skills', 'scan-debug-skill'));
170
170
  }
171
171
 
172
172
  // 如果没有有效选择(且不是3),回退到默认
173
173
  if (targets.length === 0) {
174
174
  if (defaultChoice === '2') {
175
- targets.push(path.join(cwd, '.cursor', 'scan-debug-skill'));
175
+ targets.push(path.join(cwd, '.cursor', 'skills', 'scan-debug-skill'));
176
176
  } else {
177
- targets.push(path.join(cwd, '.trae', 'scan-debug-skill'));
177
+ targets.push(path.join(cwd, '.trae', 'skills', 'scan-debug-skill'));
178
178
  }
179
179
  }
180
180
 
@@ -1,38 +1,38 @@
1
- # CSS 通用最佳实践
2
-
3
- ## 规则详情
4
- * **ID 选择器**:尽量避免使用 ID 选择器定义样式(高优先级难以覆盖),推荐使用 Class 选择器。
5
- * **!important**:慎用 `!important`,除非用于覆盖内联样式或第三方库样式,且需添加注释说明。
6
- * **单位统一**:
7
- * 当值为 `0` 时,省略单位(如 `0px` -> `0`)。
8
- * 避免使用绝对单位(如 `cm`, `in`),除非在打印样式表中。
9
- * **命名规范**:推荐使用 **BEM (Block Element Modifier)** 命名规则,提高样式的可维护性和复用性。
10
- * Block: `.block`
11
- * Element: `.block__element`
12
- * Modifier: `.block--modifier`
13
-
14
- ## 示例:BEM 命名规范
15
- **场景**:样式类名杂乱,层级嵌套过深,难以维护。
16
-
17
- **修复后代码**:
18
- ```css
19
- /* Non-Compliant: 嵌套过深,命名无结构 */
20
- .list .item .active { ... }
21
-
22
- /* Compliant: BEM 命名 */
23
- .user-list { } /* Block */
24
- .user-list__item { } /* Element */
25
- .user-list__item--active { } /* Modifier */
26
- ```
27
-
28
- ## 示例:省略零值单位
29
- **场景**:Sonar 提示 "Unexpected unit"。
30
-
31
- **修复后代码**:
32
- ```css
33
- div {
34
- /* Compliant: 0 不需要单位 */
35
- margin: 0;
36
- padding: 10px;
37
- }
38
- ```
1
+ # CSS 通用最佳实践
2
+
3
+ ## 规则详情
4
+ * **ID 选择器**:尽量避免使用 ID 选择器定义样式(高优先级难以覆盖),推荐使用 Class 选择器。
5
+ * **!important**:慎用 `!important`,除非用于覆盖内联样式或第三方库样式,且需添加注释说明。
6
+ * **单位统一**:
7
+ * 当值为 `0` 时,省略单位(如 `0px` -> `0`)。
8
+ * 避免使用绝对单位(如 `cm`, `in`),除非在打印样式表中。
9
+ * **命名规范**:推荐使用 **BEM (Block Element Modifier)** 命名规则,提高样式的可维护性和复用性。
10
+ * Block: `.block`
11
+ * Element: `.block__element`
12
+ * Modifier: `.block--modifier`
13
+
14
+ ## 示例:BEM 命名规范
15
+ **场景**:样式类名杂乱,层级嵌套过深,难以维护。
16
+
17
+ **修复后代码**:
18
+ ```css
19
+ /* Non-Compliant: 嵌套过深,命名无结构 */
20
+ .list .item .active { ... }
21
+
22
+ /* Compliant: BEM 命名 */
23
+ .user-list { } /* Block */
24
+ .user-list__item { } /* Element */
25
+ .user-list__item--active { } /* Modifier */
26
+ ```
27
+
28
+ ## 示例:省略零值单位
29
+ **场景**:Sonar 提示 "Unexpected unit"。
30
+
31
+ **修复后代码**:
32
+ ```css
33
+ div {
34
+ /* Compliant: 0 不需要单位 */
35
+ margin: 0;
36
+ padding: 10px;
37
+ }
38
+ ```
@@ -1,15 +1,15 @@
1
- # 注释与文档规范
2
-
3
- ## 规则详情
4
- * **语言**:所有注释必须使用 **中文**。
5
- * **复杂逻辑**:对于使用了复杂 CSS Hack 或特定浏览器兼容性写法的样式,必须在上方添加注释说明原因。
6
-
7
- ## 示例
8
- ```css
9
- /* 针对 IE11 的 Flexbox 兼容性修复 */
10
- @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
11
- .container {
12
- display: block;
13
- }
14
- }
15
- ```
1
+ # 注释与文档规范
2
+
3
+ ## 规则详情
4
+ * **语言**:所有注释必须使用 **中文**。
5
+ * **复杂逻辑**:对于使用了复杂 CSS Hack 或特定浏览器兼容性写法的样式,必须在上方添加注释说明原因。
6
+
7
+ ## 示例
8
+ ```css
9
+ /* 针对 IE11 的 Flexbox 兼容性修复 */
10
+ @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
11
+ .container {
12
+ display: block;
13
+ }
14
+ }
15
+ ```
@@ -1,16 +1,16 @@
1
- # 重复属性 (Duplicate Properties)
2
-
3
- ## 规则详情
4
- * **规则**:避免在同一选择器块中重复定义相同的属性(除非用于浏览器兼容性 fallback)。重复的属性只有最后一次声明生效,多余的声明应被移除。
5
-
6
- ## 示例
7
- **场景**:Sonar 提示 "Duplicate property names" (重复的属性名)。
8
-
9
- **修复后代码**:
10
- ```css
11
- a {
12
- color: pink;
13
- /* Compliant: 移除了重复定义的 color: orange */
14
- background: orange;
15
- }
16
- ```
1
+ # 重复属性 (Duplicate Properties)
2
+
3
+ ## 规则详情
4
+ * **规则**:避免在同一选择器块中重复定义相同的属性(除非用于浏览器兼容性 fallback)。重复的属性只有最后一次声明生效,多余的声明应被移除。
5
+
6
+ ## 示例
7
+ **场景**:Sonar 提示 "Duplicate property names" (重复的属性名)。
8
+
9
+ **修复后代码**:
10
+ ```css
11
+ a {
12
+ color: pink;
13
+ /* Compliant: 移除了重复定义的 color: orange */
14
+ background: orange;
15
+ }
16
+ ```
@@ -1,15 +1,15 @@
1
- # 字体族回退 (Font Family Fallback)
2
-
3
- ## 规则详情
4
- * **规则**:在定义 `font` 或 `font-family` 时,必须在末尾指定一个通用字体族,**优先使用 `sans-serif`**(除非业务明确要求使用 `serif` 或 `monospace`),以防止特定字体不可用时浏览器回退到默认字体导致样式崩坏。
5
-
6
- ## 示例
7
- **场景**:Sonar 提示 "font-family" 缺少通用字体族声明。
8
-
9
- **修复后代码**:
10
- ```css
11
- body {
12
- /* Compliant: 末尾添加 sans-serif 作为通用回退字体 */
13
- font-family: "PingFang SC", "Microsoft YaHei", Arial, sans-serif;
14
- }
15
- ```
1
+ # 字体族回退 (Font Family Fallback)
2
+
3
+ ## 规则详情
4
+ * **规则**:在定义 `font` 或 `font-family` 时,必须在末尾指定一个通用字体族,**优先使用 `sans-serif`**(除非业务明确要求使用 `serif` 或 `monospace`),以防止特定字体不可用时浏览器回退到默认字体导致样式崩坏。
5
+
6
+ ## 示例
7
+ **场景**:Sonar 提示 "font-family" 缺少通用字体族声明。
8
+
9
+ **修复后代码**:
10
+ ```css
11
+ body {
12
+ /* Compliant: 末尾添加 sans-serif 作为通用回退字体 */
13
+ font-family: "PingFang SC", "Microsoft YaHei", Arial, sans-serif;
14
+ }
15
+ ```
package/html/SKILL.md CHANGED
@@ -1,26 +1,26 @@
1
- ---
2
- name: html-sonar-repair
3
- description: HTML/Template 代码 SonarQube 扫描问题修复指南,涵盖可访问性、语义化及安全漏洞修复。
4
- ---
5
-
6
- # Sonar HTML 代码质量与安全修复技能
7
-
8
- 此技能用于指导 AI 助手协助用户修复 SonarQube 及奇安信安全扫描发现的 HTML/Template 代码问题。
9
-
10
- ## 核心原则
11
- 1. **直接高效**:直接给出修复后的完整代码片段,**始终保持中文输出**。
12
- 2. **可访问性 (A11y)**:确保 HTML 结构符合 WCAG 标准。
13
- 3. **语义化**:优先使用语义化标签。
14
-
15
- ## 技能索引
16
-
17
- ### 基础规范
18
- - 注释与文档规范 (中文注释) → 详见 [comments-documentation](reference/comments-documentation.md)
19
- - HTML 语义化结构 (Lang, Doctype, Table, Nesting) → 详见 [semantic-structure](reference/semantic-structure.md)
20
-
21
- ### 元素规范
22
- - 图片替代文本 (Image Alt Text) → 详见 [image-alt-text](reference/image-alt-text.md)
23
- - 表单标签关联 (Form Labels) → 详见 [form-labels](reference/form-labels.md)
24
-
25
- ### 安全合规
26
- - 外链安全与事件 (Noopener, Inline Events) → 详见 [security-compliance](reference/security-compliance.md)
1
+ ---
2
+ name: html-sonar-repair
3
+ description: HTML/Template 代码 SonarQube 扫描问题修复指南,涵盖可访问性、语义化及安全漏洞修复。
4
+ ---
5
+
6
+ # Sonar HTML 代码质量与安全修复技能
7
+
8
+ 此技能用于指导 AI 助手协助用户修复 SonarQube 及奇安信安全扫描发现的 HTML/Template 代码问题。
9
+
10
+ ## 核心原则
11
+ 1. **直接高效**:直接给出修复后的完整代码片段,**始终保持中文输出**。
12
+ 2. **可访问性 (A11y)**:确保 HTML 结构符合 WCAG 标准。
13
+ 3. **语义化**:优先使用语义化标签。
14
+
15
+ ## 技能索引
16
+
17
+ ### 基础规范
18
+ - 注释与文档规范 (中文注释) → 详见 [comments-documentation](reference/comments-documentation.md)
19
+ - HTML 语义化结构 (Lang, Doctype, Table, Nesting) → 详见 [semantic-structure](reference/semantic-structure.md)
20
+
21
+ ### 元素规范
22
+ - 图片替代文本 (Image Alt Text) → 详见 [image-alt-text](reference/image-alt-text.md)
23
+ - 表单标签关联 (Form Labels) → 详见 [form-labels](reference/form-labels.md)
24
+
25
+ ### 安全合规
26
+ - 外链安全与事件 (Noopener, Inline Events) → 详见 [security-compliance](reference/security-compliance.md)
@@ -1,16 +1,16 @@
1
- # 注释与文档规范
2
-
3
- ## 规则详情
4
- * **语言**:所有注释必须使用 **中文**。
5
- * **结构说明**:对于复杂的 DOM 结构或模板逻辑,需添加注释说明用途。
6
-
7
- ## 示例
8
- ```html
9
- <!--
10
- 主要内容区域
11
- 包含了文章列表和侧边栏
12
- -->
13
- <main class="main-content">
14
- ...
15
- </main>
16
- ```
1
+ # 注释与文档规范
2
+
3
+ ## 规则详情
4
+ * **语言**:所有注释必须使用 **中文**。
5
+ * **结构说明**:对于复杂的 DOM 结构或模板逻辑,需添加注释说明用途。
6
+
7
+ ## 示例
8
+ ```html
9
+ <!--
10
+ 主要内容区域
11
+ 包含了文章列表和侧边栏
12
+ -->
13
+ <main class="main-content">
14
+ ...
15
+ </main>
16
+ ```
@@ -1,20 +1,20 @@
1
- # 表单标签关联 (Form Labels)
2
-
3
- ## 规则详情
4
- * **规则**:所有 `<input>`, `<textarea>`, `<select>` 等表单元素必须有关联的 `<label>`,可以通过 `for` 属性关联 ID,或将 input 包裹在 label 中。
5
-
6
- ## 示例
7
- **场景**:Sonar 提示 "Form elements should have labels"。
8
-
9
- **修复后代码**:
10
- ```html
11
- <!-- Compliant: 使用 for 属性关联 -->
12
- <label for="username">用户名</label>
13
- <input type="text" id="username" name="username">
14
-
15
- <!-- Compliant: 隐式关联 (Nest) -->
16
- <label>
17
- 密码
18
- <input type="password" name="password">
19
- </label>
20
- ```
1
+ # 表单标签关联 (Form Labels)
2
+
3
+ ## 规则详情
4
+ * **规则**:所有 `<input>`, `<textarea>`, `<select>` 等表单元素必须有关联的 `<label>`,可以通过 `for` 属性关联 ID,或将 input 包裹在 label 中。
5
+
6
+ ## 示例
7
+ **场景**:Sonar 提示 "Form elements should have labels"。
8
+
9
+ **修复后代码**:
10
+ ```html
11
+ <!-- Compliant: 使用 for 属性关联 -->
12
+ <label for="username">用户名</label>
13
+ <input type="text" id="username" name="username">
14
+
15
+ <!-- Compliant: 隐式关联 (Nest) -->
16
+ <label>
17
+ 密码
18
+ <input type="password" name="password">
19
+ </label>
20
+ ```
@@ -1,18 +1,18 @@
1
- # 图片替代文本 (Image Alt Text)
2
-
3
- ## 规则详情
4
- * **规则**:所有 `<img>` 标签必须包含 `alt` 属性。
5
- * 如果图片仅用于装饰,应设置 `alt=""`。
6
- * 如果图片包含信息,应提供有意义的描述文本。
7
-
8
- ## 示例
9
- **场景**:Sonar 提示 "<img> elements should have an 'alt' attribute"。
10
-
11
- **修复后代码**:
12
- ```html
13
- <!-- Compliant: 装饰性图片,alt 为空 -->
14
- <img src="bg-pattern.png" alt="">
15
-
16
- <!-- Compliant: 信息性图片,提供描述 -->
17
- <img src="logo.png" alt="公司 Logo">
18
- ```
1
+ # 图片替代文本 (Image Alt Text)
2
+
3
+ ## 规则详情
4
+ * **规则**:所有 `<img>` 标签必须包含 `alt` 属性。
5
+ * 如果图片仅用于装饰,应设置 `alt=""`。
6
+ * 如果图片包含信息,应提供有意义的描述文本。
7
+
8
+ ## 示例
9
+ **场景**:Sonar 提示 "<img> elements should have an 'alt' attribute"。
10
+
11
+ **修复后代码**:
12
+ ```html
13
+ <!-- Compliant: 装饰性图片,alt 为空 -->
14
+ <img src="bg-pattern.png" alt="">
15
+
16
+ <!-- Compliant: 信息性图片,提供描述 -->
17
+ <img src="logo.png" alt="公司 Logo">
18
+ ```
@@ -1,16 +1,16 @@
1
- # 安全合规规范 (Security)
2
-
3
- ## 规则详情
4
- * **外链安全**:`<a>` 标签使用 `target="_blank"` 时,必须添加 `rel="noopener noreferrer"`。
5
- * **内联事件**:避免使用内联 JS 事件(如 `onclick="..."`),应通过脚本绑定事件。
6
-
7
- ## 示例:外链安全
8
- **场景**:Sonar 提示 "Links with target='_blank' should have rel='noopener noreferrer'"。
9
-
10
- **修复后代码**:
11
- ```html
12
- <!-- Compliant: 防止新窗口通过 window.opener 访问原页面 -->
13
- <a href="https://example.com" target="_blank" rel="noopener noreferrer">
14
- 外部链接
15
- </a>
16
- ```
1
+ # 安全合规规范 (Security)
2
+
3
+ ## 规则详情
4
+ * **外链安全**:`<a>` 标签使用 `target="_blank"` 时,必须添加 `rel="noopener noreferrer"`。
5
+ * **内联事件**:避免使用内联 JS 事件(如 `onclick="..."`),应通过脚本绑定事件。
6
+
7
+ ## 示例:外链安全
8
+ **场景**:Sonar 提示 "Links with target='_blank' should have rel='noopener noreferrer'"。
9
+
10
+ **修复后代码**:
11
+ ```html
12
+ <!-- Compliant: 防止新窗口通过 window.opener 访问原页面 -->
13
+ <a href="https://example.com" target="_blank" rel="noopener noreferrer">
14
+ 外部链接
15
+ </a>
16
+ ```
@@ -1,43 +1,43 @@
1
- # HTML 语义化结构
2
-
3
- ## 规则详情
4
- * **链接文本**:`<a>` 标签必须包含有意义的文本内容,避免仅包含图标或空内容(如果是图标链接,应使用 `aria-label`)。
5
- * **Doctype**:每个 HTML 文档必须声明 `<!DOCTYPE html>`。
6
- * **Lang 属性**:`<html>` 标签必须包含 `lang` 属性,声明页面语言(如 `lang="zh-CN"`)。
7
- * **表格结构**:`<table>` 必须包含 `<caption>` (标题) 或 `summary` 属性(虽已废弃但部分旧标准仍用),以及正确使用 `<thead>`, `<tbody>`, `<tfoot>`。
8
- * **标签嵌套**:严禁错误的标签嵌套,例如:
9
- * `<a>` 标签内禁止嵌套其他交互元素(如 `<button>`, `<input>`, `<a>`)。
10
- * `<p>` 标签内禁止嵌套块级元素(如 `<div>`, `<h1>`, `<ul>`)。
11
- * `<ul>`/`<ol>` 的直接子元素必须是 `<li>`。
12
-
13
- ## 示例:链接文本为空
14
- **场景**:Sonar 提示 "Links must have discernible text"。
15
-
16
- **修复后代码**:
17
- ```html
18
- <!-- Compliant: 提供文本内容 -->
19
- <a href="/home">返回首页</a>
20
-
21
- <!-- Compliant: 图标链接使用 aria-label -->
22
- <a href="/settings" aria-label="设置">
23
- <i class="icon-settings"></i>
24
- </a>
25
- ```
26
-
27
- ## 示例:标签错误嵌套
28
- **场景**:Sonar 提示 "The element 'button' must not appear as a descendant of the 'a' element" 或 "The element 'div' must not appear as a descendant of the 'p' element"。
29
-
30
- **修复后代码**:
31
- ```html
32
- <!-- Non-Compliant: a 标签嵌套 button (非法交互元素嵌套) -->
33
- <!-- <a href="/login"><button>登录</button></a> -->
34
-
35
- <!-- Compliant: 使用样式将 a 标签伪装成按钮,或使用 JS 跳转 -->
36
- <a href="/login" class="btn">登录</a>
37
-
38
- <!-- Non-Compliant: p 标签嵌套 div (非法块级元素嵌套) -->
39
- <!-- <p>这是一个段落 <div>错误嵌套</div></p> -->
40
-
41
- <!-- Compliant: 将外层 p 改为 div -->
42
- <div>这是一个段落 <div>正确嵌套</div></div>
43
- ```
1
+ # HTML 语义化结构
2
+
3
+ ## 规则详情
4
+ * **链接文本**:`<a>` 标签必须包含有意义的文本内容,避免仅包含图标或空内容(如果是图标链接,应使用 `aria-label`)。
5
+ * **Doctype**:每个 HTML 文档必须声明 `<!DOCTYPE html>`。
6
+ * **Lang 属性**:`<html>` 标签必须包含 `lang` 属性,声明页面语言(如 `lang="zh-CN"`)。
7
+ * **表格结构**:`<table>` 必须包含 `<caption>` (标题) 或 `summary` 属性(虽已废弃但部分旧标准仍用),以及正确使用 `<thead>`, `<tbody>`, `<tfoot>`。
8
+ * **标签嵌套**:严禁错误的标签嵌套,例如:
9
+ * `<a>` 标签内禁止嵌套其他交互元素(如 `<button>`, `<input>`, `<a>`)。
10
+ * `<p>` 标签内禁止嵌套块级元素(如 `<div>`, `<h1>`, `<ul>`)。
11
+ * `<ul>`/`<ol>` 的直接子元素必须是 `<li>`。
12
+
13
+ ## 示例:链接文本为空
14
+ **场景**:Sonar 提示 "Links must have discernible text"。
15
+
16
+ **修复后代码**:
17
+ ```html
18
+ <!-- Compliant: 提供文本内容 -->
19
+ <a href="/home">返回首页</a>
20
+
21
+ <!-- Compliant: 图标链接使用 aria-label -->
22
+ <a href="/settings" aria-label="设置">
23
+ <i class="icon-settings"></i>
24
+ </a>
25
+ ```
26
+
27
+ ## 示例:标签错误嵌套
28
+ **场景**:Sonar 提示 "The element 'button' must not appear as a descendant of the 'a' element" 或 "The element 'div' must not appear as a descendant of the 'p' element"。
29
+
30
+ **修复后代码**:
31
+ ```html
32
+ <!-- Non-Compliant: a 标签嵌套 button (非法交互元素嵌套) -->
33
+ <!-- <a href="/login"><button>登录</button></a> -->
34
+
35
+ <!-- Compliant: 使用样式将 a 标签伪装成按钮,或使用 JS 跳转 -->
36
+ <a href="/login" class="btn">登录</a>
37
+
38
+ <!-- Non-Compliant: p 标签嵌套 div (非法块级元素嵌套) -->
39
+ <!-- <p>这是一个段落 <div>错误嵌套</div></p> -->
40
+
41
+ <!-- Compliant: 将外层 p 改为 div -->
42
+ <div>这是一个段落 <div>正确嵌套</div></div>
43
+ ```