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,190 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 交互式凭据加密 CLI(B + C 混合模式)
4
+ *
5
+ * 使用: npx xdx-encrypt-secrets
6
+ *
7
+ * - 自动检测当前 .env 中已有的字段
8
+ * - 默认勾选密码类字段(*_PASSWORD)
9
+ * - 用户可输入编号切换选择
10
+ * - 一次性确认,输出 MCP 配置格式的密文
11
+ */
12
+ import { createInterface } from "readline";
13
+ import { readFileSync, existsSync } from "fs";
14
+ import { resolve, dirname } from "path";
15
+ import { fileURLToPath } from "url";
16
+ import { encrypt, SENSITIVE_FIELDS, isDpapiAvailable, } from "./crypto-utils.js";
17
+ const __dirname = dirname(fileURLToPath(import.meta.url));
18
+ // ---- 工具 ----
19
+ function question(rl, prompt) {
20
+ return new Promise((resolve) => rl.question(prompt, resolve));
21
+ }
22
+ /** 读取 .env 中指定 key 的值 */
23
+ function readEnvValue(envPath, key) {
24
+ if (!existsSync(envPath))
25
+ return "";
26
+ const content = readFileSync(envPath, "utf-8");
27
+ const lines = content.split("\n");
28
+ for (const line of lines) {
29
+ const trimmed = line.trim();
30
+ if (trimmed.startsWith("#") || trimmed === "")
31
+ continue;
32
+ const eqIdx = trimmed.indexOf("=");
33
+ if (eqIdx === -1)
34
+ continue;
35
+ const k = trimmed.slice(0, eqIdx).trim();
36
+ const v = trimmed.slice(eqIdx + 1).trim();
37
+ if (k === key)
38
+ return v;
39
+ }
40
+ return "";
41
+ }
42
+ /** 显示掩码后的值 */
43
+ function maskValue(v) {
44
+ if (!v || v.length === 0)
45
+ return "(未配置)";
46
+ if (v.length <= 4)
47
+ return "****";
48
+ return v.slice(0, 2) + "***" + v.slice(-2);
49
+ }
50
+ /** 格式化 dpapi 值输出 */
51
+ function formatOutput(key, value) {
52
+ // DPAPI 密文可能很长,每 60 字符折行
53
+ const chunks = [];
54
+ for (let i = 0; i < value.length; i += 60) {
55
+ chunks.push(value.slice(i, i + 60));
56
+ }
57
+ return chunks.join("\n ");
58
+ }
59
+ // ---- 主流程 ----
60
+ async function main() {
61
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
62
+ console.log("");
63
+ console.log("🔐 XDX 凭据加密工具");
64
+ console.log(` 平台: ${isDpapiAvailable() ? "Windows (DPAPI - 绑定当前用户+机器)" : "非 Windows (Base64 混淆)"}`);
65
+ console.log("");
66
+ // 读取 .env 中的当前值
67
+ const envPath = resolve(__dirname, "..", ".env");
68
+ const hasEnv = existsSync(envPath);
69
+ if (hasEnv) {
70
+ console.log(` ✓ 检测到 .env 文件: ${envPath}`);
71
+ }
72
+ else {
73
+ console.log(" ⚠ 未找到 .env 文件,将手动输入所有字段");
74
+ }
75
+ console.log("");
76
+ // 构建字段列表
77
+ const fields = [];
78
+ for (const key of SENSITIVE_FIELDS) {
79
+ const currentValue = hasEnv ? readEnvValue(envPath, key) : "";
80
+ // 默认选中密码字段
81
+ const checked = key.endsWith("_PASSWORD") && currentValue.length > 0;
82
+ fields.push({
83
+ label: key.replace("DB_", "").replace("B_", "B "),
84
+ envKey: key,
85
+ value: currentValue,
86
+ checked,
87
+ });
88
+ }
89
+ // ---- 交互循环 ----
90
+ let confirmed = false;
91
+ while (!confirmed) {
92
+ console.log("可加密字段(当前 .env 值已隐藏):\n");
93
+ for (let i = 0; i < fields.length; i++) {
94
+ const f = fields[i];
95
+ const num = String(i + 1).padStart(2, " ");
96
+ const check = f.checked ? "[x]" : "[ ]";
97
+ const label = `DB_${f.label}`.padEnd(22, " ");
98
+ const masked = maskValue(f.value);
99
+ console.log(` ${num}. ${check} ${label}${masked}`);
100
+ }
101
+ const selectedCount = fields.filter((f) => f.checked).length;
102
+ console.log("");
103
+ console.log(`已选中 ${selectedCount}/${fields.length} 个字段。`);
104
+ console.log("输入编号切换选择,或按 Enter 确认加密:");
105
+ const input = await question(rl, "> ");
106
+ const trimmed = input.trim();
107
+ if (trimmed === "") {
108
+ // 确认
109
+ if (selectedCount === 0) {
110
+ console.log("\n⚠ 未选中任何字段,请至少选择一个\n");
111
+ continue;
112
+ }
113
+ confirmed = true;
114
+ }
115
+ else {
116
+ // 切换选择
117
+ const nums = trimmed.split(/[\s,]+/).map(Number).filter((n) => !isNaN(n) && n >= 1 && n <= fields.length);
118
+ if (nums.length === 0) {
119
+ console.log(`\n⚠ 无效输入: "${trimmed}" (请输入 1-${fields.length} 的编号)\n`);
120
+ continue;
121
+ }
122
+ for (const n of nums) {
123
+ fields[n - 1].checked = !fields[n - 1].checked;
124
+ }
125
+ }
126
+ }
127
+ // ---- 加密阶段 ----
128
+ console.log("");
129
+ console.log("—".repeat(60));
130
+ const selected = fields.filter((f) => f.checked);
131
+ const results = [];
132
+ for (const f of selected) {
133
+ let value = f.value;
134
+ // 如果 .env 中没有值或无 .env,手动输入
135
+ if (!value) {
136
+ value = await question(rl, `\n请输入 ${f.envKey}: `);
137
+ if (!value) {
138
+ console.log(` ⚠ 跳过 ${f.envKey}(没有输入)`);
139
+ continue;
140
+ }
141
+ }
142
+ console.log(`\n正在加密 ${f.envKey}...`);
143
+ try {
144
+ const encrypted = encrypt(value);
145
+ results.push({ key: f.envKey, encrypted });
146
+ console.log(` ✓ 完成 (${encrypted.length} 字符)`);
147
+ }
148
+ catch (err) {
149
+ console.log(` ✗ 加密失败: ${err.message}`);
150
+ }
151
+ }
152
+ // ---- 输出结果 ----
153
+ console.log("");
154
+ console.log("=".repeat(60));
155
+ console.log("✅ 加密完成!以下为 MCP 配置和 .env 可用的凭据:\n");
156
+ if (isDpapiAvailable()) {
157
+ console.log("适用于 Windows (DPAPI) 环境:\n");
158
+ }
159
+ else {
160
+ console.log("适用于非 Windows 环境:\n");
161
+ }
162
+ // JSON 格式
163
+ console.log("--- MCP JSON config (env 块) ---");
164
+ for (const r of results) {
165
+ const key = `${r.key}_DPAPI`;
166
+ console.log(`"${key}": "${r.encrypted}",`);
167
+ }
168
+ // .env 格式
169
+ console.log("\n--- .env 格式 ---");
170
+ for (const r of results) {
171
+ const key = `${r.key}_DPAPI`;
172
+ console.log(`${key}=${r.encrypted}`);
173
+ }
174
+ console.log("");
175
+ console.log("💡 使用方式:");
176
+ console.log(" 1. 复制上面密文值到 MCP 配置的 env 块 (用 _DPAPI 后缀)");
177
+ console.log(" 2. 或写入 .env 文件 (用 _DPAPI 后缀)");
178
+ console.log(" 3. 删除原有的明文 DB_PASSWORD / DB_B_PASSWORD");
179
+ console.log(" 4. 重新启动 MCP 服务");
180
+ console.log("");
181
+ if (isDpapiAvailable()) {
182
+ console.log("⚠ DPAPI 绑定当前 Windows 用户+机器。换电脑/换用户需重新加密。");
183
+ }
184
+ rl.close();
185
+ }
186
+ main().catch((err) => {
187
+ console.error("错误:", err);
188
+ process.exit(1);
189
+ });
190
+ //# sourceMappingURL=encrypt-secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt-secrets.js","sourceRoot":"","sources":["../src/encrypt-secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { registerTableTools } from "./tools/table-tools.js";
5
+ import { registerFormTools } from "./tools/form-tools.js";
6
+ import { registerDboTools } from "./tools/dbo-tools.js";
7
+ import { registerDataflowTools } from "./tools/dataflow-tools.js";
8
+ import { registerSystemTools } from "./tools/system-tools.js";
9
+ import { registerDataTools } from "./tools/data-tools.js";
10
+ import { registerDiffTools } from "./tools/diff-tools.js";
11
+ import { registerMigrateTools } from "./tools/migrate-tools.js";
12
+ const server = new McpServer({ name: "mcp-xdx-schema-ctx", version: "1.1.8" }, { capabilities: { tools: {} } });
13
+ registerTableTools(server);
14
+ registerFormTools(server);
15
+ registerDboTools(server);
16
+ registerDataflowTools(server);
17
+ registerSystemTools(server);
18
+ registerDataTools(server);
19
+ registerDiffTools(server);
20
+ registerMigrateTools(server);
21
+ async function main() {
22
+ const transport = new StdioServerTransport();
23
+ await server.connect(transport);
24
+ console.error("mcp-xdx-schema-ctx 已启动 (只读模式)");
25
+ }
26
+ main().catch((err) => {
27
+ console.error("启动失败:", err);
28
+ process.exit(1);
29
+ });
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,OAAO,EAAE,EAChD,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;AAEF,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAE7B,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;AACjD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,91 @@
1
+ import type { TableKey } from "./config.js";
2
+ export type FeatureType = "form" | "dbo" | "dataflow" | "function";
3
+ export interface DepNode {
4
+ table: string;
5
+ recordCount: number;
6
+ children?: DepNode[];
7
+ }
8
+ export interface DependencyTree {
9
+ featureName: string;
10
+ featureType: FeatureType;
11
+ dependencyTree: DepNode[];
12
+ totalTables: number;
13
+ totalRecords: number;
14
+ }
15
+ export interface FeatureSummary {
16
+ name: string;
17
+ type: FeatureType;
18
+ description: string;
19
+ recordCount: number;
20
+ }
21
+ export declare class IdMapper {
22
+ private map;
23
+ /** key 格式统一使用全限定表名(T2(tableKey) 的结果) */
24
+ set(srcTable: string, srcId: number, tgtId: number): void;
25
+ get(srcTable: string, srcId: number): number | undefined;
26
+ /** 查询某个源 ID 在映射表中的目标 ID,若未映射则返回源 ID 本身 */
27
+ resolve(srcTable: string, srcId: number): number;
28
+ /** 映射表是否为空 */
29
+ get isEmpty(): boolean;
30
+ /** 映射条目数 */
31
+ get size(): number;
32
+ toSqlComment(): string;
33
+ }
34
+ /**
35
+ * 查询目标系统(系统 B)中指定表的指定 ID 是否已被占用
36
+ * @returns 占用该 ID 的实体名称,null 表示未占用
37
+ */
38
+ export declare function checkIdConflict(tableKey: TableKey, idField: string, nameField: string, id: number): Promise<{
39
+ exists: boolean;
40
+ name: string | null;
41
+ }>;
42
+ /**
43
+ * 在目标系统(系统 B)中找一个未被占用的新 ID
44
+ * 策略:取当前最大 ID + 1,保证不冲突
45
+ */
46
+ export declare function findNextAvailableId(tableKey: TableKey, idField: string): Promise<number>;
47
+ /**
48
+ * 为目标系统构建 ID 映射器
49
+ * 检查源 ID 在目标系统是否冲突(被不同实体占用),若冲突则分配新 ID
50
+ */
51
+ export declare function buildMigrationIdMap(tableKey: TableKey, idField: string, nameField: string, srcId: number, featureName: string): Promise<IdMapper>;
52
+ export interface DependencyWarning {
53
+ severity: "info" | "warning" | "error";
54
+ message: string;
55
+ dependencyType: string;
56
+ dependencyName: string;
57
+ existsInTarget: boolean;
58
+ }
59
+ /**
60
+ * 检查迁移一个功能时,其引用的外部实体在目标系统中是否存在
61
+ * - 窗体引用 DBO / 数据流
62
+ * - DBO 引用数据表
63
+ * - 数据流引用 DBO
64
+ * - 功能引用窗体
65
+ *
66
+ * severity 语义:
67
+ * error — 依赖缺失,目标系统不存在
68
+ * info — 依赖已存在
69
+ * warning — 部分存在或其他潜在问题
70
+ */
71
+ export declare function checkCrossFeatureDependencies(featureType: FeatureType, featureName: string): Promise<DependencyWarning[]>;
72
+ /** 获取功能类型对应的 ID 字段名 */
73
+ export declare function getIdField(featureType: FeatureType): string;
74
+ /** 获取功能类型对应的名称字段名 */
75
+ export declare function getNameField(featureType: FeatureType): string;
76
+ /** 获取功能类型对应的主表 TableKey */
77
+ export declare function getMainTableKey(featureType: FeatureType): TableKey;
78
+ /**
79
+ * 追踪功能的完整依赖树 — 支持 form/dbo/dataflow/function 四种类型
80
+ */
81
+ export declare function traceDependencies(featureType: FeatureType, featureName: string): Promise<DependencyTree>;
82
+ export declare function listFeatures(featureType?: FeatureType, keyword?: string): Promise<FeatureSummary[]>;
83
+ /**
84
+ * 把行数据转为 INSERT 语句
85
+ * @param rows 数据行
86
+ * @param fullTableName 全限定表名,如 [XDWmsCommon].[dbo].[TableSetTB]
87
+ * @param idColumn 自增 ID 列名,非空时开启 IDENTITY_INSERT
88
+ * @param idMap ID 映射器(源ID→目标ID),用于映射 ID 列和外键列的值
89
+ * @param fkRemap 需要根据 idMap 重映射的外键列列表
90
+ */
91
+ export declare function generateInsertSql(rows: Record<string, unknown>[], fullTableName: string, idColumn: string | null, idMap: IdMapper | null, fkRemap?: string[]): string;