Files
next.js/test/integration/create-next-app/templates/matrix.test.ts
Jude GaoandGitHub b9ec2e4f8d [AI] Ship bundled docs in next and generate AGENTS.md in create-next-app (#89850)
AI coding agents often rely on outdated training data when working with
Next.js projects, leading to hallucinated APIs and deprecated patterns.
This PR addresses that by shipping version-matched documentation inside
the `next` npm package and generating agent instruction files during
`create-next-app`.

During `next` build, a new `copy_docs` task copies `docs/` from the repo
root into `dist/docs/`. Since `"dist"` is already in the package's
`files` array, the docs are automatically published at
`node_modules/next/dist/docs/`.

`create-next-app` gains a new `--agents-md` / `--no-agents-md` flag
(defaults to `true`). When enabled it writes two files:

- `AGENTS.md` — instructs agents to read `node_modules/next/dist/docs/`
instead of relying on training data
- `CLAUDE.md` — uses `@AGENTS.md` import syntax for Claude Code

The option appears in the recommended defaults display and is prompted
during the customize flow. Existing tests are updated with
`--no-agents-md` to avoid the new prompt.
2026-02-11 21:50:12 +01:00

88 lines
2.4 KiB
TypeScript

import { run, tryNextDev, useTempDir } from '../utils'
describe.each(['app', 'pages'] as const)(
'CNA options matrix - %s',
(pagesOrApp) => {
let nextTgzFilename: string
beforeAll(() => {
if (!process.env.NEXT_TEST_PKG_PATHS) {
throw new Error('This test needs to be run with `node run-tests.js`.')
}
const pkgPaths = new Map<string, string>(
JSON.parse(process.env.NEXT_TEST_PKG_PATHS)
)
nextTgzFilename = pkgPaths.get('next')!
})
const isApp = pagesOrApp === 'app'
const allFlagValues = {
app: [isApp ? '--app' : '--no-app'],
ts: ['--js', '--ts'],
importAlias: [
'--import-alias=@acme/*',
'--import-alias=@/*',
'--no-import-alias',
],
// doesn't affect if the app builds or not
// eslint: ['--eslint', '--no-linter'],
eslint: ['--eslint'],
// Trading test perf for robustness:
// srcDir and reactCompiler don't interact so we're testing them together
// instead of all permutations.
srcDirAndCompiler: [
'--src-dir --react-compiler --no-agents-md',
'--no-src-dir --no-react-compiler --no-agents-md',
],
tailwind: ['--tailwind', '--no-tailwind'],
// shouldn't affect if the app builds or not
// packageManager: ['--use-npm', '--use-pnpm', '--use-yarn', '--use-bun'],
}
const getCombinations = (items: string[][]): string[][] => {
if (!items.length) return [[]]
const [first, ...rest] = items
const children = getCombinations(rest)
return first.flatMap((value) =>
children.map((child) => [...value.split(' '), ...child])
)
}
const flagCombinations = getCombinations(Object.values(allFlagValues))
const testCases = flagCombinations.map((flags) => ({
name: flags.join(' '),
flags,
}))
let id = 0
it.each(testCases)('$name', async ({ flags }) => {
await useTempDir(async (cwd) => {
const projectName = `cna-matrix-${pagesOrApp}-${id++}`
const { exitCode } = await run(
[
projectName,
...flags,
...(process.env.NEXT_RSPACK ? ['--rspack'] : []),
],
nextTgzFilename,
{
cwd,
}
)
expect(exitCode).toBe(0)
await tryNextDev({
cwd,
projectName,
isApp,
})
})
})
}
)