@hileeon/mcc 0.1.9 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -1
- package/dist/accounts/store.d.ts +11 -0
- package/dist/accounts/store.d.ts.map +1 -1
- package/dist/accounts/store.js.map +1 -1
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +8 -4
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/mcp.d.ts +11 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +179 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/profile-test.d.ts +17 -0
- package/dist/commands/profile-test.d.ts.map +1 -0
- package/dist/commands/profile-test.js +188 -0
- package/dist/commands/profile-test.js.map +1 -0
- package/dist/core/model-router.d.ts.map +1 -1
- package/dist/core/model-router.js +31 -1
- package/dist/core/model-router.js.map +1 -1
- package/dist/dashboard/server.js +118 -30
- package/dist/dashboard/server.js.map +1 -1
- package/dist/mcc.js +15 -0
- package/dist/mcc.js.map +1 -1
- package/dist/mcp/external-registry.d.ts +6 -3
- package/dist/mcp/external-registry.d.ts.map +1 -1
- package/dist/mcp/external-registry.js.map +1 -1
- package/dist/mcp/installer.d.ts.map +1 -1
- package/dist/mcp/installer.js +25 -10
- package/dist/mcp/installer.js.map +1 -1
- package/dist/mcp/mcp-config.d.ts +17 -3
- package/dist/mcp/mcp-config.d.ts.map +1 -1
- package/dist/mcp/mcp-config.js +38 -19
- package/dist/mcp/mcp-config.js.map +1 -1
- package/dist/mcp/registry.d.ts +4 -2
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js.map +1 -1
- package/dist/proxy/proxy-daemon.d.ts +1 -1
- package/dist/proxy/proxy-daemon.d.ts.map +1 -1
- package/dist/proxy/proxy-daemon.js +10 -5
- package/dist/proxy/proxy-daemon.js.map +1 -1
- package/dist/proxy/proxy-entry.js +6 -1
- package/dist/proxy/proxy-entry.js.map +1 -1
- package/dist/proxy/proxy-paths.d.ts +1 -0
- package/dist/proxy/proxy-paths.d.ts.map +1 -1
- package/dist/proxy/proxy-paths.js.map +1 -1
- package/dist/proxy/proxy-server.d.ts +1 -0
- package/dist/proxy/proxy-server.d.ts.map +1 -1
- package/dist/proxy/proxy-server.js +84 -2
- package/dist/proxy/proxy-server.js.map +1 -1
- package/dist/shared/config.d.ts +1 -0
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +1 -0
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/provider-preset-catalog.d.ts +2 -0
- package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
- package/dist/shared/provider-preset-catalog.js +31 -22
- package/dist/shared/provider-preset-catalog.js.map +1 -1
- package/dist/shared/test-image.d.ts +15 -0
- package/dist/shared/test-image.d.ts.map +1 -0
- package/dist/shared/test-image.js +89 -0
- package/dist/shared/test-image.js.map +1 -0
- package/dist/ui/assets/{index-ClqmrjNk.js → index-7kowlJw9.js} +7 -7
- package/dist/ui/assets/{index-CwMwQ-Z4.css → index-DnC-lskL.css} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/update.d.ts +16 -5
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +149 -37
- package/dist/update.js.map +1 -1
- package/lib/mcp-hooks/image-analysis-runtime.cjs +58 -5
- package/lib/shared/logger.cjs +5 -1
- package/package.json +2 -4
package/README.md
CHANGED
|
@@ -19,11 +19,15 @@ mcc profile add <name> # 添加 profile
|
|
|
19
19
|
mcc profile list # 查看所有 profile
|
|
20
20
|
mcc profile remove <name> # 删除 profile
|
|
21
21
|
mcc profile default [name] # 设默认 profile
|
|
22
|
+
mcc profile test [name...] # 体检 profile(验 key + 余额)
|
|
23
|
+
mcc profile test x --vision # 额外探测主模型能否识图
|
|
22
24
|
mcc mcp list # 查看可用 MCP 工具
|
|
23
25
|
mcc mcp add --name <id> --command <cmd> # 添加外部 MCP 工具
|
|
24
26
|
mcc mcp remove <name> # 删除外部 MCP 工具
|
|
25
27
|
mcc mcp enable <name> <profile> # 启用外部 MCP(指定 profile)
|
|
26
28
|
mcc mcp disable <name> <profile> # 禁用外部 MCP
|
|
29
|
+
mcc mcp import-global <profile> # 一键导入全局 ~/.claude.json 的 MCP 到该 profile
|
|
30
|
+
mcc mcp import-global --all-profiles # 同步到所有 profile(默认跳过 mcc-*/ccs-*;支持 http/sse)
|
|
27
31
|
mcc config # 打开 Web 配置控制台
|
|
28
32
|
```
|
|
29
33
|
|
|
@@ -32,6 +36,7 @@ mcc config # 打开 Web 配置控制台
|
|
|
32
36
|
- **多 profile 管理**:API key 存 `~/.mcc/profiles/<name>/.key`,元数据存 `~/.mcc/profiles.json`
|
|
33
37
|
- **实例隔离**:每个 profile 独立 `CLAUDE_CONFIG_DIR`,位于 `~/.mcc/instances/<name>/`
|
|
34
38
|
- **OpenAI 兼容模式**:`--protocol openai` 时自动启动本地翻译 proxy(端口 43456-43555),转发 OpenAI 格式请求到 upstream Anthropic 兼容端点
|
|
39
|
+
- **思考模式**:profile 支持 `reasoningEffort`,默认开启思考;强度以 Claude Code 自身的 `/effort`/Tab 为准并自动映射到各 provider,`reasoningEffort` 仅作兜底默认
|
|
35
40
|
- **Tiered model**:profile 支持 `opusModel`/`sonnetModel`/`haikuModel` 三级模型切换
|
|
36
41
|
- **内置 MCP**:`mcc-websearch`(多源搜索)和 `mcc-image-analysis`(图片/PDF 分析)
|
|
37
42
|
- **外部 MCP**:通过 `mcc mcp add` 注册第三方 MCP server,支持 `${MCC_PROVIDER_KEY:<providerId>}` 引用 provider API key
|
|
@@ -71,7 +76,7 @@ src/
|
|
|
71
76
|
├── commands/ # 每个 mcc 子命令一个文件
|
|
72
77
|
│ ├── launch.ts # mcc <profile>
|
|
73
78
|
│ ├── profile.ts # mcc profile add|list|remove|default
|
|
74
|
-
│ └── mcp.ts # mcc mcp list|add|remove|enable|disable
|
|
79
|
+
│ └── mcp.ts # mcc mcp list|add|remove|enable|disable|import-global
|
|
75
80
|
├── accounts/
|
|
76
81
|
│ ├── store.ts # Profile 元数据
|
|
77
82
|
│ ├── instance-manager.ts # CLAUDE_CONFIG_DIR 隔离
|
package/dist/accounts/store.d.ts
CHANGED
|
@@ -8,6 +8,16 @@
|
|
|
8
8
|
* └── <profile-name>/
|
|
9
9
|
* └── .key # API key (plain text)
|
|
10
10
|
*/
|
|
11
|
+
/**
|
|
12
|
+
* Thinking / reasoning intensity. Normalized across providers; how it maps:
|
|
13
|
+
* - openai-protocol → injected by the proxy as provider-specific params
|
|
14
|
+
* (Qwen: enable_thinking + thinking_budget; GLM: thinking{enabled} + reasoning_effort;
|
|
15
|
+
* generic: reasoning_effort, max clamped to high).
|
|
16
|
+
* - anthropic-protocol → exported as CLAUDE_CODE_EFFORT_LEVEL (honored by DeepSeek;
|
|
17
|
+
* a harmless no-op for providers like Kimi/MiMo whose thinking is binary always-on).
|
|
18
|
+
* Undefined is treated as 'high' (thinking on). 'off' disables.
|
|
19
|
+
*/
|
|
20
|
+
export type ReasoningEffort = 'off' | 'low' | 'medium' | 'high' | 'max';
|
|
11
21
|
export interface Profile {
|
|
12
22
|
name: string;
|
|
13
23
|
displayName?: string;
|
|
@@ -18,6 +28,7 @@ export interface Profile {
|
|
|
18
28
|
haikuModel?: string;
|
|
19
29
|
protocol?: 'anthropic' | 'openai';
|
|
20
30
|
proxyChatCompletionsPath?: string;
|
|
31
|
+
reasoningEffort?: ReasoningEffort;
|
|
21
32
|
createdAt: string;
|
|
22
33
|
lastUsedAt?: string;
|
|
23
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/accounts/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0BD,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAExC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIjE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUhD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKpD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD"}
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/accounts/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAExE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0BD,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAExC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIjE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUhD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKpD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/accounts/store.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/accounts/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/commands/launch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoBH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/commands/launch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoBH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgH7D"}
|
package/dist/commands/launch.js
CHANGED
|
@@ -83,14 +83,13 @@ async function cmdLaunch(args) {
|
|
|
83
83
|
const wsProviders = (0, mcp_config_1.getEnabledWebSearchProviders)(mcpConfig);
|
|
84
84
|
const iaProvider = (0, mcp_config_1.getActiveImageAnalysisProvider)(mcpConfig);
|
|
85
85
|
const instancePath = await instanceMgr.ensureInstance(profileName);
|
|
86
|
-
console.log(` ${picocolors_1.default.dim('instance')} ${picocolors_1.default.dim(instancePath)}`);
|
|
87
86
|
(0, installer_1.syncInstanceMcpServers)(instancePath, registry_1.BUILTIN_MCP_SERVERS.map((s) => s.name), profileName);
|
|
88
87
|
// Initialize logging session
|
|
89
88
|
const sessionId = (0, logger_1.makeSessionId)();
|
|
90
89
|
const mccHome = process.env.MCC_HOME ?? path.join(process.env.HOME ?? process.env.USERPROFILE ?? '~', '.mcc');
|
|
91
90
|
const logDir = path.join(mccHome, 'logs', profileName, 'sessions', sessionId);
|
|
92
91
|
(0, logger_1.init)(sessionId, logDir);
|
|
93
|
-
logger_1.log.
|
|
92
|
+
logger_1.log.debug('MCC', `Session starting: ${profileName} | log: ${logDir}`);
|
|
94
93
|
console.log(` ${picocolors_1.default.dim('session')} ${picocolors_1.default.dim(sessionId)}`);
|
|
95
94
|
// MCP provider summary
|
|
96
95
|
if (wsProviders.length > 0) {
|
|
@@ -111,8 +110,13 @@ async function cmdLaunch(args) {
|
|
|
111
110
|
env.MCC_CURRENT_PROFILE = profileName;
|
|
112
111
|
env.MCC_LOG_SESSION_ID = sessionId;
|
|
113
112
|
env.MCC_LOG_DIR = logDir;
|
|
114
|
-
//
|
|
113
|
+
// Preserve full color depth — without this Claude Code's TUI looks dim when
|
|
114
|
+
// spawned as a child process (TTY color detection can downgrade).
|
|
115
|
+
env.FORCE_COLOR = '3';
|
|
116
|
+
env.COLORTERM = 'truecolor';
|
|
117
|
+
// Debug: instance path + key env vars (no secrets)
|
|
115
118
|
if ((0, logger_1.isDebugEnabled)()) {
|
|
119
|
+
console.log(` ${picocolors_1.default.dim('instance')} ${picocolors_1.default.dim(instancePath)}`);
|
|
116
120
|
const debugEnvs = [
|
|
117
121
|
['ANTHROPIC_BASE_URL', env.ANTHROPIC_BASE_URL],
|
|
118
122
|
['ANTHROPIC_MODEL', env.ANTHROPIC_MODEL],
|
|
@@ -134,7 +138,7 @@ async function cmdLaunch(args) {
|
|
|
134
138
|
// Start translation proxy for OpenAI-compatible profiles
|
|
135
139
|
if (profile.protocol === 'openai') {
|
|
136
140
|
try {
|
|
137
|
-
const proxyInfo = await (0, proxy_daemon_1.startProxy)(profileName, profile.baseUrl, apiKey, profile.model, profile.proxyChatCompletionsPath);
|
|
141
|
+
const proxyInfo = await (0, proxy_daemon_1.startProxy)(profileName, profile.baseUrl, apiKey, profile.model, profile.proxyChatCompletionsPath, profile.reasoningEffort);
|
|
138
142
|
env.ANTHROPIC_BASE_URL = `http://127.0.0.1:${proxyInfo.port}`;
|
|
139
143
|
env.ANTHROPIC_AUTH_TOKEN = proxyInfo.authToken;
|
|
140
144
|
// MCP image analysis also needs to go through the proxy
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/commands/launch.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBH,
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/commands/launch.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/mcp.d.ts
CHANGED
|
@@ -6,4 +6,15 @@ export declare function cmdMcpAdd(args: string[]): Promise<void>;
|
|
|
6
6
|
export declare function cmdMcpRemove(args: string[]): Promise<void>;
|
|
7
7
|
export declare function cmdMcpEnable(args: string[]): Promise<void>;
|
|
8
8
|
export declare function cmdMcpDisable(args: string[]): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* `mcc mcp import-global [profile] [--all-profiles] [--only a,b] [--exclude a,b] [--include-ccs]`
|
|
11
|
+
*
|
|
12
|
+
* Imports the MCP servers from the user's global ~/.claude.json into MCC's
|
|
13
|
+
* external registry and enables them on the target profile(s). Because MCC
|
|
14
|
+
* rewrites each instance's .claude.json on every launch, importing via the
|
|
15
|
+
* registry (not a manual edit) is what makes the servers survive relaunch.
|
|
16
|
+
*
|
|
17
|
+
* By default skips MCC builtins (mcc-*) and CCS-owned servers (ccs-*).
|
|
18
|
+
*/
|
|
19
|
+
export declare function cmdMcpImportGlobal(args: string[]): Promise<void>;
|
|
9
20
|
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBhD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC7D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAejE;AA6CD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFtE"}
|
package/dist/commands/mcp.js
CHANGED
|
@@ -2,12 +2,48 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* `mcc mcp <list|add|remove|enable|disable>` — external MCP server management.
|
|
4
4
|
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
exports.cmdMcpList = cmdMcpList;
|
|
7
40
|
exports.cmdMcpAdd = cmdMcpAdd;
|
|
8
41
|
exports.cmdMcpRemove = cmdMcpRemove;
|
|
9
42
|
exports.cmdMcpEnable = cmdMcpEnable;
|
|
10
43
|
exports.cmdMcpDisable = cmdMcpDisable;
|
|
44
|
+
exports.cmdMcpImportGlobal = cmdMcpImportGlobal;
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
11
47
|
const store_1 = require("../accounts/store");
|
|
12
48
|
const instance_manager_1 = require("../accounts/instance-manager");
|
|
13
49
|
const installer_1 = require("../mcp/installer");
|
|
@@ -28,7 +64,13 @@ async function cmdMcpList() {
|
|
|
28
64
|
console.log(` ${s.displayName}: ${s.description}`);
|
|
29
65
|
if (!isBuiltin) {
|
|
30
66
|
const ext = s;
|
|
31
|
-
|
|
67
|
+
const transport = ext.type ?? 'stdio';
|
|
68
|
+
if (transport === 'http' || transport === 'sse') {
|
|
69
|
+
console.log(` ${transport.toUpperCase()}: ${ext.url ?? '(no url)'}`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.log(` Command: ${ext.command ?? ''} ${(ext.args ?? []).join(' ')}`.trimEnd());
|
|
73
|
+
}
|
|
32
74
|
}
|
|
33
75
|
}
|
|
34
76
|
}
|
|
@@ -109,4 +151,140 @@ async function cmdMcpDisable(args) {
|
|
|
109
151
|
(0, installer_1.syncInstanceMcpServers)(instancePath, registry_1.BUILTIN_MCP_SERVERS.map((s) => s.name), profileName);
|
|
110
152
|
console.log(`[OK] External MCP '${name}' disabled for profile '${profileName}'`);
|
|
111
153
|
}
|
|
154
|
+
/** Parse positional (non-flag) args, skipping values consumed by valued flags. */
|
|
155
|
+
function positionalArgs(args, valuedFlags) {
|
|
156
|
+
const out = [];
|
|
157
|
+
for (let i = 0; i < args.length; i++) {
|
|
158
|
+
const a = args[i];
|
|
159
|
+
if (valuedFlags.includes(a)) {
|
|
160
|
+
i++; // skip this flag's value
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (a.startsWith('--'))
|
|
164
|
+
continue;
|
|
165
|
+
out.push(a);
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
function getGlobalClaudeJsonPath() {
|
|
170
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? '~';
|
|
171
|
+
return path.join(home, '.claude.json');
|
|
172
|
+
}
|
|
173
|
+
function toExternalServer(name, cfg) {
|
|
174
|
+
const transport = cfg.type ?? (cfg.url ? 'http' : 'stdio');
|
|
175
|
+
const base = {
|
|
176
|
+
name,
|
|
177
|
+
displayName: name,
|
|
178
|
+
description: 'Imported from global ~/.claude.json',
|
|
179
|
+
enabledByDefault: false,
|
|
180
|
+
};
|
|
181
|
+
if (transport === 'http' || transport === 'sse') {
|
|
182
|
+
return { ...base, type: transport, url: cfg.url, headers: cfg.headers ?? {} };
|
|
183
|
+
}
|
|
184
|
+
return { ...base, type: 'stdio', command: cfg.command, args: cfg.args ?? [], envVars: cfg.env ?? {} };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* `mcc mcp import-global [profile] [--all-profiles] [--only a,b] [--exclude a,b] [--include-ccs]`
|
|
188
|
+
*
|
|
189
|
+
* Imports the MCP servers from the user's global ~/.claude.json into MCC's
|
|
190
|
+
* external registry and enables them on the target profile(s). Because MCC
|
|
191
|
+
* rewrites each instance's .claude.json on every launch, importing via the
|
|
192
|
+
* registry (not a manual edit) is what makes the servers survive relaunch.
|
|
193
|
+
*
|
|
194
|
+
* By default skips MCC builtins (mcc-*) and CCS-owned servers (ccs-*).
|
|
195
|
+
*/
|
|
196
|
+
async function cmdMcpImportGlobal(args) {
|
|
197
|
+
const allProfiles = args.includes('--all-profiles');
|
|
198
|
+
const includeCcs = args.includes('--include-ccs');
|
|
199
|
+
const only = getFlag(args, '--only');
|
|
200
|
+
const exclude = getFlag(args, '--exclude');
|
|
201
|
+
const onlySet = only ? new Set(only.split(',').map((s) => s.trim()).filter(Boolean)) : null;
|
|
202
|
+
const excludeSet = new Set(exclude ? exclude.split(',').map((s) => s.trim()).filter(Boolean) : []);
|
|
203
|
+
const positional = positionalArgs(args, ['--only', '--exclude']);
|
|
204
|
+
const profileName = positional[0];
|
|
205
|
+
if (!allProfiles && !profileName) {
|
|
206
|
+
console.error('[!] Usage: mcc mcp import-global <profile> [--all-profiles] [--only a,b] [--exclude a,b] [--include-ccs]');
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
// Resolve target profiles
|
|
210
|
+
const targets = allProfiles ? (0, store_1.listProfiles)().map((p) => p.name) : [profileName];
|
|
211
|
+
for (const t of targets) {
|
|
212
|
+
if (!(0, store_1.hasProfile)(t)) {
|
|
213
|
+
console.error(`[!] Profile not found: ${t}`);
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (targets.length === 0) {
|
|
218
|
+
console.error('[!] No profiles to import into.');
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
// Read global ~/.claude.json
|
|
222
|
+
const globalPath = getGlobalClaudeJsonPath();
|
|
223
|
+
if (!fs.existsSync(globalPath)) {
|
|
224
|
+
console.error(`[!] Global config not found: ${globalPath}`);
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
let globalServers;
|
|
228
|
+
try {
|
|
229
|
+
const data = JSON.parse(fs.readFileSync(globalPath, 'utf8'));
|
|
230
|
+
globalServers = data.mcpServers ?? {};
|
|
231
|
+
}
|
|
232
|
+
catch (e) {
|
|
233
|
+
console.error(`[!] Failed to parse ${globalPath}: ${e.message}`);
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
const builtinNames = new Set(registry_1.BUILTIN_MCP_SERVERS.map((s) => s.name));
|
|
237
|
+
const skipped = [];
|
|
238
|
+
const picked = [];
|
|
239
|
+
for (const [name, cfg] of Object.entries(globalServers)) {
|
|
240
|
+
if (builtinNames.has(name)) {
|
|
241
|
+
skipped.push(`${name} (mcc builtin)`);
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (onlySet) {
|
|
245
|
+
if (!onlySet.has(name)) {
|
|
246
|
+
skipped.push(`${name} (not in --only)`);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
if (excludeSet.has(name)) {
|
|
252
|
+
skipped.push(`${name} (--exclude)`);
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
if (!includeCcs && name.startsWith('ccs-')) {
|
|
256
|
+
skipped.push(`${name} (ccs-*, use --include-ccs)`);
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
picked.push([name, cfg]);
|
|
261
|
+
}
|
|
262
|
+
if (picked.length === 0) {
|
|
263
|
+
console.log('[i] Nothing to import.');
|
|
264
|
+
if (skipped.length > 0)
|
|
265
|
+
console.log(` Skipped: ${skipped.join(', ')}`);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
// Register in external registry (idempotent upsert)
|
|
269
|
+
for (const [name, cfg] of picked) {
|
|
270
|
+
(0, external_registry_1.addExternalMcpServer)(toExternalServer(name, cfg));
|
|
271
|
+
}
|
|
272
|
+
// Enable on each target profile + resync its .claude.json
|
|
273
|
+
for (const profile of targets) {
|
|
274
|
+
const instancePath = instanceMgr.getInstancePath(profile);
|
|
275
|
+
for (const [name] of picked) {
|
|
276
|
+
(0, installer_1.enableInstanceExternalMcp)(instancePath, name);
|
|
277
|
+
}
|
|
278
|
+
(0, installer_1.syncInstanceMcpServers)(instancePath, registry_1.BUILTIN_MCP_SERVERS.map((s) => s.name), profile);
|
|
279
|
+
}
|
|
280
|
+
const importedNames = picked.map(([n, cfg]) => {
|
|
281
|
+
const t = cfg.type ?? (cfg.url ? 'http' : 'stdio');
|
|
282
|
+
return `${n} [${t}]`;
|
|
283
|
+
});
|
|
284
|
+
console.log(`[OK] Imported ${picked.length} MCP server(s) into ${targets.length} profile(s).`);
|
|
285
|
+
console.log(` Servers: ${importedNames.join(', ')}`);
|
|
286
|
+
console.log(` Profiles: ${targets.join(', ')}`);
|
|
287
|
+
if (skipped.length > 0)
|
|
288
|
+
console.log(` Skipped: ${skipped.join(', ')}`);
|
|
289
|
+
}
|
|
112
290
|
//# sourceMappingURL=mcp.js.map
|
package/dist/commands/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mcc profile test [name] [--vision]` — live health-check a profile's key.
|
|
3
|
+
*
|
|
4
|
+
* Three independent probes, each reported separately:
|
|
5
|
+
* 1. models — GET the provider's model list. Proves the key *authenticates*.
|
|
6
|
+
* 2. usable — a 1-token chat/messages call. Proves the account is actually
|
|
7
|
+
* callable (catches "key valid but balance = 0", e.g. DeepSeek 402,
|
|
8
|
+
* which the models endpoint alone reports as OK).
|
|
9
|
+
* 3. vision — (only with --vision) sends a 4-quadrant probe image to the
|
|
10
|
+
* profile's own model and checks it names all four colors, i.e.
|
|
11
|
+
* whether the main model can natively see images.
|
|
12
|
+
*
|
|
13
|
+
* Calls the upstream provider directly (not through the local proxy) so the
|
|
14
|
+
* result reflects the real provider, not the translation layer.
|
|
15
|
+
*/
|
|
16
|
+
export declare function cmdProfileTest(args: string[]): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=profile-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-test.d.ts","sourceRoot":"","sources":["../../src/commands/profile-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAwJH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoClE"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `mcc profile test [name] [--vision]` — live health-check a profile's key.
|
|
4
|
+
*
|
|
5
|
+
* Three independent probes, each reported separately:
|
|
6
|
+
* 1. models — GET the provider's model list. Proves the key *authenticates*.
|
|
7
|
+
* 2. usable — a 1-token chat/messages call. Proves the account is actually
|
|
8
|
+
* callable (catches "key valid but balance = 0", e.g. DeepSeek 402,
|
|
9
|
+
* which the models endpoint alone reports as OK).
|
|
10
|
+
* 3. vision — (only with --vision) sends a 4-quadrant probe image to the
|
|
11
|
+
* profile's own model and checks it names all four colors, i.e.
|
|
12
|
+
* whether the main model can natively see images.
|
|
13
|
+
*
|
|
14
|
+
* Calls the upstream provider directly (not through the local proxy) so the
|
|
15
|
+
* result reflects the real provider, not the translation layer.
|
|
16
|
+
*/
|
|
17
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
18
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.cmdProfileTest = cmdProfileTest;
|
|
22
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
23
|
+
const store_1 = require("../accounts/store");
|
|
24
|
+
const test_image_1 = require("../shared/test-image");
|
|
25
|
+
const TIMEOUT_MS = 30000;
|
|
26
|
+
function trimBase(baseUrl) {
|
|
27
|
+
return baseUrl.trim().replace(/\/+$/, '');
|
|
28
|
+
}
|
|
29
|
+
function authHeaders(key, protocol) {
|
|
30
|
+
return protocol === 'anthropic'
|
|
31
|
+
? { 'x-api-key': key, 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json' }
|
|
32
|
+
: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' };
|
|
33
|
+
}
|
|
34
|
+
async function http(url, init) {
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
37
|
+
try {
|
|
38
|
+
const resp = await fetch(url, { ...init, signal: controller.signal });
|
|
39
|
+
const text = await resp.text();
|
|
40
|
+
let json = undefined;
|
|
41
|
+
try {
|
|
42
|
+
json = JSON.parse(text);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* non-JSON body */
|
|
46
|
+
}
|
|
47
|
+
return { status: resp.status, json, text };
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function errSnippet(status, json, text) {
|
|
54
|
+
const j = json;
|
|
55
|
+
const raw = j?.error?.message ?? j?.message ?? text;
|
|
56
|
+
// Collapse whitespace and strip HTML so a 404 error page stays one tidy line.
|
|
57
|
+
const msg = raw.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim().slice(0, 100);
|
|
58
|
+
return `HTTP ${status}${msg ? ` — ${msg}` : ''}`;
|
|
59
|
+
}
|
|
60
|
+
async function probeModels(base, key, protocol) {
|
|
61
|
+
const url = protocol === 'anthropic' ? `${base}/v1/models` : `${base}/models`;
|
|
62
|
+
try {
|
|
63
|
+
const { status, json, text } = await http(url, { method: 'GET', headers: authHeaders(key, protocol) });
|
|
64
|
+
// Many Anthropic-compatible providers don't expose /v1/models — a 404 here
|
|
65
|
+
// says nothing about the key (the `usable` probe is the real auth check).
|
|
66
|
+
if (status === 404)
|
|
67
|
+
return { ok: true, neutral: true, detail: 'no /v1/models endpoint' };
|
|
68
|
+
if (status !== 200)
|
|
69
|
+
return { ok: false, detail: errSnippet(status, json, text) };
|
|
70
|
+
const body = json;
|
|
71
|
+
const list = Array.isArray(body?.data) ? body.data : Array.isArray(body?.models) ? body.models : [];
|
|
72
|
+
return { ok: true, detail: `${list.length} models` };
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
return { ok: false, detail: e.message };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function probeUsable(base, key, protocol, model) {
|
|
79
|
+
const url = protocol === 'anthropic' ? `${base}/v1/messages` : `${base}/chat/completions`;
|
|
80
|
+
const body = JSON.stringify({ model, max_tokens: 8, messages: [{ role: 'user', content: 'hi' }] });
|
|
81
|
+
try {
|
|
82
|
+
const { status, json, text } = await http(url, { method: 'POST', headers: authHeaders(key, protocol), body });
|
|
83
|
+
if (status !== 200)
|
|
84
|
+
return { ok: false, detail: errSnippet(status, json, text) };
|
|
85
|
+
return { ok: true, detail: `model=${model}` };
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
return { ok: false, detail: e.message };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function extractReply(protocol, json) {
|
|
92
|
+
if (protocol === 'anthropic') {
|
|
93
|
+
const d = json;
|
|
94
|
+
return (d?.content ?? [])
|
|
95
|
+
.filter((b) => b?.type === 'text' && typeof b.text === 'string')
|
|
96
|
+
.map((b) => b.text)
|
|
97
|
+
.join(' ');
|
|
98
|
+
}
|
|
99
|
+
const d = json;
|
|
100
|
+
const m = d?.choices?.[0]?.message;
|
|
101
|
+
return m?.content || m?.reasoning_content || '';
|
|
102
|
+
}
|
|
103
|
+
async function probeVision(base, key, protocol, model) {
|
|
104
|
+
const url = protocol === 'anthropic' ? `${base}/v1/messages` : `${base}/chat/completions`;
|
|
105
|
+
const b64 = (0, test_image_1.makeVisionProbeBase64)();
|
|
106
|
+
const content = protocol === 'anthropic'
|
|
107
|
+
? [
|
|
108
|
+
{ type: 'text', text: test_image_1.VISION_PROBE_PROMPT },
|
|
109
|
+
{ type: 'image', source: { type: 'base64', media_type: 'image/png', data: b64 } },
|
|
110
|
+
]
|
|
111
|
+
: [
|
|
112
|
+
{ type: 'text', text: test_image_1.VISION_PROBE_PROMPT },
|
|
113
|
+
{ type: 'image_url', image_url: { url: `data:image/png;base64,${b64}` } },
|
|
114
|
+
];
|
|
115
|
+
const body = JSON.stringify({ model, max_tokens: 300, messages: [{ role: 'user', content }] });
|
|
116
|
+
try {
|
|
117
|
+
const { status, json, text } = await http(url, { method: 'POST', headers: authHeaders(key, protocol), body });
|
|
118
|
+
if (status !== 200)
|
|
119
|
+
return { ok: false, detail: errSnippet(status, json, text) };
|
|
120
|
+
const reply = extractReply(protocol, json).replace(/\s+/g, ' ').trim();
|
|
121
|
+
if ((0, test_image_1.passesVisionProbe)(reply))
|
|
122
|
+
return { ok: true, detail: `read image: "${reply.slice(0, 60)}"` };
|
|
123
|
+
return { ok: false, detail: `wrong/blind: "${reply.slice(0, 60) || '(empty)'}"` };
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
return { ok: false, detail: e.message };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function line(label, probe) {
|
|
130
|
+
if (!probe)
|
|
131
|
+
return ` ${picocolors_1.default.dim('vision'.padEnd(7))} ${picocolors_1.default.dim('–')} ${picocolors_1.default.dim('skipped (pass --vision)')}`;
|
|
132
|
+
const mark = probe.neutral ? picocolors_1.default.dim('•') : probe.ok ? picocolors_1.default.green('✓') : picocolors_1.default.red('✗');
|
|
133
|
+
const text = probe.neutral || probe.ok ? picocolors_1.default.dim(probe.detail) : picocolors_1.default.red(probe.detail);
|
|
134
|
+
return ` ${picocolors_1.default.dim(label.padEnd(7))} ${mark} ${text}`;
|
|
135
|
+
}
|
|
136
|
+
async function testOne(profile, wantVision) {
|
|
137
|
+
const protocol = profile.protocol || 'anthropic';
|
|
138
|
+
const key = (0, store_1.getProfileApiKey)(profile.name);
|
|
139
|
+
const head = ` ${picocolors_1.default.bold(profile.name)} ${picocolors_1.default.dim('·')} ${picocolors_1.default.dim(protocol)} ${picocolors_1.default.dim('·')} ${picocolors_1.default.cyan(profile.model)}`;
|
|
140
|
+
if (!key) {
|
|
141
|
+
console.log(head);
|
|
142
|
+
console.log(` ${picocolors_1.default.red('✗')} ${picocolors_1.default.red('no API key stored')}`);
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
const base = trimBase(profile.baseUrl);
|
|
146
|
+
const models = await probeModels(base, key, protocol);
|
|
147
|
+
const usable = await probeUsable(base, key, protocol, profile.model);
|
|
148
|
+
const vision = wantVision ? await probeVision(base, key, protocol, profile.model) : null;
|
|
149
|
+
console.log(head);
|
|
150
|
+
console.log(line('models', models));
|
|
151
|
+
console.log(line('usable', usable));
|
|
152
|
+
console.log(line('vision', vision));
|
|
153
|
+
// "Healthy" = can actually be used. Models-only success with an unusable
|
|
154
|
+
// account (balance 0) is still a failure worth surfacing in the exit code.
|
|
155
|
+
return usable.ok;
|
|
156
|
+
}
|
|
157
|
+
async function cmdProfileTest(args) {
|
|
158
|
+
const wantVision = args.includes('--vision');
|
|
159
|
+
const names = args.filter((a) => !a.startsWith('--'));
|
|
160
|
+
const targets = names.length
|
|
161
|
+
? names.map((n) => (0, store_1.getProfile)(n)).filter((p) => Boolean(p))
|
|
162
|
+
: (0, store_1.listProfiles)();
|
|
163
|
+
if (names.length) {
|
|
164
|
+
const missing = names.filter((n) => !(0, store_1.getProfile)(n));
|
|
165
|
+
if (missing.length) {
|
|
166
|
+
console.error(`[!] Profile not found: ${missing.join(', ')}`);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (targets.length === 0) {
|
|
171
|
+
console.log('[i] No profiles to test.');
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
console.log(`Testing ${targets.length} profile(s)${wantVision ? ' + vision' : ''} ${picocolors_1.default.dim('(models = auth · usable = balance · vision = main model sees images)')}\n`);
|
|
175
|
+
let failures = 0;
|
|
176
|
+
for (const p of targets) {
|
|
177
|
+
const ok = await testOne(p, wantVision);
|
|
178
|
+
if (!ok)
|
|
179
|
+
failures++;
|
|
180
|
+
console.log();
|
|
181
|
+
}
|
|
182
|
+
if (failures > 0) {
|
|
183
|
+
console.log(picocolors_1.default.dim(`${failures}/${targets.length} profile(s) not usable.`));
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
console.log(picocolors_1.default.green(`All ${targets.length} profile(s) usable.`));
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=profile-test.js.map
|