{"record":{"id":"d0815864486ab21b","repo":"BigPizzaV3/CodexPlusPlus","slug":"error-d08158","errorCode":null,"errorMessage":"主题包文件必须全部位于根目录或唯一一层主题目录","messagePattern":"主题包文件必须全部位于根目录或唯一一层主题目录","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/codex-plus-core/src/dream_skin_package.rs","lineNumber":846,"sourceCode":"    }\n    Ok(())\n}\n\nfn normalize_package_entries(\n    entries: Vec<(String, Option<Vec<u8>>)>,\n) -> anyhow::Result<std::collections::BTreeMap<String, Vec<u8>>> {\n    let content_entries = entries\n        .into_iter()\n        .filter_map(|(name, content)| content.map(|content| (name, content)))\n        .collect::<Vec<_>>();\n    if content_entries.is_empty() {\n        bail!(\"Dream Skin 主题包为空\");\n    }\n\n    let root_files = content_entries.iter().any(|(name, _)| !name.contains('/'));\n    let prefix = if root_files {\n        if content_entries.iter().any(|(name, _)| name.contains('/')) {\n            bail!(\"主题包文件必须全部位于根目录或唯一一层主题目录\");\n        }\n        None\n    } else {\n        let prefix = content_entries[0]\n            .0\n            .split_once('/')\n            .map(|(prefix, _)| prefix)\n            .context(\"主题包顶级目录无效\")?;\n        if prefix.is_empty()\n            || content_entries.iter().any(|(name, _)| {\n                name.split_once('/').is_none_or(|(candidate, file)| {\n                    candidate != prefix || file.is_empty() || file.contains('/')\n                })\n            })\n        {\n            bail!(\"主题包只能包含唯一一层主题目录\");\n        }\n        Some(format!(\"{prefix}/\"))","sourceCodeStart":828,"sourceCodeEnd":864,"githubUrl":"https://github.com/BigPizzaV3/CodexPlusPlus/blob/f2074595a281bc057525c748175c8eb9805b0673/crates/codex-plus-core/src/dream_skin_package.rs#L828-L864","documentation":"Layout guard in normalize_package_entries: the package mixes root-level files with files inside a directory. Content must be either all at the ZIP root or all inside exactly one theme directory; the mixed layout is ambiguous to normalize.","triggerScenarios":"Thrown at crates/codex-plus-core/src/dream_skin_package.rs:846 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rebuild the ZIP with all files either at the root or inside one theme folder","Move stray root files into the theme directory (or vice versa)"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f2074595a281bc057525c748175c8eb9805b0673","analyzedAt":"2026-08-23T12:52:24.489Z","contentChangedAt":"2026-08-23T12:52:24.489Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}