coding-tool-x 3.7.0 → 3.7.1
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.
- package/README.md +5 -6
- package/dist/web/assets/{Analytics-Dma_j2Rq.js → Analytics-Dpje9L84.js} +1 -1
- package/dist/web/assets/{ConfigTemplates-C49Y1PLH.js → ConfigTemplates-Cz6kasek.js} +1 -1
- package/dist/web/assets/Home-BwTaYu3q.js +1 -0
- package/dist/web/assets/Home-Jom_ZcdY.css +1 -0
- package/dist/web/assets/{PluginManager-B1ECTHyY.js → PluginManager-DsN-xNXx.js} +1 -1
- package/dist/web/assets/ProjectList-4BCObimU.js +1 -0
- package/dist/web/assets/{ProjectList-B_L55-l9.css → ProjectList-D3a0oRum.css} +1 -1
- package/dist/web/assets/{SessionList-CH5GwwiJ.js → SessionList-D4c8FRzq.js} +1 -1
- package/dist/web/assets/{SkillManager-CRyVhjYQ.js → SkillManager-C-KYbXB5.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-CO9tclVt.js → WorkspaceManager-B-BlPJHX.js} +1 -1
- package/dist/web/assets/index-Btfvh0GG.js +2 -0
- package/dist/web/assets/{index-CM26UrnJ.css → index-CLNa6DhH.css} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +2 -1
- package/src/commands/channels.js +8 -8
- package/src/commands/daemon.js +4 -4
- package/src/commands/doctor.js +1 -1
- package/src/commands/logs.js +1 -3
- package/src/commands/port-config.js +4 -4
- package/src/commands/proxy-control.js +13 -13
- package/src/commands/stats.js +6 -6
- package/src/commands/toggle-proxy.js +8 -8
- package/src/config/default.js +3 -3
- package/src/config/paths.js +46 -49
- package/src/index.js +4 -5
- package/src/server/api/commands.js +1 -1
- package/src/server/api/config-export.js +2 -2
- package/src/server/api/config-registry.js +1 -1
- package/src/server/api/config.js +1 -1
- package/src/server/api/dashboard.js +16 -16
- package/src/server/api/mcp.js +2 -2
- package/src/server/api/{pi-channels.js → omp-channels.js} +15 -15
- package/src/server/api/{pi-config.js → omp-config.js} +13 -13
- package/src/server/api/{pi-projects.js → omp-projects.js} +5 -5
- package/src/server/api/{pi-proxy.js → omp-proxy.js} +18 -18
- package/src/server/api/{pi-sessions.js → omp-sessions.js} +21 -21
- package/src/server/api/{pi-statistics.js → omp-statistics.js} +1 -1
- package/src/server/api/plugins.js +1 -1
- package/src/server/api/skills.js +1 -1
- package/src/server/api/workspaces.js +1 -1
- package/src/server/index.js +10 -10
- package/src/server/{pi-proxy-server.js → omp-proxy-server.js} +13 -13
- package/src/server/services/channel-balance.js +3 -3
- package/src/server/services/channel-scheduler.js +4 -4
- package/src/server/services/commands-service.js +5 -5
- package/src/server/services/config-export-service.js +53 -53
- package/src/server/services/config-registry-service.js +8 -8
- package/src/server/services/config-sync-manager.js +26 -26
- package/src/server/services/config-templates-service.js +28 -28
- package/src/server/services/mcp-service.js +20 -20
- package/src/server/services/notification-hooks.js +138 -6
- package/src/server/services/{pi-auth-providers.js → omp-auth-providers.js} +2 -2
- package/src/server/services/{pi-channels.js → omp-channels.js} +5 -5
- package/src/server/services/{pi-config.js → omp-config.js} +47 -65
- package/src/server/services/{pi-sessions.js → omp-sessions.js} +20 -20
- package/src/server/services/{pi-settings-manager.js → omp-settings-manager.js} +422 -18
- package/src/server/services/{pi-statistics-service.js → omp-statistics-service.js} +2 -2
- package/src/server/services/plugins-service.js +122 -122
- package/src/server/services/prompts-service.js +20 -20
- package/src/server/services/proxy-log-helper.js +1 -1
- package/src/server/services/proxy-runtime.js +1 -1
- package/src/server/services/skill-service.js +7 -7
- package/src/server/services/speed-test.js +29 -29
- package/src/server/services/ui-config.js +3 -3
- package/src/server/services/workspace-service.js +8 -8
- package/src/server/websocket-server.js +4 -4
- package/src/shared/platforms.js +201 -0
- package/dist/web/assets/Home-DGGC8H4g.js +0 -1
- package/dist/web/assets/Home-ewgeIhF7.css +0 -1
- package/dist/web/assets/ProjectList-DyiGyT-H.js +0 -1
- package/dist/web/assets/index-EQq56pRa.js +0 -2
|
@@ -14,7 +14,7 @@ const channelsService = require('./channels');
|
|
|
14
14
|
const codexChannelsService = require('./codex-channels');
|
|
15
15
|
const geminiChannelsService = require('./gemini-channels');
|
|
16
16
|
const opencodeChannelsService = require('./opencode-channels');
|
|
17
|
-
const
|
|
17
|
+
const ompChannelsService = require('./omp-channels');
|
|
18
18
|
const { AgentsService } = require('./agents-service');
|
|
19
19
|
const { CommandsService } = require('./commands-service');
|
|
20
20
|
const { SkillService } = require('./skill-service');
|
|
@@ -55,18 +55,18 @@ const LEGACY_UI_CONFIG_PATH = PATHS.uiConfig;
|
|
|
55
55
|
const LEGACY_NOTIFY_HOOK_PATH = PATHS.notifyHook;
|
|
56
56
|
const GEMINI_SETTINGS_PATH = path.join(path.dirname(NATIVE_PATHS.gemini.env), 'settings.json');
|
|
57
57
|
const AGENT_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode'];
|
|
58
|
-
const COMMAND_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', '
|
|
59
|
-
const SKILL_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', '
|
|
60
|
-
const PLUGIN_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', '
|
|
58
|
+
const COMMAND_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', 'omp'];
|
|
59
|
+
const SKILL_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', 'omp'];
|
|
60
|
+
const PLUGIN_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', 'omp'];
|
|
61
61
|
const CLAUDE_MARKETPLACES_REGISTRY = path.join(CLAUDE_PLUGINS_DIR, 'known_marketplaces.json');
|
|
62
62
|
const CODEX_PLUGINS_DIR = path.join(path.dirname(NATIVE_PATHS.codex.config), 'plugins');
|
|
63
63
|
const CODEX_PLUGINS_CACHE_DIR = path.join(CODEX_PLUGINS_DIR, 'cache');
|
|
64
64
|
const OPENCODE_PLUGINS_DIR = path.join(NATIVE_PATHS.opencode.config, 'plugins');
|
|
65
65
|
const OPENCODE_LEGACY_PLUGINS_DIR = path.join(NATIVE_PATHS.opencode.config, 'plugin');
|
|
66
|
-
const
|
|
67
|
-
const
|
|
66
|
+
const OMP_SETTINGS_PATH = NATIVE_PATHS.omp?.settings || path.join(PATHS.base, 'omp-config.yml');
|
|
67
|
+
const OMP_EXTENSIONS_DIR = NATIVE_PATHS.omp?.extensions || path.join(PATHS.base, 'omp-extensions');
|
|
68
68
|
|
|
69
|
-
function
|
|
69
|
+
function normalizeOmpResourceType(value = '') {
|
|
70
70
|
const key = String(value || '').trim().replace(/[\s_-]+/g, '').toLowerCase();
|
|
71
71
|
const map = {
|
|
72
72
|
extension: 'extension',
|
|
@@ -90,10 +90,10 @@ function normalizePiResourceType(value = '') {
|
|
|
90
90
|
return map[key] || String(value || '').trim();
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
function
|
|
93
|
+
function normalizeOmpResourceTypes(input = []) {
|
|
94
94
|
const result = [];
|
|
95
95
|
const add = (value) => {
|
|
96
|
-
const normalized =
|
|
96
|
+
const normalized = normalizeOmpResourceType(value);
|
|
97
97
|
if (normalized && !result.includes(normalized)) result.push(normalized);
|
|
98
98
|
};
|
|
99
99
|
if (Array.isArray(input)) {
|
|
@@ -130,7 +130,7 @@ function getOpenCodeNotificationPluginPath() {
|
|
|
130
130
|
function getNativeConfigSpecs() {
|
|
131
131
|
const openCodeConfigPaths = getOpenCodeConfigPaths();
|
|
132
132
|
const openCodeNotificationPluginPath = getOpenCodeNotificationPluginPath();
|
|
133
|
-
const
|
|
133
|
+
const ompDir = NATIVE_PATHS.omp.dir || path.dirname(NATIVE_PATHS.omp.settings);
|
|
134
134
|
return {
|
|
135
135
|
claude: {
|
|
136
136
|
settings: { path: NATIVE_PATHS.claude.settings, format: 'json' }
|
|
@@ -151,18 +151,18 @@ function getNativeConfigSpecs() {
|
|
|
151
151
|
? { codingToolNotifyPlugin: { path: openCodeNotificationPluginPath, format: 'text' } }
|
|
152
152
|
: {})
|
|
153
153
|
},
|
|
154
|
-
|
|
155
|
-
settings: { path: NATIVE_PATHS.
|
|
156
|
-
auth: { path: NATIVE_PATHS.
|
|
157
|
-
models: { path: NATIVE_PATHS.
|
|
158
|
-
commands: { path: NATIVE_PATHS.
|
|
159
|
-
prompts: { path: NATIVE_PATHS.
|
|
160
|
-
skills: { path: NATIVE_PATHS.
|
|
161
|
-
extensions: { path: NATIVE_PATHS.
|
|
162
|
-
themes: { path: NATIVE_PATHS.
|
|
163
|
-
packages: { path: NATIVE_PATHS.
|
|
164
|
-
npmPackages: { path: path.join(
|
|
165
|
-
gitPackages: { path: path.join(
|
|
154
|
+
omp: {
|
|
155
|
+
settings: { path: NATIVE_PATHS.omp.settings, format: 'yaml' },
|
|
156
|
+
auth: { path: NATIVE_PATHS.omp.auth, format: 'json', mode: 0o600 },
|
|
157
|
+
models: { path: NATIVE_PATHS.omp.models, format: 'yaml' },
|
|
158
|
+
commands: { path: NATIVE_PATHS.omp.commands || path.join(ompDir, 'commands'), format: 'directory' },
|
|
159
|
+
prompts: { path: NATIVE_PATHS.omp.prompts, format: 'directory' },
|
|
160
|
+
skills: { path: NATIVE_PATHS.omp.skills, format: 'directory' },
|
|
161
|
+
extensions: { path: NATIVE_PATHS.omp.extensions, format: 'directory' },
|
|
162
|
+
themes: { path: NATIVE_PATHS.omp.themes || path.join(ompDir, 'themes'), format: 'directory' },
|
|
163
|
+
packages: { path: NATIVE_PATHS.omp.packages || path.join(ompDir, 'packages'), format: 'directory' },
|
|
164
|
+
npmPackages: { path: path.join(ompDir, 'npm'), format: 'directory' },
|
|
165
|
+
gitPackages: { path: path.join(ompDir, 'git'), format: 'directory' }
|
|
166
166
|
}
|
|
167
167
|
};
|
|
168
168
|
}
|
|
@@ -1089,7 +1089,7 @@ function exportOpenCodePluginsByPlatform(service) {
|
|
|
1089
1089
|
name: plugin.name,
|
|
1090
1090
|
directory: plugin.directory || plugin.name,
|
|
1091
1091
|
installSource: plugin.installSource || plugin.source || plugin.name,
|
|
1092
|
-
resourceTypes:
|
|
1092
|
+
resourceTypes: normalizeOmpResourceTypes(plugin.resourceTypes || plugin.resources),
|
|
1093
1093
|
version: plugin.version || 'latest',
|
|
1094
1094
|
description: plugin.description || '',
|
|
1095
1095
|
enabled: plugin.enabled !== false,
|
|
@@ -1108,13 +1108,13 @@ function exportOpenCodePluginsByPlatform(service) {
|
|
|
1108
1108
|
return { plugins, control };
|
|
1109
1109
|
}
|
|
1110
1110
|
|
|
1111
|
-
function
|
|
1111
|
+
function exportOmpPluginsByPlatform(service) {
|
|
1112
1112
|
const plugins = (service.listPlugins().plugins || [])
|
|
1113
1113
|
.map((plugin) => {
|
|
1114
|
-
if (plugin.pluginType === 'package' || plugin.source === '
|
|
1114
|
+
if (plugin.pluginType === 'package' || plugin.source === 'omp-settings') {
|
|
1115
1115
|
return {
|
|
1116
|
-
platform: '
|
|
1117
|
-
type: '
|
|
1116
|
+
platform: 'omp',
|
|
1117
|
+
type: 'omp-package',
|
|
1118
1118
|
pluginType: 'package',
|
|
1119
1119
|
pluginKind: plugin.pluginKind || 'package',
|
|
1120
1120
|
name: plugin.name,
|
|
@@ -1123,18 +1123,18 @@ function exportPiPluginsByPlatform(service) {
|
|
|
1123
1123
|
description: plugin.description || '',
|
|
1124
1124
|
enabled: plugin.enabled !== false,
|
|
1125
1125
|
installed: plugin.installed !== false,
|
|
1126
|
-
source: plugin.source || '
|
|
1126
|
+
source: plugin.source || 'omp-settings'
|
|
1127
1127
|
};
|
|
1128
1128
|
}
|
|
1129
|
-
return buildManagedPluginExportItem(plugin, '
|
|
1130
|
-
type: '
|
|
1129
|
+
return buildManagedPluginExportItem(plugin, 'omp', OMP_EXTENSIONS_DIR, {
|
|
1130
|
+
type: 'omp-extension',
|
|
1131
1131
|
pluginType: plugin.pluginType || 'extension',
|
|
1132
1132
|
pluginKind: plugin.pluginKind || 'extension',
|
|
1133
|
-
manifestCandidates: ['
|
|
1133
|
+
manifestCandidates: ['omp.json', 'extension.json', 'plugin.json', 'package.json']
|
|
1134
1134
|
});
|
|
1135
1135
|
})
|
|
1136
1136
|
.filter(Boolean);
|
|
1137
|
-
const control = exportPluginControlSnapshot('
|
|
1137
|
+
const control = exportPluginControlSnapshot('omp', service);
|
|
1138
1138
|
return { plugins, control };
|
|
1139
1139
|
}
|
|
1140
1140
|
|
|
@@ -1148,8 +1148,8 @@ function exportPluginsSnapshotByPlatform() {
|
|
|
1148
1148
|
result[platform] = exportCodexPluginsByPlatform(service);
|
|
1149
1149
|
} else if (platform === 'opencode') {
|
|
1150
1150
|
result[platform] = exportOpenCodePluginsByPlatform(service);
|
|
1151
|
-
} else if (platform === '
|
|
1152
|
-
result[platform] =
|
|
1151
|
+
} else if (platform === 'omp') {
|
|
1152
|
+
result[platform] = exportOmpPluginsByPlatform(service);
|
|
1153
1153
|
} else {
|
|
1154
1154
|
result[platform] = {
|
|
1155
1155
|
plugins: service.listPlugins().plugins || [],
|
|
@@ -1515,22 +1515,22 @@ function writeOpenCodePluginConfig(packages = [], overwrite = true) {
|
|
|
1515
1515
|
return writeJsonFileAbsolute(configPath, { ...existing, plugin: mergedPlugins }, true);
|
|
1516
1516
|
}
|
|
1517
1517
|
|
|
1518
|
-
function
|
|
1518
|
+
function writeOmpPluginSettings(plugins = [], snapshot = {}, overwrite = true) {
|
|
1519
1519
|
const nativeSettings = snapshot.control?.nativeSettings;
|
|
1520
1520
|
if (nativeSettings?.content !== undefined) {
|
|
1521
|
-
return writeNativeConfigAbsolute({ path:
|
|
1521
|
+
return writeNativeConfigAbsolute({ path: OMP_SETTINGS_PATH, format: 'yaml' }, {
|
|
1522
1522
|
...nativeSettings,
|
|
1523
1523
|
format: 'yaml'
|
|
1524
1524
|
}, overwrite);
|
|
1525
1525
|
}
|
|
1526
1526
|
|
|
1527
|
-
const settings = readYamlFileSafe(
|
|
1528
|
-
if (fs.existsSync(
|
|
1527
|
+
const settings = readYamlFileSafe(OMP_SETTINGS_PATH) || {};
|
|
1528
|
+
if (fs.existsSync(OMP_SETTINGS_PATH) && !overwrite) {
|
|
1529
1529
|
return 'skipped';
|
|
1530
1530
|
}
|
|
1531
1531
|
const existingPackages = Array.isArray(settings.packages) ? settings.packages : [];
|
|
1532
1532
|
const existingDisabled = Array.isArray(settings.disabledPackages) ? settings.disabledPackages : [];
|
|
1533
|
-
const packagePlugins = plugins.filter(plugin => plugin.type === '
|
|
1533
|
+
const packagePlugins = plugins.filter(plugin => plugin.type === 'omp-package' || plugin.pluginType === 'package');
|
|
1534
1534
|
const packageIdentity = (item) => {
|
|
1535
1535
|
if (typeof item === 'string') return item;
|
|
1536
1536
|
if (!item || typeof item !== 'object') return '';
|
|
@@ -1540,7 +1540,7 @@ function writePiPluginSettings(plugins = [], snapshot = {}, overwrite = true) {
|
|
|
1540
1540
|
const name = plugin.name || plugin.directory || plugin.installSource || '';
|
|
1541
1541
|
if (!name) return null;
|
|
1542
1542
|
const installSource = plugin.installSource || plugin.packageSource || '';
|
|
1543
|
-
const resourceTypes =
|
|
1543
|
+
const resourceTypes = normalizeOmpResourceTypes(plugin.resourceTypes || plugin.resources);
|
|
1544
1544
|
if (!installSource || installSource === name) {
|
|
1545
1545
|
if (resourceTypes.length === 0 && !plugin.version && !plugin.description) return name;
|
|
1546
1546
|
}
|
|
@@ -1573,7 +1573,7 @@ function writePiPluginSettings(plugins = [], snapshot = {}, overwrite = true) {
|
|
|
1573
1573
|
return 'skipped';
|
|
1574
1574
|
}
|
|
1575
1575
|
|
|
1576
|
-
return writeYamlFileAbsolute(
|
|
1576
|
+
return writeYamlFileAbsolute(OMP_SETTINGS_PATH, {
|
|
1577
1577
|
...settings,
|
|
1578
1578
|
packages: mergePackageEntries(existingPackages, packages),
|
|
1579
1579
|
disabledPackages: mergePackageEntries(existingDisabled, disabledPackages)
|
|
@@ -1662,8 +1662,8 @@ function importPluginsByPlatformSnapshot(snapshotByPlatform = {}, legacyPlugins
|
|
|
1662
1662
|
.map(plugin => plugin.name || plugin.directory)
|
|
1663
1663
|
.filter(Boolean);
|
|
1664
1664
|
applyImportStatus(results, writeOpenCodePluginConfig(packages, overwrite));
|
|
1665
|
-
} else if (platform === '
|
|
1666
|
-
applyImportStatus(results,
|
|
1665
|
+
} else if (platform === 'omp' && (hasControl || plugins.length > 0)) {
|
|
1666
|
+
applyImportStatus(results, writeOmpPluginSettings(plugins, snapshot, overwrite));
|
|
1667
1667
|
}
|
|
1668
1668
|
|
|
1669
1669
|
for (const plugin of plugins) {
|
|
@@ -1675,11 +1675,11 @@ function importPluginsByPlatformSnapshot(snapshotByPlatform = {}, legacyPlugins
|
|
|
1675
1675
|
continue;
|
|
1676
1676
|
}
|
|
1677
1677
|
applyImportStatus(results, importPluginToDirectory(platform, plugin, getOpenCodePluginsDir(), overwrite));
|
|
1678
|
-
} else if (platform === '
|
|
1679
|
-
if (plugin.type === '
|
|
1678
|
+
} else if (platform === 'omp') {
|
|
1679
|
+
if (plugin.type === 'omp-package' || plugin.pluginType === 'package') {
|
|
1680
1680
|
continue;
|
|
1681
1681
|
}
|
|
1682
|
-
applyImportStatus(results, importPluginToDirectory(platform, plugin,
|
|
1682
|
+
applyImportStatus(results, importPluginToDirectory(platform, plugin, OMP_EXTENSIONS_DIR, overwrite));
|
|
1683
1683
|
} else if (platform === 'claude') {
|
|
1684
1684
|
const isLegacy = plugin.type === 'legacy';
|
|
1685
1685
|
applyImportStatus(results, importPluginToDirectory(
|
|
@@ -1750,8 +1750,8 @@ function getAllChannelsByType() {
|
|
|
1750
1750
|
const codex = codexChannelsService.getChannels()?.channels || [];
|
|
1751
1751
|
const gemini = geminiChannelsService.getChannels()?.channels || [];
|
|
1752
1752
|
const opencode = opencodeChannelsService.getChannels()?.channels || [];
|
|
1753
|
-
const
|
|
1754
|
-
return { claude, codex, gemini, opencode,
|
|
1753
|
+
const omp = ompChannelsService.getChannels()?.channels || [];
|
|
1754
|
+
return { claude, codex, gemini, opencode, omp };
|
|
1755
1755
|
}
|
|
1756
1756
|
|
|
1757
1757
|
/**
|
|
@@ -1963,7 +1963,7 @@ async function importConfigs(importData, options = {}) {
|
|
|
1963
1963
|
codex: hasTypedChannels && Array.isArray(channelsByType.codex) ? channelsByType.codex : [],
|
|
1964
1964
|
gemini: hasTypedChannels && Array.isArray(channelsByType.gemini) ? channelsByType.gemini : [],
|
|
1965
1965
|
opencode: hasTypedChannels && Array.isArray(channelsByType.opencode) ? channelsByType.opencode : [],
|
|
1966
|
-
|
|
1966
|
+
omp: hasTypedChannels && Array.isArray(channelsByType.omp) ? channelsByType.omp: []
|
|
1967
1967
|
};
|
|
1968
1968
|
|
|
1969
1969
|
// 导入配置模板
|
|
@@ -2060,16 +2060,16 @@ async function importConfigs(importData, options = {}) {
|
|
|
2060
2060
|
(channel.name && channel.baseUrl && c.name === channel.name && c.baseUrl === channel.baseUrl)
|
|
2061
2061
|
));
|
|
2062
2062
|
|
|
2063
|
-
importTypedChannels('
|
|
2063
|
+
importTypedChannels('omp', ompChannelsService, channel => {
|
|
2064
2064
|
const { name, baseUrl, apiKey, ...extraConfig } = channel;
|
|
2065
|
-
|
|
2065
|
+
ompChannelsService.createChannel(name, baseUrl, apiKey, extraConfig);
|
|
2066
2066
|
}, (existingChannels, channel) => existingChannels.find(c =>
|
|
2067
2067
|
(channel.id && c.id === channel.id) ||
|
|
2068
2068
|
(channel.providerKey && c.providerKey === channel.providerKey) ||
|
|
2069
2069
|
(channel.name && channel.baseUrl && c.name === channel.name && c.baseUrl === channel.baseUrl)
|
|
2070
2070
|
));
|
|
2071
|
-
if ((importChannelsByType.
|
|
2072
|
-
|
|
2071
|
+
if ((importChannelsByType.omp || []).length > 0 && typeof ompChannelsService.syncManagedProviderExtension === 'function') {
|
|
2072
|
+
ompChannelsService.syncManagedProviderExtension();
|
|
2073
2073
|
}
|
|
2074
2074
|
|
|
2075
2075
|
// 导入工作区配置
|
|
@@ -27,13 +27,13 @@ const CLAUDE_DIRS = {
|
|
|
27
27
|
|
|
28
28
|
// Valid config types
|
|
29
29
|
const CONFIG_TYPES = ['skills', 'commands', 'agents', 'plugins'];
|
|
30
|
-
const SUPPORTED_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', '
|
|
30
|
+
const SUPPORTED_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', 'omp'];
|
|
31
31
|
|
|
32
32
|
const PLATFORM_SUPPORT = {
|
|
33
|
-
skills: { claude: true, codex: true, gemini: true, opencode: true,
|
|
34
|
-
commands: { claude: true, codex: true, gemini: true, opencode: true,
|
|
35
|
-
agents: { claude: true, codex: true, gemini: true, opencode: true,
|
|
36
|
-
plugins: { claude: true, codex: false, gemini: false, opencode: true,
|
|
33
|
+
skills: { claude: true, codex: true, gemini: true, opencode: true, omp: true },
|
|
34
|
+
commands: { claude: true, codex: true, gemini: true, opencode: true, omp: true },
|
|
35
|
+
agents: { claude: true, codex: true, gemini: true, opencode: true, omp: false },
|
|
36
|
+
plugins: { claude: true, codex: false, gemini: false, opencode: true, omp: true }
|
|
37
37
|
};
|
|
38
38
|
|
|
39
39
|
function normalizePlatforms(type, platforms = {}) {
|
|
@@ -585,7 +585,7 @@ class ConfigRegistryService {
|
|
|
585
585
|
codex: 0,
|
|
586
586
|
gemini: 0,
|
|
587
587
|
opencode: 0,
|
|
588
|
-
|
|
588
|
+
omp: 0
|
|
589
589
|
}
|
|
590
590
|
};
|
|
591
591
|
|
|
@@ -599,7 +599,7 @@ class ConfigRegistryService {
|
|
|
599
599
|
codex: items.filter(i => i.platforms?.codex).length,
|
|
600
600
|
gemini: items.filter(i => i.platforms?.gemini).length,
|
|
601
601
|
opencode: items.filter(i => i.platforms?.opencode).length,
|
|
602
|
-
|
|
602
|
+
omp: items.filter(i => i.platforms?.omp).length
|
|
603
603
|
};
|
|
604
604
|
|
|
605
605
|
stats.byType[type] = typeStats;
|
|
@@ -608,7 +608,7 @@ class ConfigRegistryService {
|
|
|
608
608
|
stats.byPlatform.codex += typeStats.codex;
|
|
609
609
|
stats.byPlatform.gemini += typeStats.gemini;
|
|
610
610
|
stats.byPlatform.opencode += typeStats.opencode;
|
|
611
|
-
stats.byPlatform.
|
|
611
|
+
stats.byPlatform.omp += typeStats.omp;
|
|
612
612
|
}
|
|
613
613
|
|
|
614
614
|
return stats;
|
|
@@ -30,7 +30,7 @@ const CLAUDE_CODE_DIR = NATIVE_PATHS.claude.dir || path.dirname(NATIVE_PATHS.cla
|
|
|
30
30
|
const CODEX_DIR = path.join(HOME, '.codex');
|
|
31
31
|
const GEMINI_DIR = path.join(HOME, '.gemini');
|
|
32
32
|
const OPENCODE_DIR = NATIVE_PATHS.opencode.config;
|
|
33
|
-
const
|
|
33
|
+
const OMP_AGENT_DIR = NATIVE_PATHS.omp.dir;
|
|
34
34
|
const CODEX_CONFIG_PATH = NATIVE_PATHS.codex.config;
|
|
35
35
|
|
|
36
36
|
// Config type definitions
|
|
@@ -47,8 +47,8 @@ const CONFIG_TYPES = {
|
|
|
47
47
|
opencodeTarget: 'skills',
|
|
48
48
|
opencodeLegacyTarget: 'skill',
|
|
49
49
|
opencodeSupported: true,
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
ompTarget: 'skills',
|
|
51
|
+
ompSupported: true
|
|
52
52
|
},
|
|
53
53
|
commands: {
|
|
54
54
|
isDirectory: false,
|
|
@@ -63,8 +63,8 @@ const CONFIG_TYPES = {
|
|
|
63
63
|
opencodeTarget: 'commands',
|
|
64
64
|
opencodeLegacyTarget: 'command',
|
|
65
65
|
opencodeSupported: true,
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
ompTarget: 'commands',
|
|
67
|
+
ompSupported: true
|
|
68
68
|
},
|
|
69
69
|
agents: {
|
|
70
70
|
isDirectory: false,
|
|
@@ -76,7 +76,7 @@ const CONFIG_TYPES = {
|
|
|
76
76
|
opencodeTarget: 'agents',
|
|
77
77
|
opencodeLegacyTarget: 'agent',
|
|
78
78
|
opencodeSupported: true,
|
|
79
|
-
|
|
79
|
+
ompSupported: false
|
|
80
80
|
},
|
|
81
81
|
plugins: {
|
|
82
82
|
isDirectory: true,
|
|
@@ -86,8 +86,8 @@ const CONFIG_TYPES = {
|
|
|
86
86
|
opencodeTarget: 'plugins',
|
|
87
87
|
opencodeLegacyTarget: 'plugin',
|
|
88
88
|
opencodeSupported: true,
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
ompTarget: 'extensions',
|
|
90
|
+
ompSupported: true
|
|
91
91
|
}
|
|
92
92
|
};
|
|
93
93
|
|
|
@@ -99,7 +99,7 @@ class ConfigSyncManager {
|
|
|
99
99
|
this.codexDir = CODEX_DIR;
|
|
100
100
|
this.geminiDir = GEMINI_DIR;
|
|
101
101
|
this.opencodeDir = OPENCODE_DIR;
|
|
102
|
-
this.
|
|
102
|
+
this.ompDir = OMP_AGENT_DIR;
|
|
103
103
|
this.configTypes = CONFIG_TYPES;
|
|
104
104
|
}
|
|
105
105
|
|
|
@@ -588,13 +588,13 @@ class ConfigSyncManager {
|
|
|
588
588
|
* Sync a config item to OMP.
|
|
589
589
|
* OMP treats commands as slash-command files and plugins as extensions/packages.
|
|
590
590
|
*/
|
|
591
|
-
|
|
591
|
+
syncToOmp(type, name) {
|
|
592
592
|
const config = this.configTypes[type];
|
|
593
593
|
if (!config) {
|
|
594
594
|
return { success: false, error: `Unknown config type: ${type}` };
|
|
595
595
|
}
|
|
596
596
|
|
|
597
|
-
if (!config.
|
|
597
|
+
if (!config.ompSupported) {
|
|
598
598
|
console.log(`[ConfigSyncManager] ${type} not supported natively by OMP, skipping`);
|
|
599
599
|
return { success: true, skipped: true, reason: 'Not supported natively by OMP' };
|
|
600
600
|
}
|
|
@@ -610,7 +610,7 @@ class ConfigSyncManager {
|
|
|
610
610
|
return { success: false, error: 'Source not found' };
|
|
611
611
|
}
|
|
612
612
|
|
|
613
|
-
const targetPath = path.join(this.
|
|
613
|
+
const targetPath = path.join(this.ompDir, config.ompTarget, safeName);
|
|
614
614
|
try {
|
|
615
615
|
if (config.isDirectory) {
|
|
616
616
|
this._ensureDir(path.dirname(targetPath));
|
|
@@ -629,7 +629,7 @@ class ConfigSyncManager {
|
|
|
629
629
|
}
|
|
630
630
|
}
|
|
631
631
|
|
|
632
|
-
|
|
632
|
+
removeFromOmp(type, name) {
|
|
633
633
|
const config = this.configTypes[type];
|
|
634
634
|
if (!config) {
|
|
635
635
|
return { success: false, error: `Unknown config type: ${type}` };
|
|
@@ -640,11 +640,11 @@ class ConfigSyncManager {
|
|
|
640
640
|
return { success: false, error: 'Invalid config item name' };
|
|
641
641
|
}
|
|
642
642
|
|
|
643
|
-
if (!config.
|
|
643
|
+
if (!config.ompSupported) {
|
|
644
644
|
return { success: true, skipped: true, reason: 'Not supported natively by OMP' };
|
|
645
645
|
}
|
|
646
646
|
|
|
647
|
-
const targetPath = path.join(this.
|
|
647
|
+
const targetPath = path.join(this.ompDir, config.ompTarget, safeName);
|
|
648
648
|
if (!fs.existsSync(targetPath)) {
|
|
649
649
|
return { success: true, message: 'Already removed' };
|
|
650
650
|
}
|
|
@@ -654,7 +654,7 @@ class ConfigSyncManager {
|
|
|
654
654
|
this._removeRecursive(targetPath);
|
|
655
655
|
} else {
|
|
656
656
|
fs.unlinkSync(targetPath);
|
|
657
|
-
this._cleanupEmptyParents(path.dirname(targetPath), path.join(this.
|
|
657
|
+
this._cleanupEmptyParents(path.dirname(targetPath), path.join(this.ompDir, config.ompTarget));
|
|
658
658
|
}
|
|
659
659
|
console.log(`[ConfigSyncManager] Removed ${type}/${name} from OMP`);
|
|
660
660
|
return { success: true };
|
|
@@ -667,7 +667,7 @@ class ConfigSyncManager {
|
|
|
667
667
|
/**
|
|
668
668
|
* Batch sync based on registry data
|
|
669
669
|
* @param {string} type - Config type
|
|
670
|
-
* @param {Object} registryItems - Registry items { name: { enabled, platforms: { claude, codex, gemini, opencode,
|
|
670
|
+
* @param {Object} registryItems - Registry items { name: { enabled, platforms: { claude, codex, gemini, opencode, omp } } }
|
|
671
671
|
* @returns {Object} Results summary
|
|
672
672
|
*/
|
|
673
673
|
syncAll(type, registryItems) {
|
|
@@ -753,17 +753,17 @@ class ConfigSyncManager {
|
|
|
753
753
|
}
|
|
754
754
|
}
|
|
755
755
|
|
|
756
|
-
if (platforms.
|
|
757
|
-
const result = this.
|
|
756
|
+
if (platforms.omp) {
|
|
757
|
+
const result = this.syncToOmp(type, name);
|
|
758
758
|
if (result.success && !result.skipped) {
|
|
759
|
-
results.synced.push({ type, name, platform: '
|
|
759
|
+
results.synced.push({ type, name, platform: 'omp' });
|
|
760
760
|
} else if (!result.success) {
|
|
761
|
-
results.errors.push({ type, name, platform: '
|
|
761
|
+
results.errors.push({ type, name, platform: 'omp', error: result.error });
|
|
762
762
|
}
|
|
763
763
|
} else {
|
|
764
|
-
const result = this.
|
|
764
|
+
const result = this.removeFromOmp(type, name);
|
|
765
765
|
if (result.success && !result.message && !result.skipped) {
|
|
766
|
-
results.removed.push({ type, name, platform: '
|
|
766
|
+
results.removed.push({ type, name, platform: 'omp' });
|
|
767
767
|
}
|
|
768
768
|
}
|
|
769
769
|
} else {
|
|
@@ -788,9 +788,9 @@ class ConfigSyncManager {
|
|
|
788
788
|
results.removed.push({ type, name, platform: 'opencode' });
|
|
789
789
|
}
|
|
790
790
|
|
|
791
|
-
const
|
|
792
|
-
if (
|
|
793
|
-
results.removed.push({ type, name, platform: '
|
|
791
|
+
const ompResult = this.removeFromOmp(type, name);
|
|
792
|
+
if (ompResult.success && !ompResult.message && !ompResult.skipped) {
|
|
793
|
+
results.removed.push({ type, name, platform: 'omp' });
|
|
794
794
|
}
|
|
795
795
|
}
|
|
796
796
|
}
|
|
@@ -25,7 +25,7 @@ const AI_CONFIG_MAP = {
|
|
|
25
25
|
codex: { fileName: 'AGENTS.md', name: 'Codex' },
|
|
26
26
|
gemini: { fileName: 'GEMINI.md', name: 'Gemini' },
|
|
27
27
|
opencode: { fileName: '.opencode/AGENTS.md', name: 'OpenCode' },
|
|
28
|
-
|
|
28
|
+
omp: { fileName: null, name: 'OMP command templates' }
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
const CLI_DEFAULT_AI_TYPE = {
|
|
@@ -33,7 +33,7 @@ const CLI_DEFAULT_AI_TYPE = {
|
|
|
33
33
|
codex: 'codex',
|
|
34
34
|
gemini: 'gemini',
|
|
35
35
|
opencode: 'opencode',
|
|
36
|
-
|
|
36
|
+
omp: 'omp'
|
|
37
37
|
};
|
|
38
38
|
|
|
39
39
|
/**
|
|
@@ -115,7 +115,7 @@ function normalizeAiConfigs(aiConfigs = {}, claudeMd = null) {
|
|
|
115
115
|
codex: { enabled: false, content: '' },
|
|
116
116
|
gemini: { enabled: false, content: '' },
|
|
117
117
|
opencode: { enabled: false, content: '' },
|
|
118
|
-
|
|
118
|
+
omp: { enabled: false, content: '' }
|
|
119
119
|
};
|
|
120
120
|
|
|
121
121
|
for (const key of Object.keys(normalized)) {
|
|
@@ -374,7 +374,7 @@ function readCurrentConfig(targetDir) {
|
|
|
374
374
|
*/
|
|
375
375
|
function getAvailableConfigs() {
|
|
376
376
|
const agentPlatforms = ['claude', 'codex', 'gemini', 'opencode'];
|
|
377
|
-
const commandPlatforms = ['claude', 'codex', 'gemini', 'opencode', '
|
|
377
|
+
const commandPlatforms = ['claude', 'codex', 'gemini', 'opencode', 'omp'];
|
|
378
378
|
const agentMap = new Map();
|
|
379
379
|
const commandMap = new Map();
|
|
380
380
|
const agentsByPlatform = {};
|
|
@@ -428,7 +428,7 @@ function getAvailableConfigs() {
|
|
|
428
428
|
|
|
429
429
|
// 按平台分别获取 skills(每个平台有独立的安装目录)
|
|
430
430
|
const skillsByPlatform = {};
|
|
431
|
-
for (const platform of ['claude', 'codex', 'gemini', 'opencode', '
|
|
431
|
+
for (const platform of ['claude', 'codex', 'gemini', 'opencode', 'omp']) {
|
|
432
432
|
const service = new SkillService(platform);
|
|
433
433
|
skillsByPlatform[platform] = service.getInstalledSkills().map(skill => ({
|
|
434
434
|
directory: skill.directory,
|
|
@@ -537,14 +537,14 @@ function writeYamlFile(filePath, data) {
|
|
|
537
537
|
}), 'utf-8');
|
|
538
538
|
}
|
|
539
539
|
|
|
540
|
-
function
|
|
540
|
+
function mergeOmpProjectPackages(targetDir, plugins = []) {
|
|
541
541
|
const packages = plugins.map(plugin => plugin.name).filter(Boolean);
|
|
542
542
|
if (packages.length === 0) {
|
|
543
543
|
return false;
|
|
544
544
|
}
|
|
545
545
|
|
|
546
|
-
const
|
|
547
|
-
const settingsPath = path.join(
|
|
546
|
+
const ompDir = path.join(targetDir, '.omp');
|
|
547
|
+
const settingsPath = path.join(ompDir, 'config.yml');
|
|
548
548
|
let settings = {};
|
|
549
549
|
if (fs.existsSync(settingsPath)) {
|
|
550
550
|
try {
|
|
@@ -629,7 +629,7 @@ function convertToOmpMcpSpec(spec = {}) {
|
|
|
629
629
|
* @param {string} targetDir - 目标项目目录
|
|
630
630
|
* @param {string} templateId - 模板 ID
|
|
631
631
|
* @param {object} options - 可选配置
|
|
632
|
-
* @param {string|string[]} options.aiConfigTypes - 选择的 AI 配置类型数组: ['claude', 'codex', 'gemini', 'opencode', '
|
|
632
|
+
* @param {string|string[]} options.aiConfigTypes - 选择的 AI 配置类型数组: ['claude', 'codex', 'gemini', 'opencode', 'omp']
|
|
633
633
|
* @param {string} options.aiConfigType - (兼容旧版) 单个 AI 配置类型
|
|
634
634
|
*/
|
|
635
635
|
function applyTemplateToProject(targetDir, templateId, options = {}) {
|
|
@@ -697,7 +697,7 @@ function applyTemplateToProject(targetDir, templateId, options = {}) {
|
|
|
697
697
|
if (aiConfigTypes.includes('codex')) {
|
|
698
698
|
pushSkipped(results.skipped, 'agent', fileName, 'Codex agents 仅支持用户级配置,项目目录应用时已跳过');
|
|
699
699
|
}
|
|
700
|
-
if (aiConfigTypes.includes('
|
|
700
|
+
if (aiConfigTypes.includes('omp')) {
|
|
701
701
|
pushSkipped(results.skipped, 'agent', fileName, 'OMP agents 需通过扩展或包提供,项目目录应用时已跳过');
|
|
702
702
|
}
|
|
703
703
|
if (written) {
|
|
@@ -720,8 +720,8 @@ function applyTemplateToProject(targetDir, templateId, options = {}) {
|
|
|
720
720
|
if (aiConfigTypes.includes('gemini')) {
|
|
721
721
|
commandTargets.push({ baseDir: path.join(targetDir, '.gemini', 'commands'), prefix: '.gemini/commands', format: 'gemini' });
|
|
722
722
|
}
|
|
723
|
-
if (aiConfigTypes.includes('
|
|
724
|
-
commandTargets.push({ baseDir: path.join(targetDir, '.omp', 'commands'), prefix: '.omp/commands', format: '
|
|
723
|
+
if (aiConfigTypes.includes('omp')) {
|
|
724
|
+
commandTargets.push({ baseDir: path.join(targetDir, '.omp', 'commands'), prefix: '.omp/commands', format: 'omp' });
|
|
725
725
|
}
|
|
726
726
|
|
|
727
727
|
for (const target of commandTargets) {
|
|
@@ -758,7 +758,7 @@ function applyTemplateToProject(targetDir, templateId, options = {}) {
|
|
|
758
758
|
|
|
759
759
|
if (template.plugins?.length > 0) {
|
|
760
760
|
results.plugins.items = template.plugins.map(p => p.name);
|
|
761
|
-
if (aiConfigTypes.includes('opencode') || aiConfigTypes.includes('
|
|
761
|
+
if (aiConfigTypes.includes('opencode') || aiConfigTypes.includes('omp')) {
|
|
762
762
|
results.plugins.applied = template.plugins.length;
|
|
763
763
|
} else {
|
|
764
764
|
for (const plugin of template.plugins) {
|
|
@@ -768,11 +768,11 @@ function applyTemplateToProject(targetDir, templateId, options = {}) {
|
|
|
768
768
|
}
|
|
769
769
|
|
|
770
770
|
const hasMcp = template.mcpServers?.length > 0;
|
|
771
|
-
const writesGenericMcpConfig = hasMcp && aiConfigTypes.some(type => type !== '
|
|
772
|
-
const writesOmpMcpConfig = hasMcp && aiConfigTypes.includes('
|
|
771
|
+
const writesGenericMcpConfig = hasMcp && aiConfigTypes.some(type => type !== 'omp');
|
|
772
|
+
const writesOmpMcpConfig = hasMcp && aiConfigTypes.includes('omp');
|
|
773
773
|
const hasPluginsForOpenCode = aiConfigTypes.includes('opencode') && template.plugins?.length > 0;
|
|
774
|
-
const
|
|
775
|
-
if (hasMcp || hasPluginsForOpenCode ||
|
|
774
|
+
const hasPluginsForOmp = aiConfigTypes.includes('omp') && template.plugins?.length > 0;
|
|
775
|
+
if (hasMcp || hasPluginsForOpenCode || hasPluginsForOmp) {
|
|
776
776
|
const mcpConfig = { mcpServers: {} };
|
|
777
777
|
const ompMcpConfig = { mcpServers: {} };
|
|
778
778
|
const opencodeConfig = { mcp: {}, plugin: [] };
|
|
@@ -825,8 +825,8 @@ function applyTemplateToProject(targetDir, templateId, options = {}) {
|
|
|
825
825
|
writeJsonFile(opencodePath, opencodeConfig);
|
|
826
826
|
}
|
|
827
827
|
|
|
828
|
-
if (
|
|
829
|
-
|
|
828
|
+
if (hasPluginsForOmp) {
|
|
829
|
+
mergeOmpProjectPackages(targetDir, template.plugins || []);
|
|
830
830
|
}
|
|
831
831
|
}
|
|
832
832
|
|
|
@@ -858,7 +858,7 @@ function applyTemplateToProject(targetDir, templateId, options = {}) {
|
|
|
858
858
|
* @param {string} targetDir - 目标项目目录
|
|
859
859
|
* @param {string} templateId - 模板 ID
|
|
860
860
|
* @param {object} options - 可选配置
|
|
861
|
-
* @param {string|string[]} options.aiConfigTypes - 选择的 AI 配置类型数组: ['claude', 'codex', 'gemini', 'opencode', '
|
|
861
|
+
* @param {string|string[]} options.aiConfigTypes - 选择的 AI 配置类型数组: ['claude', 'codex', 'gemini', 'opencode', 'omp']
|
|
862
862
|
* @param {string} options.aiConfigType - (兼容旧版) 单个 AI 配置类型
|
|
863
863
|
*/
|
|
864
864
|
function previewTemplateApplication(targetDir, templateId, options = {}) {
|
|
@@ -930,7 +930,7 @@ function previewTemplateApplication(targetDir, templateId, options = {}) {
|
|
|
930
930
|
if (aiConfigTypes.includes('codex')) {
|
|
931
931
|
pushSkipped(preview.skipped, 'agent', fileName, 'Codex agents 仅支持用户级配置,项目目录预览时已跳过');
|
|
932
932
|
}
|
|
933
|
-
if (aiConfigTypes.includes('
|
|
933
|
+
if (aiConfigTypes.includes('omp')) {
|
|
934
934
|
pushSkipped(preview.skipped, 'agent', fileName, 'OMP agents 需通过扩展或包提供,项目目录预览时已跳过');
|
|
935
935
|
}
|
|
936
936
|
if (applicable) {
|
|
@@ -945,7 +945,7 @@ function previewTemplateApplication(targetDir, templateId, options = {}) {
|
|
|
945
945
|
if (aiConfigTypes.includes('codex')) commandPrefixes.push('.codex/prompts');
|
|
946
946
|
if (aiConfigTypes.includes('opencode')) commandPrefixes.push('.opencode/commands');
|
|
947
947
|
if (aiConfigTypes.includes('gemini')) commandPrefixes.push('.gemini/commands');
|
|
948
|
-
if (aiConfigTypes.includes('
|
|
948
|
+
if (aiConfigTypes.includes('omp')) commandPrefixes.push('.omp/commands');
|
|
949
949
|
|
|
950
950
|
for (const command of template.commands) {
|
|
951
951
|
const commandName = resolveItemName(command.name, null, 'command');
|
|
@@ -969,8 +969,8 @@ function previewTemplateApplication(targetDir, templateId, options = {}) {
|
|
|
969
969
|
}
|
|
970
970
|
}
|
|
971
971
|
|
|
972
|
-
const writesGenericMcpConfig = template.mcpServers?.length > 0 && aiConfigTypes.some(type => type !== '
|
|
973
|
-
const writesOmpMcpConfig = template.mcpServers?.length > 0 && aiConfigTypes.includes('
|
|
972
|
+
const writesGenericMcpConfig = template.mcpServers?.length > 0 && aiConfigTypes.some(type => type !== 'omp');
|
|
973
|
+
const writesOmpMcpConfig = template.mcpServers?.length > 0 && aiConfigTypes.includes('omp');
|
|
974
974
|
const allServers = mcpService.getAllServers();
|
|
975
975
|
const presets = mcpService.getPresets();
|
|
976
976
|
let resolvableMcpCount = 0;
|
|
@@ -1021,11 +1021,11 @@ function previewTemplateApplication(targetDir, templateId, options = {}) {
|
|
|
1021
1021
|
}
|
|
1022
1022
|
|
|
1023
1023
|
if (template.plugins?.length > 0) {
|
|
1024
|
-
if (aiConfigTypes.includes('opencode') || aiConfigTypes.includes('
|
|
1024
|
+
if (aiConfigTypes.includes('opencode') || aiConfigTypes.includes('omp')) {
|
|
1025
1025
|
preview.summary.plugins = template.plugins.length;
|
|
1026
|
-
if (aiConfigTypes.includes('
|
|
1027
|
-
const
|
|
1028
|
-
if (fs.existsSync(
|
|
1026
|
+
if (aiConfigTypes.includes('omp')) {
|
|
1027
|
+
const ompSettingsPath = path.join(targetDir, '.omp/config.yml');
|
|
1028
|
+
if (fs.existsSync(ompSettingsPath)) {
|
|
1029
1029
|
preview.willOverwrite.push('.omp/config.yml');
|
|
1030
1030
|
} else {
|
|
1031
1031
|
preview.willCreate.push('.omp/config.yml');
|