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,121 @@
1
+ import { resolveNamespaces } from "./settings.js";
2
+ /** 缺省 ref 收集:遍历 settings namespace,收集 llm apiKeyEnv / providers[].apiKeyEnv,
3
+ * 以及 secrets 标记中「引用类字段」(apiKeyEnv/tokenEnv…)的字段值。
4
+ * 注意 secrets[].path[0] 是 settings 文档内的字段路径(如 ['apiKey']),本身不是凭据 ref(设计 §4.2),
5
+ * 只有指向 env 名的引用字段才值得收集。 */
6
+ export function defaultCredentialRefs(namespaces) {
7
+ return async (ctx) => {
8
+ const refs = new Set();
9
+ for (const ns of await resolveNamespaces(namespaces, ctx)) {
10
+ try {
11
+ const info = await ctx.settings.describe(ns, { redactSecrets: true });
12
+ const value = (info.value ?? {});
13
+ // 引用类字段名(值 = env/凭据引用名,非秘密本身)
14
+ const REFERENCE_REF_FIELDS = new Set([
15
+ 'apikeyenv', 'api_key_env', 'apikeyname', 'tokenenv', 'accesstokenenv',
16
+ 'refreshtokenenv', 'clientsecretenv', 'passwordenv',
17
+ ]);
18
+ for (const s of info.secrets) {
19
+ const first = s.path?.[0];
20
+ if (typeof first !== 'string' || first === '')
21
+ continue;
22
+ const norm = first.toLowerCase().replace(/[^a-z0-9]/g, '');
23
+ if (!REFERENCE_REF_FIELDS.has(norm))
24
+ continue;
25
+ const val = value[first];
26
+ if (typeof val === 'string' && val !== '')
27
+ refs.add(val);
28
+ }
29
+ if (typeof value['apiKeyEnv'] === 'string' && value['apiKeyEnv'] !== '')
30
+ refs.add(value['apiKeyEnv']);
31
+ const providers = value['providers'];
32
+ if (providers !== null && typeof providers === 'object') {
33
+ for (const pv of Object.values(providers)) {
34
+ if (pv !== null && typeof pv === 'object' && typeof pv.apiKeyEnv === 'string' && pv.apiKeyEnv !== '') {
35
+ refs.add(pv.apiKeyEnv);
36
+ }
37
+ }
38
+ }
39
+ }
40
+ catch {
41
+ // namespace 不存在则跳过
42
+ }
43
+ }
44
+ return [...refs];
45
+ };
46
+ }
47
+ export class CredentialsAdapter {
48
+ id = 'credentialsStatus';
49
+ displayName = 'Credentials';
50
+ defaultIncluded = true;
51
+ portability = 'deviceSpecific';
52
+ refs;
53
+ constructor(options = {}) {
54
+ this.refs = options.refs ?? defaultCredentialRefs(options.namespaces ?? []);
55
+ }
56
+ async export(ctx, _options) {
57
+ const credentials = [];
58
+ const warnings = [];
59
+ for (const ref of await this.refs(ctx)) {
60
+ try {
61
+ const status = await ctx.credentials.describe(ref);
62
+ credentials.push({
63
+ ref,
64
+ required: true,
65
+ configured: status.configured,
66
+ source: status.source ?? 'file',
67
+ hasValue: false, // 值未导出(安全不变量)
68
+ });
69
+ }
70
+ catch (err) {
71
+ warnings.push(`凭据 ${ref} 状态读取失败: ${err instanceof Error ? err.message : String(err)}`);
72
+ }
73
+ }
74
+ return {
75
+ sectionId: 'credentialsStatus',
76
+ data: { version: 1, credentials },
77
+ counts: { credentials: credentials.length },
78
+ warnings,
79
+ };
80
+ }
81
+ async analyzeImport(_data, _ctx) {
82
+ // MissingSecret 计划项由引擎在 createImportPlan 兜底生成(analyzer.ensureMissingSecrets),
83
+ // 依据 = 本分区里 configured=true 的凭据 → 用户补录清单。这里保持零写入纯计算。
84
+ return [];
85
+ }
86
+ async applyItem(item, ctx) {
87
+ const ref = item.target?.ref;
88
+ if (!ref)
89
+ return { ok: false, message: '缺少 target.ref' };
90
+ const value = ctx.secretInputs[ref] ?? ctx.decryptedCredentials?.get(ref);
91
+ if (value === undefined || value === '')
92
+ return { ok: false, message: '凭据值未提供(需补录)' };
93
+ await ctx.target.credentials.set(ref, value);
94
+ return { ok: true };
95
+ }
96
+ async validate(data) {
97
+ const issues = [];
98
+ if (data === null || typeof data !== 'object') {
99
+ return { valid: false, issues: [{ path: '$', message: 'credentials 数据必须是对象', severity: 'error' }] };
100
+ }
101
+ if (data.version !== 1) {
102
+ issues.push({ path: 'version', message: `version 必须为 1(收到 ${String(data.version)})`, severity: 'error' });
103
+ }
104
+ if (!Array.isArray(data.credentials)) {
105
+ issues.push({ path: 'credentials', message: 'credentials 必须是数组', severity: 'error' });
106
+ }
107
+ else {
108
+ for (const c of data.credentials) {
109
+ if (c === null || typeof c !== 'object' || typeof c.ref !== 'string' || c.ref === '') {
110
+ issues.push({ path: 'credentials[]', message: '凭据记录必须含非空 ref', severity: 'error' });
111
+ }
112
+ if (c.hasValue === true) {
113
+ // 安全不变量:普通导出恒不携带值;若备份声称有值,视为结构异常
114
+ issues.push({ path: `credentials.${c.ref}.hasValue`, message: '值未导出,hasValue 必须为 false', severity: 'error' });
115
+ }
116
+ }
117
+ }
118
+ return { valid: issues.filter((i) => i.severity === 'error').length === 0, issues };
119
+ }
120
+ }
121
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/adapters/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { FilesSection, SectionId } from '../schema/types.ts';
2
+ import type { ApplyResult, ConfigAdapter, ExportOptions, ExportSection, HostContext, ImportContext, PlanItem, Portability, ValidationResult } from '../core/types.ts';
3
+ export declare abstract class FileCollectionAdapter implements ConfigAdapter<FilesSection> {
4
+ abstract readonly id: SectionId;
5
+ abstract readonly displayName: string;
6
+ abstract readonly defaultIncluded: boolean;
7
+ abstract readonly portability: Portability;
8
+ /** 相对 homeDir 的基准目录(与 core/backup.ts FILE_BASES 一致) */
9
+ abstract readonly baseDir: string;
10
+ export(ctx: HostContext, _options: ExportOptions): Promise<ExportSection<FilesSection>>;
11
+ analyzeImport(data: FilesSection, ctx: ImportContext): Promise<PlanItem[]>;
12
+ applyItem(item: PlanItem, ctx: ImportContext): Promise<ApplyResult>;
13
+ validate(data: FilesSection): Promise<ValidationResult>;
14
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * 文件类分区共享 adapter 基类(skills / agentPresets / sessions 复用)。
3
+ * 基准目录与 core/backup.ts 的 FILE_BASES 保持一致(skills→'skills'、agentPresets→'.agent-presets'、sessions→'sessions'),
4
+ * 保证引擎通用快照/回滚(resolveFileTarget)与 applyItem 的写入路径完全一致。
5
+ *
6
+ * 文件内容以真实文件进入 ZIP(custom/skills/… 等前缀由 exporter 按 SECTION_FILE_PREFIXES 处理)。
7
+ * 幂等:相对路径 + 内容 SHA-256 hash 比对(重复导入 → Skip)。
8
+ */
9
+ import path from 'node:path';
10
+ import { sha256Hex } from "../utils/hashing.js";
11
+ export class FileCollectionAdapter {
12
+ async export(ctx, _options) {
13
+ const files = [];
14
+ const warnings = [];
15
+ let rels = [];
16
+ try {
17
+ rels = await ctx.fs.listRecursive(this.baseDir);
18
+ }
19
+ catch {
20
+ // 目录不存在视为空
21
+ }
22
+ for (const rel of rels) {
23
+ const data = await ctx.fs.readFile(rel);
24
+ const relPath = this.baseDir === '' ? rel : rel.replace(new RegExp(`^${escapeRegExp(this.baseDir)}[\\/]`), '');
25
+ files.push({ relativePath: relPath, data, contentHash: sha256Hex(data) });
26
+ }
27
+ if (rels.length === 0)
28
+ warnings.push(`${this.displayName} 目录为空或不存在`);
29
+ return {
30
+ sectionId: this.id,
31
+ data: { version: 1, files },
32
+ counts: { files: files.length },
33
+ warnings,
34
+ };
35
+ }
36
+ async analyzeImport(data, ctx) {
37
+ const items = [];
38
+ for (const file of data.files) {
39
+ const id = `${this.id}:${file.relativePath}`;
40
+ let current = null;
41
+ try {
42
+ current = await ctx.target.fs.readFile(path.join(this.baseDir, file.relativePath));
43
+ }
44
+ catch {
45
+ current = null;
46
+ }
47
+ if (current === null) {
48
+ items.push({
49
+ id, kind: 'Create', adapter: this.id,
50
+ description: `创建${this.displayName}文件 ${file.relativePath}`, severity: 'info',
51
+ target: { adapter: this.id, ref: file.relativePath },
52
+ });
53
+ }
54
+ else if (sha256Hex(current) === file.contentHash) {
55
+ items.push({ id, kind: 'Skip', adapter: this.id, description: `文件 ${file.relativePath} 已一致`, severity: 'info' });
56
+ }
57
+ else {
58
+ items.push({
59
+ id, kind: 'Conflict', adapter: this.id,
60
+ description: `文件 ${file.relativePath} 内容不同`, severity: 'warning',
61
+ target: { adapter: this.id, ref: file.relativePath },
62
+ });
63
+ }
64
+ }
65
+ return items;
66
+ }
67
+ async applyItem(item, ctx) {
68
+ const ref = item.target?.ref;
69
+ if (!ref)
70
+ return { ok: false, message: '缺少 target.ref' };
71
+ const data = ctx.sections.get(this.id);
72
+ const file = data?.files.find((f) => f.relativePath === ref);
73
+ if (!file)
74
+ return { ok: false, message: `导入数据缺少文件 ${ref}` };
75
+ await ctx.target.fs.writeFile(path.join(this.baseDir, ref), file.data);
76
+ return { ok: true };
77
+ }
78
+ async validate(data) {
79
+ const issues = [];
80
+ if (data === null || typeof data !== 'object') {
81
+ return { valid: false, issues: [{ path: '$', message: '文件分区数据必须是对象', severity: 'error' }] };
82
+ }
83
+ if (data.version !== 1) {
84
+ issues.push({ path: 'version', message: `version 必须为 1(收到 ${String(data.version)})`, severity: 'error' });
85
+ }
86
+ if (!Array.isArray(data.files)) {
87
+ issues.push({ path: 'files', message: 'files 必须是数组', severity: 'error' });
88
+ }
89
+ else {
90
+ for (const f of data.files) {
91
+ if (f === null || typeof f !== 'object' || typeof f.relativePath !== 'string' || f.relativePath === '') {
92
+ issues.push({ path: 'files[]', message: '文件记录必须含非空 relativePath', severity: 'error' });
93
+ }
94
+ }
95
+ }
96
+ return { valid: issues.filter((i) => i.severity === 'error').length === 0, issues };
97
+ }
98
+ }
99
+ function escapeRegExp(s) {
100
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
101
+ }
102
+ //# sourceMappingURL=file-collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-collection.js","sourceRoot":"","sources":["../../src/adapters/file-collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 适配器 registry(设计 §12.1 / §3.3):
3
+ * 组装全部 ConfigAdapter(导出顺序参考 APPLY_ORDER:settings → ui → providers → prompts
4
+ * → skills → agentPresets → workspaces → pluginFiles → mcp → plugins → credentialsStatus)。
5
+ *
6
+ * 明确不实现的 adapter(研究报告 §2.2 确认 DSH 无对应概念):keybindings / workflows / commands / rules ——
7
+ * manifest 中不出现这些 section,产品 UI 说明「DSH 当前无此配置」。
8
+ */
9
+ import type { ConfigAdapter } from '../core/types.ts';
10
+ import { type NamespaceProvider } from './settings.ts';
11
+ import { type CredentialRefsProvider } from './credentials.ts';
12
+ export interface AdapterRegistryOptions {
13
+ /** settings namespace 清单(宿主从 settings.yaml 顶层 key 解析注入;缺省 [] → settings/ui/credentials 为空) */
14
+ namespaces?: string[] | NamespaceProvider;
15
+ /** 凭据 ref 收集器(缺省从 settings secrets 标记 + llm apiKeyEnv 推断) */
16
+ credentialsRefs?: CredentialRefsProvider;
17
+ /** pluginFiles 白名单(相对 ~/.dsh 根;缺省 dsh-ssh.json + pet.json) */
18
+ pluginFiles?: string[];
19
+ /** 是否包含 sessions 分区(默认关,研究报告 §4.9) */
20
+ includeSessions?: boolean;
21
+ }
22
+ /** 组装默认 adapter 列表(pluginFiles/sessions 恒挂载但 defaultIncluded=false,用户勾选才导出) */
23
+ export declare function createAdapters(options?: AdapterRegistryOptions): ConfigAdapter[];
24
+ export type { NamespaceProvider } from './settings.ts';
25
+ export type { CredentialRefsProvider } from './credentials.ts';
26
+ export { SettingsAdapter } from './settings.ts';
27
+ export { UiAdapter, isUiNamespace, KNOWN_UI_NAMESPACE_PREFIXES, UI_MIGRATION_NOTES } from './ui.ts';
28
+ export { ProvidersAdapter, DEFAULT_PROVIDER_NAMESPACES, type ProviderExportEntry, type ProviderExportSection } from './providers.ts';
29
+ export { PluginsAdapter, USER_PATCH_FILE } from './plugins.ts';
30
+ export { McpAdapter, extractMcpServers, buildMcpPatchLine, type McpExportEntry, type McpExportSection } from './mcp.ts';
31
+ export { PromptsAdapter, extractPrompts, mergePromptIntoLine, buildPromptLine, type PromptExportEntry, type PromptsExportSection } from './prompts.ts';
32
+ export { SkillsAdapter } from './skills.ts';
33
+ export { AgentPresetsAdapter } from './agent-presets.ts';
34
+ export { WorkspacesAdapter } from './workspaces.ts';
35
+ export { CredentialsAdapter, defaultCredentialRefs } from './credentials.ts';
36
+ export { PluginFilesAdapter, DEFAULT_PLUGIN_FILE_WHITELIST } from './plugin-files.ts';
37
+ export { SessionsAdapter } from './sessions.ts';
38
+ export { FileCollectionAdapter } from './file-collection.ts';
@@ -0,0 +1,46 @@
1
+ import { SettingsAdapter } from "./settings.js";
2
+ import { UiAdapter } from "./ui.js";
3
+ import { ProvidersAdapter } from "./providers.js";
4
+ import { PluginsAdapter } from "./plugins.js";
5
+ import { McpAdapter } from "./mcp.js";
6
+ import { PromptsAdapter } from "./prompts.js";
7
+ import { SkillsAdapter } from "./skills.js";
8
+ import { AgentPresetsAdapter } from "./agent-presets.js";
9
+ import { WorkspacesAdapter } from "./workspaces.js";
10
+ import { CredentialsAdapter } from "./credentials.js";
11
+ import { PluginFilesAdapter } from "./plugin-files.js";
12
+ import { SessionsAdapter } from "./sessions.js";
13
+ /** 组装默认 adapter 列表(pluginFiles/sessions 恒挂载但 defaultIncluded=false,用户勾选才导出) */
14
+ export function createAdapters(options = {}) {
15
+ const namespaces = options.namespaces ?? [];
16
+ const adapters = [
17
+ new SettingsAdapter(namespaces),
18
+ new UiAdapter(namespaces),
19
+ new ProvidersAdapter(),
20
+ new PluginsAdapter(),
21
+ new McpAdapter(),
22
+ new PromptsAdapter(),
23
+ new SkillsAdapter(),
24
+ new AgentPresetsAdapter(),
25
+ new WorkspacesAdapter(),
26
+ new CredentialsAdapter({ namespaces, refs: options.credentialsRefs }),
27
+ new PluginFilesAdapter(options.pluginFiles),
28
+ ];
29
+ if (options.includeSessions)
30
+ adapters.push(new SessionsAdapter());
31
+ return adapters;
32
+ }
33
+ export { SettingsAdapter } from "./settings.js";
34
+ export { UiAdapter, isUiNamespace, KNOWN_UI_NAMESPACE_PREFIXES, UI_MIGRATION_NOTES } from "./ui.js";
35
+ export { ProvidersAdapter, DEFAULT_PROVIDER_NAMESPACES } from "./providers.js";
36
+ export { PluginsAdapter, USER_PATCH_FILE } from "./plugins.js";
37
+ export { McpAdapter, extractMcpServers, buildMcpPatchLine } from "./mcp.js";
38
+ export { PromptsAdapter, extractPrompts, mergePromptIntoLine, buildPromptLine } from "./prompts.js";
39
+ export { SkillsAdapter } from "./skills.js";
40
+ export { AgentPresetsAdapter } from "./agent-presets.js";
41
+ export { WorkspacesAdapter } from "./workspaces.js";
42
+ export { CredentialsAdapter, defaultCredentialRefs } from "./credentials.js";
43
+ export { PluginFilesAdapter, DEFAULT_PLUGIN_FILE_WHITELIST } from "./plugin-files.js";
44
+ export { SessionsAdapter } from "./sessions.js";
45
+ export { FileCollectionAdapter } from "./file-collection.js";
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAA0B,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAA+B,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAahD,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,UAAkC,EAAE;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAoB;QAChC,IAAI,eAAe,CAAC,UAAU,CAAC;QAC/B,IAAI,SAAS,CAAC,UAAU,CAAC;QACzB,IAAI,gBAAgB,EAAE;QACtB,IAAI,cAAc,EAAE;QACpB,IAAI,UAAU,EAAE;QAChB,IAAI,cAAc,EAAE;QACpB,IAAI,aAAa,EAAE;QACnB,IAAI,mBAAmB,EAAE;QACzB,IAAI,iBAAiB,EAAE;QACvB,IAAI,kBAAkB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;QACrE,IAAI,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC;KAC5C,CAAC;IACF,IAAI,OAAO,CAAC,eAAe;QAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAKD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAwD,MAAM,gBAAgB,CAAC;AACrI,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAA8C,MAAM,UAAU,CAAC;AACxH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAqD,MAAM,cAAc,CAAC;AACvJ,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { McpServerEntry } from '../schema/types.ts';
2
+ import type { ApplyResult, ConfigAdapter, ExportOptions, ExportSection, HostContext, ImportContext, PlanItem, ValidationResult } from '../core/types.ts';
3
+ /** 导出记录:McpServerEntry 之外附加来源 patch 行 id(导入写回定位用) */
4
+ export interface McpExportEntry extends McpServerEntry {
5
+ sourceLineId: string;
6
+ }
7
+ export interface McpExportSection {
8
+ version: 1;
9
+ servers: McpExportEntry[];
10
+ }
11
+ /** 从 patch 行数组中提取 MCP server 条目(以 config.serverName 存在为判定) */
12
+ export declare function extractMcpServers(lines: {
13
+ lineId: string;
14
+ raw: unknown;
15
+ }[]): McpExportEntry[];
16
+ /** 由导出条目构造写回 patch 行 raw(单行形态,与 dsh-mcp-client 组合 config 语义一致) */
17
+ export declare function buildMcpPatchLine(lineId: string, server: McpServerEntry): Record<string, unknown>;
18
+ export declare class McpAdapter implements ConfigAdapter<McpExportSection> {
19
+ readonly id: "mcp";
20
+ readonly displayName = "MCP Servers";
21
+ readonly defaultIncluded = true;
22
+ readonly portability: "platformSpecific";
23
+ export(ctx: HostContext, _options: ExportOptions): Promise<ExportSection<McpExportSection>>;
24
+ analyzeImport(data: McpExportSection, ctx: ImportContext): Promise<PlanItem[]>;
25
+ applyItem(item: PlanItem, ctx: ImportContext): Promise<ApplyResult>;
26
+ validate(data: McpExportSection): Promise<ValidationResult>;
27
+ }
@@ -0,0 +1,175 @@
1
+ /**
2
+ * mcp 分区 adapter(设计 §3.3/§1.2/§15):
3
+ * 数据源 = 组合 patch 中 dsh-mcp-client 行的 config(研究报告 §2.2:MCP 无 settings 面/无管理 API)。
4
+ * 导入 = 写 profile cordis.patch.yml 插行(needsRestart 生效);依赖检测(npx 等)由 analyzer 的
5
+ * dependencyChecker 执行(§15:缺失不阻塞,标记 Requires Attention)。
6
+ *
7
+ * patch 行 raw 支持两种形态:单行 { id, name, config } 与块 { insert: [{ id, name, config }] }。
8
+ */
9
+ import { isDeepStrictEqual } from 'node:util';
10
+ import { USER_PATCH_FILE } from "./plugins.js";
11
+ /** 从 patch 行数组中提取 MCP server 条目(以 config.serverName 存在为判定) */
12
+ export function extractMcpServers(lines) {
13
+ const servers = [];
14
+ for (const line of lines) {
15
+ for (const entry of entriesOf(line.raw)) {
16
+ const config = entry.config;
17
+ if (config === null || typeof config !== 'object')
18
+ continue;
19
+ const c = config;
20
+ const serverName = c['serverName'];
21
+ if (typeof serverName !== 'string' || serverName === '')
22
+ continue;
23
+ const type = typeof c['url'] === 'string' && c['url'] !== '' ? 'streamable-http' : 'stdio';
24
+ servers.push({
25
+ serverName,
26
+ type,
27
+ command: typeof c['command'] === 'string' ? c['command'] : undefined,
28
+ args: Array.isArray(c['args']) ? c['args'] : undefined,
29
+ env: c['env'] !== null && typeof c['env'] === 'object' ? c['env'] : undefined,
30
+ cwd: typeof c['cwd'] === 'string' ? c['cwd'] : undefined,
31
+ url: typeof c['url'] === 'string' ? c['url'] : undefined,
32
+ headers: c['headers'] !== null && typeof c['headers'] === 'object' ? c['headers'] : undefined,
33
+ sourceLineId: line.lineId,
34
+ });
35
+ }
36
+ }
37
+ return servers;
38
+ }
39
+ /** patch 行 → 可枚举的 entry 列表(兼容单行与 insert 块) */
40
+ function entriesOf(raw) {
41
+ if (raw === null || typeof raw !== 'object')
42
+ return [];
43
+ const obj = raw;
44
+ if (Array.isArray(obj['insert'])) {
45
+ return obj['insert']
46
+ .filter((e) => e !== null && typeof e === 'object')
47
+ .map((e) => e);
48
+ }
49
+ if (obj['id'] !== undefined || obj['name'] !== undefined) {
50
+ return [obj];
51
+ }
52
+ return [];
53
+ }
54
+ /** 由导出条目构造写回 patch 行 raw(单行形态,与 dsh-mcp-client 组合 config 语义一致) */
55
+ export function buildMcpPatchLine(lineId, server) {
56
+ const config = { serverName: server.serverName };
57
+ if (server.type === 'streamable-http') {
58
+ config['url'] = server.url;
59
+ if (server.headers !== undefined)
60
+ config['headers'] = server.headers;
61
+ }
62
+ else {
63
+ config['command'] = server.command;
64
+ if (server.args !== undefined)
65
+ config['args'] = server.args;
66
+ if (server.env !== undefined)
67
+ config['env'] = server.env;
68
+ if (server.cwd !== undefined)
69
+ config['cwd'] = server.cwd;
70
+ }
71
+ return { id: lineId, name: 'dsh-mcp-client', config };
72
+ }
73
+ function newLineId(serverName) {
74
+ const slug = serverName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
75
+ return `mcp-${slug || 'server'}`;
76
+ }
77
+ export class McpAdapter {
78
+ id = 'mcp';
79
+ displayName = 'MCP Servers';
80
+ defaultIncluded = true;
81
+ portability = 'platformSpecific';
82
+ async export(ctx, _options) {
83
+ const warnings = [];
84
+ let lines = [];
85
+ try {
86
+ lines = await ctx.patchFile.readPatchLines(USER_PATCH_FILE);
87
+ }
88
+ catch (err) {
89
+ warnings.push(`patch 文件读取失败,无法提取 MCP: ${err instanceof Error ? err.message : String(err)}`);
90
+ }
91
+ const servers = extractMcpServers(lines);
92
+ return {
93
+ sectionId: 'mcp',
94
+ data: { version: 1, servers },
95
+ counts: { servers: servers.length },
96
+ warnings,
97
+ };
98
+ }
99
+ async analyzeImport(data, ctx) {
100
+ const items = [];
101
+ const targetLines = await ctx.target.patchFile.readPatchLines(USER_PATCH_FILE);
102
+ const targetServers = extractMcpServers(targetLines);
103
+ for (const server of data.servers) {
104
+ const id = `mcp:${server.serverName}`;
105
+ const existing = targetServers.find((s) => s.serverName === server.serverName);
106
+ const comparable = { ...server };
107
+ delete comparable.sourceLineId;
108
+ if (!existing) {
109
+ const lineId = server.sourceLineId && targetLines.some((l) => l.lineId === server.sourceLineId)
110
+ ? `${server.sourceLineId}-imported`
111
+ : (server.sourceLineId ?? newLineId(server.serverName));
112
+ items.push({
113
+ id, kind: 'Create', adapter: 'mcp',
114
+ description: `创建 MCP server ${server.serverName}`,
115
+ detail: `${server.type === 'stdio' ? `${server.command} ${(server.args ?? []).join(' ')}` : server.url}`,
116
+ severity: 'info',
117
+ target: { adapter: 'mcp', ref: lineId },
118
+ });
119
+ }
120
+ else {
121
+ const existingComparable = { ...existing };
122
+ delete existingComparable.sourceLineId;
123
+ if (isDeepStrictEqual(existingComparable, comparable)) {
124
+ items.push({ id, kind: 'Skip', adapter: 'mcp', description: `MCP server ${server.serverName} 已一致`, severity: 'info' });
125
+ }
126
+ else {
127
+ items.push({
128
+ id, kind: 'Conflict', adapter: 'mcp',
129
+ description: `MCP server ${server.serverName} 与目标不同`,
130
+ detail: `current=${JSON.stringify(existingComparable)} imported=${JSON.stringify(comparable)}`.slice(0, 200),
131
+ severity: 'warning',
132
+ target: { adapter: 'mcp', ref: existing.sourceLineId },
133
+ });
134
+ }
135
+ }
136
+ }
137
+ return items;
138
+ }
139
+ async applyItem(item, ctx) {
140
+ const serverName = item.id.replace(/^mcp:/, '');
141
+ const data = ctx.sections.get('mcp');
142
+ const server = data?.servers.find((s) => s.serverName === serverName);
143
+ if (!server)
144
+ return { ok: false, message: `导入数据缺少 MCP server ${serverName}` };
145
+ const ref = item.target?.ref;
146
+ if (!ref)
147
+ return { ok: false, message: '缺少 target.ref' };
148
+ const raw = buildMcpPatchLine(ref, server);
149
+ await ctx.target.patchFile.applyPatchChanges(USER_PATCH_FILE, [
150
+ { lineId: ref, raw, action: item.kind === 'Create' ? 'insert' : 'update' },
151
+ ]);
152
+ return { ok: true, needsRestart: true, message: `MCP server ${serverName} 已写入 patch,重启后生效` };
153
+ }
154
+ async validate(data) {
155
+ const issues = [];
156
+ if (data === null || typeof data !== 'object') {
157
+ return { valid: false, issues: [{ path: '$', message: 'mcp 数据必须是对象', severity: 'error' }] };
158
+ }
159
+ if (data.version !== 1) {
160
+ issues.push({ path: 'version', message: `version 必须为 1(收到 ${String(data.version)})`, severity: 'error' });
161
+ }
162
+ if (!Array.isArray(data.servers)) {
163
+ issues.push({ path: 'servers', message: 'servers 必须是数组', severity: 'error' });
164
+ }
165
+ else {
166
+ for (const s of data.servers) {
167
+ if (s === null || typeof s !== 'object' || typeof s.serverName !== 'string' || s.serverName === '') {
168
+ issues.push({ path: 'servers[]', message: 'server 记录必须含非空 serverName', severity: 'error' });
169
+ }
170
+ }
171
+ }
172
+ return { valid: issues.filter((i) => i.severity === 'error').length === 0, issues };
173
+ }
174
+ }
175
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/adapters/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { FilesSection } from '../schema/types.ts';
2
+ import type { ApplyResult, ConfigAdapter, ExportOptions, ExportSection, HostContext, ImportContext, PlanItem, ValidationResult } from '../core/types.ts';
3
+ export declare const DEFAULT_PLUGIN_FILE_WHITELIST: readonly string[];
4
+ export declare class PluginFilesAdapter implements ConfigAdapter<FilesSection> {
5
+ readonly id: "pluginFiles";
6
+ readonly displayName = "Plugin Files";
7
+ readonly defaultIncluded = false;
8
+ readonly portability: "deviceSpecific";
9
+ private readonly whitelist;
10
+ constructor(whitelist?: string[]);
11
+ export(ctx: HostContext, _options: ExportOptions): Promise<ExportSection<FilesSection>>;
12
+ analyzeImport(data: FilesSection, ctx: ImportContext): Promise<PlanItem[]>;
13
+ applyItem(item: PlanItem, ctx: ImportContext): Promise<ApplyResult>;
14
+ validate(data: FilesSection): Promise<ValidationResult>;
15
+ }