diff --git a/README.md b/README.md index e7cdff4..bd9aaf6 100644 --- a/README.md +++ b/README.md @@ -367,3 +367,6 @@ This keeps the service headless while letting `nullhub` own install/setup UI. - Add dataset, prompt version, and experiment entities. - Add regression diff endpoints for comparing prompt/model/strategy versions. - Add alert rules and anomaly summaries that `nullhub` can render. + +## Community SDKs +- **[nullwatch-python-sdk](https://github.com/nullclaw/nullwatch-python-sdk/)** — Python SDK with zero required dependencies. Ships built-in eval scorers for RAG hallucination detection ([LettuceDetect](https://github.com/KRLabsOrg/LettuceDetect)) and tool-call schema validation. diff --git a/src/compat/fs.zig b/src/compat/fs.zig index 2be980d..206e922 100644 --- a/src/compat/fs.zig +++ b/src/compat/fs.zig @@ -278,7 +278,23 @@ pub fn accessAbsolute(absolute_path: []const u8, options: Dir.AccessOptions) Io. } pub fn makeDirAbsolute(absolute_path: []const u8) Io.Dir.CreateDirError!void { - try Io.Dir.createDirAbsolute(shared.io(), absolute_path, .default_dir); + const parent_dir = path.dirname(absolute_path); + if (parent_dir) |parent| { + var dir = openDirAbsolute(parent, .{}) catch |err| switch (err) { + error.FileNotFound => { + try makeDirAbsolute(parent); + return makeDirAbsolute(absolute_path); + }, + else => { + return error.PathAlreadyExists; + }, + }; + defer dir.close(); + const base_name = path.basename(absolute_path); + try dir.makeDir(base_name); + } else { + try Io.Dir.createDirAbsolute(shared.io(), absolute_path, .default_dir); + } } pub fn deleteFileAbsolute(absolute_path: []const u8) Io.Dir.DeleteFileError!void {