@fractalizer/mcp-cli 0.3.18 → 1.0.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 (120) hide show
  1. package/README.md +158 -266
  2. package/dist/commands/connect.command.d.ts +18 -15
  3. package/dist/commands/connect.command.d.ts.map +1 -1
  4. package/dist/commands/connect.command.js +66 -40
  5. package/dist/commands/connect.command.js.map +1 -1
  6. package/dist/commands/disconnect.command.d.ts +5 -17
  7. package/dist/commands/disconnect.command.d.ts.map +1 -1
  8. package/dist/commands/disconnect.command.js +4 -15
  9. package/dist/commands/disconnect.command.js.map +1 -1
  10. package/dist/commands/doctor.command.d.ts +34 -0
  11. package/dist/commands/doctor.command.d.ts.map +1 -0
  12. package/dist/commands/doctor.command.js +321 -0
  13. package/dist/commands/doctor.command.js.map +1 -0
  14. package/dist/commands/index.d.ts +1 -0
  15. package/dist/commands/index.d.ts.map +1 -1
  16. package/dist/commands/index.js +2 -0
  17. package/dist/commands/index.js.map +1 -1
  18. package/dist/commands/list.command.d.ts +4 -9
  19. package/dist/commands/list.command.d.ts.map +1 -1
  20. package/dist/commands/list.command.js +1 -5
  21. package/dist/commands/list.command.js.map +1 -1
  22. package/dist/commands/status.command.d.ts +6 -13
  23. package/dist/commands/status.command.d.ts.map +1 -1
  24. package/dist/commands/status.command.js +15 -12
  25. package/dist/commands/status.command.js.map +1 -1
  26. package/dist/commands/validate.command.d.ts +6 -11
  27. package/dist/commands/validate.command.d.ts.map +1 -1
  28. package/dist/commands/validate.command.js +15 -19
  29. package/dist/commands/validate.command.js.map +1 -1
  30. package/dist/connectors/base/base-connector.d.ts +31 -55
  31. package/dist/connectors/base/base-connector.d.ts.map +1 -1
  32. package/dist/connectors/base/base-connector.js +71 -57
  33. package/dist/connectors/base/base-connector.js.map +1 -1
  34. package/dist/connectors/base/configurable-connector.d.ts +89 -24
  35. package/dist/connectors/base/configurable-connector.d.ts.map +1 -1
  36. package/dist/connectors/base/configurable-connector.js +266 -23
  37. package/dist/connectors/base/configurable-connector.js.map +1 -1
  38. package/dist/connectors/base/connector.interface.d.ts +29 -20
  39. package/dist/connectors/base/connector.interface.d.ts.map +1 -1
  40. package/dist/connectors/base/index.d.ts +0 -1
  41. package/dist/connectors/base/index.d.ts.map +1 -1
  42. package/dist/connectors/base/index.js +0 -1
  43. package/dist/connectors/base/index.js.map +1 -1
  44. package/dist/connectors/claude-code/claude-code.connector.d.ts +100 -21
  45. package/dist/connectors/claude-code/claude-code.connector.d.ts.map +1 -1
  46. package/dist/connectors/claude-code/claude-code.connector.js +221 -40
  47. package/dist/connectors/claude-code/claude-code.connector.js.map +1 -1
  48. package/dist/connectors/connector-factory.d.ts +15 -15
  49. package/dist/connectors/connector-factory.d.ts.map +1 -1
  50. package/dist/connectors/connector-factory.js +61 -18
  51. package/dist/connectors/connector-factory.js.map +1 -1
  52. package/dist/connectors/index.d.ts +0 -4
  53. package/dist/connectors/index.d.ts.map +1 -1
  54. package/dist/connectors/index.js +2 -8
  55. package/dist/connectors/index.js.map +1 -1
  56. package/dist/connectors/registry.d.ts +20 -27
  57. package/dist/connectors/registry.d.ts.map +1 -1
  58. package/dist/connectors/registry.js +34 -34
  59. package/dist/connectors/registry.js.map +1 -1
  60. package/dist/tsconfig.tsbuildinfo +1 -1
  61. package/dist/types/{base.types.d.ts → client.types.d.ts} +30 -30
  62. package/dist/types/client.types.d.ts.map +1 -0
  63. package/dist/types/client.types.js +6 -0
  64. package/dist/types/client.types.js.map +1 -0
  65. package/dist/types/doctor.types.d.ts +91 -0
  66. package/dist/types/doctor.types.d.ts.map +1 -0
  67. package/dist/types/doctor.types.js +12 -0
  68. package/dist/types/doctor.types.js.map +1 -0
  69. package/dist/types/launch.types.d.ts +59 -0
  70. package/dist/types/launch.types.d.ts.map +1 -0
  71. package/dist/types/launch.types.js +6 -0
  72. package/dist/types/launch.types.js.map +1 -0
  73. package/dist/types.d.ts +23 -14
  74. package/dist/types.d.ts.map +1 -1
  75. package/dist/types.js +9 -2
  76. package/dist/types.js.map +1 -1
  77. package/dist/utils/command-executor.d.ts +39 -3
  78. package/dist/utils/command-executor.d.ts.map +1 -1
  79. package/dist/utils/command-executor.js +95 -8
  80. package/dist/utils/command-executor.js.map +1 -1
  81. package/dist/utils/config-manager.d.ts +25 -42
  82. package/dist/utils/config-manager.d.ts.map +1 -1
  83. package/dist/utils/config-manager.js +21 -49
  84. package/dist/utils/config-manager.js.map +1 -1
  85. package/dist/utils/index.d.ts +1 -0
  86. package/dist/utils/index.d.ts.map +1 -1
  87. package/dist/utils/index.js +1 -0
  88. package/dist/utils/index.js.map +1 -1
  89. package/dist/utils/interactive-prompter.d.ts +16 -64
  90. package/dist/utils/interactive-prompter.d.ts.map +1 -1
  91. package/dist/utils/interactive-prompter.js +12 -65
  92. package/dist/utils/interactive-prompter.js.map +1 -1
  93. package/dist/utils/launch-spec-helpers.d.ts +38 -0
  94. package/dist/utils/launch-spec-helpers.d.ts.map +1 -0
  95. package/dist/utils/launch-spec-helpers.js +131 -0
  96. package/dist/utils/launch-spec-helpers.js.map +1 -0
  97. package/package.json +2 -2
  98. package/dist/connectors/base/file-based-connector.d.ts +0 -97
  99. package/dist/connectors/base/file-based-connector.d.ts.map +0 -1
  100. package/dist/connectors/base/file-based-connector.js +0 -185
  101. package/dist/connectors/base/file-based-connector.js.map +0 -1
  102. package/dist/connectors/claude-desktop/claude-desktop.connector.d.ts +0 -38
  103. package/dist/connectors/claude-desktop/claude-desktop.connector.d.ts.map +0 -1
  104. package/dist/connectors/claude-desktop/claude-desktop.connector.js +0 -68
  105. package/dist/connectors/claude-desktop/claude-desktop.connector.js.map +0 -1
  106. package/dist/connectors/codex/codex.connector.d.ts +0 -51
  107. package/dist/connectors/codex/codex.connector.d.ts.map +0 -1
  108. package/dist/connectors/codex/codex.connector.js +0 -76
  109. package/dist/connectors/codex/codex.connector.js.map +0 -1
  110. package/dist/connectors/gemini/gemini.connector.d.ts +0 -41
  111. package/dist/connectors/gemini/gemini.connector.d.ts.map +0 -1
  112. package/dist/connectors/gemini/gemini.connector.js +0 -61
  113. package/dist/connectors/gemini/gemini.connector.js.map +0 -1
  114. package/dist/connectors/qwen/qwen.connector.d.ts +0 -41
  115. package/dist/connectors/qwen/qwen.connector.d.ts.map +0 -1
  116. package/dist/connectors/qwen/qwen.connector.js +0 -61
  117. package/dist/connectors/qwen/qwen.connector.js.map +0 -1
  118. package/dist/types/base.types.d.ts.map +0 -1
  119. package/dist/types/base.types.js +0 -6
  120. package/dist/types/base.types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../src/utils/command-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,eAAe;IAC1B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,IAAI,CAAC,OAAe;QACzB,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,UAAU,CAAC,OAAe;QAC/B,IAAI,CAAC;YACH,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,IAAc;QAC1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAEzD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAe;QACvC,IAAI,CAAC;YACH,QAAQ,CAAC,SAAS,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../src/utils/command-executor.ts"],"names":[],"mappings":"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"}
