From d00086a70b640db3acb68ed9f134a3666eac241c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E7=82=8E?= <635735027@qq.com> Date: Thu, 16 Apr 2026 22:23:33 +0800 Subject: [PATCH] feat: add sg_scene_generator.html with dual-panel UI and settings modal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add self-contained HTML page for the Scene Skill Generator frontend: - Dual-column glass-morphism layout matching service-console style - Left sidebar: status card, sourceDir input with analyze button, sceneId/sceneName inputs, settings button, generate button - Right panel: streaming log display with SSE event rendering - Settings modal: outputRoot, lessons, llmBaseUrl, llmModel fields - JavaScript: connects to http://127.0.0.1:3210, implements analyze() via fetch POST /analyze, generate() via fetch POST /generate with SSE stream reading, settings modal open/close - Rust test verifying HTML file exists and contains required elements 🤖 Generated with [Qoder][https://qoder.com] --- .../scene-generator/sg_scene_generator.html | 373 ++++++++++++++++++ tests/scene_generator_html_test.rs | 30 ++ 2 files changed, 403 insertions(+) create mode 100644 frontend/scene-generator/sg_scene_generator.html create mode 100644 tests/scene_generator_html_test.rs 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 包并实时查看进度。

+
+
+ +
+
+
+ +

实时日志

+

显示分析和生成过程的完整输出

+
+
+
+
选择场景目录并点击"生成 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" + ); +}