mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 07:31:24 +00:00
fix: resolve workspace templates from package root
This commit is contained in:
69
src/agents/workspace-templates.ts
Normal file
69
src/agents/workspace-templates.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
import fs from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
import { resolveOpenClawPackageRoot } from "../infra/openclaw-root.js";
|
||||
|
||||
const FALLBACK_TEMPLATE_DIR = path.resolve(
|
||||
path.dirname(fileURLToPath(import.meta.url)),
|
||||
"../../docs/reference/templates",
|
||||
);
|
||||
|
||||
let cachedTemplateDir: string | undefined;
|
||||
let resolvingTemplateDir: Promise<string> | undefined;
|
||||
|
||||
async function pathExists(candidate: string): Promise<boolean> {
|
||||
try {
|
||||
await fs.access(candidate);
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export async function resolveWorkspaceTemplateDir(opts?: {
|
||||
cwd?: string;
|
||||
argv1?: string;
|
||||
moduleUrl?: string;
|
||||
}): Promise<string> {
|
||||
if (cachedTemplateDir) {
|
||||
return cachedTemplateDir;
|
||||
}
|
||||
if (resolvingTemplateDir) {
|
||||
return resolvingTemplateDir;
|
||||
}
|
||||
|
||||
resolvingTemplateDir = (async () => {
|
||||
const moduleUrl = opts?.moduleUrl ?? import.meta.url;
|
||||
const argv1 = opts?.argv1 ?? process.argv[1];
|
||||
const cwd = opts?.cwd ?? process.cwd();
|
||||
|
||||
const packageRoot = await resolveOpenClawPackageRoot({ moduleUrl, argv1, cwd });
|
||||
const candidates = [
|
||||
packageRoot ? path.join(packageRoot, "docs", "reference", "templates") : null,
|
||||
cwd ? path.resolve(cwd, "docs", "reference", "templates") : null,
|
||||
FALLBACK_TEMPLATE_DIR,
|
||||
].filter(Boolean) as string[];
|
||||
|
||||
for (const candidate of candidates) {
|
||||
if (await pathExists(candidate)) {
|
||||
cachedTemplateDir = candidate;
|
||||
return candidate;
|
||||
}
|
||||
}
|
||||
|
||||
cachedTemplateDir = candidates[0] ?? FALLBACK_TEMPLATE_DIR;
|
||||
return cachedTemplateDir;
|
||||
})();
|
||||
|
||||
try {
|
||||
return await resolvingTemplateDir;
|
||||
} finally {
|
||||
resolvingTemplateDir = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
export function resetWorkspaceTemplateDirCache() {
|
||||
cachedTemplateDir = undefined;
|
||||
resolvingTemplateDir = undefined;
|
||||
}
|
||||
Reference in New Issue
Block a user