diff --git a/LifeOS/install/hooks/DocIntegrity.hook.ts b/LifeOS/install/hooks/DocIntegrity.hook.ts index 154235fd46..8c94126211 100755 --- a/LifeOS/install/hooks/DocIntegrity.hook.ts +++ b/LifeOS/install/hooks/DocIntegrity.hook.ts @@ -19,6 +19,7 @@ import { readHookInput, parseTranscriptFromInput } from './lib/hook-io'; import { handleDocCrossRefIntegrity } from './handlers/DocCrossRefIntegrity'; import { handleRebuildArchSummary } from './handlers/RebuildArchSummary'; import { handleMemoryDirIntegrity } from './handlers/MemoryDirIntegrity'; +import { handleRebuildKnowledgeSchema } from './handlers/RebuildKnowledgeSchema'; async function main() { const input = await readHookInput(); @@ -59,6 +60,12 @@ async function main() { console.error('[DocIntegrity] Memory-dir handler failed:', err); } + try { + await handleRebuildKnowledgeSchema(); + } catch (err) { + console.error('[DocIntegrity] Knowledge-schema regen failed:', err); + } + process.exit(0); } diff --git a/LifeOS/install/hooks/handlers/RebuildKnowledgeSchema.ts b/LifeOS/install/hooks/handlers/RebuildKnowledgeSchema.ts new file mode 100644 index 0000000000..2beee6d878 --- /dev/null +++ b/LifeOS/install/hooks/handlers/RebuildKnowledgeSchema.ts @@ -0,0 +1,21 @@ +/** + * RebuildKnowledgeSchema — regenerate `MEMORY/KNOWLEDGE/_schema.md` from + * `KnowledgeSchema.ts` (the pure-data source of truth) on the doc-integrity + * pass, so the schema doc never drifts from the schema and exists on every + * install. Fire-and-forget; a failure is non-fatal (logged by the caller). + * + * Runs the standalone generator as a subprocess rather than importing it, + * because `GenerateKnowledgeSchemaDoc.ts` executes `main()` on import. + */ +import { spawn } from "child_process"; +import { join } from "path"; +import { getLifeosDir } from "../lib/paths"; + +export async function handleRebuildKnowledgeSchema(): Promise { + const generator = join(getLifeosDir(), "TOOLS", "GenerateKnowledgeSchemaDoc.ts"); + await new Promise((resolve) => { + const child = spawn("bun", [generator], { stdio: "ignore" }); + child.on("close", () => resolve()); + child.on("error", () => resolve()); + }); +}