@yg-toolkit/datapull 0.1.0

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 (134) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +74 -0
  3. package/dist/cli/program.d.ts +4 -0
  4. package/dist/cli/program.d.ts.map +1 -0
  5. package/dist/cli/program.js +540 -0
  6. package/dist/cli/program.js.map +1 -0
  7. package/dist/config/dotenv.d.ts +4 -0
  8. package/dist/config/dotenv.d.ts.map +1 -0
  9. package/dist/config/dotenv.js +47 -0
  10. package/dist/config/dotenv.js.map +1 -0
  11. package/dist/config/paths.d.ts +8 -0
  12. package/dist/config/paths.d.ts.map +1 -0
  13. package/dist/config/paths.js +24 -0
  14. package/dist/config/paths.js.map +1 -0
  15. package/dist/config/schema.d.ts +59 -0
  16. package/dist/config/schema.d.ts.map +1 -0
  17. package/dist/config/schema.js +73 -0
  18. package/dist/config/schema.js.map +1 -0
  19. package/dist/config/security.d.ts +12 -0
  20. package/dist/config/security.d.ts.map +1 -0
  21. package/dist/config/security.js +86 -0
  22. package/dist/config/security.js.map +1 -0
  23. package/dist/config/store.d.ts +19 -0
  24. package/dist/config/store.d.ts.map +1 -0
  25. package/dist/config/store.js +120 -0
  26. package/dist/config/store.js.map +1 -0
  27. package/dist/connections/service.d.ts +34 -0
  28. package/dist/connections/service.d.ts.map +1 -0
  29. package/dist/connections/service.js +220 -0
  30. package/dist/connections/service.js.map +1 -0
  31. package/dist/core/errors.d.ts +9 -0
  32. package/dist/core/errors.d.ts.map +1 -0
  33. package/dist/core/errors.js +29 -0
  34. package/dist/core/errors.js.map +1 -0
  35. package/dist/core/output.d.ts +16 -0
  36. package/dist/core/output.d.ts.map +1 -0
  37. package/dist/core/output.js +91 -0
  38. package/dist/core/output.js.map +1 -0
  39. package/dist/core/runtime.d.ts +3 -0
  40. package/dist/core/runtime.d.ts.map +1 -0
  41. package/dist/core/runtime.js +14 -0
  42. package/dist/core/runtime.js.map +1 -0
  43. package/dist/doctor/service.d.ts +9 -0
  44. package/dist/doctor/service.d.ts.map +1 -0
  45. package/dist/doctor/service.js +81 -0
  46. package/dist/doctor/service.js.map +1 -0
  47. package/dist/exporters/exporter.d.ts +10 -0
  48. package/dist/exporters/exporter.d.ts.map +1 -0
  49. package/dist/exporters/exporter.js +2 -0
  50. package/dist/exporters/exporter.js.map +1 -0
  51. package/dist/exporters/factory.d.ts +4 -0
  52. package/dist/exporters/factory.d.ts.map +1 -0
  53. package/dist/exporters/factory.js +11 -0
  54. package/dist/exporters/factory.js.map +1 -0
  55. package/dist/exporters/mysql.d.ts +16 -0
  56. package/dist/exporters/mysql.d.ts.map +1 -0
  57. package/dist/exporters/mysql.js +177 -0
  58. package/dist/exporters/mysql.js.map +1 -0
  59. package/dist/exporters/objects.d.ts +4 -0
  60. package/dist/exporters/objects.d.ts.map +1 -0
  61. package/dist/exporters/objects.js +32 -0
  62. package/dist/exporters/objects.js.map +1 -0
  63. package/dist/exporters/postgresql.d.ts +16 -0
  64. package/dist/exporters/postgresql.d.ts.map +1 -0
  65. package/dist/exporters/postgresql.js +228 -0
  66. package/dist/exporters/postgresql.js.map +1 -0
  67. package/dist/exporters/sql.d.ts +5 -0
  68. package/dist/exporters/sql.d.ts.map +1 -0
  69. package/dist/exporters/sql.js +14 -0
  70. package/dist/exporters/sql.js.map +1 -0
  71. package/dist/exporters/sqlserver.d.ts +11 -0
  72. package/dist/exporters/sqlserver.d.ts.map +1 -0
  73. package/dist/exporters/sqlserver.js +126 -0
  74. package/dist/exporters/sqlserver.js.map +1 -0
  75. package/dist/index.d.ts +3 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +71 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/interactive/connections.d.ts +16 -0
  80. package/dist/interactive/connections.d.ts.map +1 -0
  81. package/dist/interactive/connections.js +97 -0
  82. package/dist/interactive/connections.js.map +1 -0
  83. package/dist/interactive/wizard.d.ts +4 -0
  84. package/dist/interactive/wizard.d.ts.map +1 -0
  85. package/dist/interactive/wizard.js +284 -0
  86. package/dist/interactive/wizard.js.map +1 -0
  87. package/dist/output/transaction.d.ts +39 -0
  88. package/dist/output/transaction.d.ts.map +1 -0
  89. package/dist/output/transaction.js +329 -0
  90. package/dist/output/transaction.js.map +1 -0
  91. package/dist/process/runner.d.ts +14 -0
  92. package/dist/process/runner.d.ts.map +1 -0
  93. package/dist/process/runner.js +43 -0
  94. package/dist/process/runner.js.map +1 -0
  95. package/dist/pull/service.d.ts +24 -0
  96. package/dist/pull/service.d.ts.map +1 -0
  97. package/dist/pull/service.js +102 -0
  98. package/dist/pull/service.js.map +1 -0
  99. package/dist/skills/installer.d.ts +25 -0
  100. package/dist/skills/installer.d.ts.map +1 -0
  101. package/dist/skills/installer.js +177 -0
  102. package/dist/skills/installer.js.map +1 -0
  103. package/dist/skills/targets.d.ts +12 -0
  104. package/dist/skills/targets.d.ts.map +1 -0
  105. package/dist/skills/targets.js +37 -0
  106. package/dist/skills/targets.js.map +1 -0
  107. package/dist/tools/catalog.d.ts +17 -0
  108. package/dist/tools/catalog.d.ts.map +1 -0
  109. package/dist/tools/catalog.js +161 -0
  110. package/dist/tools/catalog.js.map +1 -0
  111. package/dist/tools/manager.d.ts +21 -0
  112. package/dist/tools/manager.d.ts.map +1 -0
  113. package/dist/tools/manager.js +110 -0
  114. package/dist/tools/manager.js.map +1 -0
  115. package/dist/types.d.ts +51 -0
  116. package/dist/types.d.ts.map +1 -0
  117. package/dist/types.js +3 -0
  118. package/dist/types.js.map +1 -0
  119. package/dist/utils/fs.d.ts +3 -0
  120. package/dist/utils/fs.d.ts.map +1 -0
  121. package/dist/utils/fs.js +43 -0
  122. package/dist/utils/fs.js.map +1 -0
  123. package/dist/utils/path.d.ts +4 -0
  124. package/dist/utils/path.d.ts.map +1 -0
  125. package/dist/utils/path.js +47 -0
  126. package/dist/utils/path.js.map +1 -0
  127. package/package.json +68 -0
  128. package/resources/ci/mysql-seed.sql +36 -0
  129. package/resources/ci/postgresql-seed.sql +45 -0
  130. package/resources/ci/sqlserver-seed.sql +57 -0
  131. package/resources/compatibility-matrix.json +315 -0
  132. package/resources/export-sqlserver.ps1 +257 -0
  133. package/skill/SKILL.md +42 -0
  134. package/skill/agents/openai.yaml +6 -0
