refactor: remove ws-only scene routing remnants

Keep the ws branch focused on websocket and Zhihu behavior by dropping staged scene-routing artifacts and restoring single-path skills dir semantics.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
木炎
2026-04-10 22:35:43 +08:00
parent 81de162756
commit b454fa3f54
17 changed files with 107 additions and 2251 deletions

View File

@@ -4,8 +4,8 @@ use std::sync::{Mutex, OnceLock};
use sgclaw::compat::config_adapter::{
build_zeroclaw_config, build_zeroclaw_config_from_settings,
build_zeroclaw_config_from_sgclaw_settings, resolve_scene_skills_dir_path, resolve_skills_dir,
zeroclaw_default_skills_dir, zeroclaw_workspace_dir,
build_zeroclaw_config_from_sgclaw_settings, resolve_skills_dir, zeroclaw_default_skills_dir,
zeroclaw_workspace_dir,
};
use sgclaw::config::{
BrowserBackend, DeepSeekSettings, OfficeBackend, PlannerMode, SgClawSettings, SkillsPromptMode,
@@ -47,7 +47,7 @@ fn zeroclaw_config_adapter_uses_deterministic_workspace_dir() {
api_key: "key".to_string(),
base_url: "https://proxy.example.com/v1".to_string(),
model: "deepseek-reasoner".to_string(),
skills_dir: Vec::new(),
skills_dir: None,
};
let workspace_dir = zeroclaw_workspace_dir(Path::new("/var/lib/sgclaw"));
@@ -66,7 +66,7 @@ fn zeroclaw_config_adapter_uses_deterministic_workspace_dir() {
);
assert_eq!(
resolve_skills_dir(Path::new("/var/lib/sgclaw"), &settings),
vec![zeroclaw_default_skills_dir(Path::new("/var/lib/sgclaw"))]
zeroclaw_default_skills_dir(Path::new("/var/lib/sgclaw"))
);
}
@@ -92,7 +92,7 @@ fn deepseek_settings_reload_from_browser_config_path_after_file_changes() {
assert_eq!(first.api_key, "sk-first");
assert_eq!(first.base_url, "https://api.deepseek.com");
assert_eq!(first.model, "deepseek-chat");
assert!(first.skills_dir.is_empty());
assert!(first.skills_dir.is_none());
fs::write(
&config_path,
@@ -111,23 +111,23 @@ fn deepseek_settings_reload_from_browser_config_path_after_file_changes() {
assert_eq!(second.api_key, "sk-second");
assert_eq!(second.base_url, "https://proxy.example.com/v1");
assert_eq!(second.model, "deepseek-reasoner");
assert_eq!(second.skills_dir, vec![root.join("skill_lib")]);
assert_eq!(second.skills_dir, Some(root.join("skill_lib")));
}
#[test]
fn resolve_skills_dir_prefers_nested_skills_subdirectory_for_configured_repo_root() {
fn ws_cleanup_resolves_single_configured_skills_dir() {
let root = std::env::temp_dir().join(format!("sgclaw-skills-{}", Uuid::new_v4()));
fs::create_dir_all(root.join("skill_lib/skills")).unwrap();
let settings = DeepSeekSettings {
api_key: "key".to_string(),
base_url: "https://api.deepseek.com".to_string(),
model: "deepseek-chat".to_string(),
skills_dir: vec![root.join("skill_lib")],
skills_dir: Some(root.join("skill_lib")),
};
let resolved = resolve_skills_dir(&root, &settings);
assert_eq!(resolved, vec![root.join("skill_lib/skills")]);
assert_eq!(resolved, root.join("skill_lib/skills"));
}
#[test]
@@ -139,41 +139,12 @@ fn resolve_skills_dir_preserves_absolute_configured_skills_directory() {
api_key: "key".to_string(),
base_url: "https://api.deepseek.com".to_string(),
model: "deepseek-chat".to_string(),
skills_dir: vec![external_skills.clone()],
skills_dir: Some(external_skills.clone()),
};
let resolved = resolve_skills_dir(&root, &settings);
assert_eq!(resolved, vec![external_skills]);
}
#[test]
fn resolve_skills_dir_uses_skills_child_for_external_staged_root() {
let root = std::env::temp_dir().join(format!("sgclaw-skills-{}", Uuid::new_v4()));
let staged_root = root.join("external/skill_staging");
fs::create_dir_all(staged_root.join("skills")).unwrap();
fs::create_dir_all(staged_root.join("scenes")).unwrap();
let settings = DeepSeekSettings {
api_key: "key".to_string(),
base_url: "https://api.deepseek.com".to_string(),
model: "deepseek-chat".to_string(),
skills_dir: vec![staged_root.clone()],
};
let resolved = resolve_skills_dir(&root, &settings);
assert_eq!(resolved, vec![staged_root.join("skills")]);
}
#[test]
fn resolve_scene_skills_dir_path_prefers_staged_skills_child_under_project_root() {
let root = std::env::temp_dir().join(format!("sgclaw-scene-skills-{}", Uuid::new_v4()));
let top_level_skills = root.join("project/skills");
fs::create_dir_all(top_level_skills.join("skill_staging/skills")).unwrap();
let resolved = resolve_scene_skills_dir_path(top_level_skills.clone());
assert_eq!(resolved, top_level_skills.join("skill_staging/skills"));
assert_eq!(resolved, external_skills);
}
#[test]
@@ -182,7 +153,7 @@ fn sgclaw_settings_default_to_compact_skills_and_browser_attached_profile() {
"sk-test".to_string(),
"https://api.deepseek.com".to_string(),
"deepseek-chat".to_string(),
Vec::new(),
None,
)
.unwrap();
@@ -216,10 +187,29 @@ fn sgclaw_settings_load_new_runtime_fields_from_browser_config() {
assert_eq!(settings.runtime_profile, RuntimeProfile::GeneralAssistant);
assert_eq!(settings.skills_prompt_mode, SkillsPromptMode::Full);
assert_eq!(settings.skills_dir, vec![root.join("skill_lib")]);
assert_eq!(settings.skills_dir, Some(root.join("skill_lib")));
assert_eq!(config.skills.prompt_injection_mode, SkillsPromptMode::Full);
}
#[test]
fn ws_cleanup_rejects_array_style_skills_dir_config() {
let root = std::env::temp_dir().join(format!("sgclaw-config-{}", uuid::Uuid::new_v4()));
std::fs::create_dir_all(&root).unwrap();
let config_path = root.join("sgclaw_config.json");
std::fs::write(
&config_path,
r#"{
"apiKey": "sk-test",
"baseUrl": "https://api.deepseek.com",
"model": "deepseek-chat",
"skillsDir": ["skill_lib", "skill_staging"]
}"#,
)
.unwrap();
assert!(sgclaw::config::SgClawSettings::load(Some(config_path.as_path())).is_err());
}
#[test]
fn sgclaw_settings_load_browser_ws_url_from_browser_config() {
let root = std::env::temp_dir().join(format!("sgclaw-browser-ws-config-{}", Uuid::new_v4()));
@@ -280,7 +270,7 @@ fn browser_attached_config_uses_low_temperature_for_deterministic_execution() {
"sk-test".to_string(),
"https://api.deepseek.com".to_string(),
"deepseek-chat".to_string(),
Vec::new(),
None,
)
.unwrap();