openfeel 1.2.4 → 1.3.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 (51) hide show
  1. package/README.en.md +40 -74
  2. package/README.md +39 -62
  3. package/README.zh-CN.md +40 -74
  4. package/dist/commands/setup.d.ts.map +1 -1
  5. package/dist/commands/setup.js +90 -5
  6. package/dist/commands/setup.js.map +1 -1
  7. package/dist/commands/update.d.ts.map +1 -1
  8. package/dist/commands/update.js +7 -2
  9. package/dist/commands/update.js.map +1 -1
  10. package/dist/core/config.js +2 -2
  11. package/dist/core/dsh-profile.d.ts +93 -0
  12. package/dist/core/dsh-profile.d.ts.map +1 -0
  13. package/dist/core/dsh-profile.js +398 -0
  14. package/dist/core/dsh-profile.js.map +1 -0
  15. package/dist/core/i18n-data/en.d.ts.map +1 -1
  16. package/dist/core/i18n-data/en.js +21 -2
  17. package/dist/core/i18n-data/en.js.map +1 -1
  18. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
  19. package/dist/core/i18n-data/zh-CN.js +21 -2
  20. package/dist/core/i18n-data/zh-CN.js.map +1 -1
  21. package/dist/core/setup.d.ts +12 -1
  22. package/dist/core/setup.d.ts.map +1 -1
  23. package/dist/core/setup.js +25 -10
  24. package/dist/core/setup.js.map +1 -1
  25. package/dist/core/template-loader.d.ts.map +1 -1
  26. package/dist/core/template-loader.js +18 -9
  27. package/dist/core/template-loader.js.map +1 -1
  28. package/dist/core/update.d.ts +2 -0
  29. package/dist/core/update.d.ts.map +1 -1
  30. package/dist/core/update.js +25 -7
  31. package/dist/core/update.js.map +1 -1
  32. package/dsh/ACTION-GUIDE.md +366 -0
  33. package/dsh/ADAPTER.md +65 -0
  34. package/dsh/README.md +264 -0
  35. package/dsh/cordis.patch.yml +26 -0
  36. package/dsh/docs/compat/commands.md +873 -0
  37. package/dsh/docs/compat/kb-skills.md +883 -0
  38. package/dsh/docs/compat/persistence.md +1013 -0
  39. package/dsh/docs/compat/pipeline.md +1565 -0
  40. package/dsh/docs/compat/req.md +1243 -0
  41. package/dsh/docs/compat/stage.md +1437 -0
  42. package/dsh/lib/adapters/cli.js +624 -0
  43. package/dsh/lib/adapters/dashboard.js +393 -0
  44. package/dsh/lib/adapters/workspace.js +150 -0
  45. package/dsh/lib/index.js +189 -0
  46. package/dsh/lib/surface/command.js +186 -0
  47. package/dsh/lib/surface/prompt.js +131 -0
  48. package/dsh/lib/tools/index.js +1245 -0
  49. package/dsh/lib/tools/shared.js +320 -0
  50. package/dsh/package.json +45 -0
  51. package/package.json +9 -2
