@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.
@@ -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-2.5-flash',
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-2.5-pro',
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, 'planning' | 'worker' | 'orchestrator' | 'lightweight' | 'visual'>;
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[];
@@ -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: 'planning',
33
- omoc_oracle: 'planning',
34
- omoc_metis: 'planning',
35
- omoc_momus: 'planning',
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
- omoc_atlas: 'orchestrator',
39
- omoc_explore: 'lightweight',
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 = 'planning' | 'worker' | 'orchestrator' | 'lightweight' | 'visual';
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
- planning: { primary: 'anthropic/claude-opus-4-6', fallbacks: ['openai/gpt-5.3-codex'] },
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
- orchestrator: { primary: 'anthropic/claude-sonnet-4-6', fallbacks: ['openai/gpt-4.1'] },
7
- lightweight: { primary: 'anthropic/claude-sonnet-4-6', fallbacks: [] },
8
- visual: { primary: 'google/gemini-2.5-pro', fallbacks: ['anthropic/claude-sonnet-4-6'] },
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
- planning: { primary: 'openai/gpt-5.3-codex', fallbacks: ['anthropic/claude-opus-4-6'] },
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
- orchestrator: { primary: 'openai/gpt-4.1', fallbacks: ['anthropic/claude-sonnet-4-6'] },
14
- lightweight: { primary: 'openai/gpt-4.1-mini', fallbacks: [] },
15
- visual: { primary: 'google/gemini-2.5-pro', fallbacks: ['openai/gpt-4.1'] },
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
- planning: { primary: 'google/gemini-3.1-pro', fallbacks: ['anthropic/claude-opus-4-6'] },
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
- orchestrator: { primary: 'google/gemini-3-flash', fallbacks: ['anthropic/claude-sonnet-4-6'] },
21
- lightweight: { primary: 'google/gemini-3-flash', fallbacks: [] },
22
- visual: { primary: 'google/gemini-2.5-pro', fallbacks: ['google/gemini-3-flash'] },
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 = ['planning', 'worker', 'orchestrator', 'lightweight', 'visual'];
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) {
@@ -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
- planning: 'Planning/Architecture',
126
- worker: 'Implementation Workers',
127
- orchestrator: 'Task Orchestrator',
128
- lightweight: 'Search/Research',
129
- visual: 'Visual/Frontend',
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(' Enter model IDs for each tier.');
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/2: Model configuration preview');
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
- return { provider };
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('');
@@ -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-2.5-flash',
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-2.5-flash';
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-2.5-flash',
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happycastle/oh-my-openclaw",
3
- "version": "0.13.1",
3
+ "version": "0.13.3",
4
4
  "description": "Oh-My-OpenClaw plugin — multi-agent orchestration, todo enforcer, ralph loop, and custom tools for OpenClaw",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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-2.5-flash | PDF, image, video analysis |
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 |
@@ -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-2.5-flash --prompt 'Analyze this file. Evaluate layout, design, and content quality, and suggest improvements.' -f /path/to/file.pdf -o text" \
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-2.5-flash --prompt 'Detailed analysis' -f /path/to/file.pdf -o text > /tmp/gemini-analysis.md 2>&1" \
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-2.5-flash --prompt 'Compare these two files' -f /path/to/before.png -f /path/to/after.png -o text" \
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-2.5-flash` | Fast, sufficient multimodal capability |
129
- | Detailed analysis | `gemini-2.5-pro` | Deeper analysis, longer content |
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