mcp-xdx-schema-ctx 1.1.9

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 (60) hide show
  1. package/.env.example +43 -0
  2. package/README.md +269 -0
  3. package/dist/config.d.ts +131 -0
  4. package/dist/config.js +138 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/crypto-utils.d.ts +29 -0
  7. package/dist/crypto-utils.js +118 -0
  8. package/dist/crypto-utils.js.map +1 -0
  9. package/dist/db.d.ts +10 -0
  10. package/dist/db.js +149 -0
  11. package/dist/db.js.map +1 -0
  12. package/dist/diff-utils.d.ts +42 -0
  13. package/dist/diff-utils.js +130 -0
  14. package/dist/diff-utils.js.map +1 -0
  15. package/dist/encrypt-secrets.d.ts +12 -0
  16. package/dist/encrypt-secrets.js +190 -0
  17. package/dist/encrypt-secrets.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +30 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/migrate-utils.d.ts +91 -0
  22. package/dist/migrate-utils.js +399 -0
  23. package/dist/migrate-utils.js.map +1 -0
  24. package/dist/schema-compat.d.ts +46 -0
  25. package/dist/schema-compat.js +169 -0
  26. package/dist/schema-compat.js.map +1 -0
  27. package/dist/shared.d.ts +70 -0
  28. package/dist/shared.js +197 -0
  29. package/dist/shared.js.map +1 -0
  30. package/dist/sql-build.d.ts +121 -0
  31. package/dist/sql-build.js +254 -0
  32. package/dist/sql-build.js.map +1 -0
  33. package/dist/tool-availability.d.ts +35 -0
  34. package/dist/tool-availability.js +90 -0
  35. package/dist/tool-availability.js.map +1 -0
  36. package/dist/tools/data-tools.d.ts +2 -0
  37. package/dist/tools/data-tools.js +243 -0
  38. package/dist/tools/data-tools.js.map +1 -0
  39. package/dist/tools/dataflow-tools.d.ts +2 -0
  40. package/dist/tools/dataflow-tools.js +434 -0
  41. package/dist/tools/dataflow-tools.js.map +1 -0
  42. package/dist/tools/dbo-tools.d.ts +2 -0
  43. package/dist/tools/dbo-tools.js +228 -0
  44. package/dist/tools/dbo-tools.js.map +1 -0
  45. package/dist/tools/diff-tools.d.ts +2 -0
  46. package/dist/tools/diff-tools.js +224 -0
  47. package/dist/tools/diff-tools.js.map +1 -0
  48. package/dist/tools/form-tools.d.ts +2 -0
  49. package/dist/tools/form-tools.js +715 -0
  50. package/dist/tools/form-tools.js.map +1 -0
  51. package/dist/tools/migrate-tools.d.ts +2 -0
  52. package/dist/tools/migrate-tools.js +423 -0
  53. package/dist/tools/migrate-tools.js.map +1 -0
  54. package/dist/tools/system-tools.d.ts +2 -0
  55. package/dist/tools/system-tools.js +1102 -0
  56. package/dist/tools/system-tools.js.map +1 -0
  57. package/dist/tools/table-tools.d.ts +2 -0
  58. package/dist/tools/table-tools.js +1322 -0
  59. package/dist/tools/table-tools.js.map +1 -0
  60. package/package.json +48 -0
