scalemax 0.1.5 → 0.1.6

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 (38) hide show
  1. package/README.md +7 -3
  2. package/dist/clients.js +12 -15
  3. package/dist/commands/doctor.js +1 -1
  4. package/dist/configure/api-code.js +15 -0
  5. package/dist/configure/cherry-studio.js +15 -0
  6. package/dist/configure/claude.js +13 -3
  7. package/dist/configure/codex.js +2 -2
  8. package/dist/configure/opencode.js +19 -2
  9. package/dist/configure/paths.js +7 -11
  10. package/dist/configure/templates.js +1 -1
  11. package/dist/configure/trae-solo.js +15 -0
  12. package/dist/detect/api-code.js +2 -0
  13. package/dist/detect/cherry-studio.js +2 -0
  14. package/dist/detect/common.js +12 -30
  15. package/dist/detect/trae-solo.js +2 -0
  16. package/dist/types/client.d.ts +1 -1
  17. package/dist/utils/api.js +1 -1
  18. package/package.json +6 -6
  19. package/dist/configure/cline.d.ts +0 -3
  20. package/dist/configure/cline.js +0 -13
  21. package/dist/configure/continue.js +0 -12
  22. package/dist/configure/roo.d.ts +0 -3
  23. package/dist/configure/roo.js +0 -13
  24. package/dist/configure/vscode.js +0 -13
  25. package/dist/configure/windsurf.js +0 -13
  26. package/dist/detect/cline.js +0 -2
  27. package/dist/detect/continue.js +0 -2
  28. package/dist/detect/roo.js +0 -2
  29. package/dist/detect/vscode.d.ts +0 -2
  30. package/dist/detect/vscode.js +0 -2
  31. package/dist/detect/windsurf.d.ts +0 -2
  32. package/dist/detect/windsurf.js +0 -2
  33. /package/dist/configure/{continue.d.ts → api-code.d.ts} +0 -0
  34. /package/dist/configure/{vscode.d.ts → cherry-studio.d.ts} +0 -0
  35. /package/dist/configure/{windsurf.d.ts → trae-solo.d.ts} +0 -0
  36. /package/dist/detect/{cline.d.ts → api-code.d.ts} +0 -0
  37. /package/dist/detect/{continue.d.ts → cherry-studio.d.ts} +0 -0
  38. /package/dist/detect/{roo.d.ts → trae-solo.d.ts} +0 -0
package/README.md CHANGED
@@ -98,15 +98,19 @@ SCALEMAX_API_KEY=sm_live_xxx scalemax models
98
98
 
99
99
  ## Supported clients
100
100
 
101
+ `npx scalemax` now focuses on the supported non-VS-Code client set:
102
+
101
103
  - Codex
102
104
  - Cursor
105
+ - TRAE SOLO
103
106
  - Claude Code
104
107
  - OpenCode
105
108
  - OpenClaw
106
109
  - Hermes
107
- - Continue
108
- - VS Code
109
- - Windsurf
110
+ - Cherry Studio
111
+ - API Code
112
+
113
+ For clients without a stable official config file, the installer writes a ScaleMax setup guide under `~/.scalemax/` instead of modifying private app storage.
110
114
 
111
115
  ## Examples
112
116
 
package/dist/clients.js CHANGED
@@ -2,31 +2,28 @@ import * as codexDetect from './detect/codex.js';
2
2
  import * as codexConfig from './configure/codex.js';
3
3
  import * as cursorDetect from './detect/cursor.js';
4
4
  import * as cursorConfig from './configure/cursor.js';
5
+ import * as traeSoloDetect from './detect/trae-solo.js';
6
+ import * as traeSoloConfig from './configure/trae-solo.js';
7
+ import * as claudeDetect from './detect/claude.js';
8
+ import * as claudeConfig from './configure/claude.js';
5
9
  import * as opencodeDetect from './detect/opencode.js';
6
10
  import * as opencodeConfig from './configure/opencode.js';
7
11
  import * as openclawDetect from './detect/openclaw.js';
8
12
  import * as openclawConfig from './configure/openclaw.js';
9
13
  import * as hermesDetect from './detect/hermes.js';
