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.
Files changed (72) hide show
  1. package/README.md +5 -6
  2. package/dist/web/assets/{Analytics-Dma_j2Rq.js → Analytics-Dpje9L84.js} +1 -1
  3. package/dist/web/assets/{ConfigTemplates-C49Y1PLH.js → ConfigTemplates-Cz6kasek.js} +1 -1
  4. package/dist/web/assets/Home-BwTaYu3q.js +1 -0
  5. package/dist/web/assets/Home-Jom_ZcdY.css +1 -0
  6. package/dist/web/assets/{PluginManager-B1ECTHyY.js → PluginManager-DsN-xNXx.js} +1 -1
  7. package/dist/web/assets/ProjectList-4BCObimU.js +1 -0
  8. package/dist/web/assets/{ProjectList-B_L55-l9.css → ProjectList-D3a0oRum.css} +1 -1
  9. package/dist/web/assets/{SessionList-CH5GwwiJ.js → SessionList-D4c8FRzq.js} +1 -1
  10. package/dist/web/assets/{SkillManager-CRyVhjYQ.js → SkillManager-C-KYbXB5.js} +1 -1
  11. package/dist/web/assets/{WorkspaceManager-CO9tclVt.js → WorkspaceManager-B-BlPJHX.js} +1 -1
  12. package/dist/web/assets/index-Btfvh0GG.js +2 -0
  13. package/dist/web/assets/{index-CM26UrnJ.css → index-CLNa6DhH.css} +1 -1
  14. package/dist/web/index.html +2 -2
  15. package/package.json +2 -1
  16. package/src/commands/channels.js +8 -8
  17. package/src/commands/daemon.js +4 -4
  18. package/src/commands/doctor.js +1 -1
  19. package/src/commands/logs.js +1 -3
  20. package/src/commands/port-config.js +4 -4
  21. package/src/commands/proxy-control.js +13 -13
  22. package/src/commands/stats.js +6 -6
  23. package/src/commands/toggle-proxy.js +8 -8
  24. package/src/config/default.js +3 -3
  25. package/src/config/paths.js +46 -49
  26. package/src/index.js +4 -5
  27. package/src/server/api/commands.js +1 -1
  28. package/src/server/api/config-export.js +2 -2
  29. package/src/server/api/config-registry.js +1 -1
  30. package/src/server/api/config.js +1 -1
  31. package/src/server/api/dashboard.js +16 -16
  32. package/src/server/api/mcp.js +2 -2
  33. package/src/server/api/{pi-channels.js → omp-channels.js} +15 -15
  34. package/src/server/api/{pi-config.js → omp-config.js} +13 -13
  35. package/src/server/api/{pi-projects.js → omp-projects.js} +5 -5
  36. package/src/server/api/{pi-proxy.js → omp-proxy.js} +18 -18
  37. package/src/server/api/{pi-sessions.js → omp-sessions.js} +21 -21
  38. package/src/server/api/{pi-statistics.js → omp-statistics.js} +1 -1
  39. package/src/server/api/plugins.js +1 -1
  40. package/src/server/api/skills.js +1 -1
  41. package/src/server/api/workspaces.js +1 -1
  42. package/src/server/index.js +10 -10
  43. package/src/server/{pi-proxy-server.js → omp-proxy-server.js} +13 -13
  44. package/src/server/services/channel-balance.js +3 -3
  45. package/src/server/services/channel-scheduler.js +4 -4
  46. package/src/server/services/commands-service.js +5 -5
  47. package/src/server/services/config-export-service.js +53 -53
  48. package/src/server/services/config-registry-service.js +8 -8
  49. package/src/server/services/config-sync-manager.js +26 -26
  50. package/src/server/services/config-templates-service.js +28 -28
  51. package/src/server/services/mcp-service.js +20 -20
  52. package/src/server/services/notification-hooks.js +138 -6
  53. package/src/server/services/{pi-auth-providers.js → omp-auth-providers.js} +2 -2
  54. package/src/server/services/{pi-channels.js → omp-channels.js} +5 -5
  55. package/src/server/services/{pi-config.js → omp-config.js} +47 -65
  56. package/src/server/services/{pi-sessions.js → omp-sessions.js} +20 -20
  57. package/src/server/services/{pi-settings-manager.js → omp-settings-manager.js} +422 -18
  58. package/src/server/services/{pi-statistics-service.js → omp-statistics-service.js} +2 -2
  59. package/src/server/services/plugins-service.js +122 -122
  60. package/src/server/services/prompts-service.js +20 -20
  61. package/src/server/services/proxy-log-helper.js +1 -1
  62. package/src/server/services/proxy-runtime.js +1 -1
  63. package/src/server/services/skill-service.js +7 -7
  64. package/src/server/services/speed-test.js +29 -29
  65. package/src/server/services/ui-config.js +3 -3
  66. package/src/server/services/workspace-service.js +8 -8
  67. package/src/server/websocket-server.js +4 -4
  68. package/src/shared/platforms.js +201 -0
  69. package/dist/web/assets/Home-DGGC8H4g.js +0 -1
  70. package/dist/web/assets/Home-ewgeIhF7.css +0 -1
  71. package/dist/web/assets/ProjectList-DyiGyT-H.js +0 -1
  72. 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 piChannelsService = require('./pi-channels');
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', 'pi'];
59
- const SKILL_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', 'pi'];
60
- const PLUGIN_PLATFORMS = ['claude', 'codex', 'gemini', 'opencode', 'pi'];
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 PI_SETTINGS_PATH = NATIVE_PATHS.pi?.settings || path.join(PATHS.base, 'pi-config.yml');
67
- const PI_EXTENSIONS_DIR = NATIVE_PATHS.pi?.extensions || path.join(PATHS.base, 'pi-extensions');
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 normalizePiResourceType(value = '') {
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 normalizePiResourceTypes(input = []) {
93
+ function normalizeOmpResourceTypes(input = []) {
94
94
  const result = [];
95
95
  const add = (value) => {
96
- const normalized = normalizePiResourceType(value);
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 piDir = NATIVE_PATHS.pi.dir || path.dirname(NATIVE_PATHS.pi.settings);
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
- pi: {
155
- settings: { path: NATIVE_PATHS.pi.settings, format: 'yaml' },
156
- auth: { path: NATIVE_PATHS.pi.auth, format: 'json', mode: 0o600 },
157
- models: { path: NATIVE_PATHS.pi.models, format: 'yaml' },
158
- commands: { path: NATIVE_PATHS.pi.commands || path.join(piDir, 'commands'), format: 'directory' },
159
- prompts: { path: NATIVE_PATHS.pi.prompts, format: 'directory' },
160
- skills: { path: NATIVE_PATHS.pi.skills, format: 'directory' },
161
- extensions: { path: NATIVE_PATHS.pi.extensions, format: 'directory' },
162
- themes: { path: NATIVE_PATHS.pi.themes || path.join(piDir, 'themes'), format: 'directory' },
163
- packages: { path: NATIVE_PATHS.pi.packages || path.join(piDir, 'packages'), format: 'directory' },
164
- npmPackages: { path: path.join(piDir, 'npm'), format: 'directory' },
165
- gitPackages: { path: path.join(piDir, 'git'), format: 'directory' }
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: normalizePiResourceTypes(plugin.resourceTypes || plugin.resources),
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 exportPiPluginsByPlatform(service) {
1111
+ function exportOmpPluginsByPlatform(service) {
1112
1112
  const plugins = (service.listPlugins().plugins || [])
1113
1113
  .map((plugin) => {
1114
- if (plugin.pluginType === 'package' || plugin.source === 'pi-settings') {
1114
+ if (plugin.pluginType === 'package' || plugin.source === 'omp-settings') {
1115
1115
  return {
1116
- platform: 'pi',
1117
- type: 'pi-package',
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 || 'pi-settings'
1126
+ source: plugin.source || 'omp-settings'
1127
1127
  };
1128
1128
  }
1129
- return buildManagedPluginExportItem(plugin, 'pi', PI_EXTENSIONS_DIR, {
1130
- type: 'pi-extension',
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: ['pi.json', 'extension.json', 'plugin.json', 'package.json']
1133
+ manifestCandidates: ['omp.json', 'extension.json', 'plugin.json', 'package.json']
1134
1134
  });
1135
1135
  })
1136
1136
  .filter(Boolean);
1137
- const control = exportPluginControlSnapshot('pi', service);
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 === 'pi') {
1152
- result[platform] = exportPiPluginsByPlatform(service);
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 writePiPluginSettings(plugins = [], snapshot = {}, overwrite = true) {
1518
+ function writeOmpPluginSettings(plugins = [], snapshot = {}, overwrite = true) {
1519
1519
  const nativeSettings = snapshot.control?.nativeSettings;
1520
1520
  if (nativeSettings?.content !== undefined) {
1521
- return writeNativeConfigAbsolute({ path: PI_SETTINGS_PATH, format: 'yaml' }, {
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(PI_SETTINGS_PATH) || {};
1528
- if (fs.existsSync(PI_SETTINGS_PATH) && !overwrite) {
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 === 'pi-package' || plugin.pluginType === 'package');
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 = normalizePiResourceTypes(plugin.resourceTypes || plugin.resources);
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(PI_SETTINGS_PATH, {
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 === 'pi' && (hasControl || plugins.length > 0)) {
1666
- applyImportStatus(results, writePiPluginSettings(plugins, snapshot, overwrite));
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 === 'pi') {
1679
- if (plugin.type === 'pi-package' || plugin.pluginType === 'package') {
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, PI_EXTENSIONS_DIR, overwrite));
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 pi = piChannelsService.getChannels()?.channels || [];
1754
- return { claude, codex, gemini, opencode, pi };
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
- pi: hasTypedChannels && Array.isArray(channelsByType.pi) ? channelsByType.pi : []
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('pi', piChannelsService, channel => {
2063
+ importTypedChannels('omp', ompChannelsService, channel => {
2064
2064
  const { name, baseUrl, apiKey, ...extraConfig } = channel;
2065
- piChannelsService.createChannel(name, baseUrl, apiKey, extraConfig);
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.pi || []).length > 0 && typeof piChannelsService.syncManagedProviderExtension === 'function') {
2072
- piChannelsService.syncManagedProviderExtension();
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', 'pi'];
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, pi: true },
34
- commands: { claude: true, codex: true, gemini: true, opencode: true, pi: true },
35
- agents: { claude: true, codex: true, gemini: true, opencode: true, pi: false },
36
- plugins: { claude: true, codex: false, gemini: false, opencode: true, pi: 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
- pi: 0
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
- pi: items.filter(i => i.platforms?.pi).length
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.pi += typeStats.pi;
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 PI_AGENT_DIR = NATIVE_PATHS.pi.dir;
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
- piTarget: 'skills',
51
- piSupported: true
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
- piTarget: 'commands',
67
- piSupported: true
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
- piSupported: false
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
- piTarget: 'extensions',
90
- piSupported: true
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.piDir = PI_AGENT_DIR;
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
- syncToPi(type, name) {
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.piSupported) {
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.piDir, config.piTarget, safeName);
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
- removeFromPi(type, name) {
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.piSupported) {
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.piDir, config.piTarget, safeName);
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.piDir, config.piTarget));
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, pi } } }
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.pi) {
757
- const result = this.syncToPi(type, name);
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: 'pi' });
759
+ results.synced.push({ type, name, platform: 'omp' });
760
760
  } else if (!result.success) {
761
- results.errors.push({ type, name, platform: 'pi', error: result.error });
761
+ results.errors.push({ type, name, platform: 'omp', error: result.error });
762
762
  }
763
763
  } else {
764
- const result = this.removeFromPi(type, name);
764
+ const result = this.removeFromOmp(type, name);
765
765
  if (result.success && !result.message && !result.skipped) {
766
- results.removed.push({ type, name, platform: 'pi' });
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 piResult = this.removeFromPi(type, name);
792
- if (piResult.success && !piResult.message && !piResult.skipped) {
793
- results.removed.push({ type, name, platform: 'pi' });
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
- pi: { fileName: null, name: 'OMP command templates' }
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
- pi: 'pi'
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
- pi: { enabled: false, content: '' }
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', 'pi'];
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', 'pi']) {
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 mergePiProjectPackages(targetDir, plugins = []) {
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 piDir = path.join(targetDir, '.omp');
547
- const settingsPath = path.join(piDir, 'config.yml');
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', 'pi']
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('pi')) {
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('pi')) {
724
- commandTargets.push({ baseDir: path.join(targetDir, '.omp', 'commands'), prefix: '.omp/commands', format: 'pi' });
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('pi')) {
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 !== 'pi');
772
- const writesOmpMcpConfig = hasMcp && aiConfigTypes.includes('pi');
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 hasPluginsForPi = aiConfigTypes.includes('pi') && template.plugins?.length > 0;
775
- if (hasMcp || hasPluginsForOpenCode || hasPluginsForPi) {
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 (hasPluginsForPi) {
829
- mergePiProjectPackages(targetDir, template.plugins || []);
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', 'pi']
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('pi')) {
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('pi')) commandPrefixes.push('.omp/commands');
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 !== 'pi');
973
- const writesOmpMcpConfig = template.mcpServers?.length > 0 && aiConfigTypes.includes('pi');
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('pi')) {
1024
+ if (aiConfigTypes.includes('opencode') || aiConfigTypes.includes('omp')) {
1025
1025
  preview.summary.plugins = template.plugins.length;
1026
- if (aiConfigTypes.includes('pi')) {
1027
- const piSettingsPath = path.join(targetDir, '.omp/config.yml');
1028
- if (fs.existsSync(piSettingsPath)) {
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');