内容
# ILE-RPG&DSPF 代码检查工具
一个 MCP 服务器,用于检查 ILE-RPG 语法和编码标准的合规性。
## 概述
该 MCP 服务器分析 ILE-RPG 源代码,并检测以下问题:
- 规范顺序错误
- 列位置规则违规
- 行延续错误
- 命名约定违规
- 已弃用功能的使用
- 最佳实践违规
## 功能
### 检查功能
1. **结构检查**
- 规范顺序(H→F→D→P→I→C→O),并具有 P-过程部分的感知能力
- 每个规范(H/F/D/P/C)的列位置规则
- D 规范高级验证(名称延续 `...`,声明类型位置,尾随句点检测)
- 行长度限制(最大 100 列)
- 支持 DBCS(双字节字符集),并考虑移位字符
2. **语法检查**
- 行延续规则验证
- 禁止在一行上使用多个语句
- `/FREE` 和 `/END-FREE` 对应
- 正确使用 **FREE 格式**
- 父heses 和字符串文字匹配
3. **命名约定检查**
- 变量和过程名称约定
- 特殊字符使用限制
- 有意义的名称建议
- 保留字检查(严格级别)
4. **最佳实践检查**
- 检测 16 个已弃用的功能(GOTO、TAG、MOVE、MOVEL、Z-ADD、Z-SUB 等)
- 编号指示器的警告(`*IN01-*IN99`)
- 完全免费格式的建议
- 自定义规则支持
5. **常见错误检测**
- F 规范空间不足
- D 规范列位置错误(包括列偏移启发式)
- 延续行错误
### 检查级别
- **基本**: 基本检查(规范顺序,关键语法错误)
- **标准**: 标准检查(基本 + 列位置,行延续等)
- **严格**: 严格检查(标准 + 命名约定,最佳实践)
### 多语言支持
- **英语 (en)**: 默认语言
- **日语 (ja)**: 所有消息和报告的完整日语支持
### DBCS 支持
当启用 `considerDBCS` 选项时,检查器会考虑 DBCS 字符串(日语,中文,韩语)中使用的移位输入(SI)和移位输出(SO)字符。这确保在存在 DBCS 字符时准确的列位置验证。
### 自定义规则
用户可以在 JSON 文件中定义自定义最佳实践规则。规则支持:
- 基于模式的匹配(正则表达式)
- 自定义严重性级别
- 启用/禁用功能
- 规则描述和建议
## 安装
### 先决条件
- Node.js 18 或更高版本
- npm
### 设置
1. 安装依赖项:
```bash
cd /path/to/ilerpg-code-checker
npm install
```
2. 构建:
```bash
npm run build
```
3. 添加到 MCP 配置文件:
#### 对于 IBM Bob IDE
将以下内容添加到 `c:\Users\user\AppData\Roaming\Bob-IDE\User\globalStorage\ibm.bob-code\settings\mcp_settings.json`:
```json
{
"mcpServers": {
"ilerpg-code-checker": {
"command": "node",
"args": ["<path-to-project>\\build\\index.js"],
"disabled": false,
"alwaysAllow": [],
"disabledTools": []
}
}
}
```
#### 对于 Claude Desktop
添加到您的 Claude Desktop MCP 设置文件(通常为 `~/Library/Application Support/Claude/claude_desktop_config.json` 在 macOS 上或 `%APPDATA%\Claude\claude_desktop_config.json` 在 Windows 上):
```json
{
"mcpServers": {
"ilerpg-code-checker": {
"command": "node",
"args": ["<path-to-project>/build/index.js"]
}
}
}
```
#### 对于 Cline(VS Code 扩展)
将以下内容添加到 VS Code 中的 Cline MCP 设置:
```json
{
"mcpServers": {
"ilerpg-code-checker": {
"command": "node",
"args": ["<path-to-project>/build/index.js"]
}
}
}
```
**注意:** 将 `<path-to-project>` 替换为您的 ilerpg-code-checker 目录的实际绝对路径。
## 使用
### MCP 工具
**注意:** 在检查文件时,优先使用 `check_rpg_file` 而不是 `check_rpg_code`。`check_rpg_file` 工具直接在服务器端读取文件,与通过 `check_rpg_code` 传递整个代码内容相比,显著减少了令牌使用量。
#### 1. check_rpg_code
检查整个 RPG 源代码。 **注意:** 为了更好的令牌效率,请考虑在检查文件时使用 `check_rpg_file`。
```typescript
use_mcp_tool({
server_name: "ilerpg-code-checker",
tool_name: "check_rpg_code",
arguments: {
code: "H DFTACTGRP(*NO)\n...",
checkLevel: "standard", // "basic" | "standard" | "strict"
language: "en", // "en" | "ja"
considerDBCS: false, // true to consider DBCS shift characters
customRulesPath: "./custom-rules.json" // Optional
}
})
```
**返回值:**
```json
{
"valid": false,
"issues": [
{
"severity": "error",
"category": "structure",
"line": 10,
"column": 7,
"message": "Invalid specification order...",
"rule": "SPEC_ORDER",
"suggestion": "..."
}
],
"summary": {
"totalIssues": 5,
"errors": 2,
"warnings": 2,
"infos": 1,
"checkedLines": 100
}
}
```
#### 2. check_specification_order
仅检查规范顺序。
```typescript
use_mcp_tool({
server_name: "ilerpg-code-checker",
tool_name: "check_specification_order",
arguments: {
code: "H DFTACTGRP(*NO)\n...",
language: "en" // "en" | "ja"
}
})
```
#### 3. check_column_positions
检查列位置规则。
```typescript
use_mcp_tool({
server_name: "ilerpg-code-checker",
tool_name: "check_column_positions",
arguments: {
code: "H DFTACTGRP(*NO)\n...",
language: "en", // "en" | "ja"
considerDBCS: false // true to consider DBCS shift characters
}
})
```
#### 4. check_naming_conventions
检查命名约定。
```typescript
use_mcp_tool({
server_name: "ilerpg-code-checker",
tool_name: "check_naming_conventions",
arguments: {
code: "D MyVar S 10A\n...",
language: "en" // "en" | "ja"
}
})
```
#### 5. check_best_practices
检查最佳实践。
```typescript
use_mcp_tool({
server_name: "ilerpg-code-checker",
tool_name: "check_best_practices",
arguments: {
code: "C GOTO Label\n...",
language: "en", // "en" | "ja"
customRulesPath: "./custom-rules.json" // Optional
}
})
```
#### 6. check_rpg_file
按文件检查。 **推荐:** 此工具比 `check_rpg_code` 更高效,因为它通过直接在服务器端读取文件来减少令牌使用量。
```typescript
use_mcp_tool({
server_name: "ilerpg-code-checker",
tool_name: "check_rpg_file",
arguments: {
filePath: "//your-server/path/to/your-file.rpg",
checkLevel: "standard",
language: "en", // "en" | "ja"
considerDBCS: false, // true to consider DBCS shift characters
customRulesPath: "./custom-rules.json" // Optional
}
})
```
## 自定义规则
创建 JSON 文件以定义自定义最佳实践规则:
```json
{
"rules": [
{
"id": "no-select-all",
"name": "避免 SELECT *",
"description": "不建议使用 SELECT *",
"pattern": "SELECT\\s+\\*",
"severity": "warning",
"suggestion": "显式指定列名",
"enabled": true
},
{
"id": "require-error-handling",
"name": "需要错误处理",
"description": "所有文件操作都应具有错误处理",
"pattern": "CHAIN|READ|WRITE|UPDATE|DELETE",
"severity": "info",
"suggestion": "使用 %ERROR 或 *IN99 添加错误处理",
"enabled": true
}
]
}
```
### 自定义规则属性
- `id`: 规则的唯一标识符
- `name`: 显示名称
- `description`: 详细描述
- `pattern`: 要匹配的正则表达式模式
- `severity`: "error" | "warning" | "info"
- `suggestion`: 解决问题的建议
- `enabled`: true | false
## 检测问题的示例
### 结构错误
```text
F-spec
H-spec ← 错误:H-spec 必须放在 F-spec 之前
```
### 列位置错误
```text
D MyVariable S 10A ← 错误:变量名不在正确的列位置
```
### 行延续错误
```text
D MyLongVariableName
D- S 10A ← 错误:延续行规范类型不匹配
```
### 命名约定违规
```text
D x S 10A ← 警告:变量名太短
D 1stVar S 10A ← 错误:变量名不能以数字开头
```
### 已弃用的功能
```text
C GOTO Label ← 警告:GOTO 已弃用
C Label TAG
```
### DBCS 示例
当 `considerDBCS: true` 时:
```text
D MyVar S 10A INZ('日本語')
↑ 正确考虑 DBCS 字符串中的移位字符
```
检查器还会在计算 EBCDIC 字节长度时考虑 DBCS 移位(SO/SI)字节:
- **注释行**(固定形式为 `*`,自由形式为 `//`)超过 **80 EBCDIC 字节** → 警告(`COMMENT_LINE_EBCDIC_OVERFLOW`)。超过 80 字节,编译列表会变得混乱;超过 100 字节,源代码会被 `CPYFRMSTMF` 截断(报告为 `LINE_LENGTH` 错误)。
- **注释区域**(第 81-100 列)超过 **20 EBCDIC 字节** → 警告(`COMMENT_DBCS_OVERFLOW`)。
## 开发
### 项目结构
```
ilerpg-code-checker/
├── package.json
├── tsconfig.json
├── README.md # 文档(英文)
├── README.ja.md # 文档(日语)
├── DESIGN.md # 架构和设计文档
├── custom-rules.example.json # 自定义规则示例
├── src/
│ ├── index.ts # MCP 服务器入口点
│ ├── orchestrator.ts # 检查协调
│ ├── parser/
│ │ ├── rpg-parser.ts # RPG 代码解析器
│ │ └── line-analyzer.ts # 行分析
│ ├── checkers/
│ │ ├── structure-checker.ts # 规范顺序和列验证
│ │ ├── syntax-checker.ts # 语法和格式验证
│ │ ├── naming-checker.ts # 命名约定验证
│ │ ├── best-practice-checker.ts # 已弃用功能和最佳实践
│ │ └── common-errors-checker.ts # 常见错误模式
│ ├── i18n/
│ │ └── messages.ts # 多语言消息(英文/日语)
│ ├── config/
│ │ └── custom-rules.ts # 自定义规则管理器
│ ├── types/
│ │ └── index.ts # 类型定义
│ └── utils/
│ ├── file-reader.ts # 文件 I/O 操作
│ ├── reporter.ts # 报告格式化
│ └── dbcs-helper.ts # DBCS 支持实用程序
└── build/ # 编译输出
```
### 构建
```bash
npm run build
```
### 开发模式(自动构建)
```bash
npm run watch
```
## 故障排除
### MCP 服务器无法启动
1. 检查 Node.js 版本:`node --version`(需要 18 或更高版本)
2. 验证构建是否完整:检查 `build/index.js` 是否存在
3. 验证 MCP 配置文件路径是否正确
### 检查结果未显示
1. 检查源代码编码(推荐使用 UTF-8)
2. 验证文件路径是否正确
3. 检查 MCP 服务器日志
## 许可证
MIT
## 作者
guricat
## 版本
0.0.15
## 更新日志
### 0.0.15(2026-06-16)
- 仓库维护(无更改到检查器检测逻辑)
- 修复示例目录名称中的拼写错误(`saples/` → `samples/`)
- 在 `tests/` 下合并了三个测试脚本(test-samples / test-dspec-overflow / test-dspf-overlap)。添加了一个单一源验证助手 `tests/check-one.mjs <path>`
- 净化和压缩了示例源代码(~4660 行 → ~1500 行总计)
- 中和以避免引发原始主题,并重命名为 `SAMPLE01`–`SAMPLE05`。算法主体被存根,标识符和注释被通用化
- 保留了 **RPG 构造的多样性**(列位置检查的价值)并保持所有五个文件 **编译干净(0 错误)**
- 还净化了捆绑文档中的专有引用(通用 RPG/EBCDIC 知识保留)
### 0.0.14(2026-06-12)
- 为 DSPF_FIELD_OVERLAP(CPD7866 等价)检测添加了 **前导属性字节冲突** 检测(真实案例:AITNTCFGD.dspf CTLWIN 行 4 — `'状態:'`(4,2)= 7 字节 col2-8 和 `'テナント'`(4,9)相邻,无数据重叠,但发出 CPD7866)
- 在 5250 显示屏上,**每个字段的直接前置位置由其前导属性字节占用**,因此在字段的数据末尾和下一个字段的开始之间至少需要一个空白列。间隙为 0(从 end+1 开始)将属性字节放在前一个字段的数据上并导致 CPD7866。检查已从 `next.col <= current.endCol` 扩展到 `next.col <= current.endCol + 1`,并为属性字节冲突添加了专用消息
- 间隙为 1(从 end+2 开始)有效,因为属性字节适合空白列(无假阳性)
- 修复了 DBCSHelper 中的 **半宽片假名错误分类**:U+FF00-FFEF 被全部视为 DBCS,增加了半宽片假名(U+FF61-FF9F,即 1 字节 via 代码页 290 在 EBCDIC 5026/5035)的字节长度。在添加属性字节检查后,出现了假阳性 `'日次トークン上限 (0=无限制):'`(AIOPSD.dspf),一旦添加了属性字节检查。半宽形式(U+FF61-FFDC,U+FFE8-FFEE)现在是 SBCS
- 为 AIADMND.dspf 中的示例添加了 5 个回归测试用例(前缀 AIADMND 重复 / 后缀 AIADMND.clean),验证了 0 个假阳性。检查器还捕获了用户正在进行的 AITNTCFGD CTLWIN 编辑中的真实阳性(属性字节与 col11 的 '>' 冲突)
### 0.0.13(2026-06-11)
- 修复了 DSPF_FIELD_OVERLAP(CPD7866 等价)遗漏(真实案例:在 AIADMND.dspf 中,TENFTR 中未检测到条件语句和常量之间的重叠)
- **常量(文字)现在包含在重叠检测中**:以前只有命名字段被检查,因此常量-常量和常量-字段重叠(典型的 CPD7866 模式)都通过了。显示长度根据后 EBCDIC 字节长度确定(n DBCS 字符 = 2n+2 字节,包括 SO/SI)。支持常量延续行(`'+'` = 从下一行的第一个非空白字符继续,`'-'` = 从第 45 列继续)
- **指示器排除范围缩小到仅“两侧条件语句均有”**:以前,任一侧的指示器都会跳过检查,但 CPD7866 意味着与 **无条件语句** 的字段重叠。只有相互排斥的对,如 77/N77(CPD7865 等价,预期行为)被排除;与无条件语句一侧的重叠被报告
- 将 CJK 符号和标点符号(U+3000-303F:表意文字空格,全角标点符号等)添加到 DBCSHelper 作为 DBCS(字节长度先前被低估)
- 为 `test-dspf-overlap.mjs` 添加了回归测试用例(前缀 AIADMND 重复 / 后缀 AIADMND.clean)。在 `E:/IBM_i_and_AI/src` 目录下的所有 10 个 DSPF 文件中验证了 0 个假阳性,并且在所有 RPG 源代码中未发生更改
### 0.0.12(2026-06-11)
- 使用上下文解决了第 22 列的 `E` 歧义,关闭了 v0.0.11 中的大部分盲点,在溢出的名称恰好以第 22 列的 `E` 结尾时
- **PR/PI 参数行**:在 PR/PI 声明后带有空白定义类型的 D 行现在被跟踪为参数。由于在参数定义中,第 22 列必须为空(RNF3780),因此在参数定义中报告 `E` 为名称溢出(D_SPEC_NAME_OVERFLOW)或无效值(D_SPEC_EXT_DESC_INVALID),具有确定性
- **外部描述的 DS 行**:`E` + 无 EXTNAME + 11 个或更多字符的名称无法编译(在任一解释下),在任何解释下都报告为错误
- 在子字段行上,第 22 列的 `E`(在 PR/PI 块外部)仍然无法区分,因为它与有效代码无法区分
- 将回归测试扩展到 20 个用例(添加了多行 PR/PI 块上下文用例);在所有 `E:/IBM_i_and_AI/src` 源代码中验证了 0 个假阳性
### 0.0.11(2026-06-11)
- 添加了 D 规范名称溢出检测:`D_SPEC_NAME_OVERFLOW`(错误)
- 检测名称溢出名称字段(第 7-21 列)到第 22 列及以后(例如,14 个字符的名称从第 9 列开始)。以前无法检测(真实案例:AIMONR.sqlrpgle 中的 `P_DBC_CONSUMED` 导致 RNF3780 严重性 20)
- 提供使用 `...` 名称延续语法的 Before/After 更正
- 为列 22(外部描述)和列 23(数据结构类型)添加了值验证:`D_SPEC_EXT_DESC_INVALID` / `D_SPEC_DS_TYPE_INVALID`(错误)
- 根据 IBM ILE RPG 参考,第 22 列仅允许 `E`/空白,第 23 列仅允许 `S`(PSDS)/ `U`(数据区域 DS)/ 空白;第 24-25 列不为空白的值会导致 RNF3780,因此报告这些错误
- 还检测到在第 23 列出现 `S`/`U`,而第 24-25 列不是 `DS`
- `D_SPEC_DECL_TYPE_MISPLACED` 不再在第 21 列(最后一个名称字段列)被占用时触发(而是报告为名称溢出)
- 在所有已知的良好 `E:/IBM_i_and_AI/src` 源代码中验证了 0 个假阳性;添加了回归测试 `test-dspec-overflow.mjs`
### 0.0.10(2026-06-10)
- 初始版本
```
### 0.0.10 (2026-06-07)
- 移除了错误的 F_SPEC_SPACING 检查(对有效代码的误报)
- F 规格的第 17 列是文件类型字段(I/O/U/C),而不是必需的空格;10 个字符的文件名(例如 `AICHATHSTD`)后面直接跟着文件类型字母,这是有效且可以编译的
- 将 D_SPEC_NAME_POSITION 从 `warning` 降级为 `info`
- 第 7 列/第 8 列的起始约定是一个样式建议,而不是编译要求;在第 7-21 列中任意位置放置名称都可以干净地编译
- 与已知的 `E:/IBM_i_and_AI/src` 源代码(*.sqlrpgle / *.dspf)进行验证:0 个错误 / 0 个警告,处于标准和严格级别
### 0.0.9 (2026-06-06)
- 修复了 INDICATOR_USAGE(编号指示器)的误报
- 排除了 F 规格 `OFLIND(*INxx)`(打印机溢出指示器),因为 `*INxx` 是语言规范要求的,不能是命名指示器
- 排除了注释行中的 `*INxx` 字符串(第 7 列 = `*`,例如 `F*`/`C*`/`D*`)
### 0.0.8 (2026-06-06)
- 将显示名称重命名为 "ILE-RPG&DSPF 代码检查器"(内部标识符不变)
- 通过将列解析与 IBM DDS 布局对齐,修复了 DSPF/DDS A 规格的误报(名称 19-28,长度 30-34,行 39-41,位置 42-44)
- 将字段重叠检测限定在每个记录格式(R)内
- 排除了 A 规格的引号/括号匹配(DDS 使用不同的延续规则)
- 区分了 WINDOW 定义和引用;检测独立的 OVERLAY(无括号)
- 将 DBCS 位置偏移警告限制在固定列区域(第 1-44 列)
- 排除了 CNTFLD(继续字段)进行行溢出检查
### 0.0.7 (2026-02-12)
- 修复了 WCA4i 测试用例的误报
- 提高了延续行的解析器鲁棒性
- 修复了 P 过程部分内的 SPEC_ORDER 误报
### 0.0.6 (2026-02-12)
- 添加了 D 规格验证的第 9 阶段编译结果
- 名称延续语法(`...`)处理
- 声明类型错放检测(第 22-23 列 vs 第 24-25 列)
- 字段名称中的尾随句点检测(RNF0622/RNF0623)
- 用于关键字检测的大小字段的列偏移启发式
### 0.0.5 (2026-02-12)
- 增强了 D 规格列位置验证
- 跨规格的列位置检查更加鲁棒
- 改进了错误消息和建议
### 0.0.4 (2026-01-25)
- 完全自由格式(**FREE)检测
- 工具描述中的令牌效率改进
- 在行长度验证之前修复了 **FREE 检测
### 0.0.3 (2026-01-25)
- 添加了完全自由格式检测支持
- 工具描述的令牌效率改进
- 重命名为 "ILE RPG 代码检查器"
- 在启动消息中添加了版本号
### 0.0.2 (2026-01-25)
- 更新了文档
- 将标题从 "ILE-RPG 编码标准检查器" 更改为 "ILE-RPG 代码检查器"
- 更新了描述以包含 "语法和编码标准"
- 在示例中屏蔽了敏感信息
- 修复了 DBCS 示例以使用 INZ 而不是日语变量名
### 0.0.1 (2026-01-25)
- 初始发布
- 基本检查功能实现
- 提供了 6 个 MCP 工具
- 多语言支持(中文/日语)
- DBCS 字符支持
- 自定义规则功能
## 参考
- IBM i 信息中心 - ILE RPG 参考
## 支持
对于问题或疑问,请报告到项目的 Issue 跟踪器。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器