f31dcc6a29
* feat(skill-hub): add Skill Hub catalog, publish flow, and lite materialize pipeline Introduce Skill Hub for browsing, importing, publishing, and installing skills, with lite instance package materialization and runtime sync support. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(skill-hub): remove token-governance hooks from Skill Hub PR Strip validateManagedRuntimeEnvironmentOverrides, network lock policy sync, and egress proxy audit wiring that belong to the upcoming token-usage work, so the Skill Hub branch compiles independently. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(skill-hub): update migration number in materialize docs Co-authored-by: Cursor <cursoragent@cursor.com> * fix(skill-hub): make RuntimeAgentClient test stub and hub tests compile-safe Add ResyncInstanceSkills to the runtime pool handler fake client, and harden skill hub payload helpers/tests against nil storage/instance repos so go test passes. Co-authored-by: Cursor <cursoragent@cursor.com> * feat: add Skill Hub hardening with session usage tracking and egress governance Unify Skill Hub runtime sync improvements with session-token observability, egress network policy, and admin/instance usage reporting for reopenable PR. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(skill-hub): repair CI tests and nested skill install * fix(ci): restore release deployment configuration * feat(skill-hub): 支持 Skill 批量安装与 Hermes 导入 * 定时任务开发,Skill hub功能优化,最新Hermes版本适配 * skill hub中文适配 * skill 描述功能调整,私网开通 * codex opencode claude pro版本适配 * opencode适配 * test(skill-hub): preserve existing blob ID in provenance test * fix(skills): tolerate non-root OpenCode ownership setup --------- Co-authored-by: heshengran <heshengran@ieisystem.com> Co-authored-by: Cursor <cursoragent@cursor.com>
65 lines
2.2 KiB
TypeScript
65 lines
2.2 KiB
TypeScript
/// <reference path="../env.d.ts" />
|
|
import { tool } from "@opencode-ai/plugin"
|
|
async function githubFetch(endpoint: string, options: RequestInit = {}) {
|
|
const response = await fetch(`https://api.github.com${endpoint}`, {
|
|
...options,
|
|
headers: {
|
|
Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,
|
|
Accept: "application/vnd.github+json",
|
|
"Content-Type": "application/json",
|
|
...(options.headers instanceof Headers ? Object.fromEntries(options.headers.entries()) : options.headers),
|
|
},
|
|
})
|
|
if (!response.ok) {
|
|
throw new Error(`GitHub API error: ${response.status} ${response.statusText}`)
|
|
}
|
|
return response.json()
|
|
}
|
|
|
|
interface PR {
|
|
title: string
|
|
html_url: string
|
|
}
|
|
|
|
export default tool({
|
|
description: `Use this tool to search GitHub pull requests by title and description.
|
|
|
|
This tool searches PRs in the anomalyco/opencode repository and returns LLM-friendly results including:
|
|
- PR number and title
|
|
- Author
|
|
- State (open/closed/merged)
|
|
- Labels
|
|
- Description snippet
|
|
|
|
Use the query parameter to search for keywords that might appear in PR titles or descriptions.`,
|
|
args: {
|
|
query: tool.schema.string().describe("Search query for PR titles and descriptions"),
|
|
limit: tool.schema.number().describe("Maximum number of results to return").default(10),
|
|
offset: tool.schema.number().describe("Number of results to skip for pagination").default(0),
|
|
},
|
|
async execute(args) {
|
|
const owner = "anomalyco"
|
|
const repo = "opencode"
|
|
|
|
const page = Math.floor(args.offset / args.limit) + 1
|
|
const searchQuery = encodeURIComponent(`${args.query} repo:${owner}/${repo} type:pr state:open`)
|
|
const result = await githubFetch(
|
|
`/search/issues?q=${searchQuery}&per_page=${args.limit}&page=${page}&sort=updated&order=desc`,
|
|
)
|
|
|
|
if (result.total_count === 0) {
|
|
return `No PRs found matching "${args.query}"`
|
|
}
|
|
|
|
const prs = result.items as PR[]
|
|
|
|
if (prs.length === 0) {
|
|
return `No other PRs found matching "${args.query}"`
|
|
}
|
|
|
|
const formatted = prs.map((pr) => `${pr.title}\n${pr.html_url}`).join("\n\n")
|
|
|
|
return `Found ${result.total_count} PRs (showing ${prs.length}):\n\n${formatted}`
|
|
},
|
|
})
|