sapbuddy-dsh 0.0.6 → 0.0.7
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/LICENSE +21 -21
- package/README.md +12 -4
- package/defaults/AGENTS.md +114 -114
- package/defaults/connections.example.json +21 -21
- package/defaults/prompts/Memory.md +21 -21
- package/defaults/prompts/SYSTEM.md +110 -110
- package/defaults/settings.example.json +3 -3
- package/dist/sap-tools/adtManager.d.ts +11 -1
- package/dist/sap-tools/adtManager.js +176 -9
- package/dist/sap-tools/connections-store.js +4 -1
- package/dist/sap-tools/execution.js +1 -1
- package/dist/tools.js +5 -3
- package/package.json +5 -3
- package/skills/abap-code-review/SKILL.md +75 -75
- package/skills/abap-code-review/assets/report-template.html +142 -142
- package/skills/abap-code-review/references/checklist.md +114 -114
- package/skills/abap-explain/SKILL.md +126 -126
- package/skills/abap-templates/SKILL.md +764 -764
- package/skills/abap-wiki/SKILL.md +104 -104
- package/skills/clean-abap/SKILL.md +91 -91
- package/skills/clean-abap/references/CleanABAP_zh.md +4309 -4309
- package/skills/dev-write/SKILL.md +137 -137
- package/skills/sap-abap-skills/README.md +205 -205
- package/skills/sap-abap-skills/SKILL.md +498 -498
- package/skills/sap-abap-skills/references/abap-dictionary.md +211 -211
- package/skills/sap-abap-skills/references/abap-sql.md +588 -588
- package/skills/sap-abap-skills/references/amdp.md +279 -279
- package/skills/sap-abap-skills/references/authorization.md +149 -149
- package/skills/sap-abap-skills/references/bits-bytes.md +92 -92
- package/skills/sap-abap-skills/references/builtin-functions.md +373 -373
- package/skills/sap-abap-skills/references/cds-views.md +412 -412
- package/skills/sap-abap-skills/references/cloud-development.md +299 -299
- package/skills/sap-abap-skills/references/constructor-expressions.md +458 -458
- package/skills/sap-abap-skills/references/date-time.md +415 -415
- package/skills/sap-abap-skills/references/design-patterns.md +292 -292
- package/skills/sap-abap-skills/references/dynamic-programming.md +426 -426
- package/skills/sap-abap-skills/references/exceptions.md +432 -432
- package/skills/sap-abap-skills/references/generative-ai.md +180 -180
- package/skills/sap-abap-skills/references/internal-tables.md +578 -578
- package/skills/sap-abap-skills/references/numeric-operations.md +219 -219
- package/skills/sap-abap-skills/references/object-orientation.md +518 -518
- package/skills/sap-abap-skills/references/performance.md +428 -428
- package/skills/sap-abap-skills/references/program-flow.md +302 -302
- package/skills/sap-abap-skills/references/rap-eml.md +549 -549
- package/skills/sap-abap-skills/references/released-classes.md +308 -308
- package/skills/sap-abap-skills/references/sap-luw.md +203 -203
- package/skills/sap-abap-skills/references/skill-reference-guide.md +98 -98
- package/skills/sap-abap-skills/references/sql-hierarchies.md +180 -180
- package/skills/sap-abap-skills/references/string-processing.md +488 -488
- package/skills/sap-abap-skills/references/table-grouping.md +150 -150
- package/skills/sap-abap-skills/references/tool-guide.md +285 -285
- package/skills/sap-abap-skills/references/unit-testing.md +512 -512
- package/skills/sap-abap-skills/references/where-conditions.md +223 -223
- package/skills/sap-abap-skills/references/xml-json.md +315 -315
- package/skills/translate-workflow/SKILL.md +69 -69
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapbuddy-dsh",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "SapBuddy —— SAP ABAP AI 全能助手(DeepSeek Harness 插件):41 个 SAP 工具 + 8 个 ABAP 技能 + SapBuddy preset + 连接设置页。一个包名装完。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -77,8 +77,10 @@
|
|
|
77
77
|
"typescript": "^5.6.0"
|
|
78
78
|
},
|
|
79
79
|
"scripts": {
|
|
80
|
-
"test": "npm run test:activation",
|
|
81
|
-
"test:activation": "node --experimental-vm-modules --test --test-isolation=none test/activation.test.mjs"
|
|
80
|
+
"test": "npm run test:activation && npm run test:session && npm run test:store",
|
|
81
|
+
"test:activation": "node --experimental-vm-modules --test --test-isolation=none test/activation.test.mjs",
|
|
82
|
+
"test:session": "node --experimental-vm-modules --test --test-isolation=none test/session-recovery.test.mjs",
|
|
83
|
+
"test:store": "node --test --test-isolation=none test/connections-store.test.mjs"
|
|
82
84
|
},
|
|
83
85
|
"publishConfig": {
|
|
84
86
|
"access": "public"
|
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: abap-code-review
|
|
3
|
-
description: >-
|
|
4
|
-
【最高优先级】用户说"审查/审计/code review XXX"时立即触发本技能,禁止走其他流程。
|
|
5
|
-
对从 SAP 系统读取的 ABAP 程序(报表、INCLUDE、函数)源码进行代码审查,
|
|
6
|
-
并产出「多页签切换」的专业 HTML 审查报告(共 4 个页签)。
|
|
7
|
-
报告在「一、程序功能与结构概览」页签下方嵌入「代码逻辑详细解析」:解释程序在做什么、怎么做;
|
|
8
|
-
若识别为 ALV 报表类程序,另附「字段取数逻辑」表(字段名 | 取数来源/逻辑 | 备注/计算公式)。
|
|
9
|
-
当用户要求审查、审计或做某个 ABAP 程序的代码审查(典型如 Z* 报表),
|
|
10
|
-
或要求生成 ABAP 审查报告(HTML 格式)时,应使用本技能。
|
|
11
|
-
触发关键词:审查、审计、code review、review、检查代码、看看代码问题。
|
|
12
|
-
agent_created: true
|
|
13
|
-
disable: false
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# ABAP 代码审查(基于内置 SAP 工具)
|
|
17
|
-
|
|
18
|
-
一套可复用的审计流程,面向「对接外部系统(CRM/HTTP 接口)」类的 ABAP 程序,
|
|
19
|
-
并产出固定格式的 HTML 审查报告。
|
|
20
|
-
|
|
21
|
-
## 何时使用
|
|
22
|
-
|
|
23
|
-
- 用户要求对某个 ABAP 程序做「审查 / 审计 / 代码审查」,通常会给出程序名(如 `ZPPR085_NEW`)。
|
|
24
|
-
- 用户希望以 HTML 形式交付 ABAP 代码审查报告。
|
|
25
|
-
- 程序的数据流涉及 `ZCL_BC_API=>CALL_API`、`/UI2/CL_JSON`,或将数据在可编辑 ALV 中回写外部系统。
|
|
26
|
-
|
|
27
|
-
## 前置条件
|
|
28
|
-
|
|
29
|
-
- SAP 连接已配置(`get_connected_systems` 确认可用连接)。
|
|
30
|
-
- 源码通过**内置 SAP 工具**读取,不依赖任何 MCP 服务器。
|
|
31
|
-
- 审查规范遵循 `clean-abap` 技能(SAP 官方 Clean ABAP);语法/版本参考 `sap-abap-skills` 互补。
|
|
32
|
-
|
|
33
|
-
## 执行步骤
|
|
34
|
-
|
|
35
|
-
【强制】以下步骤必须按顺序执行,不得插入其他工具调用。
|
|
36
|
-
|
|
37
|
-
1. **获取输入。** 从用户处确认程序/函数名称以及审查范围。
|
|
38
|
-
2. **读取源码(智能分步)**:
|
|
39
|
-
- 对象类型:报表/程序=`PROG`、函数模块=`FUNC`、类=`CLAS`;对象名不确定先 `search_abap_objects`。
|
|
40
|
-
- **先读头部 + 事件块清单**(前 100 行),用 `search_abap_object_lines` 定位 INITIALIZATION / START-OF-SELECTION / FORM / CALL FUNCTION 关键行。
|
|
41
|
-
- **再按行区间精读关键段**;程序 > 2000 行必须分步读取,禁止一次全量拉取。
|
|
42
|
-
3. **存档源码(可选)。** 默认**不**在本地保存源码;仅当用户明确要求时才保存到 `output/<程序名>.abap`,便于对照。
|
|
43
|
-
4. **ATC 自动检查(客观补充)。** 调用内置 `run_atc_analysis` 获取代码质量门禁的客观发现
|
|
44
|
-
(语法/性能/安全/废弃用法规则),记录为「ATC 自动发现」并入报告——与 AI 静态走查互补。
|
|
45
|
-
5. **收集关联对象。** 留意被 INCLUDE 的程序、配置表(`ZBCT_OUTF_CONFIG`)、
|
|
46
|
-
结构(`ZCRMS_*`、`ZBCS_*`)等引用对象,可继续用内置工具读取;用 `find_where_used` 查谁调用本程序(修改影响面)。
|
|
47
|
-
6. **静态走查。** 自顶向下逐段核对 `references/checklist.md` 的每一项:
|
|
48
|
-
选择屏幕 → `INITIALIZATION` → GET_DATA(接口调用 + JSON 反序列化 + 展平)
|
|
49
|
-
→ ALV 展示 → 可编辑处理 → 发送/更新命令。
|
|
50
|
-
- **逻辑解析准备**:同时梳理「程序在做什么 / 怎么做」的脉络,作为「代码逻辑详细解析」子节(挂在「一、程序功能与结构概览」页签下方)的 `{{LOGIC_SECTION}}`。
|
|
51
|
-
- **ALV 字段取数逻辑(仅 ALV 报表类程序)**:若程序输出为 ALV 报表,逐字段整理取数逻辑,
|
|
52
|
-
一并写入 `{{LOGIC_SECTION}}`——格式为含 `<h3>ALV 字段取数逻辑</h3>` 与
|
|
53
|
-
`<table>`(列:字段名 | 取数来源/逻辑 | 备注/计算公式)的整块 HTML;
|
|
54
|
-
非 ALV 程序(函数 / 接口类)的 `{{LOGIC_SECTION}}` 仅含文字解析、不含取数表。
|
|
55
|
-
7. **问题定级。** 每条问题记录:`id`、严重度(高/中/低)、
|
|
56
|
-
`位置`(FORM/方法/行号,可用 `search_abap_object_lines` 定位准确行)、`现象`、`建议修复`、`来源`(AI 走查 / ATC)。
|
|
57
|
-
严重度配色:红=高,黄=中,蓝=低,绿=OK。
|
|
58
|
-
⚠️ 报告篇幅控制:重点问题 ≤ 15 条、中危 ≤ 20 条、低危 ≤ 20 条(超出按影响度精选),避免报告过大。
|
|
59
|
-
8. **生成 HTML 报告(需用户确认)。** 先把审查结论摘要展示给用户(问题数量/严重度分布/关键风险),**明确请求确认**后再生成文件:
|
|
60
|
-
将 `assets/report-template.html` 复制到 `output/` 目录,
|
|
61
|
-
把每个 `{{TOKEN}}` 占位符替换为真实内容(保留现有 CSS,不要改样式),
|
|
62
|
-
保存为 `output/<程序名或函数名>_CodeReview.html`。
|
|
63
|
-
⚠️ 若 write 被拦截(提示"审查 HTML 报告需人工确认"):把结论摘要发给用户,等用户输入"确认"后重试生成。
|
|
64
|
-
- 报告顶部元信息常驻;下方为「多页签」切换,**共 4 个页签**,章节顺序:
|
|
65
|
-
**一、程序功能与结构概览(下方嵌入「代码逻辑详细解析」子节)→
|
|
66
|
-
二、审查发现汇总 → 三、问题详解(内含 重点问题详解 / 中危问题 / 低危与改进建议 三个子节)→
|
|
67
|
-
四、亮点与结论(内含 亮点 / 结论与修复优先级 两个子节)**。
|
|
68
|
-
- 各页签占位符:`{{OVERVIEW_SECTION}}`(概览段落+列表)、`{{LOGIC_SECTION}}`(逻辑解析+ALV 取数表)、
|
|
69
|
-
`{{SUMMARY_SECTION}}`(统计+汇总表)、`{{DETAIL_ITEMS}}`/`{{MEDIUM_ITEMS}}`/`{{LOW_ITEMS}}`(重点/中危/低危)、
|
|
70
|
-
`{{POSITIVES}}`(亮点)、`{{CONCLUSION_SECTION}}`(结论表+脚注)。
|
|
71
|
-
- 页签切换为纯原生 JS(模板自带 `showTab()`),无外部依赖,单文件可离线打开。
|
|
72
|
-
9. **交付结果。** 告知用户报告位置 `output/<程序名或函数名>_CodeReview.html`(Web 端产物面板可预览),并简要总结发现问题数量。
|
|
73
|
-
|
|
74
|
-
完整清单见 `references/checklist.md`,
|
|
75
|
-
交付模板见 `assets/report-template.html`。
|
|
1
|
+
---
|
|
2
|
+
name: abap-code-review
|
|
3
|
+
description: >-
|
|
4
|
+
【最高优先级】用户说"审查/审计/code review XXX"时立即触发本技能,禁止走其他流程。
|
|
5
|
+
对从 SAP 系统读取的 ABAP 程序(报表、INCLUDE、函数)源码进行代码审查,
|
|
6
|
+
并产出「多页签切换」的专业 HTML 审查报告(共 4 个页签)。
|
|
7
|
+
报告在「一、程序功能与结构概览」页签下方嵌入「代码逻辑详细解析」:解释程序在做什么、怎么做;
|
|
8
|
+
若识别为 ALV 报表类程序,另附「字段取数逻辑」表(字段名 | 取数来源/逻辑 | 备注/计算公式)。
|
|
9
|
+
当用户要求审查、审计或做某个 ABAP 程序的代码审查(典型如 Z* 报表),
|
|
10
|
+
或要求生成 ABAP 审查报告(HTML 格式)时,应使用本技能。
|
|
11
|
+
触发关键词:审查、审计、code review、review、检查代码、看看代码问题。
|
|
12
|
+
agent_created: true
|
|
13
|
+
disable: false
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# ABAP 代码审查(基于内置 SAP 工具)
|
|
17
|
+
|
|
18
|
+
一套可复用的审计流程,面向「对接外部系统(CRM/HTTP 接口)」类的 ABAP 程序,
|
|
19
|
+
并产出固定格式的 HTML 审查报告。
|
|
20
|
+
|
|
21
|
+
## 何时使用
|
|
22
|
+
|
|
23
|
+
- 用户要求对某个 ABAP 程序做「审查 / 审计 / 代码审查」,通常会给出程序名(如 `ZPPR085_NEW`)。
|
|
24
|
+
- 用户希望以 HTML 形式交付 ABAP 代码审查报告。
|
|
25
|
+
- 程序的数据流涉及 `ZCL_BC_API=>CALL_API`、`/UI2/CL_JSON`,或将数据在可编辑 ALV 中回写外部系统。
|
|
26
|
+
|
|
27
|
+
## 前置条件
|
|
28
|
+
|
|
29
|
+
- SAP 连接已配置(`get_connected_systems` 确认可用连接)。
|
|
30
|
+
- 源码通过**内置 SAP 工具**读取,不依赖任何 MCP 服务器。
|
|
31
|
+
- 审查规范遵循 `clean-abap` 技能(SAP 官方 Clean ABAP);语法/版本参考 `sap-abap-skills` 互补。
|
|
32
|
+
|
|
33
|
+
## 执行步骤
|
|
34
|
+
|
|
35
|
+
【强制】以下步骤必须按顺序执行,不得插入其他工具调用。
|
|
36
|
+
|
|
37
|
+
1. **获取输入。** 从用户处确认程序/函数名称以及审查范围。
|
|
38
|
+
2. **读取源码(智能分步)**:
|
|
39
|
+
- 对象类型:报表/程序=`PROG`、函数模块=`FUNC`、类=`CLAS`;对象名不确定先 `search_abap_objects`。
|
|
40
|
+
- **先读头部 + 事件块清单**(前 100 行),用 `search_abap_object_lines` 定位 INITIALIZATION / START-OF-SELECTION / FORM / CALL FUNCTION 关键行。
|
|
41
|
+
- **再按行区间精读关键段**;程序 > 2000 行必须分步读取,禁止一次全量拉取。
|
|
42
|
+
3. **存档源码(可选)。** 默认**不**在本地保存源码;仅当用户明确要求时才保存到 `output/<程序名>.abap`,便于对照。
|
|
43
|
+
4. **ATC 自动检查(客观补充)。** 调用内置 `run_atc_analysis` 获取代码质量门禁的客观发现
|
|
44
|
+
(语法/性能/安全/废弃用法规则),记录为「ATC 自动发现」并入报告——与 AI 静态走查互补。
|
|
45
|
+
5. **收集关联对象。** 留意被 INCLUDE 的程序、配置表(`ZBCT_OUTF_CONFIG`)、
|
|
46
|
+
结构(`ZCRMS_*`、`ZBCS_*`)等引用对象,可继续用内置工具读取;用 `find_where_used` 查谁调用本程序(修改影响面)。
|
|
47
|
+
6. **静态走查。** 自顶向下逐段核对 `references/checklist.md` 的每一项:
|
|
48
|
+
选择屏幕 → `INITIALIZATION` → GET_DATA(接口调用 + JSON 反序列化 + 展平)
|
|
49
|
+
→ ALV 展示 → 可编辑处理 → 发送/更新命令。
|
|
50
|
+
- **逻辑解析准备**:同时梳理「程序在做什么 / 怎么做」的脉络,作为「代码逻辑详细解析」子节(挂在「一、程序功能与结构概览」页签下方)的 `{{LOGIC_SECTION}}`。
|
|
51
|
+
- **ALV 字段取数逻辑(仅 ALV 报表类程序)**:若程序输出为 ALV 报表,逐字段整理取数逻辑,
|
|
52
|
+
一并写入 `{{LOGIC_SECTION}}`——格式为含 `<h3>ALV 字段取数逻辑</h3>` 与
|
|
53
|
+
`<table>`(列:字段名 | 取数来源/逻辑 | 备注/计算公式)的整块 HTML;
|
|
54
|
+
非 ALV 程序(函数 / 接口类)的 `{{LOGIC_SECTION}}` 仅含文字解析、不含取数表。
|
|
55
|
+
7. **问题定级。** 每条问题记录:`id`、严重度(高/中/低)、
|
|
56
|
+
`位置`(FORM/方法/行号,可用 `search_abap_object_lines` 定位准确行)、`现象`、`建议修复`、`来源`(AI 走查 / ATC)。
|
|
57
|
+
严重度配色:红=高,黄=中,蓝=低,绿=OK。
|
|
58
|
+
⚠️ 报告篇幅控制:重点问题 ≤ 15 条、中危 ≤ 20 条、低危 ≤ 20 条(超出按影响度精选),避免报告过大。
|
|
59
|
+
8. **生成 HTML 报告(需用户确认)。** 先把审查结论摘要展示给用户(问题数量/严重度分布/关键风险),**明确请求确认**后再生成文件:
|
|
60
|
+
将 `assets/report-template.html` 复制到 `output/` 目录,
|
|
61
|
+
把每个 `{{TOKEN}}` 占位符替换为真实内容(保留现有 CSS,不要改样式),
|
|
62
|
+
保存为 `output/<程序名或函数名>_CodeReview.html`。
|
|
63
|
+
⚠️ 若 write 被拦截(提示"审查 HTML 报告需人工确认"):把结论摘要发给用户,等用户输入"确认"后重试生成。
|
|
64
|
+
- 报告顶部元信息常驻;下方为「多页签」切换,**共 4 个页签**,章节顺序:
|
|
65
|
+
**一、程序功能与结构概览(下方嵌入「代码逻辑详细解析」子节)→
|
|
66
|
+
二、审查发现汇总 → 三、问题详解(内含 重点问题详解 / 中危问题 / 低危与改进建议 三个子节)→
|
|
67
|
+
四、亮点与结论(内含 亮点 / 结论与修复优先级 两个子节)**。
|
|
68
|
+
- 各页签占位符:`{{OVERVIEW_SECTION}}`(概览段落+列表)、`{{LOGIC_SECTION}}`(逻辑解析+ALV 取数表)、
|
|
69
|
+
`{{SUMMARY_SECTION}}`(统计+汇总表)、`{{DETAIL_ITEMS}}`/`{{MEDIUM_ITEMS}}`/`{{LOW_ITEMS}}`(重点/中危/低危)、
|
|
70
|
+
`{{POSITIVES}}`(亮点)、`{{CONCLUSION_SECTION}}`(结论表+脚注)。
|
|
71
|
+
- 页签切换为纯原生 JS(模板自带 `showTab()`),无外部依赖,单文件可离线打开。
|
|
72
|
+
9. **交付结果。** 告知用户报告位置 `output/<程序名或函数名>_CodeReview.html`(Web 端产物面板可预览),并简要总结发现问题数量。
|
|
73
|
+
|
|
74
|
+
完整清单见 `references/checklist.md`,
|
|
75
|
+
交付模板见 `assets/report-template.html`。
|
|
@@ -1,142 +1,142 @@
|
|
|
1
|
-
<!-- ABAP Code Review Report Template (固化模板)
|
|
2
|
-
用法:复制到工作区,替换所有 {{TOKEN}} 占位符,保持现有 CSS 不变。
|
|
3
|
-
严重度配色:高/需核实=红橙,中=琥珀,低=蓝,亮点=绿。
|
|
4
|
-
结构:顶部元信息常驻;下方为「多页签」切换(4 个页签),纯原生 JS、无外部依赖。
|
|
5
|
-
页签:
|
|
6
|
-
一、程序功能与结构概览 —— 内含「代码逻辑详细解析」子节({{LOGIC_SECTION}})
|
|
7
|
-
二、审查发现汇总 —— {{SUMMARY_SECTION}}
|
|
8
|
-
三、问题详解 —— 含 重点问题详解 {{DETAIL_ITEMS}} / 中危 {{MEDIUM_ITEMS}} / 低危 {{LOW_ITEMS}}
|
|
9
|
-
四、亮点与结论 —— 含 亮点 {{POSITIVES}} / 结论与修复优先级 {{CONCLUSION_SECTION}}
|
|
10
|
-
{{OVERVIEW_SECTION}} 为概览段落+列表;{{LOGIC_SECTION}} 为逻辑叙述+(ALV 报表时)字段取数逻辑表;
|
|
11
|
-
非 ALV 程序(函数/接口类)时 {{LOGIC_SECTION}} 仅含文字解析、不含取数表。 -->
|
|
12
|
-
<!DOCTYPE html>
|
|
13
|
-
<html lang="zh-CN">
|
|
14
|
-
<head>
|
|
15
|
-
<meta charset="UTF-8">
|
|
16
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
17
|
-
<title>ABAP 代码审查报告 · {{PROGRAM_NAME}}</title>
|
|
18
|
-
<style>
|
|
19
|
-
:root{
|
|
20
|
-
--bg:#ffffff; --ink:#1f2937; --muted:#6b7280; --line:#e5e7eb;
|
|
21
|
-
--brand:#b45309; --brand2:#d97706;
|
|
22
|
-
--crit:#dc2626; --high:#ea580c; --med:#d97706; --low:#2563eb; --ok:#059669;
|
|
23
|
-
--chip:#f3f4f6;
|
|
24
|
-
}
|
|
25
|
-
*{box-sizing:border-box}
|
|
26
|
-
body{font-family:-apple-system,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;
|
|
27
|
-
color:var(--ink); background:var(--bg); margin:0; line-height:1.65; font-size:14px}
|
|
28
|
-
.wrap{max-width:1020px; margin:0 auto; padding:40px 36px 64px}
|
|
29
|
-
header{border-bottom:3px solid var(--brand); padding-bottom:18px; margin-bottom:8px}
|
|
30
|
-
h1{font-size:24px; margin:0 0 6px; color:var(--ink)}
|
|
31
|
-
.sub{color:var(--muted); font-size:13px}
|
|
32
|
-
h2{font-size:18px; margin:34px 0 12px; padding-left:10px; border-left:4px solid var(--brand); color:var(--ink)}
|
|
33
|
-
h3{font-size:15px; margin:22px 0 8px; color:var(--brand)}
|
|
34
|
-
table{border-collapse:collapse; width:100%; margin:10px 0; font-size:13px}
|
|
35
|
-
th,td{border:1px solid var(--line); padding:8px 10px; text-align:left; vertical-align:top}
|
|
36
|
-
th{background:#f9fafb; font-weight:600}
|
|
37
|
-
.meta td{width:50%}
|
|
38
|
-
.meta td:first-child{background:#f9fafb; font-weight:600; width:160px}
|
|
39
|
-
.sev{display:inline-block; padding:2px 9px; border-radius:11px; font-size:12px; font-weight:700; color:#fff; white-space:nowrap}
|
|
40
|
-
.s-crit{background:var(--crit)} .s-high{background:var(--high)} .s-med{background:var(--med)} .s-low{background:var(--low)} .s-ok{background:var(--ok)}
|
|
41
|
-
code{background:#f3f4f6; padding:1px 5px; border-radius:4px; font-family:"SFMono-Regular",Consolas,monospace; font-size:12.5px; color:#b45309}
|
|
42
|
-
pre{background:#0f172a; color:#e2e8f0; padding:14px 16px; border-radius:8px; overflow:auto; font-size:12.5px; line-height:1.55; font-family:Consolas,monospace}
|
|
43
|
-
pre .c{color:#94a3b8} pre .k{color:#fca5a5} pre .s{color:#fcd34d}
|
|
44
|
-
.callout{border:1px solid var(--line); border-left:4px solid var(--brand); background:#fffbeb; padding:12px 16px; border-radius:6px; margin:12px 0}
|
|
45
|
-
.grid{display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin:14px 0}
|
|
46
|
-
.stat{background:#f9fafb; border:1px solid var(--line); border-radius:8px; padding:14px; text-align:center}
|
|
47
|
-
.stat .n{font-size:26px; font-weight:800; display:block}
|
|
48
|
-
.stat .l{font-size:12px; color:var(--muted)}
|
|
49
|
-
ul{margin:8px 0; padding-left:22px} li{margin:5px 0}
|
|
50
|
-
.foot{margin-top:40px; padding-top:16px; border-top:1px solid var(--line); color:var(--muted); font-size:12px}
|
|
51
|
-
.pos{background:#ecfdf5; border:1px solid #a7f3d0; border-radius:8px; padding:14px 18px}
|
|
52
|
-
|
|
53
|
-
/* ---- 页签导航 ---- */
|
|
54
|
-
.tabs{display:flex; flex-wrap:wrap; gap:4px; border-bottom:2px solid var(--line); margin:22px 0 0; padding-bottom:0}
|
|
55
|
-
.tab-btn{appearance:none; border:none; background:transparent; cursor:pointer; font:inherit; font-size:13px;
|
|
56
|
-
color:var(--muted); padding:9px 13px; margin-bottom:-2px; border-bottom:3px solid transparent;
|
|
57
|
-
border-radius:7px 7px 0 0; white-space:nowrap; transition:background .15s,color .15s}
|
|
58
|
-
.tab-btn:hover{color:var(--ink); background:#f9fafb}
|
|
59
|
-
.tab-btn.active{color:var(--brand); font-weight:700; border-bottom-color:var(--brand); background:#fffbeb}
|
|
60
|
-
.tab-panel{display:none; padding-top:8px; animation:fade .2s ease}
|
|
61
|
-
.tab-panel.active{display:block}
|
|
62
|
-
@keyframes fade{from{opacity:.35} to{opacity:1}}
|
|
63
|
-
@media (max-width:680px){ .grid{grid-template-columns:repeat(2,1fr)} .tab-btn{font-size:12px; padding:8px 10px} }
|
|
64
|
-
</style>
|
|
65
|
-
</head>
|
|
66
|
-
<body>
|
|
67
|
-
<div class="wrap">
|
|
68
|
-
|
|
69
|
-
<header>
|
|
70
|
-
<h1>ABAP 代码审查报告</h1>
|
|
71
|
-
<div class="sub">程序 <strong>{{PROGRAM_NAME}}</strong> · {{PROGRAM_SUB}}</div>
|
|
72
|
-
</header>
|
|
73
|
-
|
|
74
|
-
<table class="meta">
|
|
75
|
-
<tr><td>程序名称</td><td>{{PROGRAM_NAME}}</td></tr>
|
|
76
|
-
<tr><td>审查对象</td><td>{{REVIEW_OBJ}}</td></tr>
|
|
77
|
-
<tr><td>审查人</td><td>{{REVIEWER}}</td></tr>
|
|
78
|
-
<tr><td>审查日期</td><td>{{REVIEW_DATE}}</td></tr>
|
|
79
|
-
<tr><td>审查方式</td><td>{{REVIEW_METHOD}}</td></tr>
|
|
80
|
-
<tr><td>总体结论</td><td>{{VERDICT_CHIP}} {{VERDICT_TEXT}}</td></tr>
|
|
81
|
-
</table>
|
|
82
|
-
|
|
83
|
-
<!-- ===================== 多页签区域(4 页签) ===================== -->
|
|
84
|
-
<div class="tabs" role="tablist">
|
|
85
|
-
<button class="tab-btn active" role="tab" onclick="showTab('tab-overview',this)">一、程序功能与结构概览</button>
|
|
86
|
-
<button class="tab-btn" role="tab" onclick="showTab('tab-summary',this)">二、审查发现汇总</button>
|
|
87
|
-
<button class="tab-btn" role="tab" onclick="showTab('tab-issues',this)">三、问题详解</button>
|
|
88
|
-
<button class="tab-btn" role="tab" onclick="showTab('tab-concl',this)">四、亮点与结论</button>
|
|
89
|
-
</div>
|
|
90
|
-
|
|
91
|
-
<!-- 一、程序功能与结构概览(内含代码逻辑详细解析) -->
|
|
92
|
-
<section class="tab-panel active" id="tab-overview" role="tabpanel">
|
|
93
|
-
{{OVERVIEW_SECTION}}
|
|
94
|
-
<h2>代码逻辑详细解析</h2>
|
|
95
|
-
{{LOGIC_SECTION}}
|
|
96
|
-
</section>
|
|
97
|
-
|
|
98
|
-
<!-- 二、审查发现汇总 -->
|
|
99
|
-
<section class="tab-panel" id="tab-summary" role="tabpanel">
|
|
100
|
-
{{SUMMARY_SECTION}}
|
|
101
|
-
</section>
|
|
102
|
-
|
|
103
|
-
<!-- 三、问题详解(重点 + 中危 + 低危) -->
|
|
104
|
-
<section class="tab-panel" id="tab-issues" role="tabpanel">
|
|
105
|
-
<h2>重点问题详解(高危 / 需核实)</h2>
|
|
106
|
-
{{DETAIL_ITEMS}}
|
|
107
|
-
<h2>中危问题</h2>
|
|
108
|
-
{{MEDIUM_ITEMS}}
|
|
109
|
-
<h2>低危与改进建议</h2>
|
|
110
|
-
{{LOW_ITEMS}}
|
|
111
|
-
</section>
|
|
112
|
-
|
|
113
|
-
<!-- 四、亮点与结论(亮点 + 结论与修复优先级) -->
|
|
114
|
-
<section class="tab-panel" id="tab-concl" role="tabpanel">
|
|
115
|
-
<h2>亮点(值得保留)</h2>
|
|
116
|
-
{{POSITIVES}}
|
|
117
|
-
<h2>结论与修复优先级</h2>
|
|
118
|
-
{{CONCLUSION_SECTION}}
|
|
119
|
-
</section>
|
|
120
|
-
|
|
121
|
-
<div class="foot">
|
|
122
|
-
报告由 {{REVIEWER}} 生成 · {{REVIEW_METHOD}} · 涉及对象:{{REVIEW_OBJ}}
|
|
123
|
-
</div>
|
|
124
|
-
|
|
125
|
-
</div>
|
|
126
|
-
|
|
127
|
-
<script>
|
|
128
|
-
function showTab(id, btn){
|
|
129
|
-
var panels = document.querySelectorAll('.tab-panel');
|
|
130
|
-
var btns = document.querySelectorAll('.tab-btn');
|
|
131
|
-
for(var i=0;i<panels.length;i++){ panels[i].classList.remove('active'); }
|
|
132
|
-
for(var j=0;j<btns.length;j++){ btns[j].classList.remove('active'); }
|
|
133
|
-
var el = document.getElementById(id);
|
|
134
|
-
if(el){ el.classList.add('active'); }
|
|
135
|
-
if(btn){ btn.classList.add('active'); }
|
|
136
|
-
}
|
|
137
|
-
</script>
|
|
138
|
-
<div style="text-align:center; color:var(--muted); font-size:12px; margin-top:40px; border-top:1px solid var(--line); padding-top:16px">
|
|
139
|
-
Generated by SapBuddy
|
|
140
|
-
</div>
|
|
141
|
-
</body>
|
|
142
|
-
</html>
|
|
1
|
+
<!-- ABAP Code Review Report Template (固化模板)
|
|
2
|
+
用法:复制到工作区,替换所有 {{TOKEN}} 占位符,保持现有 CSS 不变。
|
|
3
|
+
严重度配色:高/需核实=红橙,中=琥珀,低=蓝,亮点=绿。
|
|
4
|
+
结构:顶部元信息常驻;下方为「多页签」切换(4 个页签),纯原生 JS、无外部依赖。
|
|
5
|
+
页签:
|
|
6
|
+
一、程序功能与结构概览 —— 内含「代码逻辑详细解析」子节({{LOGIC_SECTION}})
|
|
7
|
+
二、审查发现汇总 —— {{SUMMARY_SECTION}}
|
|
8
|
+
三、问题详解 —— 含 重点问题详解 {{DETAIL_ITEMS}} / 中危 {{MEDIUM_ITEMS}} / 低危 {{LOW_ITEMS}}
|
|
9
|
+
四、亮点与结论 —— 含 亮点 {{POSITIVES}} / 结论与修复优先级 {{CONCLUSION_SECTION}}
|
|
10
|
+
{{OVERVIEW_SECTION}} 为概览段落+列表;{{LOGIC_SECTION}} 为逻辑叙述+(ALV 报表时)字段取数逻辑表;
|
|
11
|
+
非 ALV 程序(函数/接口类)时 {{LOGIC_SECTION}} 仅含文字解析、不含取数表。 -->
|
|
12
|
+
<!DOCTYPE html>
|
|
13
|
+
<html lang="zh-CN">
|
|
14
|
+
<head>
|
|
15
|
+
<meta charset="UTF-8">
|
|
16
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
17
|
+
<title>ABAP 代码审查报告 · {{PROGRAM_NAME}}</title>
|
|
18
|
+
<style>
|
|
19
|
+
:root{
|
|
20
|
+
--bg:#ffffff; --ink:#1f2937; --muted:#6b7280; --line:#e5e7eb;
|
|
21
|
+
--brand:#b45309; --brand2:#d97706;
|
|
22
|
+
--crit:#dc2626; --high:#ea580c; --med:#d97706; --low:#2563eb; --ok:#059669;
|
|
23
|
+
--chip:#f3f4f6;
|
|
24
|
+
}
|
|
25
|
+
*{box-sizing:border-box}
|
|
26
|
+
body{font-family:-apple-system,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;
|
|
27
|
+
color:var(--ink); background:var(--bg); margin:0; line-height:1.65; font-size:14px}
|
|
28
|
+
.wrap{max-width:1020px; margin:0 auto; padding:40px 36px 64px}
|
|
29
|
+
header{border-bottom:3px solid var(--brand); padding-bottom:18px; margin-bottom:8px}
|
|
30
|
+
h1{font-size:24px; margin:0 0 6px; color:var(--ink)}
|
|
31
|
+
.sub{color:var(--muted); font-size:13px}
|
|
32
|
+
h2{font-size:18px; margin:34px 0 12px; padding-left:10px; border-left:4px solid var(--brand); color:var(--ink)}
|
|
33
|
+
h3{font-size:15px; margin:22px 0 8px; color:var(--brand)}
|
|
34
|
+
table{border-collapse:collapse; width:100%; margin:10px 0; font-size:13px}
|
|
35
|
+
th,td{border:1px solid var(--line); padding:8px 10px; text-align:left; vertical-align:top}
|
|
36
|
+
th{background:#f9fafb; font-weight:600}
|
|
37
|
+
.meta td{width:50%}
|
|
38
|
+
.meta td:first-child{background:#f9fafb; font-weight:600; width:160px}
|
|
39
|
+
.sev{display:inline-block; padding:2px 9px; border-radius:11px; font-size:12px; font-weight:700; color:#fff; white-space:nowrap}
|
|
40
|
+
.s-crit{background:var(--crit)} .s-high{background:var(--high)} .s-med{background:var(--med)} .s-low{background:var(--low)} .s-ok{background:var(--ok)}
|
|
41
|
+
code{background:#f3f4f6; padding:1px 5px; border-radius:4px; font-family:"SFMono-Regular",Consolas,monospace; font-size:12.5px; color:#b45309}
|
|
42
|
+
pre{background:#0f172a; color:#e2e8f0; padding:14px 16px; border-radius:8px; overflow:auto; font-size:12.5px; line-height:1.55; font-family:Consolas,monospace}
|
|
43
|
+
pre .c{color:#94a3b8} pre .k{color:#fca5a5} pre .s{color:#fcd34d}
|
|
44
|
+
.callout{border:1px solid var(--line); border-left:4px solid var(--brand); background:#fffbeb; padding:12px 16px; border-radius:6px; margin:12px 0}
|
|
45
|
+
.grid{display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin:14px 0}
|
|
46
|
+
.stat{background:#f9fafb; border:1px solid var(--line); border-radius:8px; padding:14px; text-align:center}
|
|
47
|
+
.stat .n{font-size:26px; font-weight:800; display:block}
|
|
48
|
+
.stat .l{font-size:12px; color:var(--muted)}
|
|
49
|
+
ul{margin:8px 0; padding-left:22px} li{margin:5px 0}
|
|
50
|
+
.foot{margin-top:40px; padding-top:16px; border-top:1px solid var(--line); color:var(--muted); font-size:12px}
|
|
51
|
+
.pos{background:#ecfdf5; border:1px solid #a7f3d0; border-radius:8px; padding:14px 18px}
|
|
52
|
+
|
|
53
|
+
/* ---- 页签导航 ---- */
|
|
54
|
+
.tabs{display:flex; flex-wrap:wrap; gap:4px; border-bottom:2px solid var(--line); margin:22px 0 0; padding-bottom:0}
|
|
55
|
+
.tab-btn{appearance:none; border:none; background:transparent; cursor:pointer; font:inherit; font-size:13px;
|
|
56
|
+
color:var(--muted); padding:9px 13px; margin-bottom:-2px; border-bottom:3px solid transparent;
|
|
57
|
+
border-radius:7px 7px 0 0; white-space:nowrap; transition:background .15s,color .15s}
|
|
58
|
+
.tab-btn:hover{color:var(--ink); background:#f9fafb}
|
|
59
|
+
.tab-btn.active{color:var(--brand); font-weight:700; border-bottom-color:var(--brand); background:#fffbeb}
|
|
60
|
+
.tab-panel{display:none; padding-top:8px; animation:fade .2s ease}
|
|
61
|
+
.tab-panel.active{display:block}
|
|
62
|
+
@keyframes fade{from{opacity:.35} to{opacity:1}}
|
|
63
|
+
@media (max-width:680px){ .grid{grid-template-columns:repeat(2,1fr)} .tab-btn{font-size:12px; padding:8px 10px} }
|
|
64
|
+
</style>
|
|
65
|
+
</head>
|
|
66
|
+
<body>
|
|
67
|
+
<div class="wrap">
|
|
68
|
+
|
|
69
|
+
<header>
|
|
70
|
+
<h1>ABAP 代码审查报告</h1>
|
|
71
|
+
<div class="sub">程序 <strong>{{PROGRAM_NAME}}</strong> · {{PROGRAM_SUB}}</div>
|
|
72
|
+
</header>
|
|
73
|
+
|
|
74
|
+
<table class="meta">
|
|
75
|
+
<tr><td>程序名称</td><td>{{PROGRAM_NAME}}</td></tr>
|
|
76
|
+
<tr><td>审查对象</td><td>{{REVIEW_OBJ}}</td></tr>
|
|
77
|
+
<tr><td>审查人</td><td>{{REVIEWER}}</td></tr>
|
|
78
|
+
<tr><td>审查日期</td><td>{{REVIEW_DATE}}</td></tr>
|
|
79
|
+
<tr><td>审查方式</td><td>{{REVIEW_METHOD}}</td></tr>
|
|
80
|
+
<tr><td>总体结论</td><td>{{VERDICT_CHIP}} {{VERDICT_TEXT}}</td></tr>
|
|
81
|
+
</table>
|
|
82
|
+
|
|
83
|
+
<!-- ===================== 多页签区域(4 页签) ===================== -->
|
|
84
|
+
<div class="tabs" role="tablist">
|
|
85
|
+
<button class="tab-btn active" role="tab" onclick="showTab('tab-overview',this)">一、程序功能与结构概览</button>
|
|
86
|
+
<button class="tab-btn" role="tab" onclick="showTab('tab-summary',this)">二、审查发现汇总</button>
|
|
87
|
+
<button class="tab-btn" role="tab" onclick="showTab('tab-issues',this)">三、问题详解</button>
|
|
88
|
+
<button class="tab-btn" role="tab" onclick="showTab('tab-concl',this)">四、亮点与结论</button>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<!-- 一、程序功能与结构概览(内含代码逻辑详细解析) -->
|
|
92
|
+
<section class="tab-panel active" id="tab-overview" role="tabpanel">
|
|
93
|
+
{{OVERVIEW_SECTION}}
|
|
94
|
+
<h2>代码逻辑详细解析</h2>
|
|
95
|
+
{{LOGIC_SECTION}}
|
|
96
|
+
</section>
|
|
97
|
+
|
|
98
|
+
<!-- 二、审查发现汇总 -->
|
|
99
|
+
<section class="tab-panel" id="tab-summary" role="tabpanel">
|
|
100
|
+
{{SUMMARY_SECTION}}
|
|
101
|
+
</section>
|
|
102
|
+
|
|
103
|
+
<!-- 三、问题详解(重点 + 中危 + 低危) -->
|
|
104
|
+
<section class="tab-panel" id="tab-issues" role="tabpanel">
|
|
105
|
+
<h2>重点问题详解(高危 / 需核实)</h2>
|
|
106
|
+
{{DETAIL_ITEMS}}
|
|
107
|
+
<h2>中危问题</h2>
|
|
108
|
+
{{MEDIUM_ITEMS}}
|
|
109
|
+
<h2>低危与改进建议</h2>
|
|
110
|
+
{{LOW_ITEMS}}
|
|
111
|
+
</section>
|
|
112
|
+
|
|
113
|
+
<!-- 四、亮点与结论(亮点 + 结论与修复优先级) -->
|
|
114
|
+
<section class="tab-panel" id="tab-concl" role="tabpanel">
|
|
115
|
+
<h2>亮点(值得保留)</h2>
|
|
116
|
+
{{POSITIVES}}
|
|
117
|
+
<h2>结论与修复优先级</h2>
|
|
118
|
+
{{CONCLUSION_SECTION}}
|
|
119
|
+
</section>
|
|
120
|
+
|
|
121
|
+
<div class="foot">
|
|
122
|
+
报告由 {{REVIEWER}} 生成 · {{REVIEW_METHOD}} · 涉及对象:{{REVIEW_OBJ}}
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<script>
|
|
128
|
+
function showTab(id, btn){
|
|
129
|
+
var panels = document.querySelectorAll('.tab-panel');
|
|
130
|
+
var btns = document.querySelectorAll('.tab-btn');
|
|
131
|
+
for(var i=0;i<panels.length;i++){ panels[i].classList.remove('active'); }
|
|
132
|
+
for(var j=0;j<btns.length;j++){ btns[j].classList.remove('active'); }
|
|
133
|
+
var el = document.getElementById(id);
|
|
134
|
+
if(el){ el.classList.add('active'); }
|
|
135
|
+
if(btn){ btn.classList.add('active'); }
|
|
136
|
+
}
|
|
137
|
+
</script>
|
|
138
|
+
<div style="text-align:center; color:var(--muted); font-size:12px; margin-top:40px; border-top:1px solid var(--line); padding-top:16px">
|
|
139
|
+
Generated by SapBuddy
|
|
140
|
+
</div>
|
|
141
|
+
</body>
|
|
142
|
+
</html>
|