Skip to content
This repository was archived by the owner on Mar 12, 2026. It is now read-only.

Merge doc sources#17

Open
hawkeyexl wants to merge 7 commits intomainfrom
merge
Open

Merge doc sources#17
hawkeyexl wants to merge 7 commits intomainfrom
merge

Conversation

@hawkeyexl
Copy link
Contributor

@hawkeyexl hawkeyexl commented Mar 4, 2026

Add initial documentation structure and examples for various configurations and actions. This includes updates to JSON schemas and example usages to enhance clarity and usability.

Summary by CodeRabbit

  • Documentation

    • Added CLI reference, expanded installation, CI/CD, troubleshooting, and get-started content.
    • New Programmatic API reference with overview and detailed API pages and examples.
    • New comprehensive configuration guide (formats, contexts, platforms, examples).
    • Expanded test guides, best practices, media capture instructions, and numerous schema docs with added fields and richer examples.
  • Chores

    • Added tooling and an npm script to auto-generate reference pages from schemas and API signatures; updated dev tooling.

Copilot AI review requested due to automatic review settings March 4, 2026 23:19
@coderabbitai
Copy link

coderabbitai bot commented Mar 4, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Consolidates configuration and contexts into a single page, adds a CLI reference and extensive programmatic API MDX pages, expands and relaxes many schema docs and examples, introduces a TypeScript reference generator script, and updates internal doc links and examples.

Changes

Cohort / File(s) Summary
Navigation & Config
fern/docs.yml, fern/pages/docs/config/configuration.mdx, fern/pages/docs/config/contexts.md
Replaced separate contexts doc by consolidating into configuration.mdx; updated navigation entries in fern/docs.yml; removed contexts.md.
Internal link fixes
fern/pages/contribute/templates/troubleshooting.mdx, fern/pages/contribute/templates/tutorial.mdx, fern/pages/docs/tests/overview.mdx, fern/pages/reference/glossary.mdx
Repointed links from /docs/configuration/contexts to /docs/configuration#contexts.
Get Started & CI/CLI
fern/pages/docs/get-started/cli-reference.mdx, fern/pages/docs/get-started/installation.mdx, fern/pages/docs/get-started/ci.mdx
Added a CLI reference page, expanded installation (project layout, troubleshooting), and added broad CI/CD platform guidance.
Programmatic API pages
Programmatic API
fern/pages/reference/api/overview.mdx, .../run-tests.mdx, .../detect-tests.mdx, .../detect-and-resolve-tests.mdx, .../resolve-tests.mdx, .../get-runner.mdx, .../read-file.mdx, .../resolve-paths.mdx
Introduced multiple Node.js programmatic API MDX pages with signatures, examples, and behavior notes.
Tests docs
fern/pages/docs/tests/inline.mdx, fern/pages/docs/tests/overview.mdx
Expanded inline testing guidance, media recording examples, common patterns, best practices, and troubleshooting.
Schema-wide updates
fern/pages/reference/schemas/*
Normalized openApi references, added/relaxed fields (e.g., environment, heretto, sourceIntegration, required, domain, timeout, waitUntil), loosened regex anchors, and reordered "Referenced In" lists across many schema docs.
Element selector enhancements
fern/pages/reference/schemas/*-element-*.md, fern/pages/reference/schemas/type-keys-detailed.md
Added element predicate fields (elementId, elementTestId, elementClass, elementAttribute, elementAria), updated matching semantics and examples.
Examples expansion
fern/pages/reference/schemas/{httprequest,goto,find,click,draganddrop,loadcookie,savecookie,screenshot,runshell,runcode,...}.md
Replaced placeholder examples with comprehensive, real-world examples across numerous schema documents.
Formatting & ordering tweaks
multiple fern/pages/reference/schemas/*.md
Minor formatting changes and reordering of "Referenced In" lists.
Doc generation infra
scripts/generate-references.ts, package.json
Added a large TypeScript script to generate schema and API reference pages (parsing schemas.json and TS sources) and an npm generate script; added TypeScript/tsx dev dependencies.

Sequence Diagram(s)

sequenceDiagram
  participant Gen as Reference Generator (scripts/generate-references.ts)
  participant Schemas as schemas.json
  participant TS as TypeScript sources
  participant FS as Filesystem

  Gen->>Schemas: read schema components
  Gen->>Gen: build PageDefs & cross-reference map
  Gen->>TS: parse TS sources for exported API signatures
  Gen->>Gen: merge parsed API signatures with PageDefs
  Gen->>FS: write schema MD/MDX pages under fern/pages/reference/schemas
  Gen->>FS: write API MDX pages under fern/pages/reference/api (preserve custom blocks)
  FS-->>Gen: confirm writes
  Note over Gen,FS: Generation complete (schema + API pages)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐇 I hopped through schemas, links, and script,

Folded contexts, gave examples a lift,
CLI and APIs lined up neat in rows,
A generator sowed where reference grows,
Tiny hops turned docs into a gift.

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 54.55% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title "Merge doc sources" is vague and generic, using non-descriptive language that doesn't convey the substantial documentation expansion and tooling additions in this changeset. Consider using a more specific title such as "Add comprehensive documentation and schema reference pages" or "Add programmatic API docs and configuration reference" to better reflect the primary changes.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch merge

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR merges documentation sources, adding initial documentation structure and content for the Doc Detective documentation site. It introduces a code generation script that reads JSON schemas and TypeScript source files from the doc-detective repository to auto-generate reference documentation pages.

Changes:

  • Adds scripts/generate-references.ts: a script that generates schema reference pages (.md) and programmatic API pages (.mdx) from JSON schemas and TypeScript source files
  • Adds new documentation pages: programmatic API reference (overview.mdx, run-tests.mdx, detect-tests.mdx, etc.), a consolidated configuration page (configuration.mdx), a CLI reference page, and extensive examples across many existing schema pages
  • Removes the old standalone contexts.md page and replaces it with a #contexts anchor in the new configuration.mdx; updates cross-links throughout the docs

Reviewed changes

Copilot reviewed 68 out of 69 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
scripts/generate-references.ts New code generator script for schema and API reference pages
package.json / package-lock.json Adds typescript and tsx as devDependencies for the generator script
fern/docs.yml Adds API reference pages and replaces contexts.md with configuration.mdx in navigation
fern/pages/docs/config/configuration.mdx New consolidated configuration page (replaces contexts.md)
fern/pages/docs/config/contexts.md File deleted; content merged into configuration.mdx
fern/pages/docs/get-started/cli-reference.mdx New CLI reference page
fern/pages/docs/get-started/installation.mdx Adds troubleshooting and project structure sections
fern/pages/docs/tests/overview.mdx Adds common test patterns and best practices sections
fern/pages/docs/tests/inline.mdx Adds sections on combining tests, media recording, and troubleshooting
fern/pages/reference/api/*.mdx New programmatic API reference pages for all exported functions
fern/pages/reference/schemas/*.md Updated schema pages with examples, new fields, and cross-reference fixes
fern/pages/reference/glossary.mdx / template files URL updates: /docs/configuration/contexts/docs/configuration#contexts

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@@ -1,12 +1,13 @@
---
title: "type"
title: "typeKeys"
Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The frontmatter title was changed from "type" to "typeKeys", but the action wrapper field is named type in the JSON schema (the step object uses { "type": ... }). The page title should match the actual field name to avoid confusion. The cross-reference in type-keys-detailed.md line 8 already updated to [typeKeys] which is now inconsistent with how users write the step in their tests. The field is type, not typeKeys.

Copilot uses AI. Check for mistakes.
Comment on lines +300 to +333
### API CRUD operations

```json
{
"tests": [
{
"description": "Test API endpoints",
"steps": [
{
"httpRequest": {
"url": "https://api.example.com/items",
"method": "POST",
"request": {
"headers": { "Content-Type": "application/json" },
"body": { "name": "Test item" }
},
"response": {
"statusCode": 201
}
}
},
{
"httpRequest": {
"url": "https://api.example.com/items",
"method": "GET",
"response": {
"statusCode": 200
}
}
}
]
}
]
}
Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The "API CRUD operations" example uses "statusCode": 201 and "statusCode": 200 (singular) as properties inside the response object. However, per the response.md schema, the response object accepts headers, body, and required fields - there is no statusCode property. The correct way to check status codes in httpRequest is to use the top-level statusCodes array (e.g., "statusCodes": [201]), not a response.statusCode property. This example would silently not validate the status code as intended.

Copilot uses AI. Check for mistakes.
Comment on lines +336 to +366
### Working with variables

Load environment variables and use them across steps:

```json
{
"tests": [
{
"description": "Test with variables",
"steps": [
{ "loadVariables": ".env" },
{ "goTo": "$SITE_URL" },
{
"httpRequest": {
"url": "$API_URL/status",
"method": "GET",
"request": {
"headers": {
"Authorization": "Bearer $API_TOKEN"
}
},
"response": {
"statusCode": 200
}
}
}
]
}
]
}
```
Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The "Working with variables" example also uses "statusCode": 200 (singular) in response, which is incorrect for the same reason as above. The correct field is the top-level statusCodes array.

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +17

```javascript
async resolveTests(config, detectedTests) → any
```

## Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `config` | any | Yes | |
| `detectedTests` | any[] | Yes | |
Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The resolveTests() signature shows async resolveTests(config, detectedTests) → any with two positional parameters, but all code examples in the same file call it as await resolveTests({ config, detectedTests }) - a single object argument. This inconsistency between the signature block and examples will confuse developers trying to use the API.

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +20

```javascript
async resolvePaths(config, object, filePath, nested?, objectType?) → any
```

## Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `config` | any | Yes | |
| `object` | any | Yes | |
| `filePath` | string | Yes | |
| `nested` | boolean | No | |
| `objectType` | string | No | |
Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The resolvePaths() signature shows async resolvePaths(config, object, filePath, nested?, objectType?) → any with positional parameters, but all code examples call it with a single object argument: await resolvePaths({ config, object, filePath, objectType }). This is the same mismatch as in detect-tests.mdx and resolve-tests.mdx. The root cause is in scripts/generate-references.ts line 1227-1229: the signature line is built from the (potentially destructured) params array, so if the actual source function uses a single destructured object parameter, the generated signature incorrectly spreads those as positional parameters.

Copilot uses AI. Check for mistakes.
Comment on lines +1354 to +1362
// Walk nested properties for titles
for (const pd of buildPageDefs()) {
if (pd.schema.properties) {
for (const prop of Object.values(pd.schema.properties)) {
registerNestedTitles(prop);
}
}
}
}
Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The registerExtraComponentTitles() function calls buildPageDefs() a second time (line 1355), which fully rebuilds all page definitions including calling get() and comp() helper functions that throw on missing schemas. This means the schema file is parsed and all page definitions are built twice for every run of the script, which is wasteful. More importantly, errors thrown by get() or comp() would be surfaced a second time during what is ostensibly a registration step. The pageDefs result from main() (line 1279) should be passed to registerExtraComponentTitles instead of calling buildPageDefs() again.

Copilot uses AI. Check for mistakes.
regex | one of:<br/>- string<br/>- array of string | Optional. Regular expressions to match the markup type. |
batchMatches | boolean | Optional. If `true`, all matches are combined into a single string. | `false`
actions | one of:<br/>- string<br/>- array of one of: string, object(step) | Optional. Actions to perform when the markup type is detected. |
actions | one of:<br/>- string<br/>- array of one of:<br/>- string<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common))<br/>- object([Common](/reference/schemas/common)) | Optional. Actions to perform when the markup type is detected. |
Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The actions field in markup-definition.md renders 16 duplicate object([Common](/reference/schemas/common)) entries in the type column. This is a bug in the generator's renderType function - when the step variants all resolve to the same "Common" title (each action step shares the same common component), they are each individually rendered rather than being deduplicated or mapped to their specific action types. The rendered documentation is misleading and unhelpful to readers who need to understand what concrete action objects are valid.

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +16

```javascript
async detectTests(config) → any
```

## Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `config` | any | Yes | |
Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The detectTests() signature in the generated page shows async detectTests(config) → any with a positional parameter, but all code examples in the same file (and in other API pages) call it as await detectTests({ config }) using an object argument. The signature and parameter table are inconsistent with the usage examples. The same issue applies to resolveTests() in resolve-tests.mdx, where the signature shows two positional parameters (config, detectedTests) but examples call it as await resolveTests({ config, detectedTests }). The generator's extractFunctionSig inlines destructured params but the signature line doesn't reflect that the function takes a single object argument.

Copilot uses AI. Check for mistakes.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 15

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

🟡 Minor comments (19)
fern/pages/reference/schemas/runcode.md-58-64 (1)

58-64: ⚠️ Potential issue | 🟡 Minor

stdio does not match the shown Python output.

At Line 58, the code prints Hello from Python (no exclamation), but Line 63 documents Hello from Python!. The example should be internally consistent.

Proposed doc fix
-    "code": "print('Hello from Python')",
+    "code": "print('Hello from Python!')",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/runcode.md` around lines 58 - 64, The example is
inconsistent: the "code" field prints "Hello from Python" while the "stdio"
field shows "Hello from Python!"; update one so they match—either change the
"code" value in the runcode example to "print('Hello from Python!')" or change
the "stdio" value to "Hello from Python" (no exclamation); ensure you update the
matching fields "code" and "stdio" (and keep "path", "workingDirectory",
"exitCodes" unchanged) so the example is internally consistent.
fern/pages/reference/schemas/context.md-20-20 (1)

20-20: ⚠️ Potential issue | 🟡 Minor

browsers table row likely needs formatting to satisfy markdownlint and readability.

The changed row is flagged for pipe style/column count (MD055, MD056). Consider formatting the type cell so the table parser consistently sees 4 columns and add an explicit default value marker.

Proposed formatting adjustment
-browsers | one of:<br/>- string<br/>- object([Browser](/reference/schemas/browser))<br/>- array of one of:<br/>- string<br/>- object([Browser](/reference/schemas/browser)) | Optional. Browsers to run tests on. | 
+browsers | one of:<br/>- string<br/>- object([Browser](/reference/schemas/browser))<br/>- array of one of:<br/>&nbsp;&nbsp;- string<br/>&nbsp;&nbsp;- object([Browser](/reference/schemas/browser)) | Optional. Browsers to run tests on. | ``
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/context.md` at line 20, The table row for the
"browsers" field is producing MD055/MD056 errors because the "Type" cell
contains unescaped pipes/newlines that make the parser think the row has the
wrong number of columns; update the "browsers" row so it has exactly four
pipe-separated columns by normalizing the Type cell (e.g., combine options into
one cell using inline code spans and commas or HTML <br/> for line breaks, and
escape any literal "|" if needed) and add an explicit default marker (e.g.,
"Optional" or "—") in the Default column; locate the row referencing "browsers"
in context.md and modify that single table row to ensure consistent column count
and explicit default value.
fern/pages/reference/schemas/click-element-detailed.md-15-21 (1)

15-21: ⚠️ Potential issue | 🟡 Minor

Table rows appear to violate markdownlint and may render inconsistently.

The changed field rows are flagged for table pipe style/column count (MD055, MD056). Also, “element finding fields” should be “element-finding fields” on Lines 15-16.

Proposed cleanup
-elementText | string | Optional. Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria. | 
-selector | string | Optional. Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria. | 
+elementText | string | Optional. Display text of the element to click. If combined with other element-finding fields, the element must match all specified criteria. | ``
+selector | string | Optional. Selector of the element to click. If combined with other element-finding fields, the element must match all specified criteria. | ``
-elementId | string | Optional. ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax. | 
+elementId | string | Optional. ID attribute of the element to click. Supports exact match or regex pattern using `/pattern/` syntax. | ``
-elementTestId | string | Optional. data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax. | 
+elementTestId | string | Optional. `data-testid` attribute of the element to click. Supports exact match or regex pattern using `/pattern/` syntax. | ``
-elementClass | one of:<br/>- string<br/>- array of string | Optional. Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes. | 
+elementClass | one of:<br/>- string<br/>- array of string | Optional. Class or array of classes that the element must have. Each class supports exact match or regex pattern using `/pattern/` syntax. The element must have all specified classes. | ``
-elementAttribute | object | Optional. Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence. | 
+elementAttribute | object | Optional. Object of attribute key-value pairs that the element must have. Values can be strings (supporting `/pattern/` regex), numbers, or booleans. Boolean `true` matches attribute presence, and `false` matches absence. | ``
-elementAria | string | Optional. Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax. | 
+elementAria | string | Optional. Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using `/pattern/` syntax. | ``
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/click-element-detailed.md` around lines 15 - 21,
The table rows for the schema fields (elementText, selector, elementId,
elementTestId, elementClass, elementAttribute, elementAria) violate markdown
table pipe/column rules and use inconsistent HTML line breaks; update the table
to a proper Markdown pipe table with the same number of columns on each row and
remove or replace <br/> with acceptable Markdown (e.g., inline "one of: string |
array of string" or a short parenthetical) so MD055/MD056 are satisfied, and fix
the wording by replacing "element finding fields" with the hyphenated
"element-finding fields" in the elementText and selector descriptions.
fern/pages/reference/schemas/go-to-url-detailed.md-17-18 (1)

17-18: ⚠️ Potential issue | 🟡 Minor

Normalize table rows to avoid markdownlint column-count failures.

The modified rows are triggering MD055/MD056 warnings. Give the Default cell an explicit value (for example, None) and keep row delimiters consistent.

🧹 Proposed fix
 timeout | integer | Optional. Maximum time in milliseconds to wait for the page to be ready. If exceeded, the goTo action fails.<br/><br/>Minimum: 0 | `30000`
-waitUntil | object | Optional. Configuration for waiting conditions after navigation. | 
+waitUntil | object | Optional. Configuration for waiting conditions after navigation. | None
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/go-to-url-detailed.md` around lines 17 - 18, The
table rows for the "timeout" and "waitUntil" schema entries are missing explicit
Default cell values and have inconsistent row delimiters causing markdownlint
MD055/MD056; update the "timeout" row to keep the three-column pipe format and
keep its Default as `30000`, and add an explicit Default value (e.g., `None`)
for the "waitUntil" row while preserving the same pipe-delimited column
structure so both "timeout" and "waitUntil" rows are normalized and consistent.
fern/pages/docs/tests/overview.mdx-8-8 (1)

8-8: ⚠️ Potential issue | 🟡 Minor

Fix grammar in the test specification definition.

Line 8 should read “are a collection,” not “are collection.”

✏️ Proposed fix
-- **Test specification**: The highest-level component, test specifications (or specs) are collection of tests that should run together.
+- **Test specification**: The highest-level component, test specifications (or specs) are a collection of tests that should run together.

As per coding guidelines, documentation must follow the Google Developer Style Guide, including clear and correct grammar.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/docs/tests/overview.mdx` at line 8, Fix the grammar in the "**Test
specification**" definition: change the phrase "are collection of tests" to "are
a collection of tests" so the sentence reads "test specifications (or specs) are
a collection of tests that should run together." Locate the paragraph containing
the "**Test specification**" heading and update that sentence accordingly.
fern/pages/docs/tests/inline.mdx-239-239 (1)

239-239: ⚠️ Potential issue | 🟡 Minor

Change stopRecord from empty string to boolean true.

The stopRecord step should use a boolean value, not an empty string. According to the schema, stopRecord takes a boolean value—specifically stopRecord: true to finalize and save the recording. Update line 239 from {"stopRecord": ""} to {"stopRecord": true}.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/docs/tests/inline.mdx` at line 239, The step comment uses an empty
string for stopRecord; change the step marker's JSON so stopRecord is a boolean
true (i.e., replace {"stopRecord": ""} with {"stopRecord": true}) in the step
comment (the {/* step ... */} block) so the recording finalizes per the schema.
fern/pages/reference/schemas/record.md-31-38 (1)

