add git-repo
This commit is contained in:
parent
1122538c73
commit
6fdc573358
@ -35,5 +35,13 @@ $ ./aigpt mcp chat "hello world!" --host http://localhost:11434 --model syui/ai
|
|||||||
# openai api
|
# openai api
|
||||||
$ ./aigpt mcp set-api -api sk-abc123
|
$ ./aigpt mcp set-api -api sk-abc123
|
||||||
$ ./aigpt mcp chat "こんにちは" -p openai -m gpt-4o-mini
|
$ ./aigpt mcp chat "こんにちは" -p openai -m gpt-4o-mini
|
||||||
|
|
||||||
|
---
|
||||||
|
# git管理されているファイルをAIに読ませる
|
||||||
|
./aigpt mcp chat --host http://localhost:11434 --repo git@git.syui.ai:ai/gpt
|
||||||
|
**改善案と次のステップ:**
|
||||||
|
1. **README.md の大幅な改善:**
|
||||||
|
**次のステップ:**
|
||||||
|
1. **README.md の作成:** 1. の指示に従って、README.md ファイルを作成します。
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ fn load_openai_api_key() -> Option<String> {
|
|||||||
Some(parsed.token)
|
Some(parsed.token)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ask_chat(c: &Context, question: &str) {
|
pub fn ask_chat(c: &Context, question: &str) -> String {
|
||||||
let config = ConfigPaths::new();
|
let config = ConfigPaths::new();
|
||||||
let base_dir = config.base_dir.join("mcp");
|
let base_dir = config.base_dir.join("mcp");
|
||||||
let script_path = base_dir.join("scripts/ask.py");
|
let script_path = base_dir.join("scripts/ask.py");
|
||||||
@ -83,18 +83,18 @@ pub fn ask_chat(c: &Context, question: &str) {
|
|||||||
command.env("OPENAI_API_KEY", api_key);
|
command.env("OPENAI_API_KEY", api_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 🔁 実行
|
|
||||||
let output = command
|
let output = command
|
||||||
.output()
|
.output()
|
||||||
.expect("❌ MCPチャットスクリプトの実行に失敗しました");
|
.expect("❌ MCPチャットスクリプトの実行に失敗しました");
|
||||||
|
|
||||||
if output.status.success() {
|
if output.status.success() {
|
||||||
println!("💬 {}", String::from_utf8_lossy(&output.stdout));
|
String::from_utf8_lossy(&output.stdout).to_string()
|
||||||
} else {
|
} else {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"❌ 実行エラー: {}\n{}",
|
"❌ 実行エラー: {}\n{}",
|
||||||
String::from_utf8_lossy(&output.stderr),
|
String::from_utf8_lossy(&output.stderr),
|
||||||
String::from_utf8_lossy(&output.stdout),
|
String::from_utf8_lossy(&output.stdout),
|
||||||
);
|
);
|
||||||
|
String::from("エラーが発生しました。")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
17
src/commands/git_repo.rs
Normal file
17
src/commands/git_repo.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// src/commands/git_repo.rs
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
// Gitリポジトリ内の全てのファイルを取得し、内容を読み取る
|
||||||
|
pub fn read_all_git_files(repo_path: &str) -> String {
|
||||||
|
let mut content = String::new();
|
||||||
|
for entry in fs::read_dir(repo_path).expect("ディレクトリ読み込み失敗") {
|
||||||
|
let entry = entry.expect("エントリ読み込み失敗");
|
||||||
|
let path = entry.path();
|
||||||
|
if path.is_file() {
|
||||||
|
if let Ok(file_content) = fs::read_to_string(&path) {
|
||||||
|
content.push_str(&format!("\n\n# File: {}\n{}", path.display(), file_content));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
content
|
||||||
|
}
|
@ -5,10 +5,10 @@ use std::path::{PathBuf};
|
|||||||
use std::process::Command as OtherCommand;
|
use std::process::Command as OtherCommand;
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use seahorse::{Command, Context, Flag, FlagType};
|
use seahorse::{Command, Context, Flag, FlagType};
|
||||||
|
|
||||||
use crate::chat::ask_chat;
|
use crate::chat::ask_chat;
|
||||||
use crate::git::{git_init, git_status};
|
use crate::git::{git_init, git_status};
|
||||||
use crate::config::ConfigPaths;
|
use crate::config::ConfigPaths;
|
||||||
|
use crate::commands::git_repo::read_all_git_files;
|
||||||
|
|
||||||
pub fn mcp_setup() {
|
pub fn mcp_setup() {
|
||||||
let config = ConfigPaths::new();
|
let config = ConfigPaths::new();
|
||||||
@ -153,13 +153,54 @@ fn chat_cmd() -> Command {
|
|||||||
.description("OpenAI APIキー")
|
.description("OpenAI APIキー")
|
||||||
.alias("k"),
|
.alias("k"),
|
||||||
)
|
)
|
||||||
|
.flag(
|
||||||
|
Flag::new("repo", FlagType::String)
|
||||||
|
.description("Gitリポジトリのパスを指定 (すべてのコードを読み込む)")
|
||||||
|
.alias("r"),
|
||||||
|
)
|
||||||
.action(|c: &Context| {
|
.action(|c: &Context| {
|
||||||
if let Some(question) = c.args.get(0) {
|
if let Some(question) = c.args.get(0) {
|
||||||
ask_chat(c, question);
|
let response = ask_chat(c, question);
|
||||||
|
println!("💬 応答:\n{}", response);
|
||||||
} else {
|
} else {
|
||||||
eprintln!("❗ 質問が必要です: mcp chat 'こんにちは'");
|
eprintln!("❗ 質問が必要です: mcp chat 'こんにちは'");
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.action(|c: &Context| {
|
||||||
|
let config = ConfigPaths::new();
|
||||||
|
if let Ok(repo_url) = c.string_flag("repo") {
|
||||||
|
let repo_base = config.base_dir.join("repos");
|
||||||
|
let repo_dir = repo_base.join(sanitize_repo_name(&repo_url));
|
||||||
|
|
||||||
|
if !repo_dir.exists() {
|
||||||
|
println!("📥 Gitリポジトリをクローン中: {}", repo_url);
|
||||||
|
let status = OtherCommand::new("git")
|
||||||
|
.args(&["clone", &repo_url, repo_dir.to_str().unwrap()])
|
||||||
|
.status()
|
||||||
|
.expect("❌ Gitのクローンに失敗しました");
|
||||||
|
assert!(status.success(), "Git clone エラー");
|
||||||
|
} else {
|
||||||
|
println!("✔ リポジトリはすでに存在します: {}", repo_dir.display());
|
||||||
|
}
|
||||||
|
|
||||||
|
//let files = read_all_git_files(&repo_dir);
|
||||||
|
let files = read_all_git_files(repo_dir.to_str().unwrap());
|
||||||
|
let prompt = format!(
|
||||||
|
"以下のコードベースを読み込んで、改善案や次のステップを提案してください:\n{}",
|
||||||
|
files
|
||||||
|
);
|
||||||
|
|
||||||
|
let response = ask_chat(c, &prompt);
|
||||||
|
println!("💡 提案:\n{}", response);
|
||||||
|
} else {
|
||||||
|
if let Some(question) = c.args.get(0) {
|
||||||
|
let response = ask_chat(c, question);
|
||||||
|
println!("💬 {}", response);
|
||||||
|
} else {
|
||||||
|
eprintln!("❗ 質問が必要です: mcp chat 'こんにちは'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init_cmd() -> Command {
|
fn init_cmd() -> Command {
|
||||||
@ -200,3 +241,8 @@ pub fn mcp_cmd() -> Command {
|
|||||||
.command(setup_cmd())
|
.command(setup_cmd())
|
||||||
.command(set_api_key_cmd())
|
.command(set_api_key_cmd())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ファイル名として安全な形に変換
|
||||||
|
fn sanitize_repo_name(repo_url: &str) -> String {
|
||||||
|
repo_url.replace("://", "_").replace("/", "_").replace("@", "_")
|
||||||
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
pub mod db;
|
pub mod db;
|
||||||
pub mod scheduler;
|
pub mod scheduler;
|
||||||
pub mod mcp;
|
pub mod mcp;
|
||||||
|
pub mod git_repo;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user