10
14
  import * as hermesConfig from './configure/hermes.js';
11
- import * as continueDetect from './detect/continue.js';
12
- import * as continueConfig from './configure/continue.js';
13
- import * as vscodeDetect from './detect/vscode.js';
14
- import * as vscodeConfig from './configure/vscode.js';
15
- import * as rooDetect from './detect/roo.js';
16
- import * as rooConfig from './configure/roo.js';
17
- import * as clineDetect from './detect/cline.js';
18
- import * as clineConfig from './configure/cline.js';
19
- import * as windsurfDetect from './detect/windsurf.js';
20
- import * as windsurfConfig from './configure/windsurf.js';
15
+ import * as cherryStudioDetect from './detect/cherry-studio.js';
16
+ import * as cherryStudioConfig from './configure/cherry-studio.js';
17
+ import * as apiCodeDetect from './detect/api-code.js';
18
+ import * as apiCodeConfig from './configure/api-code.js';
21
19
  export const clients = [
22
20
  { id: 'codex', name: 'Codex', detect: codexDetect.detect, install: codexConfig.install, configure: codexConfig.configure, verify: codexConfig.verify, launch: codexConfig.launch, remove: codexConfig.remove },
23
21
  { id: 'cursor', name: 'Cursor', detect: cursorDetect.detect, configure: cursorConfig.configure, remove: cursorConfig.remove },
22
+ { id: 'trae-solo', name: 'TRAE SOLO', detect: traeSoloDetect.detect, configure: traeSoloConfig.configure, remove: traeSoloConfig.remove },
23
+ { id: 'claude', name: 'Claude Code', detect: claudeDetect.detect, configure: claudeConfig.configure, remove: claudeConfig.remove },
24
24
  { id: 'opencode', name: 'OpenCode', detect: opencodeDetect.detect, configure: opencodeConfig.configure, remove: opencodeConfig.remove },
25
25
  { id: 'openclaw', name: 'OpenClaw', detect: openclawDetect.detect, configure: openclawConfig.configure, remove: openclawConfig.remove },
26
26
  { id: 'hermes', name: 'Hermes', detect: hermesDetect.detect, configure: hermesConfig.configure, remove: hermesConfig.remove },
27
- { id: 'vscode', name: 'Continue Extension (VS Code)', detect: vscodeDetect.detect, configure: vscodeConfig.configure, remove: vscodeConfig.remove },
28
- { id: 'roo', name: 'Roo Code (VS Code)', detect: rooDetect.detect, configure: rooConfig.configure, remove: rooConfig.remove },
29
- { id: 'cline', name: 'Cline (VS Code)', detect: clineDetect.detect, configure: clineConfig.configure, remove: clineConfig.remove },
30
- { id: 'continue', name: 'Continue', detect: continueDetect.detect, configure: continueConfig.configure, remove: continueConfig.remove },
31
- { id: 'windsurf', name: 'Windsurf', detect: windsurfDetect.detect, configure: windsurfConfig.configure, remove: windsurfConfig.remove }
27
+ { id: 'cherry-studio', name: 'Cherry Studio', detect: cherryStudioDetect.detect, configure: cherryStudioConfig.configure, remove: cherryStudioConfig.remove },
28
+ { id: 'api-code', name: 'API Code', detect: apiCodeDetect.detect, configure: apiCodeConfig.configure, remove: apiCodeConfig.remove }
32
29
  ];
@@ -24,7 +24,7 @@ export async function doctorCommand(home = homeDir()) {
24
24
  failures++;
25
25
  }
26
26
  const st = ora('Checking streaming').start();
27
- const stream = await testStreaming(key, res.models.find(m => m.id === 'gpt-5.5')?.id || res.models[0]?.id);
27
+ const stream = await testStreaming(key, res.models.find(m => m.id === 'gpt-5.6-terra')?.id || res.models[0]?.id);
28
28
  if (stream.ok)
29
29
  st.succeed('Streaming available');
