/* Facilitates management of entity and path registries for integrity tracking. Do not handle raw content parsing or validation. Do not manage transport or configuration orchestration. RFC-1097: step 6 — compass.migrate codemod run Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order. RFC-1097: sweep — werkstatt-engine clean Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics. */ /** * Entity and path registry management for integrity tracking. * Manages the central entity-by-id and paths-current indexes. */ import { pathExists } from "./fs.ts"; import { readJsonFile, writeJsonFile } from "./json.ts"; import { currentPathsPath, entitiesByIdPath } from "./paths.ts"; import type { EntitiesById, PathsCurrent } from "./types.ts"; export async function loadEntitiesById(cwd: string): Promise { const filePath = entitiesByIdPath(cwd); if (!(await pathExists(filePath))) return {}; return readJsonFile(filePath); } export async function saveEntitiesById(cwd: string, value: EntitiesById): Promise { await writeJsonFile(entitiesByIdPath(cwd), value); } export async function loadPathsCurrent(cwd: string): Promise { const filePath = currentPathsPath(cwd); if (!(await pathExists(filePath))) return {}; return readJsonFile(filePath); } export async function savePathsCurrent(cwd: string, value: PathsCurrent): Promise { await writeJsonFile(currentPathsPath(cwd), value); } export function bindPath( entities: EntitiesById, paths: PathsCurrent, entityId: string, repoPath: string, ): void { const previousPath = entities[entityId]?.currentPath; if (previousPath && previousPath !== repoPath) { delete paths[previousPath]; } paths[repoPath] = entityId; if (entities[entityId]) { entities[entityId].currentPath = repoPath; } } export function unbindPath(entities: EntitiesById, paths: PathsCurrent, repoPath: string): void { const entityId = paths[repoPath]; delete paths[repoPath]; if (entityId && entities[entityId]) { entities[entityId].status = "deleted"; } }