{"version":3,"file":"manifest.cjs","names":["Effect","fileExists","readText","OBSOLETE_FILES","listFiles"],"sources":["../../../../src/services/scaffold/upgrade-audit/manifest.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport type { ImportRewrite, Manifest, PluginInventory, RouterSeam } from \"./domain\";\nimport { fileExists, listFiles, readText } from \"./fs\";\nimport { OBSOLETE_FILES } from \"./obsolete-files\";\n\nexport const readConfigKeys = (projectDir: string): Effect.Effect<string[], Error> =>\n  Effect.gen(function* () {\n    const exists = yield* fileExists(projectDir, \"bos.config.json\");\n    if (!exists) return [];\n    const parsed = JSON.parse(yield* readText(projectDir, \"bos.config.json\")) as object;\n    return Object.keys(parsed);\n  });\n\nconst existingOf = (projectDir: string, paths: readonly string[]) =>\n  Effect.gen(function* () {\n    const existing: string[] = [];\n    for (const path of paths) {\n      if (yield* fileExists(projectDir, path)) existing.push(path);\n    }\n    return existing;\n  });\n\ninterface RootPluginEntry {\n  readonly development?: unknown;\n  readonly extends?: unknown;\n  readonly variables?: Record<string, unknown>;\n  readonly secrets?: unknown;\n}\n\nconst localPluginName = (entry: RootPluginEntry): string | null => {\n  const development = typeof entry.development === \"string\" ? entry.development : \"\";\n  const match = development.match(/^local:plugins\\/([^/]+)$/);\n  return match?.[1] ?? null;\n};\n\nconst pluginInventory = (projectDir: string): Effect.Effect<PluginInventory[], Error> =>\n  Effect.gen(function* () {\n    const exists = yield* fileExists(projectDir, \"bos.config.json\");\n    if (!exists) return [];\n    const config = JSON.parse(yield* readText(projectDir, \"bos.config.json\")) as {\n      plugins?: Record<string, RootPluginEntry>;\n    };\n\n    const inventories: PluginInventory[] = [];\n    for (const [key, entry] of Object.entries(config.plugins ?? {})) {\n      const name = localPluginName(entry) ?? key;\n      inventories.push({\n        name,\n        hasBackend: yield* fileExists(projectDir, `plugins/${name}/src/index.ts`),\n        hasWeb: yield* fileExists(projectDir, `plugins/${name}/web`),\n        extendsParent: typeof entry.extends === \"string\",\n        variables: entry.variables ? Object.keys(entry.variables) : [],\n        secrets: Array.isArray(entry.secrets) ? entry.secrets.map(String) : [],\n      });\n    }\n    return inventories;\n  });\n\nexport const buildManifest = (\n  projectDir: string,\n  tier: \"A\" | \"B\",\n  blockerCount: number,\n  warnCount: number,\n  importRewrites: readonly ImportRewrite[],\n  configKeys: readonly string[],\n  routerSeam: RouterSeam,\n): Effect.Effect<Manifest, Error> =>\n  Effect.gen(function* () {\n    const deleteFiles = yield* existingOf(projectDir, OBSOLETE_FILES);\n    const plugins = yield* pluginInventory(projectDir);\n    const schemaFile = yield* fileExists(projectDir, \"api/src/db/schema.ts\");\n    const migrationFiles = yield* listFiles(projectDir, \"api/src/db/migrations/**/*\");\n    return {\n      tier,\n      blockerCount,\n      warnCount,\n      deleteFiles,\n      importRewrites: importRewrites.filter((rewrite) => rewrite.files.length > 0),\n      configKeys,\n      routerSeam,\n      authoredConfigTarget: \"bos.app.ts\",\n      plugins,\n      db: {\n        schemaFile: schemaFile ? \"api/src/db/schema.ts\" : null,\n        migrationsDir: migrationFiles.length > 0 ? \"api/src/db/migrations\" : null,\n      },\n    } satisfies Manifest;\n  });\n"],"mappings":";;;;;AAKA,MAAa,kBAAkB,eAC7BA,cAAO,IAAI,aAAa;CAEtB,IAAI,EAAC,OADiBC,sBAAW,YAAY,iBAAiB,IACjD,OAAO,CAAC;CACrB,MAAM,SAAS,KAAK,MAAM,OAAOC,oBAAS,YAAY,iBAAiB,CAAC;CACxE,OAAO,OAAO,KAAK,MAAM;AAC3B,CAAC;AAEH,MAAM,cAAc,YAAoB,UACtCF,cAAO,IAAI,aAAa;CACtB,MAAM,WAAqB,CAAC;CAC5B,KAAK,MAAM,QAAQ,OACjB,IAAI,OAAOC,sBAAW,YAAY,IAAI,GAAG,SAAS,KAAK,IAAI;CAE7D,OAAO;AACT,CAAC;AASH,MAAM,mBAAmB,UAA0C;CAGjE,QAFoB,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc,GACvD,CAAC,MAAM,0BACrB,CAAC,GAAG,MAAM;AACvB;AAEA,MAAM,mBAAmB,eACvBD,cAAO,IAAI,aAAa;CAEtB,IAAI,EAAC,OADiBC,sBAAW,YAAY,iBAAiB,IACjD,OAAO,CAAC;CACrB,MAAM,SAAS,KAAK,MAAM,OAAOC,oBAAS,YAAY,iBAAiB,CAAC;CAIxE,MAAM,cAAiC,CAAC;CACxC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,WAAW,CAAC,CAAC,GAAG;EAC/D,MAAM,OAAO,gBAAgB,KAAK,KAAK;EACvC,YAAY,KAAK;GACf;GACA,YAAY,OAAOD,sBAAW,YAAY,WAAW,KAAK,cAAc;GACxE,QAAQ,OAAOA,sBAAW,YAAY,WAAW,KAAK,KAAK;GAC3D,eAAe,OAAO,MAAM,YAAY;GACxC,WAAW,MAAM,YAAY,OAAO,KAAK,MAAM,SAAS,IAAI,CAAC;GAC7D,SAAS,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,QAAQ,IAAI,MAAM,IAAI,CAAC;EACvE,CAAC;CACH;CACA,OAAO;AACT,CAAC;AAEH,MAAa,iBACX,YACA,MACA,cACA,WACA,gBACA,YACA,eAEAD,cAAO,IAAI,aAAa;CACtB,MAAM,cAAc,OAAO,WAAW,YAAYG,qCAAc;CAChE,MAAM,UAAU,OAAO,gBAAgB,UAAU;CACjD,MAAM,aAAa,OAAOF,sBAAW,YAAY,sBAAsB;CACvE,MAAM,iBAAiB,OAAOG,qBAAU,YAAY,4BAA4B;CAChF,OAAO;EACL;EACA;EACA;EACA;EACA,gBAAgB,eAAe,QAAQ,YAAY,QAAQ,MAAM,SAAS,CAAC;EAC3E;EACA;EACA,sBAAsB;EACtB;EACA,IAAI;GACF,YAAY,aAAa,yBAAyB;GAClD,eAAe,eAAe,SAAS,IAAI,0BAA0B;EACvE;CACF;AACF,CAAC"}