@@ -0,0 +1,228 @@
1
+ import { z } from "zod";
2
+ import { T, WARNING, envelope, ok, sqlPagination } from "../shared.js";
3
+ import { getTableInfo, hasCol, resolveSelect, tableExists, tryQuery, } from "../schema-compat.js";
4
+ import { buildWhere, buildOrderBy, buildPagedQuery } from "../sql-build.js";
5
+ /** 子模块不可用时返回统一结构 */
6
+ function unavailable(module, tableRef, warnings) {
7
+ const reason = `环境库缺少 ${tableRef}`;
8
+ warnings.push({
9
+ module,
10
+ message: reason,
11
+ hint: "可用 get_capabilities 查看本环境支持的元数据表",
12
+ fallback: "get_capabilities",
13
+ });
14
+ return { module, available: false, reason };
15
+ }
16
+ export function registerDboTools(server) {
17
+ // ============================================================
18
+ // get_dbo_detail
19
+ // ============================================================
20
+ server.registerTool("get_dbo_detail", {
21
+ description: WARNING +
22
+ "\n\n获取数据库对象(DBO)完整定义,串联: DBO定义→字段→操作方案→操作字段→操作参数。用于理解后端数据操作逻辑。\n" +
23
+ "每个子模块独立探测依赖表:缺失时返回 { module, available:false, reason },不会因某张子表缺失导致整体失败。",
24
+ inputSchema: {
25
+ dboName: z.string().max(128).optional().describe("DBO名称"),
26
+ keyword: z.string().max(200).optional().describe("模糊搜索DBO名称/描述"),
27
+ modular: z.string().max(50).optional().describe("模块过滤"),
28
+ page: z.number().int().min(1).default(1).describe("页码"),
29
+ pageSize: z.number().int().min(1).max(200).default(50).describe("每页数量"),
30
+ },
31
+ }, async ({ dboName, keyword, modular, page = 1, pageSize = 50 }) => {
32
+ const warnings = [];
33
+ if (!(await tableExists(T("dboSet")))) {
34
+ return ok(envelope({
35
+ items: [],
36
+ pagination: sqlPagination(page, pageSize, 0),
37
+ warnings: [
38
+ {
39
+ module: "get_dbo_detail",
40
+ message: `环境库缺少 ${T("dboSet")}`,
41
+ hint: "可用 get_capabilities 查看本环境支持的元数据表",
42
+ fallback: "get_capabilities",
43
+ },
44
+ ],
45
+ }));
46
+ }
47
+ const info = await getTableInfo(T("dboSet"));
48
+ const rs = await resolveSelect(T("dboSet"), [
49
+ "XDID",
50
+ "AutoID",
51
+ "DBOName",
52
+ "DBODesc",
53
+ "DBOType",
54
+ "Modular1",
55
+ "Modular2",
56
+ "Remark",
57
+ ]);
58
+ if (rs.missing.length > 0) {
59
+ warnings.push({
60
+ module: "get_dbo_detail",
61
+ message: `以下列在本环境库不存在,已置空: ${rs.missing.join(", ")}`,
62
+ });
63
+ }
64
+ const groups = [];
65
+ if (dboName)
66
+ groups.push({ filters: [{ col: "DBOName", op: "eq", value: dboName }] });
67
+ if (keyword) {
68
+ const filters = ["DBOName", "DBODesc"]
69
+ .filter((c) => hasCol(info.columns, c))
70
+ .map((c) => ({ col: c, op: "like", value: keyword }));
71
+ if (filters.length > 0)
72
+ groups.push({ logic: "or", filters });
73
+ }
74
+ if (modular)
75
+ groups.push({ filters: [{ col: "Modular1", op: "eq", value: modular }] });
76
+ const { where, skipped } = buildWhere(info.columns, groups);
77
+ if (skipped.length > 0) {
78
+ warnings.push({
79
+ module: "get_dbo_detail",
80
+ message: `以下列在本环境库不存在,条件已跳过: ${skipped.join(", ")}`,
81
+ });
82
+ }
83
+ const order = buildOrderBy(info.columns, ["DBOName"]);
84
+ const q = buildPagedQuery({
85
+ table: T("dboSet"),
86
+ cols: rs.present.length > 0
87
+ ? rs.present.map((c) => `[${c}]`)
88
+ : ["[DBOName]"],
89
+ where,
90
+ orderBy: order.orderBy,
91
+ page,
92
+ pageSize,
93
+ });
94
+ const cnt = await tryQuery("get_dbo_detail.count", q.countSql, warnings);
95
+ const total = Number(cnt[0]?.Total ?? 0);
96
+ const dbos = total > 0
97
+ ? (await tryQuery("get_dbo_detail", q.sql, warnings))
98
+ : [];
99
+ const result = [];
100
+ for (const d of dbos) {
101
+ const name = String(d.DBOName ?? "").replace(/'/g, "''");
102
+ const dboKey = String(d.XDID ?? d.AutoID ?? "").replace(/'/g, "''");
103
+ // --- 字段 ---
104
+ let fields;
105
+ if (await tableExists(T("dboSetField"))) {
106
+ const frs = await resolveSelect(T("dboSetField"), [
107
+ "DBOName",
108
+ "FieldName",
109
+ "FieldType",
110
+ "FieldSize",
111
+ "IPrecision",
112
+ "IScale",
113
+ "bAllowNull",
114
+ "iLineNo",
115
+ ]);
116
+ fields = {
117
+ module: "fields",
118
+ available: true,
119
+ items: await tryQuery("get_dbo_detail.fields", `SELECT ${frs.select} FROM ${T("dboSetField")} WHERE [DBOName]='${name}'`, warnings),
120
+ };
121
+ }
122
+ else {
123
+ fields = unavailable("fields", T("dboSetField"), warnings);
124
+ }
125
+ // --- 操作方案 ---
126
+ let operations = [];
127
+ let operationsModule;
128
+ if (await tableExists(T("dboPrSetHed"))) {
129
+ if (!hasCol(info.columns, "XDID")) {
130
+ operationsModule = {
131
+ module: "operations",
132
+ available: false,
133
+ reason: "DBOSetTB 缺少 XDID,无法关联 DBOPrSetHedTB.PRXDID",
134
+ };
135
+ warnings.push({
136
+ module: "get_dbo_detail.operations",
137
+ message: "DBOSetTB 缺少 XDID,无法关联操作方案",
138
+ });
139
+ }
140
+ else {
141
+ const ors = await resolveSelect(T("dboPrSetHed"), [
142
+ "XDID",
143
+ "Name",
144
+ "BindTableName",
145
+ "SchemeDesc",
146
+ "PRXDID",
147
+ ]);
148
+ operations = (await tryQuery("get_dbo_detail.operations", `SELECT ${ors.select} FROM ${T("dboPrSetHed")} WHERE [PRXDID]='${dboKey}'`, warnings));
149
+ operationsModule = {
150
+ module: "operations",
151
+ available: true,
152
+ items: [],
153
+ };
154
+ }
155
+ }
156
+ else {
157
+ operationsModule = unavailable("operations", T("dboPrSetHed"), warnings);
158
+ }
159
+ const opIds = operations
160
+ .map((o) => `'${String(o.XDID).replace(/'/g, "''")}'`)
161
+ .filter((s) => s !== "'undefined'");
162
+ let params = { module: "params", available: true, items: [] };
163
+ if (opIds.length > 0) {
164
+ if (await tableExists(T("dboPrSetParam"))) {
165
+ const prs = await resolveSelect(T("dboPrSetParam"), [
166
+ "PXDID",
167
+ "ParamName",
168
+ "DataType",
169
+ "Mode",
170
+ "Ordinal",
171
+ "ParamData",
172
+ ]);
173
+ params = {
174
+ module: "params",
175
+ available: true,
176
+ items: await tryQuery("get_dbo_detail.params", `SELECT ${prs.select} FROM ${T("dboPrSetParam")} WHERE [PXDID] IN (${opIds.join(",")})`, warnings),
177
+ };
178
+ }
179
+ else {
180
+ params = unavailable("params", T("dboPrSetParam"), warnings);
181
+ }
182
+ }
183
+ let fieldMappings = {
184
+ module: "fieldMappings",
185
+ available: true,
186
+ items: [],
187
+ };
188
+ if (opIds.length > 0) {
189
+ if (await tableExists(T("dboPrSetField"))) {
190
+ const mrs = await resolveSelect(T("dboPrSetField"), [
191
+ "PXDID",
192
+ "TableIndex",
193
+ "TableName",
194
+ "ColumnName",
195
+ "DBType",
196
+ "Type",
197
+ "iLineNo",
198
+ ]);
199
+ fieldMappings = {
200
+ module: "fieldMappings",
201
+ available: true,
202
+ items: await tryQuery("get_dbo_detail.fieldMappings", `SELECT ${mrs.select} FROM ${T("dboPrSetField")} WHERE [PXDID] IN (${opIds.join(",")})`, warnings),
203
+ };
204
+ }
205
+ else {
206
+ fieldMappings = unavailable("fieldMappings", T("dboPrSetField"), warnings);
207
+ }
208
+ }
209
+ result.push({
210
+ dbo: {
211
+ DBOName: d.DBOName,
212
+ DBODesc: d.DBODesc,
213
+ DBOType: d.DBOType,
214
+ },
215
+ fields,
216
+ operations: operationsModule,
217
+ params,
218
+ fieldMappings,
219
+ });
220
+ }
221
+ return ok(envelope({
222
+ items: result,
223
+ pagination: sqlPagination(page, pageSize, total),
224
+ warnings,
225
+ }));
226
+ });
227
+ }
228
+ //# sourceMappingURL=dbo-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbo-tools.js","sourceRoot":"","sources":["../../src/tools/dbo-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDiffTools(server: McpServer): void;
@@ -0,0 +1,224 @@
1
+ import { z } from "zod";
2
+ import { query, table } from "../db.js";
3
+ import { isSystemBConfigured } from "../config.js";
4
+ import { T, T2, userName, userName2, WARNING, escapeSql, safeJson, paginate } from "../shared.js";
5
+ import { diffTable } from "../diff-utils.js";
6
+ function ensureSystemB() {
7
+ if (!isSystemBConfigured()) {
8
+ throw new Error("系统 B 未配置。请在 .env 中设置 DB_B_SERVER、DB_B_USER、DB_B_PASSWORD、DB_B_DATABASE 等参数。");
9
+ }
10
+ }
11
+ /** 简化的单键 diff 辅助 */
12
+ async function simpleDiff(tableKey, bkField, cmpFields, keyword, page, pageSize) {
13
+ if (keyword) {
14
+ const k = escapeSql(keyword);
15
+ return diffTable(tableKey, [bkField], cmpFields, `SELECT * FROM ${T(tableKey)} WHERE ${bkField} LIKE N'%${k}%'`, `SELECT * FROM ${T2(tableKey)} WHERE ${bkField} LIKE N'%${k}%'`, page, pageSize);
16
+ }
17
+ return diffTable(tableKey, [bkField], cmpFields, undefined, undefined, page, pageSize);
18
+ }
19
+ export function registerDiffTools(server) {
20
+ // ==========================================
21
+ // diff_tables
22
+ // ==========================================
23
+ server.registerTool("diff_tables", {
24
+ description: WARNING + "\n\n比对两套 XDX 系统的表定义(TableSetTB)和字段定义(TableFieldSetTB)差异。" +
25
+ "按 TableName 匹配,返回新增/删除/修改的详细对比。",
26
+ inputSchema: {
27
+ keyword: z.string().max(200).optional().describe("按表名或描述关键词过滤"),
28
+ page: z.number().int().min(1).default(1).describe("页码"),
29
+ pageSize: z.number().int().min(1).max(200).default(50).describe("每页数量"),
30
+ },
31
+ }, async ({ keyword, page, pageSize }) => {
32
+ ensureSystemB();
33
+ const tableDiff = await diffTable("tableDef", ["TableName"], ["TableDesc", "ModuleID", "TableKind", "IsVirtual", "IsSystem"], keyword ? `SELECT * FROM ${T("tableDef")} WHERE TableName LIKE N'%${escapeSql(keyword)}%' OR TableDesc LIKE N'%${escapeSql(keyword)}%'` : undefined, keyword ? `SELECT * FROM ${T2("tableDef")} WHERE TableName LIKE N'%${escapeSql(keyword)}%' OR TableDesc LIKE N'%${escapeSql(keyword)}%'` : undefined);
34
+ const { page: pagedDetails, pagination: tablePagination } = paginate(tableDiff.details, page, pageSize);
35
+ const fds = [];
36
+ for (const d of tableDiff.details) {
37
+ if (d.status !== "modified")
38
+ continue;
39
+ const tn = escapeSql(d.businessKey);
40
+ const fd = await diffTable("fieldDef", ["TableName", "FieldName"], ["FieldDesc", "FieldType", "FieldLen", "FieldDecimal", "IsNull", "IsPrimaryKey", "DefaultValue"], `SELECT f.* FROM ${T("fieldDef")} f INNER JOIN ${T("tableDef")} t ON f.TableName=t.TableName WHERE f.TableName=N'${tn}'`, `SELECT f.* FROM ${T2("fieldDef")} f INNER JOIN ${T2("tableDef")} t ON f.TableName=t.TableName WHERE f.TableName=N'${tn}'`);
41
+ if (fd.details.length > 0)
42
+ fds.push(...fd.details);
43
+ }
44
+ const { page: pagedFields, pagination: fieldPagination } = paginate(fds, page, pageSize);
45
+ return { content: [{ type: "text", text: safeJson({
46
+ tables: tableDiff.summary,
47
+ _pagination: tablePagination,
48
+ tableDetails: pagedDetails,
49
+ fieldDetails: pagedFields.length > 0 ? pagedFields : undefined,
50
+ _fieldPagination: fieldPagination,
51
+ fieldDiffCount: fds.length,
52
+ }) }] };
53
+ });
54
+ // ==========================================
55
+ // diff_forms
56
+ // ==========================================
57
+ server.registerTool("diff_forms", {
58
+ description: WARNING + "\n\n比对两套系统的窗体定义(FormSetTB)及核心子表差异。" +
59
+ "按 FormName 匹配,含 FormRuleSetHedTB/DetTB/ButtonTB 的子表差异。",
60
+ inputSchema: {
61
+ keyword: z.string().max(200).optional().describe("按窗体名关键词过滤"),
62
+ page: z.number().int().min(1).default(1).describe("页码"),
63
+ pageSize: z.number().int().min(1).max(200).default(50).describe("每页数量"),
64
+ },
65
+ }, async ({ keyword, page, pageSize }) => {
66
+ ensureSystemB();
67
+ const formDiff = await simpleDiff("formDef", "FormName", ["FormDesc", "LinkTable", "FormType", "ModuleID"], keyword, page, pageSize);
68
+ // 对 modified 的窗体,比对 FormRule 子表
69
+ const subDiffs = [];
70
+ for (const d of formDiff.details) {
71
+ if (d.status !== "modified")
72
+ continue;
73
+ const fn = escapeSql(d.businessKey);
74
+ const rh = await diffTable("formRuleHed", ["FormID", "RuleName"], ["RuleType", "IsEnable"], `SELECT h.* FROM ${T("formRuleHed")} h INNER JOIN ${T("formDef")} f ON h.FormID=f.FormID WHERE f.FormName=N'${fn}'`, `SELECT h.* FROM ${T2("formRuleHed")} h INNER JOIN ${T2("formDef")} f ON h.FormID=f.FormID WHERE f.FormName=N'${fn}'`);
75
+ if (rh.details.length > 0)
76
+ subDiffs.push({ form: fn, subTable: "FormRuleSetHedTB", ...rh.summary, details: rh.details.slice(0, 20) });
77
+ }
78
+ const { page: pagedRules, pagination: rulePagination } = paginate(subDiffs, page, pageSize);
79
+ return { content: [{ type: "text", text: safeJson({
80
+ forms: formDiff.summary,
81
+ _pagination: formDiff.pagination,
82
+ formDetails: formDiff.page,
83
+ ruleDiffs: pagedRules,
84
+ _rulePagination: rulePagination,
85
+ ruleDiffsCount: subDiffs.length,
86
+ }) }] };
87
+ });
88
+ // ==========================================
89
+ // diff_dbos
90
+ // ==========================================
91
+ server.registerTool("diff_dbos", {
92
+ description: WARNING + "\n\n比对两套系统的 DBO 定义(DBOSetTB)差异,按 DBOName 匹配。",
93
+ inputSchema: {
94
+ keyword: z.string().max(200).optional().describe("按 DBO 名称关键词过滤"),
95
+ page: z.number().int().min(1).default(1).describe("页码"),
96
+ pageSize: z.number().int().min(1).max(200).default(50).describe("每页数量"),
97
+ },
98
+ }, async ({ keyword, page, pageSize }) => {
99
+ ensureSystemB();
100
+ const dboDiff = await simpleDiff("dboSet", "DBOName", ["DBODesc", "LinkTable", "DBOType", "ModuleID"], keyword, page, pageSize);
101
+ return { content: [{ type: "text", text: safeJson({
102
+ dbos: dboDiff.summary,
103
+ _pagination: dboDiff.pagination,
104
+ details: dboDiff.page,
105
+ }) }] };
106
+ });
107
+ // ==========================================
108
+ // diff_dataflows
109
+ // ==========================================
110
+ server.registerTool("diff_dataflows", {
111
+ description: WARNING + "\n\n比对两套系统的数据流定义(DataFlowHedTB)差异,按 DataFlowName 匹配。",
112
+ inputSchema: {
113
+ keyword: z.string().max(200).optional().describe("按数据流名称关键词过滤"),
114
+ page: z.number().int().min(1).default(1).describe("页码"),
115
+ pageSize: z.number().int().min(1).max(200).default(50).describe("每页数量"),
116
+ },
117
+ }, async ({ keyword, page, pageSize }) => {
118
+ ensureSystemB();
119
+ const dfDiff = await simpleDiff("dataFlowHed", "DataFlowName", ["DataFlowDesc", "ModuleID"], keyword, page, pageSize);
120
+ return { content: [{ type: "text", text: safeJson({
121
+ dataflows: dfDiff.summary,
122
+ _pagination: dfDiff.pagination,
123
+ details: dfDiff.page,
124
+ }) }] };
125
+ });
126
+ // ==========================================
127
+ // diff_functions
128
+ // ==========================================
129
+ server.registerTool("diff_functions", {
130
+ description: WARNING + "\n\n比对两套系统的功能菜单(FunctionTB)差异,按 FunctionName 匹配。",
131
+ inputSchema: {
132
+ keyword: z.string().max(200).optional().describe("按功能名称关键词过滤"),
133
+ page: z.number().int().min(1).default(1).describe("页码"),
134
+ pageSize: z.number().int().min(1).max(200).default(50).describe("每页数量"),
135
+ },
136
+ }, async ({ keyword, page, pageSize }) => {
137
+ ensureSystemB();
138
+ const fnDiff = await simpleDiff("function", "FunctionName", ["FunctionDesc", "FunctionKind", "ModuleID", "FormID", "IsEnable"], keyword, page, pageSize);
139
+ return { content: [{ type: "text", text: safeJson({
140
+ functions: fnDiff.summary,
141
+ _pagination: fnDiff.pagination,
142
+ details: fnDiff.page,
143
+ }) }] };
144
+ });
145
+ // ==========================================
146
+ // diff_sys_dict
147
+ // ==========================================
148
+ server.registerTool("diff_sys_dict", {
149
+ description: WARNING + "\n\n比对两套系统用户库的系统字典(SysDbType/SyDbValue)差异。",
150
+ inputSchema: {
151
+ keyword: z.string().max(200).optional().describe("按字典类型或值关键词过滤"),
152
+ page: z.number().int().min(1).default(1).describe("页码"),
153
+ pageSize: z.number().int().min(1).max(200).default(50).describe("每页数量"),
154
+ },
155
+ }, async ({ keyword, page, pageSize }) => {
156
+ ensureSystemB();
157
+ // 用户库表不在 tableNames 中,直接用 table() 构造
158
+ const sqlTypesA = keyword
159
+ ? `SELECT * FROM ${table(userName, "SysDbType")} WHERE DbType LIKE N'%${escapeSql(keyword)}%'`
160
+ : `SELECT * FROM ${table(userName, "SysDbType")}`;
161
+ const sqlTypesB = keyword
162
+ ? `SELECT * FROM ${table(userName2, "SysDbType")} WHERE DbType LIKE N'%${escapeSql(keyword)}%'`
163
+ : `SELECT * FROM ${table(userName2, "SysDbType")}`;
164
+ const rowsA = await query(sqlTypesA, "default");
165
+ const rowsB = await query(sqlTypesB, "b");
166
+ const mapB = new Map(rowsB.map(r => [String(r.DbType ?? ""), r]));
167
+ const aSet = new Set(rowsA.map(r => String(r.DbType ?? "")));
168
+ const details = [];
169
+ for (const ra of rowsA) {
170
+ const k = String(ra.DbType ?? "");
171
+ const rb = mapB.get(k);
172
+ if (!rb)
173
+ details.push({ businessKey: k, status: "removed", sourceRow: ra });
174
+ else {
175
+ // compare DbDesc
176
+ if (String(ra.DbDesc ?? "") !== String(rb.DbDesc ?? "")) {
177
+ details.push({ businessKey: k, status: "modified", diffFields: [
178
+ { field: "DbDesc", valueA: ra.DbDesc, valueB: rb.DbDesc }
179
+ ] });
180
+ }
181
+ }
182
+ }
183
+ for (const rb of rowsB) {
184
+ if (!aSet.has(String(rb.DbType ?? ""))) {
185
+ details.push({ businessKey: String(rb.DbType ?? ""), status: "added", targetRow: rb });
186
+ }
187
+ }
188
+ const ident = rowsA.length - details.filter(d => d.status === "removed" || d.status === "modified").length;
189
+ const { page: pagedDetails, pagination: dictPagination } = paginate(details, page, pageSize);
190
+ return { content: [{ type: "text", text: safeJson({
191
+ summary: { totalCompared: rowsA.length + rowsB.length - ident, identical: ident,
192
+ addedInB: details.filter(d => d.status === "added").length,
193
+ removedInB: details.filter(d => d.status === "removed").length,
194
+ modified: details.filter(d => d.status === "modified").length },
195
+ _pagination: dictPagination,
196
+ details: pagedDetails,
197
+ }) }] };
198
+ });
199
+ // ==========================================
200
+ // diff_all
201
+ // ==========================================
202
+ server.registerTool("diff_all", {
203
+ description: WARNING + "\n\n运行全部比对,返回各模块的差异摘要汇总。",
204
+ inputSchema: {},
205
+ }, async () => {
206
+ ensureSystemB();
207
+ // 并行运行 6 个主比对(不含子表深度展开,仅主表级)
208
+ const [tables, forms, dbos, dataflows, functions] = await Promise.all([
209
+ simpleDiff("tableDef", "TableName", ["TableDesc", "ModuleID", "TableKind"]),
210
+ simpleDiff("formDef", "FormName", ["FormDesc", "LinkTable", "FormType"]),
211
+ simpleDiff("dboSet", "DBOName", ["DBODesc", "LinkTable", "DBOType"]),
212
+ simpleDiff("dataFlowHed", "DataFlowName", ["DataFlowDesc"]),
213
+ simpleDiff("function", "FunctionName", ["FunctionDesc", "FunctionKind"]),
214
+ ]);
215
+ return { content: [{ type: "text", text: safeJson({
216
+ tables: tables.summary,
217
+ forms: forms.summary,
218
+ dbos: dbos.summary,
219
+ dataflows: dataflows.summary,
220
+ functions: functions.summary,
221
+ }) }] };
222
+ });
223
+ }
224
+ //# sourceMappingURL=diff-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-tools.js","sourceRoot":"","sources":["../../src/tools/diff-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerFormTools(server: McpServer): void;