use kodegen_config::CATEGORY_GITHUB;
pub mod github;
pub mod runtime;
pub use runtime::{AsyncStream, AsyncTask, EmitterBuilder};
pub use github::{GitHubClient, GitHubClientBuilder};
pub use github::{GitHubError, GitHubResult};
pub use github::{
CreatePullRequestReviewOptions, CreateReleaseOptions as GitHubReleaseOptions,
ListCommitsOptions, MergePullRequestOptions, ReleaseResult as GitHubReleaseResult,
UpdatePullRequestOptions, create_release, delete_release, get_release_by_tag,
update_release,
};
pub use github::upload_release_asset::{UploadAssetOptions, upload_release_asset};
pub use github::{
ActivityMetrics,
CiCdMetrics,
CodeQualityMetrics,
DependencyMetrics,
DocumentationMetrics,
GithubSearch,
LocalMetrics,
MetadataInfo,
Output as SearchOutput,
QualityMetrics,
ReadmeMetrics,
RepositoryResult,
SearchConfig,
SearchError,
SearchOrder,
SearchProvider,
SearchQuery,
SearchSession,
SecurityMetrics,
StructureMetrics,
TestMetrics,
UserSearchSort,
search_repositories,
search_repositories_with_config,
};
#[cfg(feature = "mcp")]
pub mod tool;
#[cfg(feature = "mcp")]
pub use tool::{
AddIssueCommentTool, AddPullRequestReviewCommentTool, CreateBranchTool, CreateIssueTool,
CreatePullRequestReviewTool, CreatePullRequestTool, CreateRepositoryTool, DeleteBranchTool,
ForkRepositoryTool, GetCommitTool, GetFileContentsTool, GetIssueCommentsTool, GetIssueTool,
GetPullRequestFilesTool, GetPullRequestReviewsTool, GetPullRequestStatusTool, ListBranchesTool,
ListCommitsTool, ListIssuesTool, ListPullRequestsTool, MergePullRequestTool,
RequestCopilotReviewTool, SearchCodeTool, SearchIssuesTool, SearchRepositoriesTool,
SearchUsersTool, UpdateIssueTool, UpdatePullRequestTool,
};
#[cfg(feature = "mcp")]
pub async fn start_server(
addr: std::net::SocketAddr,
tls_cert: Option<std::path::PathBuf>,
tls_key: Option<std::path::PathBuf>,
) -> anyhow::Result<kodegen_server_http::ServerHandle> {
let listener = tokio::net::TcpListener::bind(addr).await
.map_err(|e| anyhow::anyhow!("Failed to bind to {}: {}", addr, e))?;
let tls_config = match (tls_cert, tls_key) {
(Some(cert), Some(key)) => Some((cert, key)),
_ => None,
};
start_server_with_listener(listener, tls_config).await
}
#[cfg(feature = "mcp")]
pub async fn start_server_with_listener(
listener: tokio::net::TcpListener,
tls_config: Option<(std::path::PathBuf, std::path::PathBuf)>,
) -> anyhow::Result<kodegen_server_http::ServerHandle> {
use kodegen_server_http::{ServerBuilder, Managers, RouterSet, register_tool};
use rmcp::handler::server::router::{prompt::PromptRouter, tool::ToolRouter};
let mut builder = ServerBuilder::new()
.category(CATEGORY_GITHUB)
.register_tools(|| async {
let mut tool_router = ToolRouter::new();
let mut prompt_router = PromptRouter::new();
let managers = Managers::new();
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, CreateIssueTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, GetIssueTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, ListIssuesTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, UpdateIssueTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, SearchIssuesTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, AddIssueCommentTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, GetIssueCommentsTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, CreatePullRequestTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, UpdatePullRequestTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, ListPullRequestsTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, MergePullRequestTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, GetPullRequestStatusTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, GetPullRequestFilesTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, GetPullRequestReviewsTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, CreatePullRequestReviewTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, AddPullRequestReviewCommentTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, RequestCopilotReviewTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, CreateRepositoryTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, ForkRepositoryTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, ListBranchesTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, CreateBranchTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, DeleteBranchTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, ListCommitsTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, GetCommitTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, GetFileContentsTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, SearchCodeTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, SearchRepositoriesTool);
(tool_router, prompt_router) = register_tool(tool_router, prompt_router, SearchUsersTool);
Ok(RouterSet::new(tool_router, prompt_router, managers))
})
.with_listener(listener);
if let Some((cert, key)) = tls_config {
builder = builder.with_tls_config(cert, key);
}
builder.serve().await
}