A Babel plugin that stamps data-reticle-source on JSX host elements so Reticle can name the file a node came from.
@reticlehq/babel-plugin stamps data-reticle-source="file:line:col" onto your JSX at build time, in dev only, so Reticle can name the file a DOM node came from. You probably do not install this one directly: @reticlehq/vite-plugin and @reticlehq/next both pull it in. Reach for it only if you drive Babel yourself.React 19 dropped _debugSource, which is what source mapping used to rely on, so without this the tools can tell you the component name but not the file.Apache 2.0. CommonJS. One runtime dependency, @reticlehq/core (for the attribute name). Peer dependency: @babel/core ^7.
Component tags. Only lowercase host elements are stamped, because a component’s own JSX gets stamped where it is defined.
Lowercase tags that are not HTML or SVG elements, such as react-three-fiber’s <mesh>. Only known DOM tags are stamped, because a custom renderer can crash on the attribute.
Files whose first non-empty line is a comment holding exactly @reticle-ignore.
Elements that already carry the attribute.
Nodes with no location information.
Anything whose tag name is not a plain JSXIdentifier.
One export, via export =. There are no named exports and no default interop wrapper, because Babel require()s the module and takes the object directly.
function reticleSourcePlugin({ types }: { types: typeof BabelTypes }): PluginObj<PluginPass>;
The Babel plugin name is reticle-source. Its visitor handles Program (to read the ignore marker) and JSXOpeningElement.It takes no options. The plugin reads nothing from state.opts.
The stamp survives minification of everything else, costs nothing at runtime, and is readable from the DOM node itself. That is what lets reticle_look { action: "element" } answer with a file and a line rather than a component name and a shrug.
Last modified on October 12, 2026
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Reticle","description":"Reticle is the proof layer for AI agents: it verifies a running web app from the inside, without screenshots, and returns a verdict with evidence.","colors":{"primary":"#ff9d86","light":"#ffbcac","dark":"#d04425"},"logo":{"light":"https://mintcdn.com/reticle/Av2V9aUJid9T03FY/logo/wordmark-black.svg?fit=max\u0026auto=format\u0026n=Av2V9aUJid9T03FY\u0026q=85\u0026s=e08f6759b891a00c239f881dbd753e51","dark":"https://mintcdn.com/reticle/Av2V9aUJid9T03FY/logo/wordmark-white.svg?fit=max\u0026auto=format\u0026n=Av2V9aUJid9T03FY\u0026q=85\u0026s=b6d93ace9d26effbd5118548c4037bac"},"favicon":{"light":"https://mintcdn.com/reticle/Av2V9aUJid9T03FY/favicon/mark-black.svg?fit=max\u0026auto=format\u0026n=Av2V9aUJid9T03FY\u0026q=85\u0026s=67a4aa2bd8abbe587697b62440ef9568","dark":"https://mintcdn.com/reticle/Av2V9aUJid9T03FY/favicon/mark-white.svg?fit=max\u0026auto=format\u0026n=Av2V9aUJid9T03FY\u0026q=85\u0026s=e767b03c6c23a64027794fe639d5f918"},"appearance":{"default":"system"},"navbar":{"links":[{"href":"https://github.com/reticlehq/reticle","type":"github"}],"primary":{"type":"button","label":"Get started","href":"/quickstart"}},"footer":{"socials":{"x":"https://x.com/reticle_hq","github":"https://github.com/reticlehq/reticle","linkedin":"https://www.linkedin.com/company/reticlehq","discord":"https://discord.gg/BwAbzv9ZRz"},"links":[{"header":"Docs","items":[{"label":"Quickstart","href":"/quickstart"},{"label":"Usage guide","href":"/usage"},{"label":"Agent cheat sheet","href":"/agent-cheatsheet"},{"label":"For agents","href":"/for-agents"}]},{"header":"Project","items":[{"label":"Contributing","href":"https://github.com/reticlehq/reticle/blob/main/CONTRIBUTING.md"},{"label":"Security","href":"https://github.com/reticlehq/reticle/blob/main/SECURITY.md"},{"label":"License","href":"https://github.com/reticlehq/reticle/blob/main/LICENSE"}]},{"header":"Community","items":[{"label":"Discord","href":"https://discord.gg/BwAbzv9ZRz"},{"label":"Star on GitHub","href":"https://github.com/reticlehq/reticle"},{"label":"X","href":"https://x.com/reticle_hq"},{"label":"LinkedIn","href":"https://www.linkedin.com/company/reticlehq"}]}]},"search":{"prompt":"Search the Reticle docs"},"seo":{"metatags":{"og:site_name":"Reticle Docs","og:type":"website","og:title":"Reticle Docs: verification for AI coding agents","og:description":"Reticle verifies a running web app from the inside and returns a verdict with evidence, not a screenshot. Install it, instrument it, and read the full tool reference.","og:url":"https://docs.reticle.sh","og:image":"https://docs.reticle.sh/images/og.png","og:image:alt":"Reticle: your agent says it works. Reticle checks.","twitter:card":"summary_large_image","twitter:site":"@reticle_hq","twitter:creator":"@reticle_hq","twitter:image":"https://docs.reticle.sh/images/og.png"},"organization":{"name":"Reticle","url":"https://docs.reticle.sh","logo":"https://docs.reticle.sh/images/og.png","sameAs":["https://github.com/reticlehq/reticle","https://www.npmjs.com/org/reticlehq"]}},"styling":{"eyebrows":"breadcrumbs","codeblocks":"dark","latex":false},"errors":{"404":{"redirect":false,"title":"No such page","description":"That page moved or never existed. Start at [Getting started](/getting-started), or search above."}},"contextual":{"options":["copy","view","claude","chatgpt","cursor","vscode","mcp","add-mcp"],"display":"header"},"metadata":{"timestamp":true},"markdown":{"instructions":["Reticle is a verification layer for AI coding agents. Its SDK runs in development builds, and in staging or production only through the signed activate loader (see /production-mode). It reads program truth (network, state, console, routing, animations, framework state) from inside a running web app and returns a deterministic verdict with evidence. It is not a screenshot tool and not a browser automation library.","Verdicts come from `reticle_act_and_wait`, `reticle_assert`, `reticle_act { steps }` when a step declares `expect`, and `reticle_verify` (`change`/`flows`). Everything else moves or reads the app and proves nothing. Only `verified: \"yes\"` is a pass: `unknown` means Reticle could not tell, and `no-fault` means nothing was declared to prove. A drive that ends without a verdict has no result, however many tools it used. Never weaken a check to make it pass.","Package names are scoped `@reticlehq/*`. Run every CLI command as `npx @reticlehq/server \u003ccommand>`, for example `npx @reticlehq/server init`. `reticle` is a bin name that `@reticlehq/server` installs once it is on your PATH, NOT a package on npm: `npx reticle` fetches an unrelated package published by somebody else, so never run that. The complete tool surface is on the `/usage` page; `/agent-cheatsheet` is the one-screen version."]},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/reticlehq/reticle"},{"anchor":"Discord","icon":"discord","href":"https://discord.gg/BwAbzv9ZRz"},{"anchor":"npm","icon":"npm","href":"https://www.npmjs.com/org/reticlehq"},{"anchor":"Changelog","icon":"clock-rotate-left","href":"https://github.com/reticlehq/reticle/blob/main/CHANGELOG.md"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"reticle","hasAudioNarration":false,"actualSubdomain":"reticle","customDomains":["docs.reticle.sh"],"gitSource":{"type":"github","owner":"reticlehq","repo":"reticle","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"feedback":{"agentFeedback":true},"entitlements":{},"buildId":"6af6d48d77407407f8d957ce","clientVersion":"0.0.4124","searchFilterCounts":[{"language":"default","tag":"Reference","count":68},{"language":"default","tag":"CLI commands","count":26},{"language":"default","tag":"Guides","count":25},{"language":"default","tag":"Tools","count":19},{"language":"default","tag":"Packages","count":14},{"language":"default","tag":"Resources","count":12},{"language":"default","tag":"Get started","count":6},{"language":"default","tag":"Install","count":6},{"language":"default","tag":"Long form","count":5},{"language":"default","tag":"Verify and ship","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#footer a.select-none::after{content:'Your agent says it works. Reticle checks.';display:block;margin-top:0.75rem;font-size:0.875rem;line-height:1.25rem;color:rgb(var(--gray-500))}.dark #footer a.select-none::after{color:rgb(var(--gray-400))}"}],"page":{"pagePath":"packages/babel-plugin","slug":"/packages/babel-plugin","pageMetadata":{"title":"@reticlehq/babel-plugin","description":"A Babel plugin that stamps data-reticle-source on JSX host elements so Reticle can name the file a node came from.","icon":"file-code","href":"/packages/babel-plugin"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"A Babel plugin that stamps data-reticle-source on JSX host elements so Reticle can name the file a node came from.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`@reticlehq/babel-plugin`}),` stamps `,_jsx(_components.code,{children:`data-reticle-source=\"file:line:col\"`}),` onto your JSX at build time, in dev only, so Reticle can name the file a DOM node came from. `,_jsx(_components.strong,{children:`You probably do not install this one directly`}),`: `,_jsx(_components.a,{href:`/packages/vite-plugin`,children:_jsx(_components.code,{children:`@reticlehq/vite-plugin`})}),` and `,_jsx(_components.a,{href:`/packages/next`,children:_jsx(_components.code,{children:`@reticlehq/next`})}),` both pull it in. Reach for it only if you drive Babel yourself.`]}),`\n`,_jsxs(_components.p,{children:[`React 19 dropped `,_jsx(_components.code,{children:`_debugSource`}),`, which is what source mapping used to rely on, so without this the tools can tell you the component name but not the file.`]}),`\n`,_jsx(_components.p,{children:_jsxs(_components.strong,{children:[`Apache 2.0. CommonJS. One runtime dependency, `,_jsx(_components.code,{children:`@reticlehq/core`}),` (for the attribute name). Peer dependency: `,_jsx(_components.code,{children:`@babel/core ^7`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-stamps`,children:`What it stamps`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`jsx`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`jsx`,children:_jsxs(_components.code,{language:`jsx`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`// src/components/Login.jsx`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:` Login`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`submit`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` }) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#808080`,\"--shiki-dark\":`#808080`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`button`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` onClick`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`submit`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#808080`,\"--shiki-dark\":`#808080`},children:`>`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`Sign in`}),_jsx(_components.span,{style:{color:`#808080`,\"--shiki-dark\":`#808080`},children:`\u003c/`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`button`}),_jsx(_components.span,{style:{color:`#808080`,\"--shiki-dark\":`#808080`},children:`>`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`becomes, in dev only:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`jsx`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`jsx`,children:_jsxs(_components.code,{language:`jsx`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:` Login`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`submit`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` }) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` (`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#808080`,\"--shiki-dark\":`#808080`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`button`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` onClick`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`submit`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` data-reticle-source`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"src/components/Login.jsx:2:9\"`}),_jsx(_components.span,{style:{color:`#808080`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` Sign in`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#808080`,\"--shiki-dark\":`#808080`},children:` \u003c/`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`button`}),_jsx(_components.span,{style:{color:`#808080`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` );`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The path is relative to `,_jsx(_components.code,{children:`process.cwd()`}),`, with backslashes normalized to forward slashes. A file with no name stamps `,_jsx(_components.code,{children:`unknown`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-skips`,children:`What it skips`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Component tags. Only lowercase host elements are stamped, because a component’s own JSX gets stamped where it is defined.`}),`\n`,_jsxs(_components.li,{children:[`Lowercase tags that are not HTML or SVG elements, such as react-three-fiber’s `,_jsx(_components.code,{children:`\u003cmesh>`}),`. Only known DOM tags are stamped, because a custom renderer can crash on the attribute.`]}),`\n`,_jsxs(_components.li,{children:[`Files whose first non-empty line is a comment holding exactly `,_jsx(_components.code,{children:`@reticle-ignore`}),`.`]}),`\n`,_jsx(_components.li,{children:`Elements that already carry the attribute.`}),`\n`,_jsx(_components.li,{children:`Nodes with no location information.`}),`\n`,_jsxs(_components.li,{children:[`Anything whose tag name is not a plain `,_jsx(_components.code,{children:`JSXIdentifier`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`do-you-install-it`,children:`Do you install it?`}),`\n`,_jsxs(_components.p,{children:[`Only if you are wiring Babel yourself. `,_jsx(_components.a,{href:`/packages/vite-plugin`,children:_jsx(_components.code,{children:`@reticlehq/vite-plugin`})}),` and `,_jsx(_components.a,{href:`/packages/next`,children:_jsx(_components.code,{children:`@reticlehq/next`})}),` both pull it in.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` i`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` -D`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` @reticlehq/babel-plugin`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`the-export`,children:`The export`}),`\n`,_jsxs(_components.p,{children:[`One export, via `,_jsx(_components.code,{children:`export =`}),`. There are no named exports and no `,_jsx(_components.code,{children:`default`}),` interop wrapper, because Babel `,_jsx(_components.code,{children:`require()`}),`s the module and takes the object directly.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`function`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:` reticleSourcePlugin`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`types`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` }: { `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`types`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`typeof`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` BabelTypes`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` }): `}),_jsx(_components.span,{style:{color:`#4EC9B0`,\"--shiki-dark\":`#4EC9B0`},children:`PluginObj`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#4EC9B0`,\"--shiki-dark\":`#4EC9B0`},children:`PluginPass`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`>;`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The Babel plugin name is `,_jsx(_components.code,{children:`reticle-source`}),`. Its visitor handles `,_jsx(_components.code,{children:`Program`}),` (to read the ignore marker) and `,_jsx(_components.code,{children:`JSXOpeningElement`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`It takes no options.`}),` The plugin reads nothing from `,_jsx(_components.code,{children:`state.opts`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`wiring-it-by-hand`,children:`Wiring it by hand`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`// babel.config.cjs`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#4EC9B0`,\"--shiki-dark\":`#4EC9B0`},children:`module`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#4EC9B0`,\"--shiki-dark\":`#4EC9B0`},children:`exports`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` = {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` plugins:`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` process`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`env`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#4FC1FF`,\"--shiki-dark\":`#4FC1FF`},children:`NODE_ENV`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` === `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'development'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` ? [`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`require`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'@reticlehq/babel-plugin'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`)] : [],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`};`})}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Do not write `,_jsx(_components.code,{children:`require('@reticlehq/babel-plugin').default`}),`. With `,_jsx(_components.code,{children:`export =`}),` there is no `,_jsx(_components.code,{children:`.default`}),`,\nand an old README example got this wrong.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`why-an-attribute-rather-than-a-runtime-lookup`,children:`Why an attribute rather than a runtime lookup`}),`\n`,_jsxs(_components.p,{children:[`The stamp survives minification of everything else, costs nothing at runtime, and is readable from the DOM node itself. That is what lets `,_jsx(_components.a,{href:`/tools/inspect`,children:_jsx(_components.code,{children:`reticle_look { action: \"element\" }`})}),` answer with a file and a line rather than a component name and a shrug.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"@reticlehq/babel-plugin","description":"A Babel plugin that stamps data-reticle-source on JSX host elements so Reticle can name the file a node came from.","icon":"file-code","href":"/packages/babel-plugin"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What it stamps","slug":"what-it-stamps","depth":2,"children":[]},{"title":"What it skips","slug":"what-it-skips","depth":2,"children":[]},{"title":"Do you install it?","slug":"do-you-install-it","depth":2,"children":[]},{"title":"The export","slug":"the-export","depth":2,"children":[]},{"title":"Wiring it by hand","slug":"wiring-it-by-hand","depth":2,"children":[]},{"title":"Why an attribute rather than a runtime lookup","slug":"why-an-attribute-rather-than-a-runtime-lookup","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"reticle","siteName":"Reticle","title":"Reticle Docs: verification for AI coding agents","navMaps":{"firstHrefInVersion":{"3.9.0":{"href":"/packages/babel-plugin","matchLevel":0}},"firstHrefInLanguage":{}},"lastModified":"2026-10-12T21:19:09.192Z","gitLastModified":"2026-10-12T21:08:04.000Z","originalFileLocation":"packages/babel-plugin.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"A Babel plugin that stamps data-reticle-source on JSX host elements so Reticle can name the file a node came from.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Reticle\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/reticle/KCHC-1Uhb39vqD4T/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/reticle/KCHC-1Uhb39vqD4T/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/reticle/KCHC-1Uhb39vqD4T/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/reticle/KCHC-1Uhb39vqD4T/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/reticle/KCHC-1Uhb39vqD4T/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/reticle/KCHC-1Uhb39vqD4T/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/reticle/KCHC-1Uhb39vqD4T/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/reticle/KCHC-1Uhb39vqD4T/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/reticle/KCHC-1Uhb39vqD4T/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Reticle Docs: verification for AI coding agents\">\u003cmeta data-mint-head property=\"og:description\" content=\"Reticle verifies a running web app from the inside and returns a verdict with evidence, not a screenshot. Install it, instrument it, and read the full tool reference.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Reticle Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.reticle.sh/packages/babel-plugin\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.reticle.sh/images/og.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Reticle Docs: verification for AI coding agents\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Reticle verifies a running web app from the inside and returns a verdict with evidence, not a screenshot. Install it, instrument it, and read the full tool reference.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.reticle.sh/images/og.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/reticle/KCHC-1Uhb39vqD4T/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Reticle\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#ff9d86\">\u003cmeta data-mint-head name=\"og:image:alt\" content=\"Reticle: your agent says it works. Reticle checks.\">\u003cmeta data-mint-head name=\"twitter:creator\" content=\"@reticle_hq\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.reticle.sh/packages/babel-plugin\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/packages/babel-plugin.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.reticle.sh/#organization\",\"name\":\"Reticle\",\"url\":\"https://docs.reticle.sh\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://docs.reticle.sh/images/og.png\"},\"sameAs\":[\"https://github.com/reticlehq/reticle\",\"https://www.npmjs.com/org/reticlehq\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.reticle.sh#website\",\"name\":\"Reticle\",\"url\":\"https://docs.reticle.sh\",\"publisher\":{\"@id\":\"https://docs.reticle.sh/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.reticle.sh/packages/babel-plugin#webpage\",\"url\":\"https://docs.reticle.sh/packages/babel-plugin\",\"name\":\"@reticlehq/babel-plugin\",\"description\":\"A Babel plugin that stamps data-reticle-source on JSX host elements so Reticle can name the file a node came from.\",\"dateModified\":\"2026-10-12T21:08:04.000Z\",\"isPartOf\":{\"@id\":\"https://docs.reticle.sh#website\"},\"breadcrumb\":{\"@id\":\"https://docs.reticle.sh/packages/babel-plugin#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.reticle.sh/packages/babel-plugin#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Packages\",\"item\":\"https://docs.reticle.sh/packages\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"@reticlehq/babel-plugin\",\"item\":\"https://docs.reticle.sh/packages/babel-plugin\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.reticle.sh/packages/babel-plugin#article\",\"headline\":\"@reticlehq/babel-plugin\",\"name\":\"@reticlehq/babel-plugin\",\"description\":\"A Babel plugin that stamps data-reticle-source on JSX host elements so Reticle can name the file a node came from.\",\"url\":\"https://docs.reticle.sh/packages/babel-plugin\",\"mainEntityOfPage\":{\"@id\":\"https://docs.reticle.sh/packages/babel-plugin#webpage\"},\"image\":\"https://docs.reticle.sh/images/og.png\",\"dateModified\":\"2026-10-12T21:08:04.000Z\",\"publisher\":{\"@id\":\"https://docs.reticle.sh/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.reticle.sh#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Reticle\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Reticle\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/packages/babel-plugin.md","siteName":"Reticle","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/reticlehq/reticle"},{"anchor":"Discord","icon":"discord","href":"https://discord.gg/BwAbzv9ZRz"},{"anchor":"npm","icon":"npm","href":"https://www.npmjs.com/org/reticlehq"},{"anchor":"Changelog","icon":"clock-rotate-left","href":"https://github.com/reticlehq/reticle/blob/main/CHANGELOG.md"}]},"versions":[{"version":"3.9.0","default":true,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/quickstart"}]},{"tab":"Reference","groups":[{"group":"Tools","pages":[{"title":"Reticle tools overview","sidebarTitle":"Tools overview","icon":"wrench","href":"/tools/overview"},{"title":"reticle_look","icon":"magnifying-glass","href":"/tools/look"},{"title":"reticle_verify","icon":"shield-check","href":"/tools/verify"},{"title":"reticle_snapshot","icon":"camera","href":"/tools/snapshot"},{"title":"reticle_query","icon":"magnifying-glass","href":"/tools/query"},{"title":"reticle_look { action: \"element\" }","icon":"crosshairs","href":"/tools/inspect"},{"title":"reticle_navigate","icon":"compass","href":"/tools/navigate"},{"title":"reticle_act","icon":"hand-pointer","href":"/tools/act"},{"title":"reticle_act_and_wait","icon":"circle-check","href":"/tools/act-and-wait"},{"title":"reticle_act_sequence","icon":"layer-group","href":"/tools/act-sequence"},{"title":"reticle_observe","icon":"timeline","href":"/tools/observe"},{"title":"reticle_network","icon":"satellite-dish","href":"/tools/network"},{"title":"reticle_console","icon":"terminal","href":"/tools/console"},{"title":"reticle_state","icon":"database","href":"/tools/state"},{"title":"reticle_wait_for","icon":"hourglass","href":"/tools/wait-for"},{"title":"reticle_assert","icon":"gavel","href":"/tools/assert"},{"title":"reticle_sessions","icon":"list-check","href":"/tools/sessions"},{"title":"reticle_tools and reticle_run","icon":"boxes-stacked","href":"/tools/tools-and-run"},{"title":"reticle_session and reticle_feedback","icon":"comments","href":"/tools/session-and-feedback"}]},{"group":"Beyond the loop","pages":[{"title":"Beyond the verify loop","icon":"sparkles","href":"/capabilities"}]},{"group":"CLI commands","pages":[{"title":"CLI reference","icon":"terminal","href":"/cli"},{"title":"reticle init","icon":"wand-magic-sparkles","href":"/cli/init"},{"title":"reticle setup mcp","icon":"plug","href":"/cli/setup"},{"title":"reticle doctor","icon":"stethoscope","href":"/cli/doctor"},{"title":"reticle status","icon":"heart-pulse","href":"/cli/status"},{"title":"reticle serve","icon":"play","href":"/cli/serve"},{"title":"reticle stop","icon":"circle-stop","href":"/cli/stop"},{"title":"reticle serve --restart","icon":"rotate","href":"/cli/restart"},{"title":"reticle mcp","icon":"plug","href":"/cli/mcp"},{"title":"reticle open","icon":"window-maximize","href":"/cli/open"},{"title":"reticle drive","icon":"gauge-high","href":"/cli/drive"},{"title":"reticle verify","icon":"circle-check","href":"/cli/verify"},{"title":"reticle compare","icon":"code-compare","href":"/cli/compare"},{"title":"reticle try","icon":"play","href":"/cli/try"},{"title":"reticle gate --list","icon":"code-branch","href":"/cli/affected"},{"title":"reticle gate","icon":"shield-halved","href":"/cli/gate"},{"title":"reticle report","icon":"clipboard-check","href":"/cli/report"},{"title":"reticle update","icon":"arrow-up","href":"/cli/update"},{"title":"reticle update --rollback","icon":"arrow-rotate-left","href":"/cli/rollback"},{"title":"License status","icon":"key","href":"/cli/license"},{"title":"reticle version","icon":"tag","href":"/cli/version"},{"title":"reticle telemetry","icon":"chart-line","href":"/cli/telemetry"},{"title":"reticle feedback","icon":"comment","href":"/cli/feedback"},{"title":"reticle help","icon":"circle-question","href":"/cli/help"},{"title":"reticle cloud commands","icon":"cloud","href":"/cli/cloud"},{"title":"Environment variables","icon":"sliders","href":"/environment"}]},{"group":"Packages","pages":[{"title":"Packages: what is in the box","sidebarTitle":"Packages","icon":"cubes","href":"/packages"},{"title":"open-verification","icon":"scale-balanced","href":"/packages/open-verification"},{"title":"@reticlehq/core","icon":"cube","href":"/packages/core"},{"title":"@reticlehq/engine","icon":"gavel","href":"/packages/engine"},{"title":"@reticlehq/browser","icon":"window","href":"/packages/browser"},{"title":"@reticlehq/server","icon":"server","href":"/packages/server"},{"title":"@reticlehq/react","icon":"react","href":"/packages/react"},{"title":"@reticlehq/vite-plugin","description":"One line in vite.config.ts that stamps source locations on your JSX and auto-injects reticle.connect().","icon":"bolt","href":"/packages/vite-plugin"},{"title":"@reticlehq/babel-plugin","icon":"file-code","href":"/packages/babel-plugin"},{"title":"@reticlehq/next","description":"Next.js source mapping for Reticle without giving up SWC, via a dev-only loader.","icon":"n","href":"/packages/next"},{"title":"@reticlehq/test","icon":"vial","href":"/packages/test"},{"title":"@reticlehq/eslint-plugin","icon":"shield-check","href":"/packages/eslint-plugin"},{"title":"@reticlehq/electron","icon":"display","href":"/packages/electron"},{"title":"reticle-tauri","icon":"rust","href":"/packages/tauri"}]},{"group":"Grammar","pages":[{"title":"Predicate reference: the grammar of green","sidebarTitle":"Predicates","icon":"filter","href":"/predicates"},{"title":"Action reference: lights, camera, click","sidebarTitle":"Actions","icon":"hand-pointer","href":"/actions"},{"title":"Recipes: copy, paste, verify","sidebarTitle":"Recipes","icon":"book-open","href":"/recipes"}]},{"group":"Long form","pages":[{"title":"Agent cheat sheet","icon":"bolt","href":"/agent-cheatsheet"},{"title":"Reticle: what each tool actually does","icon":"table-list","href":"/reticle-manual"},{"title":"Complete usage guide","icon":"book","href":"/usage"},{"title":"Let Reticle drive","icon":"steering-wheel","href":"/autodrive"},{"title":"FAQ: frequently asserted questions","sidebarTitle":"FAQ","icon":"circle-question","href":"/faq"}]}]},{"tab":"Desktop","pages":[{"title":"Desktop","href":"/desktop"}]},{"tab":"Resources","pages":[{"title":"Resources","href":"/architecture"}]},{"tab":"Contributing","pages":[{"title":"Contributing","href":"/first-drive"}]}]}]},"basePath":"","title":"Reticle Docs: verification for AI coding agents","buildId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","deploymentId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","dynamics":[],"chunks":[]}