@happycastle/oh-my-openclaw 0.13.1 → 0.13.3
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/dist/agents/agent-configs.js +4 -4
- package/dist/agents/agent-ids.d.ts +1 -1
- package/dist/agents/agent-ids.js +8 -8
- package/dist/cli/mcporter-setup.d.ts +41 -0
- package/dist/cli/mcporter-setup.js +102 -0
- package/dist/cli/model-presets.d.ts +1 -1
- package/dist/cli/model-presets.js +22 -13
- package/dist/cli/setup.d.ts +5 -0
- package/dist/cli/setup.js +39 -10
- package/dist/tools/look-at.js +2 -2
- package/dist/tools/task-delegation.js +1 -1
- package/package.json +1 -1
- package/skills/delegation-prompt.md +1 -1
- package/skills/gemini-look-at.md +5 -5
|
@@ -161,8 +161,8 @@ export const OMOC_AGENT_CONFIGS = [
|
|
|
161
161
|
id: 'omoc_looker',
|
|
162
162
|
name: 'Multimodal Looker',
|
|
163
163
|
model: {
|
|
164
|
-
primary: 'google/gemini-
|
|
165
|
-
fallbacks: ['anthropic/claude-sonnet-4-6'],
|
|
164
|
+
primary: 'google/gemini-3.1-pro',
|
|
165
|
+
fallbacks: ['google/gemini-3-flash', 'anthropic/claude-sonnet-4-6'],
|
|
166
166
|
},
|
|
167
167
|
identity: {
|
|
168
168
|
name: 'Multimodal Looker',
|
|
@@ -179,8 +179,8 @@ export const OMOC_AGENT_CONFIGS = [
|
|
|
179
179
|
id: 'omoc_frontend',
|
|
180
180
|
name: 'Frontend',
|
|
181
181
|
model: {
|
|
182
|
-
primary: 'google/gemini-
|
|
183
|
-
fallbacks: ['anthropic/claude-sonnet-4-6'],
|
|
182
|
+
primary: 'google/gemini-3.1-pro',
|
|
183
|
+
fallbacks: ['google/gemini-3-flash', 'anthropic/claude-sonnet-4-6'],
|
|
184
184
|
},
|
|
185
185
|
identity: {
|
|
186
186
|
name: 'Frontend',
|
|
@@ -9,6 +9,6 @@ export declare const WORKER_IDS: Set<string>;
|
|
|
9
9
|
/** Maps agent ID to markdown persona filename (without extension) */
|
|
10
10
|
export declare const AGENT_MD_MAP: Record<string, string>;
|
|
11
11
|
/** Maps agent ID to model tier for provider preset selection */
|
|
12
|
-
export declare const AGENT_TIER_MAP: Record<string, '
|
|
12
|
+
export declare const AGENT_TIER_MAP: Record<string, 'strategic' | 'reasoning' | 'analysis' | 'worker' | 'deep-worker' | 'search' | 'research' | 'visual'>;
|
|
13
13
|
/** All agent IDs (orchestrators + workers + read-only specialists) */
|
|
14
14
|
export declare const ALL_AGENT_IDS: string[];
|
package/dist/agents/agent-ids.js
CHANGED
|
@@ -29,15 +29,15 @@ export const AGENT_MD_MAP = {
|
|
|
29
29
|
};
|
|
30
30
|
/** Maps agent ID to model tier for provider preset selection */
|
|
31
31
|
export const AGENT_TIER_MAP = {
|
|
32
|
-
omoc_prometheus: '
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
omoc_prometheus: 'strategic',
|
|
33
|
+
omoc_atlas: 'strategic',
|
|
34
|
+
omoc_oracle: 'reasoning',
|
|
35
|
+
omoc_metis: 'analysis',
|
|
36
|
+
omoc_momus: 'analysis',
|
|
36
37
|
omoc_sisyphus: 'worker',
|
|
37
|
-
omoc_hephaestus: 'worker',
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
omoc_librarian: 'lightweight',
|
|
38
|
+
omoc_hephaestus: 'deep-worker',
|
|
39
|
+
omoc_explore: 'search',
|
|
40
|
+
omoc_librarian: 'research',
|
|
41
41
|
omoc_looker: 'visual',
|
|
42
42
|
omoc_frontend: 'visual',
|
|
43
43
|
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
type McpServerEntry = {
|
|
2
|
+
url: string;
|
|
3
|
+
description: string;
|
|
4
|
+
};
|
|
5
|
+
export declare const OMOC_MCP_SERVERS: Record<string, McpServerEntry>;
|
|
6
|
+
type McporterConfig = {
|
|
7
|
+
mcpServers: Record<string, {
|
|
8
|
+
url?: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
type?: string;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
}>;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Resolve mcporter config path.
|
|
17
|
+
* Priority: ~/.openclaw/workspace/config/mcporter.json > ~/.config/mcporter/mcporter.json
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveMcporterConfigPath(): string;
|
|
20
|
+
export declare function readMcporterConfig(configPath: string): McporterConfig;
|
|
21
|
+
export declare function writeMcporterConfig(configPath: string, config: McporterConfig): void;
|
|
22
|
+
export interface McporterMergeResult {
|
|
23
|
+
added: string[];
|
|
24
|
+
skipped: string[];
|
|
25
|
+
}
|
|
26
|
+
export declare function mergeMcpServers(existing: McporterConfig, servers: Record<string, McpServerEntry>): {
|
|
27
|
+
config: McporterConfig;
|
|
28
|
+
result: McporterMergeResult;
|
|
29
|
+
};
|
|
30
|
+
type Logger = {
|
|
31
|
+
info: (msg: string) => void;
|
|
32
|
+
warn: (msg: string) => void;
|
|
33
|
+
error: (msg: string) => void;
|
|
34
|
+
};
|
|
35
|
+
export interface McporterSetupOptions {
|
|
36
|
+
configPath?: string;
|
|
37
|
+
dryRun?: boolean;
|
|
38
|
+
logger: Logger;
|
|
39
|
+
}
|
|
40
|
+
export declare function runMcporterSetup(options: McporterSetupOptions): McporterMergeResult;
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export const OMOC_MCP_SERVERS = {
|
|
4
|
+
'web-search-prime': {
|
|
5
|
+
url: 'https://api.z.ai/api/mcp/web_search_prime/mcp',
|
|
6
|
+
description: 'Keyword-based web search (news, blogs, general)',
|
|
7
|
+
},
|
|
8
|
+
'web-reader': {
|
|
9
|
+
url: 'https://api.z.ai/api/mcp/web_reader/mcp',
|
|
10
|
+
description: 'Clean full-page content extraction',
|
|
11
|
+
},
|
|
12
|
+
exa: {
|
|
13
|
+
url: 'https://mcp.exa.ai/mcp?tools=web_search_exa',
|
|
14
|
+
description: 'Semantic web search (Exa)',
|
|
15
|
+
},
|
|
16
|
+
context7: {
|
|
17
|
+
url: 'https://mcp.context7.com/mcp',
|
|
18
|
+
description: 'Library/framework documentation search',
|
|
19
|
+
},
|
|
20
|
+
grep_app: {
|
|
21
|
+
url: 'https://mcp.grep.app',
|
|
22
|
+
description: 'Open-source code search on GitHub',
|
|
23
|
+
},
|
|
24
|
+
zread: {
|
|
25
|
+
url: 'https://api.z.ai/api/mcp/zread/mcp',
|
|
26
|
+
description: 'Direct GitHub repository exploration',
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Resolve mcporter config path.
|
|
31
|
+
* Priority: ~/.openclaw/workspace/config/mcporter.json > ~/.config/mcporter/mcporter.json
|
|
32
|
+
*/
|
|
33
|
+
export function resolveMcporterConfigPath() {
|
|
34
|
+
const homeDir = process.env['HOME'] ?? process.env['USERPROFILE'] ?? '';
|
|
35
|
+
const openclawPath = path.join(homeDir, '.openclaw', 'workspace', 'config', 'mcporter.json');
|
|
36
|
+
if (fs.existsSync(openclawPath)) {
|
|
37
|
+
return openclawPath;
|
|
38
|
+
}
|
|
39
|
+
const mcporterHomePath = path.join(homeDir, '.config', 'mcporter', 'mcporter.json');
|
|
40
|
+
if (fs.existsSync(mcporterHomePath)) {
|
|
41
|
+
return mcporterHomePath;
|
|
42
|
+
}
|
|
43
|
+
return openclawPath;
|
|
44
|
+
}
|
|
45
|
+
export function readMcporterConfig(configPath) {
|
|
46
|
+
if (!fs.existsSync(configPath)) {
|
|
47
|
+
return { mcpServers: {} };
|
|
48
|
+
}
|
|
49
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
50
|
+
const parsed = JSON.parse(raw);
|
|
51
|
+
if (!parsed.mcpServers || typeof parsed.mcpServers !== 'object') {
|
|
52
|
+
parsed.mcpServers = {};
|
|
53
|
+
}
|
|
54
|
+
return parsed;
|
|
55
|
+
}
|
|
56
|
+
export function writeMcporterConfig(configPath, config) {
|
|
57
|
+
const dir = path.dirname(configPath);
|
|
58
|
+
if (!fs.existsSync(dir)) {
|
|
59
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
60
|
+
}
|
|
61
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
62
|
+
}
|
|
63
|
+
export function mergeMcpServers(existing, servers) {
|
|
64
|
+
const result = { added: [], skipped: [] };
|
|
65
|
+
const merged = { ...existing, mcpServers: { ...existing.mcpServers } };
|
|
66
|
+
for (const [name, entry] of Object.entries(servers)) {
|
|
67
|
+
if (merged.mcpServers[name]) {
|
|
68
|
+
result.skipped.push(name);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
merged.mcpServers[name] = { url: entry.url };
|
|
72
|
+
result.added.push(name);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { config: merged, result };
|
|
76
|
+
}
|
|
77
|
+
export function runMcporterSetup(options) {
|
|
78
|
+
const { logger, dryRun = false } = options;
|
|
79
|
+
const configPath = options.configPath ?? resolveMcporterConfigPath();
|
|
80
|
+
logger.info(`mcporter config: ${configPath}`);
|
|
81
|
+
const existing = readMcporterConfig(configPath);
|
|
82
|
+
const { config: merged, result } = mergeMcpServers(existing, OMOC_MCP_SERVERS);
|
|
83
|
+
if (result.added.length === 0) {
|
|
84
|
+
logger.info('No changes needed — all MCP servers already configured.');
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
if (dryRun) {
|
|
88
|
+
logger.info(`[dry-run] Would add ${result.added.length} MCP server(s): ${result.added.join(', ')}`);
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
if (fs.existsSync(configPath)) {
|
|
92
|
+
const backupPath = configPath + '.bak';
|
|
93
|
+
fs.copyFileSync(configPath, backupPath);
|
|
94
|
+
logger.info(`Backup created: ${backupPath}`);
|
|
95
|
+
}
|
|
96
|
+
writeMcporterConfig(configPath, merged);
|
|
97
|
+
logger.info(`Added ${result.added.length} MCP server(s): ${result.added.join(', ')}`);
|
|
98
|
+
if (result.skipped.length > 0) {
|
|
99
|
+
logger.info(`Skipped ${result.skipped.length} existing server(s): ${result.skipped.join(', ')}`);
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AGENT_TIER_MAP } from '../agents/agent-ids.js';
|
|
2
|
-
export type ModelTier = '
|
|
2
|
+
export type ModelTier = 'strategic' | 'reasoning' | 'analysis' | 'worker' | 'deep-worker' | 'search' | 'research' | 'visual';
|
|
3
3
|
export type ModelConfig = {
|
|
4
4
|
primary: string;
|
|
5
5
|
fallbacks: string[];
|
|
@@ -1,25 +1,34 @@
|
|
|
1
1
|
import { AGENT_TIER_MAP } from '../agents/agent-ids.js';
|
|
2
2
|
export const PROVIDER_PRESETS = {
|
|
3
3
|
anthropic: {
|
|
4
|
-
|
|
4
|
+
strategic: { primary: 'anthropic/claude-opus-4-6', fallbacks: ['openai/gpt-5.3-codex'] },
|
|
5
|
+
reasoning: { primary: 'anthropic/claude-opus-4-6', fallbacks: ['openai/gpt-5.3-codex'] },
|
|
6
|
+
analysis: { primary: 'anthropic/claude-sonnet-4-6', fallbacks: ['openai/gpt-4.1'] },
|
|
5
7
|
worker: { primary: 'anthropic/claude-opus-4-6', fallbacks: ['openai/gpt-5.3-codex'] },
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
'deep-worker': { primary: 'anthropic/claude-opus-4-6', fallbacks: ['openai/gpt-5.3-codex'] },
|
|
9
|
+
search: { primary: 'anthropic/claude-sonnet-4-6', fallbacks: [] },
|
|
10
|
+
research: { primary: 'anthropic/claude-sonnet-4-6', fallbacks: [] },
|
|
11
|
+
visual: { primary: 'google/gemini-3.1-pro', fallbacks: ['anthropic/claude-sonnet-4-6'] },
|
|
9
12
|
},
|
|
10
13
|
openai: {
|
|
11
|
-
|
|
14
|
+
strategic: { primary: 'openai/gpt-5.3-codex', fallbacks: ['anthropic/claude-opus-4-6'] },
|
|
15
|
+
reasoning: { primary: 'openai/gpt-5.3-codex', fallbacks: ['anthropic/claude-opus-4-6'] },
|
|
16
|
+
analysis: { primary: 'openai/gpt-4.1', fallbacks: ['anthropic/claude-sonnet-4-6'] },
|
|
12
17
|
worker: { primary: 'openai/gpt-5.3-codex', fallbacks: ['anthropic/claude-opus-4-6'] },
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
'deep-worker': { primary: 'openai/gpt-5.3-codex', fallbacks: ['anthropic/claude-opus-4-6'] },
|
|
19
|
+
search: { primary: 'openai/gpt-4.1-mini', fallbacks: [] },
|
|
20
|
+
research: { primary: 'openai/gpt-4.1-mini', fallbacks: [] },
|
|
21
|
+
visual: { primary: 'google/gemini-3.1-pro', fallbacks: ['openai/gpt-4.1'] },
|
|
16
22
|
},
|
|
17
23
|
google: {
|
|
18
|
-
|
|
24
|
+
strategic: { primary: 'google/gemini-3.1-pro', fallbacks: ['anthropic/claude-opus-4-6'] },
|
|
25
|
+
reasoning: { primary: 'google/gemini-3.1-pro', fallbacks: ['anthropic/claude-opus-4-6'] },
|
|
26
|
+
analysis: { primary: 'google/gemini-3-flash', fallbacks: ['anthropic/claude-sonnet-4-6'] },
|
|
19
27
|
worker: { primary: 'google/gemini-3.1-pro', fallbacks: ['anthropic/claude-opus-4-6'] },
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
'deep-worker': { primary: 'google/gemini-3.1-pro', fallbacks: ['anthropic/claude-opus-4-6'] },
|
|
29
|
+
search: { primary: 'google/gemini-3-flash', fallbacks: [] },
|
|
30
|
+
research: { primary: 'google/gemini-3-flash', fallbacks: [] },
|
|
31
|
+
visual: { primary: 'google/gemini-3.1-pro', fallbacks: ['google/gemini-3-flash'] },
|
|
23
32
|
},
|
|
24
33
|
};
|
|
25
34
|
export { AGENT_TIER_MAP };
|
|
@@ -29,7 +38,7 @@ export const PROVIDER_LABELS = {
|
|
|
29
38
|
google: 'Google (Gemini)',
|
|
30
39
|
custom: 'Custom (enter model IDs manually)',
|
|
31
40
|
};
|
|
32
|
-
export const MODEL_TIERS = ['
|
|
41
|
+
export const MODEL_TIERS = ['strategic', 'reasoning', 'analysis', 'worker', 'deep-worker', 'search', 'research', 'visual'];
|
|
33
42
|
export function buildCustomPreset(tierModels) {
|
|
34
43
|
const preset = {};
|
|
35
44
|
for (const tier of MODEL_TIERS) {
|
package/dist/cli/setup.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ export interface MergeResult {
|
|
|
27
27
|
added: string[];
|
|
28
28
|
skipped: string[];
|
|
29
29
|
updated: string[];
|
|
30
|
+
mcporterAdded?: string[];
|
|
31
|
+
mcporterSkipped?: string[];
|
|
30
32
|
}
|
|
31
33
|
export declare function mergeAgentConfigs(existing: Array<{
|
|
32
34
|
id: string;
|
|
@@ -41,6 +43,7 @@ export declare function mergeAgentConfigs(existing: Array<{
|
|
|
41
43
|
export declare function applyProviderToConfigs(configs: OmocAgentConfig[], provider: string): OmocAgentConfig[];
|
|
42
44
|
export declare function runInteractiveSetup(logger: Logger): Promise<{
|
|
43
45
|
provider: string;
|
|
46
|
+
setupMcporter: boolean;
|
|
44
47
|
}>;
|
|
45
48
|
export interface SetupOptions {
|
|
46
49
|
configPath?: string;
|
|
@@ -48,6 +51,8 @@ export interface SetupOptions {
|
|
|
48
51
|
force?: boolean;
|
|
49
52
|
dryRun?: boolean;
|
|
50
53
|
provider?: string;
|
|
54
|
+
setupMcporter?: boolean;
|
|
55
|
+
mcporterConfigPath?: string;
|
|
51
56
|
interactive?: boolean;
|
|
52
57
|
logger: Logger;
|
|
53
58
|
}
|
package/dist/cli/setup.js
CHANGED
|
@@ -4,6 +4,7 @@ import * as readline from 'node:readline';
|
|
|
4
4
|
import JSON5 from 'json5';
|
|
5
5
|
import { OMOC_AGENT_CONFIGS } from '../agents/agent-configs.js';
|
|
6
6
|
import { PROVIDER_PRESETS, PROVIDER_LABELS, AGENT_TIER_MAP, MODEL_TIERS, applyProviderPreset, getProviderNames, buildCustomPreset, registerCustomPreset, } from './model-presets.js';
|
|
7
|
+
import { OMOC_MCP_SERVERS, runMcporterSetup } from './mcporter-setup.js';
|
|
7
8
|
const CONFIG_FILENAMES = [
|
|
8
9
|
'openclaw.json5',
|
|
9
10
|
'openclaw.json',
|
|
@@ -122,11 +123,14 @@ function askQuestion(rl, question) {
|
|
|
122
123
|
});
|
|
123
124
|
}
|
|
124
125
|
const TIER_LABELS = {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
strategic: 'Strategic Planning (prometheus, atlas)',
|
|
127
|
+
reasoning: 'Deep Reasoning (oracle)',
|
|
128
|
+
analysis: 'Analysis/Review (metis, momus)',
|
|
129
|
+
worker: 'Implementation (sisyphus)',
|
|
130
|
+
'deep-worker': 'Deep Implementation (hephaestus)',
|
|
131
|
+
search: 'Codebase Search (explore)',
|
|
132
|
+
research: 'Documentation Research (librarian)',
|
|
133
|
+
visual: 'Visual/Frontend (looker, frontend)',
|
|
130
134
|
};
|
|
131
135
|
function printPreview(logger, provider) {
|
|
132
136
|
const preset = PROVIDER_PRESETS[provider];
|
|
@@ -145,8 +149,7 @@ function printPreview(logger, provider) {
|
|
|
145
149
|
}
|
|
146
150
|
async function runCustomProviderFlow(rl, logger) {
|
|
147
151
|
logger.info('');
|
|
148
|
-
logger.info('
|
|
149
|
-
logger.info(' Format: provider/model (e.g., cliproxy/claude-opus-4-6, z.ai/gpt-5.3-codex)');
|
|
152
|
+
logger.info('Step 1/3: Select your AI provider');
|
|
150
153
|
logger.info('');
|
|
151
154
|
const tierModels = {};
|
|
152
155
|
for (const tier of MODEL_TIERS) {
|
|
@@ -208,17 +211,29 @@ export async function runInteractiveSetup(logger) {
|
|
|
208
211
|
logger.info('');
|
|
209
212
|
logger.info(` ✓ Selected: ${PROVIDER_LABELS[provider] ?? 'Custom'}`);
|
|
210
213
|
logger.info('');
|
|
211
|
-
logger.info('Step 2/
|
|
214
|
+
logger.info('Step 2/3: Model configuration preview');
|
|
212
215
|
logger.info('');
|
|
213
216
|
printPreview(logger, provider);
|
|
214
217
|
logger.info('');
|
|
215
218
|
const confirm = await askQuestion(rl, ' Apply this configuration? (Y/n): ');
|
|
216
219
|
if (confirm.toLowerCase() === 'n' || confirm.toLowerCase() === 'no') {
|
|
217
220
|
logger.info(' Setup cancelled.');
|
|
218
|
-
return { provider: '' };
|
|
221
|
+
return { provider: '', setupMcporter: false };
|
|
219
222
|
}
|
|
220
223
|
logger.info('');
|
|
221
|
-
|
|
224
|
+
logger.info('Step 3/3: Web search MCP servers');
|
|
225
|
+
logger.info('');
|
|
226
|
+
logger.info(' OmOC agents use mcporter MCP servers for web search,');
|
|
227
|
+
logger.info(' documentation lookup, and code search:');
|
|
228
|
+
logger.info('');
|
|
229
|
+
for (const [name, entry] of Object.entries(OMOC_MCP_SERVERS)) {
|
|
230
|
+
logger.info(` ${name}: ${entry.description}`);
|
|
231
|
+
}
|
|
232
|
+
logger.info('');
|
|
233
|
+
const mcpConfirm = await askQuestion(rl, ' Set up these MCP servers? (Y/n): ');
|
|
234
|
+
const setupMcporter = mcpConfirm.toLowerCase() !== 'n' && mcpConfirm.toLowerCase() !== 'no';
|
|
235
|
+
logger.info('');
|
|
236
|
+
return { provider, setupMcporter };
|
|
222
237
|
}
|
|
223
238
|
finally {
|
|
224
239
|
rl.close();
|
|
@@ -278,6 +293,17 @@ export function runSetup(options) {
|
|
|
278
293
|
if (result.added.length === 0 && result.updated.length === 0) {
|
|
279
294
|
logger.info('No changes needed — all OmOC agents already present.');
|
|
280
295
|
}
|
|
296
|
+
if (options.setupMcporter) {
|
|
297
|
+
logger.info('');
|
|
298
|
+
logger.info('Setting up mcporter MCP servers...');
|
|
299
|
+
const mcpResult = runMcporterSetup({
|
|
300
|
+
configPath: options.mcporterConfigPath,
|
|
301
|
+
dryRun,
|
|
302
|
+
logger,
|
|
303
|
+
});
|
|
304
|
+
result.mcporterAdded = mcpResult.added;
|
|
305
|
+
result.mcporterSkipped = mcpResult.skipped;
|
|
306
|
+
}
|
|
281
307
|
return result;
|
|
282
308
|
}
|
|
283
309
|
export function registerSetupCli(ctx) {
|
|
@@ -296,11 +322,13 @@ export function registerSetupCli(ctx) {
|
|
|
296
322
|
const valid = getProviderNames().join(', ');
|
|
297
323
|
throw new Error(`Unknown provider "${provider}". Valid: ${valid}`);
|
|
298
324
|
}
|
|
325
|
+
let setupMcporter = false;
|
|
299
326
|
if (!provider && process.stdin.isTTY) {
|
|
300
327
|
const result = await runInteractiveSetup(ctx.logger);
|
|
301
328
|
if (!result.provider)
|
|
302
329
|
return;
|
|
303
330
|
provider = result.provider;
|
|
331
|
+
setupMcporter = result.setupMcporter;
|
|
304
332
|
}
|
|
305
333
|
runSetup({
|
|
306
334
|
configPath: opts.config,
|
|
@@ -308,6 +336,7 @@ export function registerSetupCli(ctx) {
|
|
|
308
336
|
force: provider ? true : opts.force,
|
|
309
337
|
dryRun: opts.dryRun,
|
|
310
338
|
provider,
|
|
339
|
+
setupMcporter,
|
|
311
340
|
logger: ctx.logger,
|
|
312
341
|
});
|
|
313
342
|
ctx.logger.info('');
|
package/dist/tools/look-at.js
CHANGED
|
@@ -46,7 +46,7 @@ export function registerLookAtTool(api) {
|
|
|
46
46
|
goal: Type.String({ description: 'What to analyze or look for' }),
|
|
47
47
|
model: Type.Optional(Type.String({
|
|
48
48
|
description: 'Gemini model to use',
|
|
49
|
-
default: 'gemini-
|
|
49
|
+
default: 'gemini-3-flash',
|
|
50
50
|
})),
|
|
51
51
|
}),
|
|
52
52
|
execute: async (_toolCallId, params) => {
|
|
@@ -54,7 +54,7 @@ export function registerLookAtTool(api) {
|
|
|
54
54
|
const tempFile = `/tmp/omoc-look-at-${randomUUID()}.md`;
|
|
55
55
|
const tmuxSocket = getConfig(api).tmux_socket;
|
|
56
56
|
try {
|
|
57
|
-
const model = params.model ?? 'gemini-
|
|
57
|
+
const model = params.model ?? 'gemini-3-flash';
|
|
58
58
|
const command = `gemini -m '${shellQuote(model)}' --prompt '${shellQuote(params.goal)}' -f '${shellQuote(params.file_path)}' -o text > '${shellQuote(tempFile)}' 2>&1`;
|
|
59
59
|
runTmux(['-S', tmuxSocket, 'send-keys', '-t', TMUX_SESSION_TARGET, '-l', '--', command], TMUX_SEND_TIMEOUT_MS);
|
|
60
60
|
runTmux(['-S', tmuxSocket, 'send-keys', '-t', TMUX_SESSION_TARGET, 'Enter'], TMUX_SEND_TIMEOUT_MS);
|
|
@@ -9,7 +9,7 @@ const DEFAULT_CATEGORY_MODELS = {
|
|
|
9
9
|
deep: 'claude-opus-4-6-thinking',
|
|
10
10
|
ultrabrain: 'gpt-5.3-codex',
|
|
11
11
|
'visual-engineering': 'gemini-3.1-pro',
|
|
12
|
-
multimodal: 'gemini-
|
|
12
|
+
multimodal: 'gemini-3-flash',
|
|
13
13
|
artistry: 'claude-opus-4-6-thinking',
|
|
14
14
|
'unspecified-low': 'claude-sonnet-4-6',
|
|
15
15
|
'unspecified-high': 'claude-opus-4-6-thinking',
|
package/package.json
CHANGED
|
@@ -49,7 +49,7 @@ Each category automatically selects the best-fit agent. You can override with `a
|
|
|
49
49
|
| deep | `omoc_hephaestus` | claude-opus-4-6-thinking | Complex refactoring, analysis |
|
|
50
50
|
| ultrabrain | `omoc_oracle` | gpt-5.3-codex | Architecture, deep reasoning |
|
|
51
51
|
| visual-engineering | `omoc_frontend` | gemini-3.1-pro | Frontend, UI/UX, design |
|
|
52
|
-
| multimodal | `omoc_looker` | gemini-
|
|
52
|
+
| multimodal | `omoc_looker` | gemini-3-flash | PDF, image, video analysis |
|
|
53
53
|
| artistry | `omoc_hephaestus` | claude-opus-4-6-thinking | Creative complex problems |
|
|
54
54
|
| unspecified-low | `omoc_sisyphus` | claude-sonnet-4-6 | General low-effort tasks |
|
|
55
55
|
| unspecified-high | `omoc_hephaestus` | claude-opus-4-6-thinking | General high-effort tasks |
|
package/skills/gemini-look-at.md
CHANGED
|
@@ -46,7 +46,7 @@ SESSION="gemini"
|
|
|
46
46
|
|
|
47
47
|
# Single file analysis
|
|
48
48
|
tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -l -- \
|
|
49
|
-
"gemini -m gemini-
|
|
49
|
+
"gemini -m gemini-3-flash --prompt 'Analyze this file. Evaluate layout, design, and content quality, and suggest improvements.' -f /path/to/file.pdf -o text" \
|
|
50
50
|
&& sleep 0.1 && tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 Enter
|
|
51
51
|
|
|
52
52
|
# Check results (wait 10-30 seconds)
|
|
@@ -60,7 +60,7 @@ When analysis results are long, redirect to file:
|
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
62
|
tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -l -- \
|
|
63
|
-
"gemini -m gemini-
|
|
63
|
+
"gemini -m gemini-3-flash --prompt 'Detailed analysis' -f /path/to/file.pdf -o text > /tmp/gemini-analysis.md 2>&1" \
|
|
64
64
|
&& sleep 0.1 && tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 Enter
|
|
65
65
|
|
|
66
66
|
# Read results file
|
|
@@ -72,7 +72,7 @@ cat /tmp/gemini-analysis.md
|
|
|
72
72
|
|
|
73
73
|
```bash
|
|
74
74
|
tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -l -- \
|
|
75
|
-
"gemini -m gemini-
|
|
75
|
+
"gemini -m gemini-3-flash --prompt 'Compare these two files' -f /path/to/before.png -f /path/to/after.png -o text" \
|
|
76
76
|
&& sleep 0.1 && tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 Enter
|
|
77
77
|
```
|
|
78
78
|
|
|
@@ -125,8 +125,8 @@ Analyze this error screenshot.
|
|
|
125
125
|
|
|
126
126
|
| Use Case | Recommended Model | Reason |
|
|
127
127
|
|----------|-------------------|--------|
|
|
128
|
-
| Quick check | `gemini-
|
|
129
|
-
| Detailed analysis | `gemini-
|
|
128
|
+
| Quick check | `gemini-3-flash` | Fast, sufficient multimodal capability |
|
|
129
|
+
| Detailed analysis | `gemini-3-pro` | Deeper analysis, longer content |
|
|
130
130
|
| Best quality | `gemini-3.1-pro` | Latest model, best multimodal |
|
|
131
131
|
|
|
132
132
|
## OpenClaw read vs Gemini CLI
|