30
30
  else {
@@ -0,0 +1,15 @@
1
+ import { clientConfigPath } from './paths.js';
2
+ import { writeManagedConfig, removeManagedConfig } from './common.js';
3
+ import { jsonConfig } from './templates.js';
4
+ const id = 'api-code';
5
+ const name = 'API Code';
6
+ export async function configure(ctx) {
7
+ const file = clientConfigPath(id, ctx.home, ctx.platform);
8
+ const content = jsonConfig(name, ctx.apiKey, ctx.baseUrl, { "environment": { "SCALEMAX_API_KEY": "your ScaleMax API key", "SCALEMAX_BASE_URL": "https://api.scalemax.pro/v1" }, "node": "import OpenAI from 'openai';\nconst client = new OpenAI({ apiKey: process.env.SCALEMAX_API_KEY, baseURL: 'https://api.scalemax.pro/v1' });", "python": "from openai import OpenAI\nclient = OpenAI(api_key='...', base_url='https://api.scalemax.pro/v1')" });
9
+ const result = await writeManagedConfig(ctx, id, name, file, content);
10
+ return { ...result, message: 'API code examples written' };
11
+ }
12
+ export async function remove(ctx) {
13
+ const file = clientConfigPath(id, ctx.home, ctx.platform);
14
+ return removeManagedConfig(ctx, id, name, file);
15
+ }
@@ -0,0 +1,15 @@
1
+ import { clientConfigPath } from './paths.js';
2
+ import { writeManagedConfig, removeManagedConfig } from './common.js';
3
+ import { jsonConfig } from './templates.js';
4
+ const id = 'cherry-studio';
5
+ const name = 'Cherry Studio';
6
+ export async function configure(ctx) {
7
+ const file = clientConfigPath(id, ctx.home, ctx.platform);
8
+ const content = jsonConfig(name, ctx.apiKey, ctx.baseUrl, { "officialSetup": ["Settings > Model Service / Model Providers", "Provider type: OpenAI or OpenAI Compatible", "API host/base URL: https://api.scalemax.pro/v1", "Add ScaleMax model IDs or fetch from /v1/models"], "recommendedModel": "gpt-5.6-terra" });
9
+ const result = await writeManagedConfig(ctx, id, name, file, content);
10
+ return { ...result, message: 'setup guide written; enter these values in Cherry Studio model provider settings' };
11
+ }
12
+ export async function remove(ctx) {
13
+ const file = clientConfigPath(id, ctx.home, ctx.platform);
14
+ return removeManagedConfig(ctx, id, name, file);
15
+ }
@@ -1,12 +1,22 @@
1
1
  import { clientConfigPath } from './paths.js';
2
2
  import { writeManagedConfig, removeManagedConfig } from './common.js';
3
- import { jsonConfig } from './templates.js';
4
3
  const id = 'claude';
5
4
  const name = 'Claude Code';
6
5
  export async function configure(ctx) {
7
6
  const file = clientConfigPath(id, ctx.home, ctx.platform);
8
- const content = jsonConfig(name, ctx.apiKey, ctx.baseUrl);
9
- return writeManagedConfig(ctx, id, name, file, content);
7
+ const content = JSON.stringify({
8
+ env: {
9
+ ANTHROPIC_AUTH_TOKEN: ctx.apiKey,
10
+ ANTHROPIC_BASE_URL: ctx.baseUrl,
11
+ ANTHROPIC_MODEL: 'gpt-5.6-terra'
12
+ },
13
+ scalemax: {
14
+ managedBy: 'ScaleMax CLI',
15
+ note: 'Claude Code uses Anthropic Messages, not OpenAI Chat Completions. This file stores ScaleMax values, but Claude Code requires a ScaleMax Anthropic-compatible endpoint before it can work reliably.'
16
+ }
17
+ }, null, 2) + '\n';
18
+ const result = await writeManagedConfig(ctx, id, name, file, content);
19
+ return { ...result, message: 'settings written; Claude Code requires Anthropic-compatible ScaleMax endpoint' };
10
20
  }
11
21
  export async function remove(ctx) {
12
22
  const file = clientConfigPath(id, ctx.home, ctx.platform);
@@ -8,9 +8,9 @@ import { commandExists } from '../utils/exec.js';
8
8
  const id = 'codex';
9
9
  const name = 'Codex';
10
10
  const provider = 'scalemax';
11
- const model = 'gpt-5.5';
11
+ const model = 'gpt-5.6-terra';
12
12
  function codexConfig(baseUrl) {
13
- return `# ${GENERATED_HEADER}\nmodel = "${model}"\nmodel_provider = "${provider}"\ndisable_response_storage = true\n# Recommended ScaleMax Codex models: gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.3-codex.\n# Provider-internal gpt-5.3-codex-spark is routed behind the public gpt-5.3-codex Codex slug.\n\n[model_providers.${provider}]\nname = "ScaleMax"\nbase_url = "${baseUrl}"\nwire_api = "responses"\nrequires_openai_auth = true\n`;
13
+ return `# ${GENERATED_HEADER}\nmodel = "${model}"\nmodel_provider = "${provider}"\ndisable_response_storage = true\n# Recommended ScaleMax Codex models: gpt-5.6-terra, gpt-5.4, gpt-5.4-mini, gpt-5.3-codex.\n# Provider-internal gpt-5.3-codex-spark is routed behind the public gpt-5.3-codex Codex slug.\n\n[model_providers.${provider}]\nname = "ScaleMax"\nbase_url = "${baseUrl}"\nwire_api = "responses"\nrequires_openai_auth = true\n`;
14
14
  }
15
15
  function codexAuth(apiKey) {
16
16
  return JSON.stringify({ auth_mode: 'apikey', OPENAI_API_KEY: apiKey }, null, 2) + '\n';
@@ -1,11 +1,28 @@
1
1
  import { clientConfigPath } from './paths.js';
2
2
  import { writeManagedConfig, removeManagedConfig } from './common.js';
3
- import { jsonConfig } from './templates.js';
4
3
  const id = 'opencode';
5
4
  const name = 'OpenCode';
6
5
  export async function configure(ctx) {
7
6
  const file = clientConfigPath(id, ctx.home, ctx.platform);
8
- const content = jsonConfig(name, ctx.apiKey, ctx.baseUrl);
7
+ const content = JSON.stringify({
8
+ $schema: 'https://opencode.ai/config.json',
9
+ provider: {
10
+ scalemax: {
11
+ npm: '@ai-sdk/openai-compatible',
12
+ name: 'ScaleMax',
13
+ options: { baseURL: ctx.baseUrl, apiKey: ctx.apiKey },
14
+ models: {
15
+ 'gpt-5.6-luna': { name: 'GPT-5.6 Luna' },
16
+ 'gpt-5.6-terra': { name: 'GPT-5.6 Terra' },
17
+ 'gpt-5.6-sol': { name: 'GPT-5.6 Sol' },
18
+ 'gpt-5.4': { name: 'GPT-5.4' },
19
+ 'gpt-5.4-mini': { name: 'GPT-5.4 Mini' },
20
+ 'gpt-5.3-codex': { name: 'GPT-5.3 Codex' },
21
+ 'codex-auto-review': { name: 'Codex Auto Review' }
22
+ }
23
+ }
24
+ }
25
+ }, null, 2) + '\n';
9
26
  return writeManagedConfig(ctx, id, name, file, content);
10
27
  }
11
28
  export async function remove(ctx) {
@@ -9,15 +9,13 @@ export function clientConfigPath(id, home, platform, env = process.env) {
9
9
  switch (id) {
10
10
  case 'codex': return codexConfigPath(home);
11
11
  case 'cursor': return platform === 'win32' ? path.join(app, 'Cursor', 'User', 'settings.json') : platform === 'darwin' ? path.join(home, 'Library', 'Application Support', 'Cursor', 'User', 'settings.json') : path.join(linux, 'Cursor', 'User', 'settings.json');
12
+ case 'trae-solo': return path.join(home, '.scalemax', 'trae-solo.setup.json');
12
13
  case 'claude': return path.join(home, '.claude', 'settings.json');
13
- case 'opencode': return path.join(linux, 'opencode', 'config.json');
14
+ case 'opencode': return path.join(linux, 'opencode', 'opencode.json');
14
15
  case 'openclaw': return path.join(home, '.openclaw', 'config.json');
15
16
  case 'hermes': return path.join(home, '.hermes', 'config', 'scalemax.json');
16
- case 'continue': return path.join(home, '.continue', 'config.json');
17
- case 'roo': return path.join(home, '.scalemax', 'roo-code-vscode.manual.json');
18
- case 'cline': return path.join(home, '.scalemax', 'cline-vscode.manual.json');
19
- case 'vscode': return platform === 'win32' ? path.join(app, 'Code', 'User', 'settings.json') : platform === 'darwin' ? path.join(home, 'Library', 'Application Support', 'Code', 'User', 'settings.json') : path.join(linux, 'Code', 'User', 'settings.json');
20
- case 'windsurf': return platform === 'win32' ? path.join(app, 'Windsurf', 'User', 'settings.json') : platform === 'darwin' ? path.join(home, 'Library', 'Application Support', 'Windsurf', 'User', 'settings.json') : path.join(linux, 'Windsurf', 'User', 'settings.json');
17
+ case 'cherry-studio': return path.join(home, '.scalemax', 'cherry-studio.setup.json');
18
+ case 'api-code': return path.join(home, '.scalemax', 'api-code.examples.json');
21
19
  }
22
20
  }
23
21
  export function installHints(id, home, platform, env = process.env) {
@@ -26,14 +24,12 @@ export function installHints(id, home, platform, env = process.env) {
26
24
  switch (id) {
27
25
  case 'codex': return [codexDir(home), path.join(linux, 'codex')];
28
26
  case 'cursor': return [platform === 'darwin' ? '/Applications/Cursor.app' : path.join(app, 'Cursor'), path.join(linux, 'Cursor')];
27
+ case 'trae-solo': return [platform === 'darwin' ? '/Applications/Trae.app' : path.join(app, 'Trae'), path.join(linux, 'Trae')];
29
28
  case 'claude': return [path.join(home, '.claude')];
30
29
  case 'opencode': return [path.join(linux, 'opencode')];
31
30
  case 'openclaw': return [path.join(home, '.openclaw'), path.join(linux, 'openclaw')];
32
31
  case 'hermes': return [path.join(home, '.hermes')];
33
- case 'continue': return [path.join(home, '.continue')];
34
- case 'roo': return [];
35
- case 'cline': return [];
36
- case 'vscode': return [platform === 'darwin' ? '/Applications/Visual Studio Code.app' : path.join(app, 'Code'), path.join(linux, 'Code')];
37
- case 'windsurf': return [platform === 'darwin' ? '/Applications/Windsurf.app' : path.join(app, 'Windsurf'), path.join(linux, 'Windsurf')];
32
+ case 'cherry-studio': return [platform === 'darwin' ? '/Applications/Cherry Studio.app' : path.join(app, 'Cherry Studio'), path.join(linux, 'CherryStudio')];
33
+ case 'api-code': return [path.join(home, '.scalemax')];
38
34
  }
39
35
  }
@@ -11,7 +11,7 @@ export function jsonConfig(client, apiKey, baseUrl, extra = {}) {
11
11
  }, null, 2) + '\n';
12
12
  }
13
13
  export function continueConfig(apiKey, baseUrl) {
14
- const models = ['gpt-5.5', 'gpt-5.4', 'gpt-5.4-mini', 'gpt-5.3-codex', 'codex-auto-review'];
14
+ const models = ['gpt-5.6-luna', 'gpt-5.6-terra', 'gpt-5.6-sol', 'gpt-5.4', 'gpt-5.4-mini', 'gpt-5.3-codex', 'codex-auto-review'];
15
15
  return JSON.stringify({
16
16
  models: models.map(model => ({
17
17
  title: `ScaleMax ${model}`,
@@ -0,0 +1,15 @@
1
+ import { clientConfigPath } from './paths.js';
2
+ import { writeManagedConfig, removeManagedConfig } from './common.js';
3
+ import { jsonConfig } from './templates.js';
4
+ const id = 'trae-solo';
5
+ const name = 'TRAE SOLO';
6
+ export async function configure(ctx) {
7
+ const file = clientConfigPath(id, ctx.home, ctx.platform);
8
+ const content = jsonConfig(name, ctx.apiKey, ctx.baseUrl, { "officialSetup": ["Settings > Models > Add Model", "API format: OpenAI Chat Completions", "Request URL: https://api.scalemax.pro/v1/chat/completions or base URL https://api.scalemax.pro/v1", "Model ID: gpt-5.6-terra or another ScaleMax model"], "recommendedModel": "gpt-5.6-terra" });
9
+ const result = await writeManagedConfig(ctx, id, name, file, content);
10
+ return { ...result, message: 'setup guide written; enter these values in TRAE SOLO custom model settings' };
11
+ }
12
+ export async function remove(ctx) {
13
+ const file = clientConfigPath(id, ctx.home, ctx.platform);
14
+ return removeManagedConfig(ctx, id, name, file);
15
+ }
@@ -0,0 +1,2 @@
1
+ import { detectClient } from './common.js';
2
+ export function detect(ctx) { return detectClient(ctx, 'api-code', 'API Code'); }
@@ -0,0 +1,2 @@
1
+ import { detectClient } from './common.js';
2
+ export function detect(ctx) { return detectClient(ctx, 'cherry-studio', 'Cherry Studio'); }
@@ -1,30 +1,16 @@
1
1
  import fs from 'fs-extra';
2
2
  import { commandExists } from '../utils/exec.js';
3
3
  import { clientConfigPath, installHints } from '../configure/paths.js';
4
- function vscodeExtensionRoots(ctx) {
5
- const app = ctx.env.APPDATA || '';
6
- const xdg = ctx.env.XDG_DATA_HOME || pathJoin(ctx.home, '.local', 'share');
7
- if (ctx.platform === 'win32')
8
- return [pathJoin(ctx.home, '.vscode', 'extensions'), pathJoin(app, 'Code', 'User', 'globalStorage')];
9
- if (ctx.platform === 'darwin')
10
- return [pathJoin(ctx.home, '.vscode', 'extensions'), pathJoin(ctx.home, 'Library', 'Application Support', 'Code', 'User', 'globalStorage')];
11
- return [pathJoin(ctx.home, '.vscode', 'extensions'), pathJoin(xdg, 'Code', 'User', 'globalStorage')];
12
- }
13
- function pathJoin(...parts) { return parts.filter(Boolean).join('/'); }
14
- async function detectVsCodeExtension(ctx, patterns) {
15
- const hits = [];
16
- for (const root of vscodeExtensionRoots(ctx)) {
17
- const entries = await fs.readdir(root).catch(() => []);
18
- for (const entry of entries) {
19
- const lower = entry.toLowerCase();
20
- if (patterns.some(pattern => lower.includes(pattern)))
21
- hits.push(`${root}/${entry}`);
22
- }
23
- }
24
- return hits;
25
- }
26
4
  const commands = {
27
- codex: ['codex'], cursor: ['cursor'], claude: ['claude'], opencode: ['opencode'], openclaw: ['openclaw'], hermes: ['hermes'], continue: ['continue'], vscode: ['code'], roo: [], cline: [], windsurf: ['windsurf']
5
+ codex: ['codex'],
6
+ cursor: ['cursor'],
7
+ 'trae-solo': ['trae', 'trae-solo'],
8
+ claude: ['claude'],
9
+ opencode: ['opencode'],
10
+ openclaw: ['openclaw'],
11
+ hermes: ['hermes'],
12
+ 'cherry-studio': ['cherry-studio', 'cherrystudio'],
13
+ 'api-code': []
28
14
  };
29
15
  export async function detectClient(ctx, id, name) {
30
16
  const paths = [clientConfigPath(id, ctx.home, ctx.platform, ctx.env), ...installHints(id, ctx.home, ctx.platform, ctx.env)];
@@ -36,11 +22,7 @@ export async function detectClient(ctx, id, name) {
36
22
  for (const cmd of commands[id])
37
23
  if (await commandExists(cmd))
38
24
  cmdHits.push(`command:${cmd}`);
39
- const extensionHits = id === 'roo'
40
- ? await detectVsCodeExtension(ctx, ['rooveterinaryinc.roo-cline', 'roo-cline', 'roo-code'])
41
- : id === 'cline'
42
- ? await detectVsCodeExtension(ctx, ['saoudrizwan.claude-dev', 'cline.cline'])
43
- : [];
44
- const hits = [...cmdHits, ...pathHits, ...extensionHits];
45
- return { id, name, installed: hits.length > 0, reason: hits.length ? undefined : 'not detected', paths: hits };
25
+ const hits = [...cmdHits, ...pathHits];
26
+ const alwaysAvailable = id === 'api-code';
27
+ return { id, name, installed: hits.length > 0 || alwaysAvailable, reason: hits.length || alwaysAvailable ? undefined : 'not detected', paths: hits };
46
28
  }
@@ -0,0 +1,2 @@
1
+ import { detectClient } from './common.js';
2
+ export function detect(ctx) { return detectClient(ctx, 'trae-solo', 'TRAE SOLO'); }
@@ -1,4 +1,4 @@
1
- export type ClientId = 'codex' | 'cursor' | 'claude' | 'opencode' | 'openclaw' | 'hermes' | 'continue' | 'vscode' | 'roo' | 'cline' | 'windsurf';
1
+ export type ClientId = 'codex' | 'cursor' | 'trae-solo' | 'claude' | 'opencode' | 'openclaw' | 'hermes' | 'cherry-studio' | 'api-code';
2
2
  export interface ClientDefinition {
3
3
  id: ClientId;
4
4
  name: string;
package/dist/utils/api.js CHANGED
@@ -41,7 +41,7 @@ export async function validateApiKey(apiKey) {
41
41
  }
42
42
  }
43
43
  export async function testStreaming(apiKey, model) {
44
- const selected = model || 'gpt-5.5';
44
+ const selected = model || 'gpt-5.6-terra';
45
45
  try {
46
46
  const res = await request('/chat/completions', apiKey, { method: 'POST', body: JSON.stringify({ model: selected, stream: true, max_tokens: 8, messages: [{ role: 'user', content: 'Say OK' }] }) });
47
47
  if (!res.ok)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scalemax",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Universal ScaleMax installer for AI coding clients",
5
5
  "type": "module",
6
6
  "bin": {
@@ -51,12 +51,12 @@
51
51
  "installer",
52
52
  "codex",
53
53
  "cursor",
54
+ "trae-solo",
55
+ "claude-code",
54
56
  "opencode",
55
- "continue",
56
- "vscode",
57
- "roo-code",
58
- "cline",
59
- "windsurf",
57
+ "openclaw",
58
+ "hermes",
59
+ "cherry-studio",
60
60
  "openai-compatible"
61
61
  ],
62
62
  "license": "MIT",
@@ -1,3 +0,0 @@
1
- import { ConfigureContext, ConfigureResult } from '../types/client.js';
2
- export declare function configure(ctx: ConfigureContext): Promise<ConfigureResult>;
3
- export declare function remove(_ctx: ConfigureContext): Promise<ConfigureResult>;
@@ -1,13 +0,0 @@
1
- const id = 'cline';
2
- const name = 'Cline (VS Code)';
3
- export async function configure(ctx) {
4
- return {
5
- id,
6
- name,
7
- changed: false,
8
- message: `detected. Open the extension settings and select API Provider: OpenAI Compatible; Base URL: ${ctx.baseUrl}; API Key: your ScaleMax key; Model ID: gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.3-codex, or codex-auto-review. Official docs: https://docs.cline.bot/provider-config/openai-compatible`,
9
- };
10
- }
11
- export async function remove(_ctx) {
12
- return { id, name, changed: false, message: 'Roo/Cline settings are stored inside VS Code extension state. Remove or edit them from the extension settings UI.' };
13
- }
@@ -1,12 +0,0 @@
1
- import { clientConfigPath } from './paths.js';
2
- import { writeManagedConfig, removeManagedConfig } from './common.js';
3
- import { continueConfig } from './templates.js';
4
- const id = 'continue';
5
- const name = 'Continue';
6
- export async function configure(ctx) {
7
- const file = clientConfigPath(id, ctx.home, ctx.platform);
8
- return writeManagedConfig(ctx, id, name, file, continueConfig(ctx.apiKey, ctx.baseUrl));
9
- }
10
- export async function remove(ctx) {
11
- return removeManagedConfig(ctx, id, name, clientConfigPath(id, ctx.home, ctx.platform));
12
- }
@@ -1,3 +0,0 @@
1
- import { ConfigureContext, ConfigureResult } from '../types/client.js';
2
- export declare function configure(ctx: ConfigureContext): Promise<ConfigureResult>;
3
- export declare function remove(_ctx: ConfigureContext): Promise<ConfigureResult>;
@@ -1,13 +0,0 @@
1
- const id = 'roo';
2
- const name = 'Roo Code (VS Code)';
3
- export async function configure(ctx) {
4
- return {
5
- id,
6
- name,
7
- changed: false,
8
- message: `detected. Open the extension settings and select API Provider: OpenAI Compatible; Base URL: ${ctx.baseUrl}; API Key: your ScaleMax key; Model ID: gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.3-codex, or codex-auto-review. Official docs: https://docs.roocode.com/providers/openai-compatible`,
9
- };
10
- }
11
- export async function remove(_ctx) {
12
- return { id, name, changed: false, message: 'Roo/Cline settings are stored inside VS Code extension state. Remove or edit them from the extension settings UI.' };
13
- }
@@ -1,13 +0,0 @@
1
- import { clientConfigPath } from './paths.js';
2
- import { removeManagedConfig, writeManagedConfig } from './common.js';
3
- import { continueConfig } from './templates.js';
4
- const id = 'vscode';
5
- const name = 'Continue Extension (VS Code)';
6
- export async function configure(ctx) {
7
- const file = clientConfigPath('continue', ctx.home, ctx.platform);
8
- return writeManagedConfig(ctx, id, name, file, continueConfig(ctx.apiKey, ctx.baseUrl));
9
- }
10
- export async function remove(ctx) {
11
- const file = clientConfigPath('continue', ctx.home, ctx.platform);
12
- return removeManagedConfig(ctx, id, name, file);
13
- }
@@ -1,13 +0,0 @@
1
- import { clientConfigPath } from './paths.js';
2
- import { removeManagedConfig, writeMergedJsonConfig } from './common.js';
3
- import { editorSettings } from './templates.js';
4
- const id = 'windsurf';
5
- const name = 'Windsurf';
6
- export async function configure(ctx) {
7
- const file = clientConfigPath(id, ctx.home, ctx.platform);
8
- return writeMergedJsonConfig(ctx, id, name, file, existing => editorSettings(name, ctx.apiKey, ctx.baseUrl, existing));
9
- }
10
- export async function remove(ctx) {
11
- const file = clientConfigPath(id, ctx.home, ctx.platform);
12
- return removeManagedConfig(ctx, id, name, file);
13
- }
@@ -1,2 +0,0 @@
1
- import { detectClient } from './common.js';
2
- export function detect(ctx) { return detectClient(ctx, 'cline', 'Cline (VS Code)'); }
@@ -1,2 +0,0 @@
1
- import { detectClient } from './common.js';
2
- export function detect(ctx) { return detectClient(ctx, 'continue', 'Continue'); }
@@ -1,2 +0,0 @@
1
- import { detectClient } from './common.js';
2
- export function detect(ctx) { return detectClient(ctx, 'roo', 'Roo Code (VS Code)'); }
@@ -1,2 +0,0 @@
1
- import { DetectContext, DetectionResult } from '../types/client.js';
2
- export declare function detect(ctx: DetectContext): Promise<DetectionResult>;
@@ -1,2 +0,0 @@
1
- import { detectClient } from './common.js';
2
- export function detect(ctx) { return detectClient(ctx, 'vscode', 'VS Code'); }
@@ -1,2 +0,0 @@
1
- import { DetectContext, DetectionResult } from '../types/client.js';
2
- export declare function detect(ctx: DetectContext): Promise<DetectionResult>;
@@ -1,2 +0,0 @@
1
- import { detectClient } from './common.js';
2
- export function detect(ctx) { return detectClient(ctx, 'windsurf', 'Windsurf'); }
File without changes
File without changes
File without changes