| 1 | import * as Fs from "node:fs" |
| 2 | import * as Glob from "glob" |
| 3 | import * as Path from "node:path" |
| 4 | |
| 5 | const source = "LLMS.md" |
| 6 | const aiDocsSource = "ai-docs" |
| 7 | const packageFiles = ["AGENTS.md", "CLAUDE.md", "ai-docs/**/*"] |
| 8 | |
| 9 | const includeAiDocs = (source) => { |
| 10 | const [root] = Path.relative(aiDocsSource, source).split(Path.sep) |
| 11 | return root !== "dist" && root !== "node_modules" |
| 12 | } |
| 13 | |
| 14 | for (const packageJsonPath of Glob.globSync("packages/{*,*/*}/package.json")) { |
| 15 | const packageJson = JSON.parse(Fs.readFileSync(packageJsonPath, "utf8")) |
| 16 | if (packageJson.private) { |
| 17 | continue |
| 18 | } |
| 19 | |
| 20 | const packageDirectory = Path.dirname(packageJsonPath) |
| 21 | for (const file of packageFiles) { |
| 22 | if (!packageJson.files?.includes(file)) { |
| 23 | throw new Error(`${packageJsonPath} must include ${file} in its files list`) |
| 24 | } |
| 25 | } |
| 26 | |
| 27 | Fs.copyFileSync(source, Path.join(packageDirectory, "AGENTS.md")) |
| 28 | Fs.copyFileSync(source, Path.join(packageDirectory, "CLAUDE.md")) |
| 29 | |
| 30 | const aiDocsTarget = Path.join(packageDirectory, aiDocsSource) |
| 31 | Fs.rmSync(aiDocsTarget, { recursive: true, force: true }) |
| 32 | Fs.cpSync(aiDocsSource, aiDocsTarget, { recursive: true, filter: includeAiDocs }) |
| 33 | } |