@@ -2,74 +2,57 @@
2
2
  * Generic менеджер конфигурации MCP сервера
3
3
  * @packageDocumentation
4
4
  */
5
- import type { BaseMCPServerConfig, ConfigManagerOptions } from '../types/base.types.js';
5
+ import type { ConfigManagerOptions } from '../types/client.types.js';
6
6
  /**
7
- * Generic менеджер конфигурации MCP сервера
7
+ * Generic менеджер конфигурации MCP сервера.
8
8
  *
9
- * Сохраняет только безопасные поля (без секретов) в ~/.{projectName}/config.json
9
+ * Хранит конфигурацию в `~/.{projectName}/config.json`. Адаптер ОБЯЗАН передать
10
+ * `options.serialize` — это явное решение, какие поля сохранять (защита от
11
+ * случайной утечки секретов).
10
12
  *
11
13
  * @example
12
14
  * ```typescript
13
- * // Определяем свою конфигурацию
14
- * interface YandexTrackerMCPConfig extends BaseMCPServerConfig {
15
- * token: string; // СЕКРЕТ - не сохраняется
16
- * orgId: string; // Безопасно - сохраняется
17
- * apiBase?: string; // Безопасно - сохраняется
18
- * }
15
+ * interface YtConfig { token: string; orgId: string; apiBase?: string }
19
16
  *
20
- * // Создаем ConfigManager
21
- * const configManager = new ConfigManager<YandexTrackerMCPConfig>({
17
+ * const cm = new ConfigManager<YtConfig>({
22
18
  * projectName: 'fractalizer_mcp_yandex_tracker',
23
- *
24
- * // Список безопасных полей (БЕЗ token!)
25
- * safeFields: ['orgId', 'apiBase', 'logLevel', 'projectPath'],
26
- * });
27
- *
28
- * // Сохранение конфигурации
29
- * await configManager.save({
30
- * token: 'secret-token',
31
- * orgId: 'my-org',
32
- * projectPath: '/path/to/project',
33
- * logLevel: 'info',
19
+ * // serialize-хук явно исключает секреты:
20
+ * serialize: (cfg) => ({ orgId: cfg.orgId, apiBase: cfg.apiBase }),
34
21
  * });
35
22
  *
36
- * // Загрузка конфигурации
37
- * const saved = await configManager.load();
38
- * // saved = { orgId: 'my-org', logLevel: 'info', projectPath: '/path/to/project' }
39
- * // token НЕ сохранен и будет запрошен заново
23
+ * await cm.save({ token: 's3cr3t', orgId: 'org-1' });
24
+ * const saved = await cm.load(); // { orgId: 'org-1' }
40
25
  * ```
41
26
  */
42
- export declare class ConfigManager<TConfig extends BaseMCPServerConfig> {
27
+ export declare class ConfigManager<TDomainConfig extends object> {
43
28
  private readonly options;
44
29
  private readonly configPath;
45
- constructor(options: ConfigManagerOptions<TConfig>);
30
+ constructor(options: ConfigManagerOptions<TDomainConfig>);
46
31
  /**
47
- * Загрузить сохраненную конфигурацию
32
+ * Загрузить сохранённую конфигурацию.
48
33
  *
49
- * @returns Partial конфигурацию (только безопасные поля) или undefined если файл не существует
34
+ * @returns Partial конфигурацию или `undefined`, если файл не существует.
50
35
  */
51
- load(): Promise<Partial<TConfig> | undefined>;
36
+ load(): Promise<Partial<TDomainConfig> | undefined>;
52
37
  /**
53
- * Сохранить конфигурацию
54
- * Автоматически фильтрует только безопасные поля
38
+ * Сохранить конфигурацию.
55
39
  *
56
- * @param config - Полная конфигурация MCP сервера
40
+ * Всегда вызывается `options.serialize` гарантия явного решения о том,
41
+ * какие поля попадают в файл (защита от утечки секретов).
42
+ *
43
+ * @param config - Полная конфигурация MCP сервера.
57
44
  */
58
- save(config: TConfig): Promise<void>;
45
+ save(config: TDomainConfig): Promise<void>;
59
46
  /**
60
- * Удалить сохраненную конфигурацию
47
+ * Удалить сохранённую конфигурацию.
61
48
  */
62
49
  delete(): Promise<void>;
63
50
  /**
64
- * Проверить существование конфигурации
65
- *
66
- * @returns true если файл конфигурации существует
51
+ * Проверить существование конфигурации.
67
52
  */
68
53
  exists(): Promise<boolean>;
69
54
  /**
70
- * Получить путь к файлу конфигурации
71
- *
72
- * @returns Абсолютный путь к config.json
55
+ * Получить путь к файлу конфигурации.
73
56
  */
74
57
  getConfigPath(): string;
75
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGxF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBAAa,aAAa,CAAC,OAAO,SAAS,mBAAmB;IAGhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEP,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC;IAMnE;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IAmBnD;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB1C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;;;OAIG;IACH,aAAa,IAAI,MAAM;CAGxB"}
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGrE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAa,CAAC,aAAa,SAAS,MAAM;IAGzC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEP,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC;IAMzE;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;IAkBzD;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAYhD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;OAEG;IACH,aAAa,IAAI,MAAM;CAGxB"}
@@ -5,39 +5,24 @@
5
5
  import * as path from 'path';
6
6
  import { FileManager } from './file-manager.js';
7
7
  /**
8
- * Generic менеджер конфигурации MCP сервера
8
+ * Generic менеджер конфигурации MCP сервера.
9
9
  *
10
- * Сохраняет только безопасные поля (без секретов) в ~/.{projectName}/config.json
10
+ * Хранит конфигурацию в `~/.{projectName}/config.json`. Адаптер ОБЯЗАН передать
11
+ * `options.serialize` — это явное решение, какие поля сохранять (защита от
12
+ * случайной утечки секретов).
11
13
  *
12
14
  * @example
13
15
  * ```typescript
14
- * // Определяем свою конфигурацию
15
- * interface YandexTrackerMCPConfig extends BaseMCPServerConfig {
16
- * token: string; // СЕКРЕТ - не сохраняется
17
- * orgId: string; // Безопасно - сохраняется
18
- * apiBase?: string; // Безопасно - сохраняется
19
- * }
16
+ * interface YtConfig { token: string; orgId: string; apiBase?: string }
20
17
  *
21
- * // Создаем ConfigManager
22
- * const configManager = new ConfigManager<YandexTrackerMCPConfig>({
18
+ * const cm = new ConfigManager<YtConfig>({
23
19
  * projectName: 'fractalizer_mcp_yandex_tracker',
24
- *
25
- * // Список безопасных полей (БЕЗ token!)
26
- * safeFields: ['orgId', 'apiBase', 'logLevel', 'projectPath'],
20
+ * // serialize-хук явно исключает секреты:
21
+ * serialize: (cfg) => ({ orgId: cfg.orgId, apiBase: cfg.apiBase }),
27
22
  * });
28
23
  *
29
- * // Сохранение конфигурации
30
- * await configManager.save({
31
- * token: 'secret-token',
32
- * orgId: 'my-org',
33
- * projectPath: '/path/to/project',
34
- * logLevel: 'info',
35
- * });
36
- *
37
- * // Загрузка конфигурации
38
- * const saved = await configManager.load();
39
- * // saved = { orgId: 'my-org', logLevel: 'info', projectPath: '/path/to/project' }
40
- * // token НЕ сохранен и будет запрошен заново
24
+ * await cm.save({ token: 's3cr3t', orgId: 'org-1' });
25
+ * const saved = await cm.load(); // { orgId: 'org-1' }
41
26
  * ```
42
27
  */
43
28
  export class ConfigManager {
@@ -50,9 +35,9 @@ export class ConfigManager {
50
35
  this.configPath = path.join(homeDir, configDir, 'config.json');
51
36
  }
52
37
  /**
53
- * Загрузить сохраненную конфигурацию
38
+ * Загрузить сохранённую конфигурацию.
54
39
  *
55
- * @returns Partial конфигурацию (только безопасные поля) или undefined если файл не существует
40
+ * @returns Partial конфигурацию или `undefined`, если файл не существует.
56
41
  */
57
42
  async load() {
58
43
  try {
@@ -60,7 +45,6 @@ export class ConfigManager {
60
45
  return undefined;
61
46
  }
62
47
  const data = await FileManager.readJSON(this.configPath);
63
- // Кастомная десериализация если задана
64
48
  if (this.options.deserialize) {
65
49
  return this.options.deserialize(data);
66
50
  }
@@ -71,31 +55,23 @@ export class ConfigManager {
71
55
  }
72
56
  }
73
57
  /**
74
- * Сохранить конфигурацию
75
- * Автоматически фильтрует только безопасные поля
58
+ * Сохранить конфигурацию.
59
+ *
60
+ * Всегда вызывается `options.serialize` — гарантия явного решения о том,
61
+ * какие поля попадают в файл (защита от утечки секретов).
76
62
  *
77
- * @param config - Полная конфигурация MCP сервера
63
+ * @param config - Полная конфигурация MCP сервера.
78
64
  */
79
65
  async save(config) {
80
66
  const configDir = path.dirname(this.configPath);
81
67
  await FileManager.ensureDir(configDir);
82
- // Сохраняем только безопасные поля
83
- const safeConfig = {};
84
- for (const field of this.options.safeFields) {
85
- if (field in config) {
86
- safeConfig[field] = config[field];
87
- }
88
- }
89
- // Кастомная сериализация если задана
90
- const dataToSave = this.options.serialize
91
- ? this.options.serialize(config)
92
- : safeConfig;
68
+ const dataToSave = this.options.serialize(config);
93
69
  await FileManager.writeJSON(this.configPath, dataToSave);
94
70
  // Безопасные права доступа (только владелец)
95
71
  await FileManager.setPermissions(this.configPath, 0o600);
96
72
  }
97
73
  /**
98
- * Удалить сохраненную конфигурацию
74
+ * Удалить сохранённую конфигурацию.
99
75
  */
100
76
  async delete() {
101
77
  if (await FileManager.exists(this.configPath)) {
@@ -104,17 +80,13 @@ export class ConfigManager {
104
80
  }
105
81
  }
106
82
  /**
107
- * Проверить существование конфигурации
108
- *
109
- * @returns true если файл конфигурации существует
83
+ * Проверить существование конфигурации.
110
84
  */
111
85
  async exists() {
112
86
  return FileManager.exists(this.configPath);
113
87
  }
114
88
  /**
115
- * Получить путь к файлу конфигурации
116
- *
117
- * @returns Абсолютный путь к config.json
89
+ * Получить путь к файлу конфигурации.
118
90
  */
119
91
  getConfigPath() {
120
92
  return this.configPath;
@@ -1 +1 @@
1
- {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,OAAO,aAAa;IAGK;IAFZ,UAAU,CAAS;IAEpC,YAA6B,OAAsC;QAAtC,YAAO,GAAP,OAAO,CAA+B;QACjE,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACjE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBACjD,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAA0B,IAAI,CAAC,UAAU,CAAC,CAAC;YAElF,uCAAuC;YACvC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,IAAwB,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,MAAe;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEvC,mCAAmC;QACnC,MAAM,UAAU,GAAqB,EAAE,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5C,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACpB,UAAU,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS;YACvC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;YAChC,CAAC,CAAE,UAAsC,CAAC;QAE5C,MAAM,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAEzD,6CAA6C;QAC7C,MAAM,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACvC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACV,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,aAAa;IAGK;IAFZ,UAAU,CAAS;IAEpC,YAA6B,OAA4C;QAA5C,YAAO,GAAP,OAAO,CAAqC;QACvE,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACjE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBACjD,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAA0B,IAAI,CAAC,UAAU,CAAC,CAAC;YAElF,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,IAA8B,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,CAAC,MAAqB;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEvC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAElD,MAAM,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAEzD,6CAA6C;QAC7C,MAAM,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACvC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
@@ -7,4 +7,5 @@ export * from './command-executor.js';
7
7
  export * from './config-manager.js';
8
8
  export * from './interactive-prompter.js';
9
9
  export * from './logger.js';
10
+ export * from './launch-spec-helpers.js';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC"}
@@ -7,4 +7,5 @@ export * from './command-executor.js';
7
7
  export * from './config-manager.js';
8
8
  export * from './interactive-prompter.js';
9
9
  export * from './logger.js';
10
+ export * from './launch-spec-helpers.js';
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC"}
@@ -2,104 +2,56 @@
2
2
  * Generic interactive prompter for collecting MCP server configuration
3
3
  * @packageDocumentation
4
4
  */
5
- import type { BaseMCPServerConfig, MCPClientInfo, ConfigPromptDefinition } from '../types.js';
5
+ import type { MCPClientInfo, ConfigPromptDefinition } from '../types.js';
6
6
  /**
7
- * Generic интерактивный сборщик конфигурации для MCP серверов
7
+ * Generic интерактивный сборщик конфигурации MCP сервера.
8
+ *
9
+ * @template TDomainConfig - Тип доменной конфигурации (произвольный объект).
8
10
  *
9
11
  * @example
10
12
  * ```typescript
11
- * // Определяем промпты для Yandex Tracker
12
- * const ytPrompts: ConfigPromptDefinition<YandexTrackerConfig>[] = [
13
- * {
14
- * name: 'token',
15
- * type: 'password',
16
- * message: 'OAuth токен:',
17
- * validate: (v) => v.length > 0 || 'Токен обязателен',
18
- * },
19
- * {
20
- * name: 'orgId',
21
- * type: 'input',
22
- * message: 'ID организации:',
23
- * },
13
+ * const prompts: ConfigPromptDefinition<{ token: string; orgId: string }>[] = [
14
+ * { name: 'token', type: 'password', message: 'OAuth токен:' },
15
+ * { name: 'orgId', type: 'input', message: 'ID организации:' },
24
16
  * ];
25
17
  *
26
- * // Используем prompter
27
- * const prompter = new InteractivePrompter(ytPrompts);
18
+ * const prompter = new InteractivePrompter(prompts);
28
19
  * const config = await prompter.promptServerConfig();
29
20
  * ```
30
- *
31
- * @template TConfig - Тип конфигурации MCP сервера (расширяет BaseMCPServerConfig)
32
21
  */
33
- export declare class InteractivePrompter<TConfig extends BaseMCPServerConfig> {
22
+ export declare class InteractivePrompter<TDomainConfig extends object> {
34
23
  private readonly configPrompts;
35
24
  /**
36
25
  * @param configPrompts - Определения промптов для сбора конфигурации
37
26
  */
38
- constructor(configPrompts: ConfigPromptDefinition<TConfig>[]);
27
+ constructor(configPrompts: ConfigPromptDefinition<TDomainConfig>[]);
39
28
  /**
40
- * Собрать конфигурацию MCP сервера через интерактивные промпты
29
+ * Собрать конфигурацию через интерактивные промпты.
41
30
  *
42
31
  * @param savedConfig - Ранее сохраненная конфигурация (для значений по умолчанию)
43
- * @returns Собранная конфигурация (без projectPath, который добавляется позже)
44
- *
45
- * @example
46
- * ```typescript
47
- * const savedConfig = await configManager.load();
48
- * const config = await prompter.promptServerConfig(savedConfig);
49
- * // config = { token: '...', orgId: '...', apiBase: '...', logLevel: 'info' }
50
- * ```
32
+ * @returns Собранная доменная конфигурация
51
33
  */
52
- promptServerConfig(savedConfig?: Partial<TConfig>): Promise<Omit<TConfig, 'projectPath'>>;
34
+ promptServerConfig(savedConfig?: Partial<TDomainConfig>): Promise<TDomainConfig>;
53
35
  /**
54
- * Выбор MCP клиента из списка установленных
36
+ * Выбор MCP клиента из списка установленных.
55
37
  *
56
38
  * @param clients - Список доступных MCP клиентов
57
39
  * @returns Имя выбранного клиента
58
- *
59
- * @example
60
- * ```typescript
61
- * const installed = await registry.findInstalled();
62
- * const clientName = await InteractivePrompter.promptClientSelection(installed);
63
- * // clientName = 'claude-desktop' | 'claude-code' | ...
64
- * ```
65
40
  */
66
41
  static promptClientSelection(clients: MCPClientInfo[]): Promise<string>;
67
42
  /**
68
- * Запросить подтверждение (yes/no) у пользователя
43
+ * Запросить подтверждение (yes/no) у пользователя.
69
44
  *
70
45
  * @param message - Сообщение для отображения
71
46
  * @param defaultValue - Значение по умолчанию (true = yes, false = no)
72
- * @returns true если пользователь подтвердил, false иначе
73
- *
74
- * @example
75
- * ```typescript
76
- * const shouldOverwrite = await InteractivePrompter.promptConfirmation(
77
- * 'Конфигурация уже существует. Перезаписать?',
78
- * false
79
- * );
80
- * ```
81
47
  */
82
48
  static promptConfirmation(message: string, defaultValue?: boolean): Promise<boolean>;
83
49
  /**
84
- * Выбор из списка вариантов
50
+ * Выбор из списка вариантов.
85
51
  *
86
52
  * @param message - Сообщение для отображения
87
53
  * @param choices - Список вариантов выбора
88
54
  * @returns Выбранное значение
89
- *
90
- * @example
91
- * ```typescript
92
- * const logLevel = await InteractivePrompter.promptSelection(
93
- * 'Выберите уровень логирования:',
94
- * [
95
- * { name: 'Debug', value: 'debug' },
96
- * { name: 'Info', value: 'info' },
97
- * { name: 'Warning', value: 'warn' },
98
- * ]
99
- * );
100
- * ```
101
- *
102
- * @template T - Тип возвращаемого значения (строка)
103
55
  */
104
56
  static promptSelection<T extends string>(message: string, choices: Array<{
105
57
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-prompter.d.ts","sourceRoot":"","sources":["../../src/utils/interactive-prompter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE9F;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,mBAAmB,CAAC,OAAO,SAAS,mBAAmB;IAItD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAH1C;;OAEG;gBAC0B,aAAa,EAAE,sBAAsB,CAAC,OAAO,CAAC,EAAE;IAE7E;;;;;;;;;;;;OAYG;IACG,kBAAkB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAoD/F;;;;;;;;;;;;OAYG;WACU,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB7E;;;;;;;;;;;;;;OAcG;WACU,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAavF;;;;;;;;;;;;;;;;;;;;OAoBG;WACU,eAAe,CAAC,CAAC,SAAS,MAAM,EAC3C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;CAYd"}
1
+ {"version":3,"file":"interactive-prompter.d.ts","sourceRoot":"","sources":["../../src/utils/interactive-prompter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEzE;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,mBAAmB,CAAC,aAAa,SAAS,MAAM;IAI/C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAH1C;;OAEG;gBAC0B,aAAa,EAAE,sBAAsB,CAAC,aAAa,CAAC,EAAE;IAEnF;;;;;OAKG;IACG,kBAAkB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA+CtF;;;;;OAKG;WACU,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB7E;;;;;OAKG;WACU,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAavF;;;;;;OAMG;WACU,eAAe,CAAC,CAAC,SAAS,MAAM,EAC3C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;CAYd"}
@@ -4,31 +4,20 @@
4
4
  */
5
5
  import inquirer from 'inquirer';
6
6
  /**
7
- * Generic интерактивный сборщик конфигурации для MCP серверов
7
+ * Generic интерактивный сборщик конфигурации MCP сервера.
8
+ *
9
+ * @template TDomainConfig - Тип доменной конфигурации (произвольный объект).
8
10
  *
9
11
  * @example
10
12
  * ```typescript
11
- * // Определяем промпты для Yandex Tracker
12
- * const ytPrompts: ConfigPromptDefinition<YandexTrackerConfig>[] = [
13
- * {
14
- * name: 'token',
15
- * type: 'password',
16
- * message: 'OAuth токен:',
17
- * validate: (v) => v.length > 0 || 'Токен обязателен',
18
- * },
19
- * {
20
- * name: 'orgId',
21
- * type: 'input',
22
- * message: 'ID организации:',
23
- * },
13
+ * const prompts: ConfigPromptDefinition<{ token: string; orgId: string }>[] = [
14
+ * { name: 'token', type: 'password', message: 'OAuth токен:' },
15
+ * { name: 'orgId', type: 'input', message: 'ID организации:' },
24
16
  * ];
25
17
  *
26
- * // Используем prompter
27
- * const prompter = new InteractivePrompter(ytPrompts);
18
+ * const prompter = new InteractivePrompter(prompts);
28
19
  * const config = await prompter.promptServerConfig();
29
20
  * ```
30
- *
31
- * @template TConfig - Тип конфигурации MCP сервера (расширяет BaseMCPServerConfig)
32
21
  */
33
22
  export class InteractivePrompter {
34
23
  configPrompts;
@@ -39,17 +28,10 @@ export class InteractivePrompter {
39
28
  this.configPrompts = configPrompts;
40
29
  }
41
30
  /**
42
- * Собрать конфигурацию MCP сервера через интерактивные промпты
31
+ * Собрать конфигурацию через интерактивные промпты.
43
32
  *
44
33
  * @param savedConfig - Ранее сохраненная конфигурация (для значений по умолчанию)
45
- * @returns Собранная конфигурация (без projectPath, который добавляется позже)
46
- *
47
- * @example
48
- * ```typescript
49
- * const savedConfig = await configManager.load();
50
- * const config = await prompter.promptServerConfig(savedConfig);
51
- * // config = { token: '...', orgId: '...', apiBase: '...', logLevel: 'info' }
52
- * ```
34
+ * @returns Собранная доменная конфигурация
53
35
  */
54
36
  async promptServerConfig(savedConfig) {
55
37
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -59,7 +41,6 @@ export class InteractivePrompter {
59
41
  name: String(prompt.name),
60
42
  message: prompt.message,
61
43
  };
62
- // Add default value
63
44
  if (prompt.default !== undefined) {
64
45
  if (typeof prompt.default === 'function') {
65
46
  question['default'] = () => {
@@ -71,19 +52,15 @@ export class InteractivePrompter {
71
52
  question['default'] = prompt.default;
72
53
  }
73
54
  }
74
- // Add validate function
75
55
  if (prompt.validate !== undefined) {
76
56
  question['validate'] = prompt.validate;
77
57
  }
78
- // Add choices
79
58
  if (prompt.choices !== undefined) {
80
59
  question['choices'] = prompt.choices;
81
60
  }
82
- // Add when condition
83
61
  if (prompt.when !== undefined) {
84
62
  question['when'] = prompt.when;
85
63
  }
86
- // Add mask (password fields)
87
64
  if (prompt.mask !== undefined) {
88
65
  question['mask'] = prompt.mask;
89
66
  }
@@ -96,17 +73,10 @@ export class InteractivePrompter {
96
73
  return answers;
97
74
  }
98
75
  /**
99
- * Выбор MCP клиента из списка установленных
76
+ * Выбор MCP клиента из списка установленных.
100
77
  *
101
78
  * @param clients - Список доступных MCP клиентов
102
79
  * @returns Имя выбранного клиента
103
- *
104
- * @example
105
- * ```typescript
106
- * const installed = await registry.findInstalled();
107
- * const clientName = await InteractivePrompter.promptClientSelection(installed);
108
- * // clientName = 'claude-desktop' | 'claude-code' | ...
109
- * ```
110
80
  */
111
81
  static async promptClientSelection(clients) {
112
82
  const { selectedClient } = await inquirer.prompt([
@@ -123,19 +93,10 @@ export class InteractivePrompter {
123
93
  return selectedClient;
124
94
  }
125
95
  /**
126
- * Запросить подтверждение (yes/no) у пользователя
96
+ * Запросить подтверждение (yes/no) у пользователя.
127
97
  *
128
98
  * @param message - Сообщение для отображения
129
99
  * @param defaultValue - Значение по умолчанию (true = yes, false = no)
130
- * @returns true если пользователь подтвердил, false иначе
131
- *
132
- * @example
133
- * ```typescript
134
- * const shouldOverwrite = await InteractivePrompter.promptConfirmation(
135
- * 'Конфигурация уже существует. Перезаписать?',
136
- * false
137
- * );
138
- * ```
139
100
  */
140
101
  static async promptConfirmation(message, defaultValue = true) {
141
102
  const { confirmed } = await inquirer.prompt([
@@ -149,25 +110,11 @@ export class InteractivePrompter {
149
110
  return confirmed;
150
111
  }
151
112
  /**
152
- * Выбор из списка вариантов
113
+ * Выбор из списка вариантов.
153
114
  *
154
115
  * @param message - Сообщение для отображения
155
116
  * @param choices - Список вариантов выбора
156
117
  * @returns Выбранное значение
157
- *
158
- * @example
159
- * ```typescript
160
- * const logLevel = await InteractivePrompter.promptSelection(
161
- * 'Выберите уровень логирования:',
162
- * [
163
- * { name: 'Debug', value: 'debug' },
164
- * { name: 'Info', value: 'info' },
165
- * { name: 'Warning', value: 'warn' },
166
- * ]
167
- * );
168
- * ```
169
- *
170
- * @template T - Тип возвращаемого значения (строка)
171
118
  */
172
119
  static async promptSelection(message, choices) {
173
120
  const { selected } = await inquirer.prompt([
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-prompter.js","sourceRoot":"","sources":["../../src/utils/interactive-prompter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interactive-prompter.js","sourceRoot":"","sources":["../../src/utils/interactive-prompter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Утилиты для работы со спецификациями запуска MCP серверов.
3
+ *
4
+ * Извлечены из {@link BaseConnector.validateLaunchSpec} и
5
+ * {@link ConfigurableConnector.commandExistsOnDisk} для переиспользования
6
+ * в команде `doctor` без дублирования логики.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import type { ServerLaunchSpec } from '../types/launch.types.js';
11
+ /**
12
+ * Определить путь к исполняемому файлу, который реально нужно проверить на диске,
13
+ * из спецификации запуска.
14
+ *
15
+ * Логика выровнена с {@link BaseConnector.validateLaunchSpec}:
16
+ * - Если `spec.command` — абсолютный путь → возвращаем его.
17
+ * - Если `spec.command === 'node'` → парсим `args` как Node argv:
18
+ * пропускаем флаги-without-value (любые `-*`/`--*` без `=` не из whitelist)
19
+ * и пары `flag value` для флагов из {@link NODE_FLAGS_WITH_VALUE}.
20
+ * Первый positional аргумент после options — это путь к скрипту.
21
+ * Возвращаем его, только если он абсолютный (иначе `null`).
22
+ * - Во всех остальных случаях (`npx`, `pipx`, относительная команда из PATH) →
23
+ * возвращаем `null` (проверка на диске не применима).
24
+ *
25
+ * @param spec - Спецификация запуска
26
+ * @returns Абсолютный путь к проверяемому файлу или `null`
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * // node /abs/server.cjs → '/abs/server.cjs'
31
+ * // node --no-warnings /abs/server.cjs → '/abs/server.cjs'
32
+ * // node --import /abs/preload.mjs /abs/server.cjs → '/abs/server.cjs'
33
+ * // node --import=/abs/preload.mjs /abs/server.cjs → '/abs/server.cjs'
34
+ * // node --version → null (нет positional абсолютного пути)
35
+ * ```
36
+ */
37
+ export declare function resolveExecutablePath(spec: ServerLaunchSpec): string | null;
38
+ //# sourceMappingURL=launch-spec-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-spec-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/launch-spec-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA2DjE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAQ3E"}