UNPKG

@phren/cli

Version:

Knowledge layer for AI agents - CLI, MCP server, and data layer

25 lines (24 loc) • 1.38 kB
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; } }