Compare commits

...

9 Commits

Author SHA1 Message Date
github-actions[bot]
0ae1f8c056 release: v1.1.3 2025-12-13 11:30:29 +00:00
YeonGyu-Kim
3caa84f06b feat(agents): explicitly allow read/bash tools for subagents
- oracle: allow read, call_omo_agent
- explore: allow bash, read
- librarian: allow bash, read

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2025-12-13 20:22:56 +09:00
github-actions[bot]
354be6b801 release: v1.1.2 2025-12-13 11:07:38 +00:00
YeonGyu-Kim
9a78df1939 feat(publish): add contributors section to release notes
Tag community contributors with @username in GitHub releases,
following opencode's publish.ts pattern.

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2025-12-13 19:58:31 +09:00
Nguyen Quang Huy
ab522aff1a fix: add multimodal-looker to Zod config schema (#36)
The agent was missing from AgentNameSchema and AgentOverridesSchema,
causing model overrides in oh-my-opencode.json to be silently dropped.

Co-authored-by: Amp <amp@ampcode.com>
2025-12-13 19:47:35 +09:00
YeonGyu-Kim
40c1e62a30 Update readme 2025-12-13 19:44:36 +09:00
YeonGyu-Kim
3f28ce52ad librarian now leverages grep.app 2025-12-13 19:44:36 +09:00
YeonGyu-Kim
9575a4b5c0 change wrong model name
yes this is ai slop
2025-12-13 19:44:36 +09:00
YeonGyu-Kim
098d023dba feat(mcp): add grep_app builtin MCP for ultra-fast GitHub code search
- Add grep_app MCP configuration (https://mcp.grep.app)
- Update explore agent with grep_app usage guide:
  - Always launch 5+ grep_app calls with query variations
  - Always add 2+ other search tools for verification
  - grep_app is fast but potentially outdated, use as starting point only
- Update README.md and README.ko.md with grep_app documentation

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2025-12-13 19:14:01 +09:00
12 changed files with 181 additions and 66 deletions

View File

@@ -233,7 +233,7 @@ opencode auth login
### Agents: 당신의 새로운 팀원들
- **oracle** (`openai/gpt-5.2`): 아키텍처, 코드 리뷰, 전략 수립을 위한 전문가 조언자. GPT-5.2의 뛰어난 논리적 추론과 깊은 분석 능력을 활용합니다. AmpCode 에서 영감을 받았습니다.
- **librarian** (`anthropic/claude-haiku-4-5`): 멀티 레포 분석, 문서 조회, 구현 예제 담당. Haiku의 빠른 속도, 적절한 지능, 훌륭한 도구 호출 능력, 저렴한 비용을 활용합니다. AmpCode 에서 영감을 받았습니다.
- **librarian** (`anthropic/claude-sonnet-4-5`): 멀티 레포 분석, 문서 조회, 구현 예제 담당. Claude Sonnet 4.5 의 뛰어난 지능, 훌륭한 도구 호출 능력을 활용합니다. AmpCode 에서 영감을 받았습니다.
- **explore** (`opencode/grok-code`): 빠른 코드베이스 탐색, 파일 패턴 매칭. Claude Code는 Haiku를 쓰지만, 우리는 Grok을 씁니다. 현재 무료이고, 극도로 빠르며, 파일 탐색 작업에 충분한 지능을 갖췄기 때문입니다. Claude Code 에서 영감을 받았습니다.
- **frontend-ui-ux-engineer** (`google/gemini-3-pro-preview`): 개발자로 전향한 디자이너라는 설정을 갖고 있습니다. 멋진 UI를 만듭니다. 아름답고 창의적인 UI 코드를 생성하는 데 탁월한 Gemini를 사용합니다.
- **document-writer** (`google/gemini-3-pro-preview`): 기술 문서 전문가라는 설정을 갖고 있습니다. Gemini 는 문학가입니다. 글을 기가막히게 씁니다.
@@ -317,7 +317,10 @@ Syntax Highlighting, Autocomplete, Refactoring, Navigation, Analysis, 그리고
- Use PascalCase for interface names
- Use camelCase for function names
```
- **Online**: 프로젝트 규칙이 전부는 아니겠죠. exa, context7 mcp 를 내장하여 검색 기능을 제공합니다.
- **Online**: 프로젝트 규칙이 전부는 아니겠죠. 확장 기능을 위한 내장 MCP를 제공합니다:
- **context7**: 공식 문서 조회
- **websearch_exa**: 실시간 웹 검색
- **grep_app**: 공개 GitHub 저장소에서 초고속 코드 검색 (구현 예제 찾기에 최적)
#### 멀티모달을 다 활용하면서, 토큰은 덜 쓰도록.
@@ -488,13 +491,17 @@ Google Gemini 모델을 위한 내장 Antigravity OAuth를 활성화합니다:
### MCPs
기본적으로 Context7, Exa MCP 를 지원합니다.
기본적으로 Context7, Exa, grep.app MCP 를 지원합니다.
- **context7**: 라이브러리의 최신 공식 문서를 가져옵니다
- **websearch_exa**: Exa AI 기반 실시간 웹 검색
- **grep_app**: [grep.app](https://grep.app)을 통해 수백만 개의 공개 GitHub 저장소에서 초고속 코드 검색
이것이 마음에 들지 않는다면, ~/.config/opencode/oh-my-opencode.json 혹은 .opencode/oh-my-opencode.json 의 `disabled_mcps` 를 사용하여 비활성화할 수 있습니다:
```json
{
"disabled_mcps": ["context7", "websearch_exa"]
"disabled_mcps": ["context7", "websearch_exa", "grep_app"]
}
```

View File

@@ -230,7 +230,7 @@ The plugin works perfectly with defaults. Aside from the recommended `google_aut
### Agents: Your Teammates
- **oracle** (`openai/gpt-5.2`): Architecture, code review, strategy. Uses GPT-5.2 for its stellar logical reasoning and deep analysis. Inspired by AmpCode.
- **librarian** (`anthropic/claude-haiku-4-5`): Multi-repo analysis, doc lookup, implementation examples. Haiku is fast, smart enough, great at tool calls, and cheap. Inspired by AmpCode.
- **librarian** (`anthropic/claude-sonnet-4-5`): Multi-repo analysis, doc lookup, implementation examples. Claude Sonnet 4 is fast, smart, great at tool calls, and excellent for documentation research. Inspired by AmpCode.
- **explore** (`opencode/grok-code`): Fast codebase exploration and pattern matching. Claude Code uses Haiku; we use Grok—it's free, blazing fast, and plenty smart for file traversal. Inspired by Claude Code.
- **frontend-ui-ux-engineer** (`google/gemini-3-pro-preview`): A designer turned developer. Builds gorgeous UIs. Gemini excels at creative, beautiful UI code.
- **document-writer** (`google/gemini-3-pro-preview`): Technical writing expert. Gemini is a wordsmith—writes prose that flows.
@@ -314,7 +314,10 @@ Hand your best tools to your best colleagues. Now they can properly refactor, na
- Use PascalCase for interface names
- Use camelCase for function names
```
- **Online**: Project rules aren't everything. Built-in exa and context7 MCP for web search.
- **Online**: Project rules aren't everything. Built-in MCPs for extended capabilities:
- **context7**: Official documentation lookup
- **websearch_exa**: Real-time web search
- **grep_app**: Ultra-fast code search across public GitHub repos (great for finding implementation examples)
#### Be Multimodal. Save Tokens.
@@ -485,13 +488,17 @@ Available agents: `oracle`, `librarian`, `explore`, `frontend-ui-ux-engineer`, `
### MCPs
Context7 and Exa MCP enabled by default.
Context7, Exa, and grep.app MCP enabled by default.
- **context7**: Fetches up-to-date official documentation for libraries
- **websearch_exa**: Real-time web search powered by Exa AI
- **grep_app**: Ultra-fast code search across millions of public GitHub repositories via [grep.app](https://grep.app)
Don't want them? Disable via `disabled_mcps` in `~/.config/opencode/oh-my-opencode.json` or `.opencode/oh-my-opencode.json`:
```json
{
"disabled_mcps": ["context7", "websearch_exa"]
"disabled_mcps": ["context7", "websearch_exa", "grep_app"]
}
```

View File

@@ -27,7 +27,8 @@
"librarian",
"explore",
"frontend-ui-ux-engineer",
"document-writer"
"document-writer",
"multimodal-looker"
]
}
},
@@ -63,7 +64,8 @@
"librarian",
"explore",
"frontend-ui-ux-engineer",
"document-writer"
"document-writer",
"multimodal-looker"
]
},
"additionalProperties": {

View File

@@ -1,6 +1,6 @@
{
"name": "oh-my-opencode",
"version": "1.1.1",
"version": "1.1.3",
"description": "OpenCode plugin - custom agents (oracle, librarian) and enhanced features",
"main": "dist/index.js",
"types": "dist/index.d.ts",

View File

@@ -41,7 +41,9 @@ async function updatePackageVersion(newVersion: string): Promise<void> {
console.log(`Updated: ${pkgPath}`)
}
async function generateChangelog(previous: string): Promise<string> {
async function generateChangelog(previous: string): Promise<string[]> {
const notes: string[] = []
try {
const log = await $`git log v${previous}..HEAD --oneline --format="%h %s"`.text()
const commits = log
@@ -49,16 +51,59 @@ async function generateChangelog(previous: string): Promise<string> {
.filter((line) => line && !line.match(/^\w+ (ignore:|test:|chore:|ci:|release:)/i))
if (commits.length > 0) {
const changelog = commits.map((c) => `- ${c}`).join("\n")
for (const commit of commits) {
notes.push(`- ${commit}`)
}
console.log("\n--- Changelog ---")
console.log(changelog)
console.log(notes.join("\n"))
console.log("-----------------\n")
return changelog
}
} catch {
console.log("No previous tags found, skipping changelog generation")
}
return ""
return notes
}
async function getContributors(previous: string): Promise<string[]> {
const notes: string[] = []
const team = ["actions-user", "github-actions[bot]", "code-yeongyu"]
try {
const compare =
await $`gh api "/repos/code-yeongyu/oh-my-opencode/compare/v${previous}...HEAD" --jq '.commits[] | {login: .author.login, message: .commit.message}'`.text()
const contributors = new Map<string, string[]>()
for (const line of compare.split("\n").filter(Boolean)) {
const { login, message } = JSON.parse(line) as { login: string | null; message: string }
const title = message.split("\n")[0] ?? ""
if (title.match(/^(ignore:|test:|chore:|ci:|release:)/i)) continue
if (login && !team.includes(login)) {
if (!contributors.has(login)) contributors.set(login, [])
contributors.get(login)?.push(title)
}
}
if (contributors.size > 0) {
notes.push("")
notes.push(`**Thank you to ${contributors.size} community contributor${contributors.size > 1 ? "s" : ""}:**`)
for (const [username, userCommits] of contributors) {
notes.push(`- @${username}:`)
for (const commit of userCommits) {
notes.push(` - ${commit}`)
}
}
console.log("\n--- Contributors ---")
console.log(notes.join("\n"))
console.log("--------------------\n")
}
} catch (error) {
console.log("Failed to fetch contributors:", error)
}
return notes
}
async function buildAndPublish(): Promise<void> {
@@ -71,7 +116,7 @@ async function buildAndPublish(): Promise<void> {
}
}
async function gitTagAndRelease(newVersion: string, changelog: string): Promise<void> {
async function gitTagAndRelease(newVersion: string, notes: string[]): Promise<void> {
if (!process.env.CI) return
console.log("\nCommitting and tagging...")
@@ -79,7 +124,6 @@ async function gitTagAndRelease(newVersion: string, changelog: string): Promise<
await $`git config user.name "github-actions[bot]"`
await $`git add package.json`
// Commit only if there are staged changes (idempotent)
const hasStagedChanges = await $`git diff --cached --quiet`.nothrow()
if (hasStagedChanges.exitCode !== 0) {
await $`git commit -m "release: v${newVersion}"`
@@ -87,7 +131,6 @@ async function gitTagAndRelease(newVersion: string, changelog: string): Promise<
console.log("No changes to commit (version already updated)")
}
// Tag only if it doesn't exist (idempotent)
const tagExists = await $`git rev-parse v${newVersion}`.nothrow()
if (tagExists.exitCode !== 0) {
await $`git tag v${newVersion}`
@@ -95,12 +138,10 @@ async function gitTagAndRelease(newVersion: string, changelog: string): Promise<
console.log(`Tag v${newVersion} already exists`)
}
// Push (idempotent - git push is already idempotent)
await $`git push origin HEAD --tags`
// Create release only if it doesn't exist (idempotent)
console.log("\nCreating GitHub release...")
const releaseNotes = changelog || "No notable changes"
const releaseNotes = notes.length > 0 ? notes.join("\n") : "No notable changes"
const releaseExists = await $`gh release view v${newVersion}`.nothrow()
if (releaseExists.exitCode !== 0) {
await $`gh release create v${newVersion} --title "v${newVersion}" --notes ${releaseNotes}`
@@ -130,8 +171,11 @@ async function main() {
await updatePackageVersion(newVersion)
const changelog = await generateChangelog(previous)
const contributors = await getContributors(previous)
const notes = [...changelog, ...contributors]
await buildAndPublish()
await gitTagAndRelease(newVersion, changelog)
await gitTagAndRelease(newVersion, notes)
console.log(`\n=== Successfully published ${PACKAGE_NAME}@${newVersion} ===`)
}

View File

@@ -6,7 +6,7 @@ export const exploreAgent: AgentConfig = {
mode: "subagent",
model: "opencode/grok-code",
temperature: 0.1,
tools: { write: false, edit: false },
tools: { write: false, edit: false, bash: true, read: true },
prompt: `You are a file search specialist. You excel at thoroughly navigating and exploring codebases.
=== CRITICAL: READ-ONLY MODE - NO FILE MODIFICATIONS ===
@@ -73,6 +73,46 @@ Your response has FAILED if:
- **Using Git CLI extensively for repository insights**
- **Using LSP tools for semantic code analysis**
- **Using AST-grep for structural code pattern matching**
- **Using grep_app (grep.app MCP) for ultra-fast initial code discovery**
## grep_app - FAST STARTING POINT (USE FIRST!)
**grep_app is your fastest weapon for initial code discovery.** It searches millions of public GitHub repositories instantly.
### When to Use grep_app:
- **ALWAYS start with grep_app** when searching for code patterns, library usage, or implementation examples
- Use it to quickly find how others implement similar features
- Great for discovering common patterns and best practices
### CRITICAL WARNING:
grep_app results may be **OUTDATED** or from **different library versions**. You MUST:
1. Use grep_app results as a **starting point only**
2. **Always launch 5+ grep_app calls in parallel** with different query variations
3. **Always add 2+ other search tools** (Grep, ast_grep, context7, LSP, Git) for verification
4. Never blindly trust grep_app results for API signatures or implementation details
### MANDATORY: 5+ grep_app Calls + 2+ Other Tools in Parallel
**grep_app is ultra-fast but potentially inaccurate.** To compensate, you MUST:
- Launch **at least 5 grep_app calls** with different query variations (synonyms, different phrasings, related terms)
- Launch **at least 2 other search tools** (local Grep, ast_grep, context7, LSP, Git) for cross-validation
\`\`\`
// REQUIRED parallel search pattern:
// 5+ grep_app calls with query variations:
- Tool 1: grep_app_searchGitHub(query: "useEffect cleanup", language: ["TypeScript"])
- Tool 2: grep_app_searchGitHub(query: "useEffect return cleanup", language: ["TypeScript"])
- Tool 3: grep_app_searchGitHub(query: "useEffect unmount", language: ["TSX"])
- Tool 4: grep_app_searchGitHub(query: "cleanup function useEffect", language: ["TypeScript"])
- Tool 5: grep_app_searchGitHub(query: "useEffect addEventListener removeEventListener", language: ["TypeScript"])
// 2+ other tools for verification:
- Tool 6: Grep("useEffect.*return") - Local codebase ground truth
- Tool 7: context7_get-library-docs(libraryID: "/facebook/react", topic: "useEffect cleanup") - Official docs
- Tool 8 (optional): ast_grep_search(pattern: "useEffect($$$)", lang: "tsx") - Structural search
\`\`\`
**Pattern**: Flood grep_app with query variations (5+) → verify with local/official sources (2+) → trust only cross-validated results.
## Git CLI - USE EXTENSIVELY

View File

@@ -4,9 +4,9 @@ export const librarianAgent: AgentConfig = {
description:
"Specialized codebase understanding agent for multi-repository analysis, searching remote codebases, retrieving official documentation, and finding implementation examples using GitHub CLI, Context7, and Web Search. MUST BE USED when users ask to look up code in remote repositories, explain library internals, or find usage examples in open source.",
mode: "subagent",
model: "anthropic/claude-sonnet-4",
model: "anthropic/claude-sonnet-4-5",
temperature: 0.1,
tools: { write: false, edit: false },
tools: { write: false, edit: false, bash: true, read: true },
prompt: `# THE LIBRARIAN
You are **THE LIBRARIAN**, a specialized codebase understanding agent that helps users answer questions about large, complex codebases across repositories.
@@ -35,39 +35,45 @@ Your role is to provide thorough, comprehensive analysis and explanations of cod
- Explain **WHY** it works that way by citing the actual implementation
- Provide **permalinks** so users can verify your claims
4. **SOURCE OF TRUTH**:
- For **Fast Reconnaissance**: Use \`grep_app_searchGitHub\` (4+ parallel calls) - instant results from famous repos.
- For **How-To**: Use \`context7\` (Official Docs) + verify with source code.
- For **Real-World Usage**: Use \`gh search code\` (GitHub).
- For **Real-World Usage**: Use \`grep_app_searchGitHub\` first, then \`gh search code\` for deeper search.
- For **Internal Logic**: Clone repo to \`/tmp\` and read source directly.
- For **Change History/Intent**: Use \`git log\` or \`git blame\` (Commit History).
- For **Local Codebase Context**: Use \`Glob\`, \`Grep\`, \`ast_grep_search\` (File patterns, code search).
- For **Latest Information**: Use \`WebSearch\` for recent updates, blog posts, discussions.
- For **Local Codebase Context**: Use \`glob\`, \`grep\`, \`ast_grep_search\` (File patterns, code search).
- For **Latest Information**: Use \`websearch_exa_web_search_exa\` for recent updates, blog posts, discussions.
## MANDATORY PARALLEL TOOL EXECUTION
**CRITICAL**: You MUST execute **AT LEAST 5 tool calls in parallel** whenever possible.
**MINIMUM REQUIREMENT**:
- \`grep_app_searchGitHub\`: **4+ parallel calls** (fast reconnaissance)
- Other tools: **3+ parallel calls** (authoritative verification)
When starting a research task, launch ALL of these simultaneously:
1. \`context7_resolve-library-id\` - Get library documentation ID
2. \`gh search code\` - Search for code examples
3. \`WebSearch\` - Find latest discussions, blog posts, updates
4. \`gh repo clone\` to \`/tmp\` - Clone repo for deep analysis
5. \`Glob\` / \`Grep\` - Search local codebase for related code
6. \`lsp_goto_definition\` / \`lsp_find_references\` - Trace definitions and usages
7. \`ast_grep_search\` - AST-aware pattern matching
### grep_app_searchGitHub - FAST START
| ✅ Strengths | ⚠️ Limitations |
|-------------|----------------|
| Sub-second, no rate limits | Index ~1-2 weeks behind |
| Million+ public repos | Less famous repos missing |
**Always vary queries** - function calls, configs, imports, regex patterns.
### Example: Researching "React Query caching"
**Example parallel execution**:
\`\`\`
// Launch ALL 5+ tools in a SINGLE message:
- Tool 1: context7_resolve-library-id("react-query")
- Tool 2: gh search code "useQuery" --repo tanstack/query --language typescript
- Tool 3: WebSearch("tanstack query v5 migration guide 2024")
- Tool 4: bash: git clone --depth 1 https://github.com/TanStack/query.git /tmp/tanstack-query
- Tool 5: Glob("**/*query*.ts") - Find query-related files locally
- Tool 6: gh api repos/tanstack/query/releases/latest
- Tool 7: ast_grep_search(pattern: "useQuery($$$)", lang: "typescript")
// FAST START - grep_app (4+ calls)
grep_app_searchGitHub(query: "staleTime:", language: ["TypeScript", "TSX"])
grep_app_searchGitHub(query: "gcTime:", language: ["TypeScript"])
grep_app_searchGitHub(query: "queryClient.setQueryData", language: ["TypeScript"])
grep_app_searchGitHub(query: "useQuery.*cacheTime", useRegexp: true)
// AUTHORITATIVE (3+ calls)
context7_resolve-library-id("tanstack-query")
websearch_exa_web_search_exa(query: "react query v5 caching 2024")
bash: gh repo clone tanstack/query /tmp/tanstack-query -- --depth 1
\`\`\`
**NEVER** execute tools sequentially when they can run in parallel. Sequential execution is ONLY allowed when a tool's input depends on another tool's output.
**grep_app = speed & breadth. Other tools = depth & authority. Use BOTH.**
## TOOL USAGE STANDARDS
@@ -103,8 +109,8 @@ Use this for authoritative API references and framework guides.
- **Step 2**: Call \`context7_get-library-docs\` with the ID and a specific topic (e.g., "authentication", "middleware").
- **IMPORTANT**: Documentation alone is NOT sufficient. Always cross-reference with actual source code.
### 3. WebSearch - MANDATORY FOR LATEST INFO
Use WebSearch for:
### 3. websearch_exa_web_search_exa - MANDATORY FOR LATEST INFO
Use websearch_exa_web_search_exa for:
- Latest library updates and changelogs
- Migration guides and breaking changes
- Community discussions and best practices
@@ -112,11 +118,11 @@ Use WebSearch for:
- Recent bug reports and workarounds
**Example searches**:
- \`"react 19 new features 2024"\`
- \`"django 6.0 new features 2025"\`
- \`"tanstack query v5 breaking changes"\`
- \`"next.js app router migration guide"\`
### 4. WebFetch
### 4. webfetch
Use this to read content from URLs found during your search (e.g., StackOverflow threads, blog posts, non-standard documentation sites, GitHub blob pages).
### 5. Repository Cloning to /tmp
@@ -156,18 +162,18 @@ Use this for understanding code evolution and authorial intent.
- **Getting Permalinks from Blame**:
- Use commit SHA from blame to construct GitHub permalinks.
### 7. Local Codebase Search (Glob, Grep, Read)
### 7. Local Codebase Search (glob, grep, read)
Use these for searching files and patterns in the local codebase.
- **Glob**: Find files by pattern (e.g., \`**/*.tsx\`, \`src/**/auth*.ts\`)
- **Grep**: Search file contents with regex patterns
- **Read**: Read specific files when you know the path
- **glob**: Find files by pattern (e.g., \`**/*.tsx\`, \`src/**/auth*.ts\`)
- **grep**: Search file contents with regex patterns
- **read**: Read specific files when you know the path
**Parallel Search Strategy**:
\`\`\`
// Launch multiple searches in parallel:
- Tool 1: Glob("**/*auth*.ts") - Find auth-related files
- Tool 2: Grep("authentication") - Search for auth patterns
- Tool 1: glob("**/*auth*.ts") - Find auth-related files
- Tool 2: grep("authentication") - Search for auth patterns
- Tool 3: ast_grep_search(pattern: "function authenticate($$$)", lang: "typescript")
\`\`\`
@@ -195,7 +201,7 @@ Use LSP for finding definitions and references - these are its unique strengths
- Tool 1: lsp_goto_definition(filePath, line, char) - Find where it's defined
- Tool 2: lsp_find_references(filePath, line, char) - Find all usages
- Tool 3: ast_grep_search(...) - Find similar patterns
- Tool 4: Grep(...) - Text fallback
- Tool 4: grep(...) - Text fallback
\`\`\`
### 9. AST-grep - AST-AWARE PATTERN SEARCH
@@ -229,15 +235,15 @@ ast_grep_search(pattern: "fetch($URL, { method: $METHOD })", lang: "typescript")
**When to Use AST-grep vs Grep**:
- **AST-grep**: When you need structural matching (e.g., "find all function definitions")
- **Grep**: When you need text matching (e.g., "find all occurrences of 'TODO'")
- **grep**: When you need text matching (e.g., "find all occurrences of 'TODO'")
**Parallel AST-grep Execution**:
\`\`\`
// When analyzing a codebase pattern, launch in parallel:
- Tool 1: ast_grep_search(pattern: "useQuery($$$)", lang: "tsx") - Find hook usage
- Tool 2: ast_grep_search(pattern: "export function $NAME($$$)", lang: "typescript") - Find exports
- Tool 3: Grep("useQuery") - Text fallback
- Tool 4: Glob("**/*query*.ts") - Find query-related files
- Tool 3: grep("useQuery") - Text fallback
- Tool 4: glob("**/*query*.ts") - Find query-related files
\`\`\`
## SEARCH STRATEGY PROTOCOL
@@ -251,9 +257,9 @@ When given a request, follow this **STRICT** workflow:
2. **PARALLEL INVESTIGATION** (Launch 5+ tools simultaneously):
- \`context7\`: Get official documentation
- \`gh search code\`: Find implementation examples
- \`WebSearch\`: Get latest updates and discussions
- \`websearch_exa_web_search_exa\`: Get latest updates and discussions
- \`gh repo clone\`: Clone to /tmp for deep analysis
- \`Glob\` / \`Grep\` / \`ast_grep_search\`: Search local codebase
- \`glob\` / \`grep\` / \`ast_grep_search\`: Search local codebase
- \`gh api\`: Get release/version information
3. **DEEP SOURCE ANALYSIS**:

View File

@@ -8,7 +8,7 @@ export const oracleAgent: AgentConfig = {
temperature: 0.1,
reasoningEffort: "medium",
textVerbosity: "high",
tools: { write: false, edit: false },
tools: { write: false, edit: false, read: true, call_omo_agent: true },
prompt: `You are the Oracle - an expert AI advisor with advanced reasoning capabilities.
Your role is to provide high-quality technical guidance, code reviews, architectural advice, and strategic planning for software engineering tasks.

View File

@@ -22,6 +22,7 @@ export const AgentNameSchema = z.enum([
"explore",
"frontend-ui-ux-engineer",
"document-writer",
"multimodal-looker",
])
export const HookNameSchema = z.enum([
@@ -65,6 +66,7 @@ export const AgentOverridesSchema = z
explore: AgentOverrideConfigSchema.optional(),
"frontend-ui-ux-engineer": AgentOverrideConfigSchema.optional(),
"document-writer": AgentOverrideConfigSchema.optional(),
"multimodal-looker": AgentOverrideConfigSchema.optional(),
})
.partial()

5
src/mcp/grep-app.ts Normal file
View File

@@ -0,0 +1,5 @@
export const grep_app = {
type: "remote" as const,
url: "https://mcp.grep.app",
enabled: true,
}

View File

@@ -1,5 +1,6 @@
import { websearch_exa } from "./websearch-exa"
import { context7 } from "./context7"
import { grep_app } from "./grep-app"
import type { McpName } from "./types"
export { McpNameSchema, type McpName } from "./types"
@@ -7,6 +8,7 @@ export { McpNameSchema, type McpName } from "./types"
const allBuiltinMcps: Record<McpName, { type: "remote"; url: string; enabled: boolean }> = {
websearch_exa,
context7,
grep_app,
}
export function createBuiltinMcps(disabledMcps: McpName[] = []) {

View File

@@ -1,5 +1,5 @@
import { z } from "zod"
export const McpNameSchema = z.enum(["websearch_exa", "context7"])
export const McpNameSchema = z.enum(["websearch_exa", "context7", "grep_app"])
export type McpName = z.infer<typeof McpNameSchema>