import { readdirSync, existsSync } from 'node:fs'; import { join } from 'node:path'; import { createRouter } from '../../create-router'; import { ITEM_TYPES, itemsDir, ensureItemDirs, type ItemType } from '../../data-path'; import { ensureToolLoader } from '../../ensure-tool-loader'; // Re-applies the boot-time item setup so changes under OFFICER_ITEMS_DIR take effect without a // server restart. Item lists are already read fresh from disk on every request; this ensures the // type dirs exist and the tool-loader extension is current, and reports the live item counts so the // UI can refetch. const CANONICAL: Record = { skills: 'SKILL.md', tools: 'TOOL.md', tasks: 'TASK.md', processes: 'PROCESS.md', extensions: 'index.ts', }; function countItems(type: ItemType): number { const dir = itemsDir(type); if (!existsSync(dir)) return 0; let count = 0; for (const entry of readdirSync(dir, { withFileTypes: true })) { if (entry.isDirectory() && existsSync(join(dir, entry.name, CANONICAL[type]))) count++; } return count; } export const rescanRouter = createRouter(); rescanRouter.post('/', async (ctx) => { ensureItemDirs(); ensureToolLoader(); const counts = Object.fromEntries(ITEM_TYPES.map((type) => [type, countItems(type)])) as Record; return ctx.json({ ok: true, counts }); });