dsh-config-manager 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 (253) hide show
  1. package/README.md +216 -0
  2. package/README.zh-CN.md +218 -0
  3. package/cordis.patch.yml +45 -0
  4. package/dsh.bundle.patch +21 -0
  5. package/dsh.client +39 -0
  6. package/lib/adapters/agent-presets.d.ts +13 -0
  7. package/lib/adapters/agent-presets.js +14 -0
  8. package/lib/adapters/agent-presets.js.map +1 -0
  9. package/lib/adapters/credentials.d.ts +36 -0
  10. package/lib/adapters/credentials.js +121 -0
  11. package/lib/adapters/credentials.js.map +1 -0
  12. package/lib/adapters/file-collection.d.ts +14 -0
  13. package/lib/adapters/file-collection.js +102 -0
  14. package/lib/adapters/file-collection.js.map +1 -0
  15. package/lib/adapters/index.d.ts +38 -0
  16. package/lib/adapters/index.js +46 -0
  17. package/lib/adapters/index.js.map +1 -0
  18. package/lib/adapters/mcp.d.ts +27 -0
  19. package/lib/adapters/mcp.js +175 -0
  20. package/lib/adapters/mcp.js.map +1 -0
  21. package/lib/adapters/plugin-files.d.ts +15 -0
  22. package/lib/adapters/plugin-files.js +91 -0
  23. package/lib/adapters/plugin-files.js.map +1 -0
  24. package/lib/adapters/plugins.d.ts +13 -0
  25. package/lib/adapters/plugins.js +177 -0
  26. package/lib/adapters/plugins.js.map +1 -0
  27. package/lib/adapters/prompts.d.ts +29 -0
  28. package/lib/adapters/prompts.js +228 -0
  29. package/lib/adapters/prompts.js.map +1 -0
  30. package/lib/adapters/providers.d.ts +33 -0
  31. package/lib/adapters/providers.js +143 -0
  32. package/lib/adapters/providers.js.map +1 -0
  33. package/lib/adapters/sessions.d.ts +14 -0
  34. package/lib/adapters/sessions.js +15 -0
  35. package/lib/adapters/sessions.js.map +1 -0
  36. package/lib/adapters/settings.d.ts +23 -0
  37. package/lib/adapters/settings.js +142 -0
  38. package/lib/adapters/settings.js.map +1 -0
  39. package/lib/adapters/skills.d.ts +13 -0
  40. package/lib/adapters/skills.js +14 -0
  41. package/lib/adapters/skills.js.map +1 -0
  42. package/lib/adapters/test-helpers.d.ts +99 -0
  43. package/lib/adapters/test-helpers.js +192 -0
  44. package/lib/adapters/test-helpers.js.map +1 -0
  45. package/lib/adapters/ui.d.ts +26 -0
  46. package/lib/adapters/ui.js +88 -0
  47. package/lib/adapters/ui.js.map +1 -0
  48. package/lib/adapters/workspaces.d.ts +12 -0
  49. package/lib/adapters/workspaces.js +92 -0
  50. package/lib/adapters/workspaces.js.map +1 -0
  51. package/lib/client.d.ts +377 -0
  52. package/lib/client.js +2598 -0
  53. package/lib/client.js.map +1 -0
  54. package/lib/core/analyzer.d.ts +35 -0
  55. package/lib/core/analyzer.js +563 -0
  56. package/lib/core/analyzer.js.map +1 -0
  57. package/lib/core/backup.d.ts +29 -0
  58. package/lib/core/backup.js +184 -0
  59. package/lib/core/backup.js.map +1 -0
  60. package/lib/core/exporter.d.ts +37 -0
  61. package/lib/core/exporter.js +222 -0
  62. package/lib/core/exporter.js.map +1 -0
  63. package/lib/core/importer.d.ts +42 -0
  64. package/lib/core/importer.js +25 -0
  65. package/lib/core/importer.js.map +1 -0
  66. package/lib/core/index.d.ts +12 -0
  67. package/lib/core/index.js +11 -0
  68. package/lib/core/index.js.map +1 -0
  69. package/lib/core/rollback.d.ts +9 -0
  70. package/lib/core/rollback.js +136 -0
  71. package/lib/core/rollback.js.map +1 -0
  72. package/lib/core/types.d.ts +331 -0
  73. package/lib/core/types.js +18 -0
  74. package/lib/core/types.js.map +1 -0
  75. package/lib/core/validator.d.ts +18 -0
  76. package/lib/core/validator.js +77 -0
  77. package/lib/core/validator.js.map +1 -0
  78. package/lib/index.d.ts +51 -0
  79. package/lib/index.js +875 -0
  80. package/lib/index.js.map +1 -0
  81. package/lib/migrations/index.d.ts +29 -0
  82. package/lib/migrations/index.js +56 -0
  83. package/lib/migrations/index.js.map +1 -0
  84. package/lib/migrations/v1-to-v2.d.ts +9 -0
  85. package/lib/migrations/v1-to-v2.js +10 -0
  86. package/lib/migrations/v1-to-v2.js.map +1 -0
  87. package/lib/profiles/index.d.ts +4 -0
  88. package/lib/profiles/index.js +5 -0
  89. package/lib/profiles/index.js.map +1 -0
  90. package/lib/profiles/profile-manager.d.ts +102 -0
  91. package/lib/profiles/profile-manager.js +522 -0
  92. package/lib/profiles/profile-manager.js.map +1 -0
  93. package/lib/schema/config.d.ts +28 -0
  94. package/lib/schema/config.js +136 -0
  95. package/lib/schema/config.js.map +1 -0
  96. package/lib/schema/manifest.d.ts +28 -0
  97. package/lib/schema/manifest.js +109 -0
  98. package/lib/schema/manifest.js.map +1 -0
  99. package/lib/schema/types.d.ts +169 -0
  100. package/lib/schema/types.js +8 -0
  101. package/lib/schema/types.js.map +1 -0
  102. package/lib/schema/versions.d.ts +27 -0
  103. package/lib/schema/versions.js +50 -0
  104. package/lib/schema/versions.js.map +1 -0
  105. package/lib/security/encryption.d.ts +41 -0
  106. package/lib/security/encryption.js +152 -0
  107. package/lib/security/encryption.js.map +1 -0
  108. package/lib/security/index.d.ts +16 -0
  109. package/lib/security/index.js +17 -0
  110. package/lib/security/index.js.map +1 -0
  111. package/lib/security/integrity.d.ts +30 -0
  112. package/lib/security/integrity.js +78 -0
  113. package/lib/security/integrity.js.map +1 -0
  114. package/lib/security/redaction.d.ts +26 -0
  115. package/lib/security/redaction.js +95 -0
  116. package/lib/security/redaction.js.map +1 -0
  117. package/lib/security/secret-scanner.d.ts +48 -0
  118. package/lib/security/secret-scanner.js +253 -0
  119. package/lib/security/secret-scanner.js.map +1 -0
  120. package/lib/security/zip-security.d.ts +27 -0
  121. package/lib/security/zip-security.js +154 -0
  122. package/lib/security/zip-security.js.map +1 -0
  123. package/lib/ui/conflict-view.d.ts +28 -0
  124. package/lib/ui/conflict-view.js +49 -0
  125. package/lib/ui/conflict-view.js.map +1 -0
  126. package/lib/ui/errors.d.ts +17 -0
  127. package/lib/ui/errors.js +76 -0
  128. package/lib/ui/errors.js.map +1 -0
  129. package/lib/ui/export-flow.d.ts +62 -0
  130. package/lib/ui/export-flow.js +79 -0
  131. package/lib/ui/export-flow.js.map +1 -0
  132. package/lib/ui/import-wizard.d.ts +67 -0
  133. package/lib/ui/import-wizard.js +169 -0
  134. package/lib/ui/import-wizard.js.map +1 -0
  135. package/lib/ui/path-mapping.d.ts +38 -0
  136. package/lib/ui/path-mapping.js +75 -0
  137. package/lib/ui/path-mapping.js.map +1 -0
  138. package/lib/ui/progress.d.ts +27 -0
  139. package/lib/ui/progress.js +76 -0
  140. package/lib/ui/progress.js.map +1 -0
  141. package/lib/ui/report.d.ts +21 -0
  142. package/lib/ui/report.js +146 -0
  143. package/lib/ui/report.js.map +1 -0
  144. package/lib/ui/test-helpers.d.ts +62 -0
  145. package/lib/ui/test-helpers.js +147 -0
  146. package/lib/ui/test-helpers.js.map +1 -0
  147. package/lib/ui/types.d.ts +129 -0
  148. package/lib/ui/types.js +21 -0
  149. package/lib/ui/types.js.map +1 -0
  150. package/lib/utils/hashing.d.ts +17 -0
  151. package/lib/utils/hashing.js +41 -0
  152. package/lib/utils/hashing.js.map +1 -0
  153. package/lib/utils/json.d.ts +24 -0
  154. package/lib/utils/json.js +76 -0
  155. package/lib/utils/json.js.map +1 -0
  156. package/lib/utils/logger.d.ts +39 -0
  157. package/lib/utils/logger.js +82 -0
  158. package/lib/utils/logger.js.map +1 -0
  159. package/lib/utils/paths.d.ts +31 -0
  160. package/lib/utils/paths.js +132 -0
  161. package/lib/utils/paths.js.map +1 -0
  162. package/lib/utils/zip.d.ts +54 -0
  163. package/lib/utils/zip.js +285 -0
  164. package/lib/utils/zip.js.map +1 -0
  165. package/package.json +109 -0
  166. package/src/adapters/agent-presets.ts +14 -0
  167. package/src/adapters/credentials.test.ts +90 -0
  168. package/src/adapters/credentials.ts +141 -0
  169. package/src/adapters/file-collection.ts +110 -0
  170. package/src/adapters/files.test.ts +113 -0
  171. package/src/adapters/index.ts +69 -0
  172. package/src/adapters/mcp.test.ts +96 -0
  173. package/src/adapters/mcp.ts +181 -0
  174. package/src/adapters/plugin-files.ts +96 -0
  175. package/src/adapters/plugins.test.ts +72 -0
  176. package/src/adapters/plugins.ts +176 -0
  177. package/src/adapters/prompts.test.ts +110 -0
  178. package/src/adapters/prompts.ts +226 -0
  179. package/src/adapters/providers.test.ts +125 -0
  180. package/src/adapters/providers.ts +161 -0
  181. package/src/adapters/roundtrip.test.ts +188 -0
  182. package/src/adapters/sessions.ts +15 -0
  183. package/src/adapters/settings.test.ts +93 -0
  184. package/src/adapters/settings.ts +165 -0
  185. package/src/adapters/skills.ts +14 -0
  186. package/src/adapters/test-helpers.ts +207 -0
  187. package/src/adapters/ui.test.ts +56 -0
  188. package/src/adapters/ui.ts +106 -0
  189. package/src/adapters/workspaces.test.ts +79 -0
  190. package/src/adapters/workspaces.ts +95 -0
  191. package/src/client/CLIENT_DEPENDENCIES.md +101 -0
  192. package/src/client/ConfigManagerSection.tsx +60 -0
  193. package/src/client/api.ts +270 -0
  194. package/src/client/client-types.ts +27 -0
  195. package/src/client/common/ErrorBanner.tsx +68 -0
  196. package/src/client/common/ProgressBar.tsx +49 -0
  197. package/src/client/common/ReportView.tsx +117 -0
  198. package/src/client/common/ui.tsx +165 -0
  199. package/src/client/config-manager.module.css +759 -0
  200. package/src/client/css-modules.d.ts +8 -0
  201. package/src/client/export/ExportView.tsx +222 -0
  202. package/src/client/import/ConflictList.tsx +72 -0
  203. package/src/client/import/ImportWizardView.tsx +406 -0
  204. package/src/client/import/PathMappingForm.tsx +77 -0
  205. package/src/client/index.ts +65 -0
  206. package/src/client/locales.ts +182 -0
  207. package/src/core/analyzer.ts +631 -0
  208. package/src/core/backup.ts +212 -0
  209. package/src/core/exporter.ts +246 -0
  210. package/src/core/importer.ts +66 -0
  211. package/src/core/index.ts +39 -0
  212. package/src/core/rollback.ts +140 -0
  213. package/src/core/smoke.test.ts +717 -0
  214. package/src/core/types.ts +343 -0
  215. package/src/core/validator.ts +84 -0
  216. package/src/index.ts +942 -0
  217. package/src/migrations/index.ts +71 -0
  218. package/src/migrations/v1-to-v2.ts +17 -0
  219. package/src/profiles/index.ts +8 -0
  220. package/src/profiles/profile-manager.test.ts +280 -0
  221. package/src/profiles/profile-manager.ts +606 -0
  222. package/src/schema/config.ts +137 -0
  223. package/src/schema/manifest.ts +124 -0
  224. package/src/schema/types.ts +179 -0
  225. package/src/schema/versions.ts +55 -0
  226. package/src/security/encryption.ts +180 -0
  227. package/src/security/index.ts +16 -0
  228. package/src/security/integrity.ts +102 -0
  229. package/src/security/redaction.ts +101 -0
  230. package/src/security/secret-scanner.ts +275 -0
  231. package/src/security/security.test.ts +796 -0
  232. package/src/security/zip-security.ts +180 -0
  233. package/src/ui/conflict-view.test.ts +62 -0
  234. package/src/ui/conflict-view.ts +65 -0
  235. package/src/ui/errors.test.ts +44 -0
  236. package/src/ui/errors.ts +95 -0
  237. package/src/ui/export-flow.test.ts +75 -0
  238. package/src/ui/export-flow.ts +128 -0
  239. package/src/ui/import-wizard.test.ts +128 -0
  240. package/src/ui/import-wizard.ts +208 -0
  241. package/src/ui/path-mapping.test.ts +67 -0
  242. package/src/ui/path-mapping.ts +103 -0
  243. package/src/ui/progress.test.ts +42 -0
  244. package/src/ui/progress.ts +90 -0
  245. package/src/ui/report.test.ts +93 -0
  246. package/src/ui/report.ts +140 -0
  247. package/src/ui/test-helpers.ts +177 -0
  248. package/src/ui/types.ts +193 -0
  249. package/src/utils/hashing.ts +53 -0
  250. package/src/utils/json.ts +77 -0
  251. package/src/utils/logger.ts +114 -0
  252. package/src/utils/paths.ts +122 -0
  253. package/src/utils/zip.ts +332 -0
