diff --git a/blog/cli-and-skill.mdx b/blog/cli-and-skill.mdx
new file mode 100644
index 00000000..69be8266
--- /dev/null
+++ b/blog/cli-and-skill.mdx
@@ -0,0 +1,8 @@
+---
+title: Testplane CLI and Skill
+slug: cli-and-skill
+hide_table_of_contents: false
+date: 2026-05-05T17:00
+---
+
+asdf
diff --git a/blog/testplane-vs-playwright.mdx b/blog/testplane-vs-playwright.mdx
index 4f50a7fc..7e1c5c33 100644
--- a/blog/testplane-vs-playwright.mdx
+++ b/blog/testplane-vs-playwright.mdx
@@ -12,6 +12,8 @@ import Admonition from "@theme/Admonition";
И **Testplane**, и **Playwright** — это решения для end-to-end тестирования, но они имеют разные подходы и возможности. В этой статье мы проведём детальное сравнение этих инструментов, чтобы помочь вам сделать правильный выбор.
+
+
## Краткий обзор инструментов
**Testplane** — это инструмент для автоматизации тестирования веб-приложений, разработанный командой Яндекса. Он активно используется как в крупных, так и в небольших проектах компании и поддерживает широкий спектр браузеров и устройств.
diff --git a/docs/ai/overview.mdx b/docs/ai/overview.mdx
new file mode 100644
index 00000000..4e0c8da6
--- /dev/null
+++ b/docs/ai/overview.mdx
@@ -0,0 +1,163 @@
+---
+sidebar_position: 1
+sidebar_label: Overview
+title: Testplane's AI Tools
+---
+
+import { HelpMark } from "@site/src/components/HelpMark";
+
+# Testplane's AI Tools
+
+Testplane provides a set of AI integration tools that help agents write, inspect, debug, and fix your Testplane tests.
+
+The goal of these tools is to turn a generic coding agent into Testplane expert that understands how Testplane projects are usually structured, how tests should be written, and how failures should be investigated.
+
+## Capabilities
+
+- Let AI agents explore your app and "see" what's happening through token-efficient DOM snapshots
+- Generate new tests based on the actual application state
+- See how agents follow best practices when writing tests out of the box
+- Handle authentication without reading secrets
+- Enable agents investigate failures from CI reports
+- Let agents debug tests via REPL
+
+## Available Tools
+
+[Testplane Skill](../toolkit/testplane-skill) teaches AI agents how to work with Testplane projects end to end, how to use `@testplane/cli`. It's packed with best practices and comprehensive documentation that agents can make use of.
+
+[Testplane CLI](../toolkit/testplane-cli) is what powers the Testplane Skill and makes browser automation accessible right from the CLI.
+
+[Testplane MCP](../toolkit/testplane-mcp) matches the capabilities of `@testplane/cli`, but offers another way to interact with the browser: through the MCP protocol.
+
+## Which tool to use?
+
+If unsure, prefer Testplane Skill. It works great for most workflows and is the best pick overall: coding agents love CLIs, it's token-efficient and provides enough context about all things Testplane.
+
+
+
+
+
+ Skill
+ CLI
+ MCP
+
+
+
+
+ **How it works**
+
+ LLM reads a markdown file with instructions, reaches out to `@testplane/cli` for
+ browser automation
+
+ LLM runs shell commands to interact with the browser
+ LLM interacts with the browser via MCP tool calls
+
+
+ **Token efficiency**
+ High, progressive discovery
+ High, concise CLI calls
+
+ Lower, depends on the agent harness{" "}
+
+ Some agents harnesses may load all MCP tool schemas at once, polluting the
+ context and spending tokens.
+
+
+ Some tools, however, optimise this step by pre-generating tool schemas and loading
+ them lazily, in which case token usage is comparable to CLI tools.
+
+
+
+
+ **Default browser mode**
+ Headless
+ Headless
+ Headful
+
+
+ **Supported scenarios**
+
+ Complex workflows + browser automation{" "}
+
+ Besides offering browser automation capabilities, skill teaches agents how to
+ handle auth, debugging, choose best code style, understand common Testplane
+ patterns and more.
+
+
+ Interaction with browser, reports inspection
+ Same as CLI
+
+
+
+
+## Comparison with other solutions
+
+Overall, we recommend using Testplane AI toolkit when working with Testplane projects, because it was designed specifically around this use case and provides deep integrations with Testplane ecosystem, allowing agents to:
+
+- Read what Testplane code that was run on each Testplane CLI/MCP tool call and copy+paste it when writing tests
+- Analyze Testplane reports (both local and from CI) and fix failed tests
+- Inspect Time Travel snapshots to debug what went wrong and adjust tests as your app evolves
+- Debug tests with agents-friendly REPL debugger
+- Understand Testplane's capabilities and usage patterns through concise reference in Testplane Skill
+
+We've studied other tools for agentic browser automation — below is a brief comparison of the most notable projects in the field, hopefully helping you navigate through possible options.
+
+### Built-in browser in Cursor, CC, Cline, etc.
+
+[Cursor's Browser](https://cursor.com/docs/agent/tools/browser) and [Cline's Browser Automation](https://docs.cline.bot/tools-reference/browser-automation) are built-in ways to interact with the browser, providing tools for navigation, taking page snapshots, various interactions and reading browser's console logs.
+
+Cursor's built-in browser has a neat design sidebar that allows you to quickly modify your app's design and point at certain elements when writing prompts.
+
+However, these tools have major limitations when trying to use them for web apps testing:
+
+- Cline doesn't have DOM snapshot tool at all — it relies solely on screenshots
+- Cursor's snapshot tool returns accessibility tree which lacks CSS classes, almost all HTML attributes and has a flat structure, losing all DOM hierarchy data
+- They offer very limited support for browsers: only Chrome with no mobile emulation and no special capabilities
+- No way of securely handling auth data
+
+### Playwright
+
+[Playwright CLI](https://github.com/microsoft/playwright-cli) is a powerful and popular tool for browser automation. Its notable features include network requests inspection and devtools capabilities.
+
+The main limitations are:
+
+- No report analysis, Time Travel snapshot inspection, or REPL debugging
+- Tool responses are focused on Playwright code, which may confuse agents working with Testplane
+- Snapshots are based on accessibility trees, without CSS classes, precise DOM structure, or many useful HTML attributes
+
+Playwright CLI is a popular choice, but it lacks several features that unlock powerful workflows and it doesn't have the Testplane-specific context.
+
+### Chrome DevTools MCP
+
+[Chrome Devtools MCP](https://github.com/ChromeDevTools/chrome-devtools-mcp) besides regular browser tools provides niche features like taking memory snapshots and browser extension management.
+
+For Testplane projects, the main limitations are:
+
+- It is specific to Chrome
+- Snapshots are based on the accessibility tree, without CSS classes or precise DOM structure
+- It doesn't integrate with Testplane tooling, reports, Time Travel snapshots, or the Testplane REPL
+
+Overall, it provides deep low-level integration with Chrome's devtools capabilities, but is not focused on web apps testing and doesn't have integrations with testplane tooling.
+
+### Vercel's agent-browser
+
+Vercel's [agent-browser](https://github.com/vercel-labs/agent-browser) is a generic browser automation, with a large set of tools, including network inspection and profiling.
+
+Its strength is flexibility, but it is not tied to any particular test runner or testing workflow.
+
+For Testplane usage, this means:
+
+- It is not focused specifically on web app testing
+- Snapshots are based on accessibility trees
+- It doesn't integrate with Testplane tooling, reports, Time Travel snapshots, or the Testplane REPL
+
+agent-browser can be useful for general browser automation, but it lacks the Testplane-specific integrations agents need to write, debug, and fix tests effectively.
+
+## Staying informed
+
+Stumbled upon a bug, have a question or an idea? Let us now:
+
+- [Telegram](https://t.me/testplane)
+- [GitHub](https://github.com/gemini-testing/testplane)
+
+You can track new releases [over here](https://github.com/gemini-testing/testplane-mcp/releases).
diff --git a/docs/ai/toolkit/_category_.json b/docs/ai/toolkit/_category_.json
new file mode 100644
index 00000000..d508b663
--- /dev/null
+++ b/docs/ai/toolkit/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "Toolkit",
+ "collapsed": false
+}
diff --git a/docs/ai/toolkit/testplane-cli.mdx b/docs/ai/toolkit/testplane-cli.mdx
new file mode 100644
index 00000000..0ace2122
--- /dev/null
+++ b/docs/ai/toolkit/testplane-cli.mdx
@@ -0,0 +1,357 @@
+# Testplane CLI
+
+Testplane CLI lets you control a real browser from the terminal with Testplane APIs.
+
+You can open pages, click through flows, capture compact DOM snapshots, inspect console logs, save auth state, debug Testplane reports, and replay Time Travel snapshots. It is useful on its own, and it is also the browser/report engine behind Testplane Skill.
+
+## Installation
+
+Install it in your project:
+
+```shell
+npm install --save-dev @testplane/cli
+```
+
+Then run it with:
+
+```shell
+npx @testplane/cli --help
+```
+
+## Typical flow
+
+The simplest session starts with `navigate`. If there is no browser yet, the CLI starts one automatically.
+
+```shell
+npx @testplane/cli navigate https://example.com
+npx @testplane/cli snapshot
+```
+
+By default, CLI browsers run headless. If you want to watch the browser while debugging, launch it first:
+
+```shell
+npx @testplane/cli launch --headless false
+npx @testplane/cli navigate http://localhost:3000
+```
+
+When you are done:
+
+```shell
+npx @testplane/cli close-browser
+```
+
+If you don't close the browser, it will be closed after 5 minutes of inactivity by default.
+
+## What the output looks like
+
+Most browser commands return three useful pieces of information: the action result, equivalent Testplane code, and the current browser state.
+
+```text
+Successfully navigated to https://example.com
+
+## Testplane Code
+
+await browser.openAndWait("https://example.com");
+
+## Browser Tabs
+
+ 1. Title: Example Domain; URL: https://example.com/ (current)
+
+## Current Tab Snapshot
+
+The snapshot was saved to: /tmp/.testplane/snapshots/2026-05-14T21-24-40-811Z.yml
+```
+
+Snapshots are optimized for humans and agents reading terminal output. They omit noisy tags and attributes by default, truncate very long text, and save large snapshots to a temp file instead of filling your terminal.
+
+## Navigating and inspecting pages
+
+Use `navigate` with a custom timeout for slow local apps or CI environments:
+
+```shell
+npx @testplane/cli navigate http://localhost:3000 --timeout 60000
+```
+
+Use `snapshot` to understand the page structure:
+
+```shell
+npx @testplane/cli snapshot
+```
+
+You can tune the snapshot when the default output hides something useful:
+
+```shell
+npx @testplane/cli snapshot --include-attrs data-qa href class --max-text-length 200
+```
+
+Use `screenshot` when you need visual evidence:
+
+```shell
+npx @testplane/cli screenshot ./tmp/page.png
+```
+
+For most test debugging, start with `snapshot`. It is faster to read, easier to search, and usually enough to find the selector or state you need.
+
+## Interacting with elements
+
+Commands accept either a selector or semantic Testing Library-style options.
+
+```shell
+npx @testplane/cli click '[data-testid="submit"]'
+npx @testplane/cli click --role button --name "Submit"
+npx @testplane/cli type --label-text "Email" --value "user@example.com"
+npx @testplane/cli wait --text "Saved" --timeout 5000
+```
+
+For native `` elements:
+
+```shell
+npx @testplane/cli select "#country" --visible-text "Germany"
+npx @testplane/cli select --label-text "Country" --value de
+npx @testplane/cli select --label-text "Country" --index 2
+```
+
+After an action, the CLI reports the resulting browser state. This is useful when a click triggers navigation or replaces the element you just interacted with.
+
+## Console logs
+
+`console` reads browser-side console messages from Chromium-based sessions. It returns only messages that have not been returned by a previous `console` call in the same session.
+
+```shell
+npx @testplane/cli navigate https://stackoverflow.com/questions/10175445/load-page-on-selection-from-dropdown-form
+npx @testplane/cli console
+```
+
+Example:
+
+```text
+Retrieved 8 unseen browser console messages
+
+1. [2026-05-14T22:23:40.793Z] WARNING (security): Error with Feature-Policy header: Unrecognized feature: 'speaker'.
+2. [2026-05-14T22:23:43.883Z] SEVERE (other): Not signed in with the identity provider.
+3. [2026-05-14T22:23:44.059Z] SEVERE (javascript): Access to fetch at 'https://id5-sync.com/api/config/prebid' from origin 'https://stackoverflow.com' has been blocked by CORS policy.
+4. [2026-05-14T22:23:44.059Z] SEVERE (network): Failed to load resource: net::ERR_FAILED
+```
+
+This is handy when a page looks fine in a snapshot but the app is failing in JavaScript, loading a blocked resource, or logging useful runtime errors.
+
+## Using tabs
+
+Use tab commands when a flow opens a new page.
+
+```shell
+npx @testplane/cli list-tabs
+npx @testplane/cli new-tab http://localhost:3000/settings
+npx @testplane/cli switch-tab 1
+npx @testplane/cli close-tab 2
+```
+
+## Auth state
+
+For authenticated flows, you can save and restore browser state.
+
+```shell
+npx @testplane/cli save-state ./tmp/auth-state.json
+npx @testplane/cli restore-state ./tmp/auth-state.json
+```
+
+The state can include cookies, localStorage, and sessionStorage. You can disable parts you do not need:
+
+```shell
+npx @testplane/cli save-state ./tmp/auth-state.json --cookies false
+```
+
+Treat the saved file as sensitive. It can contain real auth material, even though the command output only prints counts.
+
+`restore-state` refreshes the current page by default, so application code can immediately observe restored cookies and storage.
+
+## Running custom Testplane code
+
+When a built-in command is not enough, use `run-code`.
+
+```shell
+npx @testplane/cli run-code "await browser.getUrl()"
+npx @testplane/cli run-code "(browser) => browser.getTitle()"
+npx @testplane/cli run-code --file ./debug-script.js
+```
+
+Inline code can be a JavaScript expression, a small async body, or a function that receives `browser`.
+
+## Attaching to existing sessions
+
+If you run a Testplane test with `--keep-browser`, Testplane can print browser session data. Attach to that browser and inspect the state it left behind:
+
+```shell
+npx @testplane/cli attach --session '{"sessionId":"...","capabilities":{}}'
+npx @testplane/cli snapshot
+```
+
+This is useful when the test performs setup that is hard to reproduce manually, such as logging in, creating data, or navigating through a long flow.
+
+## REPL mode
+
+Suppose you've launched Testplane with repl enabled and a certain repl port:
+
+```
+npx testplane --grep 'test name' -b chrome-desktop --repl-before-test --repl-port 4444
+```
+
+Then CLI can attach to that Testplane REPL session:
+
+```shell
+npx @testplane/cli attach-repl --port 4444
+```
+
+In REPL mode, the CLI currently supports two actions:
+
+```shell
+npx @testplane/cli snapshot
+npx @testplane/cli run-code "await browser.getUrl()"
+```
+
+The big advantage is that you stay inside your project runtime. That means `run-code` can use page objects, custom commands, fixtures, and helpers already available in the test process.
+
+## Reading Testplane HTML reports
+
+The report commands work with local report directories, report HTML files, `databaseUrls.json`, and remote report URLs.
+
+```shell
+npx @testplane/cli test-results ./html-report --status failed
+npx @testplane/cli inspect-result ./html-report --name "checkout submits order" --browser chrome
+```
+
+Useful filters:
+
+```shell
+npx @testplane/cli test-results ./html-report --grep checkout
+npx @testplane/cli test-results ./html-report --browser chrome --duration '>5s'
+npx @testplane/cli test-results ./html-report --grep-error "NoSuchElement"
+npx @testplane/cli test-results ./html-report --meta owner=qa --file 'src/**'
+```
+
+For large reports or using with scripts, you can save the filtered result set as JSON:
+
+```shell
+npx @testplane/cli test-results ./html-report --status failed --save-json
+```
+
+Remote reports are downloaded and cached automatically:
+
+```shell
+REPORT_URL="https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/new-ui.html"
+
+npx @testplane/cli test-results "$REPORT_URL" --limit 10 --fields name,status,browser,duration,file
+```
+
+This makes CI report triage scriptable from a terminal, without opening the full HTML UI first.
+
+## Time Travel snapshots
+
+If a report contains Testplane Time Travel data, you can inspect the DOM at a specific moment in the recorded run.
+
+```shell
+npx @testplane/cli time-travel-snapshot ./html-report \
+ --name "checkout submits order" \
+ --browser chrome \
+ --attempt 0 \
+ --time 250
+```
+
+The output includes the selected time, nearby test steps, and a DOM snapshot of the replayed page.
+
+Use `--diff-from` to compare two moments:
+
+```shell
+npx @testplane/cli time-travel-snapshot ./html-report \
+ --name "checkout submits order" \
+ --browser chrome \
+ --time 250 \
+ --diff-from 100
+```
+
+You can also inspect a snapshot zip directly:
+
+```shell
+npx @testplane/cli time-travel-snapshot --snapshot-file ./snapshot.zip --time 100
+```
+
+Time Travel is especially useful when a failure happened in CI and the live browser is gone. You can still inspect what the app looked like when the test was running.
+
+## Custom browser configuration
+
+Use `launch` when you need a visible browser, a specific viewport, mobile emulation, or a custom Selenium grid.
+
+```shell
+npx @testplane/cli launch --headless false --window-size '{"width":1280,"height":720}'
+```
+
+Mobile emulation example:
+
+```shell
+npx @testplane/cli launch --desired-capabilities '{
+ "browserName": "chrome",
+ "goog:chromeOptions": {
+ "mobileEmulation": {
+ "deviceMetrics": {
+ "width": 360,
+ "height": 800,
+ "pixelRatio": 1
+ }
+ }
+ }
+}'
+```
+
+By default, `grid-url` is `local`, which lets Testplane manage Chrome and Firefox automatically. For other browsers, start the driver or Selenium grid yourself and pass its URL:
+
+```shell
+npx @testplane/cli launch --grid-url http://localhost:4444/wd/hub
+```
+
+## Common workflows
+
+Debug a selector:
+
+```shell
+npx @testplane/cli navigate http://localhost:3000/profile
+npx @testplane/cli snapshot --include-attrs data-qa aria-label
+npx @testplane/cli click --role button --name "Edit profile"
+npx @testplane/cli snapshot
+```
+
+Reuse login state:
+
+```shell
+npx @testplane/cli navigate http://localhost:3000/login
+# log in with commands or manually in a headful session
+npx @testplane/cli save-state ./tmp/auth-state.json
+npx @testplane/cli close-browser
+npx @testplane/cli navigate http://localhost:3000/dashboard
+npx @testplane/cli restore-state ./tmp/auth-state.json
+```
+
+Triage a CI report:
+
+```shell
+npx @testplane/cli test-results "$REPORT_URL" --status failed --fields name,browser,error
+npx @testplane/cli inspect-result "$REPORT_URL" --name "full test name" --browser chrome
+npx @testplane/cli time-travel-snapshot "$REPORT_URL" --name "full test name" --browser chrome --time 1000
+```
+
+Attach after a failing test:
+
+```shell
+npx testplane tests/checkout.testplane.ts --grep "submits order" --keep-browser
+npx @testplane/cli attach --session '{"sessionId":"...","capabilities":{}}'
+npx @testplane/cli snapshot
+```
+
+## When in doubt
+
+Each command comes with rich help information as well as usage examples — you can always ask the CLI to learn more about any of the commands:
+
+```shell
+npx @testplane/cli --help
+npx @testplane/cli click --help
+npx @testplane/cli test-results --help
+```
diff --git a/docs/testplane-mcp.mdx b/docs/ai/toolkit/testplane-mcp.mdx
similarity index 100%
rename from docs/testplane-mcp.mdx
rename to docs/ai/toolkit/testplane-mcp.mdx
diff --git a/docs/ai/toolkit/testplane-skill.mdx b/docs/ai/toolkit/testplane-skill.mdx
new file mode 100644
index 00000000..1ceb35fe
--- /dev/null
+++ b/docs/ai/toolkit/testplane-skill.mdx
@@ -0,0 +1,40 @@
+# Testplane Skill
+
+Testplane Skill provides AI agents concise reference documentation along with scripts for browser automation and Testplane tooling integrations.
+
+## Getting Started
+
+We recommend using a wonderful setup wizard by [skills.sh](https://www.skills.sh/gemini-testing/testplane-skill/testplane-skill) to install Testplane Skill in your system:
+
+```shell
+npx skills add gemini-testing/testplane-skill
+```
+
+This works with Claude Code, Cursor, GitHub Copilot and any other agent harness with skills support.
+
+## Features
+
+Testplane Skill is based on our [CLI package](./testplane-cli.mdx), therefore it provides all browser interaction features the CLI has.
+Besides that, it teaches agents how to solve effectively various tasks:
+
+- What commands does Testplane have and how does it work overall
+- How to run CLI and interact with the browser
+- Where to look for config files and how to run tests
+- What best practices to follow when generating tests
+- How to debug tests locally via various tools, including REPL
+- How to investigate tests failed in CI runs and fix them
+
+## How It Works
+
+Testplane Skill is a set of instructions to AI agents + scripts for browser automation. It follows classic "progressive discovery" pattern to optimse tokens usage.
+
+Overall, a typical workflow looks like this:
+
+1. User asks an agent to do something related to Testplane tests
+2. Agent sees descriptions of all skills initially, user's request triggers Testplane Skill use
+3. Agent reads instructions packed into Testplane Skill
+4. Optionally, it reaches for `@testplane/cli` to interact with browser and enrich context with web app state
+
+## Next Steps
+
+- [Learn](./testplane-cli.mdx) the capabilities of Testplane CLI
diff --git a/docs/basic-guides/typescript-esm.mdx b/docs/basic-guides/typescript-esm.mdx
index de430e62..4592752a 100644
--- a/docs/basic-guides/typescript-esm.mdx
+++ b/docs/basic-guides/typescript-esm.mdx
@@ -119,4 +119,4 @@ You can read more about this in the [custom commands](https://testplane.io/docs/
#### System limitations
-To work with ESM, you’ll need `Node.js` version v22.0.0, v20.17.0, or higher. Interaction with `ECMAScript` is handled via the `require()` [function](https://nodejs.org/api/modules.html#loading-ecmascript-modules-using-require).
+To work with ESM, you’ll need `Node.js` version v22.0.0, v20.17.0, or higher. Interoperation of ESM and CommonJS code is possible thanks to a Node's feature, described in the [article](https://nodejs.org/api/modules.html#loading-ecmascript-modules-using-require).
diff --git a/docs/quickstart/running-tests.mdx b/docs/quickstart/running-tests.mdx
index 2b602877..cd5e6ef2 100644
--- a/docs/quickstart/running-tests.mdx
+++ b/docs/quickstart/running-tests.mdx
@@ -211,7 +211,7 @@ npx testplane --keep-browser --grep "Test name"
npx testplane --keep-browser-on-fail # only on failure
```
-Useful for checking DOM, cookies, or localStorage after test execution, and also in combination with [MCP](../testplane-mcp.mdx) to allow an AI agent to connect to an already prepared browser.
+Useful for checking DOM, cookies, or localStorage after test execution, and also in combination with [MCP](../ai/toolkit/testplane-mcp.mdx) to allow an AI agent to connect to an already prepared browser.
## Useful commands
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 83849062..646feaf5 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -99,6 +99,12 @@ const config: Config = {
position: "left",
label: "UI",
},
+ {
+ type: "docSidebar",
+ sidebarId: "ai",
+ position: "left",
+ label: "AI",
+ },
{ to: "/blog", label: "Blog", position: "left" },
{
type: "docsVersionDropdown",
diff --git a/i18n/en/docusaurus-plugin-content-blog/cli-and-skill.mdx b/i18n/en/docusaurus-plugin-content-blog/cli-and-skill.mdx
new file mode 100644
index 00000000..4eaa5262
--- /dev/null
+++ b/i18n/en/docusaurus-plugin-content-blog/cli-and-skill.mdx
@@ -0,0 +1,389 @@
+---
+title: Testplane CLI and Skill
+slug: cli-and-skill
+hide_table_of_contents: false
+date: 2026-05-15T17:00
+---
+
+Today, we're releasing a new set of tools for working with Testplane through AI agents: Testplane CLI, Testplane Skill, and major updates to the available interactions.
+
+
+
+{/* truncate */}
+
+## Testplane Skill
+
+The newly available skill teaches agents how to work with Testplane tests effectively, use browser through `@testplane/cli` and work with reports for debug.
+
+Add skill to your system with the following command:
+
+```shell
+npx skills add gemini-testing/testplane-skill
+```
+
+The skill is loaded by agents only when it is relevant, so it does pollute the context all the time.
+
+When test work starts, it gives the agent practical instructions, like: inspect the app before writing tests, prefer real selectors from the browser, reuse project helpers, avoid `browser.pause()`, open reports with `@testplane/cli` for debug, use the CLI to debug tests via REPL and more.
+
+It also teaches the agent to use `@testplane/cli` for browser exploration:
+
+```shell
+npx @testplane/cli navigate http://localhost:3000
+npx @testplane/cli click --role button --name "Save"
+npx @testplane/cli snapshot
+```
+
+That turns a fuzzy task like "fix this flaky checkout test" into a tighter loop. The agent can reproduce the page state, inspect the DOM, update the test, and rerun the narrowest relevant command.
+
+Learn more about Testplane Skill [in our docs](/docs/v8/ai/toolkit/testplane-skill) or visit the skill's page on [skills.sh](https://www.skills.sh/gemini-testing/testplane-skill/testplane-skill).
+
+## Testplane CLI
+
+Testplane CLI lets users and agents drive a browser from the terminal. It is also what powers the browser workflows in Testplane Skill.
+
+Install it in your project:
+
+```shell
+npm install --save-dev @testplane/cli
+```
+
+Or run it directly:
+
+```shell
+npx @testplane/cli@latest --help
+```
+
+By default, the CLI starts browsers in headless mode. If you want to watch the browser while debugging, launch a visible session first:
+
+```shell
+npx @testplane/cli launch --headless false
+```
+
+A basic browser session looks like this:
+
+```shell
+npx @testplane/cli navigate https://example.com
+npx @testplane/cli snapshot
+```
+
+
+Example navigation output
+
+```text
+Successfully navigated to https://example.com
+
+## Testplane Code
+
+await browser.openAndWait("https://example.com");
+
+## Browser Tabs
+
+ 1. Title: Example Domain; URL: https://example.com/ (current)
+
+## Current Tab Snapshot
+
+The snapshot was saved to: /tmp/.testplane/snapshots/2026-05-14T21-24-40-811Z.yml
+```
+
+
+
+
+Example snapshot output
+
+```text
+Page snapshot captured successfully
+
+## Current Tab Snapshot
+
+- body:
+ - div:
+ - h1 "Example Domain"
+ - p "This domain is for use in documentation examples without needing permission. Avoid use in operations..."
+ - p:
+ - a[href=https://iana.org/domains/example] "Learn more"
+```
+
+
+
+Snapshots are text-first and optimized for agents. They omit noisy tags and attributes by default, truncate very long text, and save large snapshots to a temp file instead of flooding the terminal.
+
+## HTML Reporter integration
+
+The new report tools let agents inspect [Testplane HTML reports](/docs/v8/html-reporter/overview) without opening the browser UI. They work with local reports and remote report URLs, including reports published from CI.
+
+Remote reports are downloaded and cached automatically. The agent can ask for failed tests, inspect a concrete attempt, and pull out the error, steps, images, metadata, and attachments that matter for the fix.
+
+```shell
+npx @testplane/cli test-results ./html-report --status failed --grep checkout
+npx @testplane/cli inspect-result ./html-report --name "checkout submits order" --browser chrome
+```
+
+
+Example test-results output from the CI report
+
+```text
+Test results in report: https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/new-ui.html
+Total tests: 133; total attempts: 133; matched tests: 133
+
+Total tests counts: passed: 133, failed: 0, muted: 0, retried: 0, skipped: 0
+Matched tests counts: passed: 133, failed: 0, muted: 0, retried: 0, skipped: 0
+
+Showing 1-4 of 133 matched test results.
+
+1. success | chrome | attempt 0 | 1.5s | common/error-group.testplane.js
+ testplane Error grouping should group errors
+2. success | chrome | attempt 0 | 1.7s | common/test-results-appearance.testplane.js
+ testplane Test results appearance Passed test should have green retry selector
+3. success | chrome | attempt 0 | 1.6s | common/test-results-appearance.testplane.js
+ testplane Test results appearance Test with diff should have pink retry selector
+4. success | chrome | attempt 0 | 1.4s | common/test-results-appearance.testplane.js
+ testplane Test results appearance Test with diff should display 3 images
+```
+
+
+
+
+Example inspect-result output
+
+```json
+{
+ "status": "success",
+ "browser": "chrome",
+ "attempt": 0,
+ "duration": 1503,
+ "file": "common/error-group.testplane.js",
+ "name": "testplane Error grouping should group errors",
+ "error": null,
+ "meta": {
+ "url": "http://host.docker.internal:8061/fixtures/testplane/report/",
+ "file": "common/error-group.testplane.js",
+ "sessionId": "c5e07ff0b8fdce82785dba4493f5c7b7"
+ },
+ "steps": [
+ {
+ "name": "setWindowSize",
+ "args": ["1280", "1024"],
+ "duration": 31
+ },
+ {
+ "name": "$",
+ "args": ["[data-qa=\"group-by-dropdown\"]"],
+ "duration": 0
+ },
+ {
+ "name": "click",
+ "args": [],
+ "duration": 79
+ }
+ ],
+ "images": [],
+ "attachments": [
+ {
+ "type": "snapshot",
+ "path": "snapshots/e632a64/chrome_1778547952338_0.zip",
+ "maxWidth": 1280,
+ "maxHeight": 1024
+ }
+ ]
+}
+```
+
+
+
+The full `inspect-result` response includes all recorded steps for the selected attempt. For an agent, this is usually enough to see what the test did before touching the test file.
+
+There is also a `time-travel-snapshot` command for reports with Testplane Time Travel data. It replays the snapshot at a selected moment and returns a DOM snapshot of that replayed page.
+
+```shell
+npx @testplane/cli time-travel-snapshot ./html-report \
+ --name "checkout submits order" \
+ --browser chrome \
+ --time 250 \
+ --diff-from 100
+```
+
+The same CI report can be inspected at a concrete moment from the test timeline:
+
+```shell
+npx @testplane/cli time-travel-snapshot "$REPORT_URL" \
+ --name "testplane Error grouping should group errors" \
+ --browser chrome \
+ --attempt 0 \
+ --time 1400 \
+ --include-attrs data-qa href class \
+ --max-text-length 80
+```
+
+
+Example time-travel-snapshot output
+
+```text
+Time travel snapshot captured
+
+## Source
+
+Report: https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/new-ui.html
+Test: testplane Error grouping should group errors
+Browser: chrome
+Attempt: 0
+Mode: report
+Snapshot source: https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/snapshots/e632a64/chrome_1778547952338_0.zip
+Events: 34
+Snapshot range: 1778547952408 (2026-05-12T01:05:52.408Z) - 1778547953911 (2026-05-12T01:05:53.911Z); total 1503ms
+
+## Selected Time
+
+Reason: provided offset 1400ms from first rrweb event
+Absolute timestamp: 1778547953808 (2026-05-12T01:05:53.808Z)
+Offset from first rrweb event: 1400ms
+Requested time: 1400 (offset)
+
+## Test Steps
+
+Times are offsets from the first rrweb event; use them as "time" values.
+- +1080ms..+1080ms $("[data-qa=\"group-by-dropdown\"]")
+- +1104ms..+1183ms click
+- +1184ms..+1184ms $("div=error")
+- +1199ms..+1282ms click
+- +1282ms..+1282ms $(".grouped-tests")
+- +1356ms..+1356ms $("span*=tests: 1")
+
+## Snapshot
+
+- body.report.g-root.g-root_theme_light:
+ - div#app:
+ - div.sticky-header__content:
+ - div.main-menu.container:
+ - div.select.select_type_group:
+ - div.g-select.group-by-dropdown:
+ - button[data-qa=group-by-dropdown role=combobox]:
+ - span.g-select-control__option-text "error"
+ - main.container:
+ - div.grouped-tests:
+ - div.tests-group.tests-group_collapsed:
+ - span.tests-group__name "image comparison failed"
+ - span.tests-group__count "( tests: 1, runs: 2 )"
+```
+
+
+
+This is useful when you have failed tests in CI report and want an agent to fix them in one go. The agent can inspect the replayed DOM, compare two points in time, and decide whether the test should change or the product behavior is broken.
+
+## REPL integration
+
+Testplane CLI can attach to a running Testplane REPL session:
+
+```shell
+npx @testplane/cli attach-repl --port 4444
+```
+
+After attaching, the CLI can capture snapshots and run Testplane code through the REPL:
+
+```shell
+npx @testplane/cli snapshot
+npx @testplane/cli run-code "await browser.getUrl()"
+```
+
+This is a useful debugging mode when a test has already driven the browser into the target state. An agent can attach, inspect the page, execute small pieces of Testplane code, and keep the original session alive.
+
+One of the strongest parts of REPL mode is that the agent stays inside your project runtime. That means it can use existing page objects, custom commands, fixtures, and helpers instead of reimplementing the same behavior from raw browser calls.
+
+## Auth handling
+
+The CLI now has browser state commands. Run them after opening or attaching a browser session:
+
+```shell
+npx @testplane/cli save-state ./tmp/auth-state.json
+npx @testplane/cli restore-state ./tmp/auth-state.json
+```
+
+The saved state can include cookies, localStorage, and sessionStorage. You can disable any part when saving:
+
+```shell
+npx @testplane/cli save-state ./tmp/auth-state.json --cookies false
+```
+
+This gives agents a safe way to reuse an authenticated browser state.
+
+The state file itself can contain sensitive material, so keep it out of git and use a short-lived local path.
+
+This is a new approach for dealing with auth and sensitive data besides existing flow where test code prepares browser and leaves it for agent via `--keep-browser` and REPL integration discussed above.
+
+## New browser interaction tools
+
+The interaction layer gained a few small but important pieces.
+
+`select` handles native `` elements:
+
+```shell
+npx @testplane/cli select "#country" --visible-text "Germany"
+npx @testplane/cli select --label-text "Country" --value de
+```
+
+`console` reads unseen browser console messages from Chromium-based sessions:
+
+```shell
+npx @testplane/cli console
+```
+
+
+Example console output
+
+```text
+Retrieved 5 unseen browser console messages
+
+## Testplane Code
+
+const consoleMessages = await browser.getLogs("browser");
+
+## Browser Tabs
+
+ 1. Title: javascript - Load page on selection from dropdown form - Stack Overflow; URL: https://stackoverflow.com/questions/10175445/load-page-on-selection-from-dropdown-form (current)
+
+## Additional Information
+
+1. [2026-05-14T22:23:40.793Z] WARNING (security): Error with Feature-Policy header: Unrecognized feature: 'speaker'.
+2. [2026-05-14T22:23:42.789Z] WARNING (console-api): "[GPT] PubAdsService.setForceSafeFrame is deprecated..."
+3. [2026-05-14T22:23:43.883Z] SEVERE (other): Not signed in with the identity provider.
+4. [2026-05-14T22:23:44.059Z] SEVERE (javascript): Access to fetch at 'https://id5-sync.com/api/config/prebid' from origin 'https://stackoverflow.com' has been blocked by CORS policy.
+5. [2026-05-14T22:23:44.059Z] SEVERE (network): Failed to load resource: net::ERR_FAILED
+```
+
+
+
+`navigate` accepts a timeout, which is useful for slow local apps and CI environments:
+
+```shell
+npx @testplane/cli navigate http://localhost:3000 --timeout 60000
+```
+
+Post-action navigation is handled more cleanly too. When a click or another action changes the page, the response is based on the resulting browser state, so the next snapshot reflects where the browser actually ended up.
+
+## Testplane MCP
+
+All of these features are available through Testplane MCP as well. The MCP server and the CLI both import the same shared `@testplane/tools` package, so their feature sets stay aligned.
+
+Use the MCP server in an MCP-compatible client with:
+
+```json
+{
+ "mcpServers": {
+ "testplane-mcp": {
+ "command": "npx",
+ "args": ["@testplane/mcp@latest"]
+ }
+ }
+}
+```
+
+Use the CLI when you want direct terminal control or a scriptable workflow. Use MCP when you want the same tools available inside your editor or assistant.
+
+In both cases, the important part is the same: agents can now work with real browser state and real Testplane report data, instead of guessing from source code alone.
+
+## What's next?
+
+We hope this supercharged toolkit helps you turn the messy parts of browser testing into something more observable, more debuggable, and a little more pleasant to work with.
+
+Try it on one real task: a failing report, a flaky test, or a page where selectors are hard to guess. Visit our [AI Toolkit Docs](/docs/v8/ai/toolkit/testplane-cli) page for more ideas, practical guidance, and examples of how these tools can fit into your workflow.
+
+If something still feels awkward — tell us, we are always happy to [hear your feedback](https://github.com/gemini-testing/testplane-mcp/issues).
diff --git a/i18n/en/docusaurus-plugin-content-blog/selectivity.mdx b/i18n/en/docusaurus-plugin-content-blog/selectivity.mdx
index 683cbfa0..c74f9a65 100644
--- a/i18n/en/docusaurus-plugin-content-blog/selectivity.mdx
+++ b/i18n/en/docusaurus-plugin-content-blog/selectivity.mdx
@@ -1,5 +1,5 @@
---
-title: Test run selectivity
+title: Test Run Selectivity
slug: selectivity-intro
hide_table_of_contents: false
date: 2025-12-03T14:00
diff --git a/i18n/en/docusaurus-plugin-content-blog/testplane-vs-playwright.mdx b/i18n/en/docusaurus-plugin-content-blog/testplane-vs-playwright.mdx
index 81d502c6..5e3238dd 100644
--- a/i18n/en/docusaurus-plugin-content-blog/testplane-vs-playwright.mdx
+++ b/i18n/en/docusaurus-plugin-content-blog/testplane-vs-playwright.mdx
@@ -12,6 +12,8 @@ import Admonition from "@theme/Admonition";
Both **Testplane** and **Playwright** are end-to-end testing solutions, but they have different approaches and capabilities. In this article, we'll conduct a detailed comparison of these tools to help you make the right choice.
+
+
## Brief Tool Overview
**Testplane** is a web application test automation tool developed by the Yandex team. It is actively used in both large and small company projects and supports a wide range of browsers and devices.
diff --git a/i18n/ru/docusaurus-plugin-content-blog/cli-and-skill.mdx b/i18n/ru/docusaurus-plugin-content-blog/cli-and-skill.mdx
new file mode 100644
index 00000000..07ea9eb4
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-blog/cli-and-skill.mdx
@@ -0,0 +1,387 @@
+---
+title: Testplane CLI и Skill
+slug: cli-and-skill
+hide_table_of_contents: false
+date: 2026-05-15T17:00
+---
+
+Сегодня мы рады представить новый набор инструментов для работы AI-агентов с Testplane: Testplane CLI, Testplane Skill и крупные обновления доступных возможностей.
+
+
+
+{/* truncate */}
+
+## Testplane Skill
+
+Данный skill рассказывает агентам, как эффективно работать с тестами Testplane, использовать браузер через `@testplane/cli` и работать с отчетами для отладки.
+
+Добавьте skill в систему командой:
+
+```shell
+npx skills add gemini-testing/testplane-skill
+```
+
+Skill загружается агентами только когда релевантен запросу, поэтому не засоряет контекст зря.
+
+При работе с тестами он дает агенту инструкции, например: исследовать приложение перед написанием тестов, использовать реальные селекторы из браузера, переиспользовать project helpers, избегать `browser.pause()`, открывать отчеты через `@testplane/cli` для отладки, использовать CLI для отладки тестов через REPL и многое другое.
+
+Также он учит агента использовать `@testplane/cli` для исследования браузера:
+
+```shell
+npx @testplane/cli navigate http://localhost:3000
+npx @testplane/cli click --role button --name "Save"
+npx @testplane/cli snapshot
+```
+
+Это превращает размытый запрос вроде "почини этот flaky checkout-тест" в более четкий цикл работы. Агент может воспроизвести состояние страницы, исследовать DOM, обновить тест и перезапустить самый узкий релевантный набор команд.
+
+Подробнее о Testplane Skill читайте [в документации](/docs/v8/ai/toolkit/testplane-skill) или на странице skill в [skills.sh](https://www.skills.sh/gemini-testing/testplane-skill/testplane-skill).
+
+## Testplane CLI
+
+Testplane CLI позволяет пользователям и агентам управлять браузером из терминала. Он также является основой браузерных workflow в Testplane Skill.
+
+Установите его в проект:
+
+```shell
+npm install --save-dev @testplane/cli
+```
+
+Или запускайте напрямую:
+
+```shell
+npx @testplane/cli@latest --help
+```
+
+По умолчанию CLI запускает браузеры в headless-режиме. Если хотите наблюдать браузер во время отладки, сначала запустите видимую сессию:
+
+```shell
+npx @testplane/cli launch --headless false
+```
+
+Базовая браузерная сессия выглядит так:
+
+```shell
+npx @testplane/cli navigate https://example.com
+npx @testplane/cli snapshot
+```
+
+
+Пример вывода команды navigate
+
+```text
+Successfully navigated to https://example.com
+
+## Testplane Code
+
+await browser.openAndWait("https://example.com");
+
+## Browser Tabs
+
+ 1. Title: Example Domain; URL: https://example.com/ (current)
+
+## Current Tab Snapshot
+
+The snapshot was saved to: /tmp/.testplane/snapshots/2026-05-14T21-24-40-811Z.yml
+```
+
+
+
+
+Пример вывода команды snapshot
+
+```text
+Page snapshot captured successfully
+
+## Current Tab Snapshot
+
+- body:
+ - div:
+ - h1 "Example Domain"
+ - p "This domain is for use in documentation examples without needing permission. Avoid use in operations..."
+ - p:
+ - a[href=https://iana.org/domains/example] "Learn more"
+```
+
+
+
+Snapshots в первую очередь текстовые и оптимизированы для агентов. Они по умолчанию убирают шумные теги и атрибуты, обрезают очень длинный текст и сохраняют большие снимки во временный файл вместо того, чтобы заливать терминал большим объемом вывода.
+
+## Интеграция с HTML Reporter
+
+Новая интеграция с HTML Reporter позволяет агентам исследовать [отчеты Testplane](/docs/v8/html-reporter/overview) с помощью CLI. Они работают как с локальными отчетами, так и удаленными — работать с отчетами из CI можно так же удобно, как и с локальными.
+
+Удаленные отчеты автоматически скачиваются и кэшируются. Агент может запросить упавшие тесты, исследовать конкретный прогон и посмотреть на ошибку, шаги, изображения, метаданные и вложения, которые важны для исправления.
+
+```shell
+npx @testplane/cli test-results ./html-report --status failed --grep checkout
+npx @testplane/cli inspect-result ./html-report --name "checkout submits order" --browser chrome
+```
+
+
+Пример вывода test-results для отчета из CI
+
+```text
+Test results in report: https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/new-ui.html
+Total tests: 133; total attempts: 133; matched tests: 133
+
+Total tests counts: passed: 133, failed: 0, muted: 0, retried: 0, skipped: 0
+Matched tests counts: passed: 133, failed: 0, muted: 0, retried: 0, skipped: 0
+
+Showing 1-4 of 133 matched test results.
+
+1. success | chrome | attempt 0 | 1.5s | common/error-group.testplane.js
+ testplane Error grouping should group errors
+2. success | chrome | attempt 0 | 1.7s | common/test-results-appearance.testplane.js
+ testplane Test results appearance Passed test should have green retry selector
+3. success | chrome | attempt 0 | 1.6s | common/test-results-appearance.testplane.js
+ testplane Test results appearance Test with diff should have pink retry selector
+4. success | chrome | attempt 0 | 1.4s | common/test-results-appearance.testplane.js
+ testplane Test results appearance Test with diff should display 3 images
+```
+
+
+
+
+Пример вывода inspect-result
+
+```json
+{
+ "status": "success",
+ "browser": "chrome",
+ "attempt": 0,
+ "duration": 1503,
+ "file": "common/error-group.testplane.js",
+ "name": "testplane Error grouping should group errors",
+ "error": null,
+ "meta": {
+ "url": "http://host.docker.internal:8061/fixtures/testplane/report/",
+ "file": "common/error-group.testplane.js",
+ "sessionId": "c5e07ff0b8fdce82785dba4493f5c7b7"
+ },
+ "steps": [
+ {
+ "name": "setWindowSize",
+ "args": ["1280", "1024"],
+ "duration": 31
+ },
+ {
+ "name": "$",
+ "args": ["[data-qa=\"group-by-dropdown\"]"],
+ "duration": 0
+ },
+ {
+ "name": "click",
+ "args": [],
+ "duration": 79
+ }
+ ],
+ "images": [],
+ "attachments": [
+ {
+ "type": "snapshot",
+ "path": "snapshots/e632a64/chrome_1778547952338_0.zip",
+ "maxWidth": 1280,
+ "maxHeight": 1024
+ }
+ ]
+}
+```
+
+
+
+Полный ответ `inspect-result` включает все шаги, выполненные в ходе теста.
+
+Также есть команда `time-travel-snapshot` для отчетов с данными Testplane Time Travel. Она воспроизводит снимок в выбранный момент и возвращает DOM-снимок страницы в этом состоянии.
+
+```shell
+npx @testplane/cli time-travel-snapshot ./html-report \
+ --name "checkout submits order" \
+ --browser chrome \
+ --time 250 \
+ --diff-from 100
+```
+
+Тот же CI-отчет можно исследовать в конкретной точке тестового таймлайна:
+
+```shell
+npx @testplane/cli time-travel-snapshot "$REPORT_URL" \
+ --name "testplane Error grouping should group errors" \
+ --browser chrome \
+ --attempt 0 \
+ --time 1400 \
+ --include-attrs data-qa href class \
+ --max-text-length 80
+```
+
+
+Пример вывода time-travel-snapshot
+
+```text
+Time travel snapshot captured
+
+## Source
+
+Report: https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/new-ui.html
+Test: testplane Error grouping should group errors
+Browser: chrome
+Attempt: 0
+Mode: report
+Snapshot source: https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/snapshots/e632a64/chrome_1778547952338_0.zip
+Events: 34
+Snapshot range: 1778547952408 (2026-05-12T01:05:52.408Z) - 1778547953911 (2026-05-12T01:05:53.911Z); total 1503ms
+
+## Selected Time
+
+Reason: provided offset 1400ms from first rrweb event
+Absolute timestamp: 1778547953808 (2026-05-12T01:05:53.808Z)
+Offset from first rrweb event: 1400ms
+Requested time: 1400 (offset)
+
+## Test Steps
+
+Times are offsets from the first rrweb event; use them as "time" values.
+- +1080ms..+1080ms $("[data-qa=\"group-by-dropdown\"]")
+- +1104ms..+1183ms click
+- +1184ms..+1184ms $("div=error")
+- +1199ms..+1282ms click
+- +1282ms..+1282ms $(".grouped-tests")
+- +1356ms..+1356ms $("span*=tests: 1")
+
+## Snapshot
+
+- body.report.g-root.g-root_theme_light:
+ - div#app:
+ - div.sticky-header__content:
+ - div.main-menu.container:
+ - div.select.select_type_group:
+ - div.g-select.group-by-dropdown:
+ - button[data-qa=group-by-dropdown role=combobox]:
+ - span.g-select-control__option-text "error"
+ - main.container:
+ - div.grouped-tests:
+ - div.tests-group.tests-group_collapsed:
+ - span.tests-group__name "image comparison failed"
+ - span.tests-group__count "( tests: 1, runs: 2 )"
+```
+
+
+
+Это полезно, когда у вас есть упавшие тесты в CI-отчете и вы хотите, чтобы агент проанализировал падения. Агент может происследовать воспроизведенный DOM и решить, нужно менять тест или сломалось поведение тестируемого сервиса.
+
+## Интеграция с REPL
+
+Testplane CLI может подключаться к запущенной REPL-сессии Testplane:
+
+```shell
+npx @testplane/cli attach-repl --port 4444
+```
+
+После подключения CLI может снимать снапшоты и выполнять код Testplane через REPL:
+
+```shell
+npx @testplane/cli snapshot
+npx @testplane/cli run-code "await browser.getUrl()"
+```
+
+Это удобный режим отладки, когда тест уже привел браузер в нужное состояние. Агент может подключиться, исследовать страницу, выполнять код Testplane в интерактивном режиме.
+
+Одна из ключевых сильных сторон REPL-режима в том, что агент остается внутри runtime вашего проекта. Это значит, что он может использовать существующие page object'ы, кастомные команды и хелперы вместо повторной реализации поведения через низкоуровневые вызовы браузера.
+
+## Работа с auth
+
+В CLI теперь есть команды для состояния браузера. Запускайте их после открытия или подключения к браузерной сессии:
+
+```shell
+npx @testplane/cli save-state ./tmp/auth-state.json
+npx @testplane/cli restore-state ./tmp/auth-state.json
+```
+
+Сохраненное состояние включает cookies, localStorage и sessionStorage. При сохранении можно отключить любую часть:
+
+```shell
+npx @testplane/cli save-state ./tmp/auth-state.json --cookies false
+```
+
+Это дает агентам безопасный способ переиспользовать аутентифицированное состояние браузера.
+
+Сам файл состояния может содержать чувствительные данные, поэтому не добавляйте его в git и работайте с ним с осторожностью.
+
+Это новый подход к работе с чувствительными данными в дополнение к существующему сценарию, где код теста подготавливает браузер и оставляет браузер агенту через `--keep-browser`. Также для этого сценария можно использовать REPL-интеграцию, описанную выше.
+
+## Новые инструменты взаимодействия с браузером
+
+`select` работает с нативными элементами ``:
+
+```shell
+npx @testplane/cli select "#country" --visible-text "Germany"
+npx @testplane/cli select --label-text "Country" --value de
+```
+
+`console` читает новые (еще не полученные ранее) сообщения консоли браузера из Chromium-сессий:
+
+```shell
+npx @testplane/cli console
+```
+
+
+Пример вывода console
+
+```text
+Retrieved 5 unseen browser console messages
+
+## Testplane Code
+
+const consoleMessages = await browser.getLogs("browser");
+
+## Browser Tabs
+
+ 1. Title: javascript - Load page on selection from dropdown form - Stack Overflow; URL: https://stackoverflow.com/questions/10175445/load-page-on-selection-from-dropdown-form (current)
+
+## Additional Information
+
+1. [2026-05-14T22:23:40.793Z] WARNING (security): Error with Feature-Policy header: Unrecognized feature: 'speaker'.
+2. [2026-05-14T22:23:42.789Z] WARNING (console-api): "[GPT] PubAdsService.setForceSafeFrame is deprecated..."
+3. [2026-05-14T22:23:43.883Z] SEVERE (other): Not signed in with the identity provider.
+4. [2026-05-14T22:23:44.059Z] SEVERE (javascript): Access to fetch at 'https://id5-sync.com/api/config/prebid' from origin 'https://stackoverflow.com' has been blocked by CORS policy.
+5. [2026-05-14T22:23:44.059Z] SEVERE (network): Failed to load resource: net::ERR_FAILED
+```
+
+
+
+`navigate` принимает таймаут, что полезно для медленных локальных приложений и CI-окружений:
+
+```shell
+npx @testplane/cli navigate http://localhost:3000 --timeout 60000
+```
+
+Навигация после действий тоже улучшилась. Когда клик или другое действие меняет страницу, ответ формируется из итогового состояния браузера, поэтому следующий снапшот отражает то место, где браузер действительно оказался.
+
+## Testplane MCP
+
+Все эти возможности также доступны через Testplane MCP. MCP-сервер и CLI импортируют общий пакет `@testplane/tools`, поэтому их функциональность полностью синхронизирована.
+
+Используйте MCP-сервер в MCP-совместимом клиенте с такой конфигурацией:
+
+```json
+{
+ "mcpServers": {
+ "testplane-mcp": {
+ "command": "npx",
+ "args": ["@testplane/mcp@latest"]
+ }
+ }
+}
+```
+
+Используйте CLI, когда нужен доступ к браузеру из терминала или для скриптов. Используйте MCP, когда хотите видеть доступные инструменты в редакторе или другом MCP клиенте.
+
+В обоих случаях важна одна и та же идея: агенты теперь могут работать с реальным состоянием браузера и реальными данными отчетов Testplane, а не гадать только по исходному коду.
+
+## Что дальше?
+
+Надеемся, новые инструменты помогут вам сделать браузерное тестирование более прозрачным, отлаживаемым и просто приятным процессом.
+
+Попробуйте на одной реальной задаче: отладка упавшего отчета, flaky-теста или страницы, где сложно угадать селекторы. Больше идей, практических рекомендаций и примеров того, как можно использовать эти инструменты, — на странице [документации AI инструментов](/docs/v8/ai/toolkit/testplane-cli).
+
+Если что-то ощущается неудобным — пишите, мы всегда рады [вашему фидбеку](https://github.com/gemini-testing/testplane-mcp/issues).
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/ai/overview.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/ai/overview.mdx
new file mode 100644
index 00000000..ea7ec181
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/ai/overview.mdx
@@ -0,0 +1,163 @@
+---
+sidebar_position: 1
+sidebar_label: Обзор
+title: AI-инструменты Testplane
+---
+
+import { HelpMark } from "@site/src/components/HelpMark";
+
+# AI-инструменты Testplane
+
+Testplane предоставляет набор инструментов для интеграции с AI, которые помогают агентам писать, проверять, отлаживать и исправлять ваши тесты на Testplane.
+
+Цель этих инструментов — превратить универсального coding-агента в эксперта по Testplane, который понимает, как обычно устроены проекты на Testplane, как нужно писать тесты и как разбирать падения.
+
+## Возможности
+
+- Позволяют AI-агентам исследовать приложение и "видеть", что происходит, через экономные по токенам DOM-снимки
+- Генерируют новые тесты на основе фактического состояния приложения
+- Помогают агентам из коробки придерживаться лучших практик при написании тестов
+- Работают с аутентификацией без чтения секретов
+- Позволяют агентам разбирать падения по отчетам из CI
+- Дают агентам отлаживать тесты через REPL
+
+## Доступные инструменты
+
+[Testplane Skill](../toolkit/testplane-skill) обучает AI-агентов работе с проектами на Testplane end-to-end и использованию `@testplane/cli`. В него включены лучшие практики и подробная документация, которую агенты могут использовать в работе.
+
+[Testplane CLI](../toolkit/testplane-cli) лежит в основе Testplane Skill и дает доступ к автоматизации браузера прямо из CLI.
+
+[Testplane MCP](../toolkit/testplane-mcp) повторяет возможности `@testplane/cli`, но предлагает другой способ взаимодействия с браузером — через протокол MCP.
+
+## Какой инструмент выбрать?
+
+Если не уверены, выбирайте Testplane Skill. Он отлично подходит для большинства сценариев и в целом является лучшим вариантом: coding-агенты любят CLI, он экономно расходует токены и дает достаточно контекста про все, что связано с Testplane.
+
+
+
+
+
+ Skill
+ CLI
+ MCP
+
+
+
+
+ **Как работает**
+
+ LLM читает markdown-файл с инструкциями и обращается к `@testplane/cli` для
+ автоматизации браузера
+
+ LLM запускает shell-команды для взаимодействия с браузером
+ LLM взаимодействует с браузером через MCP tool calls
+
+
+ **Эффективность по токенам**
+ Высокая, progressive discovery
+ Высокая, короткие CLI-вызовы
+
+ Ниже, зависит от agent harness{" "}
+
+ Некоторые agent harness могут загружать все схемы MCP-инструментов сразу,
+ засоряя контекст и тратя токены.
+
+
+ Однако некоторые инструменты оптимизируют этот этап: заранее генерируют схемы и подгружают
+ их лениво, и в таком случае расход токенов сопоставим с CLI-инструментами.
+
+
+
+
+ **Режим браузера по умолчанию**
+ Headless
+ Headless
+ Headful
+
+
+ **Поддерживаемые сценарии**
+
+ Сложные workflow + автоматизация браузера{" "}
+
+ Кроме возможностей автоматизации браузера, skill учит агентa работать с auth,
+ отладкой, выбирать подходящий стиль кода, понимать распространенные паттерны
+ Testplane и многое другое.
+
+
+ Взаимодействие с браузером, разбор отчетов
+ То же, что и CLI
+
+
+
+
+## Сравнение с другими решениями
+
+В целом мы рекомендуем использовать Testplane AI toolkit при работе с проектами на Testplane, потому что он разработан именно для этого сценария и дает глубокие интеграции с экосистемой Testplane, позволяя агентам:
+
+- Читать код Testplane, который был выполнен в каждом вызове инструментов CLI/MCP Testplane, и копировать его при написании тестов
+- Анализировать отчеты Testplane (локальные и из CI) и исправлять упавшие тесты
+- Исследовать Time Travel snapshots, чтобы понять, что пошло не так, и адаптировать тесты по мере развития приложения
+- Отлаживать тесты через удобный для агентов REPL-дебаггер
+- Понимать возможности Testplane и типовые паттерны использования по краткому справочнику в Testplane Skill
+
+Мы изучили и другие инструменты для агентной автоматизации браузера — ниже краткое сравнение наиболее заметных проектов, которое поможет сориентироваться в вариантах.
+
+### Встроенный браузер в Cursor, CC, Cline и т.д.
+
+[Cursor's Browser](https://cursor.com/docs/agent/tools/browser) и [Cline's Browser Automation](https://docs.cline.bot/tools-reference/browser-automation) — это встроенные способы взаимодействия с браузером: они дают инструменты для навигации, снятия снимков страницы, различных действий и чтения логов консоли браузера.
+
+У встроенного браузера Cursor есть удобная панель дизайна: она позволяет быстро менять дизайн приложения и указывать на конкретные элементы прямо во время написания промптов.
+
+Однако у этих инструментов есть серьезные ограничения для тестирования веб-приложений:
+
+- У Cline вообще нет инструмента DOM snapshot — он опирается только на скриншоты
+- Инструмент snapshot в Cursor возвращает accessibility tree, где нет CSS-классов, почти всех HTML-атрибутов и плоская структура без иерархии DOM
+- Поддержка браузеров сильно ограничена: только Chrome, без mobile emulation и специальных возможностей
+- Нет безопасного способа работать с auth-данными
+
+### Playwright
+
+[Playwright CLI](https://github.com/microsoft/playwright-cli) — мощный и популярный инструмент автоматизации браузера. Среди заметных возможностей — анализ сетевых запросов и функции devtools.
+
+Основные ограничения:
+
+- Нет анализа отчетов, Time Travel snapshot inspection или REPL-отладки
+- Ответы инструментов сфокусированы на коде Playwright, что может путать агентов в проектах на Testplane
+- Snapshot строится на accessibility tree, без CSS-классов, точной DOM-структуры и многих полезных HTML-атрибутов
+
+Playwright CLI — популярный выбор, но ему не хватает ряда возможностей для продвинутых workflow и контекста, специфичного для Testplane.
+
+### Chrome DevTools MCP
+
+[Chrome Devtools MCP](https://github.com/ChromeDevTools/chrome-devtools-mcp), помимо обычных браузерных инструментов, дает нишевые возможности вроде снятия memory snapshots и управления browser extensions.
+
+Для проектов на Testplane основные ограничения такие:
+
+- Он специфичен для Chrome
+- Snapshot строятся на accessibility tree, без CSS-классов и точной DOM-структуры
+- Нет интеграции с Testplane tooling, отчетами, Time Travel snapshots или REPL Testplane
+
+В целом это глубокая низкоуровневая интеграция с возможностями Chrome devtools, но она не сфокусирована на тестировании веб-приложений и не интегрирована с инструментами Testplane.
+
+### Vercel's agent-browser
+
+Vercel [agent-browser](https://github.com/vercel-labs/agent-browser) — универсальный инструмент автоматизации браузера с большим набором возможностей, включая анализ сети и профилирование.
+
+Его сильная сторона — гибкость, но он не привязан к конкретному тест-раннеру или тестовому workflow.
+
+Для Testplane это означает:
+
+- Он не сфокусирован именно на тестировании веб-приложений
+- Snapshot строятся на accessibility tree
+- Нет интеграции с Testplane tooling, отчетами, Time Travel snapshots или REPL Testplane
+
+agent-browser может быть полезен для общей автоматизации браузера, но ему не хватает Testplane-специфичных интеграций, которые нужны агентам, чтобы эффективно писать, отлаживать и исправлять тесты.
+
+## Оставайтесь на связи
+
+Нашли баг, есть вопрос или идея? Дайте нам знать:
+
+- [Telegram](https://t.me/testplane)
+- [GitHub](https://github.com/gemini-testing/testplane)
+
+За новыми релизами можно следить [здесь](https://github.com/gemini-testing/testplane-mcp/releases).
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/_category_.json b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/_category_.json
new file mode 100644
index 00000000..f2d18444
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "Инструментарий",
+ "collapsed": false
+}
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-cli.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-cli.mdx
new file mode 100644
index 00000000..d01109ae
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-cli.mdx
@@ -0,0 +1,357 @@
+# Testplane CLI
+
+Testplane CLI позволяет управлять браузером из терминала.
+
+Вы можете открывать страницы, проходить пользовательские сценарии, сохранять компактные DOM-снимки, смотреть логи консоли, сохранять состояние аутентификации, отлаживать отчеты Testplane и воспроизводить Time Travel snapshots. Инструмент полезен сам по себе, а также является основой для Testplane Skill.
+
+## Установка
+
+Установите пакет в проект:
+
+```shell
+npm install --save-dev @testplane/cli
+```
+
+Затем запускайте его так:
+
+```shell
+npx @testplane/cli --help
+```
+
+## Типовой сценарий
+
+Самый простой способ использования — начинать с `navigate`. Если браузер еще не запущен, CLI запустит его автоматически.
+
+```shell
+npx @testplane/cli navigate https://example.com
+npx @testplane/cli snapshot
+```
+
+По умолчанию браузеры CLI работают в headless-режиме. Если вы хотите видеть браузер во время отладки, сначала запустите его явно:
+
+```shell
+npx @testplane/cli launch --headless false
+npx @testplane/cli navigate http://localhost:3000
+```
+
+Когда закончите:
+
+```shell
+npx @testplane/cli close-browser
+```
+
+Если не закрыть браузер вручную, по умолчанию он закроется через 5 минут неактивности.
+
+## Как выглядит вывод
+
+Большинство браузерных команд возвращают три полезных блока информации: результат действия, эквивалентный код Testplane и текущее состояние браузера.
+
+```text
+Successfully navigated to https://example.com
+
+## Testplane Code
+
+await browser.openAndWait("https://example.com");
+
+## Browser Tabs
+
+ 1. Title: Example Domain; URL: https://example.com/ (current)
+
+## Current Tab Snapshot
+
+The snapshot was saved to: /tmp/.testplane/snapshots/2026-05-14T21-24-40-811Z.yml
+```
+
+Снапшоты оптимизированы для людей и агентов, читающих вывод терминала. По умолчанию они убирают шумные теги и атрибуты, обрезают очень длинный текст и сохраняют большие снимки во временный файл вместо переполнения терминала.
+
+## Навигация и инспекция страниц
+
+Используйте `navigate` с увеличенным таймаутом для медленных локальных приложений или CI-окружений:
+
+```shell
+npx @testplane/cli navigate http://localhost:3000 --timeout 60000
+```
+
+Используйте `snapshot`, чтобы понять структуру страницы:
+
+```shell
+npx @testplane/cli snapshot
+```
+
+Вы можете настроить снимок, если вывод по умолчанию скрывает что-то важное:
+
+```shell
+npx @testplane/cli snapshot --include-attrs data-qa href class --max-text-length 200
+```
+
+Используйте `screenshot`, когда нужны визуальные подтверждения:
+
+```shell
+npx @testplane/cli screenshot ./tmp/page.png
+```
+
+Для большинства задач отладки тестов начинайте с `snapshot`. Его быстрее читать, проще искать по нему, и обычно этого достаточно, чтобы найти нужный селектор или состояние.
+
+## Взаимодействие с элементами
+
+Команды принимают либо селектор, либо семантические опции в стиле Testing Library.
+
+```shell
+npx @testplane/cli click '[data-testid="submit"]'
+npx @testplane/cli click --role button --name "Submit"
+npx @testplane/cli type --label-text "Email" --value "user@example.com"
+npx @testplane/cli wait --text "Saved" --timeout 5000
+```
+
+Для нативных элементов ``:
+
+```shell
+npx @testplane/cli select "#country" --visible-text "Germany"
+npx @testplane/cli select --label-text "Country" --value de
+npx @testplane/cli select --label-text "Country" --index 2
+```
+
+После действия CLI сообщает итоговое состояние браузера. Это полезно, когда клик приводит к навигации или заменяет элемент, с которым вы только что взаимодействовали.
+
+## Логи консоли
+
+`console` читает сообщения консоли браузера из сессий на базе Chromium. Он возвращает только сообщения, которые еще не были возвращены предыдущим вызовом `console` в текущей сессии.
+
+```shell
+npx @testplane/cli navigate https://stackoverflow.com/questions/10175445/load-page-on-selection-from-dropdown-form
+npx @testplane/cli console
+```
+
+Пример:
+
+```text
+Retrieved 8 unseen browser console messages
+
+1. [2026-05-14T22:23:40.793Z] WARNING (security): Error with Feature-Policy header: Unrecognized feature: 'speaker'.
+2. [2026-05-14T22:23:43.883Z] SEVERE (other): Not signed in with the identity provider.
+3. [2026-05-14T22:23:44.059Z] SEVERE (javascript): Access to fetch at 'https://id5-sync.com/api/config/prebid' from origin 'https://stackoverflow.com' has been blocked by CORS policy.
+4. [2026-05-14T22:23:44.059Z] SEVERE (network): Failed to load resource: net::ERR_FAILED
+```
+
+Это удобно, когда страница в снимке выглядит нормально, но приложение падает в JavaScript, не загружает заблокированный ресурс или пишет полезные runtime-ошибки.
+
+## Работа с вкладками
+
+Используйте команды вкладок, когда сценарий открывает новую страницу.
+
+```shell
+npx @testplane/cli list-tabs
+npx @testplane/cli new-tab http://localhost:3000/settings
+npx @testplane/cli switch-tab 1
+npx @testplane/cli close-tab 2
+```
+
+## Состояние аутентификации
+
+Для сценариев с авторизацией можно сохранять и восстанавливать состояние браузера.
+
+```shell
+npx @testplane/cli save-state ./tmp/auth-state.json
+npx @testplane/cli restore-state ./tmp/auth-state.json
+```
+
+Состояние может включать cookies, localStorage и sessionStorage. Ненужные части можно отключить:
+
+```shell
+npx @testplane/cli save-state ./tmp/auth-state.json --cookies false
+```
+
+Считайте сохраненный файл чувствительным. Он может содержать реальные auth-данные, даже если в выводе команды печатаются только счетчики.
+
+По умолчанию `restore-state` обновляет текущую страницу, чтобы код приложения сразу увидел восстановленные cookies и storage.
+
+## Запуск произвольного кода Testplane
+
+Когда встроенной команды недостаточно, используйте `run-code`.
+
+```shell
+npx @testplane/cli run-code "await browser.getUrl()"
+npx @testplane/cli run-code "(browser) => browser.getTitle()"
+npx @testplane/cli run-code --file ./debug-script.js
+```
+
+Inline-код может быть JavaScript-выражением, небольшим async-телом или функцией, которая принимает `browser`.
+
+## Подключение к существующим сессиям
+
+Если вы запускаете тест Testplane с `--keep-browser`, Testplane может напечатать данные браузерной сессии. Подключитесь к этому браузеру и изучите состояние, которое осталось после теста:
+
+```shell
+npx @testplane/cli attach --session '{"sessionId":"...","capabilities":{}}'
+npx @testplane/cli snapshot
+```
+
+Это полезно, когда тест выполняет подготовку, которую трудно воспроизвести вручную, например логин, создание данных или длинный пользовательский сценарий.
+
+## REPL-режим
+
+Предположим, вы запустили Testplane с включенным repl и определенным repl-портом:
+
+```
+npx testplane --grep 'test name' -b chrome-desktop --repl-before-test --repl-port 4444
+```
+
+Тогда CLI может подключиться к этой REPL-сессии Testplane:
+
+```shell
+npx @testplane/cli attach-repl --port 4444
+```
+
+В REPL-режиме CLI сейчас поддерживает два действия:
+
+```shell
+npx @testplane/cli snapshot
+npx @testplane/cli run-code "await browser.getUrl()"
+```
+
+Главное преимущество — вы остаетесь внутри runtime своего проекта. Это значит, что `run-code` может использовать page objects, кастомные команды, фикстуры и helper-функции, уже доступные в процессе теста.
+
+## Чтение HTML-отчетов Testplane
+
+Команды отчетов работают с локальными директориями отчетов, HTML-файлами отчетов, `databaseUrls.json` и удаленными URL отчетов.
+
+```shell
+npx @testplane/cli test-results ./html-report --status failed
+npx @testplane/cli inspect-result ./html-report --name "checkout submits order" --browser chrome
+```
+
+Полезные фильтры:
+
+```shell
+npx @testplane/cli test-results ./html-report --grep checkout
+npx @testplane/cli test-results ./html-report --browser chrome --duration '>5s'
+npx @testplane/cli test-results ./html-report --grep-error "NoSuchElement"
+npx @testplane/cli test-results ./html-report --meta owner=qa --file 'src/**'
+```
+
+Для больших отчетов или использования в скриптах можно сохранить отфильтрованный набор как JSON:
+
+```shell
+npx @testplane/cli test-results ./html-report --status failed --save-json
+```
+
+Удаленные отчеты автоматически скачиваются и кэшируются:
+
+```shell
+REPORT_URL="https://gh-testplane-ci.s3.yandexcloud.net/testplane-ci/e2e-tests-reports/25706755847-557-1/new-ui.html"
+
+npx @testplane/cli test-results "$REPORT_URL" --limit 10 --fields name,status,browser,duration,file
+```
+
+Это позволяет разбирать отчеты CI скриптами из терминала, не открывая сначала полный HTML-интерфейс.
+
+## Time Travel snapshots
+
+Если отчет содержит данные Testplane Time Travel, вы можете исследовать DOM в конкретный момент записанного прогона.
+
+```shell
+npx @testplane/cli time-travel-snapshot ./html-report \
+ --name "checkout submits order" \
+ --browser chrome \
+ --attempt 0 \
+ --time 250
+```
+
+Вывод включает выбранное время, соседние шаги теста и DOM-снимок воспроизведенной страницы.
+
+Используйте `--diff-from`, чтобы сравнить два момента:
+
+```shell
+npx @testplane/cli time-travel-snapshot ./html-report \
+ --name "checkout submits order" \
+ --browser chrome \
+ --time 250 \
+ --diff-from 100
+```
+
+Также можно напрямую исследовать zip-файл со снимком:
+
+```shell
+npx @testplane/cli time-travel-snapshot --snapshot-file ./snapshot.zip --time 100
+```
+
+Time Travel особенно полезен, когда падение произошло в CI, а живой браузер уже закрыт. Вы все равно можете посмотреть, как приложение выглядело в момент выполнения теста.
+
+## Кастомная конфигурация браузера
+
+Используйте `launch`, когда нужен видимый браузер, конкретный viewport, mobile emulation или кастомный Selenium grid.
+
+```shell
+npx @testplane/cli launch --headless false --window-size '{"width":1280,"height":720}'
+```
+
+Пример mobile emulation:
+
+```shell
+npx @testplane/cli launch --desired-capabilities '{
+ "browserName": "chrome",
+ "goog:chromeOptions": {
+ "mobileEmulation": {
+ "deviceMetrics": {
+ "width": 360,
+ "height": 800,
+ "pixelRatio": 1
+ }
+ }
+ }
+}'
+```
+
+По умолчанию `grid-url` равен `local`, что позволяет Testplane автоматически управлять Chrome и Firefox. Для других браузеров запустите драйвер или Selenium grid самостоятельно и передайте его URL:
+
+```shell
+npx @testplane/cli launch --grid-url http://localhost:4444/wd/hub
+```
+
+## Частые сценарии
+
+Отладка селектора:
+
+```shell
+npx @testplane/cli navigate http://localhost:3000/profile
+npx @testplane/cli snapshot --include-attrs data-qa aria-label
+npx @testplane/cli click --role button --name "Edit profile"
+npx @testplane/cli snapshot
+```
+
+Повторное использование login-state:
+
+```shell
+npx @testplane/cli navigate http://localhost:3000/login
+# Войдите через команды или вручную в видимой сессии
+npx @testplane/cli save-state ./tmp/auth-state.json
+npx @testplane/cli close-browser
+npx @testplane/cli navigate http://localhost:3000/dashboard
+npx @testplane/cli restore-state ./tmp/auth-state.json
+```
+
+Разбор отчета CI:
+
+```shell
+npx @testplane/cli test-results "$REPORT_URL" --status failed --fields name,browser,error
+npx @testplane/cli inspect-result "$REPORT_URL" --name "full test name" --browser chrome
+npx @testplane/cli time-travel-snapshot "$REPORT_URL" --name "full test name" --browser chrome --time 1000
+```
+
+Подключение после падения теста:
+
+```shell
+npx testplane tests/checkout.testplane.ts --grep "submits order" --keep-browser
+npx @testplane/cli attach --session '{"sessionId":"...","capabilities":{}}'
+npx @testplane/cli snapshot
+```
+
+## Если сомневаетесь
+
+У каждой команды есть подробная справка и примеры использования — вы всегда можете попросить CLI показать больше информации по любой команде:
+
+```shell
+npx @testplane/cli --help
+npx @testplane/cli click --help
+npx @testplane/cli test-results --help
+```
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-mcp.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-mcp.mdx
new file mode 100644
index 00000000..1914a317
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-mcp.mdx
@@ -0,0 +1,179 @@
+import Tabs from "@theme/Tabs";
+import TabItem from "@theme/TabItem";
+import SnapshotExample from "/docs/_partials/mcp-snapshot-example.mdx";
+import investigateVideoUrl from "/video/blog/mcp/investigate.mp4";
+import generateVideoUrl from "/video/blog/mcp/generate.mp4";
+
+# Testplane MCP
+
+**Testplane MCP** — проект, который позволяет AI-агентам в реальном времени взаимодействовать с браузерами, анализировать состояние страниц и генерировать тесты на основе реальной структуры DOM.
+
+## Возможности
+
+### Улучшенная генерация тестов
+
+AI-агенты могут открывать страницы в браузерах, анализировать их структуру и выполнять действия (клики, заполнение форм) во время написания тестов. Это позволяет генерировать тесты с корректными селекторами, которые действительно существуют на странице.
+
+### Автоматизация браузерных процессов
+
+Testplane MCP помогает автоматизировать повторяющиеся задачи, например извлекать данные с изображений платежных квитанций, а затем заполнять формы на веб-страницах.
+
+## Установка
+
+Добавьте сервер Testplane MCP в конфигурацию вашей IDE.
+
+### Настройка окружения
+
+
+
+ Откройте настройки Cursor, в секции `MCP` нажмите `Add new global MCP server` и добавьте конфигурацию:
+
+ ```json
+ {
+ "mcpServers": {
+ "testplane-mcp": {
+ "command": "npx",
+ "args": ["@testplane/mcp@latest"]
+ }
+ }
+ }
+ ```
+
+
+
+ 1. Установите [расширение Cline](https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev)
+ 2. Перейдите на вкладку "MCP" и нажмите "Configure MCP Servers"
+ 3. Добавьте конфигурацию:
+ ```json
+ {
+ "mcpServers": {
+ "testplane-mcp": {
+ "command": "npx",
+ "args": ["@testplane/mcp@latest"]
+ }
+ }
+ }
+ ```
+
+
+
+ В настройках VS Code найдите `MCP`, нажмите `Edit in settings.json` и добавьте:
+
+ ```json
+ {
+ "mcp": {
+ "inputs": [],
+ "servers": {
+ "testplane-mcp": {
+ "command": "npx",
+ "args": ["@testplane/mcp@latest"]
+ }
+ }
+ }
+ }
+ ```
+
+
+
+ Откройте настройки по [официальной документации](https://modelcontextprotocol.io/quickstart/user) и добавьте:
+
+ ```json
+ {
+ "mcpServers": {
+ "testplane-mcp": {
+ "command": "npx",
+ "args": ["@testplane/mcp@latest"]
+ }
+ }
+ }
+ ```
+
+
+
+ Следуйте [официальной документации](https://docs.windsurf.com/windsurf/cascade/mcp) и добавьте конфигурацию:
+
+ ```json
+ {
+ "mcpServers": {
+ "testplane-mcp": {
+ "command": "npx",
+ "args": ["@testplane/mcp@latest"]
+ }
+ }
+ }
+ ```
+
+
+
+ Согласно [официальной документации](https://www.jetbrains.com/help/ai-assistant/configure-an-mcp-server.html), добавьте:
+
+ ```json
+ {
+ "mcpServers": {
+ "testplane-mcp": {
+ "command": "npx",
+ "args": ["@testplane/mcp@latest"]
+ }
+ }
+ }
+ ```
+
+
+
+
+## Использование
+
+Рассмотрим сценарий разработки онлайн-книжного магазина. Представим, что у нас появилась новая функция — отображение рейтингов книг, и мы хотим сгенерировать для нее тесты.
+
+Сначала попросим AI-агента проанализировать страницу и составить план тестирования.
+
+
+ Ваш браузер не поддерживает тег video.
+ Скачать видео .
+
+
+
+
+Теперь попробуем сгенерировать тесты и запустить их.
+
+
+ Ваш браузер не поддерживает тег video.
+ Скачать видео .
+
+
+
+
+Как видно, AI-агент с первой попытки сгенерировал тесты, которые проходят и содержат корректные селекторы.
+
+Вы можете использовать такой промпт для генерации тестов через Testplane MCP:
+
+> Используй testplane mcp, чтобы открыть страницу `https://ya.ru`, выполнить поиск по запросу "cats" и проверить, что результаты поиска отображаются.
+>
+> Не пиши лишние комментарии в тестах, кроме сложных edge-case сценариев. Пиши тесты в соответствии со style guide проекта.
+>
+> Старайся использовать семантические селекторы, например через атрибуты `data-testid` или текст элемента, вместо сложных CSS-селекторов.
+
+## Детали реализации
+
+### Компактные снимки
+
+Testplane MCP создает компактные снимки страницы вместо скриншотов, что значительно экономит токены LLM API.
+
+**Пример:** полный исходный код `https://ya.ru` содержит примерно 260 000 символов, а компактный снимок — около 9 000.
+
+
+ Пример снимка
+
+
+
+
+
+### Интеграция с экосистемой
+
+Каждый ответ сервера содержит выполненный код, что позволяет AI-агенту вставлять его в генерируемые тесты и обеспечивает бесшовную интеграцию с экосистемой Testplane.
+
+## Ссылки
+
+- [Release Notes](https://github.com/gemini-testing/testplane-mcp/releases)
+- [GitHub Issues](https://github.com/gemini-testing/testplane-mcp/issues)
+- [Telegram chat](https://t.me/testplane)
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-skill.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-skill.mdx
new file mode 100644
index 00000000..02e1db3b
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/ai/toolkit/testplane-skill.mdx
@@ -0,0 +1,40 @@
+# Testplane Skill
+
+Testplane Skill дает AI-агентам краткую справочную документацию вместе со скриптами для автоматизации браузера и интеграциями с инструментами Testplane.
+
+## Быстрый старт
+
+Мы рекомендуем использовать удобный визард от [skills.sh](https://www.skills.sh/gemini-testing/testplane-skill/testplane-skill), чтобы установить Testplane Skill в вашу систему:
+
+```shell
+npx skills add gemini-testing/testplane-skill
+```
+
+Это работает с Claude Code, Cursor, GitHub Copilot и любым другим agent harness с поддержкой skills.
+
+## Возможности
+
+Testplane Skill основан на нашем [CLI-пакете](./testplane-cli.mdx), поэтому предоставляет все возможности взаимодействия с браузером, которые есть у CLI.
+Кроме этого, он обучает агентов эффективно решать различные задачи:
+
+- Какие команды есть у Testplane и как он устроен в целом
+- Как запускать CLI и взаимодействовать с браузером
+- Где искать конфигурационные файлы и как запускать тесты
+- Каким best practices следовать при генерации тестов
+- Как отлаживать тесты локально разными инструментами, включая REPL
+- Как расследовать тесты, упавшие в CI, и исправлять их
+
+## Как это работает
+
+Testplane Skill — это набор инструкций для AI-агентов + скрипты для автоматизации браузера. Он следует классическому паттерну "progressive discovery", чтобы оптимизировать расход токенов.
+
+В целом типичный workflow выглядит так:
+
+1. Пользователь просит агента выполнить задачу, связанную с тестами Testplane
+2. На старте агент видит описания всех skills, и запрос пользователя триггерит использование Testplane Skill
+3. Агент читает инструкции, упакованные в Testplane Skill
+4. При необходимости обращается к `@testplane/cli`, чтобы взаимодействовать с браузером и обогатить контекст состоянием веб-приложения
+
+## Что дальше
+
+- [Изучите](./testplane-cli.mdx) возможности Testplane CLI
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/typescript-esm.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/typescript-esm.mdx
index a4eb70ce..0709f44a 100644
--- a/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/typescript-esm.mdx
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/basic-guides/typescript-esm.mdx
@@ -119,4 +119,4 @@ declare global {
#### Системные ограничения
-Для работы с ESM вам понадобится `Node.js` версии v22.0.0, v20.17.0 и выше. Взаимодействие с `ECMAScript` происходит с помощью [функции](https://nodejs.org/api/modules.html#loading-ecmascript-modules-using-require) `require()`.
+Для работы с ESM вам понадобится `Node.js` версии v22.0.0, v20.17.0 и выше. Взаимодействие ESM и CommonJS кода возможно благодаря возможности `Node.js`, описанной в [статье](https://nodejs.org/api/modules.html#loading-ecmascript-modules-using-require).
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx
index 5e5c789e..641bfe48 100644
--- a/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/quickstart/running-tests.mdx
@@ -211,7 +211,7 @@ npx testplane --keep-browser --grep "Название теста"
npx testplane --keep-browser-on-fail # только при падении
```
-Полезно для проверки DOM, cookies или localStorage после выполнения теста, а также в связке с [MCP](../testplane-mcp.mdx), чтобы AI-агент подключился к уже подготовленному браузеру.
+Полезно для проверки DOM, cookies или localStorage после выполнения теста, а также в связке с [MCP](../ai/toolkit/testplane-mcp.mdx), чтобы AI-агент подключился к уже подготовленному браузеру.
## Полезные команды
diff --git a/package-lock.json b/package-lock.json
index fe2f27fb..6a5eaddc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -36,6 +36,7 @@
"@storybook/test": "8.0.5",
"@svgr/webpack": "8.1.0",
"@tailwindcss/postcss": "4.1.13",
+ "@types/react-dom": "18.2.0",
"autoprefixer": "10.4.19",
"docusaurus-plugin-sass": "0.2.5",
"eslint": "8.57.0",
@@ -180,7 +181,6 @@
"version": "4.23.3",
"resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.3.tgz",
"integrity": "sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==",
- "peer": true,
"dependencies": {
"@algolia/client-common": "4.23.3",
"@algolia/requester-common": "4.23.3",
@@ -307,7 +307,6 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.5",
@@ -468,6 +467,7 @@
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
"integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=6.9.0"
}
@@ -746,6 +746,7 @@
"integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
"deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-plugin-utils": "^7.20.2",
@@ -765,6 +766,7 @@
"integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
"deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.18.6",
"@babel/helper-plugin-utils": "^7.18.6"
@@ -781,6 +783,7 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz",
"integrity": "sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.24.0",
"@babel/plugin-syntax-export-default-from": "^7.24.1"
@@ -798,6 +801,7 @@
"integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
"deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
@@ -815,6 +819,7 @@
"integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
"deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
@@ -832,6 +837,7 @@
"integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
"deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/compat-data": "^7.20.5",
"@babel/helper-compilation-targets": "^7.20.7",
@@ -852,6 +858,7 @@
"integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==",
"deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
@@ -869,6 +876,7 @@
"integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
"deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.20.2",
"@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
@@ -897,6 +905,7 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
"integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -920,6 +929,7 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz",
"integrity": "sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.24.0"
},
@@ -995,6 +1005,7 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
"integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -1007,6 +1018,7 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
"integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
@@ -1019,6 +1031,7 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
"integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -1031,6 +1044,7 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
"integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -1043,6 +1057,7 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
"integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -1784,6 +1799,7 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz",
"integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.24.0"
},
@@ -1799,6 +1815,7 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz",
"integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.24.0"
},
@@ -2062,7 +2079,6 @@
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz",
"integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/compat-data": "^7.28.5",
"@babel/helper-compilation-targets": "^7.27.2",
@@ -2502,7 +2518,6 @@
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.4.0.tgz",
"integrity": "sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==",
- "peer": true,
"dependencies": {
"@babel/core": "^7.23.3",
"@babel/generator": "^7.23.3",
@@ -3685,6 +3700,7 @@
"resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz",
"integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -3694,6 +3710,7 @@
"resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz",
"integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^29.6.3"
},
@@ -3706,6 +3723,7 @@
"resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
"integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/fake-timers": "^29.7.0",
"@jest/types": "^29.6.3",
@@ -3721,6 +3739,7 @@
"resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
"integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^29.6.3",
"@sinonjs/fake-timers": "^10.0.2",
@@ -4005,6 +4024,7 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.6.tgz",
"integrity": "sha512-647OSi6xBb8FbwFqX9zsJxOzu685AWtrOUWHfOkbKD+5LOpGORw+GQo0F9rWZnB68rLQyfKUZWJeaD00pGv5fw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native-community/cli-clean": "12.3.6",
"@react-native-community/cli-config": "12.3.6",
@@ -4037,6 +4057,7 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.6.tgz",
"integrity": "sha512-gUU29ep8xM0BbnZjwz9MyID74KKwutq9x5iv4BCr2im6nly4UMf1B1D+V225wR7VcDGzbgWjaezsJShLLhC5ig==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native-community/cli-tools": "12.3.6",
"chalk": "^4.1.2",
@@ -4048,6 +4069,7 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.6.tgz",
"integrity": "sha512-JGWSYQ9EAK6m2v0abXwFLEfsqJ1zkhzZ4CV261QZF9MoUNB6h57a274h1MLQR9mG6Tsh38wBUuNfEPUvS1vYew==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native-community/cli-tools": "12.3.6",
"chalk": "^4.1.2",
@@ -4062,6 +4084,7 @@
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
+ "peer": true,
"dependencies": {
"sprintf-js": "~1.0.2"
}
@@ -4071,6 +4094,7 @@
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
"integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
"dev": true,
+ "peer": true,
"dependencies": {
"import-fresh": "^2.0.0",
"is-directory": "^0.3.1",
@@ -4086,6 +4110,7 @@
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -4106,6 +4131,7 @@
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
"integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
"dev": true,
+ "peer": true,
"dependencies": {
"caller-path": "^2.0.0",
"resolve-from": "^3.0.0"
@@ -4119,6 +4145,7 @@
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
+ "peer": true,
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@@ -4132,6 +4159,7 @@
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
"dev": true,
+ "peer": true,
"dependencies": {
"error-ex": "^1.3.1",
"json-parse-better-errors": "^1.0.1"
@@ -4145,6 +4173,7 @@
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
"integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
@@ -4154,6 +4183,7 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.6.tgz",
"integrity": "sha512-SjUKKsx5FmcK9G6Pb6UBFT0s9JexVStK5WInmANw75Hm7YokVvHEgtprQDz2Uvy5znX5g2ujzrkIU//T15KQzA==",
"dev": true,
+ "peer": true,
"dependencies": {
"serve-static": "^1.13.1"
}
@@ -4163,6 +4193,7 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.6.tgz",
"integrity": "sha512-fvBDv2lTthfw4WOQKkdTop2PlE9GtfrlNnpjB818MhcdEnPjfQw5YaTUcnNEGsvGomdCs1MVRMgYXXwPSN6OvQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native-community/cli-config": "12.3.6",
"@react-native-community/cli-platform-android": "12.3.6",
@@ -4187,6 +4218,7 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
@@ -4196,6 +4228,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^4.1.0"
},
@@ -4208,6 +4241,7 @@
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
"integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
"dev": true,
+ "peer": true,
"bin": {
"yaml": "bin.mjs"
},
@@ -4220,6 +4254,7 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.6.tgz",
"integrity": "sha512-sNGwfOCl8OAIjWCkwuLpP8NZbuO0dhDI/2W7NeOGDzIBsf4/c4MptTrULWtGIH9okVPLSPX0NnRyGQ+mSwWyuQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native-community/cli-platform-android": "12.3.6",
"@react-native-community/cli-tools": "12.3.6",
@@ -4232,6 +4267,7 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.6.tgz",
"integrity": "sha512-DeDDAB8lHpuGIAPXeeD9Qu2+/wDTFPo99c8uSW49L0hkmZJixzvvvffbGQAYk32H0TmaI7rzvzH+qzu7z3891g==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native-community/cli-tools": "12.3.6",
"chalk": "^4.1.2",
@@ -4246,6 +4282,7 @@
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -4266,6 +4303,7 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.6.tgz",
"integrity": "sha512-3eZ0jMCkKUO58wzPWlvAPRqezVKm9EPZyaPyHbRPWU8qw7JqkvnRlWIaYDGpjCJgVW4k2hKsEursLtYKb188tg==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native-community/cli-tools": "12.3.6",
"chalk": "^4.1.2",
@@ -4280,6 +4318,7 @@
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -4299,13 +4338,15 @@
"version": "12.3.6",
"resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.6.tgz",
"integrity": "sha512-3jxSBQt4fkS+KtHCPSyB5auIT+KKIrPCv9Dk14FbvOaEh9erUWEm/5PZWmtboW1z7CYeNbFMeXm9fM2xwtVOpg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/@react-native-community/cli-server-api": {
"version": "12.3.6",
"resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.6.tgz",
"integrity": "sha512-80NIMzo8b2W+PL0Jd7NjiJW9mgaT8Y8wsIT/lh6mAvYH7mK0ecDJUYUTAAv79Tbo1iCGPAr3T295DlVtS8s4yQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native-community/cli-debugger-ui": "12.3.6",
"@react-native-community/cli-tools": "12.3.6",
@@ -4323,6 +4364,7 @@
"resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
"integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
@@ -4339,6 +4381,7 @@
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz",
"integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/yargs-parser": "*"
}
@@ -4348,6 +4391,7 @@
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
"integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^26.6.2",
"ansi-regex": "^5.0.0",
@@ -4363,6 +4407,7 @@
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
"integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=8.3.0"
},
@@ -4384,6 +4429,7 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.6.tgz",
"integrity": "sha512-FPEvZn19UTMMXUp/piwKZSh8cMEfO8G3KDtOwo53O347GTcwNrKjgZGtLSPELBX2gr+YlzEft3CoRv2Qmo83fQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"appdirsjs": "^1.2.4",
"chalk": "^4.1.2",
@@ -4402,6 +4448,7 @@
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
"integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
@@ -4411,6 +4458,7 @@
"resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
"integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
"dev": true,
+ "peer": true,
"dependencies": {
"is-wsl": "^1.1.0"
},
@@ -4423,6 +4471,7 @@
"resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.6.tgz",
"integrity": "sha512-xPqTgcUtZowQ8WKOkI9TLGBwH2bGggOC4d2FFaIRST3gTcjrEeGRNeR5aXCzJFIgItIft8sd7p2oKEdy90+01Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"joi": "^17.2.1"
}
@@ -4432,6 +4481,7 @@
"resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
"integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
"dev": true,
+ "peer": true,
"engines": {
"node": "^12.20.0 || >=14"
}
@@ -4441,6 +4491,7 @@
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
+ "peer": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -4454,6 +4505,7 @@
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
+ "peer": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
@@ -4468,6 +4520,7 @@
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"dev": true,
+ "peer": true,
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
@@ -4477,6 +4530,7 @@
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
+ "peer": true,
"dependencies": {
"p-locate": "^4.1.0"
},
@@ -4489,6 +4543,7 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
+ "peer": true,
"dependencies": {
"p-try": "^2.0.0"
},
@@ -4504,6 +4559,7 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
+ "peer": true,
"dependencies": {
"p-limit": "^2.2.0"
},
@@ -4516,6 +4572,7 @@
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">= 4.0.0"
}
@@ -4525,6 +4582,7 @@
"resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.73.1.tgz",
"integrity": "sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -4534,6 +4592,7 @@
"resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz",
"integrity": "sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native/codegen": "0.73.3"
},
@@ -4546,6 +4605,7 @@
"resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.73.21.tgz",
"integrity": "sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"@babel/plugin-proposal-async-generator-functions": "^7.0.0",
@@ -4602,6 +4662,7 @@
"resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz",
"integrity": "sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/parser": "^7.20.0",
"flow-parser": "^0.206.0",
@@ -4623,6 +4684,7 @@
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -4643,6 +4705,7 @@
"resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.17.tgz",
"integrity": "sha512-F3PXZkcHg+1ARIr6FRQCQiB7ZAA+MQXGmq051metRscoLvgYJwj7dgC8pvgy0kexzUkHu5BNKrZeySzUft3xuQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native-community/cli-server-api": "12.3.6",
"@react-native-community/cli-tools": "12.3.6",
@@ -4665,6 +4728,7 @@
"resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.73.3.tgz",
"integrity": "sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -4674,6 +4738,7 @@
"resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.8.tgz",
"integrity": "sha512-oph4NamCIxkMfUL/fYtSsE+JbGOnrlawfQ0kKtDQ5xbOjPKotKoXqrs1eGwozNKv7FfQ393stk1by9a6DyASSg==",
"dev": true,
+ "peer": true,
"dependencies": {
"@isaacs/ttlcache": "^1.4.1",
"@react-native/debugger-frontend": "0.73.3",
@@ -4696,6 +4761,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
+ "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -4704,13 +4770,15 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/@react-native/dev-middleware/node_modules/open": {
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
"integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"is-docker": "^2.0.0",
"is-wsl": "^2.1.1"
@@ -4727,6 +4795,7 @@
"resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.73.4.tgz",
"integrity": "sha512-PMDnbsZa+tD55Ug+W8CfqXiGoGneSSyrBZCMb5JfiB3AFST3Uj5e6lw8SgI/B6SKZF7lG0BhZ6YHZsRZ5MlXmg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -4736,6 +4805,7 @@
"resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.73.1.tgz",
"integrity": "sha512-ewMwGcumrilnF87H4jjrnvGZEaPFCAC4ebraEK+CurDDmwST/bIicI4hrOAv+0Z0F7DEK4O4H7r8q9vH7IbN4g==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -4745,6 +4815,7 @@
"resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.15.tgz",
"integrity": "sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"@react-native/babel-preset": "0.73.21",
@@ -4762,13 +4833,15 @@
"version": "0.73.2",
"resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.73.2.tgz",
"integrity": "sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/@react-native/virtualized-lists": {
"version": "0.73.4",
"resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.73.4.tgz",
"integrity": "sha512-HpmLg1FrEiDtrtAbXiwCgXFYyloK/dOIPIuWW3fsqukwJEWAiTzm1nXGJ7xPU5XTHiWZ4sKup5Ebaj8z7iyWog==",
"dev": true,
+ "peer": true,
"dependencies": {
"invariant": "^2.2.4",
"nullthrows": "^1.1.1"
@@ -4918,6 +4991,7 @@
"resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.2.tgz",
"integrity": "sha512-3Z5FW8mxzomBbrw2iF0lNOAlNBr2OK6HR0NM416PzcTs0UcSoPj/nD4eqmrV5Kut6kvCc/TJua5LyeoPE7vSmw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/runtime": "^7.17.8",
"@types/react-reconciler": "^0.26.7",
@@ -4967,6 +5041,7 @@
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz",
"integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
}
@@ -4976,6 +5051,7 @@
"resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz",
"integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=12.7.0"
},
@@ -5027,6 +5103,7 @@
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
"integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"type-detect": "4.0.8"
}
@@ -5036,6 +5113,7 @@
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
"integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@sinonjs/commons": "^3.0.0"
}
@@ -6384,7 +6462,6 @@
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
"integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
- "peer": true,
"dependencies": {
"@babel/core": "^7.21.3",
"@svgr/babel-preset": "8.1.0",
@@ -6535,7 +6612,6 @@
"integrity": "sha512-Xaf+UBvW6JNuV131uvSNyMXHn+bh6LyKN4tbv7tOUFQpXyz/t9YWRE04emtlUW9Y0qrm/GKFCbY8n3z6BpZbTA==",
"dev": true,
"hasInstallScript": true,
- "peer": true,
"dependencies": {
"@swc/counter": "^0.1.2",
"@swc/types": "^0.1.5"
@@ -7124,7 +7200,6 @@
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz",
"integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==",
"dev": true,
- "peer": true,
"dependencies": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
@@ -7567,17 +7642,27 @@
"version": "18.2.79",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz",
"integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==",
- "peer": true,
"dependencies": {
"@types/prop-types": "*",
"csstype": "^3.0.2"
}
},
+ "node_modules/@types/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-8yQrvS6sMpSwIovhPOwfyNf2Wz6v/B62LFSVYQ85+Rq3tLsBIG7rP5geMxaijTUxSkrO6RzN/IRuIAADYQsleA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
"node_modules/@types/react-reconciler": {
"version": "0.26.7",
"resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz",
"integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/react": "*"
}
@@ -7675,7 +7760,8 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
"integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/@types/unist": {
"version": "3.0.2",
@@ -7692,7 +7778,8 @@
"version": "0.5.15",
"resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.15.tgz",
"integrity": "sha512-nC9116Gd4N+CqTxqo6gvCfhAMAzgRcfS8ZsciNodHq8uwW4JCVKwhagw8yN0XmC7mHrLnWqniJpoVEiR+72Drw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/@types/ws": {
"version": "8.5.10",
@@ -7879,7 +7966,6 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz",
"integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==",
"dev": true,
- "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "7.4.0",
"@typescript-eslint/types": "7.4.0",
@@ -8628,6 +8714,7 @@
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
"dev": true,
+ "peer": true,
"dependencies": {
"event-target-shim": "^5.0.0"
},
@@ -8651,7 +8738,6 @@
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -8700,7 +8786,6 @@
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -8760,7 +8845,6 @@
"version": "4.23.3",
"resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz",
"integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==",
- "peer": true,
"dependencies": {
"@algolia/cache-browser-local-storage": "4.23.3",
"@algolia/cache-common": "4.23.3",
@@ -8794,7 +8878,8 @@
"version": "1.4.10",
"resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz",
"integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/ansi-align": {
"version": "3.0.1",
@@ -8846,6 +8931,7 @@
"resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz",
"integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==",
"dev": true,
+ "peer": true,
"dependencies": {
"colorette": "^1.0.7",
"slice-ansi": "^2.0.0",
@@ -8857,6 +8943,7 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
@@ -8866,6 +8953,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^4.1.0"
},
@@ -8928,7 +9016,8 @@
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz",
"integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/arg": {
"version": "5.0.2",
@@ -9105,7 +9194,8 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/assert": {
"version": "2.1.0",
@@ -9146,6 +9236,7 @@
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
"integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
@@ -9168,7 +9259,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/at-least-node": {
"version": "1.0.0",
@@ -9421,6 +9513,7 @@
"resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz",
"integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/plugin-syntax-flow": "^7.12.1"
}
@@ -9688,7 +9781,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
@@ -9708,6 +9800,7 @@
"resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
"integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"node-int64": "^0.4.0"
}
@@ -9731,6 +9824,7 @@
"url": "https://feross.org/support"
}
],
+ "peer": true,
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
@@ -9838,6 +9932,7 @@
"resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
"integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"callsites": "^2.0.0"
},
@@ -9850,6 +9945,7 @@
"resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
"integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
@@ -9859,6 +9955,7 @@
"resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
"integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
"dev": true,
+ "peer": true,
"dependencies": {
"caller-callsite": "^2.0.0"
},
@@ -10128,6 +10225,7 @@
"resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz",
"integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/node": "*",
"escape-string-regexp": "^4.0.0",
@@ -10154,6 +10252,7 @@
"resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz",
"integrity": "sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/node": "*",
"escape-string-regexp": "^4.0.0",
@@ -10168,6 +10267,7 @@
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"dev": true,
+ "peer": true,
"bin": {
"mkdirp": "bin/cmd.js"
},
@@ -10322,6 +10422,7 @@
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
@@ -10335,13 +10436,15 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/cliui/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=8"
}
@@ -10351,6 +10454,7 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
+ "peer": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -10365,6 +10469,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -10377,6 +10482,7 @@
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -10464,7 +10570,8 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
"integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/combine-promises": {
"version": "1.2.0",
@@ -10487,7 +10594,8 @@
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
"integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/commander": {
"version": "5.1.0",
@@ -10649,6 +10757,7 @@
"resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
"integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"debug": "2.6.9",
"finalhandler": "1.1.2",
@@ -10672,6 +10781,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
+ "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -10681,6 +10791,7 @@
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"dev": true,
+ "peer": true,
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
@@ -10698,13 +10809,15 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/connect/node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
"dev": true,
+ "peer": true,
"dependencies": {
"ee-first": "1.1.1"
},
@@ -10717,6 +10830,7 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -11262,7 +11376,8 @@
"version": "1.11.10",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
"integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/debounce": {
"version": "1.2.1",
@@ -11291,6 +11406,7 @@
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -11522,7 +11638,8 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz",
"integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/depd": {
"version": "2.0.0",
@@ -11537,6 +11654,7 @@
"resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-5.0.0.tgz",
"integrity": "sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@react-native/normalize-colors": "^0.73.0",
"invariant": "^2.2.4",
@@ -12064,7 +12182,6 @@
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz",
"integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==",
- "peer": true,
"dependencies": {
"@babel/core": "^7.19.6",
"@svgr/babel-preset": "^6.5.1",
@@ -13161,6 +13278,7 @@
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">= 0.8"
}
@@ -13234,6 +13352,7 @@
"resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
"integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"stackframe": "^1.3.4"
}
@@ -13243,6 +13362,7 @@
"resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz",
"integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==",
"dev": true,
+ "peer": true,
"dependencies": {
"accepts": "~1.3.7",
"escape-html": "~1.0.3"
@@ -13437,7 +13557,6 @@
"integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
"dev": true,
"hasInstallScript": true,
- "peer": true,
"bin": {
"esbuild": "bin/esbuild"
},
@@ -13560,7 +13679,6 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
"devOptional": true,
- "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
@@ -14004,6 +14122,7 @@
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
@@ -14179,6 +14298,7 @@
"url": "https://paypal.me/naturalintelligence"
}
],
+ "peer": true,
"dependencies": {
"strnum": "^1.0.5"
},
@@ -14222,6 +14342,7 @@
"resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
"integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
"dev": true,
+ "peer": true,
"dependencies": {
"bser": "2.1.1"
}
@@ -14535,7 +14656,8 @@
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz",
"integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/flow-parser": {
"version": "0.206.0",
@@ -14826,6 +14948,7 @@
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true,
+ "peer": true,
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
@@ -15560,13 +15683,15 @@
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.15.0.tgz",
"integrity": "sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/hermes-parser": {
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.15.0.tgz",
"integrity": "sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"hermes-estree": "0.15.0"
}
@@ -15576,6 +15701,7 @@
"resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz",
"integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"source-map": "^0.7.3"
},
@@ -16322,6 +16448,7 @@
"resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
"integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -16373,6 +16500,7 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
@@ -16799,6 +16927,7 @@
"resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz",
"integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/react-reconciler": "^0.28.0"
},
@@ -16811,6 +16940,7 @@
"resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz",
"integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/react": "*"
}
@@ -16856,6 +16986,7 @@
"resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
"integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/environment": "^29.7.0",
"@jest/fake-timers": "^29.7.0",
@@ -16873,6 +17004,7 @@
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
"integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
"dev": true,
+ "peer": true,
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
@@ -16882,6 +17014,7 @@
"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
"integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/code-frame": "^7.12.13",
"@jest/types": "^29.6.3",
@@ -16902,6 +17035,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=10"
},
@@ -16914,6 +17048,7 @@
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
"integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
@@ -16927,13 +17062,15 @@
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/jest-mock": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
"integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^29.6.3",
"@types/node": "*",
@@ -16964,6 +17101,7 @@
"resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
"integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^29.6.3",
"camelcase": "^6.2.0",
@@ -16981,6 +17119,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=10"
},
@@ -16993,6 +17132,7 @@
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
"integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
@@ -17006,7 +17146,8 @@
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/jest-worker": {
"version": "29.7.0",
@@ -17076,19 +17217,22 @@
"version": "250231.0.0",
"resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz",
"integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/jsc-safe-url": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz",
"integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/jscodeshift": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz",
"integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.13.16",
"@babel/parser": "^7.13.16",
@@ -17122,6 +17266,7 @@
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz",
"integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==",
"dev": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.0.1"
},
@@ -17134,6 +17279,7 @@
"resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz",
"integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==",
"dev": true,
+ "peer": true,
"dependencies": {
"ast-types": "0.15.2",
"esprima": "~4.0.0",
@@ -17149,6 +17295,7 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -17174,7 +17321,8 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
@@ -17346,6 +17494,7 @@
"resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
"integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==",
"dev": true,
+ "peer": true,
"dependencies": {
"debug": "^2.6.9",
"marky": "^1.2.2"
@@ -17356,6 +17505,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
+ "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -17364,7 +17514,8 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/lightningcss": {
"version": "1.30.1",
@@ -17684,7 +17835,8 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/lodash.uniq": {
"version": "4.5.0",
@@ -17712,6 +17864,7 @@
"resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz",
"integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-fragments": "^0.2.1",
"dayjs": "^1.8.15",
@@ -17726,6 +17879,7 @@
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
@@ -17735,6 +17889,7 @@
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
@@ -17745,13 +17900,15 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/logkitty/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
+ "peer": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -17765,6 +17922,7 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=8"
}
@@ -17774,6 +17932,7 @@
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
+ "peer": true,
"dependencies": {
"p-locate": "^4.1.0"
},
@@ -17786,6 +17945,7 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
+ "peer": true,
"dependencies": {
"p-try": "^2.0.0"
},
@@ -17801,6 +17961,7 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
+ "peer": true,
"dependencies": {
"p-limit": "^2.2.0"
},
@@ -17813,6 +17974,7 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
+ "peer": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -17827,6 +17989,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -17839,6 +18002,7 @@
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -17852,13 +18016,15 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/logkitty/node_modules/yargs": {
"version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dev": true,
+ "peer": true,
"dependencies": {
"cliui": "^6.0.0",
"decamelize": "^1.2.0",
@@ -17881,6 +18047,7 @@
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
@@ -17993,6 +18160,7 @@
"resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
"integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
"dev": true,
+ "peer": true,
"dependencies": {
"tmpl": "1.0.5"
}
@@ -18039,7 +18207,8 @@
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz",
"integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
@@ -18457,7 +18626,8 @@
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
"integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/memoizerific": {
"version": "1.11.3",
@@ -18503,6 +18673,7 @@
"resolved": "https://registry.npmjs.org/metro/-/metro-0.80.8.tgz",
"integrity": "sha512-in7S0W11mg+RNmcXw+2d9S3zBGmCARDxIwoXJAmLUQOQoYsRP3cpGzyJtc7WOw8+FXfpgXvceD0u+PZIHXEL7g==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/code-frame": "^7.0.0",
"@babel/core": "^7.20.0",
@@ -18560,6 +18731,7 @@
"resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.8.tgz",
"integrity": "sha512-TTzNwRZb2xxyv4J/+yqgtDAP2qVqH3sahsnFu6Xv4SkLqzrivtlnyUbaeTdJ9JjtADJUEjCbgbFgUVafrXdR9Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"hermes-parser": "0.20.1",
@@ -18573,13 +18745,15 @@
"version": "0.20.1",
"resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.20.1.tgz",
"integrity": "sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/metro-babel-transformer/node_modules/hermes-parser": {
"version": "0.20.1",
"resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.20.1.tgz",
"integrity": "sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==",
"dev": true,
+ "peer": true,
"dependencies": {
"hermes-estree": "0.20.1"
}
@@ -18589,6 +18763,7 @@
"resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.8.tgz",
"integrity": "sha512-5svz+89wSyLo7BxdiPDlwDTgcB9kwhNMfNhiBZPNQQs1vLFXxOkILwQiV5F2EwYT9DEr6OPZ0hnJkZfRQ8lDYQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"metro-core": "0.80.8",
"rimraf": "^3.0.2"
@@ -18602,6 +18777,7 @@
"resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.8.tgz",
"integrity": "sha512-qWKzxrLsRQK5m3oH8ePecqCc+7PEhR03cJE6Z6AxAj0idi99dHOSitTmY0dclXVB9vP2tQIAE8uTd8xkYGk8fA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -18611,6 +18787,7 @@
"resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.8.tgz",
"integrity": "sha512-VGQJpfJawtwRzGzGXVUoohpIkB0iPom4DmSbAppKfumdhtLA8uVeEPp2GM61kL9hRvdbMhdWA7T+hZFDlo4mJA==",
"dev": true,
+ "peer": true,
"dependencies": {
"connect": "^3.6.5",
"cosmiconfig": "^5.0.5",
@@ -18629,6 +18806,7 @@
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
+ "peer": true,
"dependencies": {
"sprintf-js": "~1.0.2"
}
@@ -18638,6 +18816,7 @@
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
"integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
"dev": true,
+ "peer": true,
"dependencies": {
"import-fresh": "^2.0.0",
"is-directory": "^0.3.1",
@@ -18653,6 +18832,7 @@
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
"integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
"dev": true,
+ "peer": true,
"dependencies": {
"caller-path": "^2.0.0",
"resolve-from": "^3.0.0"
@@ -18666,6 +18846,7 @@
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
+ "peer": true,
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@@ -18679,6 +18860,7 @@
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
"dev": true,
+ "peer": true,
"dependencies": {
"error-ex": "^1.3.1",
"json-parse-better-errors": "^1.0.1"
@@ -18692,6 +18874,7 @@
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
"integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
@@ -18701,6 +18884,7 @@
"resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.8.tgz",
"integrity": "sha512-g6lud55TXeISRTleW6SHuPFZHtYrpwNqbyFIVd9j9Ofrb5IReiHp9Zl8xkAfZQp8v6ZVgyXD7c130QTsCz+vBw==",
"dev": true,
+ "peer": true,
"dependencies": {
"lodash.throttle": "^4.1.1",
"metro-resolver": "0.80.8"
@@ -18714,6 +18898,7 @@
"resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.8.tgz",
"integrity": "sha512-eQXMFM9ogTfDs2POq7DT2dnG7rayZcoEgRbHPXvhUWkVwiKkro2ngcBE++ck/7A36Cj5Ljo79SOkYwHaWUDYDw==",
"dev": true,
+ "peer": true,
"dependencies": {
"anymatch": "^3.0.3",
"debug": "^2.2.0",
@@ -18738,6 +18923,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
+ "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -18746,13 +18932,15 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/metro-minify-terser": {
"version": "0.80.8",
"resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.8.tgz",
"integrity": "sha512-y8sUFjVvdeUIINDuW1sejnIjkZfEF+7SmQo0EIpYbWmwh+kq/WMj74yVaBWuqNjirmUp1YNfi3alT67wlbBWBQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"terser": "^5.15.0"
},
@@ -18765,6 +18953,7 @@
"resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.8.tgz",
"integrity": "sha512-JdtoJkP27GGoZ2HJlEsxs+zO7jnDUCRrmwXJozTlIuzLHMRrxgIRRby9fTCbMhaxq+iA9c+wzm3iFb4NhPmLbQ==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -18774,6 +18963,7 @@
"resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.8.tgz",
"integrity": "sha512-2oScjfv6Yb79PelU1+p8SVrCMW9ZjgEiipxq7jMRn8mbbtWzyv3g8Mkwr+KwOoDFI/61hYPUbY8cUnu278+x1g==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/runtime": "^7.0.0"
},
@@ -18786,6 +18976,7 @@
"resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.8.tgz",
"integrity": "sha512-+OVISBkPNxjD4eEKhblRpBf463nTMk3KMEeYS8Z4xM/z3qujGJGSsWUGRtH27+c6zElaSGtZFiDMshEb8mMKQg==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/traverse": "^7.20.0",
"@babel/types": "^7.20.0",
@@ -18805,6 +18996,7 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -18814,6 +19006,7 @@
"resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.8.tgz",
"integrity": "sha512-nwhYySk79jQhwjL9QmOUo4wS+/0Au9joEryDWw7uj4kz2yvw1uBjwmlql3BprQCBzRdB3fcqOP8kO8Es+vE31g==",
"dev": true,
+ "peer": true,
"dependencies": {
"invariant": "^2.2.4",
"metro-source-map": "0.80.8",
@@ -18834,6 +19027,7 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -18843,6 +19037,7 @@
"resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.8.tgz",
"integrity": "sha512-sSu8VPL9Od7w98MftCOkQ1UDeySWbsIAS5I54rW22BVpPnI3fQ42srvqMLaJUQPjLehUanq8St6OMBCBgH/UWw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"@babel/generator": "^7.20.0",
@@ -18859,6 +19054,7 @@
"resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.8.tgz",
"integrity": "sha512-+4FG3TQk3BTbNqGkFb2uCaxYTfsbuFOCKMMURbwu0ehCP8ZJuTUramkaNZoATS49NSAkRgUltgmBa4YaKZ5mqw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"@babel/generator": "^7.20.0",
@@ -18881,13 +19077,15 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
"integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/metro/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
+ "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -18896,13 +19094,15 @@
"version": "0.20.1",
"resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.20.1.tgz",
"integrity": "sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/metro/node_modules/hermes-parser": {
"version": "0.20.1",
"resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.20.1.tgz",
"integrity": "sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==",
"dev": true,
+ "peer": true,
"dependencies": {
"hermes-estree": "0.20.1"
}
@@ -18911,13 +19111,15 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/metro/node_modules/source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -18927,6 +19129,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -18939,6 +19142,7 @@
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
"integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=8.3.0"
},
@@ -20654,6 +20858,7 @@
"resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
"integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
"dev": true,
+ "peer": true,
"bin": {
"mime": "cli.js"
},
@@ -20798,6 +21003,7 @@
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
"dev": true,
+ "peer": true,
"dependencies": {
"minimist": "^1.2.6"
},
@@ -20888,6 +21094,7 @@
"resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz",
"integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=12.0.0"
}
@@ -20962,7 +21169,8 @@
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
"integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/node-releases": {
"version": "2.0.27",
@@ -20975,6 +21183,7 @@
"resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz",
"integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=0.12.0"
},
@@ -21062,7 +21271,8 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
"integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/nypm": {
"version": "0.3.8",
@@ -21222,6 +21432,7 @@
"resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.8.tgz",
"integrity": "sha512-QHJQk/lXMmAW8I7AIM3in1MSlwe1umR72Chhi8B7Xnq6mzjhBKkA6Fy/zAhQnGkA4S912EPCEvTij5yh+EQTAA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -21945,7 +22156,6 @@
"url": "https://github.com/sponsors/ai"
}
],
- "peer": true,
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.0.0",
@@ -22535,7 +22745,6 @@
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
"integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
"dev": true,
- "peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -22724,6 +22933,7 @@
"resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
"integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
"dev": true,
+ "peer": true,
"dependencies": {
"asap": "~2.0.6"
}
@@ -22952,7 +23162,6 @@
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
},
@@ -23162,6 +23371,7 @@
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz",
"integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==",
"dev": true,
+ "peer": true,
"dependencies": {
"shell-quote": "^1.6.1",
"ws": "^7"
@@ -23172,6 +23382,7 @@
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
"integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=8.3.0"
},
@@ -23228,7 +23439,6 @@
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
"integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
@@ -23320,6 +23530,7 @@
"url": "https://github.com/sponsors/lavrton"
}
],
+ "peer": true,
"dependencies": {
"@types/react-reconciler": "^0.28.2",
"its-fine": "^1.1.1",
@@ -23337,6 +23548,7 @@
"resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz",
"integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/react": "*"
}
@@ -23346,6 +23558,7 @@
"resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.0.tgz",
"integrity": "sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
@@ -23362,7 +23575,6 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz",
"integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==",
- "peer": true,
"dependencies": {
"@types/react": "*"
},
@@ -23446,6 +23658,7 @@
"resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
"integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
@@ -23462,6 +23675,7 @@
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz",
"integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/yargs-parser": "*"
}
@@ -23471,6 +23685,7 @@
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
"integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
"dev": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^26.6.2",
"ansi-regex": "^5.0.0",
@@ -23485,13 +23700,15 @@
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/react-native/node_modules/scheduler": {
"version": "0.24.0-canary-efb381bbf-20230505",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz",
"integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==",
"dev": true,
+ "peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
}
@@ -23501,6 +23718,7 @@
"resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz",
"integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==",
"dev": true,
+ "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.21.0"
@@ -23517,6 +23735,7 @@
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz",
"integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
}
@@ -23526,6 +23745,7 @@
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
"integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -23534,7 +23754,6 @@
"version": "5.3.4",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz",
"integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==",
- "peer": true,
"dependencies": {
"@babel/runtime": "^7.12.13",
"history": "^4.9.0",
@@ -23602,6 +23821,7 @@
"resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz",
"integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==",
"dev": true,
+ "peer": true,
"dependencies": {
"object-assign": "^4.1.1",
"react-is": "^16.12.0 || ^17.0.0 || ^18.0.0"
@@ -23633,6 +23853,7 @@
"resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz",
"integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==",
"dev": true,
+ "peer": true,
"dependencies": {
"debounce": "^1.2.1"
},
@@ -23788,7 +24009,8 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz",
"integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/recast": {
"version": "0.23.6",
@@ -24271,6 +24493,7 @@
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -24295,7 +24518,8 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/requireindex": {
"version": "1.2.0",
@@ -24315,7 +24539,8 @@
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/resolve": {
"version": "1.22.11",
@@ -24542,7 +24767,6 @@
"resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz",
"integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==",
"dev": true,
- "peer": true,
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
@@ -24646,7 +24870,6 @@
"version": "8.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@@ -24818,6 +25041,7 @@
"resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
"integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -24992,7 +25216,8 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/set-function-length": {
"version": "1.2.2",
@@ -25250,6 +25475,7 @@
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
"integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-styles": "^3.2.0",
"astral-regex": "^1.0.0",
@@ -25264,6 +25490,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
+ "peer": true,
"dependencies": {
"color-convert": "^1.9.0"
},
@@ -25276,6 +25503,7 @@
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
+ "peer": true,
"dependencies": {
"color-name": "1.1.3"
}
@@ -25284,7 +25512,8 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/snake-case": {
"version": "3.0.4",
@@ -25451,6 +25680,7 @@
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
"integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"escape-string-regexp": "^2.0.0"
},
@@ -25463,6 +25693,7 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=8"
}
@@ -25471,13 +25702,15 @@
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
"integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/stacktrace-parser": {
"version": "0.1.10",
"resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz",
"integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==",
"dev": true,
+ "peer": true,
"dependencies": {
"type-fest": "^0.7.1"
},
@@ -25490,6 +25723,7 @@
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
"integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=8"
}
@@ -25809,7 +26043,8 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
"integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/style-loader": {
"version": "3.3.4",
@@ -25854,7 +26089,8 @@
"version": "9.2.1",
"resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz",
"integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/supports-color": {
"version": "7.2.0",
@@ -25883,6 +26119,7 @@
"resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz",
"integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==",
"dev": true,
+ "peer": true,
"peerDependencies": {
"react": ">=17.0"
}
@@ -26240,7 +26477,8 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
"integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/through2": {
"version": "2.0.5",
@@ -26316,7 +26554,8 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/to-regex-range": {
"version": "5.0.1",
@@ -26579,7 +26818,6 @@
"version": "5.4.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz",
"integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==",
- "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -27298,13 +27536,15 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz",
"integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/walker": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
"integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"makeerror": "1.0.12"
}
@@ -27359,7 +27599,6 @@
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz",
"integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.8",
@@ -27678,7 +27917,6 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"license": "MIT",
- "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -27771,7 +28009,8 @@
"version": "3.6.20",
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
"integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/whatwg-url": {
"version": "5.0.0",
@@ -27861,7 +28100,8 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
"integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/which-typed-array": {
"version": "1.1.15",
@@ -28014,6 +28254,7 @@
"resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
"integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
"dev": true,
+ "peer": true,
"dependencies": {
"async-limiter": "~1.0.0"
}
@@ -28054,6 +28295,7 @@
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=10"
}
@@ -28076,6 +28318,7 @@
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
+ "peer": true,
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
@@ -28094,6 +28337,7 @@
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -28102,13 +28346,15 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/yargs/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=8"
}
@@ -28118,6 +28364,7 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
+ "peer": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -28132,6 +28379,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
diff --git a/package.json b/package.json
index b18c1145..a4157c01 100644
--- a/package.json
+++ b/package.json
@@ -41,6 +41,7 @@
"@storybook/test": "8.0.5",
"@svgr/webpack": "8.1.0",
"@tailwindcss/postcss": "4.1.13",
+ "@types/react-dom": "18.2.0",
"autoprefixer": "10.4.19",
"docusaurus-plugin-sass": "0.2.5",
"eslint": "8.57.0",
diff --git a/sidebars.ts b/sidebars.ts
index a4dab990..4437984d 100644
--- a/sidebars.ts
+++ b/sidebars.ts
@@ -46,11 +46,6 @@ const sidebars: SidebarsConfig = {
label: "Advanced Guides",
items: [{ type: "autogenerated", dirName: "guides" }],
},
- {
- type: "doc",
- id: "testplane-mcp",
- label: "Testplane MCP",
- },
{
type: "category",
label: "Migrations",
@@ -85,6 +80,7 @@ const sidebars: SidebarsConfig = {
{ type: "link", href: "/docs/v8/commands/overview", label: "Testplane Commands" },
{ type: "autogenerated", dirName: "reference" },
],
+ ai: [{ type: "autogenerated", dirName: "ai" }],
};
export default sidebars;
diff --git a/src/components/HelpMark/index.tsx b/src/components/HelpMark/index.tsx
new file mode 100644
index 00000000..b574a2b8
--- /dev/null
+++ b/src/components/HelpMark/index.tsx
@@ -0,0 +1,203 @@
+import { CircleQuestion } from "@gravity-ui/icons";
+import React from "react";
+import { createPortal } from "react-dom";
+
+interface HelpMarkProps {
+ children: React.ReactNode;
+ className?: string;
+ side?: "top" | "bottom" | "left" | "right";
+ maxWidth?: number;
+}
+
+const GAP = 8;
+const SCREEN_PADDING = 8;
+
+const useIsomorphicLayoutEffect =
+ typeof window === "undefined" ? React.useEffect : React.useLayoutEffect;
+
+export function HelpMark({
+ children,
+ className,
+ side = "top",
+ maxWidth = 280,
+}: HelpMarkProps): React.ReactElement {
+ const id = React.useId();
+
+ const triggerRef = React.useRef(null);
+ const tooltipRef = React.useRef(null);
+ const closeTimerRef = React.useRef(null);
+
+ const [isOpen, setIsOpen] = React.useState(false);
+ const [position, setPosition] = React.useState<{
+ top: number;
+ left: number;
+ ready: boolean;
+ }>({
+ top: 0,
+ left: 0,
+ ready: false,
+ });
+
+ const clearCloseTimer = React.useCallback(() => {
+ if (closeTimerRef.current !== null) {
+ window.clearTimeout(closeTimerRef.current);
+ closeTimerRef.current = null;
+ }
+ }, []);
+
+ const open = React.useCallback(() => {
+ clearCloseTimer();
+ setIsOpen(true);
+ }, [clearCloseTimer]);
+
+ const close = React.useCallback(() => {
+ clearCloseTimer();
+
+ closeTimerRef.current = window.setTimeout(() => {
+ setIsOpen(false);
+ setPosition(prev => ({ ...prev, ready: false }));
+ }, 80);
+ }, [clearCloseTimer]);
+
+ const updatePosition = React.useCallback(() => {
+ const trigger = triggerRef.current;
+ const tooltip = tooltipRef.current;
+
+ if (!trigger || !tooltip) {
+ return;
+ }
+
+ const triggerRect = trigger.getBoundingClientRect();
+ const tooltipRect = tooltip.getBoundingClientRect();
+
+ const viewportWidth = window.innerWidth;
+ const viewportHeight = window.innerHeight;
+
+ const fitsTop = triggerRect.top >= tooltipRect.height + GAP + SCREEN_PADDING;
+ const fitsBottom =
+ viewportHeight - triggerRect.bottom >= tooltipRect.height + GAP + SCREEN_PADDING;
+ const fitsLeft = triggerRect.left >= tooltipRect.width + GAP + SCREEN_PADDING;
+ const fitsRight =
+ viewportWidth - triggerRect.right >= tooltipRect.width + GAP + SCREEN_PADDING;
+
+ let resolvedSide = side;
+
+ if (side === "top" && !fitsTop && fitsBottom) resolvedSide = "bottom";
+ if (side === "bottom" && !fitsBottom && fitsTop) resolvedSide = "top";
+ if (side === "left" && !fitsLeft && fitsRight) resolvedSide = "right";
+ if (side === "right" && !fitsRight && fitsLeft) resolvedSide = "left";
+
+ let top = 0;
+ let left = 0;
+
+ switch (resolvedSide) {
+ case "top":
+ top = triggerRect.top - tooltipRect.height - GAP;
+ left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
+ break;
+
+ case "bottom":
+ top = triggerRect.bottom + GAP;
+ left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
+ break;
+
+ case "left":
+ top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
+ left = triggerRect.left - tooltipRect.width - GAP;
+ break;
+
+ case "right":
+ top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
+ left = triggerRect.right + GAP;
+ break;
+ }
+
+ top = clamp(top, SCREEN_PADDING, viewportHeight - tooltipRect.height - SCREEN_PADDING);
+ left = clamp(left, SCREEN_PADDING, viewportWidth - tooltipRect.width - SCREEN_PADDING);
+
+ setPosition({
+ top,
+ left,
+ ready: true,
+ });
+ }, [side]);
+
+ useIsomorphicLayoutEffect(() => {
+ if (!isOpen) {
+ return;
+ }
+
+ updatePosition();
+
+ let frameId: number | null = null;
+
+ const scheduleUpdate = () => {
+ if (frameId !== null) {
+ return;
+ }
+
+ frameId = window.requestAnimationFrame(() => {
+ frameId = null;
+ updatePosition();
+ });
+ };
+
+ window.addEventListener("scroll", scheduleUpdate, true);
+ window.addEventListener("resize", scheduleUpdate);
+
+ return () => {
+ if (frameId !== null) {
+ window.cancelAnimationFrame(frameId);
+ }
+
+ window.removeEventListener("scroll", scheduleUpdate, true);
+ window.removeEventListener("resize", scheduleUpdate);
+ };
+ }, [isOpen, updatePosition]);
+
+ React.useEffect(() => {
+ return clearCloseTimer;
+ }, [clearCloseTimer]);
+
+ return (
+ <>
+
+
+
+
+ {isOpen &&
+ typeof document !== "undefined" &&
+ createPortal(
+
+ {children}
+
,
+ document.body,
+ )}
+ >
+ );
+}
+
+function clamp(value: number, min: number, max: number): number {
+ return Math.min(Math.max(value, min), max);
+}
diff --git a/src/theme/MDXComponents/Details.tsx b/src/theme/MDXComponents/Details.tsx
index ac2b7411..a37e1c90 100644
--- a/src/theme/MDXComponents/Details.tsx
+++ b/src/theme/MDXComponents/Details.tsx
@@ -24,7 +24,7 @@ export default function MDXDetails({ children, className, ...rest }: Props): JSX
diff --git a/static/img/blog/cli-and-skill/cover.png b/static/img/blog/cli-and-skill/cover.png
new file mode 100644
index 00000000..ae2b7879
Binary files /dev/null and b/static/img/blog/cli-and-skill/cover.png differ