@@ -0,0 +1,315 @@
1
+ {
2
+ "version": 1,
3
+ "policy": "仅实际验证通过的组合可声明支持;空矩阵表示开发包尚未完成发布验收。",
4
+ "requiredPlatforms": [
5
+ "windows-10-11",
6
+ "macos",
7
+ "ubuntu-lts",
8
+ "debian-stable",
9
+ "fedora-current"
10
+ ],
11
+ "requiredEngines": [
12
+ "mysql",
13
+ "postgresql",
14
+ "sqlserver"
15
+ ],
16
+ "requiredSkillTargets": [
17
+ "codex:user",
18
+ "codex:project",
19
+ "claude:user",
20
+ "claude:project",
21
+ "cursor:user",
22
+ "cursor:project",
23
+ "trae:user",
24
+ "trae:project"
25
+ ],
26
+ "verified": [
27
+ {
28
+ "engine": "mysql",
29
+ "serverVersion": "8.4.11",
30
+ "clientTools": "mysql=mysql Ver 26.7.0 for Win64 on x86_64 (MySQL Community Server - GPL)",
31
+ "platform": "windows-10-11",
32
+ "osVersion": "win32 x64 self-hosted",
33
+ "nodeVersion": "v22.12.0",
34
+ "installAdapterVersion": 1,
35
+ "verifiedAt": "2026-09-18T14:59:41.860Z",
36
+ "result": "passed",
37
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
38
+ },
39
+ {
40
+ "engine": "postgresql",
41
+ "serverVersion": "18.6",
42
+ "clientTools": "psql=psql (PostgreSQL) 18.3; pg_dump=pg_dump (PostgreSQL) 18.3",
43
+ "platform": "windows-10-11",
44
+ "osVersion": "win32 x64 self-hosted",
45
+ "nodeVersion": "v22.12.0",
46
+ "installAdapterVersion": 1,
47
+ "verifiedAt": "2026-09-18T14:59:47.825Z",
48
+ "result": "passed",
49
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
50
+ },
51
+ {
52
+ "engine": "sqlserver",
53
+ "serverVersion": "15.0.2000.5",
54
+ "clientTools": "sqlcmd=Microsoft (R) SQL Server Command Line Tool; pwsh=PowerShell 7.6.6; sqlserver-module=22.4.5.1",
55
+ "platform": "windows-10-11",
56
+ "osVersion": "win32 x64 self-hosted",
57
+ "nodeVersion": "v22.12.0",
58
+ "installAdapterVersion": 1,
59
+ "verifiedAt": "2026-09-18T14:59:58.184Z",
60
+ "result": "passed",
61
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
62
+ },
63
+ {
64
+ "engine": "mysql",
65
+ "serverVersion": "8.4.11",
66
+ "clientTools": "mysql=mysql Ver 26.7.0 for macos14.8 on x86_64 (Homebrew)",
67
+ "platform": "macos",
68
+ "osVersion": "darwin x64 macos15",
69
+ "nodeVersion": "v22.12.0",
70
+ "installAdapterVersion": 1,
71
+ "verifiedAt": "2026-09-18T15:32:31.837Z",
72
+ "result": "passed",
73
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
74
+ },
75
+ {
76
+ "engine": "postgresql",
77
+ "serverVersion": "18.6",
78
+ "clientTools": "psql=psql (PostgreSQL) 18.6; pg_dump=pg_dump (PostgreSQL) 18.6",
79
+ "platform": "macos",
80
+ "osVersion": "darwin x64 macos15",
81
+ "nodeVersion": "v22.12.0",
82
+ "installAdapterVersion": 1,
83
+ "verifiedAt": "2026-09-18T15:33:11.039Z",
84
+ "result": "passed",
85
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
86
+ },
87
+ {
88
+ "engine": "sqlserver",
89
+ "serverVersion": "15.0.2000.5",
90
+ "clientTools": "sqlcmd=sqlcmd: Install/Create/Query SQL Server, Azure SQL, and Tools; pwsh=PowerShell 7.6.4; sqlserver-module=22.4.5.1",
91
+ "platform": "macos",
92
+ "osVersion": "darwin x64 macos15",
93
+ "nodeVersion": "v22.12.0",
94
+ "installAdapterVersion": 1,
95
+ "verifiedAt": "2026-09-18T15:34:19.252Z",
96
+ "result": "passed",
97
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
98
+ },
99
+ {
100
+ "engine": "mysql",
101
+ "serverVersion": "8.4.11",
102
+ "clientTools": "mysql=mysql Ver 8.0.46-0ubuntu0.24.04.4 for Linux on x86_64 ((Ubuntu))",
103
+ "platform": "ubuntu-lts",
104
+ "osVersion": "linux x64 ubuntu24",
105
+ "nodeVersion": "v22.12.0",
106
+ "installAdapterVersion": 1,
107
+ "verifiedAt": "2026-09-18T15:31:37.703Z",
108
+ "result": "passed",
109
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
110
+ },
111
+ {
112
+ "engine": "postgresql",
113
+ "serverVersion": "18.6",
114
+ "clientTools": "psql=psql (PostgreSQL) 18.6 (Ubuntu 18.6-1.pgdg24.04+2); pg_dump=pg_dump (PostgreSQL) 18.6 (Ubuntu 18.6-1.pgdg24.04+2)",
115
+ "platform": "ubuntu-lts",
116
+ "osVersion": "linux x64 ubuntu24",
117
+ "nodeVersion": "v22.12.0",
118
+ "installAdapterVersion": 1,
119
+ "verifiedAt": "2026-09-18T15:32:29.546Z",
120
+ "result": "passed",
121
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
122
+ },
123
+ {
124
+ "engine": "sqlserver",
125
+ "serverVersion": "15.0.2000.5",
126
+ "clientTools": "sqlcmd=Microsoft (R) SQL Server Command Line Tool; pwsh=PowerShell 7.6.6; sqlserver-module=22.4.5.1",
127
+ "platform": "ubuntu-lts",
128
+ "osVersion": "linux x64 ubuntu24",
129
+ "nodeVersion": "v22.12.0",
130
+ "installAdapterVersion": 1,
131
+ "verifiedAt": "2026-09-18T15:33:59.284Z",
132
+ "result": "passed",
133
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
134
+ },
135
+ {
136
+ "engine": "mysql",
137
+ "serverVersion": "8.4.11",
138
+ "clientTools": "mysql=mysql Ver 8.4.11 for Linux on x86_64 (MySQL Community Server - GPL)",
139
+ "platform": "debian-stable",
140
+ "osVersion": "linux x64 self-hosted",
141
+ "nodeVersion": "v22.12.0",
142
+ "installAdapterVersion": 1,
143
+ "verifiedAt": "2026-09-18T15:23:52.618Z",
144
+ "result": "passed",
145
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
146
+ },
147
+ {
148
+ "engine": "postgresql",
149
+ "serverVersion": "18.6",
150
+ "clientTools": "psql=psql (PostgreSQL) 18.6 (Debian 18.6-1.pgdg13+2); pg_dump=pg_dump (PostgreSQL) 18.6 (Debian 18.6-1.pgdg13+2)",
151
+ "platform": "debian-stable",
152
+ "osVersion": "linux x64 self-hosted",
153
+ "nodeVersion": "v22.12.0",
154
+ "installAdapterVersion": 1,
155
+ "verifiedAt": "2026-09-18T15:23:57.196Z",
156
+ "result": "passed",
157
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
158
+ },
159
+ {
160
+ "engine": "sqlserver",
161
+ "serverVersion": "15.0.2000.5",
162
+ "clientTools": "sqlcmd=sqlcmd: Install/Create/Query SQL Server, Azure SQL, and Tools; pwsh=PowerShell 7.6.6; sqlserver-module=22.4.5.1",
163
+ "platform": "debian-stable",
164
+ "osVersion": "linux x64 self-hosted",
165
+ "nodeVersion": "v22.12.0",
166
+ "installAdapterVersion": 1,
167
+ "verifiedAt": "2026-09-18T15:24:10.099Z",
168
+ "result": "passed",
169
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
170
+ },
171
+ {
172
+ "engine": "mysql",
173
+ "serverVersion": "8.4.11",
174
+ "clientTools": "mysql=mysql Ver 8.4.10 for Linux on x86_64 (Source distribution)",
175
+ "platform": "fedora-current",
176
+ "osVersion": "linux x64 self-hosted",
177
+ "nodeVersion": "v22.12.0",
178
+ "installAdapterVersion": 1,
179
+ "verifiedAt": "2026-09-18T15:29:22.634Z",
180
+ "result": "passed",
181
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
182
+ },
183
+ {
184
+ "engine": "postgresql",
185
+ "serverVersion": "18.6",
186
+ "clientTools": "psql=psql (PostgreSQL) 18.6; pg_dump=pg_dump (PostgreSQL) 18.6",
187
+ "platform": "fedora-current",
188
+ "osVersion": "linux x64 self-hosted",
189
+ "nodeVersion": "v22.12.0",
190
+ "installAdapterVersion": 1,
191
+ "verifiedAt": "2026-09-18T15:29:27.221Z",
192
+ "result": "passed",
193
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
194
+ },
195
+ {
196
+ "engine": "sqlserver",
197
+ "serverVersion": "15.0.2000.5",
198
+ "clientTools": "sqlcmd=sqlcmd: Install/Create/Query SQL Server, Azure SQL, and Tools; pwsh=PowerShell 7.6.6; sqlserver-module=22.4.5.1",
199
+ "platform": "fedora-current",
200
+ "osVersion": "linux x64 self-hosted",
201
+ "nodeVersion": "v22.12.0",
202
+ "installAdapterVersion": 1,
203
+ "verifiedAt": "2026-09-18T15:29:35.917Z",
204
+ "result": "passed",
205
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
206
+ }
207
+ ],
208
+ "platformVerifications": [
209
+ {
210
+ "platform": "windows-10-11",
211
+ "osVersion": "win32 x64 self-hosted",
212
+ "nodeVersion": "v22.12.0",
213
+ "npmInstall": true,
214
+ "skillTargets": [
215
+ "codex:user",
216
+ "codex:project",
217
+ "claude:user",
218
+ "claude:project",
219
+ "cursor:user",
220
+ "cursor:project",
221
+ "trae:user",
222
+ "trae:project"
223
+ ],
224
+ "agentDiscoveryVerified": false,
225
+ "agentDiscoveryNote": "CI 已验证 8 个用户级/项目级安装路径与回验;Windows 上 Codex 用户级和项目级实际发现通过。Claude Code 因当前账号返回 402 未完成,Cursor、Trae 因桌面自动化运行时不可用未完成,因此整个平台仍不标记为发现通过。",
226
+ "verifiedAt": "2026-09-18T14:59:58.840Z",
227
+ "result": "passed",
228
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
229
+ },
230
+ {
231
+ "platform": "macos",
232
+ "osVersion": "darwin x64 macos15",
233
+ "nodeVersion": "v22.12.0",
234
+ "npmInstall": true,
235
+ "skillTargets": [
236
+ "codex:user",
237
+ "codex:project",
238
+ "claude:user",
239
+ "claude:project",
240
+ "cursor:user",
241
+ "cursor:project",
242
+ "trae:user",
243
+ "trae:project"
244
+ ],
245
+ "agentDiscoveryVerified": false,
246
+ "agentDiscoveryNote": "CI 只验证安装路径与回验;Codex、Claude Code、Cursor、Trae 实际发现仍需专用验收机确认。",
247
+ "verifiedAt": "2026-09-18T15:34:20.175Z",
248
+ "result": "passed",
249
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
250
+ },
251
+ {
252
+ "platform": "ubuntu-lts",
253
+ "osVersion": "linux x64 ubuntu24",
254
+ "nodeVersion": "v22.12.0",
255
+ "npmInstall": true,
256
+ "skillTargets": [
257
+ "codex:user",
258
+ "codex:project",
259
+ "claude:user",
260
+ "claude:project",
261
+ "cursor:user",
262
+ "cursor:project",
263
+ "trae:user",
264
+ "trae:project"
265
+ ],
266
+ "agentDiscoveryVerified": false,
267
+ "agentDiscoveryNote": "CI 只验证安装路径与回验;Codex、Claude Code、Cursor、Trae 实际发现仍需专用验收机确认。",
268
+ "verifiedAt": "2026-09-18T15:33:59.877Z",
269
+ "result": "passed",
270
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
271
+ },
272
+ {
273
+ "platform": "debian-stable",
274
+ "osVersion": "linux x64 self-hosted",
275
+ "nodeVersion": "v22.12.0",
276
+ "npmInstall": true,
277
+ "skillTargets": [
278
+ "codex:user",
279
+ "codex:project",
280
+ "claude:user",
281
+ "claude:project",
282
+ "cursor:user",
283
+ "cursor:project",
284
+ "trae:user",
285
+ "trae:project"
286
+ ],
287
+ "agentDiscoveryVerified": false,
288
+ "agentDiscoveryNote": "CI 只验证安装路径与回验;Codex、Claude Code、Cursor、Trae 实际发现仍需专用验收机确认。",
289
+ "verifiedAt": "2026-09-18T15:24:10.429Z",
290
+ "result": "passed",
291
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
292
+ },
293
+ {
294
+ "platform": "fedora-current",
295
+ "osVersion": "linux x64 self-hosted",
296
+ "nodeVersion": "v22.12.0",
297
+ "npmInstall": true,
298
+ "skillTargets": [
299
+ "codex:user",
300
+ "codex:project",
301
+ "claude:user",
302
+ "claude:project",
303
+ "cursor:user",
304
+ "cursor:project",
305
+ "trae:user",
306
+ "trae:project"
307
+ ],
308
+ "agentDiscoveryVerified": false,
309
+ "agentDiscoveryNote": "CI 只验证安装路径与回验;Codex、Claude Code、Cursor、Trae 实际发现仍需专用验收机确认。",
310
+ "verifiedAt": "2026-09-18T15:29:36.246Z",
311
+ "result": "passed",
312
+ "gitSha": "2ededdb9436e49fd71a0d5652e2f86bca62a597b"
313
+ }
314
+ ]
315
+ }
@@ -0,0 +1,257 @@
1
+ param(
2
+ [Parameter(Mandatory = $true)]
3
+ [string]$OutputDirectory
4
+ )
5
+
6
+ $ErrorActionPreference = 'Stop'
7
+ $currentStage = '初始化'
8
+
9
+ function Set-ExportStage {
10
+ param([string]$Stage)
11
+ $script:currentStage = $Stage
12
+ [Console]::Error.WriteLine("[datapull] SQL Server 导出阶段:$Stage")
13
+ }
14
+
15
+ function Get-RequiredEnvironmentValue {
16
+ param([string]$Name)
17
+ $value = [Environment]::GetEnvironmentVariable($Name, 'Process')
18
+ if ([string]::IsNullOrWhiteSpace($value)) {
19
+ throw "缺少内部环境变量:$Name"
20
+ }
21
+ return $value
22
+ }
23
+
24
+ function Get-SafeFileStem {
25
+ param([string]$Identifier)
26
+ $readable = [regex]::Replace($Identifier, '[<>:"/\\|?*\x00-\x1f]', '_')
27
+ $readable = [regex]::Replace($readable, '\s+', '_').Trim('.', ' ', '_')
28
+ if ([string]::IsNullOrWhiteSpace($readable)) { $readable = 'object' }
29
+ if ($readable.Length -gt 100) { $readable = $readable.Substring(0, 100).TrimEnd('.', ' ') }
30
+ $sha = [System.Security.Cryptography.SHA256]::Create()
31
+ try {
32
+ $bytes = [System.Text.Encoding]::UTF8.GetBytes($Identifier)
33
+ $hash = [System.BitConverter]::ToString($sha.ComputeHash($bytes)).Replace('-', '').ToLowerInvariant().Substring(0, 10)
34
+ }
35
+ finally { $sha.Dispose() }
36
+ return "$readable--$hash"
37
+ }
38
+
39
+ function Write-Utf8NoBom {
40
+ param([string]$Path, [string]$Content)
41
+ $encoding = New-Object System.Text.UTF8Encoding($false)
42
+ [System.IO.File]::WriteAllText($Path, $Content, $encoding)
43
+ }
44
+
45
+ $selectedTypes = @((Get-RequiredEnvironmentValue -Name 'DATAPULL_SQLSERVER_TYPES') | ConvertFrom-Json)
46
+ $records = New-Object System.Collections.Generic.List[object]
47
+ $objectsDirectory = Join-Path $OutputDirectory '_objects'
48
+ [System.IO.Directory]::CreateDirectory($objectsDirectory) | Out-Null
49
+
50
+ function Test-TypeSelected {
51
+ param([string]$ObjectType)
52
+ return $selectedTypes -contains $ObjectType
53
+ }
54
+
55
+ function Add-Record {
56
+ param(
57
+ [string]$Ddl,
58
+ [string]$ObjectType,
59
+ [AllowEmptyString()][string]$Schema,
60
+ [string]$Name,
61
+ [string]$Identity
62
+ )
63
+ if (-not (Test-TypeSelected -ObjectType $ObjectType)) { return }
64
+ if ([string]::IsNullOrWhiteSpace($Ddl)) { throw "对象 $Identity 的 DDL 为空。" }
65
+ $fileName = "$(Get-SafeFileStem -Identifier "$ObjectType.$Identity").sql"
66
+ $relativePath = "_objects/$fileName"
67
+ Write-Utf8NoBom -Path (Join-Path $objectsDirectory $fileName) -Content ($Ddl.TrimEnd() + "`n")
68
+ $records.Add([pscustomobject]@{
69
+ objectType = $ObjectType
70
+ schema = if ([string]::IsNullOrWhiteSpace($Schema)) { $null } else { $Schema }
71
+ name = $Name
72
+ identity = $Identity
73
+ file = $relativePath
74
+ })
75
+ }
76
+
77
+ function Add-SmoRecord {
78
+ param(
79
+ [object]$Object,
80
+ [string]$ObjectType,
81
+ [AllowEmptyString()][string]$Schema,
82
+ [string]$Name,
83
+ [string]$Identity,
84
+ [object]$Scripter
85
+ )
86
+ if (-not (Test-TypeSelected -ObjectType $ObjectType)) { return }
87
+ $fragments = @($Scripter.Script(@($Object.Urn)))
88
+ if ($fragments.Count -eq 0) { throw "对象 $Identity 的 DDL 为空。" }
89
+ $ddl = (($fragments | ForEach-Object { $_.ToString().TrimEnd() }) -join "`nGO`n")
90
+ Add-Record -Ddl $ddl -ObjectType $ObjectType -Schema $Schema -Name $Name -Identity $Identity
91
+ }
92
+
93
+ Set-ExportStage -Stage '加载 SqlServer 模块'
94
+ try {
95
+ Import-Module SqlServer -ErrorAction Stop
96
+ }
97
+ catch {
98
+ throw "缺少或无法加载 PowerShell SqlServer 模块。请运行 Install-Module SqlServer -Scope CurrentUser。原始错误:$($_.Exception.Message)"
99
+ }
100
+
101
+ $hostName = Get-RequiredEnvironmentValue -Name 'DATAPULL_SQLSERVER_HOST'
102
+ $port = Get-RequiredEnvironmentValue -Name 'DATAPULL_SQLSERVER_PORT'
103
+ $databaseName = Get-RequiredEnvironmentValue -Name 'DATAPULL_SQLSERVER_DATABASE'
104
+ $authentication = Get-RequiredEnvironmentValue -Name 'DATAPULL_SQLSERVER_AUTH'
105
+ $encrypt = (Get-RequiredEnvironmentValue -Name 'DATAPULL_SQLSERVER_ENCRYPT') -eq 'true'
106
+ $trustCertificate = (Get-RequiredEnvironmentValue -Name 'DATAPULL_SQLSERVER_TRUST_CERT') -eq 'true'
107
+
108
+ if (-not $encrypt) {
109
+ throw 'DataPull 要求 SQL Server 启用加密。'
110
+ }
111
+
112
+ $serverConnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection
113
+ $serverConnection.ServerInstance = "$hostName,$port"
114
+ if ($serverConnection.PSObject.Properties.Name -contains 'ConnectTimeout') {
115
+ $serverConnection.ConnectTimeout = 30
116
+ }
117
+ if ($serverConnection.PSObject.Properties.Name -contains 'StatementTimeout') {
118
+ $serverConnection.StatementTimeout = 120
119
+ }
120
+ if ($authentication -eq 'integrated') {
121
+ $serverConnection.LoginSecure = $true
122
+ }
123
+ else {
124
+ $serverConnection.LoginSecure = $false
125
+ $serverConnection.Login = Get-RequiredEnvironmentValue -Name 'DATAPULL_SQLSERVER_USER'
126
+ $serverConnection.Password = Get-RequiredEnvironmentValue -Name 'DATAPULL_SQLSERVER_PASSWORD'
127
+ }
128
+ if ($serverConnection.PSObject.Properties.Name -contains 'EncryptConnection') {
129
+ $serverConnection.EncryptConnection = $true
130
+ }
131
+ if ($serverConnection.PSObject.Properties.Name -contains 'TrustServerCertificate') {
132
+ $serverConnection.TrustServerCertificate = $trustCertificate
133
+ }
134
+ elseif ($trustCertificate) {
135
+ throw '当前 PowerShell SqlServer 模块不支持 TrustServerCertificate,请升级模块后重试。'
136
+ }
137
+
138
+ $server = New-Object Microsoft.SqlServer.Management.Smo.Server($serverConnection)
139
+ try {
140
+ Set-ExportStage -Stage '连接目标数据库'
141
+ $server.ConnectionContext.Connect()
142
+ # 过滤对象时会访问这些属性;预批量加载可避免高延迟连接上的逐对象往返查询。
143
+ [string[]]$schemaObjectFields = @('IsSystemObject', 'Schema', 'Name')
144
+ [string[]]$namedObjectFields = @('IsSystemObject', 'Name')
145
+ $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Table], $schemaObjectFields)
146
+ $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.View], $schemaObjectFields)
147
+ $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.UserDefinedFunction], $schemaObjectFields)
148
+ $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.StoredProcedure], $schemaObjectFields)
149
+ $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Trigger], $namedObjectFields)
150
+ Set-ExportStage -Stage '读取数据库元数据'
151
+ $database = $server.Databases[$databaseName]
152
+ if ($null -eq $database) { throw "数据库不存在或当前账户不可见:$databaseName" }
153
+ $database.Refresh()
154
+
155
+ # 表需要完整的约束和索引;视图、存储程序等对象使用轻量选项,避免触发无关元数据查询。
156
+ $tableOptions = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions
157
+ $tableOptions.ScriptSchema = $true
158
+ $tableOptions.ScriptData = $false
159
+ $tableOptions.SchemaQualify = $true
160
+ $tableOptions.IncludeHeaders = $false
161
+ $tableOptions.IncludeIfNotExists = $false
162
+ $tableOptions.ScriptOwner = $false
163
+ $tableOptions.Permissions = $false
164
+ $tableOptions.NoFileGroup = $true
165
+ $tableOptions.DriAll = $true
166
+ $tableOptions.Indexes = $true
167
+ $tableOptions.Triggers = $false
168
+ $tableOptions.ExtendedProperties = $true
169
+
170
+ $objectOptions = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions
171
+ $objectOptions.ScriptSchema = $true
172
+ $objectOptions.ScriptData = $false
173
+ $objectOptions.SchemaQualify = $true
174
+ $objectOptions.IncludeHeaders = $false
175
+ $objectOptions.IncludeIfNotExists = $false
176
+ $objectOptions.ScriptOwner = $false
177
+ $objectOptions.Permissions = $false
178
+ $objectOptions.NoFileGroup = $true
179
+ $objectOptions.DriAll = $false
180
+ $objectOptions.Indexes = $false
181
+ $objectOptions.Triggers = $false
182
+ $objectOptions.ExtendedProperties = $false
183
+
184
+ $tableScripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter($server)
185
+ $tableScripter.Options = $tableOptions
186
+ $objectScripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter($server)
187
+ $objectScripter.Options = $objectOptions
188
+
189
+ if (Test-TypeSelected -ObjectType 'schema') {
190
+ Set-ExportStage -Stage '导出 schema'
191
+ $systemSchemas = @('dbo', 'guest', 'sys', 'INFORMATION_SCHEMA')
192
+ foreach ($schemaObject in @($database.Schemas | Where-Object { $systemSchemas -notcontains $_.Name })) {
193
+ $escapedSchema = $schemaObject.Name.Replace(']', ']]')
194
+ Add-Record -Ddl "CREATE SCHEMA [$escapedSchema];" -ObjectType 'schema' -Schema $schemaObject.Name -Name $schemaObject.Name -Identity $schemaObject.Name
195
+ }
196
+ }
197
+
198
+ Set-ExportStage -Stage '读取 table 清单'
199
+ $tables = @($database.Tables | Where-Object { -not $_.IsSystemObject })
200
+ Set-ExportStage -Stage "脚本化 table 与表级 trigger($($tables.Count) 个 table)"
201
+ foreach ($table in $tables) {
202
+ Add-SmoRecord -Object $table -ObjectType 'table' -Schema $table.Schema -Name $table.Name -Identity "$($table.Schema).$($table.Name)" -Scripter $tableScripter
203
+ foreach ($trigger in @($table.Triggers | Where-Object { -not $_.IsSystemObject })) {
204
+ Add-SmoRecord -Object $trigger -ObjectType 'trigger' -Schema $table.Schema -Name "$($table.Name).$($trigger.Name)" -Identity "$($table.Schema).$($table.Name).$($trigger.Name)" -Scripter $objectScripter
205
+ }
206
+ }
207
+ Set-ExportStage -Stage '读取 view 清单'
208
+ $views = @($database.Views | Where-Object { -not $_.IsSystemObject })
209
+ Set-ExportStage -Stage "脚本化 view($($views.Count) 个)"
210
+ foreach ($view in $views) {
211
+ Add-SmoRecord -Object $view -ObjectType 'view' -Schema $view.Schema -Name $view.Name -Identity "$($view.Schema).$($view.Name)" -Scripter $objectScripter
212
+ }
213
+ Set-ExportStage -Stage '导出 function'
214
+ foreach ($function in @($database.UserDefinedFunctions | Where-Object { -not $_.IsSystemObject })) {
215
+ Add-SmoRecord -Object $function -ObjectType 'function' -Schema $function.Schema -Name $function.Name -Identity "$($function.Schema).$($function.Name)" -Scripter $objectScripter
216
+ }
217
+ Set-ExportStage -Stage '导出 procedure'
218
+ foreach ($procedure in @($database.StoredProcedures | Where-Object { -not $_.IsSystemObject })) {
219
+ Add-SmoRecord -Object $procedure -ObjectType 'procedure' -Schema $procedure.Schema -Name $procedure.Name -Identity "$($procedure.Schema).$($procedure.Name)" -Scripter $objectScripter
220
+ }
221
+ Set-ExportStage -Stage '导出数据库级 trigger'
222
+ foreach ($trigger in @($database.Triggers | Where-Object { -not $_.IsSystemObject })) {
223
+ Add-SmoRecord -Object $trigger -ObjectType 'trigger' -Schema '' -Name $trigger.Name -Identity "database.$($trigger.Name)" -Scripter $objectScripter
224
+ }
225
+ if ($database.PSObject.Properties.Name -contains 'Sequences') {
226
+ Set-ExportStage -Stage '导出 sequence'
227
+ foreach ($sequence in @($database.Sequences)) {
228
+ Add-SmoRecord -Object $sequence -ObjectType 'sequence' -Schema $sequence.Schema -Name $sequence.Name -Identity "$($sequence.Schema).$($sequence.Name)" -Scripter $objectScripter
229
+ }
230
+ }
231
+ if ($database.PSObject.Properties.Name -contains 'Synonyms') {
232
+ Set-ExportStage -Stage '导出 synonym'
233
+ foreach ($synonym in @($database.Synonyms)) {
234
+ Add-SmoRecord -Object $synonym -ObjectType 'synonym' -Schema $synonym.Schema -Name $synonym.Name -Identity "$($synonym.Schema).$($synonym.Name)" -Scripter $objectScripter
235
+ }
236
+ }
237
+ Set-ExportStage -Stage '导出用户定义类型'
238
+ foreach ($dataType in @($database.UserDefinedDataTypes)) {
239
+ Add-SmoRecord -Object $dataType -ObjectType 'type' -Schema $dataType.Schema -Name $dataType.Name -Identity "$($dataType.Schema).$($dataType.Name)" -Scripter $objectScripter
240
+ }
241
+ if ($database.PSObject.Properties.Name -contains 'UserDefinedTableTypes') {
242
+ foreach ($tableType in @($database.UserDefinedTableTypes)) {
243
+ Add-SmoRecord -Object $tableType -ObjectType 'type' -Schema $tableType.Schema -Name $tableType.Name -Identity "$($tableType.Schema).$($tableType.Name)" -Scripter $objectScripter
244
+ }
245
+ }
246
+
247
+ Set-ExportStage -Stage '写入对象清单'
248
+ [object[]]$recordArray = $records
249
+ Write-Utf8NoBom -Path (Join-Path $OutputDirectory 'objects.json') -Content ((ConvertTo-Json -InputObject $recordArray -Depth 5) + "`n")
250
+ }
251
+ catch {
252
+ throw "SQL Server 结构导出失败(阶段:$currentStage)。原始错误:$($_.Exception.Message)"
253
+ }
254
+ finally {
255
+ if ($serverConnection.IsOpen) { $serverConnection.Disconnect() }
256
+ Remove-Item Env:DATAPULL_SQLSERVER_PASSWORD -ErrorAction SilentlyContinue
257
+ }
package/skill/SKILL.md ADDED
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: datapull
3
+ description: 检查并指导安装 DataPull CLI,使用已登记连接拉取 MySQL、PostgreSQL 或 SQL Server 的结构文件;适用于环境诊断、连接选择、对象范围确认和 CLI 错误恢复,不替代 CLI 管理凭证或生成 DDL。
4
+ ---
5
+
6
+ # DataPull
7
+
8
+ 把 DataPull CLI 作为唯一执行入口。本 Skill 负责环境检查、安装指导和安全调用,不实现连接管理、依赖安装或结构文件生成。
9
+
10
+ ## 环境门
11
+
12
+ 1. 检查 Node.js 是否为 `>=22.12`、NPM 是否可用、`datapull --version` 是否成功。
13
+ 2. CLI 缺失时,只向用户提供 `npm install --global @yg-toolkit/datapull`;由用户亲自执行,不代替用户进行全局安装。
14
+ 3. CLI 存在时执行 `datapull doctor --json`,依据退出码和 `error.code` 给出下一条恢复命令。环境门完成的标准是 CLI 可执行且诊断结果已被解释。
15
+
16
+ ## 调用流程
17
+
18
+ 优先使用带 `--json` 的命令模式:
19
+
20
+ - `datapull connection list --json`:列出脱敏登记连接。
21
+ - `datapull database list --connection <alias> --json`:读取收藏、最近使用和可访问数据库。
22
+ - `datapull pull --connection <alias> --database <database> --include <types> --yes --json`:拉取结构文件。
23
+
24
+ 执行拉取前向用户说明连接别名、目标数据库、对象类型和当前项目根。任一值无法从用户请求或 CLI 脱敏结果唯一确定时,停在该步骤并请用户决定;不猜测连接、数据库或对象范围。
25
+
26
+ 当 CLI 返回缺少工具时,说明 `actionPlan.installation` 中的工具、来源、命令、权限与下载影响。只有用户明确要求执行该安装计划后,才在下一次 CLI 调用中加入 `--install-missing --yes`。
27
+
28
+ 当 SQL Server 返回 `SQLSERVER_TLS_CERTIFICATE_UNTRUSTED` 时,说明连接仍可保持加密,但信任服务器证书会失去服务器身份验证并带来中间人攻击风险。由用户在“安装可信 CA”“仅本次信任”“保存到该连接”中决定;只有用户明确选择后,才分别调用:
29
+
30
+ - 仅本次:在 `connection test`、`database list` 或 `pull` 中加入 `--trust-server-certificate --yes`。
31
+ - 保存:`datapull connection update --alias <alias> --trust-server-certificate --yes --json`。
32
+ - 恢复验证:`datapull connection update --alias <alias> --verify-server-certificate --yes --json`。
33
+
34
+ Agent 不替用户选择信任证书,也不把测试环境的放宽策略推广到其他连接。
35
+
36
+ ## 秘密边界
37
+
38
+ 数据库密码或含秘密 URL 只由用户在 CLI 隐藏输入中填写,或手工更新 CLI 显示的 `credentials.env`。不要在聊天中索要、复述或传递秘密,不读取该文件内容,也不把秘密放入命令参数。
39
+
40
+ ## 完成标准
41
+
42
+ 只有在 CLI 退出码为零、JSON 中 `ok:true`,且 `outputPath`、`updatedTypes`、`preservedTypes` 与用户目标一致时,才报告拉取成功。失败时原样保留稳定 `error.code`,给出一条对应的恢复命令,并区分本地契约验证与真实数据库拉取结果。
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "DataPull"
3
+ short_description: "安装并安全调用数据库结构文件拉取 CLI"
4
+ default_prompt: "使用 $datapull 检查环境,并指导我从已登记数据库连接拉取结构文件。"
5
+ policy:
6
+ allow_implicit_invocation: true