@@ -0,0 +1,759 @@
1
+ /**
2
+ * Config Manager 设置页样式。全部颜色/字体/阴影走 DSH Design System 的
3
+ * --dsw-* token(跟随活动主题:亮/暗与皮肤),不另造视觉体系。
4
+ * 类名经 CSS Modules 哈希,不泄漏进 GUI 其他部分。
5
+ */
6
+
7
+ /* ---------------- section shell ---------------- */
8
+
9
+ .section {
10
+ display: flex;
11
+ flex-direction: column;
12
+ height: 100%;
13
+ min-height: 0;
14
+ gap: 10px;
15
+ color: var(--dsw-alias-label-primary);
16
+ font-family: var(--dsw-font-family);
17
+ font-size: 13px;
18
+ }
19
+
20
+ .sectionHeader {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: 10px;
24
+ flex: none;
25
+ }
26
+
27
+ .viewTabs {
28
+ display: flex;
29
+ gap: 2px;
30
+ flex: 1;
31
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
32
+ }
33
+
34
+ .viewTab {
35
+ padding: 7px 14px;
36
+ font-size: 13px;
37
+ color: var(--dsw-alias-label-secondary);
38
+ background: transparent;
39
+ border: none;
40
+ border-bottom: 2px solid transparent;
41
+ border-radius: 6px 6px 0 0;
42
+ cursor: pointer;
43
+ white-space: nowrap;
44
+ }
45
+
46
+ .viewTab:hover {
47
+ color: var(--dsw-alias-label-primary);
48
+ background: var(--dsw-alias-interactive-bg-hover);
49
+ }
50
+
51
+ .viewTab[data-active] {
52
+ color: var(--dsw-alias-label-primary);
53
+ font-weight: 600;
54
+ border-bottom-color: var(--dsw-alias-state-business-primary);
55
+ }
56
+
57
+ .sectionBody {
58
+ flex: 1;
59
+ min-height: 0;
60
+ overflow-y: auto;
61
+ display: flex;
62
+ flex-direction: column;
63
+ }
64
+
65
+ .viewBody {
66
+ display: flex;
67
+ flex-direction: column;
68
+ gap: 12px;
69
+ padding: 4px 2px 16px;
70
+ }
71
+
72
+ .iconButton {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ width: 26px;
77
+ height: 26px;
78
+ padding: 0;
79
+ background: transparent;
80
+ border: none;
81
+ border-radius: 6px;
82
+ color: var(--dsw-alias-label-secondary);
83
+ cursor: pointer;
84
+ font-size: 15px;
85
+ }
86
+
87
+ .iconButton:hover {
88
+ background: var(--dsw-alias-interactive-bg-hover);
89
+ color: var(--dsw-alias-label-primary);
90
+ }
91
+
92
+ /* ---------------- 区块标题 ---------------- */
93
+
94
+ .sectionTitleBlock {
95
+ display: flex;
96
+ flex-direction: column;
97
+ gap: 2px;
98
+ }
99
+
100
+ .sectionTitle {
101
+ margin: 0;
102
+ font-size: 15px;
103
+ font-weight: 700;
104
+ color: var(--dsw-alias-label-primary);
105
+ }
106
+
107
+ .sectionSubtitle {
108
+ margin: 0;
109
+ font-size: 12px;
110
+ color: var(--dsw-alias-label-secondary);
111
+ line-height: 1.5;
112
+ }
113
+
114
+ /* ---------------- 按钮 ---------------- */
115
+
116
+ .primaryButton {
117
+ display: inline-flex;
118
+ align-items: center;
119
+ gap: 6px;
120
+ padding: 6px 14px;
121
+ font-size: 13px;
122
+ font-weight: 600;
123
+ color: var(--dsw-alias-label-primary-foreground);
124
+ background: var(--dsw-alias-button-info-fill);
125
+ border: none;
126
+ border-radius: 8px;
127
+ cursor: pointer;
128
+ white-space: nowrap;
129
+ }
130
+
131
+ .primaryButton:hover:not(:disabled) {
132
+ background: var(--dsw-alias-button-info-hover);
133
+ }
134
+
135
+ .primaryButton:disabled {
136
+ opacity: 0.5;
137
+ cursor: default;
138
+ }
139
+
140
+ .ghostButton {
141
+ display: inline-flex;
142
+ align-items: center;
143
+ gap: 6px;
144
+ padding: 5px 12px;
145
+ font-size: 12px;
146
+ color: var(--dsw-alias-label-primary);
147
+ background: transparent;
148
+ border: 1px solid var(--dsw-alias-border-l2);
149
+ border-radius: 8px;
150
+ cursor: pointer;
151
+ white-space: nowrap;
152
+ }
153
+
154
+ .ghostButton:hover:not(:disabled) {
155
+ background: var(--dsw-alias-interactive-bg-hover);
156
+ }
157
+
158
+ .ghostButton:disabled {
159
+ opacity: 0.45;
160
+ cursor: default;
161
+ }
162
+
163
+ .dangerButton {
164
+ padding: 5px 12px;
165
+ font-size: 12px;
166
+ color: var(--dsw-alias-state-error-primary);
167
+ background: transparent;
168
+ border: 1px solid var(--dsw-alias-state-error-primary);
169
+ border-radius: 8px;
170
+ cursor: pointer;
171
+ white-space: nowrap;
172
+ }
173
+
174
+ .dangerButton:hover:not(:disabled) {
175
+ background: var(--dsw-alias-state-error-primary);
176
+ color: var(--dsw-alias-label-primary-foreground);
177
+ }
178
+
179
+ .dangerButton:disabled {
180
+ opacity: 0.45;
181
+ cursor: default;
182
+ }
183
+
184
+ /* ---------------- 徽章 / 横幅 / 卡片 ---------------- */
185
+
186
+ .badge {
187
+ display: inline-block;
188
+ padding: 1px 8px;
189
+ font-size: 11px;
190
+ line-height: 1.6;
191
+ border-radius: 999px;
192
+ border: 1px solid var(--dsw-alias-border-l2);
193
+ color: var(--dsw-alias-label-secondary);
194
+ white-space: nowrap;
195
+ }
196
+
197
+ .badgeInfo {
198
+ color: var(--dsw-alias-state-business-primary);
199
+ border-color: var(--dsw-alias-state-business-primary);
200
+ }
201
+
202
+ .badgeOk {
203
+ color: var(--dsw-alias-state-success-primary);
204
+ border-color: var(--dsw-alias-state-success-primary);
205
+ }
206
+
207
+ .badgeWarn {
208
+ color: var(--dsw-alias-state-warn-primary);
209
+ border-color: var(--dsw-alias-state-warn-primary);
210
+ }
211
+
212
+ .badgeError {
213
+ color: var(--dsw-alias-state-error-primary);
214
+ border-color: var(--dsw-alias-state-error-primary);
215
+ }
216
+
217
+ .banner {
218
+ padding: 8px 12px;
219
+ font-size: 12.5px;
220
+ line-height: 1.5;
221
+ border-radius: 8px;
222
+ border: 1px solid var(--dsw-alias-border-l2);
223
+ color: var(--dsw-alias-label-secondary);
224
+ overflow-wrap: anywhere;
225
+ }
226
+
227
+ .banner[data-kind='ok'] {
228
+ color: var(--dsw-alias-state-success-primary);
229
+ border-color: var(--dsw-alias-state-success-primary);
230
+ }
231
+
232
+ .banner[data-kind='error'] {
233
+ color: var(--dsw-alias-state-error-primary);
234
+ border-color: var(--dsw-alias-state-error-primary);
235
+ }
236
+
237
+ .banner[data-kind='info'] {
238
+ color: var(--dsw-alias-state-business-primary);
239
+ border-color: var(--dsw-alias-state-business-primary);
240
+ }
241
+
242
+ .banner[data-kind='warn'] {
243
+ color: var(--dsw-alias-state-warn-primary);
244
+ border-color: var(--dsw-alias-state-warn-primary);
245
+ }
246
+
247
+ .card {
248
+ display: flex;
249
+ flex-direction: column;
250
+ gap: 10px;
251
+ padding: 12px;
252
+ background: var(--dsw-alias-bg-layer-2);
253
+ border: 1px solid var(--dsw-alias-border-l1);
254
+ border-radius: 10px;
255
+ flex: none;
256
+ }
257
+
258
+ /* ---------------- 表单 ---------------- */
259
+
260
+ .field {
261
+ display: flex;
262
+ flex-direction: column;
263
+ gap: 5px;
264
+ }
265
+
266
+ .fieldLabel {
267
+ font-size: 12px;
268
+ font-weight: 600;
269
+ color: var(--dsw-alias-label-secondary);
270
+ }
271
+
272
+ .input {
273
+ padding: 7px 10px;
274
+ font-size: 13px;
275
+ color: var(--dsw-alias-label-primary);
276
+ background: var(--dsw-specific-input-major);
277
+ border: 1px solid var(--dsw-alias-border-l2);
278
+ border-radius: 8px;
279
+ outline: none;
280
+ resize: vertical;
281
+ font-family: inherit;
282
+ }
283
+
284
+ .input:focus {
285
+ border-color: var(--dsw-alias-state-business-primary);
286
+ }
287
+
288
+ .input::placeholder {
289
+ color: var(--dsw-alias-label-tertiary);
290
+ }
291
+
292
+ .input:disabled {
293
+ opacity: 0.55;
294
+ }
295
+
296
+ .hint {
297
+ font-size: 11.5px;
298
+ color: var(--dsw-alias-label-tertiary);
299
+ line-height: 1.5;
300
+ }
301
+
302
+ .formError {
303
+ margin: 0;
304
+ font-size: 12px;
305
+ color: var(--dsw-alias-state-error-primary);
306
+ }
307
+
308
+ .checkboxRow {
309
+ display: flex;
310
+ align-items: flex-start;
311
+ gap: 8px;
312
+ font-size: 13px;
313
+ color: var(--dsw-alias-label-primary);
314
+ cursor: pointer;
315
+ }
316
+
317
+ .checkboxRow input {
318
+ margin-top: 2px;
319
+ flex: none;
320
+ }
321
+
322
+ .radioLabel {
323
+ display: inline-flex;
324
+ gap: 6px;
325
+ align-items: center;
326
+ font-size: 13px;
327
+ color: var(--dsw-alias-label-primary);
328
+ cursor: pointer;
329
+ }
330
+
331
+ .secretFields {
332
+ display: grid;
333
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
334
+ gap: 10px 12px;
335
+ padding-top: 4px;
336
+ }
337
+
338
+ .hiddenFile {
339
+ display: none;
340
+ }
341
+
342
+ /* ---------------- 导出 ---------------- */
343
+
344
+ .modeTabs {
345
+ display: flex;
346
+ gap: 2px;
347
+ border-bottom: 1px solid var(--dsw-alias-border-l1);
348
+ flex: none;
349
+ }
350
+
351
+ .modeTab {
352
+ padding: 6px 12px;
353
+ font-size: 12.5px;
354
+ color: var(--dsw-alias-label-secondary);
355
+ background: transparent;
356
+ border: none;
357
+ border-bottom: 2px solid transparent;
358
+ cursor: pointer;
359
+ }
360
+
361
+ .modeTab:hover {
362
+ color: var(--dsw-alias-label-primary);
363
+ background: var(--dsw-alias-interactive-bg-hover);
364
+ }
365
+
366
+ .modeTab[data-active] {
367
+ color: var(--dsw-alias-label-primary);
368
+ font-weight: 600;
369
+ border-bottom-color: var(--dsw-alias-state-business-primary);
370
+ }
371
+
372
+ .modeHint {
373
+ font-size: 12px;
374
+ color: var(--dsw-alias-label-secondary);
375
+ line-height: 1.5;
376
+ }
377
+
378
+ .groupList {
379
+ display: flex;
380
+ flex-direction: column;
381
+ gap: 10px;
382
+ }
383
+
384
+ .groupCard {
385
+ gap: 8px;
386
+ }
387
+
388
+ .groupHeader {
389
+ display: flex;
390
+ align-items: baseline;
391
+ gap: 8px;
392
+ flex-wrap: wrap;
393
+ }
394
+
395
+ .groupLabel {
396
+ font-size: 12.5px;
397
+ font-weight: 700;
398
+ color: var(--dsw-alias-label-primary);
399
+ }
400
+
401
+ .groupNote {
402
+ font-size: 11.5px;
403
+ color: var(--dsw-alias-label-tertiary);
404
+ }
405
+
406
+ .groupItems {
407
+ display: flex;
408
+ flex-direction: column;
409
+ gap: 6px;
410
+ }
411
+
412
+ .categoryItem {
413
+ display: inline-flex;
414
+ align-items: center;
415
+ gap: 8px;
416
+ flex-wrap: wrap;
417
+ }
418
+
419
+ .categoryName {
420
+ font-weight: 500;
421
+ }
422
+
423
+ .categoryDesc {
424
+ font-size: 11.5px;
425
+ color: var(--dsw-alias-label-tertiary);
426
+ }
427
+
428
+ .optionsCard {
429
+ gap: 8px;
430
+ }
431
+
432
+ .warnList {
433
+ margin: 4px 0 0;
434
+ padding-left: 18px;
435
+ }
436
+
437
+ .actionRow {
438
+ display: flex;
439
+ align-items: center;
440
+ gap: 10px;
441
+ flex-wrap: wrap;
442
+ }
443
+
444
+ /* ---------------- 进度 ---------------- */
445
+
446
+ .progressBlock {
447
+ display: flex;
448
+ flex-direction: column;
449
+ gap: 6px;
450
+ flex: none;
451
+ }
452
+
453
+ .progressMeta {
454
+ display: flex;
455
+ gap: 12px;
456
+ flex-wrap: wrap;
457
+ font-size: 12px;
458
+ color: var(--dsw-alias-label-secondary);
459
+ }
460
+
461
+ .progressLabel {
462
+ font-weight: 600;
463
+ }
464
+
465
+ .progressDetail {
466
+ color: var(--dsw-alias-label-tertiary);
467
+ }
468
+
469
+ .progressPercent {
470
+ margin-left: auto;
471
+ font-variant-numeric: tabular-nums;
472
+ }
473
+
474
+ .progressTrack {
475
+ height: 8px;
476
+ border-radius: 999px;
477
+ background: var(--dsw-alias-interactive-bg-hover);
478
+ overflow: hidden;
479
+ }
480
+
481
+ .progressBar {
482
+ height: 100%;
483
+ border-radius: 999px;
484
+ background: var(--dsw-alias-state-business-primary);
485
+ transition: width 120ms linear;
486
+ }
487
+
488
+ .progressBarDone {
489
+ background: var(--dsw-alias-state-success-primary);
490
+ }
491
+
492
+ .progressIndeterminate {
493
+ width: 40%;
494
+ animation: dshCmIndeterminate 1s ease-in-out infinite;
495
+ }
496
+
497
+ @keyframes dshCmIndeterminate {
498
+ 0% { margin-left: -40%; }
499
+ 100% { margin-left: 100%; }
500
+ }
501
+
502
+ /* ---------------- 报告 ---------------- */
503
+
504
+ .reportView {
505
+ display: flex;
506
+ flex-direction: column;
507
+ gap: 10px;
508
+ }
509
+
510
+ .statRow {
511
+ display: flex;
512
+ gap: 6px;
513
+ flex-wrap: wrap;
514
+ align-items: center;
515
+ }
516
+
517
+ .reportText {
518
+ margin: 0;
519
+ padding: 10px 12px;
520
+ max-height: 260px;
521
+ overflow: auto;
522
+ background: var(--dsw-alias-bg-layer-2);
523
+ border: 1px solid var(--dsw-alias-border-l2);
524
+ border-radius: 8px;
525
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
526
+ font-size: 11.5px;
527
+ line-height: 1.6;
528
+ white-space: pre-wrap;
529
+ word-break: break-all;
530
+ color: var(--dsw-alias-label-primary);
531
+ }
532
+
533
+ .reportFooter {
534
+ display: flex;
535
+ gap: 8px;
536
+ justify-content: flex-end;
537
+ }
538
+
539
+ .rollbackBox {
540
+ display: flex;
541
+ flex-direction: column;
542
+ gap: 6px;
543
+ padding: 10px 12px;
544
+ border: 1px solid var(--dsw-alias-state-warn-primary);
545
+ border-radius: 8px;
546
+ color: var(--dsw-alias-state-warn-primary);
547
+ }
548
+
549
+ .rollbackBox .reportText {
550
+ border-color: var(--dsw-alias-border-l2);
551
+ }
552
+
553
+ /* ---------------- 错误 ---------------- */
554
+
555
+ .errorBanner {
556
+ display: flex;
557
+ flex-direction: column;
558
+ gap: 6px;
559
+ padding: 10px 12px;
560
+ border: 1px solid var(--dsw-alias-state-error-primary);
561
+ border-radius: 8px;
562
+ color: var(--dsw-alias-label-primary);
563
+ background: var(--dsw-alias-bg-layer-2);
564
+ }
565
+
566
+ .errorTitle {
567
+ font-weight: 700;
568
+ font-size: 13px;
569
+ color: var(--dsw-alias-state-error-primary);
570
+ }
571
+
572
+ .errorReason {
573
+ margin: 0;
574
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
575
+ font-size: 11.5px;
576
+ white-space: pre-wrap;
577
+ word-break: break-all;
578
+ color: var(--dsw-alias-label-secondary);
579
+ }
580
+
581
+ .errorAction {
582
+ font-size: 12.5px;
583
+ color: var(--dsw-alias-label-secondary);
584
+ }
585
+
586
+ .errorActionLabel {
587
+ color: var(--dsw-alias-state-business-primary);
588
+ }
589
+
590
+ .errorItem {
591
+ font-size: 11.5px;
592
+ color: var(--dsw-alias-label-tertiary);
593
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
594
+ }
595
+
596
+ .errorFooter {
597
+ display: flex;
598
+ justify-content: flex-end;
599
+ }
600
+
601
+ .errorList {
602
+ display: flex;
603
+ flex-direction: column;
604
+ gap: 4px;
605
+ }
606
+
607
+ .errorLine {
608
+ margin: 0;
609
+ padding: 6px 10px;
610
+ background: var(--dsw-alias-bg-layer-2);
611
+ border: 1px solid var(--dsw-alias-border-l2);
612
+ border-radius: 6px;
613
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
614
+ font-size: 11px;
615
+ white-space: pre-wrap;
616
+ word-break: break-all;
617
+ color: var(--dsw-alias-state-error-primary);
618
+ }
619
+
620
+ /* ---------------- 冲突 ---------------- */
621
+
622
+ .conflictList {
623
+ display: flex;
624
+ flex-direction: column;
625
+ gap: 10px;
626
+ }
627
+
628
+ .conflictItem {
629
+ display: flex;
630
+ flex-direction: column;
631
+ gap: 6px;
632
+ padding: 10px 12px;
633
+ background: var(--dsw-alias-bg-layer-2);
634
+ border: 1px solid var(--dsw-alias-border-l1);
635
+ border-radius: 8px;
636
+ }
637
+
638
+ .conflictHead {
639
+ display: flex;
640
+ align-items: center;
641
+ gap: 8px;
642
+ flex-wrap: wrap;
643
+ }
644
+
645
+ .conflictId {
646
+ font-size: 12.5px;
647
+ font-weight: 600;
648
+ color: var(--dsw-alias-label-primary);
649
+ }
650
+
651
+ .severityError {
652
+ font-size: 10.5px;
653
+ color: var(--dsw-alias-state-error-primary);
654
+ border: 1px solid var(--dsw-alias-state-error-primary);
655
+ border-radius: 999px;
656
+ padding: 0 6px;
657
+ }
658
+
659
+ .conflictDetail {
660
+ margin: 0;
661
+ padding: 6px 8px;
662
+ background: var(--dsw-alias-bg-base);
663
+ border: 1px solid var(--dsw-alias-border-l2);
664
+ border-radius: 6px;
665
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
666
+ font-size: 11px;
667
+ white-space: pre-wrap;
668
+ word-break: break-all;
669
+ color: var(--dsw-alias-label-secondary);
670
+ }
671
+
672
+ .conflictOptions {
673
+ display: flex;
674
+ gap: 14px;
675
+ flex-wrap: wrap;
676
+ }
677
+
678
+ /* ---------------- 路径映射 ---------------- */
679
+
680
+ .pathMappingList {
681
+ display: flex;
682
+ flex-direction: column;
683
+ gap: 8px;
684
+ }
685
+
686
+ .pathRow {
687
+ display: grid;
688
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
689
+ gap: 10px;
690
+ padding: 10px 12px;
691
+ background: var(--dsw-alias-bg-layer-2);
692
+ border: 1px solid var(--dsw-alias-border-l1);
693
+ border-radius: 8px;
694
+ }
695
+
696
+ .pathOld,
697
+ .pathNew {
698
+ display: flex;
699
+ flex-direction: column;
700
+ gap: 4px;
701
+ min-width: 0;
702
+ }
703
+
704
+ .pathValue {
705
+ margin: 0;
706
+ overflow: hidden;
707
+ text-overflow: ellipsis;
708
+ white-space: nowrap;
709
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
710
+ font-size: 11.5px;
711
+ color: var(--dsw-alias-label-primary);
712
+ }
713
+
714
+ .pathIssueKind {
715
+ font-size: 10.5px;
716
+ color: var(--dsw-alias-state-warn-primary);
717
+ }
718
+
719
+ /* ---------------- 密钥 / 空态 / spinner ---------------- */
720
+
721
+ .secretsList {
722
+ display: flex;
723
+ flex-direction: column;
724
+ gap: 10px;
725
+ }
726
+
727
+ .empty {
728
+ padding: 22px 12px;
729
+ text-align: center;
730
+ font-size: 12.5px;
731
+ color: var(--dsw-alias-label-tertiary);
732
+ }
733
+
734
+ .spinnerWrap {
735
+ display: inline-flex;
736
+ align-items: center;
737
+ gap: 6px;
738
+ }
739
+
740
+ .spinner {
741
+ display: inline-block;
742
+ width: 11px;
743
+ height: 11px;
744
+ flex: none;
745
+ border: 2px solid var(--dsw-alias-state-business-primary);
746
+ border-top-color: transparent;
747
+ border-radius: 50%;
748
+ animation: dshCmSpin 800ms linear infinite;
749
+ vertical-align: -1px;
750
+ }
751
+
752
+ .spinnerLabel {
753
+ font-size: 12px;
754
+ color: var(--dsw-alias-label-secondary);
755
+ }
756
+
757
+ @keyframes dshCmSpin {
758
+ to { transform: rotate(360deg); }
759
+ }