Skip to content
Merged
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
dec5758
refactor(mcp): complete trait-ization of remaining MCP tool layer
juice094 May 11, 2026
4faeca5
Merge branch 'main' of https://github.com/juice094/devbase
juice094 May 11, 2026
8a36e72
refactor(knowledge_engine): extract Config load + prepare_repos, elim…
juice094 May 11, 2026
83663ba
Merge branch 'main' of https://github.com/juice094/devbase
juice094 May 11, 2026
a9bea88
perf(knowledge_engine): reuse Tantivy writer across daemon batch inde…
juice094 May 11, 2026
abe30c1
Merge branch 'main' of https://github.com/juice094/devbase
juice094 May 11, 2026
507fc44
docs: module rustdoc + ADR-004/005 + i18n dead_code clarification
juice094 May 11, 2026
d0d2297
Merge branch 'main' of https://github.com/juice094/devbase
juice094 May 11, 2026
a3fef4c
docs: update project facade files (README ecosystem)
juice094 May 11, 2026
8bea167
Merge branch 'main' of https://github.com/juice094/devbase
juice094 May 11, 2026
3b7446b
test(knowledge_engine): 补齐 index.rs 与 index_state.rs 单元测试
juice094 May 11, 2026
69eb364
chore: ignore coverage_report.txt
juice094 May 11, 2026
ed51994
Merge branch 'main' of https://github.com/juice094/devbase
juice094 May 11, 2026
195f648
ci: upgrade actions/checkout v4 → v6 (Node.js 24)
juice094 May 12, 2026
3c2f2a9
Merge branch 'main' of https://github.com/juice094/devbase
juice094 May 12, 2026
fabba96
test(vault): 补齐 indexer.rs 单元测试,修复 id field 分词导致删除失效
juice094 May 12, 2026
9bc8017
Merge branch 'main' of https://github.com/juice094/devbase
juice094 May 12, 2026
2d62826
test(semantic_index): 补齐 persist.rs 单元测试
juice094 May 12, 2026
a0fd872
Merge branch 'main' of https://github.com/juice094/devbase
juice094 May 12, 2026
122fcbf
test(discovery_engine): 补齐 package_json、go_mod、similar_projects 测试
juice094 May 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 129 additions & 0 deletions src/discovery_engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -300,4 +300,133 @@ my-lib = { path = "../my-lib" }
assert!(discoveries.is_empty());
std::fs::remove_dir_all(&tmp).unwrap();
}

#[test]
fn test_discover_dependencies_package_json() {
let tmp1 =
std::env::temp_dir().join(format!("devbase_discover_npm1_{}", std::process::id()));
let tmp2 =
std::env::temp_dir().join(format!("devbase_discover_npm2_{}", std::process::id()));
std::fs::create_dir_all(&tmp1).unwrap();
std::fs::create_dir_all(&tmp2).unwrap();
std::fs::write(tmp1.join("package.json"), r#"{"dependencies": {"my-lib": "^1.0.0"}}"#)
.unwrap();

let repo1 = RepoEntry {
id: "app".to_string(),
local_path: tmp1.clone(),
tags: vec![],
discovered_at: chrono::Utc::now(),
language: Some("node".to_string()),
workspace_type: "git".to_string(),
data_tier: "private".to_string(),
last_synced_at: None,
stars: None,
remotes: vec![],
};
let repo2 = RepoEntry {
id: "my-lib".to_string(),
local_path: tmp2.clone(),
tags: vec![],
discovered_at: chrono::Utc::now(),
language: Some("node".to_string()),
workspace_type: "git".to_string(),
data_tier: "private".to_string(),
last_synced_at: None,
stars: None,
remotes: vec![],
};

let discoveries = discover_dependencies(&[repo1, repo2]);
assert!(!discoveries.is_empty());
assert_eq!(discoveries[0].from, "app");
assert_eq!(discoveries[0].to, "my-lib");
assert_eq!(discoveries[0].relation_type, "depends_on");

std::fs::remove_dir_all(&tmp1).unwrap();
std::fs::remove_dir_all(&tmp2).unwrap();
}

#[test]
fn test_discover_dependencies_go_mod() {
let tmp1 =
std::env::temp_dir().join(format!("devbase_discover_go1_{}", std::process::id()));
let tmp2 =
std::env::temp_dir().join(format!("devbase_discover_go2_{}", std::process::id()));
std::fs::create_dir_all(&tmp1).unwrap();
std::fs::create_dir_all(&tmp2).unwrap();
std::fs::write(
tmp1.join("go.mod"),
"module example.com/app\n\nrequire (\n\texample.com/my-lib v1.0.0\n)\n",
)
.unwrap();

let repo1 = RepoEntry {
id: "example.com/app".to_string(),
local_path: tmp1.clone(),
tags: vec![],
discovered_at: chrono::Utc::now(),
language: Some("go".to_string()),
workspace_type: "git".to_string(),
data_tier: "private".to_string(),
last_synced_at: None,
stars: None,
remotes: vec![],
};
let repo2 = RepoEntry {
id: "example.com/my-lib".to_string(),
local_path: tmp2.clone(),
tags: vec![],
discovered_at: chrono::Utc::now(),
language: Some("go".to_string()),
workspace_type: "git".to_string(),
data_tier: "private".to_string(),
last_synced_at: None,
stars: None,
remotes: vec![],
};

let discoveries = discover_dependencies(&[repo1, repo2]);
assert!(!discoveries.is_empty());
assert_eq!(discoveries[0].from, "example.com/app");
assert_eq!(discoveries[0].to, "example.com/my-lib");
assert_eq!(discoveries[0].relation_type, "depends_on");

std::fs::remove_dir_all(&tmp1).unwrap();
std::fs::remove_dir_all(&tmp2).unwrap();
}

#[test]
fn test_discover_similar_projects() {
let conn = crate::registry::test_helpers::WorkspaceRegistry::init_in_memory().unwrap();
conn.execute(
"INSERT INTO repo_summaries (repo_id, keywords, generated_at) VALUES (?1, ?2, datetime('now'))",
["repo-a", "rust,cli,tool"],
)
.unwrap();
conn.execute(
"INSERT INTO repo_summaries (repo_id, keywords, generated_at) VALUES (?1, ?2, datetime('now'))",
["repo-b", "rust,web,server"],
)
.unwrap();
conn.execute(
"INSERT INTO repo_summaries (repo_id, keywords, generated_at) VALUES (?1, ?2, datetime('now'))",
["repo-c", "python,ml,ai"],
)
.unwrap();

let discoveries = discover_similar_projects(&conn).unwrap();
assert!(!discoveries.is_empty());

// repo-a and repo-b share "rust"
let ab = discoveries.iter().find(|d| {
(d.from == "repo-a" && d.to == "repo-b") || (d.from == "repo-b" && d.to == "repo-a")
});
assert!(ab.is_some(), "expected repo-a/repo-b similarity");
assert_eq!(ab.unwrap().relation_type, "similar_to");

// repo-c has no overlap with others
let c_involved = discoveries.iter().any(|d| d.from == "repo-c" || d.to == "repo-c");
assert!(!c_involved, "repo-c should have no similar projects");
}
}
Loading