@@ -0,0 +1,398 @@
1
+ /**
2
+ * DSH profile 部署(v1.3.0-stage-101)
3
+ *
4
+ * 职责:把 `<openfeelRoot>/dsh` 以 `link:` 依赖写进 DSH profile 的 `package.json`、
5
+ * 追加 `dsh.profile.bundles`、按需执行 `pnpm install`。领域状态仍归 OpenFeel CLI,
6
+ * 本模块只做安装编排。
7
+ *
8
+ * 边界:
9
+ * - 不 import `node:os` 的 `homedir`(统一经 `global-paths.getHomedir()`,测试单点 mock)。
10
+ * - 写前备份 / 锁序遵循既有约定:备份与 `appendUpdateInfo` 在 profile 锁**外**,
11
+ * 锁内只做「重读 → 合并 → 按需预检 → 原子写」。
12
+ * - 错误码 `DSH_*` 仅内部使用;命令层映射到既有 `INVALID_ARGUMENT` / `INTERNAL_ERROR`,
13
+ * 不新增 CLI 稳定错误码。
14
+ */
15
+ import { spawnSync } from 'node:child_process';
16
+ import { existsSync, readFileSync, readdirSync, realpathSync, statSync } from 'node:fs';
17
+ import { createRequire } from 'node:module';
18
+ import { dirname, join, resolve } from 'node:path';
19
+ import { atomicWriteFileSync } from './fs/atomic-write.js';
20
+ import { globalLockPath, withFileLock } from './fs/file-lock.js';
21
+ import { getHomedir } from './global-paths.js';
22
+ import { backupFileBeforeWrite, notifyBackupIfTTY, BackupError } from './backup.js';
23
+ import { appendUpdateInfo } from './update-infos.js';
24
+ /** profile 依赖名(与 `dsh/package.json` 的 name 一致) */
25
+ export const DSH_ADAPTER_PACKAGE = 'openfeel-dsh';
26
+ /** 内部错误 → CLI 稳定错误码的 reason 映射(命令层 detail.reason) */
27
+ const ERROR_REASON = {
28
+ DSH_HOME_NOT_FOUND: 'dsh-home-not-found',
29
+ DSH_PROFILE_NOT_FOUND: 'dsh-profile-not-found',
30
+ DSH_PROFILE_UNKNOWN: 'dsh-profile-unknown',
31
+ DSH_PROFILE_INVALID_JSON: 'dsh-profile-invalid-json',
32
+ DSH_PROFILE_NOT_DSH: 'dsh-profile-not-dsh',
33
+ DSH_PROFILE_INVALID_SHAPE: 'dsh-profile-invalid-shape',
34
+ DSH_ADAPTER_MISSING: 'dsh-adapter-missing',
35
+ DSH_PNPM_MISSING: 'dsh-pnpm-missing',
36
+ DSH_BACKUP_FAILED: 'dsh-backup-failed',
37
+ DSH_PNPM_INSTALL_FAILED: 'dsh-pnpm-install-failed',
38
+ };
39
+ /** 内部错误 */
40
+ export class DshProfileError extends Error {
41
+ code;
42
+ detail;
43
+ constructor(code, detail = {}, message) {
44
+ super(message ?? `DSH profile error: ${code}`);
45
+ this.name = 'DshProfileError';
46
+ this.code = code;
47
+ this.detail = detail;
48
+ }
49
+ }
50
+ /** 纯函数:普通对象判定 */
51
+ function isRecord(value) {
52
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
53
+ }
54
+ /** 是否为目录 */
55
+ function isDirectory(path) {
56
+ try {
57
+ return statSync(path).isDirectory();
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ /** 正斜杠路径(pnpm link spec / 输出) */
64
+ function toPosix(path) {
65
+ return path.replace(/\\/g, '/');
66
+ }
67
+ /** 锁文件安全名 */
68
+ function safeLockName(name) {
69
+ return name.replace(/[^A-Za-z0-9_.-]/g, '-');
70
+ }
71
+ /** 读取文件文本 */
72
+ function readText(path) {
73
+ return readFileSync(path, 'utf-8');
74
+ }
75
+ /** 错误消息归一 */
76
+ function messageOf(error) {
77
+ return error instanceof Error ? error.message : String(error);
78
+ }
79
+ /** 解析 profile package.json 文本(严格 JSON) */
80
+ function parseProfileJson(text, path) {
81
+ let parsed;
82
+ try {
83
+ parsed = JSON.parse(text);
84
+ }
85
+ catch (error) {
86
+ throw new DshProfileError('DSH_PROFILE_INVALID_JSON', { path, err: messageOf(error) }, `DSH profile package.json is not valid JSON: ${path}`);
87
+ }
88
+ if (!isRecord(parsed)) {
89
+ throw new DshProfileError('DSH_PROFILE_INVALID_SHAPE', { path, field: 'root' }, `DSH profile package.json is not an object: ${path}`);
90
+ }
91
+ return parsed;
92
+ }
93
+ /** 解析 DSH_HOME(env 优先,绝对化) */
94
+ export function resolveDshHome() {
95
+ const fromEnv = process.env.DSH_HOME?.trim();
96
+ if (fromEnv !== undefined && fromEnv !== '') {
97
+ return resolve(fromEnv);
98
+ }
99
+ return join(getHomedir(), '.dsh');
100
+ }
101
+ /** 列出 `<dshHome>/profiles` 下含 package.json 的 profile(按 name 排序) */
102
+ export function listDshProfiles(dshHome) {
103
+ const profilesDir = join(dshHome, 'profiles');
104
+ if (!isDirectory(profilesDir)) {
105
+ throw new DshProfileError('DSH_HOME_NOT_FOUND', { dir: profilesDir }, `DSH profiles directory not found: ${profilesDir}`);
106
+ }
107
+ const profiles = [];
108
+ for (const entry of readdirSync(profilesDir, { withFileTypes: true })) {
109
+ if (!entry.isDirectory())
110
+ continue;
111
+ const profilePath = join(profilesDir, entry.name);
112
+ const packagePath = join(profilePath, 'package.json');
113
+ if (!existsSync(packagePath))
114
+ continue;
115
+ profiles.push({ name: entry.name, path: profilePath, packagePath });
116
+ }
117
+ profiles.sort((a, b) => a.name.localeCompare(b.name));
118
+ if (profiles.length === 0) {
119
+ throw new DshProfileError('DSH_PROFILE_NOT_FOUND', { dir: profilesDir }, `No recognizable DSH profile under: ${profilesDir}`);
120
+ }
121
+ return profiles;
122
+ }
123
+ /** 按名称选择 profile;未指定则返回全部 */
124
+ export function selectDshProfiles(profiles, requested) {
125
+ const name = requested?.trim();
126
+ if (name === undefined || name === '')
127
+ return profiles;
128
+ const matched = profiles.filter((profile) => profile.name === name);
129
+ if (matched.length === 0) {
130
+ throw new DshProfileError('DSH_PROFILE_UNKNOWN', { name, available: profiles.map((profile) => profile.name) }, `DSH profile not found: ${name}`);
131
+ }
132
+ return matched;
133
+ }
134
+ /** 读取并校验 profile package.json(严格 JSON + `dsh` 配置) */
135
+ export function readDshProfilePackage(profile) {
136
+ const json = parseProfileJson(readText(profile.packagePath), profile.packagePath);
137
+ if (!isRecord(json.dsh)) {
138
+ throw new DshProfileError('DSH_PROFILE_NOT_DSH', { path: profile.packagePath }, `Not a DSH profile (missing dsh config): ${profile.packagePath}`);
139
+ }
140
+ return json;
141
+ }
142
+ /** 纯函数:计算 profile package.json 的目标状态 */
143
+ export function buildDshProfileMerge(json, adapterDir) {
144
+ if (!isRecord(json)) {
145
+ throw new DshProfileError('DSH_PROFILE_INVALID_SHAPE', { field: 'root' });
146
+ }
147
+ const next = structuredClone(json);
148
+ const changes = [];
149
+ if (!isRecord(next.dsh)) {
150
+ throw new DshProfileError('DSH_PROFILE_NOT_DSH', {});
151
+ }
152
+ const dsh = next.dsh;
153
+ if (dsh.profile === undefined) {
154
+ dsh.profile = {};
155
+ }
156
+ else if (!isRecord(dsh.profile)) {
157
+ throw new DshProfileError('DSH_PROFILE_INVALID_SHAPE', { field: 'dsh.profile' });
158
+ }
159
+ const profile = dsh.profile;
160
+ if (profile.bundles === undefined) {
161
+ profile.bundles = [];
162
+ }
163
+ else if (!Array.isArray(profile.bundles) || profile.bundles.some((item) => typeof item !== 'string')) {
164
+ throw new DshProfileError('DSH_PROFILE_INVALID_SHAPE', { field: 'dsh.profile.bundles' });
165
+ }
166
+ if (next.dependencies === undefined) {
167
+ next.dependencies = {};
168
+ }
169
+ else if (!isRecord(next.dependencies)) {
170
+ throw new DshProfileError('DSH_PROFILE_INVALID_SHAPE', { field: 'dependencies' });
171
+ }
172
+ const dependencies = next.dependencies;
173
+ const linkSpec = toLinkSpec(adapterDir);
174
+ if (dependencies[DSH_ADAPTER_PACKAGE] !== linkSpec) {
175
+ dependencies[DSH_ADAPTER_PACKAGE] = linkSpec;
176
+ changes.push('dependency');
177
+ }
178
+ const bundles = profile.bundles;
179
+ if (!bundles.includes(DSH_ADAPTER_PACKAGE)) {
180
+ bundles.push(DSH_ADAPTER_PACKAGE);
181
+ changes.push('bundle');
182
+ }
183
+ return { next, changed: changes.length > 0, changes };
184
+ }
185
+ /** `link:` 依赖 spec(正斜杠) */
186
+ export function toLinkSpec(adapterDir) {
187
+ return `link:${toPosix(adapterDir)}`;
188
+ }
189
+ /** 当前 OpenFeel 包根(src/core 与 dist/core 均指向包根) */
190
+ export function getOpenfeelRootDir() {
191
+ const require = createRequire(import.meta.url);
192
+ return dirname(require.resolve('../../package.json'));
193
+ }
194
+ /** 适配器目录(校验 dsh/package.json 的 name) */
195
+ export function getDshAdapterDir(rootDir = getOpenfeelRootDir()) {
196
+ const adapterDir = join(rootDir, 'dsh');
197
+ const packagePath = join(adapterDir, 'package.json');
198
+ if (!existsSync(packagePath)) {
199
+ throw new DshProfileError('DSH_ADAPTER_MISSING', { path: packagePath }, `DSH adapter not found: ${packagePath}`);
200
+ }
201
+ let parsed;
202
+ try {
203
+ parsed = JSON.parse(readText(packagePath));
204
+ }
205
+ catch {
206
+ throw new DshProfileError('DSH_ADAPTER_MISSING', { path: packagePath }, `DSH adapter package.json is not valid JSON: ${packagePath}`);
207
+ }
208
+ if (!isRecord(parsed) || parsed.name !== DSH_ADAPTER_PACKAGE) {
209
+ throw new DshProfileError('DSH_ADAPTER_MISSING', { path: packagePath }, `DSH adapter package name mismatch: ${packagePath}`);
210
+ }
211
+ return adapterDir;
212
+ }
213
+ /** profile 的 node_modules/openfeel-dsh 是否已指向适配器目录 */
214
+ export function isLinkValid(profileDir, adapterDir) {
215
+ const target = join(profileDir, 'node_modules', DSH_ADAPTER_PACKAGE);
216
+ try {
217
+ // Windows junction 用 realpathSync 不会解析到目标;native 版本才会。
218
+ const realpath = process.platform === 'win32' ? realpathSync.native : realpathSync;
219
+ const actual = realpath(target);
220
+ const expected = realpath(adapterDir);
221
+ if (process.platform === 'win32') {
222
+ return actual.toLowerCase() === expected.toLowerCase();
223
+ }
224
+ return actual === expected;
225
+ }
226
+ catch {
227
+ return false;
228
+ }
229
+ }
230
+ /** 预检:home → profiles → 逐个结构校验 → adapter;不预检 pnpm,零写盘 */
231
+ export function planDshDeployment(options = {}) {
232
+ const home = options.dshHome ?? resolveDshHome();
233
+ const profiles = selectDshProfiles(listDshProfiles(home), options.dshProfile);
234
+ const adapterDir = options.adapterDir ?? getDshAdapterDir(options.openfeelRoot);
235
+ for (const profile of profiles) {
236
+ const json = readDshProfilePackage(profile);
237
+ // 纯结构校验(不写盘):dependencies / dsh.profile.bundles 类型错误在预检阶段暴露
238
+ try {
239
+ buildDshProfileMerge(json, adapterDir);
240
+ }
241
+ catch (error) {
242
+ if (error instanceof DshProfileError) {
243
+ if (error.detail.path === undefined)
244
+ error.detail.path = profile.packagePath;
245
+ throw error;
246
+ }
247
+ throw error;
248
+ }
249
+ }
250
+ return { home, adapterDir, profiles };
251
+ }
252
+ /** 预检 pnpm 是否可用(仅在需要 install 时调用) */
253
+ export function resolvePnpmCommand(profileDir) {
254
+ const result = spawnSync('pnpm', ['--version'], {
255
+ shell: process.platform === 'win32',
256
+ encoding: 'utf8',
257
+ timeout: 30_000,
258
+ });
259
+ if (result.error !== undefined || result.status !== 0) {
260
+ throw new DshProfileError('DSH_PNPM_MISSING', {
261
+ command: 'pnpm',
262
+ ...(profileDir === undefined ? {} : { path: profileDir }),
263
+ err: result.error === undefined ? `exit ${result.status}` : messageOf(result.error),
264
+ }, 'pnpm not found');
265
+ }
266
+ }
267
+ /** 在 profile 目录执行 pnpm install --prefer-offline */
268
+ export function runPnpmInstall(profileDir) {
269
+ const result = spawnSync('pnpm', ['install', '--prefer-offline'], {
270
+ cwd: profileDir,
271
+ shell: process.platform === 'win32',
272
+ encoding: 'utf8',
273
+ timeout: 180_000,
274
+ env: { ...process.env, CI: '1' },
275
+ });
276
+ if (result.error === undefined && result.status === 0)
277
+ return;
278
+ const stdoutTail = (result.stdout ?? '').slice(-2000);
279
+ const stderrTail = (result.stderr ?? '').slice(-2000);
280
+ throw new DshProfileError('DSH_PNPM_INSTALL_FAILED', {
281
+ path: profileDir,
282
+ stdoutTail,
283
+ stderrTail,
284
+ manualCommand: `cd ${profileDir} && pnpm install`,
285
+ err: result.error === undefined ? `exit ${result.status}` : messageOf(result.error),
286
+ }, `pnpm install failed: ${profileDir}`);
287
+ }
288
+ /**
289
+ * 执行部署(锁外备份 → 锁内重读/合并/按需预检/写 → 解锁后 install)。
290
+ * fail-fast:任一 profile 失败即停止,已完成项写入 detail.completed。
291
+ */
292
+ export function applyDshDeployment(plan) {
293
+ const results = [];
294
+ const completed = [];
295
+ for (const profile of plan.profiles) {
296
+ let lockedOriginalText;
297
+ let wrote = false;
298
+ let backupRel;
299
+ try {
300
+ const preJson = parseProfileJson(readText(profile.packagePath), profile.packagePath);
301
+ const preMerge = buildDshProfileMerge(preJson, plan.adapterDir);
302
+ const needsInstall = preMerge.changed || !isLinkValid(profile.path, plan.adapterDir);
303
+ if (!needsInstall) {
304
+ results.push({ name: profile.name, path: profile.packagePath, action: 'skipped', install: 'skipped' });
305
+ completed.push(profile.name);
306
+ continue;
307
+ }
308
+ // 锁外备份(任何可能写入的路径都先备份,覆盖 changed 竞态)
309
+ let backup;
310
+ try {
311
+ backup = backupFileBeforeWrite(profile.packagePath, { command: 'setup' });
312
+ }
313
+ catch (error) {
314
+ throw new DshProfileError('DSH_BACKUP_FAILED', { profile: profile.name, path: profile.packagePath, err: messageOf(error), completed: [...completed] }, `DSH profile backup failed: ${profile.packagePath}`);
315
+ }
316
+ if (backup !== null) {
317
+ backupRel = backup.backupRel;
318
+ appendUpdateInfo('backed', {
319
+ absolutePath: profile.packagePath,
320
+ backupRel: backup.backupRel,
321
+ command: 'setup',
322
+ });
323
+ notifyBackupIfTTY(backup.backupRel);
324
+ }
325
+ // 锁内重读 → 合并 → 按需 pnpm 预检 → 原子写
326
+ const locked = withFileLock(globalLockPath(`dsh-profile-${safeLockName(profile.name)}`), () => {
327
+ const text = readText(profile.packagePath);
328
+ const json = parseProfileJson(text, profile.packagePath);
329
+ const merge = buildDshProfileMerge(json, plan.adapterDir);
330
+ const install = merge.changed || !isLinkValid(profile.path, plan.adapterDir);
331
+ if (install)
332
+ resolvePnpmCommand(profile.path);
333
+ if (merge.changed) {
334
+ atomicWriteFileSync(profile.packagePath, `${JSON.stringify(merge.next, null, 2)}\n`);
335
+ }
336
+ return { text, changed: merge.changed, install };
337
+ });
338
+ lockedOriginalText = locked.text;
339
+ wrote = locked.changed;
340
+ if (locked.install) {
341
+ try {
342
+ runPnpmInstall(profile.path);
343
+ }
344
+ catch (error) {
345
+ let rollbackError;
346
+ if (wrote && lockedOriginalText !== undefined) {
347
+ try {
348
+ atomicWriteFileSync(profile.packagePath, lockedOriginalText);
349
+ }
350
+ catch (rollbackErr) {
351
+ rollbackError = messageOf(rollbackErr);
352
+ }
353
+ }
354
+ appendUpdateInfo('anomaly', {
355
+ absolutePath: profile.packagePath,
356
+ note: 'dsh_install_failed_rolled_back',
357
+ });
358
+ throw new DshProfileError('DSH_PNPM_INSTALL_FAILED', {
359
+ ...(error instanceof DshProfileError ? error.detail : {}),
360
+ profile: profile.name,
361
+ path: profile.path,
362
+ completed: [...completed],
363
+ ...(rollbackError === undefined ? {} : { rollbackError }),
364
+ }, error instanceof Error ? error.message : String(error));
365
+ }
366
+ }
367
+ results.push({
368
+ name: profile.name,
369
+ path: profile.packagePath,
370
+ action: locked.changed ? 'updated' : 'skipped',
371
+ ...(backupRel === undefined ? {} : { backupRel }),
372
+ install: locked.install ? 'installed' : 'skipped',
373
+ });
374
+ completed.push(profile.name);
375
+ }
376
+ catch (error) {
377
+ if (error instanceof DshProfileError) {
378
+ if (error.detail.completed === undefined) {
379
+ error.detail.completed = [...completed];
380
+ }
381
+ throw error;
382
+ }
383
+ throw new DshProfileError('DSH_PNPM_INSTALL_FAILED', { profile: profile.name, path: profile.path, err: messageOf(error), completed: [...completed] }, messageOf(error));
384
+ }
385
+ }
386
+ return results;
387
+ }
388
+ /** 内部错误 → 命令层稳定错误码 + detail.reason(纯函数) */
389
+ export function dshErrorToCli(err) {
390
+ const internal = err.code === 'DSH_BACKUP_FAILED' || err.code === 'DSH_PNPM_INSTALL_FAILED';
391
+ return {
392
+ code: internal ? 'INTERNAL_ERROR' : 'INVALID_ARGUMENT',
393
+ detail: { reason: ERROR_REASON[err.code], ...err.detail },
394
+ };
395
+ }
396
+ /** 备份错误类型再导出(命令层测试/诊断用) */
397
+ export { BackupError };
398
+ //# sourceMappingURL=dsh-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsh-profile.js","sourceRoot":"","sources":["../../src/core/dsh-profile.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/core/i18n-data/en.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxD,eAAO,MAAM,MAAM,EAAE,UA6BpB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAmUlB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAyBlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,UAiCpB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UA8CrB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAgCnB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAoClB,CAAC;AAGF,eAAO,MAAM,SAAS,EAAE,UAiCvB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAQrB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAAe,CAAC;AAGtC,eAAO,MAAM,IAAI,EAAE,UAMlB,CAAC;AAGF,eAAO,MAAM,YAAY,EAAE,UAAe,CAAC;AAG3C,eAAO,MAAM,IAAI,EAAE,UAclB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAoUlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,UA+BpB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UA4BrB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAqBnB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAenB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAUrB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAMlB,CAAC;AAGF,eAAO,MAAM,GAAG,EAAE,UA6EjB,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAsBlE,CAAC"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/core/i18n-data/en.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxD,eAAO,MAAM,MAAM,EAAE,UA6BpB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAmUlB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAyBlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,UAkCpB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UA8CrB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAgCnB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAoClB,CAAC;AAGF,eAAO,MAAM,SAAS,EAAE,UAiCvB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAQrB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAAe,CAAC;AAGtC,eAAO,MAAM,IAAI,EAAE,UAMlB,CAAC;AAGF,eAAO,MAAM,YAAY,EAAE,UAAe,CAAC;AAG3C,eAAO,MAAM,IAAI,EAAE,UAclB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAqUlB,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,UA+BpB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UA4BrB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAqBnB,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,UAgCnB,CAAC;AAGF,eAAO,MAAM,OAAO,EAAE,UAUrB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,UAMlB,CAAC;AAGF,eAAO,MAAM,GAAG,EAAE,UA6EjB,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAsBlE,CAAC"}
@@ -396,6 +396,7 @@ export const update = {
396
396
  'claudeSettingsMergedTmpl': { key: 'update.claudeSettingsMergedTmpl', zh: '', en: '[update] Merged ~/.claude/settings.json (injected agent:"feel" and permissions.defaultMode:"auto"; existing user keys preserved; original backed up)' },
397
397
  'claudeSettingsParseSkipTmpl': { key: 'update.claudeSettingsParseSkipTmpl', zh: '', en: '[update] ~/.claude/settings.json is not strict JSON (comments or trailing comma); skipped merge, kept original: {err}' },
398
398
  'claudeSettingsWriteSkipTmpl': { key: 'update.claudeSettingsWriteSkipTmpl', zh: '', en: '[update] {err}; skipped writing ~/.claude/settings.json, continuing with remaining steps' },
399
+ 'dshNotAllowedTmpl': { key: 'update.dshNotAllowedTmpl', zh: '', en: 'update does not support dsh (the DSH adapter is a global deployment); use openfeel setup --tools dsh.' },
399
400
  };
400
401
  /* ==================== project ==================== */
401
402
  export const project = {
@@ -599,11 +600,12 @@ export const help = {
599
600
  'init.lang': { key: 'help.init.lang', zh: '', en: 'Agent prompt language (zh-CN or en), defaults to zh-CN in non-interactive mode' },
600
601
  'init.workspaceOnly': { key: 'help.init.workspaceOnly', zh: '', en: 'Create the .openfeel/ workspace only (no global rules / platform adapter config); used by Feel to auto-setup blank projects' },
601
602
  'init.nonInteractive': { key: 'help.init.nonInteractive', zh: '', en: 'Non-interactive mode (used together with --workspace-only)' },
602
- 'setup': { key: 'help.setup', zh: '', en: 'Deploy global OpenFeel framework config (global rules file + agents + skills + platform adapter config); does not create the project .openfeel/; defaults to opencode only (use --tools to add claude)' },
603
+ 'setup': { key: 'help.setup', zh: '', en: 'Deploy global OpenFeel framework config (global rules file + agents + skills + platform adapter config); does not create the project .openfeel/; defaults to opencode only (use --tools to add claude / dsh)' },
603
604
  'setup.lang': { key: 'help.setup.lang', zh: '', en: 'Agent prompt language (zh-CN or en), defaults to zh-CN' },
604
605
  'setup.check': { key: 'help.setup.check', zh: '', en: 'Diagnose whether the global deployment matches the CLI version (read-only; no deploy); exit 0 if consistent, else 1' },
605
606
  'setup.json': { key: 'help.setup.json', zh: '', en: 'Output the diagnosis as JSON (pure single JSON document with schemaVersion)' },
606
- 'setup.tools': { key: 'help.setup.tools', zh: '', en: 'Deploy target tools (comma-separated, e.g. opencode,claude; defaults to opencode only; invalid value exits 1)' },
607
+ 'setup.tools': { key: 'help.setup.tools', zh: '', en: 'Deploy target tools (comma-separated, e.g. opencode,claude,dsh; defaults to opencode only; invalid value exits 1)' },
608
+ 'setup.dshProfile': { key: 'help.setup.dshProfile', zh: '', en: 'DSH profile name (e.g. web / desktop); defaults to all detected profiles' },
607
609
  'update': { key: 'help.update', zh: '', en: 'Deploy OpenFeel adapter files to target project (interactive tool selection when no args)' },
608
610
  'update.lang': { key: 'help.update.lang', zh: '', en: 'Agent prompt language (zh-CN or en)' },
609
611
  'update.force': { key: 'help.update.force', zh: '', en: 'Skip AGENTS.md overwrite confirmation, force overwrite' },
@@ -994,6 +996,23 @@ export const setup = {
994
996
  'claudeSettingsMergedTmpl': { key: 'setup.claudeSettingsMergedTmpl', zh: '', en: '[setup] Merged ~/.claude/settings.json (injected agent:"feel" and permissions.defaultMode:"auto"; existing user keys preserved; original backed up)' },
995
997
  'claudeSettingsParseSkipTmpl': { key: 'setup.claudeSettingsParseSkipTmpl', zh: '', en: '[setup] ~/.claude/settings.json is not strict JSON (comments or trailing comma); skipped merge, kept original: {err}' },
996
998
  'claudeSettingsWriteSkipTmpl': { key: 'setup.claudeSettingsWriteSkipTmpl', zh: '', en: '[setup] {err}; skipped writing ~/.claude/settings.json, continuing with remaining steps' },
999
+ 'dshProfilesTmpl': { key: 'setup.dshProfilesTmpl', zh: '', en: 'DSH adapter: {home} ({count} profile(s))' },
1000
+ 'dshProfileUpdatedTmpl': { key: 'setup.dshProfileUpdatedTmpl', zh: '', en: ' ~ {name}: updated {path} (openfeel-dsh -> link:{adapter}; bundles += openfeel-dsh)' },
1001
+ 'dshProfileSkippedTmpl': { key: 'setup.dshProfileSkippedTmpl', zh: '', en: ' - {name}: up to date, skipped {path}' },
1002
+ 'dshInstallOkTmpl': { key: 'setup.dshInstallOkTmpl', zh: '', en: ' pnpm install completed: {path}' },
1003
+ 'dshInstallSkipTmpl': { key: 'setup.dshInstallSkipTmpl', zh: '', en: ' pnpm install skipped: dependency unchanged and link valid' },
1004
+ 'dshMultiProfileHint': { key: 'setup.dshMultiProfileHint', zh: '', en: 'Multiple DSH profiles detected ({profiles}); deploying to all. Use --dsh-profile to narrow.' },
1005
+ 'dshRestartHint': { key: 'setup.dshRestartHint', zh: '', en: 'Restart the DSH host to load the adapter (host modules are not hot-reloaded).' },
1006
+ 'dshHomeMissingTmpl': { key: 'setup.dshHomeMissingTmpl', zh: '', en: 'DSH profiles directory not found: {dir}. Install/start DSH first, or set DSH_HOME.' },
1007
+ 'dshProfileMissingTmpl': { key: 'setup.dshProfileMissingTmpl', zh: '', en: 'No recognizable DSH profile (package.json) under: {dir}.' },
1008
+ 'dshProfileUnknownTmpl': { key: 'setup.dshProfileUnknownTmpl', zh: '', en: 'DSH profile "{name}" not found; available: {profiles}.' },
1009
+ 'dshProfileInvalidJsonTmpl': { key: 'setup.dshProfileInvalidJsonTmpl', zh: '', en: 'DSH profile package.json is not valid JSON: {path} ({err}).' },
1010
+ 'dshProfileNotDshTmpl': { key: 'setup.dshProfileNotDshTmpl', zh: '', en: '{path} is not a DSH profile (missing dsh config); refusing to modify.' },
1011
+ 'dshProfileInvalidShapeTmpl': { key: 'setup.dshProfileInvalidShapeTmpl', zh: '', en: 'Invalid DSH profile shape ({field}): {path}.' },
1012
+ 'dshAdapterMissingTmpl': { key: 'setup.dshAdapterMissingTmpl', zh: '', en: 'This openfeel install does not include the DSH adapter ({path}); upgrade to >=1.3.0 or run from the repo.' },
1013
+ 'dshPnpmMissingTmpl': { key: 'setup.dshPnpmMissingTmpl', zh: '', en: 'pnpm not found; run npm i -g pnpm, or run pnpm install manually in {path}.' },
1014
+ 'dshPnpmFailedTmpl': { key: 'setup.dshPnpmFailedTmpl', zh: '', en: 'pnpm install failed ({path}); profile package.json rolled back. Retry manually: cd {path} && pnpm install.' },
1015
+ 'dshBackupFailedTmpl': { key: 'setup.dshBackupFailedTmpl', zh: '', en: 'DSH profile backup failed; write skipped: {path} ({err}).' },
997
1016
  };
998
1017
  /* ==================== metrics domain: agent performance summary (T15) ==================== */
999
1018
  export const metrics = {