|
| 1 | +## Copilot instructions for this repo (AdoptOpenJDK Blog) |
| 2 | + |
| 3 | +Purpose: Help AI coding agents work productively in this Gatsby (v5) + MDX (v2) blog. |
| 4 | + |
| 5 | +Big picture |
| 6 | +- Static site built with Gatsby 5.x, content in `content/blog/**/index.md` (MDX). Images live next to posts. |
| 7 | +- Programmatic pages are created in `gatsby-node.ts` using GraphQL over MDX nodes; custom fields `fields.slug` and `fields.postPath` are added in `onCreateNode` and used across templates. |
| 8 | +- Main templates live in `src/templates/` (blog-post, blog-page, tag-page, author-page). Shared UI in `src/components/`. |
| 9 | +- Site config and plugin wiring in `gatsby-config.js`. Two filesystem sources (`content/blog`, `content/assets`). MDX is configured with remark plugins (images, prism, etc.). |
| 10 | + |
| 11 | +Key workflows |
| 12 | +- Install deps: `npm ci` (use Node 18+). |
| 13 | +- Dev server: `npm run develop` (hot-reload preview while editing content/components). |
| 14 | +- Build: `npm run build` then preview: `npm run serve` (site at http://localhost:9000). |
| 15 | +- Test script: `npm run test` runs lint then build. Lint uses ESLint 8 with `.eslintrc` (flat config is NOT used here). |
| 16 | + |
| 17 | +Project-specific conventions |
| 18 | +- Posts are MDX files at `content/blog/<slug>/index.md` with frontmatter: `title`, `date` (ISO8601), `author`, optional `featuredImage`, `description` for home excerpts. See README for examples. |
| 19 | +- Author metadata in `content/authors.json`; author images resolved to `content/assets/authors/<key>.jpg`. If missing, `gatsby-node.ts` downloads GitHub avatar at build time using global `fetch` and writes to that path. |
| 20 | +- GraphQL usage relies on custom `fields` on `Mdx` nodes (set in `gatsby-node.ts`). Templates query `fields { slug, postPath }` and `frontmatter { ... }`. When creating new templates/queries, ensure those fields exist or add similar fields in `onCreateNode`. |
| 21 | +- Pagination: `gatsby-node.ts` creates `/page/1..N`; index shows up to 10 posts, template queries use `$skip`/`$limit`. |
| 22 | +- RSS: only generated in production (`gatsby build && gatsby serve`). |
| 23 | + |
| 24 | +Important files |
| 25 | +- `gatsby-node.ts`: page creation, tag pages, author pages, MDX fields. Uses Node 18 global `fetch` and `fs.promises.writeFile(new Uint8Array(...))` when downloading author avatars. |
| 26 | +- `gatsby-config.js`: plugins & site metadata; MDX/remark configuration; Google Analytics; feed; typography. |
| 27 | +- `src/templates/*.js`: GraphQL queries + rendering logic per page type. |
| 28 | +- `src/components/*`: Layout, SEO, ArticlePreview, Byline, Tags, Comments, etc. |
| 29 | +- `content/`: blog posts and assets; authors.json. |
| 30 | + |
| 31 | +Patterns to follow |
| 32 | +- When adding GraphQL fields to `Mdx`, define them in `onCreateNode` (slug, postPath). All templates assume these fields are present. |
| 33 | +- Use `internal.contentFilePath` when creating pages for MDX (`?__contentFilePath=`) to enable MDX rendering. |
| 34 | +- For author pages, ensure each author key in `authors.json` maps to a `.jpg` in `content/assets/authors/` or the avatar fetch will run at build time. |
| 35 | +- Keep queries in templates in sync with the schema defined by the plugins and the fields created in `gatsby-node.ts`. |
| 36 | + |
| 37 | +Common pitfalls |
| 38 | +- If you see GraphQL errors like “Cannot query field 'fields' on type 'Mdx'”, check `onCreateNode` in `gatsby-node.ts` is creating those fields and that Gatsby is picking up the TS node file (it is, via `gatsby-node.ts`). Run `npm run clean` before `npm run build` after changes. |
| 39 | +- Do not upgrade React to v19 or MDX to v3 without coordinating upgrades to Gatsby v6+ and `gatsby-plugin-mdx` v6+. This repo is pinned to Gatsby 5.x with MDX v2. |
| 40 | +- ESLint 8 with `.eslintrc` is the current setup; ESLint 9 flat config caused parsing issues. Update only if necessary, and migrate carefully. |
| 41 | + |
| 42 | +Examples |
| 43 | +- Creating a new blog post: add `content/blog/hello-world/index.md` with frontmatter, optional images; run `npm run develop`, verify at `/` and `/page/2`. |
| 44 | +- Linking to posts: use `node.fields.postPath` provided by `gatsby-node.ts` when building lists (see `src/templates/blog-page.js`). |
| 45 | + |
| 46 | +Local commands (copy/paste) |
| 47 | +- Install: `npm ci` |
| 48 | +- Dev: `npm run develop` |
| 49 | +- Clean + build: `npm run clean && npm run build` |
| 50 | +- Preview build: `npm run serve` (http://localhost:9000) |
| 51 | + |
| 52 | +Maintainer notes for agents |
| 53 | +- Prefer minimal, surgical changes. Avoid upgrading major versions unless explicitly requested. |
| 54 | +- When changing GraphQL, run a clean build to regenerate `.cache/schema.gql` and catch schema issues early. |
| 55 | + |
| 56 | +Azure note |
| 57 | +- If asked to generate Azure code or commands, follow the Azure best-practices tool guidance available in your environment. |
| 58 | + |
| 59 | +Contribution flow |
| 60 | +- Create feature branches from `master` (or the working update branch if collaborating). |
| 61 | +- Validate locally before PR: |
| 62 | + - `npm ci` |
| 63 | + - `npm run test` (runs lint + build) |
| 64 | + - Optional: `npm run serve` and verify key pages (/, /page/2, a post, /tags/<tag>, /author/<key>). |
| 65 | +- Keep changes minimal; avoid dependency major bumps unless the PR is dedicated to that effort. |
| 66 | +- In PRs, call out changes to GraphQL queries/templates and any content structure updates. |
0 commit comments