31-38: ⚠️ Potential issue | 🟡 Minor

Likely incorrect type for overwrite value.

Line 36 uses "overwrite": "true" (a string) instead of "overwrite": true (a boolean). This appears to be a typo in the example since boolean values don't typically need quotes in JSON.

Proposed fix
   "record": {
     "path": "results.mp4",
     "directory": "static/media",
-    "overwrite": "true"
+    "overwrite": true
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/record.md` around lines 31 - 38, The JSON
example uses a string for the overwrite field ("overwrite": "true") which is
incorrect; update the example so the overwrite property under the record object
is a boolean (overwrite: true) rather than a quoted string, ensuring the JSON
example reflects a boolean value for overwrite.
fern/pages/reference/schemas/http-request-detailed.md-14-14 (1)

14-14: ⚠️ Potential issue | 🟡 Minor

Line 14 table row needs a proper Default cell value.

The updated openApi row is functionally fine, but markdownlint flags formatting (MD055/MD056).

Suggested patch
-openApi | one of:<br/>- string<br/>- object([openApi](/reference/schemas/openapi)) | Optional. No description provided. | 
+openApi | one of:<br/>- string<br/>- object([openApi](/reference/schemas/openapi)) | Optional. No description provided. | `N/A`
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/http-request-detailed.md` at line 14, The table
row for the openApi field is missing an explicit Default cell which triggers
markdownlint MD055/MD056; update the table row for openApi in
http-request-detailed.md to include a proper Default column value (for example
"-" or "None"/"null") so every table cell is present and the row reads: name |
type | description | Default, ensuring the openApi entry has that Default filled
in.
fern/pages/reference/schemas/resolved-context.md-15-15 (1)

15-15: ⚠️ Potential issue | 🟡 Minor

Line 15 table row needs explicit default value for markdownlint compliance.

The updated openApi row currently triggers MD055/MD056. Populate the Default cell explicitly.

Suggested patch
-openApi | array of object([openApi](/reference/schemas/openapi)) | Optional. No description provided. | 
+openApi | array of object([openApi](/reference/schemas/openapi)) | Optional. No description provided. | `N/A`
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/resolved-context.md` at line 15, The table row
for the schema property named "openApi" currently leaves the Default column
blank; update the row in resolved-context.md so the Default cell contains an
explicit value (e.g., "None" or "N/A") to satisfy markdownlint rules
(MD055/MD056)—find the row with the "openApi | array of
object([openApi](/reference/schemas/openapi))" entry and populate its Default
column with the chosen explicit default.
fern/pages/reference/schemas/specification.md-15-15 (1)

15-15: ⚠️ Potential issue | 🟡 Minor

Line 15 should include an explicit Default cell.

Current row formatting triggers markdownlint (MD055/MD056).

Suggested patch
-openApi | array of object([openApi](/reference/schemas/openapi)) | Optional. No description provided. | 
+openApi | array of object([openApi](/reference/schemas/openapi)) | Optional. No description provided. | `N/A`
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/specification.md` at line 15, The table row for
the "openApi" schema entry is missing an explicit Default cell which breaks
markdown table column alignment; update the row for the openApi entry (the line
containing "openApi | array of object([openApi](/reference/schemas/openapi)) |
Optional. No description provided.") to include a fourth column value (e.g.,
"—", "None", or "N/A") as the Default cell so the table has four columns and
satisfies markdownlint MD055/MD056.
fern/pages/reference/schemas/test.md-20-20 (1)

20-20: ⚠️ Potential issue | 🟡 Minor

Line 20 has a markdown table formatting issue (MD055/MD056).

Please make the Default column explicit to prevent lint failures.

Suggested patch
-openApi | array of object([openApi](/reference/schemas/openapi)) | Optional. No description provided. | 
+openApi | array of object([openApi](/reference/schemas/openapi)) | Optional. No description provided. | `N/A`
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/test.md` at line 20, The markdown table row for
the "openApi" schema entry currently leaves the Default column empty causing
MD055/MD056 lint failures; update the row for the "openApi" entry (the line
containing "openApi | array of object([openApi](/reference/schemas/openapi)) |
Optional. No description provided. |") to include an explicit Default value
(e.g., "-" or "None" or "null") in the final column so the table has an explicit
Default column value.
fern/pages/reference/schemas/type.md-16-22 (1)

16-22: ⚠️ Potential issue | 🟡 Minor

Fix table row formatting to stop markdownlint failures.

Line 16 is currently parsed as an incomplete row, which cascades into warnings on Lines 19-22. Use an explicit Default value and consistent pipe style.

Suggested patch
-type | one of:<br/>- one of:<br/>- string<br/>- array of string<br/>- object([Type keys (detailed)](/reference/schemas/type-keys-detailed)) | Required. Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`. | 
+type | one of:<br/>- one of:<br/>- string<br/>- array of string<br/>- object([Type keys (detailed)](/reference/schemas/type-keys-detailed)) | Required. Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`. | `N/A`
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/type.md` around lines 16 - 22, The table row for
the "type" field is malformed causing markdownlint failures; update the table
row for the "type" entry (the row starting with "type | one of:...") to use
consistent pipe-delimited columns and include an explicit Default value (e.g.,
"Default: none" or appropriate default) so the row has the expected number of
columns and trailing pipes; ensure subsequent rows/examples follow the same pipe
style so the table closes correctly and markdown parsing warnings on the
following lines disappear.
fern/pages/reference/schemas/type-keys-detailed.md-17-22 (1)

17-22: ⚠️ Potential issue | 🟡 Minor

New field rows should use explicit Default cells for valid table parsing.

Lines 17-22 trigger MD055/MD056; adding explicit defaults resolves the table-column ambiguity and keeps lint clean.

Suggested patch
-elementText | string | Optional. Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria. | 
-elementId | string | Optional. ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax. | 
-elementTestId | string | Optional. data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax. | 
-elementClass | one of:<br/>- string<br/>- array of string | Optional. Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes. | 
-elementAttribute | object | Optional. Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence. | 
-elementAria | string | Optional. Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax. | 
+elementText | string | Optional. Display text of the element to type into. If combined with other element-finding fields, the element must match all specified criteria. | `N/A`
+elementId | string | Optional. ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax. | `N/A`
+elementTestId | string | Optional. data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax. | `N/A`
+elementClass | one of:<br/>- string<br/>- array of string | Optional. Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes. | `N/A`
+elementAttribute | object | Optional. Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence. | `N/A`
+elementAria | string | Optional. Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax. | `N/A`
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/type-keys-detailed.md` around lines 17 - 22, The
new schema table rows (elementText, elementId, elementTestId, elementClass,
elementAttribute, elementAria) are missing explicit Default cells causing
MD055/MD056; update each of these rows to include an explicit Default column
entry (e.g., a clear placeholder like "-" or "None" or an explicit description
such as "optional") so the table parser has an explicit default cell for every
row and the linter stops flagging column ambiguity.
fern/pages/reference/schemas/capture-screenshot-detailed.md-19-19 (1)

19-19: ⚠️ Potential issue | 🟡 Minor

sourceIntegration row formatting should be adjusted for lint compliance.

Line 19 is triggering MD055/MD056. Set an explicit default value in the final column.

Suggested patch
-sourceIntegration | object(sourceIntegration) | Optional. Information about the source integration for this screenshot, enabling upload of changed files back to the source CMS. Set automatically during test resolution for files from integrations. | 
+sourceIntegration | object(sourceIntegration) | Optional. Information about the source integration for this screenshot, enabling upload of changed files back to the source CMS. Set automatically during test resolution for files from integrations. | `N/A`
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/capture-screenshot-detailed.md` at line 19, The
markdown table row for sourceIntegration in capture-screenshot-detailed.md is
tripping MD055/MD056 because the final column is empty; update the
sourceIntegration row (the "sourceIntegration | object(sourceIntegration) |
Optional. ..." entry) to include an explicit default in the last column (e.g.,
"Default: null" or "Default: None") and ensure the pipe-separated columns remain
aligned so the table is lint-compliant.
fern/pages/reference/api/resolve-paths.mdx-87-87 (1)

87-87: ⚠️ Potential issue | 🟡 Minor

Use one canonical relativePathBase value list.

Line 87 says "config"/"file", but Line 123 says "config"/"cwd". Please standardize this to the actual supported values in all sections.

Also applies to: 123-123

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/api/resolve-paths.mdx` at line 87, The docs
inconsistently list allowed values for the relativePathBase option; update every
occurrence in this document so they all use the single canonical, actual
supported set of values for relativePathBase (e.g., replace the mismatched
`"file"`/`"cwd"` usages so both descriptions show the same supported pair), and
ensure the examples and explanatory sentences referencing relativePathBase use
that same canonical value list.
fern/pages/reference/api/detect-and-resolve-tests.mdx-1-4 (1)

1-4: ⚠️ Potential issue | 🟡 Minor

Add a short sidebar-title for this long page title.

Given the long function name in title, add a concise sidebar-title to improve nav readability.

As per coding guidelines, "Use short frontmatter sidebar titles when the main title is long in documentation pages."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/api/detect-and-resolve-tests.mdx` around lines 1 - 4,
Add a short frontmatter key "sidebar-title" above the existing title block for
this doc: insert a concise value like "Detect & Resolve Tests" (or similar short
label) in the page frontmatter so the long title detectAndResolveTests() stays
as the main title but the sidebar uses the shorter label; update the frontmatter
near the existing title/description keys to include sidebar-title.
fern/pages/reference/api/overview.mdx-93-93 (1)

93-93: ⚠️ Potential issue | 🟡 Minor

Update the configuration link to match the new file location.

The configuration page was moved from fern/pages/docs/configuration.mdx to fern/pages/docs/config/configuration.mdx with no slug override, so the correct link is /docs/config/configuration.

Fix
-All API functions accept a configuration object with the same options available in the [configuration file](/docs/configuration). See the [`config`](/reference/schemas/config) schema for all available options.
+All API functions accept a configuration object with the same options available in the [configuration file](/docs/config/configuration). See the [`config`](/reference/schemas/config) schema for all available options.

Note: This same broken link pattern appears in 8 other documentation pages and should be fixed throughout.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/api/overview.mdx` at line 93, Update the broken
configuration link in fern/pages/reference/api/overview.mdx by replacing the old
href "/docs/configuration" with the new path "/docs/config/configuration" in the
sentence that references the configuration file; also search for the same old
link string "/docs/configuration" across the repo (the comment notes 8 other
pages) and update them to "/docs/config/configuration" to keep all docs
consistent.
fern/pages/reference/schemas/integrations-options.md-15-15 (1)

15-15: ⚠️ Potential issue | 🟡 Minor

Replace placeholder text for openApi description.

Line 15 still says “No description provided.” Please replace with a short functional description so this schema page is self-explanatory.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/integrations-options.md` at line 15, Update the
placeholder description for the schema property named `openApi` in
integrations-options.md: replace "No description provided." with a concise
functional description (e.g., "Optional list of OpenAPI documents describing
external integrations; each item should conform to the `openApi` schema and
defines endpoints, operations, and models for an integration"). Ensure the new
text remains brief, clarifies that the field is an optional array of `openApi`
objects, and is added next to the existing `openApi | array of
object([openApi](/reference/schemas/openapi))` entry.
fern/pages/reference/api/run-tests.mdx-1-3 (1)

1-3: ⚠️ Potential issue | 🟡 Minor

Add frontmatter description to this MDX page.

Line 1-3 is missing a description, which breaks consistency with the rest of the docs pages.

As per coding guidelines, "Use frontmatter descriptions in MDX documentation pages".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/api/run-tests.mdx` around lines 1 - 3, The MDX
frontmatter for the page with title runTests() is missing a description field;
add a frontmatter line `description: "<short summary of what runTests() does>"`
directly under the existing `title: runTests()` so the page follows the docs
convention and provides a concise description for the runTests() reference page.
🧹 Nitpick comments (16)
fern/pages/reference/schemas/wait.md (1)

25-35: Clarify semantics for non-numeric wait examples.

The new examples are helpful, but readers may not understand what "$WAIT_DURATION" and true resolve to at runtime, especially since Line 15 describes milliseconds. Add a short note under examples (or in Description) describing exact behavior for string/boolean values.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/wait.md` around lines 25 - 35, Add a short note
under the examples (or in the Description) that explicitly states how
non-numeric wait values are resolved: explain that string values like
"$WAIT_DURATION" are runtime placeholders (e.g., environment/variable
substitution) that are parsed into a numeric duration in milliseconds per the
schema, and that boolean values like true are treated as a semantic toggle that
maps to the schema’s default wait duration (state the exact default value used)
— update the "wait" examples to include an inline explanation of the resolved
form.
fern/pages/reference/schemas/config.md (1)

179-183: Consider showing a non-default processDitaMaps value.

Since default is already true, this example is less illustrative; using false may better demonstrate behavior override.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/config.md` around lines 179 - 183, The example
JSON currently shows the default value for processDitaMaps, which is unhelpful;
update the sample to demonstrate a non-default behavior by setting
"processDitaMaps": false so readers can see how to override the default and what
effect that has in the config schema documentation (look for the example
containing processDitaMaps to replace the value).
fern/pages/reference/schemas/runshell.md (1)

29-33: Prefer a portable argument example over $USER.

Line 31 uses a POSIX-style env var ($USER), which may not behave consistently across shells/platforms. Consider replacing it with a neutral literal (or add a note that it is shell-dependent).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/runshell.md` around lines 29 - 33, The example
in the runshell schema uses a POSIX-style environment variable "$USER" in the
"args" array which is shell/platform-dependent; update the example to use a
portable literal (e.g., replace "$USER" with a neutral value like "username" or
"example_user") or add a brief note next to the "args" example explaining that
environment variable expansion is shell-dependent and "$USER" may not work
across all platforms so users should substitute an appropriate value for their
environment; make the change around the "command" and "args" example shown in
the diff.
fern/pages/reference/schemas/browser.md (1)

27-28: Use concrete nested values for window and viewport in the example.

Using {} here makes the expected object shape less clear. A concrete example is easier to copy and reduces ambiguity.

Proposed doc example update
 {
   "name": "chrome",
   "headless": true,
-  "window": {},
-  "viewport": {}
+  "window": {
+    "width": 1280,
+    "height": 720
+  },
+  "viewport": {
+    "width": 1280,
+    "height": 720
+  }
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/browser.md` around lines 27 - 28, The example
currently shows "window": {} and "viewport": {}, which is ambiguous; replace
those empty objects with concrete nested example fields that reflect the
expected shapes (e.g., for window include title, width, height, devicePixelRatio
or similar fields; for viewport include width, height, scale or zoom, and
scrollX/scrollY) so readers can see and copy the precise structure; update the
example values for the "window" and "viewport" objects in the schema sample to
use these explicit keys and realistic values.
fern/pages/docs/tests/overview.mdx (1)

264-269: Avoid hard-coded credentials in the login pattern example.

Use environment-variable placeholders so this starter pattern doesn’t normalize committed secrets.

🔐 Proposed fix
       "steps": [
+        { "loadVariables": ".env" },
         { "goTo": "https://app.example.com/login" },
         { "find": "input[name='email']" },
-        { "type": ["user@example.com"] },
+        { "type": ["$TEST_USER_EMAIL"] },
         { "find": "input[name='password']" },
-        { "type": ["password123"] },
+        { "type": ["$TEST_USER_PASSWORD"] },
         { "click": "button[type='submit']" },
         { "find": ".dashboard" }
       ]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/docs/tests/overview.mdx` around lines 264 - 269, The snippet in
the login pattern contains hard-coded credentials in the steps (the "type"
entries for "input[name='email']" and "input[name='password']"); replace those
literal values with environment-variable placeholders (e.g., use
process/env-style placeholders or template tokens like ${ENV_LOGIN_EMAIL} and
${ENV_LOGIN_PASSWORD}) so the example reads values from environment/config
during test runs and no secrets are committed; update the two "type" steps
accordingly and add a brief comment near the pattern indicating the placeholders
must be set in CI/local env before running.
fern/pages/docs/get-started/installation.mdx (1)

82-139: Add doc-test coverage for the new troubleshooting commands.

The new section adds runnable snippets, but unlike earlier installation flows, it doesn’t include corresponding test steps. Please add/extend the relevant .spec.json coverage so these commands stay validated over time.

Based on learnings, run documentation tests with npm run doc-detective when updating documentation features and review the corresponding .spec.json file to see if the test needs to be updated.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/docs/get-started/installation.mdx` around lines 82 - 139, Add
doc-test coverage for the new Troubleshooting runnable snippets by updating the
corresponding spec file (e.g., getting-started.spec.json) referenced in the
example project layout; add test steps that validate the "Command not found" npm
PATH instructions, the permission-error workaround (creating ~/.npm-global and
setting npm prefix), the browser-launch notes (headless/CI flags and required
Linux deps), and the reinstall module command (npm uninstall -g doc-detective &&
npm i -g doc-detective); ensure the project .doc-detective.json includes these
new checks and then run the suite with npm run doc-detective to confirm tests
pass.
fern/pages/docs/get-started/cli-reference.mdx (1)

63-68: Use a description list for environment variable pairs.

This section is pair-structured data (Variable + Description), so it should use a description list instead of a table.

♻️ Proposed fix
-| Variable | Description |
-|----------|-------------|
-| `DOC_DETECTIVE_CONFIG` | Path to a configuration file. Equivalent to `--config`. |
-| `DOC_DETECTIVE_API` | API key for Doc Detective integrations. |
-| `DOC_DETECTIVE_META` | Metadata to include with test results. |
+`DOC_DETECTIVE_CONFIG`
+: Path to a configuration file. Equivalent to `--config`.
+
+`DOC_DETECTIVE_API`
+: API key for Doc Detective integrations.
+
+`DOC_DETECTIVE_META`
+: Metadata to include with test results.

As per coding guidelines, "Use description lists for pairs of related pieces of data in documentation."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/docs/get-started/cli-reference.mdx` around lines 63 - 68, Replace
the environment-variable table with a description list: remove the table rows
for DOC_DETECTIVE_CONFIG, DOC_DETECTIVE_API, and DOC_DETECTIVE_META and render
each variable as a term with its description (e.g., DOC_DETECTIVE_CONFIG → "Path
to a configuration file. Equivalent to --config", DOC_DETECTIVE_API → "API key
for Doc Detective integrations", DOC_DETECTIVE_META → "Metadata to include with
test results") using MDX/HTML description-list markup (dl/dt/dd) or the
project's supported description-list syntax so the pair-structured data follows
the documentation guideline.
fern/pages/docs/get-started/ci.mdx (1)

161-426: Please add doc-test verification coverage for the new CI snippets.

This section adds many executable snippets across platforms; ensure corresponding doc-detective coverage/spec updates are included so examples stay valid.

Based on learnings, run documentation tests with npm run doc-detective when updating documentation features and review the corresponding .spec.json file to see if the test needs to be updated.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/docs/get-started/ci.mdx` around lines 161 - 426, Add doc-detective
verification specs for the new CI/CD snippets by creating/updating .spec.json
entries that exercise each provided example (GitLab .gitlab-ci.yml, Jenkinsfile,
CircleCI config, Azure Pipelines, Travis .travis.yml and Docker usage) so they
are executed with the same CLI flags shown in the docs (e.g., npx doc-detective
--input ./docs and npx doc-detective --config .doc-detective.ci.json), ensure
the spec(s) assert the tool runs successfully and writes results to
./test-results, add or verify an npm script "doc-detective" in package.json that
runs the command used in the guidance, run npm run doc-detective locally to
validate and update the corresponding .spec.json artifacts/expectations to match
real output.
fern/pages/reference/schemas/save-cookie-detailed.md (1)

19-19: Remove redundant "(optional)" from description.

The description for domain includes "(optional)" at the end, but this is already indicated by "Optional." at the beginning of the description. This redundancy should be removed for consistency with other optional fields in the table.

Suggested fix
-domain | string | Optional. Specific domain to filter the cookie by (optional). | 
+domain | string | Optional. Specific domain to filter the cookie by. | 
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/save-cookie-detailed.md` at line 19, Remove the
redundant "(optional)" in the description for the domain field in the
save-cookie-detailed schema: update the table row for the domain property so it
reads "Optional. Specific domain to filter the cookie by." (refer to the domain
field in fern/pages/reference/schemas/save-cookie-detailed.md).
fern/pages/reference/schemas/find-element-detailed.md (2)

13-14: Consider hyphenating "element-finding" as compound adjective.

Per the Google Developer Style Guide (referenced in coding guidelines), compound adjectives before nouns should be hyphenated: "element-finding fields" rather than "element finding fields."

Suggested fix
-elementText | string | Optional. Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria. | 
-selector | string | Optional. Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria. | 
+elementText | string | Optional. Display text of the element to find. If combined with other element-finding fields, the element must match all specified criteria. | 
+selector | string | Optional. Selector of the element to find. If combined with other element-finding fields, the element must match all specified criteria. | 
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/find-element-detailed.md` around lines 13 - 14,
Update the two table descriptions for elementText and selector to hyphenate the
compound adjective: change "element finding fields" to "element-finding fields"
so both descriptions read "If combined with other element-finding fields, the
element must match all specified criteria."; locate these phrases near the
elementText and selector entries to apply the change.

34-34: Consider providing a meaningful example for elementAttribute.

The empty object {} doesn't demonstrate how to use elementAttribute. A concrete example would help users understand the expected format.

Suggested example
-  "elementAttribute": {},
+  "elementAttribute": {"data-status": "active", "disabled": false},
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/find-element-detailed.md` at line 34, The
example for elementAttribute is currently an empty object and should be replaced
with a concrete illustrative object showing the expected key/value structure;
update the example in the find-element-detailed.md snippet so that
"elementAttribute" contains realistic attribute pairs (for example keys like
"name" or actual attribute names and their values such as "href":
"https://example.com", "class": "btn primary", or a small map { "data-id":"123",
"aria-label":"close" }) to demonstrate the intended format and usage; ensure the
example remains consistent with any surrounding schema fields and documentation
language.
scripts/generate-references.ts (1)

1354-1361: Avoid redundant buildPageDefs() call.

buildPageDefs() is already called in main() at line 1279. Calling it again here rebuilds all page definitions unnecessarily. Consider passing the existing pageDefs array to registerExtraComponentTitles() instead.

Proposed fix
-function registerExtraComponentTitles() {
+function registerExtraComponentTitles(pageDefs: PageDef[]) {
   // Walk all v3 schemas and register component schema titles
   const v3keys = Object.keys(allSchemas).filter((k) => k.endsWith("_v3"));
   // ... existing code ...

   // Walk nested properties for titles
-  for (const pd of buildPageDefs()) {
+  for (const pd of pageDefs) {
     if (pd.schema.properties) {

And update the call site in main():

-  registerExtraComponentTitles();
+  registerExtraComponentTitles(pageDefs);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate-references.ts` around lines 1354 - 1361, The loop calls
buildPageDefs() again causing redundant rebuilds; change
registerExtraComponentTitles() to accept the existing pageDefs array (from
main's buildPageDefs() call) instead of invoking buildPageDefs() internally,
then iterate over that passed-in pageDefs and call registerNestedTitles(prop)
for each property; update the call site in main() to pass pageDefs into
registerExtraComponentTitles(pageDefs) so buildPageDefs() is only executed once.
fern/pages/docs/config/configuration.mdx (1)

283-302: Consider varying sentence structure for better readability.

The static analysis flagged that multiple successive sentences begin with "Contexts" (lines 283, 285, 300, 302). Consider rewording for variety:

  • "Contexts in a spec override..." → "Spec-level contexts override..."
  • "Contexts in a test override..." → "Test-level contexts override..."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/docs/config/configuration.mdx` around lines 283 - 302, Reword
repetitive sentences to vary sentence structure: change the heading/body line
"Contexts in a specification" / sentence "Contexts in a spec override
config-level contexts for all tests in that spec." to use "Spec-level contexts
override config-level contexts for all tests in a spec." and change the
heading/body "Contexts in a test" / sentence "Contexts in a test override both
config- and spec-level contexts for that specific test." to "Test-level contexts
override config- and spec-level contexts for that specific test."; update any
matching occurrences around the JSON example (keys like "description", "runOn",
"tests") so the new phrasing replaces the old one consistently.
fern/pages/reference/schemas/click.md (1)

1-49: Documentation pages should use .mdx extension per coding guidelines.

This file and other schema reference pages use .md extension, but the coding guidelines specify that documentation pages in fern/pages/**/* must be MDX (.mdx) files. Since these files are auto-generated by scripts/generate-references.ts, the generator should output .mdx files instead.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/click.md` around lines 1 - 49, The generated
schema reference file (e.g., click.md) uses the .md extension but must be .mdx
per docs policy; update the generator (generate-references.ts) to output .mdx
filenames instead of .md (e.g., emit click.mdx) and adjust the generator's
template/output logic so the frontmatter and content are MDX-compatible; ensure
any places that compute links or references (the code that constructs
filenames/paths and the template used to render the schema pages) are updated to
use the .mdx extension so generated pages land in the correct format.
fern/pages/reference/api/run-tests.mdx (1)

15-16: Fill in parameter descriptions in the table.

Line 15-16 leaves both parameter descriptions empty, which makes the API contract harder to use despite typed columns.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/api/run-tests.mdx` around lines 15 - 16, The parameter
table is missing descriptions for `config` and `options`; update the table row
for `config` to explain what configuration object it expects (e.g., shape,
required fields, purpose—such as test runner settings, environment, or
credentials) and mark it as required, and update the `options` row to describe
optional flags or overrides (e.g., timeout, verbose, filters) and how they alter
behavior; reference the parameter names `config` and `options` so readers can
map these descriptions to the function/API signature and include a short example
or link to the detailed type definition if available.
fern/pages/reference/api/resolve-tests.mdx (1)

16-17: Add concrete descriptions for config and detectedTests.

The parameters are required but undocumented in the description column, which reduces clarity.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/api/resolve-tests.mdx` around lines 16 - 17, The table
documenting parameters for the resolve-tests API is missing descriptive text for
the required parameters `config` and `detectedTests`; update the MDX table row
descriptions to concisely explain each parameter’s shape and purpose (e.g.,
`config` — object with resolution settings such as {projectRoot:string,
patterns:string[], options?:object}; `detectedTests` — array of test metadata
objects containing at least {path:string, framework:string, matches?:string[]})
so consumers know what to pass and what fields are required/optional; edit the
rows for `config` and `detectedTests` in the parameter table on the
resolve-tests page to include these concrete descriptions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8cf35a9e-795d-41da-98aa-6d6d6ea56f56

📥 Commits

Reviewing files that changed from the base of the PR and between 00070c0 and 9558db6.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (68)
  • fern/docs.yml
  • fern/pages/contribute/templates/troubleshooting.mdx
  • fern/pages/contribute/templates/tutorial.mdx
  • fern/pages/docs/config/configuration.mdx
  • fern/pages/docs/config/contexts.md
  • fern/pages/docs/get-started/ci.mdx
  • fern/pages/docs/get-started/cli-reference.mdx
  • fern/pages/docs/get-started/installation.mdx
  • fern/pages/docs/tests/inline.mdx
  • fern/pages/docs/tests/overview.mdx
  • fern/pages/reference/api/detect-and-resolve-tests.mdx
  • fern/pages/reference/api/detect-tests.mdx
  • fern/pages/reference/api/get-runner.mdx
  • fern/pages/reference/api/overview.mdx
  • fern/pages/reference/api/read-file.mdx
  • fern/pages/reference/api/resolve-paths.mdx
  • fern/pages/reference/api/resolve-tests.mdx
  • fern/pages/reference/api/run-tests.mdx
  • fern/pages/reference/glossary.mdx
  • fern/pages/reference/schemas/browser.md
  • fern/pages/reference/schemas/capture-screenshot-detailed.md
  • fern/pages/reference/schemas/check-link-detailed.md
  • fern/pages/reference/schemas/checklink.md
  • fern/pages/reference/schemas/click-element-detailed.md
  • fern/pages/reference/schemas/click.md
  • fern/pages/reference/schemas/common.md
  • fern/pages/reference/schemas/config.md
  • fern/pages/reference/schemas/context.md
  • fern/pages/reference/schemas/crop-by-element-detailed.md
  • fern/pages/reference/schemas/draganddrop.md
  • fern/pages/reference/schemas/file-type-custom.md
  • fern/pages/reference/schemas/file-type-executable.md
  • fern/pages/reference/schemas/find-element-detailed.md
  • fern/pages/reference/schemas/find.md
  • fern/pages/reference/schemas/go-to-url-detailed.md
  • fern/pages/reference/schemas/goto.md
  • fern/pages/reference/schemas/http-request-detailed.md
  • fern/pages/reference/schemas/httprequest.md
  • fern/pages/reference/schemas/inline-statement-definition.md
  • fern/pages/reference/schemas/integrations-options.md
  • fern/pages/reference/schemas/load-cookie-detailed.md
  • fern/pages/reference/schemas/loadcookie.md
  • fern/pages/reference/schemas/loadvariables.md
  • fern/pages/reference/schemas/markup-definition.md
  • fern/pages/reference/schemas/openapi.md
  • fern/pages/reference/schemas/record.md
  • fern/pages/reference/schemas/request-body-object.md
  • fern/pages/reference/schemas/request-headers-object.md
  • fern/pages/reference/schemas/request-parameters.md
  • fern/pages/reference/schemas/resolved-context.md
  • fern/pages/reference/schemas/response-body-object.md
  • fern/pages/reference/schemas/response-headers.md
  • fern/pages/reference/schemas/response.md
  • fern/pages/reference/schemas/run-code-detailed.md
  • fern/pages/reference/schemas/run-shell-command-detailed.md
  • fern/pages/reference/schemas/runcode.md
  • fern/pages/reference/schemas/runshell.md
  • fern/pages/reference/schemas/save-cookie-detailed.md
  • fern/pages/reference/schemas/savecookie.md
  • fern/pages/reference/schemas/screenshot.md
  • fern/pages/reference/schemas/specification.md
  • fern/pages/reference/schemas/stoprecord.md
  • fern/pages/reference/schemas/test.md
  • fern/pages/reference/schemas/type-keys-detailed.md
  • fern/pages/reference/schemas/type.md
  • fern/pages/reference/schemas/wait.md
  • package.json
  • scripts/generate-references.ts
💤 Files with no reviewable changes (2)
  • fern/pages/reference/schemas/common.md
  • fern/pages/docs/config/contexts.md

…sues, test examples

- Replace invalid HTML comments (<!-- -->) with MDX JSX comments ({/* */}) in all 7 API reference pages
- Fix detectTests() signature and parameter to use object destructuring { config }
- Fix resolveTests() signature to use object destructuring { config, detectedTests }
- Fix resolvePaths() signature to use object destructuring
- Fix readFile() signature and parameter to use object destructuring { fileURLOrPath }
- Revert type.md title from 'typeKeys' back to 'type'
- Fix type-keys-detailed.md cross-reference from [typeKeys] to [type]
- Fix statusCode (singular, inside response) to statusCodes array (top-level) in test examples
- Remove nonexistent --exit-on-fail CLI flag reference from ci.mdx
- Fix go-to-url-detailed.md example: invalid url/origin values -> /example and https://www.example.com
- Fix runcode.md example: 'return false' (invalid Node.js) -> 'process.exit(1)'
- Deduplicate repeated object([Common]) entries in markup-definition.md actions field
- Fix generate-references.ts: pass pageDefs to registerExtraComponentTitles() to avoid redundant buildPageDefs() call
- Fix generate-references.ts: deduplicate rendered type strings with Set to prevent duplicate entries
@github-actions
Copy link

github-actions bot commented Mar 4, 2026

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

♻️ Duplicate comments (1)
scripts/generate-references.ts (1)

1157-1158: ⚠️ Potential issue | 🟠 Major

Update marker constants to use JSX comment syntax with legacy HTML comment fallback.

The generator searches for and emits HTML comment markers (<!-- CUSTOM CONTENT START -->), but the existing MDX files use JSX comment markers ({/* CUSTOM CONTENT START */}). This mismatch causes the preservation logic to fail—the markers are not found in existing files, forcing a fallback to section-based detection instead of explicit marker preservation. Regenerating pages will emit incorrect HTML comment syntax instead of JSX comments.

Fix by updating the marker constants to use JSX syntax and supporting the legacy HTML format as a fallback:

Migration-safe fix
-const CUSTOM_START = "<!-- CUSTOM CONTENT START -->";
-const CUSTOM_END = "<!-- CUSTOM CONTENT END -->";
+const CUSTOM_START = "{/* CUSTOM CONTENT START */}";
+const CUSTOM_END = "{/* CUSTOM CONTENT END */}";
+const LEGACY_CUSTOM_START = "<!-- CUSTOM CONTENT START -->";
+const LEGACY_CUSTOM_END = "<!-- CUSTOM CONTENT END -->";
@@
-    const startIdx = existing.indexOf(CUSTOM_START);
-    const endIdx = existing.indexOf(CUSTOM_END);
-    if (startIdx !== -1 && endIdx !== -1) {
+    const startToken = existing.includes(CUSTOM_START)
+      ? CUSTOM_START
+      : LEGACY_CUSTOM_START;
+    const endToken = existing.includes(CUSTOM_END)
+      ? CUSTOM_END
+      : LEGACY_CUSTOM_END;
+    const startIdx = existing.indexOf(startToken);
+    const endIdx = existing.indexOf(endToken);
+    if (startIdx !== -1 && endIdx !== -1) {
       customContent = existing.substring(
-        startIdx + CUSTOM_START.length,
+        startIdx + startToken.length,
         endIdx
       );

Also applies to lines 1186–1192 and 1268–1270.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate-references.ts` around lines 1157 - 1158, Update the marker
constants CUSTOM_START and CUSTOM_END in generate-references.ts to use JSX
comment syntax (e.g. {/* CUSTOM CONTENT START */} / {/* CUSTOM CONTENT END */})
and change the preservation/search logic to also accept the legacy HTML markers
(<!-- CUSTOM CONTENT START --> / <!-- CUSTOM CONTENT END -->) as a fallback;
ensure any emit logic that writes markers (the same symbols
CUSTOM_START/CUSTOM_END) writes the JSX form and that matching/regex code paths
(the other occurrences of the markers referenced in the file) check for both JSX
and HTML variants so existing MDX files with either marker are recognized and
preserved.
🧹 Nitpick comments (2)
fern/pages/reference/schemas/type.md (1)

10-10: Normalize link label casing for readability consistency.

Consider renaming test to Test to match the title-style labels used in adjacent links.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/type.md` at line 10, Update the link label text
from "test" to "Test" to normalize title-style casing: find the markdown link
whose label is "test" (the text inside the brackets) pointing to
"/reference/schemas/test" and change only the visible label to "Test" while
keeping the URL unchanged.
fern/pages/docs/get-started/ci.mdx (1)

165-333: Use Fern MDX components to improve scanability of multi-platform examples.

This new section is useful, but the long sequence of large blocks is hard to navigate. Grouping platform examples with <Tabs> (or collapsible sections) would improve readability without changing content.

As per coding guidelines, "Use Fern Docs MDX components when they improve the reader experience".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/docs/get-started/ci.mdx` around lines 165 - 333, The CI examples
section contains many large code blocks (e.g., the "GitLab CI/CD" and
"Multi-platform GitLab CI" groups, plus Jenkins, CircleCI, Azure Pipelines,
Travis CI headings) that hurt scanability; wrap related platform examples in
Fern MDX UI components (for example use <Tabs> with per-platform <TabItem> or
collapsible panels) so each CI platform is collapsible/tabbed rather than a long
vertical list, update the headings inside the MDX (e.g., "GitLab CI/CD",
"Multi-platform GitLab CI", "Azure Pipelines", "Travis CI") to be the tab labels
or panel summaries, and ensure existing code blocks and relative references
(like .gitlab-ci.yml, .doc-detective-base, azure-pipelines.yml) remain unchanged
except for placement inside those components.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@fern/pages/docs/get-started/ci.mdx`:
- Line 171: Update all CI examples that pin the Docker image "image: node:18"
(and any other occurrences of "node:18" in the file) to a supported LTS like
"node:20" or "node:22" (preferably node:22+ for longer support); search for the
exact token "node:18" across the document (notably the occurrences referenced in
the comment) and replace each with the chosen LTS tag, ensuring any accompanying
text that mentions Node.js v18 is updated to the new version and that examples
continue to work with the updated image.
- Around line 238-247: The CircleCI job caches node_modules keyed by dd-deps-{{
checksum "package-lock.json" }} but installs Doc Detective globally with npm i
-g doc-detective, so the node_modules cache is ineffective and the checksum will
error if package-lock.json is missing; update the job to either remove the
restore_cache/save_cache blocks entirely or replace them to cache the npm global
prefix and npm cache (e.g., cache paths like ~/.npm-global and ~/.npm) and stop
using dd-deps-{{ checksum "package-lock.json" }} as the key so the job no longer
depends on package-lock.json when installing global tools.

In `@fern/pages/reference/api/run-tests.mdx`:
- Around line 1-3: The MDX frontmatter for the page with title "runTests()" is
missing a description; edit the frontmatter at the top of run-tests.mdx to add a
concise description string (frontmatter key "description") that summarizes the
page (e.g., what runTests() does and when to use it), ensuring the frontmatter
block contains both title: runTests() and the new description field.

In `@fern/pages/reference/schemas/runcode.md`:
- Around line 58-64: The example in runcode.md has a mismatch between the "code"
and "stdio" fields — update the "code" entry to print the exact expected output
by changing "code": "print('Hello from Python')" to "code": "print('Hello from
Python!')", then run the docs tests with npm run doc-detective and adjust the
corresponding .spec.json if the test expectation needs updating.
- Line 23: The example string "console.log('Hello, ${process.env.USER}!');" uses
single quotes so ${process.env.USER} won't be interpolated; update the snippet
in the "code" value to use a template literal (backticks) like
console.log(`Hello, ${process.env.USER}!`); so the env var is evaluated and
printed.

In `@fern/pages/reference/schemas/type-keys-detailed.md`:
- Around line 17-22: Table rows for the new fields elementText, elementId,
elementTestId, elementClass, elementAttribute, and elementAria are missing the
fourth "Default" column cell, causing MD056; update each corresponding row in
type-keys-detailed.md to include the missing Default cell (use an appropriate
default value such as an empty cell or a dash/“—” if no default applies) so
every row has four cells and the markdown table is well-formed.

---

Duplicate comments:
In `@scripts/generate-references.ts`:
- Around line 1157-1158: Update the marker constants CUSTOM_START and CUSTOM_END
in generate-references.ts to use JSX comment syntax (e.g. {/* CUSTOM CONTENT
START */} / {/* CUSTOM CONTENT END */}) and change the preservation/search logic
to also accept the legacy HTML markers (<!-- CUSTOM CONTENT START --> / <!--
CUSTOM CONTENT END -->) as a fallback; ensure any emit logic that writes markers
(the same symbols CUSTOM_START/CUSTOM_END) writes the JSX form and that
matching/regex code paths (the other occurrences of the markers referenced in
the file) check for both JSX and HTML variants so existing MDX files with either
marker are recognized and preserved.

---

Nitpick comments:
In `@fern/pages/docs/get-started/ci.mdx`:
- Around line 165-333: The CI examples section contains many large code blocks
(e.g., the "GitLab CI/CD" and "Multi-platform GitLab CI" groups, plus Jenkins,
CircleCI, Azure Pipelines, Travis CI headings) that hurt scanability; wrap
related platform examples in Fern MDX UI components (for example use <Tabs> with
per-platform <TabItem> or collapsible panels) so each CI platform is
collapsible/tabbed rather than a long vertical list, update the headings inside
the MDX (e.g., "GitLab CI/CD", "Multi-platform GitLab CI", "Azure Pipelines",
"Travis CI") to be the tab labels or panel summaries, and ensure existing code
blocks and relative references (like .gitlab-ci.yml, .doc-detective-base,
azure-pipelines.yml) remain unchanged except for placement inside those
components.

In `@fern/pages/reference/schemas/type.md`:
- Line 10: Update the link label text from "test" to "Test" to normalize
title-style casing: find the markdown link whose label is "test" (the text
inside the brackets) pointing to "/reference/schemas/test" and change only the
visible label to "Test" while keeping the URL unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 29508ae4-e809-4dd0-86bc-336b29d74eb8

📥 Commits

Reviewing files that changed from the base of the PR and between 9558db6 and ea9247a.

📒 Files selected for processing (15)
  • fern/pages/docs/get-started/ci.mdx
  • fern/pages/docs/tests/overview.mdx
  • fern/pages/reference/api/detect-and-resolve-tests.mdx
  • fern/pages/reference/api/detect-tests.mdx
  • fern/pages/reference/api/get-runner.mdx
  • fern/pages/reference/api/read-file.mdx
  • fern/pages/reference/api/resolve-paths.mdx
  • fern/pages/reference/api/resolve-tests.mdx
  • fern/pages/reference/api/run-tests.mdx
  • fern/pages/reference/schemas/go-to-url-detailed.md
  • fern/pages/reference/schemas/markup-definition.md
  • fern/pages/reference/schemas/runcode.md
  • fern/pages/reference/schemas/type-keys-detailed.md
  • fern/pages/reference/schemas/type.md
  • scripts/generate-references.ts
✅ Files skipped from review due to trivial changes (3)
  • fern/pages/reference/api/resolve-paths.mdx
  • fern/pages/reference/api/detect-and-resolve-tests.mdx
  • fern/pages/reference/api/get-runner.mdx
🚧 Files skipped from review as they are similar to previous changes (3)
  • fern/pages/reference/api/resolve-tests.mdx
  • fern/pages/docs/tests/overview.mdx
  • fern/pages/reference/api/read-file.mdx

Comment on lines +17 to +22
elementText | string | Optional. Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria. |
elementId | string | Optional. ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax. |
elementTestId | string | Optional. data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax. |
elementClass | one of:<br/>- string<br/>- array of string | Optional. Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes. |
elementAttribute | object | Optional. Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence. |
elementAria | string | Optional. Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax. |
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add the missing Default column cell for each new field row.

At Line 17–Line 22, each row currently has only 3 cells in a 4-column table, which triggers markdownlint MD056 and can render inconsistently.

Suggested fix
-elementText | string | Optional. Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria. | 
-elementId | string | Optional. ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax. | 
-elementTestId | string | Optional. data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax. | 
-elementClass | one of:<br/>- string<br/>- array of string | Optional. Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes. | 
-elementAttribute | object | Optional. Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence. | 
-elementAria | string | Optional. Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax. | 
+elementText | string | Optional. Display text of the element to type into. If combined with other element-finding fields, the element must match all specified criteria. | 
+elementId | string | Optional. ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax. | 
+elementTestId | string | Optional. data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax. | 
+elementClass | one of:<br/>- string<br/>- array of string | Optional. Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes. | 
+elementAttribute | object | Optional. Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence. | 
+elementAria | string | Optional. Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax. | 
🧰 Tools
🪛 LanguageTool

[grammar] ~17-~17: Use a hyphen to join words.
Context: ...ype into. If combined with other element finding fields, the element must match a...

(QB_NEW_EN_HYPHEN)

🪛 markdownlint-cli2 (0.21.0)

[warning] 17-17: Table pipe style
Expected: no_leading_or_trailing; Actual: trailing_only; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 17-17: Table column count
Expected: 4; Actual: 3; Too few cells, row will be missing data

(MD056, table-column-count)


[warning] 18-18: Table pipe style
Expected: no_leading_or_trailing; Actual: trailing_only; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 18-18: Table column count
Expected: 4; Actual: 3; Too few cells, row will be missing data

(MD056, table-column-count)


[warning] 19-19: Table pipe style
Expected: no_leading_or_trailing; Actual: trailing_only; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 19-19: Table column count
Expected: 4; Actual: 3; Too few cells, row will be missing data

(MD056, table-column-count)


[warning] 20-20: Table pipe style
Expected: no_leading_or_trailing; Actual: trailing_only; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 20-20: Table column count
Expected: 4; Actual: 3; Too few cells, row will be missing data

(MD056, table-column-count)


[warning] 21-21: Table pipe style
Expected: no_leading_or_trailing; Actual: trailing_only; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 21-21: Table column count
Expected: 4; Actual: 3; Too few cells, row will be missing data

(MD056, table-column-count)


[warning] 22-22: Table pipe style
Expected: no_leading_or_trailing; Actual: trailing_only; Unexpected trailing pipe

(MD055, table-pipe-style)


[warning] 22-22: Table column count
Expected: 4; Actual: 3; Too few cells, row will be missing data

(MD056, table-column-count)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/reference/schemas/type-keys-detailed.md` around lines 17 - 22,
Table rows for the new fields elementText, elementId, elementTestId,
elementClass, elementAttribute, and elementAria are missing the fourth "Default"
column cell, causing MD056; update each corresponding row in
type-keys-detailed.md to include the missing Default cell (use an appropriate
default value such as an empty cell or a dash/“—” if no default applies) so
every row has four cells and the markdown table is well-formed.

Copilot AI review requested due to automatic review settings March 5, 2026 00:03
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 68 out of 69 changed files in this pull request and generated 6 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +364 to +385
Use `before` and `after` properties to run steps before and after a test:

```json
{
"tests": [
{
"description": "Test with setup and cleanup",
"before": [
{ "loadVariables": ".env" },
{ "goTo": "$SITE_URL" }
],
"steps": [
{ "find": "h1" },
{ "screenshot": "homepage.png" }
],
"after": [
{ "screenshot": "final-state.png" }
]
}
]
}
```
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The "Setup and cleanup" section uses before and after properties as inline arrays of step objects. However, per the test schema (fern/pages/reference/schemas/test.md, line 21-22), before and after are string types (paths to test specification files), not step arrays. The example should use file paths like "before": "setup.json" instead of inline step arrays.

Copilot uses AI. Check for mistakes.
Comment on lines +349 to +359
| `beforeAny` | array | Steps to run before any tests start. |
| `afterAll` | array | Steps to run after all tests complete. |

```json
{
"input": ".",
"beforeAny": [
{ "loadVariables": ".env" }
],
"afterAll": [
{ "runShell": "echo Tests complete" }
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The beforeAny and afterAll options are documented here as accepting arrays of step objects (e.g., [{ "loadVariables": ".env" }]). However, the config schema (fern/pages/reference/schemas/config.md, lines 20-21) shows they accept string or array of string (paths to test specification files), not inline step arrays. The example should use file paths like "beforeAny": ["./setup.spec.json"].

Suggested change
| `beforeAny` | array | Steps to run before any tests start. |
| `afterAll` | array | Steps to run after all tests complete. |
```json
{
"input": ".",
"beforeAny": [
{ "loadVariables": ".env" }
],
"afterAll": [
{ "runShell": "echo Tests complete" }
| `beforeAny` | string or array of string | Test specification file(s) to run before any tests start. |
| `afterAll` | string or array of string | Test specification file(s) to run after all tests complete. |
```json
{
"input": ".",
"beforeAny": [
"./setup.spec.json"
],
"afterAll": [
"./teardown.spec.json"

Copilot uses AI. Check for mistakes.
Comment on lines +437 to +440
"openApi": {
"definition": "./openapi.yaml",
"server": "https://api.example.com"
}
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The OpenAPI integration example is incorrect. The integrations.openApi property accepts an array of openApi schema objects (as per integrations-options.md line 15 and openapi.md), not a single object with definition and server keys. The definition property in the openApi schema is ReadOnly and auto-resolved from descriptionPath. The example should use descriptionPath and be wrapped in an array, for example: "openApi": [{ "descriptionPath": "./openapi.yaml", "server": "https://api.example.com" }].

Suggested change
"openApi": {
"definition": "./openapi.yaml",
"server": "https://api.example.com"
}
"openApi": [
{
"descriptionPath": "./openapi.yaml",
"server": "https://api.example.com"
}
]

Copilot uses AI. Check for mistakes.
Comment on lines +23 to +27
const SOURCE_REPO = path.resolve(ROOT, "..", "doc-detective");
const SCHEMAS_JSON = path.join(
SOURCE_REPO,
"src/common/src/schemas/schemas.json"
);
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The script requires a sibling doc-detective repository cloned at ../doc-detective relative to this project root (line 23). This path assumption is not documented anywhere in the script or a README, making it fragile for other contributors. The script should either validate the path and fail with a clear error message, or accept a configurable --source-repo argument.

Copilot uses AI. Check for mistakes.
Comment on lines +11 to +17
## Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `config` | any | Yes | |
| `options` | any | No | |

Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The generated API pages (e.g., run-tests.mdx) have parameter types listed as any in the Parameters table. This is because extractFunctionSig falls back to "any" when parameters don't have explicit type annotations or when the type is not a TypeLiteralNode. The generated documentation is not useful for API consumers since all parameter types show as any. Consider reading the full TypeScript type text even for non-literal types, or enriching the generated docs with descriptions from JSDoc.

Copilot uses AI. Check for mistakes.
Comment on lines +1157 to +1158
const CUSTOM_START = "<!-- CUSTOM CONTENT START -->";
const CUSTOM_END = "<!-- CUSTOM CONTENT END -->";
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The generator script defines CUSTOM_START = "<!-- CUSTOM CONTENT START -->" and CUSTOM_END = "<!-- CUSTOM CONTENT END -->" (HTML comments, lines 1157-1158), but the generated .mdx files use JSX comments {/* CUSTOM CONTENT START */} and {/* CUSTOM CONTENT END */}. On the next run of generate, the script will fail to locate the existing custom content markers (indexOf will return -1`) and fall back to the heuristic path-based extraction, potentially duplicating or losing manually-added content.

Copilot uses AI. Check for mistakes.
- Update all CI examples from node:18 (EOL) to node:22
- Remove ineffective CircleCI cache blocks (global npm install doesn't use node_modules)
- Add frontmatter description to run-tests.mdx
- Fix template literal in runcode.md JS example (single quotes -> backticks for env var interpolation)
- Fix Python stdio mismatch: print('Hello from Python') -> print('Hello from Python!')
- tests/overview.mdx: fix before/after examples to use spec file paths (not inline step arrays), matching the string-typed schema fields
- config/configuration.mdx: fix beforeAny/afterAll table types and examples to use spec file paths; fix openApi example to use array with descriptionPath
- generate-references.ts: fix CUSTOM_START/CUSTOM_END markers to use JSX comments matching generated .mdx files; add validation for missing source repo; expand destructured binding elements individually
Copilot AI review requested due to automatic review settings March 6, 2026 20:29
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 68 out of 69 changed files in this pull request and generated 4 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +169 to +176
```yaml
doc-detective:
image: node:22
artifacts:
paths:
- test-results/
when: always
```
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The GitLab CI basic job snippet is incomplete — it defines image and artifacts but is missing a script: section that actually installs and runs Doc Detective. Without a script key, the job will fail to execute. Compare with the multi-platform example immediately below it, which correctly includes script: with the install and run commands.

Copilot uses AI. Check for mistakes.
Comment on lines +38 to +45
| `relativePathBase` | string | `"config"` | Base for resolving relative paths: `"config"` (relative to the config file) or `"cwd"` (relative to the current working directory). |

```json
{
"input": ["./docs", "./guides"],
"output": "./test-results",
"recursive": true,
"relativePathBase": "config"
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The relativePathBase option is documented here as accepting values "config" and "cwd" (with default "config"), but the schema reference at fern/pages/reference/schemas/config.md states accepted values are "cwd" and "file" (with default "file"). This inconsistency will mislead users — one of these sources is incorrect. The same discrepancy also exists in fern/pages/reference/api/resolve-paths.mdx (lines 44, 87, 95, 123) where "config" is used as a value.

Suggested change
| `relativePathBase` | string | `"config"` | Base for resolving relative paths: `"config"` (relative to the config file) or `"cwd"` (relative to the current working directory). |
```json
{
"input": ["./docs", "./guides"],
"output": "./test-results",
"recursive": true,
"relativePathBase": "config"
| `relativePathBase` | string | `"file"` | Base for resolving relative paths: `"file"` (relative to the config file) or `"cwd"` (relative to the current working directory). |
```json
{
"input": ["./docs", "./guides"],
"output": "./test-results",
"recursive": true,
"relativePathBase": "file"

Copilot uses AI. Check for mistakes.
Comment on lines +469 to +471
"openApi": {
"server": "$API_SERVER"
}
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The example at line 469 uses integrations.openApi as a plain object { "server": "$API_SERVER" }, but per the schema (and the correct example in integrations-options.md), openApi is an array of objects. This example will not validate against the schema and will mislead users about the correct format.

Suggested change
"openApi": {
"server": "$API_SERVER"
}
"openApi": [
{
"server": "$API_SERVER"
}
]

Copilot uses AI. Check for mistakes.
Comment on lines +32 to 38
{
"record": {
"path": "results.mp4",
"directory": "static/media",
"overwrite": "true"
}
}
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The record example at line 32-38 uses "overwrite": "true" (a string), which is consistent with the accepted values in record-detailed.md. However, "overwrite": "true" as a string is semantically confusing when users might expect a boolean. More importantly, the record field itself is typed as one of: string | object([Record (detailed)]) | boolean, but the example wraps the object form with "record": { ..., "overwrite": "true" } — this is consistent with the schema, so this is fine. However, overwrite for record only accepts "true" or "false" as strings, not the "aboveVariation" value that is used for screenshots and shell commands. Using "true" as a string is a potential confusion for users expecting a boolean true.

Copilot uses AI. Check for mistakes.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (4)
scripts/generate-references.ts (4)

90-92: Consider wrapping JSON.parse in try/catch for clearer error messages.

If schemas.json is malformed, the error will be a generic JSON parse error without context. Wrapping this in try/catch would provide a more actionable error message.

Proposed improvement
-const allSchemas: Record<string, SchemaLike> = JSON.parse(
-  fs.readFileSync(SCHEMAS_JSON, "utf8")
-);
+let allSchemas: Record<string, SchemaLike>;
+try {
+  allSchemas = JSON.parse(fs.readFileSync(SCHEMAS_JSON, "utf8"));
+} catch (err) {
+  console.error(`Error parsing schemas from ${SCHEMAS_JSON}:`, err);
+  process.exit(1);
+}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate-references.ts` around lines 90 - 92, Wrap the JSON.parse
call that populates allSchemas (and the fs.readFileSync around it) in a
try/catch to surface a clearer error message when SCHEMAS_JSON is malformed; in
the catch include the SCHEMAS_JSON variable and the original parse error (e.g.,
`Error: failed to parse ${SCHEMAS_JSON}: ${err.message}`) and either rethrow or
log and exit so the failure is obvious; update the code around JSON.parse(...)
that assigns to allSchemas to implement this error handling.

242-254: Remove dead entry for dragAndDrop_v3 from directSchemas.

The dragAndDrop_v3 entry at line 249 is immediately skipped at line 254 because it's already registered as a wrapper. This dead entry adds confusion.

Proposed cleanup
   const directSchemas: Array<{ key: string; file: string }> = [
     { key: "config_v3", file: "config.md" },
     { key: "context_v3", file: "context.md" },
     { key: "test_v3", file: "test.md" },
     { key: "spec_v3", file: "specification.md" },
     { key: "openApi_v3", file: "openapi.md" },
-    { key: "dragAndDrop_v3", file: "draganddrop.md" },
   ];

   for (const d of directSchemas) {
-    // dragAndDrop is already registered as a wrapper above, skip re-adding
-    if (d.file === "draganddrop.md") continue;
     const schema = get(d.key);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate-references.ts` around lines 242 - 254, The directSchemas
array contains a dead entry { key: "dragAndDrop_v3", file: "draganddrop.md" }
which is immediately skipped (see the if (d.file === "draganddrop.md") continue)
because dragAndDrop is already registered as a wrapper; remove that object from
the directSchemas array to eliminate the redundant entry and potential
confusion, leaving directSchemas with only the actual direct schema entries
(config_v3, context_v3, test_v3, spec_v3, openApi_v3).

1131-1140: Binding element type may be misleading when type is a reference.

When the parameter type is a type reference (e.g., SomeOptions) rather than an inline type literal, each extracted binding element inherits the entire type name. This could produce misleading parameter tables where individual fields show the container type instead of their actual types.

Consider using "unknown" or attempting to resolve the referenced type.

Proposed fix
       } else {
         // Expand binding elements individually (type may be a reference or any)
+        // When type is a reference, we can't infer individual element types
+        const elementType = param.type && ts.isTypeReferenceNode(param.type)
+          ? "unknown"
+          : paramType;
         for (const element of param.name.elements) {
           if (ts.isBindingElement(element)) {
             const eName = element.name.getText(sourceFile);
             const eRequired = !element.dotDotDotToken && !element.initializer;
-            params.push({ name: eName, type: paramType, required: eRequired });
+            params.push({ name: eName, type: elementType, required: eRequired });
           }
         }
       }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate-references.ts` around lines 1131 - 1140, The loop that
expands binding elements (the block using param.name.elements,
ts.isBindingElement, eName, eRequired, and params.push) incorrectly assigns the
container paramType to each element when paramType is a TypeReference; change
the logic to detect a referenced type (e.g., ts.isTypeReferenceNode(paramType))
and use "unknown" (or attempt to resolve via the typeChecker if available) as
the element's type instead of the container name; compute elementType =
ts.isTypeReferenceNode(paramType) ? "unknown" : paramType and push params.push({
name: eName, type: elementType, required: eRequired }) so individual fields no
longer show the enclosing type reference.

977-979: Double backticks may not render complex defaults correctly.

Using `` for complex JSON defaults may cause rendering issues in some markdown parsers. Consider using single backticks with proper escaping, or rendering complex defaults differently (e.g., omitting pipe characters in JSON).

Alternative approach
   // Complex defaults (arrays, objects)
-  return `\`\`${JSON.stringify(schema.default)}\`\``;
+  const json = JSON.stringify(schema.default).replace(/\|/g, "\\|");
+  return `\`${json}\``;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate-references.ts` around lines 977 - 979, The current return
wraps JSON.stringify(schema.default) with inline double backticks which can
break rendering for complex JSON; change the output to a fenced code block
instead (e.g. use a triple-backtick block with "json" and pretty-printed JSON)
by replacing the inline backtick expression around
JSON.stringify(schema.default) with a multiline fenced block like
```json\n${JSON.stringify(schema.default, null, 2)}\n``` so complex defaults
(including pipes/backticks) render correctly; locate the expression that returns
``\`\`${JSON.stringify(schema.default)}\`\`` and replace it with the fenced code
block version.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@fern/pages/docs/config/configuration.mdx`:
- Line 482: Replace the bold-styled filename "**.doc-detective.ci.json**" with
inline code formatting so it reads `.doc-detective.ci.json`; locate the bold
token in the markdown content (the exact text "**.doc-detective.ci.json**") and
change the surrounding asterisks to backticks to render it in code font.
- Line 18: Update the terse link labels to descriptive, accessible phrases:
change the link text "`config`" to "config schema" (and similarly "`context`" →
"context schema", "`test`" → "test schema", "`specification`" → "specification
schema") in fern/pages/docs/config/configuration.mdx and the other occurrences
noted (around the blocks at 74-75 and 103-105); ensure the surrounding sentence
uses second person and active voice (e.g., "A JSON Schema is available at the
config schema for validation and autocompletion in your editor.") and keep
American spelling and friendly tone per the style guide.
- Around line 468-471: The snippet incorrectly shows integrations.openApi as an
object; update it to match the documented schema by making integrations.openApi
an array of objects and include the required descriptionPath field (e.g.,
"integrations": { "openApi": [ { "server": "$API_SERVER", "descriptionPath":
"<path/to/description>" } ] } ) so copy-pasting yields a valid config; locate
the example referencing integrations.openApi and replace the object form with
the array form including descriptionPath.

---

Nitpick comments:
In `@scripts/generate-references.ts`:
- Around line 90-92: Wrap the JSON.parse call that populates allSchemas (and the
fs.readFileSync around it) in a try/catch to surface a clearer error message
when SCHEMAS_JSON is malformed; in the catch include the SCHEMAS_JSON variable
and the original parse error (e.g., `Error: failed to parse ${SCHEMAS_JSON}:
${err.message}`) and either rethrow or log and exit so the failure is obvious;
update the code around JSON.parse(...) that assigns to allSchemas to implement
this error handling.
- Around line 242-254: The directSchemas array contains a dead entry { key:
"dragAndDrop_v3", file: "draganddrop.md" } which is immediately skipped (see the
if (d.file === "draganddrop.md") continue) because dragAndDrop is already
registered as a wrapper; remove that object from the directSchemas array to
eliminate the redundant entry and potential confusion, leaving directSchemas
with only the actual direct schema entries (config_v3, context_v3, test_v3,
spec_v3, openApi_v3).
- Around line 1131-1140: The loop that expands binding elements (the block using
param.name.elements, ts.isBindingElement, eName, eRequired, and params.push)
incorrectly assigns the container paramType to each element when paramType is a
TypeReference; change the logic to detect a referenced type (e.g.,
ts.isTypeReferenceNode(paramType)) and use "unknown" (or attempt to resolve via
the typeChecker if available) as the element's type instead of the container
name; compute elementType = ts.isTypeReferenceNode(paramType) ? "unknown" :
paramType and push params.push({ name: eName, type: elementType, required:
eRequired }) so individual fields no longer show the enclosing type reference.
- Around line 977-979: The current return wraps JSON.stringify(schema.default)
with inline double backticks which can break rendering for complex JSON; change
the output to a fenced code block instead (e.g. use a triple-backtick block with
"json" and pretty-printed JSON) by replacing the inline backtick expression
around JSON.stringify(schema.default) with a multiline fenced block like
```json\n${JSON.stringify(schema.default, null, 2)}\n``` so complex defaults
(including pipes/backticks) render correctly; locate the expression that returns
``\`\`${JSON.stringify(schema.default)}\`\`` and replace it with the fenced code
block version.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b41258b9-01a7-487c-9153-ce6732992a9b

📥 Commits

Reviewing files that changed from the base of the PR and between a0844f8 and 4ba7775.

📒 Files selected for processing (3)
  • fern/pages/docs/config/configuration.mdx
  • fern/pages/docs/tests/overview.mdx
  • scripts/generate-references.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • fern/pages/docs/tests/overview.mdx

Comment on lines +468 to +471
"integrations": {
"openApi": {
"server": "$API_SERVER"
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Keep the openApi env-var example in the documented schema shape.

This snippet switches integrations.openApi back to an object, but the page defines it as an array of objects with descriptionPath a few sections earlier. Copy-pasting this example would give readers an invalid config.

💡 Proposed fix
   "integrations": {
-    "openApi": {
-      "server": "$API_SERVER"
-    }
+    "openApi": [
+      {
+        "descriptionPath": "./openapi.yaml",
+        "server": "$API_SERVER"
+      }
+    ]
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"integrations": {
"openApi": {
"server": "$API_SERVER"
}
"integrations": {
"openApi": [
{
"descriptionPath": "./openapi.yaml",
"server": "$API_SERVER"
}
]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@fern/pages/docs/config/configuration.mdx` around lines 468 - 471, The snippet
incorrectly shows integrations.openApi as an object; update it to match the
documented schema by making integrations.openApi an array of objects and include
the required descriptionPath field (e.g., "integrations": { "openApi": [ {
"server": "$API_SERVER", "descriptionPath": "<path/to/description>" } ] } ) so
copy-pasting yields a valid config; locate the example referencing
integrations.openApi and replace the object form with the array form including
descriptionPath.

- ci.mdx: add missing script section to GitLab CI basic job example
- configuration.mdx: fix relativePathBase default/values to 'file'/'cwd' matching schema; fix openApi env-var example to use array; fix schema link text to be descriptive; use code font for .doc-detective.ci.json filename
- resolve-paths.mdx: fix relativePathBase examples and description text from 'config' to 'file' matching schema
Copilot AI review requested due to automatic review settings March 6, 2026 21:27
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 68 out of 69 changed files in this pull request and generated 10 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.


| Parameter | Type | Required | Description |
|-----------|------|----------|--------------|
| `{ fileURLOrPath }` | string | Yes | |
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue as in detect-tests.mdx: the parameter table entry { fileURLOrPath } includes the braces in the parameter name, which is confusing. The parameter name should be displayed as fileURLOrPath (noting that it's passed as a property of a single object argument).

Suggested change
| `{ fileURLOrPath }` | string | Yes | |
| `fileURLOrPath` | string | Yes | |

Copilot uses AI. Check for mistakes.
Field | Type | Description | Default
:-- | :-- | :-- | :--
url | string | Required. URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.<br/><br/>Pattern: `(^(http://|https://|/).*|\$[A-Za-z0-9_]+)` |
url | string | Required. URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.<br/><br/>Pattern: `(^(http://|https://|/).*$|^\$[A-Za-z0-9_]+$)` |
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The generate-references.ts script strips the leading ^ and trailing $ anchors from regex patterns for display (lines 941–942), yet the check-link-detailed.md file was manually edited to show the full anchored pattern (^(http://|https://|/).*$|^\$[A-Za-z0-9_]+$). This inconsistency means that when the generator is re-run, the anchor-stripping logic will produce a different output than what's currently in the file. Additionally, load-cookie-detailed.md and save-cookie-detailed.md currently show stripped patterns ([A-Za-z0-9_.-]+, [A-Za-z_][A-Za-z0-9_]*) while check-link-detailed.md retains them. The generator's pattern-stripping logic should be consistent, or the manual edits in check-link-detailed.md will be overwritten on the next run.

Suggested change
url | string | Required. URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.<br/><br/>Pattern: `(^(http://|https://|/).*$|^\$[A-Za-z0-9_]+$)` |
url | string | Required. URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.<br/><br/>Pattern: `((http://|https://|/).*$|\$[A-Za-z0-9_]+)` |

Copilot uses AI. Check for mistakes.
Comment on lines +27 to +28
"window": {},
"viewport": {}
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The browser.md example was updated to use empty objects {} for window and viewport instead of showing actual field values. This makes the example less illustrative — readers won't know what fields to put inside those objects. The previous example (showing "width": 42, "height": 42) was more helpful. Consider keeping representative values or linking explicitly to the detailed sub-schema pages.

Suggested change
"window": {},
"viewport": {}
"window": {
"width": 1280,
"height": 720
},
"viewport": {
"width": 1280,
"height": 720
}

Copilot uses AI. Check for mistakes.
Comment on lines +25 to +30






Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The run-tests.mdx (and other API pages) have six blank lines between the {/* CUSTOM CONTENT START */} marker and the first section heading. This results in extra whitespace in the rendered page. This is cosmetic but worth cleaning up.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +664 to +673
if (schema.type === "object") {
if (
schema.properties &&
Object.keys(schema.properties).length === 0 &&
schema.additionalProperties
) {
return "object";
}
return "object";
}
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The renderType function (lines 664–673) has two branches for schema.type === "object" that both return "object" — the inner condition checking empty properties with additionalProperties is redundant since both cases produce the same result. This makes the code harder to reason about.

Copilot uses AI. Check for mistakes.
Comment on lines +110 to +122
const config = {
input: "./docs",
fileTypes: [
{
extensions: [".rst"],
testStartStatementOpen: ".. test:: ",
testStartStatementClose: "",
testEndStatement: ".. test-end::",
stepStatementOpen: ".. step:: ",
stepStatementClose: "",
},
],
};
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The "Custom file types" example in detect-tests.mdx uses properties (testStartStatementOpen, testStartStatementClose, testEndStatement, stepStatementOpen, stepStatementClose) that don't match the actual file-type-custom schema. According to the schema reference, the correct structure nests these patterns under inlineStatements, using testStart, testEnd, and step (not testStartStatementOpen, testEndStatement, stepStatementOpen, etc.). The example will not work as shown and should be updated to use the correct schema structure with inlineStatements.

Copilot uses AI. Check for mistakes.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `{ config }` | any | Yes | |
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue as in detect-tests.mdx: the parameter name { config } includes braces. The parameter should be shown as config.

Suggested change
| `{ config }` | any | Yes | |
| `config` | any | Yes | |

Copilot uses AI. Check for mistakes.
path | string | Optional. File path to save the command's output, relative to `directory`. |
directory | string | Optional. Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory. |
maxVariation | number | Optional. Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.<br/><br/>Minimum: 0. Maximum: 1 | `0`
maxVariation | number | Optional. Allowed variation as a fraction (0 to 1) of text different between the current output and previously saved output. For example, 0.1 means 10%. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.<br/><br/>Minimum: 0. Maximum: 1<br/><br/>**Migration note:** Values are fractions, not percentages. If you previously used a percentage-style value like `10` (for 10%), update it to `0.1`. | `0`
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The migration note added to the maxVariation field description in run-code-detailed.md and run-shell-command-detailed.md is helpful. However, embedding a migration note with bold Markdown (**Migration note:**) inside a table cell may not render correctly in all Markdown renderers (including some Fern Docs setups). If this is a known compatibility issue in this documentation framework, consider moving migration notes outside the table or using plain text.

Copilot uses AI. Check for mistakes.
Comment on lines +90 to +92
const allSchemas: Record<string, SchemaLike> = JSON.parse(
fs.readFileSync(SCHEMAS_JSON, "utf8")
);
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The generator script (generate-references.ts) uses module-level side effects: allSchemas is loaded via JSON.parse(fs.readFileSync(...)) and main() is called at the bottom of the file at module scope. If the SOURCE_REPO path check at line 24 fails, process.exit(1) is called, which is appropriate. However, there is no error handling around the JSON parse at lines 90–92 — if schemas.json is malformed or missing, the script will crash with an unhelpful stack trace rather than a descriptive error message. Consider wrapping the JSON parse in a try/catch with a helpful error message.

Copilot uses AI. Check for mistakes.
Comment on lines +249 to +254
{ key: "dragAndDrop_v3", file: "draganddrop.md" },
];

for (const d of directSchemas) {
// dragAndDrop is already registered as a wrapper above, skip re-adding
if (d.file === "draganddrop.md") continue;
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The dragAndDrop_v3 schema is included in both actions (as a wrapper page) and directSchemas arrays. The continue guard on line 254 prevents double registration, but this is fragile. If someone removes the guard or adds a similar key in the future, the page will be registered twice with potentially different configurations, causing unpredictable output. A clearer approach would be to remove dragAndDrop_v3 from directSchemas entirely with a comment explaining why.

Copilot uses AI. Check for mistakes.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants