diff --git a/frontend/scene-generator/sg_scene_generator.html b/frontend/scene-generator/sg_scene_generator.html
new file mode 100644
index 0000000..51025c4
--- /dev/null
+++ b/frontend/scene-generator/sg_scene_generator.html
@@ -0,0 +1,373 @@
+
+
+
+
+
+ 场景 Skill 生成器
+
+
+
+
+
+
场景 Skill 生成器
+
输入场景目录路径,自动提取 scene-id 和 scene-name,一键生成 skill 包并实时查看进度。
+
+
+
+
+
+
+
Generation Log
+
实时日志
+
显示分析和生成过程的完整输出
+
+
+
+
选择场景目录并点击"生成 Skill"开始。
+
+
+
+
+
+
+
+
生成器设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/scene_generator_html_test.rs b/tests/scene_generator_html_test.rs
new file mode 100644
index 0000000..23e3223
--- /dev/null
+++ b/tests/scene_generator_html_test.rs
@@ -0,0 +1,30 @@
+use std::fs;
+use std::path::PathBuf;
+
+#[test]
+fn scene_generator_html_exists_and_has_required_elements() {
+ let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
+ let html_path = manifest_dir
+ .join("frontend")
+ .join("scene-generator")
+ .join("sg_scene_generator.html");
+
+ let source = fs::read_to_string(&html_path)
+ .unwrap_or_else(|err| panic!("HTML file not found at {:?}: {}", html_path, err));
+
+ assert!(source.contains("场景 Skill 生成器"), "missing title");
+ assert!(source.contains("sourceDir"), "missing sourceDir input");
+ assert!(source.contains("sceneId"), "missing sceneId input");
+ assert!(source.contains("sceneName"), "missing sceneName input");
+ assert!(source.contains("/analyze"), "missing /analyze endpoint");
+ assert!(source.contains("/generate"), "missing /generate endpoint");
+ assert!(
+ source.contains("fetch("),
+ "missing fetch for API calls"
+ );
+
+ assert!(
+ source.contains("127.0.0.1") || source.contains("localhost"),
+ "should reference localhost server"
+ );
+}