@phren/cli
Version:
Knowledge layer for AI agents - CLI, MCP server, and data layer
25 lines (24 loc) • 1.38 kB
JavaScript
const record = (value) => !!value && typeof value === "object" && !Array.isArray(value);
const keys = (value, allowed) => Object.keys(value).every(key => allowed.includes(key));
export function isTaskDependency(value) {
return record(value) && keys(value, ["storeId", "project", "stableId"])
&& typeof value.storeId === "string" && /^[a-f0-9]{8}$/.test(value.storeId)
&& typeof value.stableId === "string" && /^[a-f0-9]{8}$/.test(value.stableId)
&& typeof value.project === "string" && /^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$/.test(value.project);
}
export function parseTaskMetadata(raw) {
try {
const value = JSON.parse(raw);
if (!record(value) || !keys(value, ["version", "responsibility", "dependencies", "history"]) || value.version !== 1
|| (value.responsibility !== "human" && value.responsibility !== "agent"))
return undefined;
if (!Array.isArray(value.dependencies) || value.dependencies.length > 100 || value.dependencies.some(dep => !isTaskDependency(dep)))
return undefined;
if (!Array.isArray(value.history) || value.history.some(change => !record(change) || !keys(change, ["at", "change"]) || typeof change.at !== "string" || typeof change.change !== "string"))
return undefined;
return value;
}
catch {
return undefined;
}
}