{"owner":"Uniswap","repo":"interface","hasSkills":true,"totalSkillsCount":213,"totalTokensCount":87518,"categories":["anthropic-skill","root-instruction","plugin-manifest"],"hasMcp":false,"mcpConfig":null,"found":[".agents/skills/argent-ios-simulator-setup/SKILL.md",".agents/skills/argent-metro-debugger/SKILL.md",".agents/skills/argent-create-flow/SKILL.md",".agents/skills/argent-device-interact/SKILL.md",".agents/skills/argent-android-emulator-setup/SKILL.md",".agents/skills/argent-react-native-app-workflow/SKILL.md",".agents/skills/argent-react-native-optimization/SKILL.md",".agents/skills/argent-react-native-profiler/SKILL.md",".agents/skills/argent-screenshot-diff/SKILL.md",".agents/skills/argent-native-profiler/SKILL.md",".agents/skills/argent-test-ui-flow/SKILL.md","AGENTS.md","packages/README.md","packages/analytics/README.md","packages/analytics/package.json","packages/analytics/project.json","packages/analytics/tsconfig.json","packages/analytics/tsconfig.lint.json","packages/api/README.md","packages/api/package.json","packages/api/project.json","packages/api/tsconfig.json","packages/api/tsconfig.lint.json","packages/chains/README.md","packages/chains/package.json","packages/chains/project.json","packages/chains/tsconfig.json","packages/chains/tsconfig.lint.json","packages/compliance/README.md","packages/compliance/package.json","packages/compliance/project.json","packages/compliance/tsconfig.json","packages/compliance/tsconfig.lint.json","packages/config-cli/README.md","packages/config-cli/package.json","packages/config-cli/project.json","packages/config-cli/tsconfig.json","packages/config-cli/tsconfig.lint.json","packages/config/README.md","packages/config/package.json","packages/config/project.json","packages/config/tsconfig.json","packages/config/tsconfig.lint.json","packages/cryptography/README.md","packages/cryptography/package.json","packages/cryptography/project.json","packages/cryptography/tsconfig.json","packages/cryptography/tsconfig.lint.json","packages/datadog-cloud/INSTRUMENTATION_REPORT.md","packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml","packages/datadog-cloud/Pulumi.dev-portal-prod.yaml","packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml","packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml","packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml","packages/datadog-cloud/Pulumi.yaml","packages/datadog-cloud/package.json","packages/datadog-cloud/project.json","packages/datadog-cloud/tsconfig.json","packages/embedded-wallet/README.md","packages/embedded-wallet/package.json","packages/embedded-wallet/project.json","packages/embedded-wallet/tsconfig.json","packages/embedded-wallet/tsconfig.lint.json","packages/encoding/README.md","packages/encoding/package.json","packages/encoding/project.json","packages/encoding/tsconfig.json","packages/encoding/tsconfig.lint.json","packages/environment/README.md","packages/environment/package.json","packages/environment/project.json","packages/environment/tsconfig.json","packages/environment/tsconfig.lint.json","packages/experiments/README.md","packages/experiments/package.json","packages/experiments/project.json","packages/experiments/tsconfig.json","packages/experiments/tsconfig.lint.json","packages/gating/README.md","packages/gating/package.json","packages/gating/project.json","packages/gating/tsconfig.json","packages/gating/tsconfig.lint.json","packages/hashcash-native/README.md","packages/hashcash-native/nitro.json","packages/hashcash-native/package.json","packages/hashcash-native/project.json","packages/hashcash-native/tsconfig.json","packages/logger/README.md","packages/logger/package.json","packages/logger/project.json","packages/logger/tsconfig.json","packages/logger/tsconfig.lint.json","packages/mycelium/README.md","packages/mycelium/package.json","packages/mycelium/platform-legs.json","packages/mycelium/project.json","packages/mycelium/tsconfig.json","packages/mycelium/tsconfig.lint.json","packages/mycelium/tsconfig.test.json","packages/notifications/README.md","packages/notifications/package.json","packages/notifications/project.json","packages/notifications/tsconfig.json","packages/notifications/tsconfig.lint.json","packages/prices/README.md","packages/prices/package.json","packages/prices/project.json","packages/prices/tsconfig.json","packages/prices/tsconfig.lint.json","packages/privacy/README.md","packages/privacy/package.json","packages/privacy/project.json","packages/privacy/tsconfig.json","packages/privacy/tsconfig.lint.json","packages/react-query/README.md","packages/react-query/package.json","packages/react-query/project.json","packages/react-query/tsconfig.json","packages/react-query/tsconfig.lint.json","packages/sessions/README.md","packages/sessions/package.json","packages/sessions/project.json","packages/sessions/tsconfig.json","packages/sessions/tsconfig.lint.json","packages/tailwind/README.md","packages/tailwind/package.json","packages/tailwind/project.json","packages/tailwind/tsconfig.cross-package.json","packages/tailwind/tsconfig.json","packages/tailwind/tsconfig.lint.json","packages/test/README.md","packages/test/package.json","packages/test/project.json","packages/test/tsconfig.json","packages/trpc/README.md","packages/trpc/package.json","packages/trpc/project.json","packages/trpc/tsconfig.json","packages/trpc/tsconfig.lint.json","packages/ui/README.md","packages/ui/package.json","packages/ui/project.json","packages/ui/tsconfig.json","packages/ui/tsconfig.lint.json","packages/uniswap/openapitools.json","packages/uniswap/package.json","packages/uniswap/project.json","packages/uniswap/tsconfig.json","packages/uniswap/tsconfig.lint.json","packages/utilities/package.json","packages/utilities/project.json","packages/utilities/tsconfig.json","packages/utilities/tsconfig.lint.json","packages/wallet/package.json","packages/wallet/project.json","packages/wallet/tsconfig.json","packages/wallet/tsconfig.lint.json","packages/websocket/README.md","packages/websocket/package.json","packages/websocket/project.json","packages/websocket/tsconfig.json","packages/websocket/tsconfig.lint.json","packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml","packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml","packages/datadog-cloud/dashboards/Pulumi.prod.yaml","packages/datadog-cloud/dashboards/Pulumi.yaml","packages/datadog-cloud/dashboards/package.json","packages/datadog-cloud/dashboards/tsconfig.json","packages/datadog-cloud/esc/apps-pod-swap-fe.yaml","packages/datadog-cloud/esc/dev-portal.yaml","packages/datadog-cloud/esc/liquidity-fe.yaml","packages/datadog-cloud/esc/privy-embedded-wallet.yaml","packages/privacy/src/wallet-secret-keys.json",".agents/skills/argent-device-interact/references/gesture-examples.md",".agents/skills/argent-metro-debugger/references/failure-scenarios.md",".agents/skills/argent-metro-debugger/references/source-maps.md",".agents/skills/argent-react-native-optimization/references/fix-reference.md",".agents/skills/argent-react-native-optimization/references/lint-rules.md",".agents/skills/argent-react-native-optimization/references/semantic-checklist.md",".agents/skills/argent-react-native-profiler/references/diagnostic-tools.md","packages/datadog-cloud/dashboards/esc/shared.yaml","packages/uniswap/src/abis/erc1155.json","packages/uniswap/src/abis/erc20.json","packages/uniswap/src/abis/erc20_bytes32.json","packages/uniswap/src/abis/erc721.json","packages/uniswap/src/abis/fee-on-transfer-detector.json","packages/uniswap/src/abis/permit2.json","packages/uniswap/src/abis/weth.json","packages/uniswap/src/state/README.md","packages/utilities/src/logger/README.md","packages/utilities/src/telemetry/README.md","packages/wallet/src/state/README.md","packages/wallet/src/test/README.md","packages/api/src/clients/trading/api.json","packages/utilities/src/telemetry/trace/README.md","packages/wallet/src/features/forceUpgrade/README.md","packages/uniswap/src/i18n/locales/source/en-US.json","packages/uniswap/src/i18n/locales/translations/es-ES.json","packages/uniswap/src/i18n/locales/translations/fr-FR.json","packages/uniswap/src/i18n/locales/translations/id-ID.json","packages/uniswap/src/i18n/locales/translations/ja-JP.json","packages/uniswap/src/i18n/locales/translations/ko-KR.json","packages/uniswap/src/i18n/locales/translations/nl-NL.json","packages/uniswap/src/i18n/locales/translations/pt-BR.json","packages/uniswap/src/i18n/locales/translations/pt-PT.json","packages/uniswap/src/i18n/locales/translations/ru-RU.json","packages/uniswap/src/i18n/locales/translations/tr-TR.json","packages/uniswap/src/i18n/locales/translations/vi-VN.json","packages/uniswap/src/i18n/locales/translations/zh-CN.json","packages/uniswap/src/i18n/locales/translations/zh-TW.json","packages/uniswap/src/features/accounts/store/types/README.md","packages/uniswap/src/features/transactions/swap/components/README.md"],"skills":{".agents/skills/argent-ios-simulator-setup/SKILL.md":"---\nname: argent-ios-simulator-setup\ndescription: Set up and connect to an iOS simulator using argent MCP tools. Use when starting a new session, booting a simulator, getting a simulator UDID, or before any simulator interaction task.\n---\n\n## 1. Setup Steps\n\nIf you delegate simulator tasks to sub-agents, make sure they have MCP permissions.\n\n1. **Find a booted simulator**\n   Use `list-devices`. Filter for entries with `platform: \"ios\"` — booted iPhones are listed first.\n   If none are booted, call `boot-device` with `udid: <chosen UDID>`.\n\n2. **Verify connection**\n   All interaction tools (`gesture-tap`, `gesture-swipe`, `gesture-custom`, etc.) auto-start the server if not already running.\n\n## 2. Notes\n\n- UDIDs look like: `A1B2C3D4-E5F6-7890-ABCD-EF1234567890`\n",".agents/skills/argent-metro-debugger/SKILL.md":"---\nname: argent-metro-debugger\ndescription: Debug a React Native app via Metro CDP using argent debugger tools. Use when connecting to Metro, inspecting React components, reading console logs, or evaluating JavaScript in the app runtime.\n---\n\n## 1. Prerequisites\n\nThe debugger requires **Metro dev server running** (default `localhost:8081`) and **a React Native app connected to Metro** (at least one CDP target). Verify via `debugger-status`.\n\n### Android: reverse port for Metro\n\nAndroid emulators and physical devices do not resolve the host's `localhost` by default. Before the RN app can reach Metro, forward port 8081 (or whichever port Metro is on) from the device back to the host:\n\n```bash\nadb -s <serial> reverse tcp:8081 tcp:8081\n```\n\n`<serial>` is the Android `serial` from `list-devices`. Once reversed, the app on the device connects to Metro just like an iOS simulator does, and all `debugger-*` / `network-*` / `react-profiler-*` tools work unchanged. If the device restarts or adb drops, re-run the command. A failing Metro connection on Android almost always means `adb reverse` has not been done or has been lost.\n\n## 2. Tool Overview\n\nAll tools accept `port` (default 8081) AND `device_id` (the iOS Simulator UDID or Android serial, a.k.a. `logicalDeviceId` — the CDP-reported id that matches the device). Always make sure you target the correct app on the correct device.\n\nOne Metro port can serve multiple connected devices (e.g. two simulators on `localhost:8081`, or an iOS simulator alongside an Android emulator with `adb reverse` set up). `device_id` pins every debugger/network/profiler call to a specific device so sessions do not collide.\n\n### Connect & diagnostics\n\n| Tool               | Purpose                                                                                                                                                                                                                   |\n| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `debugger-connect` | Connect to Metro CDP. Returns port, projectRoot, deviceName, appName, `logicalDeviceId`, isNewDebugger, connected. The returned `logicalDeviceId` is the `device_id` for every subsequent debugger/network/profiler call. |\n| `debugger-status`  | Like connect + loadedScripts, enabledDomains, sourceMapReady. **Use to diagnose.**                                                                                                                                        |\n\n### Reload & recovery\n\n| Tool                    | Purpose                                                                                  |\n| ----------------------- | ---------------------------------------------------------------------------------------- |\n| `debugger-reload-metro` | Reload all connected apps (like pressing \"r\" in Metro terminal). Needs a CDP target.     |\n| `restart-app`           | Terminate and relaunch the app by UDID and bundleId. Use when app lost Metro connection. |\n\n### Inspection & console\n\n| Tool                       | Purpose                                                                                                                                                                   |\n| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `debugger-component-tree`  | Full React fiber tree (names, depth, bounding rects, tap coordinates).                                                                                                    |\n| `debugger-inspect-element` | Inspect at (x, y) using **logical pixel coordinates** (not normalized 0-1): component hierarchy with source file:line and code fragment. See `references/source-maps.md`. |\n| `debugger-log-registry`    | Get log summary (counts, clusters, file path). Then use `Grep`/`Read` on the flat log file for details.                                                                   |\n| `debugger-evaluate`        | Run a JS expression in the app runtime.                                                                                                                                   |\n\n---\n\n## 3. Component Inspection\n\n### `debugger-component-tree` vs `debugger-inspect-element`\n\n|          | `debugger-component-tree`                                              | `debugger-inspect-element`                                      |\n| -------- | ---------------------------------------------------------------------- | --------------------------------------------------------------- |\n| Best for | Layout overview; finding tap targets; user-defined component hierarchy | Identifying a visible element and tracing it to its source file |\n| Use when | \"What's on screen and where?\"                                          | \"What component is this and where is it defined?\"               |\n\nBoth can point to source files, but `inspect-element` is purpose-built for source tracing. `component-tree` is for orientation and tap-target discovery.\n\n### `includeSkipped` guidance\n\nApplies to both `debugger-component-tree` and `debugger-inspect-element`. Set to `true` only when debugging filter behavior — e.g., an expected component is missing from output, or you need to inspect a very specific branch of the tree (not just an overview).\n\n> **Warning:** Output can be very large. Always combine with `maxNodes` (component-tree) or `maxItems` (inspect-element) and increase it incrementally (e.g., start at 50, then grow). Do not use `includeSkipped` without a limit on large apps.\n\n---\n\n## 4. Golden Rules\n\n1. **`debugger-status` first when something fails** — it runs discovery, connection, and returns diagnostics.\n2. **\"No CDP targets\" → get the app to connect to Metro** — use `restart-app` on simulator, then retry `debugger-status`.\n3. **Never assume one failure is permanent** — follow recovery steps before asking the user. For starting Metro and full failure recovery, see `argent-react-native-app-workflow` and `references/failure-scenarios.md`.\n\n---\n\n## 5. Reading Console Logs (Log Registry)\n\nLogs are written to a flat log file on disk. Use the **log-registry → grep** pattern instead of reading logs inline.\n\n### Workflow\n\n1. **Call `debugger-log-registry`** — returns: `file` (log path), `totalEntries`, `byLevel`, `clusters` (top message groups with counts and source file info)\n2. **Search the file** using `Grep` or `Read` with patterns from the response.\n\n> **Large log files:** If `totalEntries` exceeds 10 000, delegate the grep exploration to an `Explore` subagent — pass it the file path, the entry format, and the patterns you need.\n\n### Flat log format\n\nOne entry per line — fields (whitespace-separated, `|` delimiter before message)\n\n| Field         | Example                     | Notes                                               |\n| ------------- | --------------------------- | --------------------------------------------------- |\n| `[L:<id>]`    | `[L:42]`                    | Unique grep anchor                                  |\n| `<timestamp>` | `2026-03-17T14:30:00.000Z`  | ISO 8601                                            |\n| `<LEVEL>`     | `ERROR`, `WARN `, `LOG  `   | Uppercase, padded to 5 chars                        |\n| `<source>`    | `src/api/user.ts:42` or `-` | Relative path from source map; `-` if unavailable   |\n| `<message>`   | `Failed login attempt`      | Full message; embedded newlines replaced with space |\n\nSource attribution (file + line) is also available in `clusters` returned by `debugger-log-registry`.\n\nLog files and messages can be large - **Always scope your search**, treat the file like a database, not a document.\n\nWhen reading from the log file:\n\n- Never `Read` the log file directly. Use `grep` or shell commands with limits using the above file format tips.\n- Default to `-m 50` unless you need more.\n- Use `tail -N` recent entries.\n- `clusters[].message` gives you the exact text which you may look for\n\n> **If the file is too large** Delegate to an `Explore` subagent with the file path, the format spec above, and the specific patterns you need.\n\n---\n\n## Quick Reference\n\n| Action                        | Tool                                                                |\n| ----------------------------- | ------------------------------------------------------------------- |\n| Diagnose / check connection   | `debugger-status`                                                   |\n| Connect to Metro CDP          | `debugger-connect`                                                  |\n| Reload JS (already connected) | `debugger-reload-metro`                                             |\n| Relaunch app on simulator     | `restart-app`                                                       |\n| Inspect component at point    | `debugger-inspect-element`                                          |\n| Full component tree           | `debugger-component-tree`                                           |\n| Console log overview          | `debugger-log-registry` (summary + log file path for `Grep`/`Read`) |\n| Evaluate JS                   | `debugger-evaluate`                                                 |\n",".agents/skills/argent-create-flow/SKILL.md":"---\nname: argent-create-flow\ndescription: Record a reusable flow (scripted sequence of MCP tool calls) that can be replayed later with a single command. Use when the user asks to create, record, or build a flow, or to script a sequence of simulator actions.\n---\n\n## 1. Overview\n\nA flow is a recorded sequence of MCP tool calls saved to a `.yaml` file in the `.argent/flows/` directory. Each step is **executed live** as you add it, so you verify it works before it becomes part of the flow. Replay a finished flow with `flow-execute`.\n\n## 2. Tools\n\n| Tool                     | Purpose                                                                    |\n| ------------------------ | -------------------------------------------------------------------------- |\n| `flow-start-recording`   | Start recording — takes a name and executionPrerequisite, creates the file |\n| `flow-add-step`          | Execute a tool call live and record it if it succeeds                      |\n| `flow-add-echo`          | Add a label/comment that prints during replay                              |\n| `flow-finish-recording`  | Stop recording and get a summary                                           |\n| `flow-read-prerequisite` | Read a flow's execution prerequisite without running it                    |\n| `flow-execute`           | Replay a saved flow by name                                                |\n\n## 3. Workflow\n\n### Recording\n\n1. **Start**: Call `flow-start-recording` with a descriptive name, the absolute `project_root`, and an `executionPrerequisite` describing the required app state before running the flow (e.g. \"App on home screen after a fresh reload\"). `project_root` is stored for the session — you do **not** need to pass it again to subsequent tools.\n2. **Build step-by-step**: For each action, call `flow-add-step` with the tool name and args. The tool runs immediately — check the result before moving on.\n3. **Add labels**: Use `flow-add-echo` between steps to describe what each section does.\n4. **Finish**: Call `flow-finish-recording` to stop recording. It returns the file path where the flow was saved and a summary of all steps. You can edit the `.yaml` file directly afterwards to remove, reorder, or tweak steps.\n\nEvery tool during recording returns the current flow file contents so you can track what has been recorded.\n\n### Replaying\n\nCall `flow-execute` with the flow name. If the flow has an execution prerequisite:\n\n1. The tool returns a **notice** with the prerequisite text instead of running. It asks you to verify the prerequisite is met and call `flow-execute` again with `prerequisiteAcknowledged: true`.\n2. You can also call `flow-read-prerequisite` beforehand to inspect the prerequisite without triggering a run.\n3. Once you pass `prerequisiteAcknowledged: true`, the flow runs all steps in order and returns every tool call result (including screenshots) merged into a single response.\n\nIf the flow has no prerequisite, it runs immediately without needing acknowledgment.\n\n## 4. flow-add-step Usage\n\nThe `command` parameter is the MCP tool name. The `args` parameter is a **JSON string** (not an object):\n\n```\ncommand: \"launch-app\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\", \\\"bundleId\\\": \\\"com.apple.Preferences\\\"}\"\n```\n\n```\ncommand: \"gesture-tap\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.35}\"\n```\n\n```\ncommand: \"screenshot\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\"}\"\n```\n\nFor tools with no arguments, omit `args` entirely.\n\n## 5. Important Rules\n\n- **Every step runs live.** You will see the real tool result (including screenshots). Use this to verify the step worked before continuing.\n- **Only successful steps are recorded.** If a tool call fails, nothing is written to the flow file — fix the issue and try again.\n- **Pass `project_root` only to `flow-start-recording`.** It is stored for the session and automatically used by all subsequent flow tools. An error is returned if the path is not absolute.\n- **You do NOT need to pass a flow name** to `flow-add-step`, `flow-add-echo`, or `flow-finish-recording`. The active flow is tracked automatically after `flow-start-recording`.\n- **Start before adding.** Calling `flow-add-step`, `flow-add-echo`, or `flow-finish-recording` without an active recording returns an error: _\"No active flow. Call flow-start-recording first.\"_\n- **One flow at a time.** If you call `flow-start-recording` while already recording, the active flow switches to the new one. The response tells you which flow was abandoned and which is now active. The old flow's file remains on disk.\n- **Mistakes can be edited out.** If a step was recorded by mistake, edit the `.yaml` file directly to remove or reorder entries.\n\n## 6. Example Session\n\n```\nflow-start-recording  { name: \"open-settings\", project_root: \"/Users/dev/MyApp\", executionPrerequisite: \"Simulator booted with app installed\" }\nflow-add-echo  { message: \"Launch Settings app\" }\nflow-add-step  { command: \"launch-app\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"bundleId\\\": \\\"com.apple.Preferences\\\"}\" }\nflow-add-echo  { message: \"Tap General\" }\nflow-add-step  { command: \"gesture-tap\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.35}\" }\nflow-add-echo  { message: \"Tap About\" }\nflow-add-step  { command: \"gesture-tap\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.17}\" }\nflow-finish-recording  {}\n```\n\n## 7. Replay Example\n\n```\nflow-execute   { name: \"open-settings\", project_root: \"/Users/dev/MyApp\" }\n→ Returns: notice with executionPrerequisite: \"Simulator booted with app installed\"\n  \"Verify the prerequisite is met and call flow-execute again with prerequisiteAcknowledged set to true.\"\n\nflow-execute   { name: \"open-settings\", project_root: \"/Users/dev/MyApp\", prerequisiteAcknowledged: true }\n→ Runs all steps, returns merged results with status and output for every step\n```\n\n## 8. Flow File Format\n\nFlow files use YAML. The top-level is an object with `executionPrerequisite` (describes required state) and `steps` (array of actions):\n\n- `- echo: <message>` — a label\n- `- tool: <name>` with optional `args:` — a tool call. Add `delayMs: <ms>` to sleep that long before the step runs (use sparingly — only when the app needs a fixed wait between actions).\n\nExample `.yaml` file:\n\n```yaml\nexecutionPrerequisite: Simulator booted with app installed\nsteps:\n  - echo: Launch Settings app\n  - tool: launch-app\n    args:\n      udid: ABC\n      bundleId: com.apple.Preferences\n  - echo: Tap General\n  - tool: gesture-tap\n    args:\n      udid: ABC\n      x: 0.5\n      y: 0.35\n  - echo: Tap About\n  - tool: gesture-tap\n    args:\n      udid: ABC\n      x: 0.5\n      y: 0.17\n```\n\n## 9. When to Proactively Record a Flow\n\nYou do not need the user to ask for a flow. Record one proactively when you recognize any of these patterns:\n\n- **About to re-profile**: You completed a profiling session and are about to apply a fix and re-profile. Record the interaction steps now so the re-profile replays them identically (see `argent-react-native-profiler` and `argent-native-profiler` skills).\n- **Repeating steps**: You have already performed a multi-step interaction sequence once and the task requires doing it again (comparison, retry, re-test).\n- **Complex path discovered**: You worked through a non-trivial sequence of taps/swipes/navigation to reach a desired app state. Capture it before it is lost.\n- **User says \"again\" / \"one more time\"**: Any request to redo what you just did is a signal to record first, then replay.\n\n## 10. Flow Self-Improvement\n\nFlows break. UI layouts change, coordinates drift, screens get added or removed. When `flow-execute` returns a failure, follow this procedure to diagnose and fix the flow instead of silently re-recording or giving up.\n\n### 10.1 Classify the Result\n\nAfter every `flow-execute`, classify the outcome before proceeding:\n\n| Outcome                | Signal                                                                | Action             |\n| ---------------------- | --------------------------------------------------------------------- | ------------------ |\n| **Success**            | All steps completed, final screenshot shows expected state            | Continue with task |\n| **Hard error**         | A step has `ERROR` in the result — engine stopped there               | Enter §10.2        |\n| **Silent misfire**     | All steps completed but final screenshot shows wrong screen           | Enter §10.2        |\n| **Partial divergence** | Intermediate screenshot shows wrong state even though later steps ran | Enter §10.2        |\n\nFor silent misfires and partial divergence, echo annotations (§10.5) are your reference for what each screen _should_ look like.\n\n### 10.2 Diagnose\n\n1. Note the failure step index and error message (if hard error).\n2. Call `screenshot` to see where the app actually is now.\n3. Call `describe` or `debugger-component-tree` to get the current element tree.\n4. Compare current state to what the failed step expected. Classify the root cause:\n\n| Root cause       | Symptoms                                                        |\n| ---------------- | --------------------------------------------------------------- |\n| Coordinate drift | Tap succeeded but hit wrong element; elements shifted positions |\n| Missing element  | Target element not present in element tree                      |\n| Wrong screen     | Screenshot shows entirely different page than expected          |\n| Timing           | Element exists in tree but tap missed; loading spinner visible  |\n| State mismatch   | First step fails — executionPrerequisite was not actually met   |\n\n5. State the diagnosis in one sentence before attempting any correction.\n\n### 10.3 Correct\n\nChoose the lightest strategy that fits:\n\n**Strategy 1 — Edit the YAML** (coordinate drift, parameter changes).\nRead `.argent/flows/<flow-name>.yaml`, update the broken step's `x`/`y`, `bundleId`, `text`, or other args. Re-run `flow-execute` to verify.\n\n**Strategy 2 — Manual recovery + continue** (timing/transient issues, one-off replay).\nManually execute the failed step with corrected coordinates from §10.2 discovery, then manually execute remaining steps. Does not fix the YAML — use only when re-recording is not worth it.\n\n**Strategy 3 — Re-record from failure point** (structural changes, new intermediate screens).\nNavigate the app to the state just before the failure point. Call `flow-start-recording` with the same flow name (overwrites). Re-add the working prefix steps via `flow-add-step`, then continue recording new steps from the divergence point. Call `flow-finish-recording`.\n\n**Strategy 4 — Full re-record** (major changes, unclear diagnosis, or 3+ broken steps).\nReset the app to prerequisite state (`restart-app` + `launch-app`). Record from scratch with the same flow name.\n\n**Decision heuristic:**\n\n- 1 step broken, parameter-only change → Strategy 1\n- 1 step broken, transient issue, not worth persisting → Strategy 2\n- 2–3 steps broken or flow structure partially changed → Strategy 3\n- 3+ steps broken, or unclear root cause → Strategy 4\n- Flow used for profiling comparison (must be identical) → Strategy 4\n\n### 10.4 Verify and Bound Retries\n\nAfter applying a correction, re-run `flow-execute` to verify.\n\n- If it succeeds → done. Report what changed (e.g. \"Fixed step 4: updated tap coordinates from 0.5,0.35 to 0.5,0.42\").\n- If it fails at a **different** step → return to §10.2 for a second attempt.\n- If this is already the second correction attempt → **stop**. Report the diagnosis to the user and recommend a full re-record or manual investigation.\n\n**Hard cap: 2 correction cycles.** Do not enter an unbounded fix loop.\n\n### 10.5 Making Flows Resilient\n\nApply these when recording new flows to reduce future breakage:\n\n- **Echo expected state, not just actions.** Write `\"On Settings > General screen, about to tap About\"` not `\"Tap About\"`. During diagnosis these tell you what the screen _should_ look like.\n- **Add screenshot steps after critical navigation.** Insert `screenshot` steps after screen transitions. These produce images in the flow result you can inspect during diagnosis.\n- **Write specific executionPrerequisites.** `\"App on home tab, user logged in, simulator UDID is <X>\"` — not `\"App running\"`. Verify with `screenshot` + `describe` before acknowledging.\n- **Prefer launch-app / open-url over navigation chains.** Deep links are more resilient to layout changes than tap sequences.\n- **Echo accessibility labels for coordinate taps.** When recording a tap, add an echo with the target's label or testID: `\"Tapping 'Submit' button (testID: submit-btn) at 0.5, 0.82\"`. During repair, use `describe` to find the element by label and update coordinates. Only use `screenshot` for permission or system overlays when `describe` cannot expose the target reliably.\n",".agents/skills/argent-device-interact/SKILL.md":"---\nname: argent-device-interact\ndescription: Interact with an iOS simulator or Android emulator using argent MCP tools. Use when tapping UI elements, performing gestures, scrolling, typing text, pressing hardware buttons, launching apps, opening URLs, taking screenshots.\n---\n\n## Unified tool surface\n\nAll interaction tools below accept a `udid` parameter and auto-dispatch iOS vs Android based on its shape (UUID → iOS simulator, anything else → Android adb serial). You use the same tool names on both platforms.\n\nFor platform-specific caveats (Metro `adb reverse`, locked-screen describe errors, etc.), see § 9 Platform-specific notes at the bottom.\n\n## 1. Before You Start\n\nIf you delegate simulator tasks to sub-agents, make sure they have MCP permissions.\n\nUse `list-devices` to get a target id. Results are tagged with `platform` (`ios` or `android`); booted/ready devices come first. Pick the first entry that matches the platform you need — if none are ready, call `boot-device` with `udid` (iOS) or `avdName` (Android). See `argent-ios-simulator-setup` / `argent-android-emulator-setup` for full setup flow.\n\n**Load tool schemas before first use.** Gesture tools (`gesture-tap`, `gesture-swipe`, `gesture-pinch`, `gesture-rotate`, `gesture-custom`) may be deferred — their parameter schemas are not loaded until fetched. Always use ToolSearch to load the schemas of all gesture tools you plan to use **before** calling any of them. If you skip this step, parameters may be coerced to strings instead of numbers, causing validation errors.\n\n## 2. Best Practices\n\n1. **Always refer to tapping_rule** from your argent.md rule before tapping.\n2. Before performing interactions, consider whether they can be **dispatched sequentially** - more on that in `run-sequence`.\n3. **Use `gesture-swipe` for lists/scrolling**, not `gesture-custom`, unless you need non-linear movement. Consider whether you need multiple swipes, if yes - use `run-sequence`.\n4. **Tap a text field before typing** — on iOS try `paste` first then fall back to `keyboard`; on Android use `keyboard` directly (`paste` is iOS-only).\n5. **Coordinates are normalized** — always 0.0–1.0, not pixels.\n6. **For native iOS app navigation, prefer `describe` first.** It works on any screen without app restart. Do not navigate from screenshots on regular in-app screens unless `describe` failed to expose a reliable target. Use `native-describe-screen` only when you need app-scoped UIKit properties.\n\n## 3. Opening Apps\n\n**Never navigate to an app by tapping home-screen icons.** Use `launch-app` or `open-url` — they are instant and reliable.\n\n### launch-app — by bundle ID\n\n```json\n{ \"udid\": \"<UDID>\", \"bundleId\": \"com.apple.MobileSMS\" }\n```\n\nCommon IDs: `com.apple.MobileSMS` (Messages), `com.apple.mobilesafari` (Safari), `com.apple.Preferences` (Settings), `com.apple.Maps`, `com.apple.Photos`, `com.apple.mobilemail`, `com.apple.mobilenotes`, `com.apple.MobileAddressBook` (Contacts)\n\n### open-url — by URL scheme\n\n```json\n{ \"udid\": \"<UDID>\", \"url\": \"messages://\" }\n```\n\nCommon schemes: `messages://`, `settings://`, `maps://?q=<query>`, `tel://<number>`, `mailto:<address>`, `https://...` (Safari)\n\n## 4. Choosing the Right Tool\n\n| Action           | Tool             | Notes                                                                  |\n| ---------------- | ---------------- | ---------------------------------------------------------------------- |\n| Multiple actions | `run-sequence`   | Batch steps in one call (no intermediate screenshots)                  |\n| Open an app      | `launch-app`     | **Always — never tap home-screen icons**                               |\n| Restart an app   | `restart-app`    | Terminate and relaunch by bundle ID                                    |\n| Open URL/scheme  | `open-url`       | Web pages, deep links, URL schemes                                     |\n| Single tap       | `gesture-tap`    | Buttons, links, checkboxes                                             |\n| Scroll/swipe     | `gesture-swipe`  | Straight-line scroll or swipe                                          |\n| Long press       | `gesture-custom` | Context menus, drag start                                              |\n| Drag & drop      | `gesture-custom` | Complex drag interactions                                              |\n| Pinch/zoom       | `gesture-pinch`  | Two-finger pinch with auto-interpolation                               |\n| Rotation         | `gesture-rotate` | Two-finger rotation with auto-interpolation                            |\n| Custom gesture   | `gesture-custom` | Arbitrary touch sequences, optional interpolation                      |\n| Hardware key     | `button`         | Home, back, power, volume, appSwitch, actionButton                     |\n| Type text (fast) | `paste`          | iOS only. Form fields — uses clipboard                                 |\n| Type text        | `keyboard`       | iOS+Android. Fallback when paste fails; supports Enter, Escape, arrows |\n| Rotate device    | `rotate`         | Orientation changes                                                    |\n\n## 5. Finding Tap Targets\n\nIMPORTANT. When moved to a different screen after an action or do not know the coordinates of component, **always** perform proper discovery first.\n\n| App type                          | Discovery tool            | What it returns                                                                                                                                                                                                               |\n| --------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Target app discovery              | `describe`                | Accessibility element tree for the current device screen (iOS AX-service or Android uiautomator) with normalized frame coordinates. Works on any app, system dialogs, and Home screen — no app restart or `bundleId` required |\n| React Native                      | `debugger-component-tree` | React component tree with names, text, testID, and (tap: x,y)                                                                                                                                                                 |\n| App-scoped native                 | `native-describe-screen`  | Low-level app-scoped accessibility elements with normalized and raw coordinates; requires `bundleId`                                                                                                                          |\n| Permission / system modal overlay | `describe`                | `describe` detects system dialogs automatically and returns dialog buttons with tap coordinates. Fall back to `screenshot` only if `describe` does not expose the controls                                                    |\n| Final visual fallback             | `screenshot`              | Use only when discovery tools cannot inspect the current UI reliably. Do not derive routine in-app navigation targets from screenshots                                                                                        |\n\nPoint follow-up native diagnostics after you already have a candidate point:\n\n- `native-user-interactable-view-at-point`: deepest native view that would receive touch at a known raw iOS point; requires `bundleId`\n- `native-view-at-point`: deepest visible native view at a known raw iOS point; requires `bundleId`\n\n### If `describe` Fails\n\nRead the exact error and choose the action that matches it:\n\n- Error mentions `ax-service` not available or daemon startup failure:\n  the ax-service daemon could not start. Check that the simulator is booted. Use `screenshot` as a temporary fallback, or use `native-describe-screen` with an explicit `bundleId` if the app has native devtools injected.\n- `describe` returns an empty element list:\n  the screen may be blank, loading, or showing content without accessibility labels. Use `screenshot` to see what is visible, then retry after the content has loaded.\n- `describe` succeeds but is not detailed enough for a React Native app:\n  use `debugger-component-tree` next.\n- You need app-scoped inspection with full UIKit properties (`accessibilityIdentifier`, `viewClassName`):\n  use `native-describe-screen` with an explicit `bundleId`. This requires native devtools (dylib) injection — call `restart-app` first if needed.\n- You already have a candidate point and want to confirm what would actually receive touch:\n  use `native-user-interactable-view-at-point`. Use `native-view-at-point` when you want the visually deepest view instead of the hit-test target.\n\n## 6. Tool Usage\n\n### gesture-tap — Single tap at a point\n\n```json\n{ \"udid\": \"<UDID>\", \"x\": 0.5, \"y\": 0.5 }\n```\n\nCoordinates: `0.0` = left/top, `1.0` = right/bottom.\n\nBefore tapping near the bottom of the screen in React Native apps, check that \"Open Debugger to View Warnings\" banners are not visible — tapping them breaks the debugger connection. Close them with the X icon if present.\n\n### gesture-swipe — Straight-line gesture\n\n```json\n{ \"udid\": \"<UDID>\", \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 }\n```\n\nSwipe **up** (`fromY > toY`) = scroll content **down**. Default duration: 300ms. Optional: `\"durationMs\": 500` for slower swipe.\n\n### gesture-pinch — Two-finger pinch\n\n```json\n{ \"udid\": \"<UDID>\", \"centerX\": 0.5, \"centerY\": 0.5, \"startDistance\": 0.2, \"endDistance\": 0.6 }\n```\n\nAll values are normalized 0.0–1.0 (fractions of screen, not pixels) — same as all other gesture tools. `startDistance: 0.2` means fingers start 20% of the screen apart; `endDistance: 0.6` means they end 60% apart. `startDistance < endDistance` = pinch out (zoom in). `startDistance > endDistance` = pinch in (zoom out). Defaults: `angle: 0` (horizontal), `durationMs: 300`. Optional: `\"angle\": 90` for vertical axis, `\"durationMs\": 500` for slower pinch.\n\n### gesture-rotate — Two-finger rotation\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"centerX\": 0.5,\n  \"centerY\": 0.5,\n  \"radius\": 0.15,\n  \"startAngle\": 0,\n  \"endAngle\": 90\n}\n```\n\nAll positions and radius are normalized 0.0–1.0 (fractions of screen, not pixels). `radius: 0.15` means each finger is 15% of the screen away from center. `endAngle > startAngle` = clockwise. Default duration: 300ms. Optional: `\"durationMs\": 500` for slower rotation.\n\n### gesture-custom — Custom touch sequence\n\nFor long-press, drag-and-drop, and other complex sequences, see `references/gesture-examples.md`. Set `\"interpolate\": 10` to auto-generate smooth intermediate Move events between keyframes.\n\n### button — Hardware button press\n\n```json\n{ \"udid\": \"<UDID>\", \"button\": \"home\" }\n```\n\nValues: `home`, `back`, `power`, `volumeUp`, `volumeDown`, `appSwitch`, `actionButton`\n\n### paste — Type text into focused field (iOS only)\n\n```json\n{ \"udid\": \"<UDID>\", \"text\": \"Hello, world!\" }\n```\n\nTap the field first, then paste. Fall back to `keyboard` if it doesn't work. On Android the call is rejected by the capability gate (\"Tool 'paste' is not supported on android\") — use `keyboard` directly.\n\n### keyboard — Type text or press special keys\n\n```json\n{ \"udid\": \"<UDID>\", \"text\": \"search query\", \"key\": \"enter\" }\n```\n\nSpecial keys: `enter`, `escape`, `backspace`, `tab`, `space`, `arrow-up`, `arrow-down`, `arrow-left`, `arrow-right`, `f1`–`f12`. Optional: `\"delayMs\": 100` between keystrokes (default 50ms).\n\n### rotate — Change orientation\n\n```json\n{ \"udid\": \"<UDID>\", \"orientation\": \"LandscapeLeft\" }\n```\n\nValues: `Portrait`, `LandscapeLeft`, `LandscapeRight`, `PortraitUpsideDown`\n\n---\n\n## 7. Screenshots\n\nUse the explicit `screenshot` tool only when:\n\n- You need the initial screen state before any action.\n- The auto-attached screenshot shows a transitional or loading frame.\n- You require extra context.\n- You want to check state after a delay (e.g. waiting for a network response).\n- A permission dialog, system alert, or native modal overlay is visible and `describe` did not expose reliable targets.\n\nWhen using `screenshot` for permission or native modal navigation:\n\n- Do not switch to screenshot-driven navigation just because a modal is visible. On regular app screens and in-app modals, keep using `describe`.\n- Prefer obvious, centered alert buttons such as `Allow`, `OK`, `Don't Allow`, `Not Now`, or `Continue`.\n- Tap one control at a time and inspect the returned auto-screenshot before doing anything else.\n- After the modal is dismissed, return to normal discovery with `describe`, `native-describe-screen`, or `debugger-component-tree`.\n\nOptional rotation parameter: `{ \"udid\": \"<UDID>\", \"rotation\": \"LandscapeLeft\" }` — rotates the capture without changing simulator orientation.\n\nScreenshots are downscaled by default (30% of original resolution) to reduce context size. `scale` accepts values from 0.01 to 1.0. If UI elements are hard to read or you need to inspect fine detail, pass `scale: 1.0` to get full resolution: `{ \"udid\": \"<UDID>\", \"scale\": 1.0 }`.\n\n### Troubleshooting\n\n| Problem                 | Solution                                                      |\n| ----------------------- | ------------------------------------------------------------- |\n| Screenshot times out    | Restart the simulator-server via `stop-simulator-server` tool |\n| No booted iOS simulator | Call `boot-device` with the iOS `udid`                        |\n| No ready Android device | Call `boot-device` with `avdName`                             |\n\n---\n\n## 8. Action Sequencing with `run-sequence`\n\nUse `run-sequence` to batch multiple interaction steps into **a single tool call**. Only one screenshot is returned — after all steps complete. Use cases:\nscrolling multiple times, typing and submitting automatically, known sequence of multiple taps, rotating device back and forth.\n\nDo **not** use `run-sequence` when any step depends on observing the result of a previous step\n\n### Use cases\n\nUse the sequencing when:\n\n- Knowing that some action needs multiple steps without necessarily immediate insight of screenshot\n- \"scroll to bottom\", \"scroll to top\", \"scroll to do X\" -> sequence scroll 3-5 times\n- form interactions, \"clear and retype field\" -> you may use triple-tap to select all, type new value\n- \"submit form\" → fill all fields in sequence, tap submit\n- \"go back to X\" → defined tap sequence for the navigation\n\n### Allowed tools inside `run-sequence`\n\n`gesture-tap`, `gesture-swipe`, `gesture-custom`, `gesture-pinch`, `gesture-rotate`, `button`, `keyboard`, `rotate`\n\nThe `udid` is shared — do **not** include it in each step's `args`. Optional `delayMs` per step (default 100ms).\n\n### Examples\n\nScroll down three times:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } },\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } },\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } }\n  ]\n}\n```\n\nType into a focused field and submit:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"keyboard\", \"args\": { \"text\": \"hello world\" } },\n    { \"tool\": \"keyboard\", \"args\": { \"key\": \"enter\" } }\n  ]\n}\n```\n\nTap a known button, then scroll down:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"gesture-tap\", \"args\": { \"x\": 0.5, \"y\": 0.15 } },\n    {\n      \"tool\": \"gesture-swipe\",\n      \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 },\n      \"delayMs\": 300\n    }\n  ]\n}\n```\n\nStops on the first error and returns partial results.\n\n---\n\n## 9. Platform-specific notes\n\n### Android\n\n- **Metro reachability**: run `adb reverse tcp:8081 tcp:8081` on the device before the RN app starts, or Metro won't be reachable from the device. See `argent-metro-debugger` for the full workflow. Re-run if the device restarts.\n- **First-launch permission prompts**: `reinstall-app` on Android always installs with `-g` so runtime permissions are pre-granted on first launch — no flag to pass.\n- **Locked screen / secure surfaces**: `describe` throws a clear error if it can't capture (keyguard, DRM, Play Integrity). Unlock the device or fall back to `screenshot`.\n- **APK vs .app in `reinstall-app`**: pass `.apk` absolute path on Android; `.app` directory on iOS.\n\n### iOS\n\n_(no iOS-only gotchas collected here yet — add them as they come up)_\n",".agents/skills/argent-android-emulator-setup/SKILL.md":"---\nname: argent-android-emulator-setup\ndescription: Set up and connect to an Android emulator using argent MCP tools. Use when starting a new session on Android, booting an emulator, getting a device serial, or before any UI interaction task.\n---\n\n## 1. Prerequisites\n\n- **Android SDK Platform Tools** on PATH — provides `adb`.\n- **Android Emulator** on PATH — needed to boot AVDs. If you will only use an already-running emulator or a physical device, adb alone is sufficient.\n- An AVD created via Android Studio or `avdmanager create avd`.\n\nVerify with `adb version` and `emulator -list-avds`.\n\n## 2. Setup\n\n1. **Find a ready device** — call `list-devices`. Filter for entries with `platform: \"android\"`. Ready devices (`state: \"device\"`) come first. Pick the first `serial` (e.g. `emulator-5554`) unless the user specified one.\n2. **Boot if needed** — if nothing Android is ready, call `boot-device` with `avdName: <name>` from the same call's `avds` list. The tool transparently picks hot vs cold boot: it probes the AVD's `default_boot` snapshot, restores it under a tight deadline when usable, and falls back to a full cold boot otherwise. Hot path is typically ~30s; cold path takes 2–10 min. On any stage failure the tool kills the emulator process it started so your next call starts from a clean state.\n3. **Metro (for React Native)** — once a device is up, run `adb -s <serial> reverse tcp:8081 tcp:8081` so the device can reach Metro on your host. Repeat if the device restarts. See the `argent-metro-debugger` skill.\n\n## 3. Using the device\n\nPass the Android serial as `udid` to the unified interaction tools — `gesture-tap`, `gesture-swipe`, `describe`, `screenshot`, `launch-app`, `keyboard`, etc. Dispatch is automatic based on the id shape. See `argent-device-interact` for platform-neutral interaction tooling and the Android-specific gotchas section at the bottom of that skill.\n\n## 4. Notes\n\n- Serials are the adb device id. iOS UDIDs and Android serials are not interchangeable, but you do NOT need to tell the tools which platform — dispatch is automatic.\n- `describe` on Android returns a shallower tree than iOS (no accessibility-service equivalent), but covers most tap-target discovery.\n- `reinstall-app` on Android always installs with `-g` so first-launch runtime permissions are pre-granted.\n- To kill the emulator when you're done, run `adb -s <serial> emu kill` from a shell.\n",".agents/skills/argent-react-native-app-workflow/SKILL.md":"---\nname: argent-react-native-app-workflow\ndescription: Step-by-step workflows for developing or debugging React Native apps on iOS simulator or Android emulator. Use when starting the app, debugging Metro, fixing builds, diagnosing runtime errors, or running tests.\n---\n\n## 1. Starting the React Native App\n\n### 1.1 Explore Configuration (MANDATORY — Do This First)\n\n**Before running commands**, read the project's build and run configuration from the `argent-environment-inspector` subagent result.\n\nDo NOT default to `npx react-native start` or `npx react-native run-ios` without first checking for custom scripts and workflows.\n\n**Manual fallback** (if neither the agent nor the tool is available): read ALL `package.json` scripts — look for custom scripts like `start:local`, `start:dev`, `ios`, `build:ios`, flavors, etc. Custom scripts take priority over default commands. Also check `metro.config.js` for non-default port or watchFolders. For iOS builds, prefer opening `.xcworkspace` over `.xcodeproj` (CocoaPods generates the workspace).\n\n**If the project structure is convoluted, ask the user before proceeding.**\n\n**Remember the workflow:** Once you discover the project's build/run workflow, save it to project memory so you don't need to re-discover it each time.\n\n**Checklist before start:**\n\n- [ ] `node_modules` present (if not: `bun install`)\n- [ ] For iOS: `ios/Podfile` exists; if `ios/Pods` missing or stale, run `cd ios && pod install && cd ..`\n- [ ] No conflicting Metro on default port (see 1.2)\n\n### 1.2 Start Metro\n\n1. Check whether metro is already running on port found in configuration and if it is - do not start another server. Refer to point 2.1.\n\n1. **Use the project's custom start script if one exists** (e.g. `npm run start:local`, `yarn start:dev`). In this monorepo:\n\n   ```bash\n   bun mobile start\n   ```\n\n   Fall back to `npx react-native start` only if no project script exists. Optional: `bun mobile start --reset-cache` if cache issues are suspected.\n\n1. **Verify Metro is ready**: use the `debugger-status` tool to verify Metro is running and reachable.\n\n1. **Projects with flavors or custom configs**: Use project-specific start script if present (e.g. `npm run start:local`), and start Metro **before** running the app.\n\n### 1.3 Run the App\n\nIn a **separate** terminal (Metro keeps running in the first):\n\n**Use the project's custom build/run script if one exists** (e.g. `npm run ios`, `npm run android`, `yarn ios:debug`). Only fall back to the default if no custom scripts are defined:\n\n```bash\nnpx react-native run-ios       # iOS\nnpx react-native run-android   # Android\n```\n\nOptional: specify the target device, e.g. `npx react-native run-ios --simulator=\"iPhone 16\"` or `npx react-native run-android --deviceId=<serial>`.\n\n**Android only**: after install, run `adb -s <serial> reverse tcp:8081 tcp:8081` so the emulator/device can reach Metro on your host. Repeat if the device restarts or adb drops.\n\n**Agent checklist:**\n\n- [ ] Metro is already running and shows \"ready\"\n- [ ] Command run from project root\n- [ ] If the device isn't booted: use `boot-device` with the iOS `udid` or Android `avdName`. Refer to the `argent-ios-simulator-setup` / `argent-android-emulator-setup` skill.\n- [ ] Android: `adb -s <serial> reverse tcp:8081 tcp:8081` done.\n\n---\n\n## 2. Ensuring / Debugging Metro\n\n### 2.1 Check for Existing Metro\n\nBefore starting Metro, avoid \"port already in use\" errors. Default port to check is :8081, infer the port from documentation:\n\n```bash\nlsof -i :PORT\n```\n\n- **No output** → Port free; safe to start Metro.\n- **Output with PID** → Another process is using the port.\n\nUse the `debugger-status` tool to check whether the process on that port is actually a Metro server. If not Metro — ask the user whether you may kill the process.\n\nTo kill a Metro process, use the `stop-metro` tool (requires user confirmation).\n\n### 2.2 Confirm Correct Server Connection\n\n- **App must point at the same host/port as the running Metro.** Default: same machine, port 8081.\n- **iOS Simulator:** By default uses localhost; no extra config needed for same-machine Metro.\n\n**Verify Metro is reachable:** use the `debugger-status` tool.\n\n### 2.3 Reload the App (Ensure New Bundle)\n\nAfter code or config changes, the app must load the new bundle:\n\n| Method      | How                                                                                               |\n| ----------- | ------------------------------------------------------------------------------------------------- |\n| Reload tool | Use the `debugger-reload-metro` tool                                                              |\n| Restart app | Use the `restart-app` tool, or kill the app in simulator and run `npx react-native run-ios` again |\n\n**Agent checklist:**\n\n- [ ] Only one Metro process (no duplicate on port)\n- [ ] App was started after Metro was ready\n- [ ] When needing to reload: refer to 2.3\n\n---\n\n## 3. Build / Install / Retry (React Native & iOS Native)\n\n### 3.1 When Build Fails (e.g. xcodebuild exit code 65)\n\n**Order of operations (simplest first):**\n\n1. Clean build folder, then retry the build command\n2. Clear caches and reinstall dependencies: reset Metro cache, `watchman watch-del-all`, remove `node_modules` + lockfile, `bun install`, then `cd ios && rm -rf build Pods Podfile.lock && pod install --repo-update`\n3. CocoaPods issues: `pod deintegrate` then `pod install --repo-update`\n4. Open `ios/*.xcworkspace` in Xcode for detailed errors in the Report navigator\n\n### 3.2 When to Ask the User\n\n**After 2-3 failed build or run attempts, STOP and ask the user for guidance.** The user may know about required env vars, Xcode version requirements, custom build configurations, monorepo-specific setup, or required external services.\n\nIf the project structure is convoluted and the correct build approach is not obvious, **ask the user early** rather than guessing.\n\n### 3.3 Saving Build Workflow for Later\n\nOnce you discover the correct build/run workflow for a project, **save it to project memory**. Capture: commands to start Metro, commands to build/run the app, and any required environment setup.\n\n### 3.4 When to Reinstall vs Refresh\n\n| Situation                                             | Action                                                                                |\n| ----------------------------------------------------- | ------------------------------------------------------------------------------------- |\n| JS/React only changed                                 | Use `debugger-reload-metro` tool. No rebuild.                                         |\n| Native code or `pod install` / project config changed | Rebuild: `npx react-native run-ios` (Metro can stay running).                         |\n| `node_modules` or `package.json` changed              | `bun install`, then if native deps changed run `cd ios && pod install`. Then rebuild. |\n| App needs reinstalling from .app path                 | Use `reinstall-app` tool with UDID, bundle ID, and .app path.                         |\n| Persistent native build errors                        | Full clean + reinstall (step 2 above).                                                |\n\n### 3.5 Device Control\n\n| Action                     | Tool / Command                                                         |\n| -------------------------- | ---------------------------------------------------------------------- |\n| List devices               | `list-devices` tool (iOS + Android)                                    |\n| Boot an iOS simulator      | `boot-device` tool with `udid`                                         |\n| Boot an Android emulator   | `boot-device` tool with `avdName`                                      |\n| Launch an app              | `launch-app` tool (pass device id + bundle id / package name)          |\n| Restart an app             | `restart-app` tool (pass device id + bundle id / package name)         |\n| Open a URL / deep link     | `open-url` tool (pass device id + URL)                                 |\n| Rotate device              | `rotate` tool                                                          |\n| Stop simulator server      | `stop-simulator-server` tool (iOS UDID or Android serial — one device) |\n| Stop all simulator servers | `stop-all-simulator-servers` tool (iOS + Android)                      |\n\nFor full simulator setup workflow, refer to the `argent-ios-simulator-setup` skill.\n\n### 3.6 Verifying Local Release-Variant Builds — Stale-Code Gotchas\n\n**Applies to Android local release-variant builds** (`bun mobile android:<flavor>:release:local`, i.e. `apps/mobile/scripts/runAndroidLocal.sh`). Release variants **embed the JS bundle in the APK**, so a verify-on-device loop can silently test **old code** through **two independent caching layers**. Each makes a change look like it had \"no effect\" when it was never in the installed APK. **Both must be defeated — disabling one alone is not enough.** `runAndroidLocal.sh` handles both by default; this section is for recognizing the symptoms if a build looks stale or you build with another command.\n\n#### Gotcha 1 — EAS build cache reinstalls a stale APK\n\n`apps/mobile/app.config.ts` sets `experiments.buildCacheProvider: 'eas'`. `expo run:android` computes a **native** fingerprint and, on a match, downloads + installs a cached APK instead of building. A **JS-only** change does not move the native fingerprint, so for a release variant it reinstalls an APK with old JS.\n\n- **Symptom (logs):** `Searching builds with matching fingerprint on EAS servers` → `Successfully downloaded cached build` → install path under `…/eas-build-run-cache/….apk`.\n- **Detection:** you changed only JS/TS, yet the install line points at an `eas-build-run-cache` path.\n- **Fix:** build via `runAndroidLocal.sh` — it exports `EXPO_LOCAL_NO_BUILD_CACHE=1`, which gates the provider off in `app.config.ts` so a real build runs. Confirm `› Building app...` in the logs (not \"downloaded cached build\"). If invoking `expo run:android` directly, export `EXPO_LOCAL_NO_BUILD_CACHE=1` yourself.\n\n#### Gotcha 2 — gradle `createBundle<Variant>JsAndAssets` stays UP-TO-DATE\n\nEven with the EAS cache off, gradle's incremental check misses changes to monorepo JS sources (e.g. `packages/uniswap/**`), so the bundle task stays `UP-TO-DATE` and the APK embeds the **previously-bundled** `index.android.bundle`.\n\n- **Symptom (logs):** `> Task :app:createBundleDevReleaseJsAndAssets UP-TO-DATE`.\n- **Detection:** compare the embedded bundle mtime to your edit time:\n  ```bash\n  ls -la apps/mobile/android/app/build/generated/assets/createBundle<Variant>JsAndAssets/index.android.bundle\n  ```\n- **Fix:** `runAndroidLocal.sh` deletes the bundle task outputs by default (pass `--no-clean-js` to skip for native-only rebuilds). To clear them manually, remove:\n  - `apps/mobile/android/app/build/generated/assets/createBundle<Variant>JsAndAssets`\n  - `apps/mobile/android/app/build/generated/res/createBundle<Variant>JsAndAssets`\n  - `apps/mobile/android/app/build/intermediates/assets/<variant>`\n\n  A successful regen logs `> Task :app:createBundle<Variant>JsAndAssets` (no `UP-TO-DATE`) and `Writing bundle output to …`. `<Variant>` is the capitalized gradle variant (`DevRelease`, `BetaRelease`, `ProdRelease`); `<variant>` is the camelCase form (`devRelease`, …).\n\n---\n\n## 4. Runtime Problems in the App\n\n### 4.1 Where to Look\n\n| Problem type                      | Tool / Where to look                                                                                                                                                                                                                                              |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **JavaScript errors / logs**      | Use `debugger-log-registry` to get a summary and log file path, then `Grep`/`Read` to search.                                                                                                                                                                     |\n| **React component hierarchy**     | Use `debugger-component-tree` tool for a text tree, or `debugger-inspect-element` at specific logical pixel coordinates (not normalized 0-1).                                                                                                                     |\n| **Visual state of the app**       | Use `screenshot` tool to capture the current screen, but prefer `describe` or `debugger-component-tree` for actual navigation and target discovery. If a permission prompt or system-owned modal overlay is not exposed reliably, then fall back to `screenshot`. |\n| **Evaluate JS in the app**        | Use `debugger-evaluate` tool to run JavaScript in the app's runtime.                                                                                                                                                                                              |\n| **Native crashes / native stack** | `npx react-native log-ios` or iOS Simulator: Debug → Open System Log.                                                                                                                                                                                             |\n| **Build/runtime config**          | `metro.config.js`, `babel.config.js`, `package.json` scripts, `ios/Podfile`.                                                                                                                                                                                      |\n\nFor comprehensive Metro debugging workflows (component inspection, console logs, JS evaluation), refer to the `argent-metro-debugger` skill.\n\n### 4.2 JS Console Logs (Log Registry)\n\nLogs are written to a flat log file on disk under `~/.argent/tmp/`. Use the **log-registry → grep** pattern instead of reading logs inline.\n\nFor the full workflow, flat entry format, and grep examples, see `argent-metro-debugger` skill §5.\n\n### 4.3 Do not try to use the DevMenu in React Native apps by default.\n\nUse the argent tools instead.\n\n---\n\n## 5. Testing the App\n\nCheck the `argent-environment-inspector` result for test commands. For interactive UI testing with automatic screenshot verification, use the `argent-test-ui-flow` skill.\n\n- **Unit tests**: Look for Jest in `package.json` (`\"test\": \"jest\"`, `jest` config). Run: `npm test` or `yarn test`.\n- **E2E**: Look for Detox (`.detoxrc.js` or similar), or other E2E config. Dependencies: `detox`, `detox-cli`, and for iOS often `applesimutils`.\n- **UI flow testing**: For interactive UI testing with automatic screenshot verification, refer to the `argent-test-ui-flow` skill.\n\n### 5.2 Running Tests (Typical)\n\nIf the user's intent is ambiguous (run existing tests, write new tests, or find missing coverage), clarify before proceeding.\n\n- **Jest**: `npm test` or `npx jest`.\n- **Detox (example)**:\n  - Build: `detox build --configuration ios.sim.release` (or debug).\n  - Run: `detox test --configuration ios.sim.release`.\n  - Ensure simulator is booted and not used by another process.\n\n### 5.3 Agent Testing Checklist\n\n- [ ] Read `package.json` and test config (Jest, Detox, etc.).\n- [ ] If E2E: confirm simulator/device and build config.\n- [ ] If unclear: clarify whether to use existing workflows or write new tests.\n\n---\n\n## Quick Reference: Tools & Commands\n\n| Goal                         | Tool / Command                                                                                                                           |\n| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |\n| Check port 8081              | `lsof -i :8081`                                                                                                                          |\n| Kill Metro                   | `stop-metro` tool                                                                                                                        |\n| Start Metro                  | `npx react-native start`                                                                                                                 |\n| Start Metro (reset cache)    | `npx react-native start --reset-cache`                                                                                                   |\n| Run iOS app                  | `npx react-native run-ios`                                                                                                               |\n| Run Android app              | `npx react-native run-android`                                                                                                           |\n| List devices                 | `list-devices` tool (iOS + Android)                                                                                                      |\n| Boot a device                | `boot-device` tool (pass `udid` for iOS or `avdName` for Android)                                                                        |\n| Take screenshot              | `screenshot` tool                                                                                                                        |\n| Describe screen (a11y tree)  | `describe` tool for normal app screens and in-app modals; use `screenshot` only when permission/system overlays are not exposed reliably |\n| Read JS console logs         | `debugger-log-registry` tool                                                                                                             |\n| Reload JS bundle             | `debugger-reload-metro` tool                                                                                                             |\n| Check Metro status           | `debugger-status` tool                                                                                                                   |\n| Inspect React component tree | `debugger-component-tree` tool                                                                                                           |\n| Run JS in app                | `debugger-evaluate` tool                                                                                                                 |\n| iOS native logs              | `npx react-native log-ios`                                                                                                               |\n| Android native logs          | `npx react-native log-android` or `adb -s <serial> logcat`                                                                               |\n| Clean + reinstall (nuclear)  | See §3.1 step 3                                                                                                                          |\n\n---\n\n## Related Skills\n\n| Skill                          | When to use                                                                     |\n| ------------------------------ | ------------------------------------------------------------------------------- |\n| `argent-ios-simulator-setup`   | Initial simulator boot and connection setup                                     |\n| `argent-device-interact`       | Tapping, swiping, typing, hardware buttons, gestures on the simulator/emulator  |\n| `argent-metro-debugger`        | Full Metro CDP debugging: component inspection, console logs, JS evaluation     |\n| `argent-react-native-profiler` | Profiling performance, finding re-render issues, CPU hotspots                   |\n| `argent-test-ui-flow`          | Interactive UI testing with automatic screenshot verification after each action |\n\nAsk the user before running tests: confirm which test suite (unit, E2E, or both), whether to use existing CI commands, and whether they want you to run existing tests, write new ones, or explore test cases yourself.\n",".agents/skills/argent-react-native-optimization/SKILL.md":"---\nname: argent-react-native-optimization\ndescription: Optimizes a React Native app by profiling first to find real bottlenecks, then sweeping for mechanical issues. Entry-point for all performance work. Use when the app feels slow, user asks to optimize, fix re-renders, reduce jank, or improve startup. Delegates to argent-react-native-profiler for measurement.\n---\n\n## Rules\n\n- Do not apply shotgun optimizations. Measure first, define what \"good enough\" looks like (target metric + threshold), fix the top offender, re-measure honestly.\n- **Quick scan** — `react-profiler-renders` for a live render count table. Identifies hot components instantly.\n- **Deep measure** — load `argent-react-native-profiler` skill. `react-profiler-start` → interact → `react-profiler-stop` → `react-profiler-analyze`.\n- **Inspect** — `react-profiler-component-source` per finding. `react-profiler-fiber-tree` to trace component ancestry and render cost.\n- **Verify correctness** - before fixing, recollect information from steps above and make a logical conclusion whether the approach is worth undertaking.\n- **Fix** — apply one fix. Validate with `debugger-evaluate` before committing.\n- **Re-measure** — report whether the target metric improved, regressed, or stayed flat. Check for regressions in other areas. If no net benefit or unacceptable tradeoffs, revert.\n- **Profile for discovery, not only verification.** Use the profiler to find issues static analysis missed, not only to confirm fixes.\n- **One fix per cycle for architectural changes.** Mechanical batch fixes (inline styles, index keys) can be grouped — re-profile once after the batch. When the measurement involves simulator interaction, record it as a flow (`argent-create-flow` skill) before the first run so all subsequent cycles replay identical steps.\n- **React Compiler**: if `react-profiler-analyze` reports `reactCompilerEnabled: true`, do NOT propose `useCallback`/`useMemo`/`React.memo` unless you confirmed compiler bail-out via `react-profiler-fiber-tree` (absent `useMemoCache`).\n- **Sub-agents**: Phases 1–2 dispatch sub-agents — one per file for lint results, one per checklist item for semantic. Sub-agents CANNOT touch the simulator - all profiling and E2E verification must happen in the main agent.\n\n## Pipeline\n\n**Lint and semantic sweeps catch deterministic issues cheaply. Profiling finds runtime bottlenecks that static analysis misses. Do both.**\n\nCopy this checklist into your TODO list:\n\n```\nOptimization Progress:\n- [ ] Phase 1: Lint sweep (deterministic — catch mechanical issues without a running app)\n- [ ] Phase 2: Semantic sweep (judgment — memoization, lists, animations, etc.)\n- [ ] Phase 3: Baseline profile (find real bottlenecks, fix top offenders)\n- [ ] Phase 4: Verify no regressions (crashes, errors, red screens)\n```\n\n### Phase 1: Lint sweep\n\nRun ESLint once at the project root with a comprehensive RN performance ruleset. Dispatch sub-agents to fix results — one per file.\nSee [references/lint-rules.md](references/lint-rules.md) for ruleset and procedure.\n\n### Phase 2: Semantic sweep\n\nReview each area requiring judgment — memoization, list rendering, animations, async patterns, effect cleanup, state hygiene, context architecture. Dispatch one sub-agent per checklist item.\nSee [references/semantic-checklist.md](references/semantic-checklist.md) for full checklist.\n\n### Phase 3: Visual profiling\n\n1. Load `argent-react-native-profiler` skill, start dual profiling\n2. Exercise key user flows (navigate screens the user specified, or all major flows)\n3. Analyze with `react-profiler-analyze` + `native-profiler-analyze` + `profiler-combined-report`\n4. Cross-reference profiling results with Phase 1–2 findings\n5. Fix highest-impact issues. Re-profile after architectural changes; batch mechanical fixes. If a recorded flow breaks after a fix (e.g., UI layout changed), follow `argent-create-flow` skill to repair the flow rather than silently discarding it.\n\n### Phase 4: Verify no regressions\n\nNavigate every screen and UI flow within scope, confirm each renders without errors. If no scope was specified, verify the entire app — cover all reachable screens via `argent-device-interact`. Use `debugger-log-registry` to check for runtime errors and take screenshots to check for red/yellow error screens. Check for regressions introduced by fixes (e.g., fewer re-renders but higher CPU, or new jank in a different screen). Main agent only.\n\n## App-wide optimization\n\n1. **Phase 1**: run lint centrally (one command), dispatch sub-agents to fix per-file in parallel\n2. **Phase 2**: one sub-agent per checklist item for semantic sweep\n3. **Phase 3**: main agent profiles top offending screens; fixes architectural issues top-down\n4. **Phase 4**: main agent navigates all screens to verify nothing crashes\n\nAfter the entire run, run lint again to verify no new issues were introduced with your changes.\nThis also helps ensure you haven't missed any issues which could've been fixed.\n",".agents/skills/argent-react-native-profiler/SKILL.md":"---\nname: argent-react-native-profiler\ndescription: Profile a React Native Hermes app to measure re-render and CPU performance using argent profiler tools. Use when optimizing for performance, measuring before/after a fix, spotting slow components, diagnosing re-renders, checking CPU hotspots, or producing a ranked issue report.\n---\n\nThis skill is complementary to `argent-react-native-optimization`, not a replacement for it.\n\n## 2. Tool Overview\n\n### React Profiler (Hermes / React commits)\n\n| Tool                              | Purpose                                                                                                                                                                                                                                                           |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `react-profiler-start`            | Start CPU sampling + inject React commit-capture hook. Optional: `sample_interval_us` (default 100).                                                                                                                                                              |\n| `react-profiler-stop`             | Stop recording; stores cpuProfile + commitTree in session.                                                                                                                                                                                                        |\n| `react-profiler-status`           | **Call if you were interrupted in the middle of the flow, never in another scenario** (debugger drop, Metro reload, pause, subagent handoff, any doubt). Returns `session_status: \"active\" \\| \"taken_over\" \\| \"stopped\" \\| \"no_react_runtime\"`. Side-effect free. |\n| `react-profiler-analyze`          | Run pipeline -> report with CPU-enriched hot commits, sorted by `totalRenderMs` DESC. Saves raw data to disk.                                                                                                                                                     |\n| `react-profiler-component-source` | AST lookup: file, line, memoization status, 50 lines of source for a component.                                                                                                                                                                                   |\n| `react-profiler-renders`          | Live fiber walk: render counts + durations per component (no profiling session required).                                                                                                                                                                         |\n| `react-profiler-fiber-tree`       | Live fiber walk: full component hierarchy as JSON.                                                                                                                                                                                                                |\n\n### Drill-Down Query Tools (call after analyze)\n\n| Tool                       | Purpose                                                                                      |\n| -------------------------- | -------------------------------------------------------------------------------------------- |\n| `profiler-cpu-query`       | Targeted CPU investigation: top functions, time-windowed CPU, call trees, per-component CPU. |\n| `profiler-commit-query`    | Targeted commit investigation: by component, time range, commit index, or cascade tree.      |\n| `profiler-stack-query`     | iOS Instruments drill-down: hang stacks, function callers, thread breakdown, leak details.   |\n| `profiler-combined-report` | Cross-correlated report when both React Profiler and native profiler ran in parallel.        |\n| `profiler-load`            | List and reload previous profiling sessions from disk for re-investigation with query tools. |\n\nFor native profiling (CPU hotspots, UI hangs, memory leaks), see the `argent-native-profiler` skill.\n\n---\n\n## 3. Agent Behavior Guidelines\n\nFollow these rules throughout the profiling workflow:\n\n- Start `react-profiler-start` and `native-profiler-start` in parallel (two tool calls in one message). Both need `device_id`; use the same UDID for both so their data can be correlated later. This gives best coverage.\n- If the user only wants native profiling, use the `argent-native-profiler` skill workflow. Only skip `native-profiler-start` if the user has **already explicitly said** they don't want native profiling in this session\n\n### After analysis: ask about next steps\n\nAfter presenting the analysis report, always ask the user what they want to do next. Present these options:\n\n1. **Investigate further** — drill down into specific findings using query tools (CPU call trees, commit cascades, hang stacks, etc.) to identify root causes with confidence before making changes.\n2. **Implement fixes** — apply changes based on the current findings, then re-profile to measure whether the metric changed (improved, regressed, or stayed flat).\n3. **Done for now** — accept the report as-is.\n\nDo NOT silently move on after the report. The report is the starting point, not the end — query tools exist specifically to let you dig deeper into anything the report flags.\n\n### During investigation: use query tools proactively\n\nWhen drilling down, chain query tool calls based on what you find:\n\n- A hot commit -> `profiler-commit-query` mode=`by_index` to see all components -> `profiler-cpu-query` mode=`component_cpu` for the slowest one -> `profiler-cpu-query` mode=`call_tree` for the hot function -> read the source file -> propose a fix.\n- A memory leak -> `profiler-stack-query` mode=`leak_stacks` to identify the responsible module -> read the native source if actionable.\n- A native hang -> `profiler-stack-query` mode=`hang_stacks` to get the native call chain -> correlate with React commit timing.\n\n### After fixes: always re-profile\n\nWhen you apply a fix, always re-profile the same scenario afterward. Compare before/after metrics (commit durations, CPU time, render counts) and report honestly: did the target metric improve, stay flat, or regress? Did any _other_ metric get worse? If you need to reference the original data, use `profiler-load` to reload the pre-fix session. If the fix showed no improvement or introduced a regression, say so explicitly and reconsider the approach.\n\n### Use flows for reproducible profiling\n\nWhen profiling requires a specific interaction sequence (scroll a list, navigate screens, trigger an animation), **record the interaction as a flow** using the `argent-create-flow` skill before the first profiling run. Then replay the same flow for every subsequent run. This eliminates interaction variance as a confounder and makes before/after comparisons meaningful. Especially important when:\n\n- You are about to re-profile after applying a fix (Step 8).\n- The user asks you to compare multiple profiling sessions.\n- The interaction path is more than 2-3 steps long.\n\n---\n\n## 4. Standard Profiling Workflow\n\n**Complete all steps in order — do not break mid-flow.**\n\n### Step 1: Start profiling\n\nMind the react-native and ios-native profiler selection mentioned above when starting the session and start the tools. **Save `startedAtEpochMs` from the response** — you will need it for annotation offsets. Every subsequent profiler/query call in this session must use the same `device_id`. Before beginning, define lightweight success criteria with the user: which metric matters most (e.g., `totalRenderMs`, specific commit duration, render count for a component) and what threshold would be meaningful. This anchors later evaluation. On success:\n\n- if user asked you to perform the profiling, determine how to profile yourself using tools described in `argent-device-interact` skill.\n- if the user stated they wish to perform the interaction themselves — suggest what interaction to perform (e.g. \"scroll the list\", \"switch tabs\") and wait for their reply.\n  If you received information about **existing profiling session** being owned by another agent:\n- if session is marked as \"stale\", you may overtake it without prompting the user for allowance\n- if session is NOT \"stale\" - before taking action and terminating the other session, **stop and ask user what you should do**, explaining the situation.\n\n#### Annotate every interaction\n\nAfter each `gesture-tap` or `gesture-swipe` call, record an annotation using the returned `timestampMs`. Compute `offsetMs = timestampMs - startedAtEpochMs`. Do this for _every_ interaction — including back-navigation swipes, not just the primary action. Pass all collected annotations to `react-profiler-analyze` in Step 3.\n\n### Step 2: Stop and collect\n\nCall `react-profiler-stop` **and** `native-profiler-stop` in parallel. Only skip `native-profiler-stop` if you did not start it in Step 1. Note `duration_ms` and `fiber_renders_captured`.\nIf `fiber_renders_captured: 0`, warn the user — React commit data may be missing.\n\n### Step 3: Analyze\n\nCall `react-profiler-analyze` with `port`, `device_id`, `project_root`, `platform`, and `rn_version`. The report includes metadata such as `reactCompilerEnabled`, `strictModeEnabled`, and `buildMode` — check these in the returned markdown report.\n\nIf you performed interactions using `gesture-tap`/`gesture-swipe`, pass `annotations` to mark when each action occurred. Each annotation's `offsetMs` must be computed as `tapTimestampMs - startedAtEpochMs`, where `tapTimestampMs` is the `timestampMs` returned by the gesture-tap/gesture-swipe tool and `startedAtEpochMs` was returned by `react-profiler-start`. Do **not** use `Date.now()` for this calculation — only server-side timestamps from the tool return values.\n\nIf dual profiling, also call `native-profiler-analyze`, then **you must** call `profiler-combined-report` for the cross-correlated view — do not skip this step when both profilers ran; the combined report surfaces correlations that individual reports miss.\n\nThe analyze report includes **CPU hotspots per commit** — showing exactly which JS functions ran during each slow React commit. Raw data is saved to disk automatically for later reload.\n\n### Step 4: Assess results\n\nAnalyze whether the results give you a proper image of what is wrong with the application - **do not assume improvement always exists**, verify results logically with reference to how react-native works. Make sure to give honest feedback and be ready to change the approach if needed.\n\n### Step 5: Present findings and ask about next steps\n\nPresent a concise summary of the key findings - present whether possibilities for improvement exist and how performing further actions could affect performance. Then follow the \"After analysis\" guideline — ask whether to investigate further, implement fixes (if available), or stop.\n\n### Step 6: Drill-down investigation (iterative)\n\nBased on findings from the report, use query tools to investigate deeper:\n\n- **Slow component?** -> `profiler-cpu-query` mode=`component_cpu` component_name=`AppNavigator` — shows what JS functions ran during that component's commits.\n- **Want to see the call tree?** -> `profiler-cpu-query` mode=`call_tree` function_name=`expensiveFunction` — shows callers and callees.\n- **What happened during a time window?** -> `profiler-commit-query` mode=`by_time_range` — lists all commits in a range.\n- **Full commit detail?** -> `profiler-commit-query` mode=`by_index` commit_index=38 — all components, props changes, parent cascade.\n- **Who triggered whom?** -> `profiler-commit-query` mode=`cascade_tree` — visual parent-child cascade.\n- **iOS hang details?** -> `profiler-stack-query` mode=`hang_stacks` — native call stacks during a hang.\n\nRepeat as needed until you identify the root cause function and file, referring to step 4 for honest evaluation. After each round of investigation, ask the user if they want to continue digging or move to fixing.\n\n### Step 7: Reload a previous session\n\nIf you profiled multiple scenarios and need to revisit earlier data:\n\n1. Call `profiler-load` mode=`list` to see all saved sessions with timestamps (the list now also shows Runtime / Device / Metro bundle columns to help identify the right session).\n2. Call `profiler-load` mode=`load_react` session_id=`<timestamp>` device_id=`<UDID>` to reload React data. `device_id` scopes the reload into the `port:device_id` cache slot.\n3. Call `profiler-load` mode=`load_native` session_id=`<timestamp>` device_id=`<UDID>` to reload native profiler data.\n4. Query tools now operate on the reloaded session data — **pass the same `device_id` you loaded with**, otherwise they will miss the cache.\n\nThis is useful for before/after comparisons: profile, fix, re-profile, then reload the original session to compare metrics side by side.\n\n### Step 8: Apply fix and re-profile\n\nIf fix is present, read the source code of the identified bottleneck using `react-profiler-component-source` or the Read tool. Apply the fix, then re-profile (Step 1 -> user interaction -> Step 2 -> Step 3 -> Step 4). Report whether the target metric improved, stayed flat, or regressed. Also check whether the fix introduced regressions in other metrics (e.g., render count dropped but CPU time increased, or a different component now re-renders more). If the fix showed no net benefit or unacceptable tradeoffs, revert and reconsider.\n\n**Tip:** If the interaction sequence was recorded as a flow (see \"Use flows for reproducible profiling\" above), replay it with `flow-execute` instead of manually repeating the steps. This guarantees identical interaction conditions for the comparison. If the flow fails during replay (e.g., a UI fix changed the layout), follow `argent-create-flow` skill §10 (Flow Self-Improvement) to diagnose and repair the flow before retrying the profiling cycle.\n\nIf the user stated that they do not wish for changes, present the profiling report and skip the fix but suggest it to the user.\n\n**React Compiler rule:** If the analyze report indicates React Compiler is enabled, do NOT propose `useCallback`/`useMemo`/`React.memo` unless you confirmed compiler bail-out (check `react-profiler-fiber-tree` for absent `useMemoCache` on that component).\n\n---\n\n## 5. Important Caveats\n\n- **Dev mode inflation**: `buildMode: \"dev\"` renders are ~3x slower than production. Prioritize high `normalizedRenderCount` — it scales to prod.\n- **Re-run after fixes**: Always re-profile after changes. Report honestly whether the metric improved, regressed, or stayed flat — do not assume improvement.\n- **`excluded` is informational**: Components in `animatedSubtrees` and `recyclerChildren` re-render by design.\n- **Strict Mode**: Double-invokes renders. The pipeline halves `normalizedRenderCount` automatically when detected.\n- **Debugger connection**: If interrupted, started profiling also closes. Before attempting recovery, call `react-profiler-status` — it tells you whether the session is `active`, `taken_over`, `stopped`, or `no_react_runtime`, so you can decide whether to stop, restart, or reconnect first.\n- **Confounders to watch for**:\n  - Live API data may differ between runs (different payload sizes, content counts), which shifts render counts and durations independently of your fix. Note when data-dependent components show variance.\n  - Profiler overhead inflates CPU measurements. If iOS Instruments shows `JSLexer`, `JSONEmitter`, or Hermes internals dominating the JS thread, that reflects profiler instrumentation cost — not app work. Discount those entries.\n  - Runs are not perfectly reproducible. Small variations (under ~10-15%) in commit duration may be noise; only treat consistent, directional changes as signal.\n\nFor standalone diagnostic tools (live render stats, fiber tree, CPU summary), see `references/diagnostic-tools.md`.\n",".agents/skills/argent-screenshot-diff/SKILL.md":"---\nname: argent-screenshot-diff\ndescription: Capture stable before/after screenshots on an iOS simulator or Android emulator and pixel-diff them into evidence. Use when asked for a visual regression check, a screenshot diff, a before/after visual comparison, or when a visible mobile UI change needs pixel proof — including the executed screenshot-diff that a Tamagui conversion batch requires.\n---\n\n## 1. Use the first-party `screenshot-diff` tool\n\n`screenshot-diff` is a real first-party argent MCP tool, and it is the preferred path for every diff in this skill. Hand-rolling a pixel diff is the fallback (§ 5), not the default.\n\n| Parameter | Required | Notes |\n| --- | --- | --- |\n| `udid` | **yes** | iOS UUID or Android adb serial, same as every other argent tool |\n| `outputDir` | **yes** | Where the diff artifacts are written |\n| `baselinePath`, `currentPath` | mode A | Two PNGs you already saved to disk |\n| `captureBaseline`, `captureCurrent` | mode B | The tool captures live from the device instead |\n| `rotation` | no | The same rotation parameter `screenshot` takes |\n\nSupply **either** the saved-PNG pair **or** the live-capture flags — the two modes are alternatives, not additions.\n\nReturns `{ summary, diffPath, contextDiffPath }`: the comparison summary plus two written artifacts, the diff image and a context diff.\n\n**It excludes the fixed status-bar band from both the pixel and the OCR comparison.** That alone is reason to prefer it over anything hand-rolled. The clock, battery percentage and signal indicators differ between any two captures taken seconds apart, and on a full-screen mobile capture they are the single most common source of false positives. With this tool you neither crop them out nor explain them away in review.\n\n**Load the schema before your first call** — deferred tools in this environment expose only their name until you load them. ToolSearch for `screenshot-diff`, read the parameter names and return shape off the schema, and use those. The table above was transcribed from a session with the argent server connected rather than verified in the session that wrote this skill, so treat the loaded schema as the authority wherever the two disagree.\n\n**Never invent a tool signature.** If ToolSearch cannot load it, the tool is not available to your session — take the § 5 fallback and say so in your report.\n\n---\n\n## 2. Prerequisites and their limits\n\nFrom `apps/mobile/CLAUDE.md`:\n\n```bash\nbun add -g @swmansion/argent   # one-time per machine; puts `argent` on PATH\n```\n\n- **Argent does not build or install the app for you** — it drives whatever is already on the sim. Get the build you intend to compare installed and running first via `argent-react-native-app-workflow`.\n- **Argent owns the simulator.** Do not mix `xcrun simctl install/launch/terminate` with argent calls — sim state corruption is real, and a corrupted sim silently poisons a diff.\n- **Do not run `argent init`** — skills and config are already committed. `argent update` only when intentionally refreshing.\n- **Android**: run `adb -s <serial> reverse tcp:8081 tcp:8081` before the app starts, or Metro is unreachable and you will capture a red screen.\n- **At session end**: call `stop-all-simulator-servers`.\n\nGet a `udid` per `argent-ios-simulator-setup` (iOS, UUID-shaped) or `argent-android-emulator-setup` (Android, adb serial). Tool names are identical on both platforms.\n\n---\n\n## 3. The headless constraint — state it, do not paper over it\n\n**A headless or CI agent session cannot drive a local simulator or emulator.** There is no sim to attach to, no Xcode/`xctrace`, no emulator, and no display. This was the blocking finding on INFRA-3096 and it has not changed.\n\nEverything below is the **argent-driven local-device path**, and that path needs a **locally attached simulator, emulator, or device** in a session running on a developer machine: argent's MCP server drives a local sim/emulator or an attached device, and a headless session has no argent binary, no argent MCP server, and no device.\n\nIf you are headless, do **not** stage a diff and imply it ran. `tamagui-conversion` is explicit: *a staged-but-unrun diff is not evidence.* Instead do one of:\n\n1. **Hand off.** Stage the comparison surface (§ 4), commit it, and write the exact runnable steps — udid selection, story names, `scale: 1.0`, the `screenshot-diff` call and its `outputDir`, and the state matrix — into the Linear issue and PR body so a human-run session executes it verbatim.\n2. **Record the obligation.** Comment on the issue that the executed diff is outstanding, with the commit the diff must be run against. An unmet obligation on the record beats a fabricated verdict.\n3. **Substitute, with sign-off.** If no legacy twin exists there is nothing to diff at all — substitute self-contained behavioral tests plus **explicit requester sign-off** (the `tamagui-conversion` rule).\n\n### Remote devices — the blockers above are narrower than \"you need a developer machine\"\n\nThose blockers are about driving **argent**. They are not a claim that on-device visual evidence is impossible without a local simulator. **AWS Device Farm runs real remote devices and needs no local sim and no macOS host**, so it is a plausible route to the underlying evidence goal — before/after captures from a real device, taken to a pixel diff. What that route carries:\n\n- **Whether argent can target a Device Farm device is untested.** Do not claim it can and do not claim it cannot; if you need argent specifically, treat it as an open question to verify.\n- **The build must embed a dev-mode bundle**, because Storybook is `__DEV__`-only (§ 8) — a bundled production build cannot show the staged stories at all.\n- **Android-only absent a macOS host**, since an iOS build needs one.\n\n**The INFRA-3096 \"declined\" note is narrower than it reads.** A Device Farm pass was declined there — but on a batch with **zero converted files**, where the objection was to diffing a batch in which nothing had changed (\"staged evidence with extra steps\"), not to Device Farm as a capture mechanism. That is a reading of INFRA-3096 comment `fe4db9f3`; check it yourself before citing it either way. Whichever capture route you use, \"executed, never staged\" is unchanged — the diff must actually run, against changed code.\n\n---\n\n## 4. Staging the comparison — the canonical pattern\n\nThe repo practice this skill formalizes: put both sides in **one Storybook file** rendering the **identical state matrix at identical screen positions**, so a diff of the two stories measures nothing but the component.\n\nPattern files:\n\n- `apps/mobile/src/components/mycelium/SegmentedControlMigration.stories.tsx` (#37202) — the template. `Legacy` and `Rebuilt` stories render the exact same matrix at the exact same positions; `SideBySide` stacks both per state for eyeballing.\n- `apps/mobile/src/components/mycelium/ShimmerMigration.stories.tsx` — carries a hard-won caveat.\n\nRules that fall out of those two files:\n\n| Case | Stage it as | Why |\n| --- | --- | --- |\n| Static states | Standalone `Legacy` + `Rebuilt` stories, identical positions | Diffable pair, nothing else varies |\n| **Animated** states | `SideBySide`, both mounts **simultaneous** | Separate mounts start their animation clocks at different times — an out-of-phase row looks frozen or broken when both implementations are correct. Phase-lock or do not diff. |\n| No legacy twin | Not diffable at all | Behavioral tests + requester sign-off instead |\n\nIdentical positions is not a nicety. Any offset makes the whole panel differ and the diff is worthless.\n\n---\n\n## 5. Capture and diff — the procedure\n\nGet a `udid` from `list-devices`, stage both sides per § 4, and settle per § 6. Then:\n\n1. Navigate to the `Legacy` story. Settle, then `screenshot` with **`scale: 1.0`**, persisted to disk.\n2. Navigate to `Rebuilt` — same route, same scroll offset, no device rotation between captures.\n3. Settle, then `screenshot` with `scale: 1.0`, persisted to disk.\n4. Call `screenshot-diff` with `udid`, an `outputDir`, and the two files as `baselinePath` / `currentPath`.\n5. Read `summary`, then open `diffPath` and `contextDiffPath` and actually look at them (§ 7).\n\n### `scale: 1.0` is mandatory for anything you feed to a diff\n\n`screenshot` **downscales to 30% of native resolution by default** to save context (`argent-device-interact` § 7). `scale` accepts `0.01`–`1.0`.\n\n> A 30% capture has thrown away the pixels you are measuring: it invents resampling differences that read as regressions, and it hides real one-pixel border and anti-aliasing shifts. A diff run at the default scale is not evidence.\n\n```json\n{ \"udid\": \"<UDID>\", \"scale\": 1.0 }\n```\n\nIf `screenshot` returns an inline image rather than a file path, you need the bytes on disk before `baselinePath` / `currentPath` will accept them. **Load the tool's schema with ToolSearch and read its actual return shape** — do not assume either form.\n\n### The live-capture mode\n\n`captureBaseline` / `captureCurrent` (§ 1) let `screenshot-diff` take the shots itself instead of you saving PNGs. Read the schema for how the two are sequenced before relying on it: the staged-story pattern in § 4 requires **navigating between the two captures**, and a before/after across a code change requires a rebuild between them. Prefer the saved-PNG pair whenever anything has to happen in between.\n\n### Fallback — only when `screenshot-diff` will not load\n\nFor a session with no argent MCP server connected, or an argent version predating the tool. Capture the pair exactly as above, then diff the PNGs yourself: `labs/workbench` already carries the engine as devDeps (`pixelmatch` 7.2.0, `pngjs` 7.0.0), and `labs/workbench/scripts/visual/compare.ts` is a working reference for the pixelmatch call, padding, and flag arithmetic — reuse it rather than reaching for a new dependency. You then own the two jobs the first-party tool does for you: masking the status-bar band, and picking thresholds (§ 7).\n\n---\n\n## 6. Determinism — eliminate false positives before you diff\n\nA flaky diff is worse than no diff: it trains reviewers to ignore the artifact. Fix all of these before capturing.\n\n- **Kill animation.** Disable animations in the app, or use a `SideBySide` phase-locked mount for anything that moves. Never diff a mid-transition frame.\n- **Pin the device.** Same simulator model **and** same OS version for before and after. A different sim is a different renderer.\n- **Pin the position.** Identical scroll offset, orientation, and safe-area insets. Do not rotate between captures.\n- **Settle before capture.** Wait for the screen to be static — no spinner, no skeleton, no in-flight image load. If the returned screenshot shows a transitional frame, retake with `screenshot` (the `argent-test-ui-flow` recovery pattern).\n- **Same content.** No live data, no timestamps, no randomized ordering, no avatar that loads from the network.\n- **Same theme.** Diff light against light and dark against dark, as separate pairs.\n\n---\n\n## 7. Reading the result\n\n### With `screenshot-diff` (the primary path)\n\n`summary` is the judgement surface; `diffPath` and `contextDiffPath` are the artifacts.\n\n- **Read `summary`, then corroborate it against the images.** A summary you did not check against the diff image is a claim, not a verdict.\n- **The contract in § 1 exposes no threshold, sensitivity, or flagging parameter** — so there is nothing to tune, and this skill will not recommend a number for it. Do not invent one. If the schema you load exposes a knob § 1 does not list, use it and record the value you passed.\n- **Calibrate with a no-change control pair.** Capture the same story twice with nothing changed and diff it. Whatever the tool reports on that pair is the floor for this device, this OS version, this screen — a real pair must clear it visibly. With no tunable threshold, this control is the calibration.\n- **Status-bar drift is already excluded** (§ 1), so anything reported is real content, not a clock tick.\n\n**How the harness numbers below translate: they mostly do not.** Stated plainly so nobody tries to reconcile them:\n\n| Harness concept | Counterpart in `screenshot-diff` |\n| --- | --- |\n| `--pixel-threshold` (per-pixel color sensitivity) | **None exposed.** The tool decides its own sensitivity |\n| `--flag-ratio` (`diffPixels / totalPixels`) | **None exposed.** The tool does not take a flagging rule from you |\n| `--min-diff-pixels` (absolute floor) | **None exposed** |\n| Manual status-bar masking | **Built in** — excluded from pixel *and* OCR comparison |\n| Diff PNG output | `diffPath`, plus `contextDiffPath` |\n| Flag verdict computed by you | `summary`, computed by the tool |\n\nThree of the harness's four knobs have no counterpart. That is not a gap to paper over with an invented mapping — it means the judgement moves from *choosing numbers* to *reading `summary` against a control pair and looking at the diff image*.\n\n### Fallback thresholds — hand-rolled `pixelmatch` only\n\nEverything below applies to the § 5 fallback, not to `screenshot-diff`.\n\n**Established precedent** — `labs/workbench/scripts/visual/README.md`, the web harness. A pair is flagged when **both** conditions hold:\n\n```\ndiffPixels / totalPixels > 0.005     # relative ratio (--flag-ratio)\nAND diffPixels > 250                 # absolute floor (--min-diff-pixels)\n```\n\nwith a per-pixel color sensitivity of `0.1` (`--pixel-threshold`, passed to pixelmatch).\n\n**Why two conditions, so you can adapt rather than cargo-cult:** the ratio alone over-fires on small panels. On a ~6–10k-pixel panel, sub-perceptual anti-aliasing noise (the harness's documented case: translucent-token compositing rendering text a few 8-bit steps apart) is ~120–180 px — under 250 absolute, but *over* 0.005 relative. The absolute floor absorbs exactly that. Meanwhile a genuinely broken color repaints most of a panel at high delta and trips both conditions comfortably. The two-condition rule buys you a wide, empty band between noise and real breakage.\n\n**Starting recommendations for mobile** (mine, not established — tune and record what you used):\n\n- Keep `pixel-threshold` at `0.1`. It is the sensitivity that was validated against real token-compositing noise, and it is platform-independent.\n- Keep the `0.005` ratio.\n- **Raise the absolute floor** above 250. Mobile captures at `scale: 1.0` are far larger than a workbench panel, and native text rasterization is noisier than Chromium's — 250 px will fire on nothing. Scale the floor with panel area: the web value is ~2.5–4% of a 6–10k-px panel, so start there and calibrate against a **no-change control pair** (capture the same story twice, unchanged; that number is your noise floor, and your threshold goes above it).\n- Any pair you had to raise a threshold to pass is **not** green — investigate it.\n\nRecord what you ran alongside the verdict — `screenshot-diff` and which mode, or the fallback and its thresholds. A verdict without its mechanism is unreproducible.\n\n---\n\n## 8. The Storybook tension — real, and reconcilable\n\nThis diff practice needs **Storybook**. But `apps/mobile/CLAUDE.md` mandates `NODE_ENV=production` for agent/CLI Metro precisely *because* dev-mode bundles Storybook and the app boots into Storybook UI, \"breaking agent-driven interaction flows\":\n\n```bash\nbun nx run mobile:start:production   # the normal agent default — Storybook OFF\n```\n\nBoth are correct; they are different jobs. Reconcile by **choosing the mode for the task, deliberately and out loud**:\n\n| Task | Metro mode | Storybook |\n| --- | --- | --- |\n| Driving real app screens, flows, QA, profiling | `mobile:start:production` | off (required) |\n| **Screenshot-diffing a staged story matrix** | dev Metro (`NODE_ENV` unset) | on (required) |\n\nSo: a screenshot-diff session runs dev Metro *on purpose*, and booting into Storybook UI is the desired outcome, not the failure the CLAUDE.md rule warns about. Consequences to hold onto:\n\n- **Do not do both in one Metro session.** Finish the diff, then restart Metro in production mode before any app-flow work — and say in your report which mode each artifact came from.\n- `NODE_ENV` applies at **JS-bundle time**. For a device build with no Metro dev server the flag goes on the build command, so a bundled production build cannot show Storybook at all — what you need is a **dev-mode bundle**, and how you get one depends on the route (§ 3): dev Metro against a local simulator, or a dev-mode-bundled build on a remote device.\n- A reviewer seeing Storybook chrome in your evidence should not read it as a broken setup. Label the captures as Storybook stories.\n\n---\n\n## 9. Recording the evidence\n\nAn executed diff is only evidence once it is **on the record**. Post to both the Linear issue and the PR:\n\n1. **Before/after images** per state — legacy, rebuilt, and the diff PNG. Never commit the images into the repo (the web harness's rule: report JSON is committed, images are gitignored); attach them to the issue/PR instead.\n2. **Video for motion.** Static screenshots cannot prove an animation. Channel convention (Thomas's rule, carried in `tamagui-conversion`) is before/after screenshots **plus video for anything animated**.\n3. **Provenance**: device model, OS version, platform, Metro mode, and the **commit SHA** the diff ran against. A diff against uncommitted work is not reproducible — the web harness refuses a dirty tree for exactly this reason.\n4. **The diff mechanism** (§ 7) — `screenshot-diff` and its mode, or the fallback with the thresholds you used and any deviation from the defaults and why.\n5. **A verdict per state**, not one aggregate. `pass` / `flagged` / `known drift (reason)`. Enumerate the full matrix so a reviewer can see nothing was quietly skipped.\n6. **Captured from where.** Visual evidence must come from a deployed preview or the workbench — never local dev — for web. For mobile the equivalent is the installed build at a named commit, stated explicitly.\n\nSay plainly whether the diff **ran**. \"Staged\" and \"executed\" are different claims and reviewers rely on the difference.\n\n---\n\n## Related Skills\n\n| Skill | When to use |\n| --- | --- |\n| `argent-device-interact` | The `screenshot` tool itself, `scale`, rotation, gestures, troubleshooting (§ 7 is the screenshot reference) |\n| `argent-test-ui-flow` | Navigating to the staged stories; the settle/retake recovery pattern before capture |\n| `argent-ios-simulator-setup` | Booting an iOS simulator, getting a UDID |\n| `argent-android-emulator-setup` | Booting an Android emulator, getting an adb serial, `adb reverse` |\n| `argent-create-flow` | Record the navigate-and-capture sequence as a flow so before/after captures are byte-for-byte reproducible via `flow-execute` — this removes interaction variance, the largest source of diff noise |\n| `argent-react-native-app-workflow` | Getting the build installed and Metro running before any capture |\n| `tamagui-conversion` | The migration contract that requires an executed diff as the mobile proof artifact |\n",".agents/skills/argent-native-profiler/SKILL.md":"---\nname: argent-native-profiler\ndescription: Native profiling for CPU hotspots, UI hangs, and memory leaks. Currently iOS-only (xctrace-backed); Android support (Perfetto/simpleperf) is on the roadmap. Use when diagnosing native-level performance issues.\n---\n\n## 1. Tools\n\n- `native-profiler-start` — start profiling on a booted device. iOS: xctrace recording for CPU, hangs, and leaks.\n- `native-profiler-stop` — stop the profiler and export trace data to timestamped XML files.\n- `native-profiler-analyze` — parse exported trace data and return a structured bottleneck payload.\n- `profiler-stack-query` — drill into parsed data: hang stacks, function callers, thread breakdown, leak details.\n- `profiler-load` — list and reload previous trace sessions from disk for re-investigation.\n\n---\n\n## 2. Platform Support\n\n- **iOS**: Fully supported. Backend: Xcode Instruments via `xctrace` on a booted simulator or connected device. Requires Xcode command-line tools on PATH.\n- **Android**: Not yet implemented. An Android backend (Perfetto or simpleperf via `adb`) is planned; today `native-profiler-start` rejects Android serials with a clear \"iOS-only for now\" error.\n\n---\n\n## 3. Investigation Patterns\n\nAfter `native-profiler-analyze` surfaces findings, use `profiler-stack-query` to drill into root causes:\n\n- **Hang detected** → `profiler-stack-query` mode=`hang_stacks` for full native call chains → mode=`function_callers` for the suspected function → read native source.\n- **CPU hotspot** → `profiler-stack-query` mode=`thread_breakdown` for per-thread distribution → mode=`function_callers` for the dominant function.\n- **Memory leak** → `profiler-stack-query` mode=`leak_stacks` filtered by `object_type` for responsible frames and libraries.\n\nAfter presenting findings, ask the user whether to investigate further, implement fixes, or stop. After applying fixes, always re-profile the same scenario and compare with `profiler-load`. Report honestly whether the target metric improved, regressed, or stayed flat. If the fix showed no net benefit or introduced regressions elsewhere, say so and reconsider.\n\n**Tip:** For reproducible before/after comparisons, record the interaction sequence as a flow using the `argent-create-flow` skill before the first profiling run. Replay with `flow-execute` on subsequent runs to eliminate interaction variance.\n\n> **Note:** The `argent-react-native-profiler` instructs to start native profiling automatically alongside React profiling. This skill's workflow and investigation patterns apply in both cases.\n\n---\n\n## 4. Workflow\n\n**Complete all steps in order — do not break mid-flow.**\n\n### Step 0: Ensure the target app is running\n\nThe `native-profiler-start` tool **auto-detects** the running app on the device.\nYou do not need to derive `app_process` manually — just make sure the app is launched.\n\n1. If the app is already running on the device, skip to Step 1 (do not pass `app_process`).\n2. If the app is not running, use `launch-app` with the correct bundle ID first.\n3. Only pass `app_process` explicitly if the tool reports multiple running user apps and you need to disambiguate.\n\n> **Note**: If multiple build flavors are installed (dev, staging, prod), the tool will detect whichever one is currently running. If both are running, it will ask you to specify.\n\n### Step 1: Start recording\n\nCall `native-profiler-start` with `device_id` (iOS UDID; Android not yet supported). The tool auto-detects the running app and saves the trace to `/tmp/argent-profiler-cwd/` with a timestamped filename.\nLet the user interact with the app or drive interaction via simulator tools (see `argent-device-interact` skill).\n\n### Step 2: Stop and export\n\nCall `native-profiler-stop` with `device_id`. On iOS this sends SIGINT to xctrace, waits for trace packaging, and exports CPU, hangs, and leaks data to XML. Check `exportDiagnostics` in the response for any export warnings.\n\n### Step 3: Analyze\n\nCall `native-profiler-analyze` with `device_id`. Returns a markdown report with bottlenecks categorized as CPU hotspots, UI hangs, or memory leaks, sorted by severity.\n\n### Step 4: Present findings and ask about next steps\n\nPresent a concise summary of the key findings. Then follow the \"After analysis\" guideline — ask whether to investigate further with query tools, implement fixes, or stop.\n\n### Step 5: Drill-down investigation\n\nUse `profiler-stack-query` to investigate specific findings. See §3 Investigation Patterns for chaining guidance.\n\n### Step 6: Reload previous sessions\n\nTo revisit a previous trace:\n\n1. Call `profiler-load` mode=`list` to see available sessions.\n2. Call `profiler-load` mode=`load_native` session_id=`<timestamp>` device_id=`<UDID>` to re-parse the XML files.\n3. Use `profiler-stack-query` to investigate the reloaded data.\n\n---\n\n## 5. Understanding Results\n\nBottlenecks are categorized by severity:\n\n- **RED**: CPU functions taking >15% of total time, all UI hangs, all memory leaks. These require immediate attention.\n- **YELLOW**: CPU functions taking 5-15% of total time. Worth investigating but may be acceptable.\n\nEach bottleneck type indicates a different class of problem:\n\n- **CPU hotspots**: Native functions consuming excessive CPU time. Look for tight loops, expensive computations, or redundant work.\n- **UI hangs**: Main thread blocked long enough to cause visible jank or unresponsiveness. Often caused by synchronous I/O, heavy layout passes, or lock contention.\n- **Memory leaks**: Objects allocated but never freed. Common causes include retain cycles, unclosed resources, or forgotten observers.\n\n---\n\n## 6. Important Caveats\n\n- **Simulator vs device**: Simulator profiling reflects host Mac performance, not real device hardware. Use device profiling for accurate CPU timings and memory behavior.\n- **xctrace availability (iOS)**: Requires Xcode command-line tools installed. Verify with `xcrun xctrace version`.\n- **Profiler overhead**: xctrace instrumentation adds CPU load. If `JSLexer`, `JSONEmitter`, or Hermes runtime internals dominate the JS thread in CPU hotspot results, those reflect profiler overhead — not app work. Discount those entries when evaluating findings.\n- **Run-to-run variance**: Small fluctuations in CPU percentages between runs are normal. Treat only consistent directional changes (across 2+ runs or >15% delta) as actionable signal.\n- **Live data variability**: If the app fetches live API data, different responses between runs change rendering workload independently of code changes. Note when data-dependent screens show variance.\n",".agents/skills/argent-test-ui-flow/SKILL.md":"---\nname: argent-test-ui-flow\ndescription: Autonomously test an app UI (iOS or Android) by running interact-screenshot-verify loops using argent MCP tools. Use when testing a UI flow, verifying login works, testing navigation, or running an end-to-end UI test scenario.\n---\n\n## Platform-agnostic\n\nThe interaction tool names are identical on iOS and Android — `gesture-tap`, `gesture-swipe`, `describe`, `screenshot`, `launch-app`, etc. — and the tool-server auto-dispatches based on the `udid` you pass (UUID-shape → iOS, adb serial → Android).\n\nGet a `udid` via:\n\n| Platform | Setup skill                     | Find devices with                                           |\n| -------- | ------------------------------- | ----------------------------------------------------------- |\n| iOS      | `argent-ios-simulator-setup`    | `list-devices` → `boot-device` with `udid` if none booted   |\n| Android  | `argent-android-emulator-setup` | `list-devices` → `boot-device` with `avdName` if none ready |\n\n## 1. Workflow\n\nAll interactions go through argent MCP tools. Ensure the simulator/emulator is ready before starting.\n\n1. **Baseline screenshot**: Call `screenshot` to see the current UI state.\n2. **Find target**: Before tapping, use a discovery tool to get element coordinates:\n   - **React Native apps**: use `debugger-component-tree` — it returns component names with (tap: x,y) coordinates. This is the preferred tool for RN apps on either platform. To use it, resolve the `argent-react-native-app-workflow` skill for setup; on Android you must also run `adb -s <serial> reverse tcp:8081 tcp:8081` so Metro is reachable from the device.\n   - **Standard app screens and in-app modals**: use `describe`. On iOS this returns the AX tree (falls back to native-devtools when AX is empty); on Android it returns the uiautomator tree in the same DescribeNode shape.\n   - **Permission prompts / system modal overlays**: try `describe` first. Fall back to `screenshot` only if the overlay is not exposed reliably.\n   - **Fallback**: use `screenshot` to estimate where the desired component is, then verify immediately after the action.\n3. **Interact**: Perform the action (`gesture-tap`, `gesture-swipe`, `keyboard`, `button`, ...) — you receive a screenshot automatically.\n4. **Verify**: Check the returned screenshot for expected results. If it shows a loading/transitional state, retake with `screenshot`.\n5. **Repeat** for each step in the flow.\n\n## 2. Template\n\n```\nGoal: Test [feature name]\n\nSteps:\n1. screenshot → see current state (baseline)\n2. [Navigate / tap / type to reach starting point] → verify auto-screenshot\n3. [Perform the action to test] → verify auto-screenshot\n4. Report: pass / fail with details\n```\n\n## 3. Examples\n\n### Login flow\n\n```\n1. screenshot → see login screen\n2. gesture-tap { x: 0.5, y: 0.4 }  → tap email field\n3. paste { text: \"user@example.com\" }\n4. gesture-tap { x: 0.5, y: 0.55 } → tap password field\n5. paste { text: \"password123\" }\n6. gesture-tap { x: 0.5, y: 0.7 }  → tap Login button\n7. screenshot → verify home screen appeared\n```\n\n### Scroll and navigation\n\n```\n1. screenshot → see list at top\n2. gesture-swipe { fromY: 0.7, toY: 0.3 } → scroll down\n3. gesture-tap item at visible position → verify auto-screenshot\n4. screenshot → verify detail view opened\n5. button { button: \"back\" }\n6. screenshot → verify returned to list\n```\n\n---\n\n## 4. Recovery Pattern\n\n- If screenshot shows loading/transition: wait 500ms, retake with `screenshot`.\n- If tap misses target: re-run discovery tool (`describe` / `debugger-component-tree`), retry once with new coordinates.\n- If a permission dialog or modal is visible: re-run `describe` first. Stay in screenshot-driven navigation only when the overlay is not exposed reliably, then switch back to `describe` / `debugger-component-tree` as soon as it is dismissed.\n- If tap fails twice at same coordinates: stop, re-discover, report if element not found.\n- If a **saved flow** fails during `flow-execute` replay (as opposed to live test steps above): follow `argent-create-flow` skill §10 for structured diagnosis and correction.\n\n## Tips\n\n- **Use `paste` for text entry on iOS** — faster and more reliable than key-by-key `keyboard`. `paste` is iOS-only; on Android use `keyboard` instead.\n- **Use `gesture-custom` for long-press** context menus (800ms hold).\n- **Report clearly**: state what you expected, what you saw, and the verdict.\n- **Coordinate estimation**: center = 0.5, 0.5; top-third ~ 0.2; bottom-third ~ 0.8.\n- **Permission modals**: try `describe` first. Use `screenshot` only as fallback, tap one visible button at a time, and verify with the returned screenshot before continuing.\n- **Record for replay**: If a tested flow is likely to be repeated, use the `argent-create-flow` skill to record it as a `.yaml` script. This lets you replay the entire sequence later with a single `flow-execute` call instead of re-running each step manually.\n\n## Related Skills\n\n| Skill                              | When to use                                             |\n| ---------------------------------- | ------------------------------------------------------- |\n| `argent-device-interact`           | Tool usage for tapping, swiping, typing (iOS + Android) |\n| `argent-ios-simulator-setup`       | Booting and connecting an iOS simulator                 |\n| `argent-android-emulator-setup`    | Booting and connecting an Android emulator              |\n| `argent-react-native-app-workflow` | Starting the app, Metro, build issues                   |\n| `argent-metro-debugger`            | Breakpoints, console logs, JS evaluation                |\n| `argent-create-flow`               | Record a test sequence as a replayable flow             |\n","AGENTS.md":"# AGENTS.md\n\nThis file provides guidance to AI agents when working with code in this repository. Always run all tests, lint, and typecheck after making changes, and before considering a task to be 'complete'.\n\n## Project Overview\n\nUniswap Universe is a monorepo containing all Uniswap front-end interfaces:\n\n- **Web** (`apps/web/`) - Decentralized exchange web interface\n- **Mobile** (`apps/mobile/`) - React Native app for iOS/Android\n- **Extension** (`apps/extension/`) - Browser wallet extension\n\n## Common Development Commands\n\n### Setup\n\n```bash\n# Initial setup\nbun install\nbun local:check\nbun config:login\n```\n\n### Development Servers\n\n```bash\nbun web dev        # Web with Vite\nbun mobile ios          # iOS app\nbun mobile android      # Android app\nbun extension start     # Extension\n```\n\n### Building\n\n```bash\nbun web build:production    # Web production build\nbun mobile ios:bundle            # iOS bundle\nbun mobile android:release       # Android release\nbun extension build:production   # Extension production\n```\n\n### Testing\n\n```bash\nbun g:test                      # Run all tests\nbun g:test:changed              # Run tests for changed packages\nbun web playwright:test         # Web E2E tests\nbun mobile e2e                  # Mobile E2E tests\n```\n\n### Code Quality\n\n```bash\nbun g:lint:fix                  # Fix linting issues\nbun g:typecheck                 # Type check all packages\nbun g:format                    # Fix formatting\nbun i18n:extract                # Extract localized strings (run after changing translations)\n```\n\n## Architecture Overview\n\n### Monorepo Structure\n\n- **NX** for build orchestration\n- **Bun workspaces** for package management\n- Shared code in `packages/` directory\n- App-specific code in `apps/` directory\n\n### Key Technologies\n\n- **TypeScript** everywhere\n- **React** for web/extension\n- **React Native** for mobile\n- **Redux Toolkit** for state management\n- **Ethers.js/Viem** for blockchain interactions\n\n### Code Organization Principles\n\n#### Styling\n\n- **ALWAYS** use `styled` from `ui/src` (never styled-components); UI components may use inline styling where appropriate\n- Use theme tokens instead of hardcoded values\n- Platform-specific files: `Component.ios.tsx`, `Component.android.tsx`, `Component.web.tsx`, `Component.native.tsx` (with stub files for platforms where specific implementation isn't needed)\n\n#### Images and Icons\n\n- Search `packages/mycelium/src/assets` and the generated icon components (`@universe/mycelium/icons`, `ui/src/components/icons`) before adding an image or icon\n- Shared images go in `packages/mycelium/src/assets`, imported from `@universe/mycelium/assets`; an app's own directory is fine for an image only that app uses\n- Import generated icon components instead of `.svg` files; add new icons with `bun scripts/add-icons.ts` and the `build:icons` targets\n- Don't inline SVG markup in component files unless it needs something a static icon can't do, like per-path animation or data-driven geometry\n\n#### State Management\n\n- **Redux** for complex global state\n- **Zustand** for simple global/shared state — do not use Jotai, we are migrating away from it. Flag any new Jotai usage in PRs and require Zustand instead.\n- Keep state as local as possible\n- No custom hooks for simple data fetching - use `useQuery`/`useMutation` directly\n\n#### Component Structure\n\n1. State declarations at top\n2. Event handlers after state\n3. Memoize properly, especially for anything that might be used in the React Native app\n4. JSX at the end\n5. Keep components under 250 lines\n\n#### TypeScript Conventions\n\n- Do not use `any`, prefer `unknown`\n- Always consider strict mode\n- Use explicit return types\n- PascalCase for types/interfaces\n- camelCase for variables/functions\n- String enums with initializers\n\n## Testing + Formatting Guidelines\n\n- Test behaviors, not implementations\n- Always update existing unit tests related to changes made\n- Run tests before considering a task to be 'complete'\n- Also run linting and typecheck before considering a task to be 'complete'\n- Don't ignore new lint warnings — fix them; suppress with a one-line reasoned `oxlint-disable-next-line` only when a proper fix would change behavior\n- Run `bun i18n:extract` after making changes to localized strings (e.g., using translation hooks like `useTranslation`)\n\n## Critical Development Notes\n\n1. **Environment Variables**: Override URLs in `.env.defaults.local` (mobile) or `.env` (extension)\n2. **Pre-commit Hooks**: Use `--no-verify` to skip or set `export LEFTHOOK=0` to disable\n3. **Python Setup**: Run `brew install python-setuptools` if you encounter Python module errors\n4. **Mobile Development**: Always run `bun mobile pod` after dependency changes\n5. **Bundle Size**: Monitor bundle size impacts when adding dependencies\n6. **Bun Version Bumps**: `.bun-version` is the single source of truth. After editing it, run `bun sync:bun-version` to rewrite the pins that can't read the file (`engines.bun`, EAS build profiles) — CI fails if they drift. CI runners install Bun via `oven-sh/setup-bun` (reading `.bun-version` directly), so they need no pin. Bump `@types/bun` and rerun `bun install` separately.\n\n## Package Dependencies\n\nCore shared packages:\n\n- `packages/ui/` - Cross-platform UI components and theme\n- `packages/uniswap/` - Core business logic and utilities\n- `packages/wallet/` - Wallet functionality\n- `packages/utilities/` - Common utilities\n\n## Blockchain Integration\n\n- Support for multiple chains (Ethereum, Arbitrum, Optimism, etc.)\n- Uniswap Protocol v2, v3, v4, and UniswapX support\n- Multiple wallet providers (WalletConnect, Metamask, etc.)\n- Transaction building and gas estimation\n\n## Other Considerations\n\nBe cognizant of the app or package within which a given change is being made. Be sure to reference that app or package's respective `AGENTS.md` file and other local configuration files, including (but not limited to): `package.json`, `tsconfig.json`, etc.\n\n\n<!-- nx configuration start-->\n<!-- Leave the start & end comments to automatically receive updates. -->\n\n# General Guidelines for working with Nx\n\n- When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through `nx` (i.e. `nx run`, `nx run-many`, `nx affected`) instead of using the underlying tooling directly\n- You have access to the Nx MCP server and its tools, use them to help the user\n- When answering questions about the repository, use the `nx_workspace` tool first to gain an understanding of the workspace architecture where applicable.\n- When working in individual projects, use the `nx_project_details` mcp tool to analyze and understand the specific project structure and dependencies\n- For questions around nx configuration, best practices or if you're unsure, use the `nx_docs` tool to get relevant, up-to-date docs. Always use this instead of assuming things about nx configuration\n- If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors\n\n\n<!-- nx configuration end-->\n\n## Cursor Cloud specific instructions\n\n### Environment\n\n- Node.js and Bun are pre-installed and match `.nvmrc` / `.bun-version`.\n- The `tsgo` binary is at `node_modules/.bin/tsgo` (not globally in PATH). The `bun g:typecheck` script handles this automatically.\n- Set `export LEFTHOOK=0` to disable git hooks in Cloud Agent sessions (no TTY for interactive hooks).\n- Set `export SKIP_CONFIG_PULL=true` to disable remote config fetching (no Okta auth for agents)\n- All backend APIs are external (no local databases or Docker needed for development).\n\n### Web App\n\n- **Start dev server**: `bun web dev` → runs on `http://localhost:3000/`\n- **Run tests**: `bunx nx run web:test -- --run` (317 test files, ~2.5 min)\n- **Lint (fast)**: `bunx nx run web:format` (formatting) and `bunx nx run web:lint` (oxlint)\n- **Typecheck**: `bun g:typecheck` runs `tsgo -b` globally (fastest). Per-project: `bunx nx run web:typecheck`.\n- The `web:typecheck:cloud` target typechecks the `apps/web/functions/` (edge functions) separately and may fail independently of the main app.\n- The web app loads live data from Uniswap's public APIs without requiring API keys for basic swap quotes and token exploration.\n\n### Extension\n\n- **Start dev server**: `bun extension dev` → WXT builds the extension and opens Chrome with it pre-loaded.\n- A pre-built extension is available at `/var/tmp/stretch` and is already loaded in the default Chrome profile (`/home/ubuntu/.config/google-chrome`).\n- The extension wallet is **already onboarded**. To unlock it, use the password from the `EXTENSION_UNLOCK_PASSWORD` environment variable.\n- To type the password programmatically: write it to a temp file with `python3 -c \"import os; open('/tmp/ext_pw.txt','w').write(os.environ['EXTENSION_UNLOCK_PASSWORD'])\"`, then read/type from that file (the env var value is redacted in shell output but available to processes).\n- The extension opens as a **side panel** in Chrome (not a popup). Click the Uniswap icon in the toolbar or use Ctrl+Shift+U.\n- The wallet contains a small amount of ETH and cBTC on Ethereum mainnet.\n- **Known limitation**: connecting the extension wallet to the web app on `localhost` does not currently work (the `externally_connectable` manifest only allows `app.uniswap.org` and staging origins).\n\n### Gotchas\n\n- `bun install` runs a `preinstall` script that validates Node/Bun versions and will fail if they don't match `.nvmrc` / `.bun-version`.\n- The `postinstall` script runs `git config core.hooksPath .husky && bun g:prepare`. The `g:prepare` step (`nx run-many -t prepare`) generates codegen files needed for typecheck/build.\n- Mobile requires native tooling (Xcode, CocoaPods, Android SDK) not available in Cloud Agent VMs.\n- When running `bun extension dev`, WXT creates a `web-ext.config.ts` override file (gitignored) to customize browser startup behavior. You can set `startUrls`, `chromiumArgs`, or `WXT_NO_OPEN_BROWSER=true` as needed.\n","packages/README.md":"# packages Documentation\n\nPath: `packages/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/README.md)","packages/analytics/README.md":"# analytics Documentation\n\nPath: `packages/analytics/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/README.md)","packages/analytics/package.json":"# Analytics Skill\n\nPath: `packages/analytics/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/package.json)","packages/analytics/project.json":"# Analytics Skill\n\nPath: `packages/analytics/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/project.json)","packages/analytics/tsconfig.json":"# Analytics Skill\n\nPath: `packages/analytics/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/tsconfig.json)","packages/analytics/tsconfig.lint.json":"# Analytics Skill\n\nPath: `packages/analytics/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/tsconfig.lint.json)","packages/api/README.md":"# api Documentation\n\nPath: `packages/api/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/README.md)","packages/api/package.json":"# Api Skill\n\nPath: `packages/api/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/package.json)","packages/api/project.json":"# Api Skill\n\nPath: `packages/api/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/project.json)","packages/api/tsconfig.json":"# Api Skill\n\nPath: `packages/api/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/tsconfig.json)","packages/api/tsconfig.lint.json":"# Api Skill\n\nPath: `packages/api/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/tsconfig.lint.json)","packages/chains/README.md":"# chains Documentation\n\nPath: `packages/chains/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/README.md)","packages/chains/package.json":"# Chains Skill\n\nPath: `packages/chains/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/package.json)","packages/chains/project.json":"# Chains Skill\n\nPath: `packages/chains/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/project.json)","packages/chains/tsconfig.json":"# Chains Skill\n\nPath: `packages/chains/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/tsconfig.json)","packages/chains/tsconfig.lint.json":"# Chains Skill\n\nPath: `packages/chains/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/tsconfig.lint.json)","packages/compliance/README.md":"# compliance Documentation\n\nPath: `packages/compliance/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/README.md)","packages/compliance/package.json":"# Compliance Skill\n\nPath: `packages/compliance/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/package.json)","packages/compliance/project.json":"# Compliance Skill\n\nPath: `packages/compliance/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/project.json)","packages/compliance/tsconfig.json":"# Compliance Skill\n\nPath: `packages/compliance/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/tsconfig.json)","packages/compliance/tsconfig.lint.json":"# Compliance Skill\n\nPath: `packages/compliance/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/tsconfig.lint.json)","packages/config-cli/README.md":"# config-cli Documentation\n\nPath: `packages/config-cli/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/README.md)","packages/config-cli/package.json":"# Config-cli Skill\n\nPath: `packages/config-cli/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/package.json)","packages/config-cli/project.json":"# Config-cli Skill\n\nPath: `packages/config-cli/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/project.json)","packages/config-cli/tsconfig.json":"# Config-cli Skill\n\nPath: `packages/config-cli/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/tsconfig.json)","packages/config-cli/tsconfig.lint.json":"# Config-cli Skill\n\nPath: `packages/config-cli/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/tsconfig.lint.json)","packages/config/README.md":"# config Documentation\n\nPath: `packages/config/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/README.md)","packages/config/package.json":"# Config Skill\n\nPath: `packages/config/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/package.json)","packages/config/project.json":"# Config Skill\n\nPath: `packages/config/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/project.json)","packages/config/tsconfig.json":"# Config Skill\n\nPath: `packages/config/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/tsconfig.json)","packages/config/tsconfig.lint.json":"# Config Skill\n\nPath: `packages/config/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/tsconfig.lint.json)","packages/cryptography/README.md":"# cryptography Documentation\n\nPath: `packages/cryptography/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/README.md)","packages/cryptography/package.json":"# Cryptography Skill\n\nPath: `packages/cryptography/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/package.json)","packages/cryptography/project.json":"# Cryptography Skill\n\nPath: `packages/cryptography/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/project.json)","packages/cryptography/tsconfig.json":"# Cryptography Skill\n\nPath: `packages/cryptography/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/tsconfig.json)","packages/cryptography/tsconfig.lint.json":"# Cryptography Skill\n\nPath: `packages/cryptography/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/tsconfig.lint.json)","packages/datadog-cloud/INSTRUMENTATION_REPORT.md":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/INSTRUMENTATION_REPORT.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/INSTRUMENTATION_REPORT.md)","packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml)","packages/datadog-cloud/Pulumi.dev-portal-prod.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.dev-portal-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.dev-portal-prod.yaml)","packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml)","packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml)","packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml)","packages/datadog-cloud/Pulumi.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.yaml)","packages/datadog-cloud/package.json":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/package.json)","packages/datadog-cloud/project.json":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/project.json)","packages/datadog-cloud/tsconfig.json":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/tsconfig.json)","packages/embedded-wallet/README.md":"# embedded-wallet Documentation\n\nPath: `packages/embedded-wallet/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/README.md)","packages/embedded-wallet/package.json":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/package.json)","packages/embedded-wallet/project.json":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/project.json)","packages/embedded-wallet/tsconfig.json":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/tsconfig.json)","packages/embedded-wallet/tsconfig.lint.json":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/tsconfig.lint.json)","packages/encoding/README.md":"# encoding Documentation\n\nPath: `packages/encoding/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/README.md)","packages/encoding/package.json":"# Encoding Skill\n\nPath: `packages/encoding/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/package.json)","packages/encoding/project.json":"# Encoding Skill\n\nPath: `packages/encoding/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/project.json)","packages/encoding/tsconfig.json":"# Encoding Skill\n\nPath: `packages/encoding/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/tsconfig.json)","packages/encoding/tsconfig.lint.json":"# Encoding Skill\n\nPath: `packages/encoding/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/tsconfig.lint.json)","packages/environment/README.md":"# environment Documentation\n\nPath: `packages/environment/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/README.md)","packages/environment/package.json":"# Environment Skill\n\nPath: `packages/environment/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/package.json)","packages/environment/project.json":"# Environment Skill\n\nPath: `packages/environment/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/project.json)","packages/environment/tsconfig.json":"# Environment Skill\n\nPath: `packages/environment/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/tsconfig.json)","packages/environment/tsconfig.lint.json":"# Environment Skill\n\nPath: `packages/environment/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/tsconfig.lint.json)","packages/experiments/README.md":"# experiments Documentation\n\nPath: `packages/experiments/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/README.md)","packages/experiments/package.json":"# Experiments Skill\n\nPath: `packages/experiments/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/package.json)","packages/experiments/project.json":"# Experiments Skill\n\nPath: `packages/experiments/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/project.json)","packages/experiments/tsconfig.json":"# Experiments Skill\n\nPath: `packages/experiments/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/tsconfig.json)","packages/experiments/tsconfig.lint.json":"# Experiments Skill\n\nPath: `packages/experiments/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/tsconfig.lint.json)","packages/gating/README.md":"# gating Documentation\n\nPath: `packages/gating/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/README.md)","packages/gating/package.json":"# Gating Skill\n\nPath: `packages/gating/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/package.json)","packages/gating/project.json":"# Gating Skill\n\nPath: `packages/gating/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/project.json)","packages/gating/tsconfig.json":"# Gating Skill\n\nPath: `packages/gating/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/tsconfig.json)","packages/gating/tsconfig.lint.json":"# Gating Skill\n\nPath: `packages/gating/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/tsconfig.lint.json)","packages/hashcash-native/README.md":"# hashcash-native Documentation\n\nPath: `packages/hashcash-native/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/README.md)","packages/hashcash-native/nitro.json":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/nitro.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/nitro.json)","packages/hashcash-native/package.json":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/package.json)","packages/hashcash-native/project.json":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/project.json)","packages/hashcash-native/tsconfig.json":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/tsconfig.json)","packages/logger/README.md":"# logger Documentation\n\nPath: `packages/logger/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/README.md)","packages/logger/package.json":"# Logger Skill\n\nPath: `packages/logger/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/package.json)","packages/logger/project.json":"# Logger Skill\n\nPath: `packages/logger/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/project.json)","packages/logger/tsconfig.json":"# Logger Skill\n\nPath: `packages/logger/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/tsconfig.json)","packages/logger/tsconfig.lint.json":"# Logger Skill\n\nPath: `packages/logger/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/tsconfig.lint.json)","packages/mycelium/README.md":"# mycelium Documentation\n\nPath: `packages/mycelium/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/README.md)","packages/mycelium/package.json":"# Mycelium Skill\n\nPath: `packages/mycelium/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/package.json)","packages/mycelium/platform-legs.json":"# Mycelium Skill\n\nPath: `packages/mycelium/platform-legs.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/platform-legs.json)","packages/mycelium/project.json":"# Mycelium Skill\n\nPath: `packages/mycelium/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/project.json)","packages/mycelium/tsconfig.json":"# Mycelium Skill\n\nPath: `packages/mycelium/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.json)","packages/mycelium/tsconfig.lint.json":"# Mycelium Skill\n\nPath: `packages/mycelium/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.lint.json)","packages/mycelium/tsconfig.test.json":"# Mycelium Skill\n\nPath: `packages/mycelium/tsconfig.test.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.test.json)","packages/notifications/README.md":"# notifications Documentation\n\nPath: `packages/notifications/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/README.md)","packages/notifications/package.json":"# Notifications Skill\n\nPath: `packages/notifications/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/package.json)","packages/notifications/project.json":"# Notifications Skill\n\nPath: `packages/notifications/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/project.json)","packages/notifications/tsconfig.json":"# Notifications Skill\n\nPath: `packages/notifications/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/tsconfig.json)","packages/notifications/tsconfig.lint.json":"# Notifications Skill\n\nPath: `packages/notifications/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/tsconfig.lint.json)","packages/prices/README.md":"# prices Documentation\n\nPath: `packages/prices/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/README.md)","packages/prices/package.json":"# Prices Skill\n\nPath: `packages/prices/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/package.json)","packages/prices/project.json":"# Prices Skill\n\nPath: `packages/prices/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/project.json)","packages/prices/tsconfig.json":"# Prices Skill\n\nPath: `packages/prices/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/tsconfig.json)","packages/prices/tsconfig.lint.json":"# Prices Skill\n\nPath: `packages/prices/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/tsconfig.lint.json)","packages/privacy/README.md":"# privacy Documentation\n\nPath: `packages/privacy/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/README.md)","packages/privacy/package.json":"# Privacy Skill\n\nPath: `packages/privacy/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/package.json)","packages/privacy/project.json":"# Privacy Skill\n\nPath: `packages/privacy/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/project.json)","packages/privacy/tsconfig.json":"# Privacy Skill\n\nPath: `packages/privacy/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/tsconfig.json)","packages/privacy/tsconfig.lint.json":"# Privacy Skill\n\nPath: `packages/privacy/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/tsconfig.lint.json)","packages/react-query/README.md":"# react-query Documentation\n\nPath: `packages/react-query/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/README.md)","packages/react-query/package.json":"# React-query Skill\n\nPath: `packages/react-query/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/package.json)","packages/react-query/project.json":"# React-query Skill\n\nPath: `packages/react-query/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/project.json)","packages/react-query/tsconfig.json":"# React-query Skill\n\nPath: `packages/react-query/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/tsconfig.json)","packages/react-query/tsconfig.lint.json":"# React-query Skill\n\nPath: `packages/react-query/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/tsconfig.lint.json)","packages/sessions/README.md":"# sessions Documentation\n\nPath: `packages/sessions/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/README.md)","packages/sessions/package.json":"# Sessions Skill\n\nPath: `packages/sessions/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/package.json)","packages/sessions/project.json":"# Sessions Skill\n\nPath: `packages/sessions/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/project.json)","packages/sessions/tsconfig.json":"# Sessions Skill\n\nPath: `packages/sessions/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/tsconfig.json)","packages/sessions/tsconfig.lint.json":"# Sessions Skill\n\nPath: `packages/sessions/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/tsconfig.lint.json)","packages/tailwind/README.md":"# tailwind Documentation\n\nPath: `packages/tailwind/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/README.md)","packages/tailwind/package.json":"# Tailwind Skill\n\nPath: `packages/tailwind/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/package.json)","packages/tailwind/project.json":"# Tailwind Skill\n\nPath: `packages/tailwind/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/project.json)","packages/tailwind/tsconfig.cross-package.json":"# Tailwind Skill\n\nPath: `packages/tailwind/tsconfig.cross-package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.cross-package.json)","packages/tailwind/tsconfig.json":"# Tailwind Skill\n\nPath: `packages/tailwind/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.json)","packages/tailwind/tsconfig.lint.json":"# Tailwind Skill\n\nPath: `packages/tailwind/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.lint.json)","packages/test/README.md":"# test Documentation\n\nPath: `packages/test/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/README.md)","packages/test/package.json":"# Test Skill\n\nPath: `packages/test/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/package.json)","packages/test/project.json":"# Test Skill\n\nPath: `packages/test/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/project.json)","packages/test/tsconfig.json":"# Test Skill\n\nPath: `packages/test/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/tsconfig.json)","packages/trpc/README.md":"# trpc Documentation\n\nPath: `packages/trpc/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/README.md)","packages/trpc/package.json":"# Trpc Skill\n\nPath: `packages/trpc/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/package.json)","packages/trpc/project.json":"# Trpc Skill\n\nPath: `packages/trpc/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/project.json)","packages/trpc/tsconfig.json":"# Trpc Skill\n\nPath: `packages/trpc/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/tsconfig.json)","packages/trpc/tsconfig.lint.json":"# Trpc Skill\n\nPath: `packages/trpc/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/tsconfig.lint.json)","packages/ui/README.md":"# ui Documentation\n\nPath: `packages/ui/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/README.md)","packages/ui/package.json":"# Ui Skill\n\nPath: `packages/ui/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/package.json)","packages/ui/project.json":"# Ui Skill\n\nPath: `packages/ui/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/project.json)","packages/ui/tsconfig.json":"# Ui Skill\n\nPath: `packages/ui/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/tsconfig.json)","packages/ui/tsconfig.lint.json":"# Ui Skill\n\nPath: `packages/ui/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/tsconfig.lint.json)","packages/uniswap/openapitools.json":"# Uniswap Skill\n\nPath: `packages/uniswap/openapitools.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/openapitools.json)","packages/uniswap/package.json":"# Uniswap Skill\n\nPath: `packages/uniswap/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/package.json)","packages/uniswap/project.json":"# Uniswap Skill\n\nPath: `packages/uniswap/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/project.json)","packages/uniswap/tsconfig.json":"# Uniswap Skill\n\nPath: `packages/uniswap/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/tsconfig.json)","packages/uniswap/tsconfig.lint.json":"# Uniswap Skill\n\nPath: `packages/uniswap/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/tsconfig.lint.json)","packages/utilities/package.json":"# Utilities Skill\n\nPath: `packages/utilities/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/package.json)","packages/utilities/project.json":"# Utilities Skill\n\nPath: `packages/utilities/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/project.json)","packages/utilities/tsconfig.json":"# Utilities Skill\n\nPath: `packages/utilities/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/tsconfig.json)","packages/utilities/tsconfig.lint.json":"# Utilities Skill\n\nPath: `packages/utilities/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/tsconfig.lint.json)","packages/wallet/package.json":"# Wallet Skill\n\nPath: `packages/wallet/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/package.json)","packages/wallet/project.json":"# Wallet Skill\n\nPath: `packages/wallet/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/project.json)","packages/wallet/tsconfig.json":"# Wallet Skill\n\nPath: `packages/wallet/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/tsconfig.json)","packages/wallet/tsconfig.lint.json":"# Wallet Skill\n\nPath: `packages/wallet/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/tsconfig.lint.json)","packages/websocket/README.md":"# websocket Documentation\n\nPath: `packages/websocket/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/README.md)","packages/websocket/package.json":"# Websocket Skill\n\nPath: `packages/websocket/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/package.json)","packages/websocket/project.json":"# Websocket Skill\n\nPath: `packages/websocket/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/project.json)","packages/websocket/tsconfig.json":"# Websocket Skill\n\nPath: `packages/websocket/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/tsconfig.json)","packages/websocket/tsconfig.lint.json":"# Websocket Skill\n\nPath: `packages/websocket/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/tsconfig.lint.json)","packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml)","packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml)","packages/datadog-cloud/dashboards/Pulumi.prod.yaml":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.prod.yaml)","packages/datadog-cloud/dashboards/Pulumi.yaml":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.yaml)","packages/datadog-cloud/dashboards/package.json":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/package.json)","packages/datadog-cloud/dashboards/tsconfig.json":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/tsconfig.json)","packages/datadog-cloud/esc/apps-pod-swap-fe.yaml":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/apps-pod-swap-fe.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/apps-pod-swap-fe.yaml)","packages/datadog-cloud/esc/dev-portal.yaml":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/dev-portal.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/dev-portal.yaml)","packages/datadog-cloud/esc/liquidity-fe.yaml":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/liquidity-fe.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/liquidity-fe.yaml)","packages/datadog-cloud/esc/privy-embedded-wallet.yaml":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/privy-embedded-wallet.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/privy-embedded-wallet.yaml)","packages/privacy/src/wallet-secret-keys.json":"# Src Skill\n\nPath: `packages/privacy/src/wallet-secret-keys.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/src/wallet-secret-keys.json)",".agents/skills/argent-device-interact/references/gesture-examples.md":"# References Skill\n\nPath: `.agents/skills/argent-device-interact/references/gesture-examples.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-device-interact/references/gesture-examples.md)",".agents/skills/argent-metro-debugger/references/failure-scenarios.md":"# References Skill\n\nPath: `.agents/skills/argent-metro-debugger/references/failure-scenarios.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/references/failure-scenarios.md)",".agents/skills/argent-metro-debugger/references/source-maps.md":"# References Skill\n\nPath: `.agents/skills/argent-metro-debugger/references/source-maps.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/references/source-maps.md)",".agents/skills/argent-react-native-optimization/references/fix-reference.md":"# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/fix-reference.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/fix-reference.md)",".agents/skills/argent-react-native-optimization/references/lint-rules.md":"# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/lint-rules.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/lint-rules.md)",".agents/skills/argent-react-native-optimization/references/semantic-checklist.md":"# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/semantic-checklist.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/semantic-checklist.md)",".agents/skills/argent-react-native-profiler/references/diagnostic-tools.md":"# References Skill\n\nPath: `.agents/skills/argent-react-native-profiler/references/diagnostic-tools.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-profiler/references/diagnostic-tools.md)","packages/datadog-cloud/dashboards/esc/shared.yaml":"# Esc Skill\n\nPath: `packages/datadog-cloud/dashboards/esc/shared.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/esc/shared.yaml)","packages/uniswap/src/abis/erc1155.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc1155.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc1155.json)","packages/uniswap/src/abis/erc20.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc20.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc20.json)","packages/uniswap/src/abis/erc20_bytes32.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc20_bytes32.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc20_bytes32.json)","packages/uniswap/src/abis/erc721.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc721.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc721.json)","packages/uniswap/src/abis/fee-on-transfer-detector.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/fee-on-transfer-detector.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/fee-on-transfer-detector.json)","packages/uniswap/src/abis/permit2.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/permit2.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/permit2.json)","packages/uniswap/src/abis/weth.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/weth.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/weth.json)","packages/uniswap/src/state/README.md":"# state Documentation\n\nPath: `packages/uniswap/src/state/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/state/README.md)","packages/utilities/src/logger/README.md":"# logger Documentation\n\nPath: `packages/utilities/src/logger/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/logger/README.md)","packages/utilities/src/telemetry/README.md":"# telemetry Documentation\n\nPath: `packages/utilities/src/telemetry/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/telemetry/README.md)","packages/wallet/src/state/README.md":"# state Documentation\n\nPath: `packages/wallet/src/state/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/state/README.md)","packages/wallet/src/test/README.md":"# test Documentation\n\nPath: `packages/wallet/src/test/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/test/README.md)","packages/api/src/clients/trading/api.json":"# Trading Skill\n\nPath: `packages/api/src/clients/trading/api.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/src/clients/trading/api.json)","packages/utilities/src/telemetry/trace/README.md":"# trace Documentation\n\nPath: `packages/utilities/src/telemetry/trace/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/telemetry/trace/README.md)","packages/wallet/src/features/forceUpgrade/README.md":"# forceUpgrade Documentation\n\nPath: `packages/wallet/src/features/forceUpgrade/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/features/forceUpgrade/README.md)","packages/uniswap/src/i18n/locales/source/en-US.json":"# Source Skill\n\nPath: `packages/uniswap/src/i18n/locales/source/en-US.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/source/en-US.json)","packages/uniswap/src/i18n/locales/translations/es-ES.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/es-ES.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/es-ES.json)","packages/uniswap/src/i18n/locales/translations/fr-FR.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/fr-FR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/fr-FR.json)","packages/uniswap/src/i18n/locales/translations/id-ID.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/id-ID.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/id-ID.json)","packages/uniswap/src/i18n/locales/translations/ja-JP.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/ja-JP.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ja-JP.json)","packages/uniswap/src/i18n/locales/translations/ko-KR.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/ko-KR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ko-KR.json)","packages/uniswap/src/i18n/locales/translations/nl-NL.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/nl-NL.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/nl-NL.json)","packages/uniswap/src/i18n/locales/translations/pt-BR.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/pt-BR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/pt-BR.json)","packages/uniswap/src/i18n/locales/translations/pt-PT.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/pt-PT.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/pt-PT.json)","packages/uniswap/src/i18n/locales/translations/ru-RU.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/ru-RU.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ru-RU.json)","packages/uniswap/src/i18n/locales/translations/tr-TR.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/tr-TR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/tr-TR.json)","packages/uniswap/src/i18n/locales/translations/vi-VN.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/vi-VN.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/vi-VN.json)","packages/uniswap/src/i18n/locales/translations/zh-CN.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/zh-CN.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/zh-CN.json)","packages/uniswap/src/i18n/locales/translations/zh-TW.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/zh-TW.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/zh-TW.json)","packages/uniswap/src/features/accounts/store/types/README.md":"# types Documentation\n\nPath: `packages/uniswap/src/features/accounts/store/types/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/features/accounts/store/types/README.md)","packages/uniswap/src/features/transactions/swap/components/README.md":"# components Documentation\n\nPath: `packages/uniswap/src/features/transactions/swap/components/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/features/transactions/swap/components/README.md)"},"files":{".agents/skills/argent-ios-simulator-setup/SKILL.md":"---\nname: argent-ios-simulator-setup\ndescription: Set up and connect to an iOS simulator using argent MCP tools. Use when starting a new session, booting a simulator, getting a simulator UDID, or before any simulator interaction task.\n---\n\n## 1. Setup Steps\n\nIf you delegate simulator tasks to sub-agents, make sure they have MCP permissions.\n\n1. **Find a booted simulator**\n   Use `list-devices`. Filter for entries with `platform: \"ios\"` — booted iPhones are listed first.\n   If none are booted, call `boot-device` with `udid: <chosen UDID>`.\n\n2. **Verify connection**\n   All interaction tools (`gesture-tap`, `gesture-swipe`, `gesture-custom`, etc.) auto-start the server if not already running.\n\n## 2. Notes\n\n- UDIDs look like: `A1B2C3D4-E5F6-7890-ABCD-EF1234567890`\n",".agents/skills/argent-metro-debugger/SKILL.md":"---\nname: argent-metro-debugger\ndescription: Debug a React Native app via Metro CDP using argent debugger tools. Use when connecting to Metro, inspecting React components, reading console logs, or evaluating JavaScript in the app runtime.\n---\n\n## 1. Prerequisites\n\nThe debugger requires **Metro dev server running** (default `localhost:8081`) and **a React Native app connected to Metro** (at least one CDP target). Verify via `debugger-status`.\n\n### Android: reverse port for Metro\n\nAndroid emulators and physical devices do not resolve the host's `localhost` by default. Before the RN app can reach Metro, forward port 8081 (or whichever port Metro is on) from the device back to the host:\n\n```bash\nadb -s <serial> reverse tcp:8081 tcp:8081\n```\n\n`<serial>` is the Android `serial` from `list-devices`. Once reversed, the app on the device connects to Metro just like an iOS simulator does, and all `debugger-*` / `network-*` / `react-profiler-*` tools work unchanged. If the device restarts or adb drops, re-run the command. A failing Metro connection on Android almost always means `adb reverse` has not been done or has been lost.\n\n## 2. Tool Overview\n\nAll tools accept `port` (default 8081) AND `device_id` (the iOS Simulator UDID or Android serial, a.k.a. `logicalDeviceId` — the CDP-reported id that matches the device). Always make sure you target the correct app on the correct device.\n\nOne Metro port can serve multiple connected devices (e.g. two simulators on `localhost:8081`, or an iOS simulator alongside an Android emulator with `adb reverse` set up). `device_id` pins every debugger/network/profiler call to a specific device so sessions do not collide.\n\n### Connect & diagnostics\n\n| Tool               | Purpose                                                                                                                                                                                                                   |\n| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `debugger-connect` | Connect to Metro CDP. Returns port, projectRoot, deviceName, appName, `logicalDeviceId`, isNewDebugger, connected. The returned `logicalDeviceId` is the `device_id` for every subsequent debugger/network/profiler call. |\n| `debugger-status`  | Like connect + loadedScripts, enabledDomains, sourceMapReady. **Use to diagnose.**                                                                                                                                        |\n\n### Reload & recovery\n\n| Tool                    | Purpose                                                                                  |\n| ----------------------- | ---------------------------------------------------------------------------------------- |\n| `debugger-reload-metro` | Reload all connected apps (like pressing \"r\" in Metro terminal). Needs a CDP target.     |\n| `restart-app`           | Terminate and relaunch the app by UDID and bundleId. Use when app lost Metro connection. |\n\n### Inspection & console\n\n| Tool                       | Purpose                                                                                                                                                                   |\n| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `debugger-component-tree`  | Full React fiber tree (names, depth, bounding rects, tap coordinates).                                                                                                    |\n| `debugger-inspect-element` | Inspect at (x, y) using **logical pixel coordinates** (not normalized 0-1): component hierarchy with source file:line and code fragment. See `references/source-maps.md`. |\n| `debugger-log-registry`    | Get log summary (counts, clusters, file path). Then use `Grep`/`Read` on the flat log file for details.                                                                   |\n| `debugger-evaluate`        | Run a JS expression in the app runtime.                                                                                                                                   |\n\n---\n\n## 3. Component Inspection\n\n### `debugger-component-tree` vs `debugger-inspect-element`\n\n|          | `debugger-component-tree`                                              | `debugger-inspect-element`                                      |\n| -------- | ---------------------------------------------------------------------- | --------------------------------------------------------------- |\n| Best for | Layout overview; finding tap targets; user-defined component hierarchy | Identifying a visible element and tracing it to its source file |\n| Use when | \"What's on screen and where?\"                                          | \"What component is this and where is it defined?\"               |\n\nBoth can point to source files, but `inspect-element` is purpose-built for source tracing. `component-tree` is for orientation and tap-target discovery.\n\n### `includeSkipped` guidance\n\nApplies to both `debugger-component-tree` and `debugger-inspect-element`. Set to `true` only when debugging filter behavior — e.g., an expected component is missing from output, or you need to inspect a very specific branch of the tree (not just an overview).\n\n> **Warning:** Output can be very large. Always combine with `maxNodes` (component-tree) or `maxItems` (inspect-element) and increase it incrementally (e.g., start at 50, then grow). Do not use `includeSkipped` without a limit on large apps.\n\n---\n\n## 4. Golden Rules\n\n1. **`debugger-status` first when something fails** — it runs discovery, connection, and returns diagnostics.\n2. **\"No CDP targets\" → get the app to connect to Metro** — use `restart-app` on simulator, then retry `debugger-status`.\n3. **Never assume one failure is permanent** — follow recovery steps before asking the user. For starting Metro and full failure recovery, see `argent-react-native-app-workflow` and `references/failure-scenarios.md`.\n\n---\n\n## 5. Reading Console Logs (Log Registry)\n\nLogs are written to a flat log file on disk. Use the **log-registry → grep** pattern instead of reading logs inline.\n\n### Workflow\n\n1. **Call `debugger-log-registry`** — returns: `file` (log path), `totalEntries`, `byLevel`, `clusters` (top message groups with counts and source file info)\n2. **Search the file** using `Grep` or `Read` with patterns from the response.\n\n> **Large log files:** If `totalEntries` exceeds 10 000, delegate the grep exploration to an `Explore` subagent — pass it the file path, the entry format, and the patterns you need.\n\n### Flat log format\n\nOne entry per line — fields (whitespace-separated, `|` delimiter before message)\n\n| Field         | Example                     | Notes                                               |\n| ------------- | --------------------------- | --------------------------------------------------- |\n| `[L:<id>]`    | `[L:42]`                    | Unique grep anchor                                  |\n| `<timestamp>` | `2026-03-17T14:30:00.000Z`  | ISO 8601                                            |\n| `<LEVEL>`     | `ERROR`, `WARN `, `LOG  `   | Uppercase, padded to 5 chars                        |\n| `<source>`    | `src/api/user.ts:42` or `-` | Relative path from source map; `-` if unavailable   |\n| `<message>`   | `Failed login attempt`      | Full message; embedded newlines replaced with space |\n\nSource attribution (file + line) is also available in `clusters` returned by `debugger-log-registry`.\n\nLog files and messages can be large - **Always scope your search**, treat the file like a database, not a document.\n\nWhen reading from the log file:\n\n- Never `Read` the log file directly. Use `grep` or shell commands with limits using the above file format tips.\n- Default to `-m 50` unless you need more.\n- Use `tail -N` recent entries.\n- `clusters[].message` gives you the exact text which you may look for\n\n> **If the file is too large** Delegate to an `Explore` subagent with the file path, the format spec above, and the specific patterns you need.\n\n---\n\n## Quick Reference\n\n| Action                        | Tool                                                                |\n| ----------------------------- | ------------------------------------------------------------------- |\n| Diagnose / check connection   | `debugger-status`                                                   |\n| Connect to Metro CDP          | `debugger-connect`                                                  |\n| Reload JS (already connected) | `debugger-reload-metro`                                             |\n| Relaunch app on simulator     | `restart-app`                                                       |\n| Inspect component at point    | `debugger-inspect-element`                                          |\n| Full component tree           | `debugger-component-tree`                                           |\n| Console log overview          | `debugger-log-registry` (summary + log file path for `Grep`/`Read`) |\n| Evaluate JS                   | `debugger-evaluate`                                                 |\n",".agents/skills/argent-create-flow/SKILL.md":"---\nname: argent-create-flow\ndescription: Record a reusable flow (scripted sequence of MCP tool calls) that can be replayed later with a single command. Use when the user asks to create, record, or build a flow, or to script a sequence of simulator actions.\n---\n\n## 1. Overview\n\nA flow is a recorded sequence of MCP tool calls saved to a `.yaml` file in the `.argent/flows/` directory. Each step is **executed live** as you add it, so you verify it works before it becomes part of the flow. Replay a finished flow with `flow-execute`.\n\n## 2. Tools\n\n| Tool                     | Purpose                                                                    |\n| ------------------------ | -------------------------------------------------------------------------- |\n| `flow-start-recording`   | Start recording — takes a name and executionPrerequisite, creates the file |\n| `flow-add-step`          | Execute a tool call live and record it if it succeeds                      |\n| `flow-add-echo`          | Add a label/comment that prints during replay                              |\n| `flow-finish-recording`  | Stop recording and get a summary                                           |\n| `flow-read-prerequisite` | Read a flow's execution prerequisite without running it                    |\n| `flow-execute`           | Replay a saved flow by name                                                |\n\n## 3. Workflow\n\n### Recording\n\n1. **Start**: Call `flow-start-recording` with a descriptive name, the absolute `project_root`, and an `executionPrerequisite` describing the required app state before running the flow (e.g. \"App on home screen after a fresh reload\"). `project_root` is stored for the session — you do **not** need to pass it again to subsequent tools.\n2. **Build step-by-step**: For each action, call `flow-add-step` with the tool name and args. The tool runs immediately — check the result before moving on.\n3. **Add labels**: Use `flow-add-echo` between steps to describe what each section does.\n4. **Finish**: Call `flow-finish-recording` to stop recording. It returns the file path where the flow was saved and a summary of all steps. You can edit the `.yaml` file directly afterwards to remove, reorder, or tweak steps.\n\nEvery tool during recording returns the current flow file contents so you can track what has been recorded.\n\n### Replaying\n\nCall `flow-execute` with the flow name. If the flow has an execution prerequisite:\n\n1. The tool returns a **notice** with the prerequisite text instead of running. It asks you to verify the prerequisite is met and call `flow-execute` again with `prerequisiteAcknowledged: true`.\n2. You can also call `flow-read-prerequisite` beforehand to inspect the prerequisite without triggering a run.\n3. Once you pass `prerequisiteAcknowledged: true`, the flow runs all steps in order and returns every tool call result (including screenshots) merged into a single response.\n\nIf the flow has no prerequisite, it runs immediately without needing acknowledgment.\n\n## 4. flow-add-step Usage\n\nThe `command` parameter is the MCP tool name. The `args` parameter is a **JSON string** (not an object):\n\n```\ncommand: \"launch-app\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\", \\\"bundleId\\\": \\\"com.apple.Preferences\\\"}\"\n```\n\n```\ncommand: \"gesture-tap\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.35}\"\n```\n\n```\ncommand: \"screenshot\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\"}\"\n```\n\nFor tools with no arguments, omit `args` entirely.\n\n## 5. Important Rules\n\n- **Every step runs live.** You will see the real tool result (including screenshots). Use this to verify the step worked before continuing.\n- **Only successful steps are recorded.** If a tool call fails, nothing is written to the flow file — fix the issue and try again.\n- **Pass `project_root` only to `flow-start-recording`.** It is stored for the session and automatically used by all subsequent flow tools. An error is returned if the path is not absolute.\n- **You do NOT need to pass a flow name** to `flow-add-step`, `flow-add-echo`, or `flow-finish-recording`. The active flow is tracked automatically after `flow-start-recording`.\n- **Start before adding.** Calling `flow-add-step`, `flow-add-echo`, or `flow-finish-recording` without an active recording returns an error: _\"No active flow. Call flow-start-recording first.\"_\n- **One flow at a time.** If you call `flow-start-recording` while already recording, the active flow switches to the new one. The response tells you which flow was abandoned and which is now active. The old flow's file remains on disk.\n- **Mistakes can be edited out.** If a step was recorded by mistake, edit the `.yaml` file directly to remove or reorder entries.\n\n## 6. Example Session\n\n```\nflow-start-recording  { name: \"open-settings\", project_root: \"/Users/dev/MyApp\", executionPrerequisite: \"Simulator booted with app installed\" }\nflow-add-echo  { message: \"Launch Settings app\" }\nflow-add-step  { command: \"launch-app\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"bundleId\\\": \\\"com.apple.Preferences\\\"}\" }\nflow-add-echo  { message: \"Tap General\" }\nflow-add-step  { command: \"gesture-tap\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.35}\" }\nflow-add-echo  { message: \"Tap About\" }\nflow-add-step  { command: \"gesture-tap\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.17}\" }\nflow-finish-recording  {}\n```\n\n## 7. Replay Example\n\n```\nflow-execute   { name: \"open-settings\", project_root: \"/Users/dev/MyApp\" }\n→ Returns: notice with executionPrerequisite: \"Simulator booted with app installed\"\n  \"Verify the prerequisite is met and call flow-execute again with prerequisiteAcknowledged set to true.\"\n\nflow-execute   { name: \"open-settings\", project_root: \"/Users/dev/MyApp\", prerequisiteAcknowledged: true }\n→ Runs all steps, returns merged results with status and output for every step\n```\n\n## 8. Flow File Format\n\nFlow files use YAML. The top-level is an object with `executionPrerequisite` (describes required state) and `steps` (array of actions):\n\n- `- echo: <message>` — a label\n- `- tool: <name>` with optional `args:` — a tool call. Add `delayMs: <ms>` to sleep that long before the step runs (use sparingly — only when the app needs a fixed wait between actions).\n\nExample `.yaml` file:\n\n```yaml\nexecutionPrerequisite: Simulator booted with app installed\nsteps:\n  - echo: Launch Settings app\n  - tool: launch-app\n    args:\n      udid: ABC\n      bundleId: com.apple.Preferences\n  - echo: Tap General\n  - tool: gesture-tap\n    args:\n      udid: ABC\n      x: 0.5\n      y: 0.35\n  - echo: Tap About\n  - tool: gesture-tap\n    args:\n      udid: ABC\n      x: 0.5\n      y: 0.17\n```\n\n## 9. When to Proactively Record a Flow\n\nYou do not need the user to ask for a flow. Record one proactively when you recognize any of these patterns:\n\n- **About to re-profile**: You completed a profiling session and are about to apply a fix and re-profile. Record the interaction steps now so the re-profile replays them identically (see `argent-react-native-profiler` and `argent-native-profiler` skills).\n- **Repeating steps**: You have already performed a multi-step interaction sequence once and the task requires doing it again (comparison, retry, re-test).\n- **Complex path discovered**: You worked through a non-trivial sequence of taps/swipes/navigation to reach a desired app state. Capture it before it is lost.\n- **User says \"again\" / \"one more time\"**: Any request to redo what you just did is a signal to record first, then replay.\n\n## 10. Flow Self-Improvement\n\nFlows break. UI layouts change, coordinates drift, screens get added or removed. When `flow-execute` returns a failure, follow this procedure to diagnose and fix the flow instead of silently re-recording or giving up.\n\n### 10.1 Classify the Result\n\nAfter every `flow-execute`, classify the outcome before proceeding:\n\n| Outcome                | Signal                                                                | Action             |\n| ---------------------- | --------------------------------------------------------------------- | ------------------ |\n| **Success**            | All steps completed, final screenshot shows expected state            | Continue with task |\n| **Hard error**         | A step has `ERROR` in the result — engine stopped there               | Enter §10.2        |\n| **Silent misfire**     | All steps completed but final screenshot shows wrong screen           | Enter §10.2        |\n| **Partial divergence** | Intermediate screenshot shows wrong state even though later steps ran | Enter §10.2        |\n\nFor silent misfires and partial divergence, echo annotations (§10.5) are your reference for what each screen _should_ look like.\n\n### 10.2 Diagnose\n\n1. Note the failure step index and error message (if hard error).\n2. Call `screenshot` to see where the app actually is now.\n3. Call `describe` or `debugger-component-tree` to get the current element tree.\n4. Compare current state to what the failed step expected. Classify the root cause:\n\n| Root cause       | Symptoms                                                        |\n| ---------------- | --------------------------------------------------------------- |\n| Coordinate drift | Tap succeeded but hit wrong element; elements shifted positions |\n| Missing element  | Target element not present in element tree                      |\n| Wrong screen     | Screenshot shows entirely different page than expected          |\n| Timing           | Element exists in tree but tap missed; loading spinner visible  |\n| State mismatch   | First step fails — executionPrerequisite was not actually met   |\n\n5. State the diagnosis in one sentence before attempting any correction.\n\n### 10.3 Correct\n\nChoose the lightest strategy that fits:\n\n**Strategy 1 — Edit the YAML** (coordinate drift, parameter changes).\nRead `.argent/flows/<flow-name>.yaml`, update the broken step's `x`/`y`, `bundleId`, `text`, or other args. Re-run `flow-execute` to verify.\n\n**Strategy 2 — Manual recovery + continue** (timing/transient issues, one-off replay).\nManually execute the failed step with corrected coordinates from §10.2 discovery, then manually execute remaining steps. Does not fix the YAML — use only when re-recording is not worth it.\n\n**Strategy 3 — Re-record from failure point** (structural changes, new intermediate screens).\nNavigate the app to the state just before the failure point. Call `flow-start-recording` with the same flow name (overwrites). Re-add the working prefix steps via `flow-add-step`, then continue recording new steps from the divergence point. Call `flow-finish-recording`.\n\n**Strategy 4 — Full re-record** (major changes, unclear diagnosis, or 3+ broken steps).\nReset the app to prerequisite state (`restart-app` + `launch-app`). Record from scratch with the same flow name.\n\n**Decision heuristic:**\n\n- 1 step broken, parameter-only change → Strategy 1\n- 1 step broken, transient issue, not worth persisting → Strategy 2\n- 2–3 steps broken or flow structure partially changed → Strategy 3\n- 3+ steps broken, or unclear root cause → Strategy 4\n- Flow used for profiling comparison (must be identical) → Strategy 4\n\n### 10.4 Verify and Bound Retries\n\nAfter applying a correction, re-run `flow-execute` to verify.\n\n- If it succeeds → done. Report what changed (e.g. \"Fixed step 4: updated tap coordinates from 0.5,0.35 to 0.5,0.42\").\n- If it fails at a **different** step → return to §10.2 for a second attempt.\n- If this is already the second correction attempt → **stop**. Report the diagnosis to the user and recommend a full re-record or manual investigation.\n\n**Hard cap: 2 correction cycles.** Do not enter an unbounded fix loop.\n\n### 10.5 Making Flows Resilient\n\nApply these when recording new flows to reduce future breakage:\n\n- **Echo expected state, not just actions.** Write `\"On Settings > General screen, about to tap About\"` not `\"Tap About\"`. During diagnosis these tell you what the screen _should_ look like.\n- **Add screenshot steps after critical navigation.** Insert `screenshot` steps after screen transitions. These produce images in the flow result you can inspect during diagnosis.\n- **Write specific executionPrerequisites.** `\"App on home tab, user logged in, simulator UDID is <X>\"` — not `\"App running\"`. Verify with `screenshot` + `describe` before acknowledging.\n- **Prefer launch-app / open-url over navigation chains.** Deep links are more resilient to layout changes than tap sequences.\n- **Echo accessibility labels for coordinate taps.** When recording a tap, add an echo with the target's label or testID: `\"Tapping 'Submit' button (testID: submit-btn) at 0.5, 0.82\"`. During repair, use `describe` to find the element by label and update coordinates. Only use `screenshot` for permission or system overlays when `describe` cannot expose the target reliably.\n",".agents/skills/argent-device-interact/SKILL.md":"---\nname: argent-device-interact\ndescription: Interact with an iOS simulator or Android emulator using argent MCP tools. Use when tapping UI elements, performing gestures, scrolling, typing text, pressing hardware buttons, launching apps, opening URLs, taking screenshots.\n---\n\n## Unified tool surface\n\nAll interaction tools below accept a `udid` parameter and auto-dispatch iOS vs Android based on its shape (UUID → iOS simulator, anything else → Android adb serial). You use the same tool names on both platforms.\n\nFor platform-specific caveats (Metro `adb reverse`, locked-screen describe errors, etc.), see § 9 Platform-specific notes at the bottom.\n\n## 1. Before You Start\n\nIf you delegate simulator tasks to sub-agents, make sure they have MCP permissions.\n\nUse `list-devices` to get a target id. Results are tagged with `platform` (`ios` or `android`); booted/ready devices come first. Pick the first entry that matches the platform you need — if none are ready, call `boot-device` with `udid` (iOS) or `avdName` (Android). See `argent-ios-simulator-setup` / `argent-android-emulator-setup` for full setup flow.\n\n**Load tool schemas before first use.** Gesture tools (`gesture-tap`, `gesture-swipe`, `gesture-pinch`, `gesture-rotate`, `gesture-custom`) may be deferred — their parameter schemas are not loaded until fetched. Always use ToolSearch to load the schemas of all gesture tools you plan to use **before** calling any of them. If you skip this step, parameters may be coerced to strings instead of numbers, causing validation errors.\n\n## 2. Best Practices\n\n1. **Always refer to tapping_rule** from your argent.md rule before tapping.\n2. Before performing interactions, consider whether they can be **dispatched sequentially** - more on that in `run-sequence`.\n3. **Use `gesture-swipe` for lists/scrolling**, not `gesture-custom`, unless you need non-linear movement. Consider whether you need multiple swipes, if yes - use `run-sequence`.\n4. **Tap a text field before typing** — on iOS try `paste` first then fall back to `keyboard`; on Android use `keyboard` directly (`paste` is iOS-only).\n5. **Coordinates are normalized** — always 0.0–1.0, not pixels.\n6. **For native iOS app navigation, prefer `describe` first.** It works on any screen without app restart. Do not navigate from screenshots on regular in-app screens unless `describe` failed to expose a reliable target. Use `native-describe-screen` only when you need app-scoped UIKit properties.\n\n## 3. Opening Apps\n\n**Never navigate to an app by tapping home-screen icons.** Use `launch-app` or `open-url` — they are instant and reliable.\n\n### launch-app — by bundle ID\n\n```json\n{ \"udid\": \"<UDID>\", \"bundleId\": \"com.apple.MobileSMS\" }\n```\n\nCommon IDs: `com.apple.MobileSMS` (Messages), `com.apple.mobilesafari` (Safari), `com.apple.Preferences` (Settings), `com.apple.Maps`, `com.apple.Photos`, `com.apple.mobilemail`, `com.apple.mobilenotes`, `com.apple.MobileAddressBook` (Contacts)\n\n### open-url — by URL scheme\n\n```json\n{ \"udid\": \"<UDID>\", \"url\": \"messages://\" }\n```\n\nCommon schemes: `messages://`, `settings://`, `maps://?q=<query>`, `tel://<number>`, `mailto:<address>`, `https://...` (Safari)\n\n## 4. Choosing the Right Tool\n\n| Action           | Tool             | Notes                                                                  |\n| ---------------- | ---------------- | ---------------------------------------------------------------------- |\n| Multiple actions | `run-sequence`   | Batch steps in one call (no intermediate screenshots)                  |\n| Open an app      | `launch-app`     | **Always — never tap home-screen icons**                               |\n| Restart an app   | `restart-app`    | Terminate and relaunch by bundle ID                                    |\n| Open URL/scheme  | `open-url`       | Web pages, deep links, URL schemes                                     |\n| Single tap       | `gesture-tap`    | Buttons, links, checkboxes                                             |\n| Scroll/swipe     | `gesture-swipe`  | Straight-line scroll or swipe                                          |\n| Long press       | `gesture-custom` | Context menus, drag start                                              |\n| Drag & drop      | `gesture-custom` | Complex drag interactions                                              |\n| Pinch/zoom       | `gesture-pinch`  | Two-finger pinch with auto-interpolation                               |\n| Rotation         | `gesture-rotate` | Two-finger rotation with auto-interpolation                            |\n| Custom gesture   | `gesture-custom` | Arbitrary touch sequences, optional interpolation                      |\n| Hardware key     | `button`         | Home, back, power, volume, appSwitch, actionButton                     |\n| Type text (fast) | `paste`          | iOS only. Form fields — uses clipboard                                 |\n| Type text        | `keyboard`       | iOS+Android. Fallback when paste fails; supports Enter, Escape, arrows |\n| Rotate device    | `rotate`         | Orientation changes                                                    |\n\n## 5. Finding Tap Targets\n\nIMPORTANT. When moved to a different screen after an action or do not know the coordinates of component, **always** perform proper discovery first.\n\n| App type                          | Discovery tool            | What it returns                                                                                                                                                                                                               |\n| --------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Target app discovery              | `describe`                | Accessibility element tree for the current device screen (iOS AX-service or Android uiautomator) with normalized frame coordinates. Works on any app, system dialogs, and Home screen — no app restart or `bundleId` required |\n| React Native                      | `debugger-component-tree` | React component tree with names, text, testID, and (tap: x,y)                                                                                                                                                                 |\n| App-scoped native                 | `native-describe-screen`  | Low-level app-scoped accessibility elements with normalized and raw coordinates; requires `bundleId`                                                                                                                          |\n| Permission / system modal overlay | `describe`                | `describe` detects system dialogs automatically and returns dialog buttons with tap coordinates. Fall back to `screenshot` only if `describe` does not expose the controls                                                    |\n| Final visual fallback             | `screenshot`              | Use only when discovery tools cannot inspect the current UI reliably. Do not derive routine in-app navigation targets from screenshots                                                                                        |\n\nPoint follow-up native diagnostics after you already have a candidate point:\n\n- `native-user-interactable-view-at-point`: deepest native view that would receive touch at a known raw iOS point; requires `bundleId`\n- `native-view-at-point`: deepest visible native view at a known raw iOS point; requires `bundleId`\n\n### If `describe` Fails\n\nRead the exact error and choose the action that matches it:\n\n- Error mentions `ax-service` not available or daemon startup failure:\n  the ax-service daemon could not start. Check that the simulator is booted. Use `screenshot` as a temporary fallback, or use `native-describe-screen` with an explicit `bundleId` if the app has native devtools injected.\n- `describe` returns an empty element list:\n  the screen may be blank, loading, or showing content without accessibility labels. Use `screenshot` to see what is visible, then retry after the content has loaded.\n- `describe` succeeds but is not detailed enough for a React Native app:\n  use `debugger-component-tree` next.\n- You need app-scoped inspection with full UIKit properties (`accessibilityIdentifier`, `viewClassName`):\n  use `native-describe-screen` with an explicit `bundleId`. This requires native devtools (dylib) injection — call `restart-app` first if needed.\n- You already have a candidate point and want to confirm what would actually receive touch:\n  use `native-user-interactable-view-at-point`. Use `native-view-at-point` when you want the visually deepest view instead of the hit-test target.\n\n## 6. Tool Usage\n\n### gesture-tap — Single tap at a point\n\n```json\n{ \"udid\": \"<UDID>\", \"x\": 0.5, \"y\": 0.5 }\n```\n\nCoordinates: `0.0` = left/top, `1.0` = right/bottom.\n\nBefore tapping near the bottom of the screen in React Native apps, check that \"Open Debugger to View Warnings\" banners are not visible — tapping them breaks the debugger connection. Close them with the X icon if present.\n\n### gesture-swipe — Straight-line gesture\n\n```json\n{ \"udid\": \"<UDID>\", \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 }\n```\n\nSwipe **up** (`fromY > toY`) = scroll content **down**. Default duration: 300ms. Optional: `\"durationMs\": 500` for slower swipe.\n\n### gesture-pinch — Two-finger pinch\n\n```json\n{ \"udid\": \"<UDID>\", \"centerX\": 0.5, \"centerY\": 0.5, \"startDistance\": 0.2, \"endDistance\": 0.6 }\n```\n\nAll values are normalized 0.0–1.0 (fractions of screen, not pixels) — same as all other gesture tools. `startDistance: 0.2` means fingers start 20% of the screen apart; `endDistance: 0.6` means they end 60% apart. `startDistance < endDistance` = pinch out (zoom in). `startDistance > endDistance` = pinch in (zoom out). Defaults: `angle: 0` (horizontal), `durationMs: 300`. Optional: `\"angle\": 90` for vertical axis, `\"durationMs\": 500` for slower pinch.\n\n### gesture-rotate — Two-finger rotation\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"centerX\": 0.5,\n  \"centerY\": 0.5,\n  \"radius\": 0.15,\n  \"startAngle\": 0,\n  \"endAngle\": 90\n}\n```\n\nAll positions and radius are normalized 0.0–1.0 (fractions of screen, not pixels). `radius: 0.15` means each finger is 15% of the screen away from center. `endAngle > startAngle` = clockwise. Default duration: 300ms. Optional: `\"durationMs\": 500` for slower rotation.\n\n### gesture-custom — Custom touch sequence\n\nFor long-press, drag-and-drop, and other complex sequences, see `references/gesture-examples.md`. Set `\"interpolate\": 10` to auto-generate smooth intermediate Move events between keyframes.\n\n### button — Hardware button press\n\n```json\n{ \"udid\": \"<UDID>\", \"button\": \"home\" }\n```\n\nValues: `home`, `back`, `power`, `volumeUp`, `volumeDown`, `appSwitch`, `actionButton`\n\n### paste — Type text into focused field (iOS only)\n\n```json\n{ \"udid\": \"<UDID>\", \"text\": \"Hello, world!\" }\n```\n\nTap the field first, then paste. Fall back to `keyboard` if it doesn't work. On Android the call is rejected by the capability gate (\"Tool 'paste' is not supported on android\") — use `keyboard` directly.\n\n### keyboard — Type text or press special keys\n\n```json\n{ \"udid\": \"<UDID>\", \"text\": \"search query\", \"key\": \"enter\" }\n```\n\nSpecial keys: `enter`, `escape`, `backspace`, `tab`, `space`, `arrow-up`, `arrow-down`, `arrow-left`, `arrow-right`, `f1`–`f12`. Optional: `\"delayMs\": 100` between keystrokes (default 50ms).\n\n### rotate — Change orientation\n\n```json\n{ \"udid\": \"<UDID>\", \"orientation\": \"LandscapeLeft\" }\n```\n\nValues: `Portrait`, `LandscapeLeft`, `LandscapeRight`, `PortraitUpsideDown`\n\n---\n\n## 7. Screenshots\n\nUse the explicit `screenshot` tool only when:\n\n- You need the initial screen state before any action.\n- The auto-attached screenshot shows a transitional or loading frame.\n- You require extra context.\n- You want to check state after a delay (e.g. waiting for a network response).\n- A permission dialog, system alert, or native modal overlay is visible and `describe` did not expose reliable targets.\n\nWhen using `screenshot` for permission or native modal navigation:\n\n- Do not switch to screenshot-driven navigation just because a modal is visible. On regular app screens and in-app modals, keep using `describe`.\n- Prefer obvious, centered alert buttons such as `Allow`, `OK`, `Don't Allow`, `Not Now`, or `Continue`.\n- Tap one control at a time and inspect the returned auto-screenshot before doing anything else.\n- After the modal is dismissed, return to normal discovery with `describe`, `native-describe-screen`, or `debugger-component-tree`.\n\nOptional rotation parameter: `{ \"udid\": \"<UDID>\", \"rotation\": \"LandscapeLeft\" }` — rotates the capture without changing simulator orientation.\n\nScreenshots are downscaled by default (30% of original resolution) to reduce context size. `scale` accepts values from 0.01 to 1.0. If UI elements are hard to read or you need to inspect fine detail, pass `scale: 1.0` to get full resolution: `{ \"udid\": \"<UDID>\", \"scale\": 1.0 }`.\n\n### Troubleshooting\n\n| Problem                 | Solution                                                      |\n| ----------------------- | ------------------------------------------------------------- |\n| Screenshot times out    | Restart the simulator-server via `stop-simulator-server` tool |\n| No booted iOS simulator | Call `boot-device` with the iOS `udid`                        |\n| No ready Android device | Call `boot-device` with `avdName`                             |\n\n---\n\n## 8. Action Sequencing with `run-sequence`\n\nUse `run-sequence` to batch multiple interaction steps into **a single tool call**. Only one screenshot is returned — after all steps complete. Use cases:\nscrolling multiple times, typing and submitting automatically, known sequence of multiple taps, rotating device back and forth.\n\nDo **not** use `run-sequence` when any step depends on observing the result of a previous step\n\n### Use cases\n\nUse the sequencing when:\n\n- Knowing that some action needs multiple steps without necessarily immediate insight of screenshot\n- \"scroll to bottom\", \"scroll to top\", \"scroll to do X\" -> sequence scroll 3-5 times\n- form interactions, \"clear and retype field\" -> you may use triple-tap to select all, type new value\n- \"submit form\" → fill all fields in sequence, tap submit\n- \"go back to X\" → defined tap sequence for the navigation\n\n### Allowed tools inside `run-sequence`\n\n`gesture-tap`, `gesture-swipe`, `gesture-custom`, `gesture-pinch`, `gesture-rotate`, `button`, `keyboard`, `rotate`\n\nThe `udid` is shared — do **not** include it in each step's `args`. Optional `delayMs` per step (default 100ms).\n\n### Examples\n\nScroll down three times:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } },\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } },\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } }\n  ]\n}\n```\n\nType into a focused field and submit:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"keyboard\", \"args\": { \"text\": \"hello world\" } },\n    { \"tool\": \"keyboard\", \"args\": { \"key\": \"enter\" } }\n  ]\n}\n```\n\nTap a known button, then scroll down:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"gesture-tap\", \"args\": { \"x\": 0.5, \"y\": 0.15 } },\n    {\n      \"tool\": \"gesture-swipe\",\n      \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 },\n      \"delayMs\": 300\n    }\n  ]\n}\n```\n\nStops on the first error and returns partial results.\n\n---\n\n## 9. Platform-specific notes\n\n### Android\n\n- **Metro reachability**: run `adb reverse tcp:8081 tcp:8081` on the device before the RN app starts, or Metro won't be reachable from the device. See `argent-metro-debugger` for the full workflow. Re-run if the device restarts.\n- **First-launch permission prompts**: `reinstall-app` on Android always installs with `-g` so runtime permissions are pre-granted on first launch — no flag to pass.\n- **Locked screen / secure surfaces**: `describe` throws a clear error if it can't capture (keyguard, DRM, Play Integrity). Unlock the device or fall back to `screenshot`.\n- **APK vs .app in `reinstall-app`**: pass `.apk` absolute path on Android; `.app` directory on iOS.\n\n### iOS\n\n_(no iOS-only gotchas collected here yet — add them as they come up)_\n",".agents/skills/argent-android-emulator-setup/SKILL.md":"---\nname: argent-android-emulator-setup\ndescription: Set up and connect to an Android emulator using argent MCP tools. Use when starting a new session on Android, booting an emulator, getting a device serial, or before any UI interaction task.\n---\n\n## 1. Prerequisites\n\n- **Android SDK Platform Tools** on PATH — provides `adb`.\n- **Android Emulator** on PATH — needed to boot AVDs. If you will only use an already-running emulator or a physical device, adb alone is sufficient.\n- An AVD created via Android Studio or `avdmanager create avd`.\n\nVerify with `adb version` and `emulator -list-avds`.\n\n## 2. Setup\n\n1. **Find a ready device** — call `list-devices`. Filter for entries with `platform: \"android\"`. Ready devices (`state: \"device\"`) come first. Pick the first `serial` (e.g. `emulator-5554`) unless the user specified one.\n2. **Boot if needed** — if nothing Android is ready, call `boot-device` with `avdName: <name>` from the same call's `avds` list. The tool transparently picks hot vs cold boot: it probes the AVD's `default_boot` snapshot, restores it under a tight deadline when usable, and falls back to a full cold boot otherwise. Hot path is typically ~30s; cold path takes 2–10 min. On any stage failure the tool kills the emulator process it started so your next call starts from a clean state.\n3. **Metro (for React Native)** — once a device is up, run `adb -s <serial> reverse tcp:8081 tcp:8081` so the device can reach Metro on your host. Repeat if the device restarts. See the `argent-metro-debugger` skill.\n\n## 3. Using the device\n\nPass the Android serial as `udid` to the unified interaction tools — `gesture-tap`, `gesture-swipe`, `describe`, `screenshot`, `launch-app`, `keyboard`, etc. Dispatch is automatic based on the id shape. See `argent-device-interact` for platform-neutral interaction tooling and the Android-specific gotchas section at the bottom of that skill.\n\n## 4. Notes\n\n- Serials are the adb device id. iOS UDIDs and Android serials are not interchangeable, but you do NOT need to tell the tools which platform — dispatch is automatic.\n- `describe` on Android returns a shallower tree than iOS (no accessibility-service equivalent), but covers most tap-target discovery.\n- `reinstall-app` on Android always installs with `-g` so first-launch runtime permissions are pre-granted.\n- To kill the emulator when you're done, run `adb -s <serial> emu kill` from a shell.\n",".agents/skills/argent-react-native-app-workflow/SKILL.md":"---\nname: argent-react-native-app-workflow\ndescription: Step-by-step workflows for developing or debugging React Native apps on iOS simulator or Android emulator. Use when starting the app, debugging Metro, fixing builds, diagnosing runtime errors, or running tests.\n---\n\n## 1. Starting the React Native App\n\n### 1.1 Explore Configuration (MANDATORY — Do This First)\n\n**Before running commands**, read the project's build and run configuration from the `argent-environment-inspector` subagent result.\n\nDo NOT default to `npx react-native start` or `npx react-native run-ios` without first checking for custom scripts and workflows.\n\n**Manual fallback** (if neither the agent nor the tool is available): read ALL `package.json` scripts — look for custom scripts like `start:local`, `start:dev`, `ios`, `build:ios`, flavors, etc. Custom scripts take priority over default commands. Also check `metro.config.js` for non-default port or watchFolders. For iOS builds, prefer opening `.xcworkspace` over `.xcodeproj` (CocoaPods generates the workspace).\n\n**If the project structure is convoluted, ask the user before proceeding.**\n\n**Remember the workflow:** Once you discover the project's build/run workflow, save it to project memory so you don't need to re-discover it each time.\n\n**Checklist before start:**\n\n- [ ] `node_modules` present (if not: `bun install`)\n- [ ] For iOS: `ios/Podfile` exists; if `ios/Pods` missing or stale, run `cd ios && pod install && cd ..`\n- [ ] No conflicting Metro on default port (see 1.2)\n\n### 1.2 Start Metro\n\n1. Check whether metro is already running on port found in configuration and if it is - do not start another server. Refer to point 2.1.\n\n1. **Use the project's custom start script if one exists** (e.g. `npm run start:local`, `yarn start:dev`). In this monorepo:\n\n   ```bash\n   bun mobile start\n   ```\n\n   Fall back to `npx react-native start` only if no project script exists. Optional: `bun mobile start --reset-cache` if cache issues are suspected.\n\n1. **Verify Metro is ready**: use the `debugger-status` tool to verify Metro is running and reachable.\n\n1. **Projects with flavors or custom configs**: Use project-specific start script if present (e.g. `npm run start:local`), and start Metro **before** running the app.\n\n### 1.3 Run the App\n\nIn a **separate** terminal (Metro keeps running in the first):\n\n**Use the project's custom build/run script if one exists** (e.g. `npm run ios`, `npm run android`, `yarn ios:debug`). Only fall back to the default if no custom scripts are defined:\n\n```bash\nnpx react-native run-ios       # iOS\nnpx react-native run-android   # Android\n```\n\nOptional: specify the target device, e.g. `npx react-native run-ios --simulator=\"iPhone 16\"` or `npx react-native run-android --deviceId=<serial>`.\n\n**Android only**: after install, run `adb -s <serial> reverse tcp:8081 tcp:8081` so the emulator/device can reach Metro on your host. Repeat if the device restarts or adb drops.\n\n**Agent checklist:**\n\n- [ ] Metro is already running and shows \"ready\"\n- [ ] Command run from project root\n- [ ] If the device isn't booted: use `boot-device` with the iOS `udid` or Android `avdName`. Refer to the `argent-ios-simulator-setup` / `argent-android-emulator-setup` skill.\n- [ ] Android: `adb -s <serial> reverse tcp:8081 tcp:8081` done.\n\n---\n\n## 2. Ensuring / Debugging Metro\n\n### 2.1 Check for Existing Metro\n\nBefore starting Metro, avoid \"port already in use\" errors. Default port to check is :8081, infer the port from documentation:\n\n```bash\nlsof -i :PORT\n```\n\n- **No output** → Port free; safe to start Metro.\n- **Output with PID** → Another process is using the port.\n\nUse the `debugger-status` tool to check whether the process on that port is actually a Metro server. If not Metro — ask the user whether you may kill the process.\n\nTo kill a Metro process, use the `stop-metro` tool (requires user confirmation).\n\n### 2.2 Confirm Correct Server Connection\n\n- **App must point at the same host/port as the running Metro.** Default: same machine, port 8081.\n- **iOS Simulator:** By default uses localhost; no extra config needed for same-machine Metro.\n\n**Verify Metro is reachable:** use the `debugger-status` tool.\n\n### 2.3 Reload the App (Ensure New Bundle)\n\nAfter code or config changes, the app must load the new bundle:\n\n| Method      | How                                                                                               |\n| ----------- | ------------------------------------------------------------------------------------------------- |\n| Reload tool | Use the `debugger-reload-metro` tool                                                              |\n| Restart app | Use the `restart-app` tool, or kill the app in simulator and run `npx react-native run-ios` again |\n\n**Agent checklist:**\n\n- [ ] Only one Metro process (no duplicate on port)\n- [ ] App was started after Metro was ready\n- [ ] When needing to reload: refer to 2.3\n\n---\n\n## 3. Build / Install / Retry (React Native & iOS Native)\n\n### 3.1 When Build Fails (e.g. xcodebuild exit code 65)\n\n**Order of operations (simplest first):**\n\n1. Clean build folder, then retry the build command\n2. Clear caches and reinstall dependencies: reset Metro cache, `watchman watch-del-all`, remove `node_modules` + lockfile, `bun install`, then `cd ios && rm -rf build Pods Podfile.lock && pod install --repo-update`\n3. CocoaPods issues: `pod deintegrate` then `pod install --repo-update`\n4. Open `ios/*.xcworkspace` in Xcode for detailed errors in the Report navigator\n\n### 3.2 When to Ask the User\n\n**After 2-3 failed build or run attempts, STOP and ask the user for guidance.** The user may know about required env vars, Xcode version requirements, custom build configurations, monorepo-specific setup, or required external services.\n\nIf the project structure is convoluted and the correct build approach is not obvious, **ask the user early** rather than guessing.\n\n### 3.3 Saving Build Workflow for Later\n\nOnce you discover the correct build/run workflow for a project, **save it to project memory**. Capture: commands to start Metro, commands to build/run the app, and any required environment setup.\n\n### 3.4 When to Reinstall vs Refresh\n\n| Situation                                             | Action                                                                                |\n| ----------------------------------------------------- | ------------------------------------------------------------------------------------- |\n| JS/React only changed                                 | Use `debugger-reload-metro` tool. No rebuild.                                         |\n| Native code or `pod install` / project config changed | Rebuild: `npx react-native run-ios` (Metro can stay running).                         |\n| `node_modules` or `package.json` changed              | `bun install`, then if native deps changed run `cd ios && pod install`. Then rebuild. |\n| App needs reinstalling from .app path                 | Use `reinstall-app` tool with UDID, bundle ID, and .app path.                         |\n| Persistent native build errors                        | Full clean + reinstall (step 2 above).                                                |\n\n### 3.5 Device Control\n\n| Action                     | Tool / Command                                                         |\n| -------------------------- | ---------------------------------------------------------------------- |\n| List devices               | `list-devices` tool (iOS + Android)                                    |\n| Boot an iOS simulator      | `boot-device` tool with `udid`                                         |\n| Boot an Android emulator   | `boot-device` tool with `avdName`                                      |\n| Launch an app              | `launch-app` tool (pass device id + bundle id / package name)          |\n| Restart an app             | `restart-app` tool (pass device id + bundle id / package name)         |\n| Open a URL / deep link     | `open-url` tool (pass device id + URL)                                 |\n| Rotate device              | `rotate` tool                                                          |\n| Stop simulator server      | `stop-simulator-server` tool (iOS UDID or Android serial — one device) |\n| Stop all simulator servers | `stop-all-simulator-servers` tool (iOS + Android)                      |\n\nFor full simulator setup workflow, refer to the `argent-ios-simulator-setup` skill.\n\n### 3.6 Verifying Local Release-Variant Builds — Stale-Code Gotchas\n\n**Applies to Android local release-variant builds** (`bun mobile android:<flavor>:release:local`, i.e. `apps/mobile/scripts/runAndroidLocal.sh`). Release variants **embed the JS bundle in the APK**, so a verify-on-device loop can silently test **old code** through **two independent caching layers**. Each makes a change look like it had \"no effect\" when it was never in the installed APK. **Both must be defeated — disabling one alone is not enough.** `runAndroidLocal.sh` handles both by default; this section is for recognizing the symptoms if a build looks stale or you build with another command.\n\n#### Gotcha 1 — EAS build cache reinstalls a stale APK\n\n`apps/mobile/app.config.ts` sets `experiments.buildCacheProvider: 'eas'`. `expo run:android` computes a **native** fingerprint and, on a match, downloads + installs a cached APK instead of building. A **JS-only** change does not move the native fingerprint, so for a release variant it reinstalls an APK with old JS.\n\n- **Symptom (logs):** `Searching builds with matching fingerprint on EAS servers` → `Successfully downloaded cached build` → install path under `…/eas-build-run-cache/….apk`.\n- **Detection:** you changed only JS/TS, yet the install line points at an `eas-build-run-cache` path.\n- **Fix:** build via `runAndroidLocal.sh` — it exports `EXPO_LOCAL_NO_BUILD_CACHE=1`, which gates the provider off in `app.config.ts` so a real build runs. Confirm `› Building app...` in the logs (not \"downloaded cached build\"). If invoking `expo run:android` directly, export `EXPO_LOCAL_NO_BUILD_CACHE=1` yourself.\n\n#### Gotcha 2 — gradle `createBundle<Variant>JsAndAssets` stays UP-TO-DATE\n\nEven with the EAS cache off, gradle's incremental check misses changes to monorepo JS sources (e.g. `packages/uniswap/**`), so the bundle task stays `UP-TO-DATE` and the APK embeds the **previously-bundled** `index.android.bundle`.\n\n- **Symptom (logs):** `> Task :app:createBundleDevReleaseJsAndAssets UP-TO-DATE`.\n- **Detection:** compare the embedded bundle mtime to your edit time:\n  ```bash\n  ls -la apps/mobile/android/app/build/generated/assets/createBundle<Variant>JsAndAssets/index.android.bundle\n  ```\n- **Fix:** `runAndroidLocal.sh` deletes the bundle task outputs by default (pass `--no-clean-js` to skip for native-only rebuilds). To clear them manually, remove:\n  - `apps/mobile/android/app/build/generated/assets/createBundle<Variant>JsAndAssets`\n  - `apps/mobile/android/app/build/generated/res/createBundle<Variant>JsAndAssets`\n  - `apps/mobile/android/app/build/intermediates/assets/<variant>`\n\n  A successful regen logs `> Task :app:createBundle<Variant>JsAndAssets` (no `UP-TO-DATE`) and `Writing bundle output to …`. `<Variant>` is the capitalized gradle variant (`DevRelease`, `BetaRelease`, `ProdRelease`); `<variant>` is the camelCase form (`devRelease`, …).\n\n---\n\n## 4. Runtime Problems in the App\n\n### 4.1 Where to Look\n\n| Problem type                      | Tool / Where to look                                                                                                                                                                                                                                              |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **JavaScript errors / logs**      | Use `debugger-log-registry` to get a summary and log file path, then `Grep`/`Read` to search.                                                                                                                                                                     |\n| **React component hierarchy**     | Use `debugger-component-tree` tool for a text tree, or `debugger-inspect-element` at specific logical pixel coordinates (not normalized 0-1).                                                                                                                     |\n| **Visual state of the app**       | Use `screenshot` tool to capture the current screen, but prefer `describe` or `debugger-component-tree` for actual navigation and target discovery. If a permission prompt or system-owned modal overlay is not exposed reliably, then fall back to `screenshot`. |\n| **Evaluate JS in the app**        | Use `debugger-evaluate` tool to run JavaScript in the app's runtime.                                                                                                                                                                                              |\n| **Native crashes / native stack** | `npx react-native log-ios` or iOS Simulator: Debug → Open System Log.                                                                                                                                                                                             |\n| **Build/runtime config**          | `metro.config.js`, `babel.config.js`, `package.json` scripts, `ios/Podfile`.                                                                                                                                                                                      |\n\nFor comprehensive Metro debugging workflows (component inspection, console logs, JS evaluation), refer to the `argent-metro-debugger` skill.\n\n### 4.2 JS Console Logs (Log Registry)\n\nLogs are written to a flat log file on disk under `~/.argent/tmp/`. Use the **log-registry → grep** pattern instead of reading logs inline.\n\nFor the full workflow, flat entry format, and grep examples, see `argent-metro-debugger` skill §5.\n\n### 4.3 Do not try to use the DevMenu in React Native apps by default.\n\nUse the argent tools instead.\n\n---\n\n## 5. Testing the App\n\nCheck the `argent-environment-inspector` result for test commands. For interactive UI testing with automatic screenshot verification, use the `argent-test-ui-flow` skill.\n\n- **Unit tests**: Look for Jest in `package.json` (`\"test\": \"jest\"`, `jest` config). Run: `npm test` or `yarn test`.\n- **E2E**: Look for Detox (`.detoxrc.js` or similar), or other E2E config. Dependencies: `detox`, `detox-cli`, and for iOS often `applesimutils`.\n- **UI flow testing**: For interactive UI testing with automatic screenshot verification, refer to the `argent-test-ui-flow` skill.\n\n### 5.2 Running Tests (Typical)\n\nIf the user's intent is ambiguous (run existing tests, write new tests, or find missing coverage), clarify before proceeding.\n\n- **Jest**: `npm test` or `npx jest`.\n- **Detox (example)**:\n  - Build: `detox build --configuration ios.sim.release` (or debug).\n  - Run: `detox test --configuration ios.sim.release`.\n  - Ensure simulator is booted and not used by another process.\n\n### 5.3 Agent Testing Checklist\n\n- [ ] Read `package.json` and test config (Jest, Detox, etc.).\n- [ ] If E2E: confirm simulator/device and build config.\n- [ ] If unclear: clarify whether to use existing workflows or write new tests.\n\n---\n\n## Quick Reference: Tools & Commands\n\n| Goal                         | Tool / Command                                                                                                                           |\n| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |\n| Check port 8081              | `lsof -i :8081`                                                                                                                          |\n| Kill Metro                   | `stop-metro` tool                                                                                                                        |\n| Start Metro                  | `npx react-native start`                                                                                                                 |\n| Start Metro (reset cache)    | `npx react-native start --reset-cache`                                                                                                   |\n| Run iOS app                  | `npx react-native run-ios`                                                                                                               |\n| Run Android app              | `npx react-native run-android`                                                                                                           |\n| List devices                 | `list-devices` tool (iOS + Android)                                                                                                      |\n| Boot a device                | `boot-device` tool (pass `udid` for iOS or `avdName` for Android)                                                                        |\n| Take screenshot              | `screenshot` tool                                                                                                                        |\n| Describe screen (a11y tree)  | `describe` tool for normal app screens and in-app modals; use `screenshot` only when permission/system overlays are not exposed reliably |\n| Read JS console logs         | `debugger-log-registry` tool                                                                                                             |\n| Reload JS bundle             | `debugger-reload-metro` tool                                                                                                             |\n| Check Metro status           | `debugger-status` tool                                                                                                                   |\n| Inspect React component tree | `debugger-component-tree` tool                                                                                                           |\n| Run JS in app                | `debugger-evaluate` tool                                                                                                                 |\n| iOS native logs              | `npx react-native log-ios`                                                                                                               |\n| Android native logs          | `npx react-native log-android` or `adb -s <serial> logcat`                                                                               |\n| Clean + reinstall (nuclear)  | See §3.1 step 3                                                                                                                          |\n\n---\n\n## Related Skills\n\n| Skill                          | When to use                                                                     |\n| ------------------------------ | ------------------------------------------------------------------------------- |\n| `argent-ios-simulator-setup`   | Initial simulator boot and connection setup                                     |\n| `argent-device-interact`       | Tapping, swiping, typing, hardware buttons, gestures on the simulator/emulator  |\n| `argent-metro-debugger`        | Full Metro CDP debugging: component inspection, console logs, JS evaluation     |\n| `argent-react-native-profiler` | Profiling performance, finding re-render issues, CPU hotspots                   |\n| `argent-test-ui-flow`          | Interactive UI testing with automatic screenshot verification after each action |\n\nAsk the user before running tests: confirm which test suite (unit, E2E, or both), whether to use existing CI commands, and whether they want you to run existing tests, write new ones, or explore test cases yourself.\n",".agents/skills/argent-react-native-optimization/SKILL.md":"---\nname: argent-react-native-optimization\ndescription: Optimizes a React Native app by profiling first to find real bottlenecks, then sweeping for mechanical issues. Entry-point for all performance work. Use when the app feels slow, user asks to optimize, fix re-renders, reduce jank, or improve startup. Delegates to argent-react-native-profiler for measurement.\n---\n\n## Rules\n\n- Do not apply shotgun optimizations. Measure first, define what \"good enough\" looks like (target metric + threshold), fix the top offender, re-measure honestly.\n- **Quick scan** — `react-profiler-renders` for a live render count table. Identifies hot components instantly.\n- **Deep measure** — load `argent-react-native-profiler` skill. `react-profiler-start` → interact → `react-profiler-stop` → `react-profiler-analyze`.\n- **Inspect** — `react-profiler-component-source` per finding. `react-profiler-fiber-tree` to trace component ancestry and render cost.\n- **Verify correctness** - before fixing, recollect information from steps above and make a logical conclusion whether the approach is worth undertaking.\n- **Fix** — apply one fix. Validate with `debugger-evaluate` before committing.\n- **Re-measure** — report whether the target metric improved, regressed, or stayed flat. Check for regressions in other areas. If no net benefit or unacceptable tradeoffs, revert.\n- **Profile for discovery, not only verification.** Use the profiler to find issues static analysis missed, not only to confirm fixes.\n- **One fix per cycle for architectural changes.** Mechanical batch fixes (inline styles, index keys) can be grouped — re-profile once after the batch. When the measurement involves simulator interaction, record it as a flow (`argent-create-flow` skill) before the first run so all subsequent cycles replay identical steps.\n- **React Compiler**: if `react-profiler-analyze` reports `reactCompilerEnabled: true`, do NOT propose `useCallback`/`useMemo`/`React.memo` unless you confirmed compiler bail-out via `react-profiler-fiber-tree` (absent `useMemoCache`).\n- **Sub-agents**: Phases 1–2 dispatch sub-agents — one per file for lint results, one per checklist item for semantic. Sub-agents CANNOT touch the simulator - all profiling and E2E verification must happen in the main agent.\n\n## Pipeline\n\n**Lint and semantic sweeps catch deterministic issues cheaply. Profiling finds runtime bottlenecks that static analysis misses. Do both.**\n\nCopy this checklist into your TODO list:\n\n```\nOptimization Progress:\n- [ ] Phase 1: Lint sweep (deterministic — catch mechanical issues without a running app)\n- [ ] Phase 2: Semantic sweep (judgment — memoization, lists, animations, etc.)\n- [ ] Phase 3: Baseline profile (find real bottlenecks, fix top offenders)\n- [ ] Phase 4: Verify no regressions (crashes, errors, red screens)\n```\n\n### Phase 1: Lint sweep\n\nRun ESLint once at the project root with a comprehensive RN performance ruleset. Dispatch sub-agents to fix results — one per file.\nSee [references/lint-rules.md](references/lint-rules.md) for ruleset and procedure.\n\n### Phase 2: Semantic sweep\n\nReview each area requiring judgment — memoization, list rendering, animations, async patterns, effect cleanup, state hygiene, context architecture. Dispatch one sub-agent per checklist item.\nSee [references/semantic-checklist.md](references/semantic-checklist.md) for full checklist.\n\n### Phase 3: Visual profiling\n\n1. Load `argent-react-native-profiler` skill, start dual profiling\n2. Exercise key user flows (navigate screens the user specified, or all major flows)\n3. Analyze with `react-profiler-analyze` + `native-profiler-analyze` + `profiler-combined-report`\n4. Cross-reference profiling results with Phase 1–2 findings\n5. Fix highest-impact issues. Re-profile after architectural changes; batch mechanical fixes. If a recorded flow breaks after a fix (e.g., UI layout changed), follow `argent-create-flow` skill to repair the flow rather than silently discarding it.\n\n### Phase 4: Verify no regressions\n\nNavigate every screen and UI flow within scope, confirm each renders without errors. If no scope was specified, verify the entire app — cover all reachable screens via `argent-device-interact`. Use `debugger-log-registry` to check for runtime errors and take screenshots to check for red/yellow error screens. Check for regressions introduced by fixes (e.g., fewer re-renders but higher CPU, or new jank in a different screen). Main agent only.\n\n## App-wide optimization\n\n1. **Phase 1**: run lint centrally (one command), dispatch sub-agents to fix per-file in parallel\n2. **Phase 2**: one sub-agent per checklist item for semantic sweep\n3. **Phase 3**: main agent profiles top offending screens; fixes architectural issues top-down\n4. **Phase 4**: main agent navigates all screens to verify nothing crashes\n\nAfter the entire run, run lint again to verify no new issues were introduced with your changes.\nThis also helps ensure you haven't missed any issues which could've been fixed.\n",".agents/skills/argent-react-native-profiler/SKILL.md":"---\nname: argent-react-native-profiler\ndescription: Profile a React Native Hermes app to measure re-render and CPU performance using argent profiler tools. Use when optimizing for performance, measuring before/after a fix, spotting slow components, diagnosing re-renders, checking CPU hotspots, or producing a ranked issue report.\n---\n\nThis skill is complementary to `argent-react-native-optimization`, not a replacement for it.\n\n## 2. Tool Overview\n\n### React Profiler (Hermes / React commits)\n\n| Tool                              | Purpose                                                                                                                                                                                                                                                           |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `react-profiler-start`            | Start CPU sampling + inject React commit-capture hook. Optional: `sample_interval_us` (default 100).                                                                                                                                                              |\n| `react-profiler-stop`             | Stop recording; stores cpuProfile + commitTree in session.                                                                                                                                                                                                        |\n| `react-profiler-status`           | **Call if you were interrupted in the middle of the flow, never in another scenario** (debugger drop, Metro reload, pause, subagent handoff, any doubt). Returns `session_status: \"active\" \\| \"taken_over\" \\| \"stopped\" \\| \"no_react_runtime\"`. Side-effect free. |\n| `react-profiler-analyze`          | Run pipeline -> report with CPU-enriched hot commits, sorted by `totalRenderMs` DESC. Saves raw data to disk.                                                                                                                                                     |\n| `react-profiler-component-source` | AST lookup: file, line, memoization status, 50 lines of source for a component.                                                                                                                                                                                   |\n| `react-profiler-renders`          | Live fiber walk: render counts + durations per component (no profiling session required).                                                                                                                                                                         |\n| `react-profiler-fiber-tree`       | Live fiber walk: full component hierarchy as JSON.                                                                                                                                                                                                                |\n\n### Drill-Down Query Tools (call after analyze)\n\n| Tool                       | Purpose                                                                                      |\n| -------------------------- | -------------------------------------------------------------------------------------------- |\n| `profiler-cpu-query`       | Targeted CPU investigation: top functions, time-windowed CPU, call trees, per-component CPU. |\n| `profiler-commit-query`    | Targeted commit investigation: by component, time range, commit index, or cascade tree.      |\n| `profiler-stack-query`     | iOS Instruments drill-down: hang stacks, function callers, thread breakdown, leak details.   |\n| `profiler-combined-report` | Cross-correlated report when both React Profiler and native profiler ran in parallel.        |\n| `profiler-load`            | List and reload previous profiling sessions from disk for re-investigation with query tools. |\n\nFor native profiling (CPU hotspots, UI hangs, memory leaks), see the `argent-native-profiler` skill.\n\n---\n\n## 3. Agent Behavior Guidelines\n\nFollow these rules throughout the profiling workflow:\n\n- Start `react-profiler-start` and `native-profiler-start` in parallel (two tool calls in one message). Both need `device_id`; use the same UDID for both so their data can be correlated later. This gives best coverage.\n- If the user only wants native profiling, use the `argent-native-profiler` skill workflow. Only skip `native-profiler-start` if the user has **already explicitly said** they don't want native profiling in this session\n\n### After analysis: ask about next steps\n\nAfter presenting the analysis report, always ask the user what they want to do next. Present these options:\n\n1. **Investigate further** — drill down into specific findings using query tools (CPU call trees, commit cascades, hang stacks, etc.) to identify root causes with confidence before making changes.\n2. **Implement fixes** — apply changes based on the current findings, then re-profile to measure whether the metric changed (improved, regressed, or stayed flat).\n3. **Done for now** — accept the report as-is.\n\nDo NOT silently move on after the report. The report is the starting point, not the end — query tools exist specifically to let you dig deeper into anything the report flags.\n\n### During investigation: use query tools proactively\n\nWhen drilling down, chain query tool calls based on what you find:\n\n- A hot commit -> `profiler-commit-query` mode=`by_index` to see all components -> `profiler-cpu-query` mode=`component_cpu` for the slowest one -> `profiler-cpu-query` mode=`call_tree` for the hot function -> read the source file -> propose a fix.\n- A memory leak -> `profiler-stack-query` mode=`leak_stacks` to identify the responsible module -> read the native source if actionable.\n- A native hang -> `profiler-stack-query` mode=`hang_stacks` to get the native call chain -> correlate with React commit timing.\n\n### After fixes: always re-profile\n\nWhen you apply a fix, always re-profile the same scenario afterward. Compare before/after metrics (commit durations, CPU time, render counts) and report honestly: did the target metric improve, stay flat, or regress? Did any _other_ metric get worse? If you need to reference the original data, use `profiler-load` to reload the pre-fix session. If the fix showed no improvement or introduced a regression, say so explicitly and reconsider the approach.\n\n### Use flows for reproducible profiling\n\nWhen profiling requires a specific interaction sequence (scroll a list, navigate screens, trigger an animation), **record the interaction as a flow** using the `argent-create-flow` skill before the first profiling run. Then replay the same flow for every subsequent run. This eliminates interaction variance as a confounder and makes before/after comparisons meaningful. Especially important when:\n\n- You are about to re-profile after applying a fix (Step 8).\n- The user asks you to compare multiple profiling sessions.\n- The interaction path is more than 2-3 steps long.\n\n---\n\n## 4. Standard Profiling Workflow\n\n**Complete all steps in order — do not break mid-flow.**\n\n### Step 1: Start profiling\n\nMind the react-native and ios-native profiler selection mentioned above when starting the session and start the tools. **Save `startedAtEpochMs` from the response** — you will need it for annotation offsets. Every subsequent profiler/query call in this session must use the same `device_id`. Before beginning, define lightweight success criteria with the user: which metric matters most (e.g., `totalRenderMs`, specific commit duration, render count for a component) and what threshold would be meaningful. This anchors later evaluation. On success:\n\n- if user asked you to perform the profiling, determine how to profile yourself using tools described in `argent-device-interact` skill.\n- if the user stated they wish to perform the interaction themselves — suggest what interaction to perform (e.g. \"scroll the list\", \"switch tabs\") and wait for their reply.\n  If you received information about **existing profiling session** being owned by another agent:\n- if session is marked as \"stale\", you may overtake it without prompting the user for allowance\n- if session is NOT \"stale\" - before taking action and terminating the other session, **stop and ask user what you should do**, explaining the situation.\n\n#### Annotate every interaction\n\nAfter each `gesture-tap` or `gesture-swipe` call, record an annotation using the returned `timestampMs`. Compute `offsetMs = timestampMs - startedAtEpochMs`. Do this for _every_ interaction — including back-navigation swipes, not just the primary action. Pass all collected annotations to `react-profiler-analyze` in Step 3.\n\n### Step 2: Stop and collect\n\nCall `react-profiler-stop` **and** `native-profiler-stop` in parallel. Only skip `native-profiler-stop` if you did not start it in Step 1. Note `duration_ms` and `fiber_renders_captured`.\nIf `fiber_renders_captured: 0`, warn the user — React commit data may be missing.\n\n### Step 3: Analyze\n\nCall `react-profiler-analyze` with `port`, `device_id`, `project_root`, `platform`, and `rn_version`. The report includes metadata such as `reactCompilerEnabled`, `strictModeEnabled`, and `buildMode` — check these in the returned markdown report.\n\nIf you performed interactions using `gesture-tap`/`gesture-swipe`, pass `annotations` to mark when each action occurred. Each annotation's `offsetMs` must be computed as `tapTimestampMs - startedAtEpochMs`, where `tapTimestampMs` is the `timestampMs` returned by the gesture-tap/gesture-swipe tool and `startedAtEpochMs` was returned by `react-profiler-start`. Do **not** use `Date.now()` for this calculation — only server-side timestamps from the tool return values.\n\nIf dual profiling, also call `native-profiler-analyze`, then **you must** call `profiler-combined-report` for the cross-correlated view — do not skip this step when both profilers ran; the combined report surfaces correlations that individual reports miss.\n\nThe analyze report includes **CPU hotspots per commit** — showing exactly which JS functions ran during each slow React commit. Raw data is saved to disk automatically for later reload.\n\n### Step 4: Assess results\n\nAnalyze whether the results give you a proper image of what is wrong with the application - **do not assume improvement always exists**, verify results logically with reference to how react-native works. Make sure to give honest feedback and be ready to change the approach if needed.\n\n### Step 5: Present findings and ask about next steps\n\nPresent a concise summary of the key findings - present whether possibilities for improvement exist and how performing further actions could affect performance. Then follow the \"After analysis\" guideline — ask whether to investigate further, implement fixes (if available), or stop.\n\n### Step 6: Drill-down investigation (iterative)\n\nBased on findings from the report, use query tools to investigate deeper:\n\n- **Slow component?** -> `profiler-cpu-query` mode=`component_cpu` component_name=`AppNavigator` — shows what JS functions ran during that component's commits.\n- **Want to see the call tree?** -> `profiler-cpu-query` mode=`call_tree` function_name=`expensiveFunction` — shows callers and callees.\n- **What happened during a time window?** -> `profiler-commit-query` mode=`by_time_range` — lists all commits in a range.\n- **Full commit detail?** -> `profiler-commit-query` mode=`by_index` commit_index=38 — all components, props changes, parent cascade.\n- **Who triggered whom?** -> `profiler-commit-query` mode=`cascade_tree` — visual parent-child cascade.\n- **iOS hang details?** -> `profiler-stack-query` mode=`hang_stacks` — native call stacks during a hang.\n\nRepeat as needed until you identify the root cause function and file, referring to step 4 for honest evaluation. After each round of investigation, ask the user if they want to continue digging or move to fixing.\n\n### Step 7: Reload a previous session\n\nIf you profiled multiple scenarios and need to revisit earlier data:\n\n1. Call `profiler-load` mode=`list` to see all saved sessions with timestamps (the list now also shows Runtime / Device / Metro bundle columns to help identify the right session).\n2. Call `profiler-load` mode=`load_react` session_id=`<timestamp>` device_id=`<UDID>` to reload React data. `device_id` scopes the reload into the `port:device_id` cache slot.\n3. Call `profiler-load` mode=`load_native` session_id=`<timestamp>` device_id=`<UDID>` to reload native profiler data.\n4. Query tools now operate on the reloaded session data — **pass the same `device_id` you loaded with**, otherwise they will miss the cache.\n\nThis is useful for before/after comparisons: profile, fix, re-profile, then reload the original session to compare metrics side by side.\n\n### Step 8: Apply fix and re-profile\n\nIf fix is present, read the source code of the identified bottleneck using `react-profiler-component-source` or the Read tool. Apply the fix, then re-profile (Step 1 -> user interaction -> Step 2 -> Step 3 -> Step 4). Report whether the target metric improved, stayed flat, or regressed. Also check whether the fix introduced regressions in other metrics (e.g., render count dropped but CPU time increased, or a different component now re-renders more). If the fix showed no net benefit or unacceptable tradeoffs, revert and reconsider.\n\n**Tip:** If the interaction sequence was recorded as a flow (see \"Use flows for reproducible profiling\" above), replay it with `flow-execute` instead of manually repeating the steps. This guarantees identical interaction conditions for the comparison. If the flow fails during replay (e.g., a UI fix changed the layout), follow `argent-create-flow` skill §10 (Flow Self-Improvement) to diagnose and repair the flow before retrying the profiling cycle.\n\nIf the user stated that they do not wish for changes, present the profiling report and skip the fix but suggest it to the user.\n\n**React Compiler rule:** If the analyze report indicates React Compiler is enabled, do NOT propose `useCallback`/`useMemo`/`React.memo` unless you confirmed compiler bail-out (check `react-profiler-fiber-tree` for absent `useMemoCache` on that component).\n\n---\n\n## 5. Important Caveats\n\n- **Dev mode inflation**: `buildMode: \"dev\"` renders are ~3x slower than production. Prioritize high `normalizedRenderCount` — it scales to prod.\n- **Re-run after fixes**: Always re-profile after changes. Report honestly whether the metric improved, regressed, or stayed flat — do not assume improvement.\n- **`excluded` is informational**: Components in `animatedSubtrees` and `recyclerChildren` re-render by design.\n- **Strict Mode**: Double-invokes renders. The pipeline halves `normalizedRenderCount` automatically when detected.\n- **Debugger connection**: If interrupted, started profiling also closes. Before attempting recovery, call `react-profiler-status` — it tells you whether the session is `active`, `taken_over`, `stopped`, or `no_react_runtime`, so you can decide whether to stop, restart, or reconnect first.\n- **Confounders to watch for**:\n  - Live API data may differ between runs (different payload sizes, content counts), which shifts render counts and durations independently of your fix. Note when data-dependent components show variance.\n  - Profiler overhead inflates CPU measurements. If iOS Instruments shows `JSLexer`, `JSONEmitter`, or Hermes internals dominating the JS thread, that reflects profiler instrumentation cost — not app work. Discount those entries.\n  - Runs are not perfectly reproducible. Small variations (under ~10-15%) in commit duration may be noise; only treat consistent, directional changes as signal.\n\nFor standalone diagnostic tools (live render stats, fiber tree, CPU summary), see `references/diagnostic-tools.md`.\n",".agents/skills/argent-screenshot-diff/SKILL.md":"---\nname: argent-screenshot-diff\ndescription: Capture stable before/after screenshots on an iOS simulator or Android emulator and pixel-diff them into evidence. Use when asked for a visual regression check, a screenshot diff, a before/after visual comparison, or when a visible mobile UI change needs pixel proof — including the executed screenshot-diff that a Tamagui conversion batch requires.\n---\n\n## 1. Use the first-party `screenshot-diff` tool\n\n`screenshot-diff` is a real first-party argent MCP tool, and it is the preferred path for every diff in this skill. Hand-rolling a pixel diff is the fallback (§ 5), not the default.\n\n| Parameter | Required | Notes |\n| --- | --- | --- |\n| `udid` | **yes** | iOS UUID or Android adb serial, same as every other argent tool |\n| `outputDir` | **yes** | Where the diff artifacts are written |\n| `baselinePath`, `currentPath` | mode A | Two PNGs you already saved to disk |\n| `captureBaseline`, `captureCurrent` | mode B | The tool captures live from the device instead |\n| `rotation` | no | The same rotation parameter `screenshot` takes |\n\nSupply **either** the saved-PNG pair **or** the live-capture flags — the two modes are alternatives, not additions.\n\nReturns `{ summary, diffPath, contextDiffPath }`: the comparison summary plus two written artifacts, the diff image and a context diff.\n\n**It excludes the fixed status-bar band from both the pixel and the OCR comparison.** That alone is reason to prefer it over anything hand-rolled. The clock, battery percentage and signal indicators differ between any two captures taken seconds apart, and on a full-screen mobile capture they are the single most common source of false positives. With this tool you neither crop them out nor explain them away in review.\n\n**Load the schema before your first call** — deferred tools in this environment expose only their name until you load them. ToolSearch for `screenshot-diff`, read the parameter names and return shape off the schema, and use those. The table above was transcribed from a session with the argent server connected rather than verified in the session that wrote this skill, so treat the loaded schema as the authority wherever the two disagree.\n\n**Never invent a tool signature.** If ToolSearch cannot load it, the tool is not available to your session — take the § 5 fallback and say so in your report.\n\n---\n\n## 2. Prerequisites and their limits\n\nFrom `apps/mobile/CLAUDE.md`:\n\n```bash\nbun add -g @swmansion/argent   # one-time per machine; puts `argent` on PATH\n```\n\n- **Argent does not build or install the app for you** — it drives whatever is already on the sim. Get the build you intend to compare installed and running first via `argent-react-native-app-workflow`.\n- **Argent owns the simulator.** Do not mix `xcrun simctl install/launch/terminate` with argent calls — sim state corruption is real, and a corrupted sim silently poisons a diff.\n- **Do not run `argent init`** — skills and config are already committed. `argent update` only when intentionally refreshing.\n- **Android**: run `adb -s <serial> reverse tcp:8081 tcp:8081` before the app starts, or Metro is unreachable and you will capture a red screen.\n- **At session end**: call `stop-all-simulator-servers`.\n\nGet a `udid` per `argent-ios-simulator-setup` (iOS, UUID-shaped) or `argent-android-emulator-setup` (Android, adb serial). Tool names are identical on both platforms.\n\n---\n\n## 3. The headless constraint — state it, do not paper over it\n\n**A headless or CI agent session cannot drive a local simulator or emulator.** There is no sim to attach to, no Xcode/`xctrace`, no emulator, and no display. This was the blocking finding on INFRA-3096 and it has not changed.\n\nEverything below is the **argent-driven local-device path**, and that path needs a **locally attached simulator, emulator, or device** in a session running on a developer machine: argent's MCP server drives a local sim/emulator or an attached device, and a headless session has no argent binary, no argent MCP server, and no device.\n\nIf you are headless, do **not** stage a diff and imply it ran. `tamagui-conversion` is explicit: *a staged-but-unrun diff is not evidence.* Instead do one of:\n\n1. **Hand off.** Stage the comparison surface (§ 4), commit it, and write the exact runnable steps — udid selection, story names, `scale: 1.0`, the `screenshot-diff` call and its `outputDir`, and the state matrix — into the Linear issue and PR body so a human-run session executes it verbatim.\n2. **Record the obligation.** Comment on the issue that the executed diff is outstanding, with the commit the diff must be run against. An unmet obligation on the record beats a fabricated verdict.\n3. **Substitute, with sign-off.** If no legacy twin exists there is nothing to diff at all — substitute self-contained behavioral tests plus **explicit requester sign-off** (the `tamagui-conversion` rule).\n\n### Remote devices — the blockers above are narrower than \"you need a developer machine\"\n\nThose blockers are about driving **argent**. They are not a claim that on-device visual evidence is impossible without a local simulator. **AWS Device Farm runs real remote devices and needs no local sim and no macOS host**, so it is a plausible route to the underlying evidence goal — before/after captures from a real device, taken to a pixel diff. What that route carries:\n\n- **Whether argent can target a Device Farm device is untested.** Do not claim it can and do not claim it cannot; if you need argent specifically, treat it as an open question to verify.\n- **The build must embed a dev-mode bundle**, because Storybook is `__DEV__`-only (§ 8) — a bundled production build cannot show the staged stories at all.\n- **Android-only absent a macOS host**, since an iOS build needs one.\n\n**The INFRA-3096 \"declined\" note is narrower than it reads.** A Device Farm pass was declined there — but on a batch with **zero converted files**, where the objection was to diffing a batch in which nothing had changed (\"staged evidence with extra steps\"), not to Device Farm as a capture mechanism. That is a reading of INFRA-3096 comment `fe4db9f3`; check it yourself before citing it either way. Whichever capture route you use, \"executed, never staged\" is unchanged — the diff must actually run, against changed code.\n\n---\n\n## 4. Staging the comparison — the canonical pattern\n\nThe repo practice this skill formalizes: put both sides in **one Storybook file** rendering the **identical state matrix at identical screen positions**, so a diff of the two stories measures nothing but the component.\n\nPattern files:\n\n- `apps/mobile/src/components/mycelium/SegmentedControlMigration.stories.tsx` (#37202) — the template. `Legacy` and `Rebuilt` stories render the exact same matrix at the exact same positions; `SideBySide` stacks both per state for eyeballing.\n- `apps/mobile/src/components/mycelium/ShimmerMigration.stories.tsx` — carries a hard-won caveat.\n\nRules that fall out of those two files:\n\n| Case | Stage it as | Why |\n| --- | --- | --- |\n| Static states | Standalone `Legacy` + `Rebuilt` stories, identical positions | Diffable pair, nothing else varies |\n| **Animated** states | `SideBySide`, both mounts **simultaneous** | Separate mounts start their animation clocks at different times — an out-of-phase row looks frozen or broken when both implementations are correct. Phase-lock or do not diff. |\n| No legacy twin | Not diffable at all | Behavioral tests + requester sign-off instead |\n\nIdentical positions is not a nicety. Any offset makes the whole panel differ and the diff is worthless.\n\n---\n\n## 5. Capture and diff — the procedure\n\nGet a `udid` from `list-devices`, stage both sides per § 4, and settle per § 6. Then:\n\n1. Navigate to the `Legacy` story. Settle, then `screenshot` with **`scale: 1.0`**, persisted to disk.\n2. Navigate to `Rebuilt` — same route, same scroll offset, no device rotation between captures.\n3. Settle, then `screenshot` with `scale: 1.0`, persisted to disk.\n4. Call `screenshot-diff` with `udid`, an `outputDir`, and the two files as `baselinePath` / `currentPath`.\n5. Read `summary`, then open `diffPath` and `contextDiffPath` and actually look at them (§ 7).\n\n### `scale: 1.0` is mandatory for anything you feed to a diff\n\n`screenshot` **downscales to 30% of native resolution by default** to save context (`argent-device-interact` § 7). `scale` accepts `0.01`–`1.0`.\n\n> A 30% capture has thrown away the pixels you are measuring: it invents resampling differences that read as regressions, and it hides real one-pixel border and anti-aliasing shifts. A diff run at the default scale is not evidence.\n\n```json\n{ \"udid\": \"<UDID>\", \"scale\": 1.0 }\n```\n\nIf `screenshot` returns an inline image rather than a file path, you need the bytes on disk before `baselinePath` / `currentPath` will accept them. **Load the tool's schema with ToolSearch and read its actual return shape** — do not assume either form.\n\n### The live-capture mode\n\n`captureBaseline` / `captureCurrent` (§ 1) let `screenshot-diff` take the shots itself instead of you saving PNGs. Read the schema for how the two are sequenced before relying on it: the staged-story pattern in § 4 requires **navigating between the two captures**, and a before/after across a code change requires a rebuild between them. Prefer the saved-PNG pair whenever anything has to happen in between.\n\n### Fallback — only when `screenshot-diff` will not load\n\nFor a session with no argent MCP server connected, or an argent version predating the tool. Capture the pair exactly as above, then diff the PNGs yourself: `labs/workbench` already carries the engine as devDeps (`pixelmatch` 7.2.0, `pngjs` 7.0.0), and `labs/workbench/scripts/visual/compare.ts` is a working reference for the pixelmatch call, padding, and flag arithmetic — reuse it rather than reaching for a new dependency. You then own the two jobs the first-party tool does for you: masking the status-bar band, and picking thresholds (§ 7).\n\n---\n\n## 6. Determinism — eliminate false positives before you diff\n\nA flaky diff is worse than no diff: it trains reviewers to ignore the artifact. Fix all of these before capturing.\n\n- **Kill animation.** Disable animations in the app, or use a `SideBySide` phase-locked mount for anything that moves. Never diff a mid-transition frame.\n- **Pin the device.** Same simulator model **and** same OS version for before and after. A different sim is a different renderer.\n- **Pin the position.** Identical scroll offset, orientation, and safe-area insets. Do not rotate between captures.\n- **Settle before capture.** Wait for the screen to be static — no spinner, no skeleton, no in-flight image load. If the returned screenshot shows a transitional frame, retake with `screenshot` (the `argent-test-ui-flow` recovery pattern).\n- **Same content.** No live data, no timestamps, no randomized ordering, no avatar that loads from the network.\n- **Same theme.** Diff light against light and dark against dark, as separate pairs.\n\n---\n\n## 7. Reading the result\n\n### With `screenshot-diff` (the primary path)\n\n`summary` is the judgement surface; `diffPath` and `contextDiffPath` are the artifacts.\n\n- **Read `summary`, then corroborate it against the images.** A summary you did not check against the diff image is a claim, not a verdict.\n- **The contract in § 1 exposes no threshold, sensitivity, or flagging parameter** — so there is nothing to tune, and this skill will not recommend a number for it. Do not invent one. If the schema you load exposes a knob § 1 does not list, use it and record the value you passed.\n- **Calibrate with a no-change control pair.** Capture the same story twice with nothing changed and diff it. Whatever the tool reports on that pair is the floor for this device, this OS version, this screen — a real pair must clear it visibly. With no tunable threshold, this control is the calibration.\n- **Status-bar drift is already excluded** (§ 1), so anything reported is real content, not a clock tick.\n\n**How the harness numbers below translate: they mostly do not.** Stated plainly so nobody tries to reconcile them:\n\n| Harness concept | Counterpart in `screenshot-diff` |\n| --- | --- |\n| `--pixel-threshold` (per-pixel color sensitivity) | **None exposed.** The tool decides its own sensitivity |\n| `--flag-ratio` (`diffPixels / totalPixels`) | **None exposed.** The tool does not take a flagging rule from you |\n| `--min-diff-pixels` (absolute floor) | **None exposed** |\n| Manual status-bar masking | **Built in** — excluded from pixel *and* OCR comparison |\n| Diff PNG output | `diffPath`, plus `contextDiffPath` |\n| Flag verdict computed by you | `summary`, computed by the tool |\n\nThree of the harness's four knobs have no counterpart. That is not a gap to paper over with an invented mapping — it means the judgement moves from *choosing numbers* to *reading `summary` against a control pair and looking at the diff image*.\n\n### Fallback thresholds — hand-rolled `pixelmatch` only\n\nEverything below applies to the § 5 fallback, not to `screenshot-diff`.\n\n**Established precedent** — `labs/workbench/scripts/visual/README.md`, the web harness. A pair is flagged when **both** conditions hold:\n\n```\ndiffPixels / totalPixels > 0.005     # relative ratio (--flag-ratio)\nAND diffPixels > 250                 # absolute floor (--min-diff-pixels)\n```\n\nwith a per-pixel color sensitivity of `0.1` (`--pixel-threshold`, passed to pixelmatch).\n\n**Why two conditions, so you can adapt rather than cargo-cult:** the ratio alone over-fires on small panels. On a ~6–10k-pixel panel, sub-perceptual anti-aliasing noise (the harness's documented case: translucent-token compositing rendering text a few 8-bit steps apart) is ~120–180 px — under 250 absolute, but *over* 0.005 relative. The absolute floor absorbs exactly that. Meanwhile a genuinely broken color repaints most of a panel at high delta and trips both conditions comfortably. The two-condition rule buys you a wide, empty band between noise and real breakage.\n\n**Starting recommendations for mobile** (mine, not established — tune and record what you used):\n\n- Keep `pixel-threshold` at `0.1`. It is the sensitivity that was validated against real token-compositing noise, and it is platform-independent.\n- Keep the `0.005` ratio.\n- **Raise the absolute floor** above 250. Mobile captures at `scale: 1.0` are far larger than a workbench panel, and native text rasterization is noisier than Chromium's — 250 px will fire on nothing. Scale the floor with panel area: the web value is ~2.5–4% of a 6–10k-px panel, so start there and calibrate against a **no-change control pair** (capture the same story twice, unchanged; that number is your noise floor, and your threshold goes above it).\n- Any pair you had to raise a threshold to pass is **not** green — investigate it.\n\nRecord what you ran alongside the verdict — `screenshot-diff` and which mode, or the fallback and its thresholds. A verdict without its mechanism is unreproducible.\n\n---\n\n## 8. The Storybook tension — real, and reconcilable\n\nThis diff practice needs **Storybook**. But `apps/mobile/CLAUDE.md` mandates `NODE_ENV=production` for agent/CLI Metro precisely *because* dev-mode bundles Storybook and the app boots into Storybook UI, \"breaking agent-driven interaction flows\":\n\n```bash\nbun nx run mobile:start:production   # the normal agent default — Storybook OFF\n```\n\nBoth are correct; they are different jobs. Reconcile by **choosing the mode for the task, deliberately and out loud**:\n\n| Task | Metro mode | Storybook |\n| --- | --- | --- |\n| Driving real app screens, flows, QA, profiling | `mobile:start:production` | off (required) |\n| **Screenshot-diffing a staged story matrix** | dev Metro (`NODE_ENV` unset) | on (required) |\n\nSo: a screenshot-diff session runs dev Metro *on purpose*, and booting into Storybook UI is the desired outcome, not the failure the CLAUDE.md rule warns about. Consequences to hold onto:\n\n- **Do not do both in one Metro session.** Finish the diff, then restart Metro in production mode before any app-flow work — and say in your report which mode each artifact came from.\n- `NODE_ENV` applies at **JS-bundle time**. For a device build with no Metro dev server the flag goes on the build command, so a bundled production build cannot show Storybook at all — what you need is a **dev-mode bundle**, and how you get one depends on the route (§ 3): dev Metro against a local simulator, or a dev-mode-bundled build on a remote device.\n- A reviewer seeing Storybook chrome in your evidence should not read it as a broken setup. Label the captures as Storybook stories.\n\n---\n\n## 9. Recording the evidence\n\nAn executed diff is only evidence once it is **on the record**. Post to both the Linear issue and the PR:\n\n1. **Before/after images** per state — legacy, rebuilt, and the diff PNG. Never commit the images into the repo (the web harness's rule: report JSON is committed, images are gitignored); attach them to the issue/PR instead.\n2. **Video for motion.** Static screenshots cannot prove an animation. Channel convention (Thomas's rule, carried in `tamagui-conversion`) is before/after screenshots **plus video for anything animated**.\n3. **Provenance**: device model, OS version, platform, Metro mode, and the **commit SHA** the diff ran against. A diff against uncommitted work is not reproducible — the web harness refuses a dirty tree for exactly this reason.\n4. **The diff mechanism** (§ 7) — `screenshot-diff` and its mode, or the fallback with the thresholds you used and any deviation from the defaults and why.\n5. **A verdict per state**, not one aggregate. `pass` / `flagged` / `known drift (reason)`. Enumerate the full matrix so a reviewer can see nothing was quietly skipped.\n6. **Captured from where.** Visual evidence must come from a deployed preview or the workbench — never local dev — for web. For mobile the equivalent is the installed build at a named commit, stated explicitly.\n\nSay plainly whether the diff **ran**. \"Staged\" and \"executed\" are different claims and reviewers rely on the difference.\n\n---\n\n## Related Skills\n\n| Skill | When to use |\n| --- | --- |\n| `argent-device-interact` | The `screenshot` tool itself, `scale`, rotation, gestures, troubleshooting (§ 7 is the screenshot reference) |\n| `argent-test-ui-flow` | Navigating to the staged stories; the settle/retake recovery pattern before capture |\n| `argent-ios-simulator-setup` | Booting an iOS simulator, getting a UDID |\n| `argent-android-emulator-setup` | Booting an Android emulator, getting an adb serial, `adb reverse` |\n| `argent-create-flow` | Record the navigate-and-capture sequence as a flow so before/after captures are byte-for-byte reproducible via `flow-execute` — this removes interaction variance, the largest source of diff noise |\n| `argent-react-native-app-workflow` | Getting the build installed and Metro running before any capture |\n| `tamagui-conversion` | The migration contract that requires an executed diff as the mobile proof artifact |\n",".agents/skills/argent-native-profiler/SKILL.md":"---\nname: argent-native-profiler\ndescription: Native profiling for CPU hotspots, UI hangs, and memory leaks. Currently iOS-only (xctrace-backed); Android support (Perfetto/simpleperf) is on the roadmap. Use when diagnosing native-level performance issues.\n---\n\n## 1. Tools\n\n- `native-profiler-start` — start profiling on a booted device. iOS: xctrace recording for CPU, hangs, and leaks.\n- `native-profiler-stop` — stop the profiler and export trace data to timestamped XML files.\n- `native-profiler-analyze` — parse exported trace data and return a structured bottleneck payload.\n- `profiler-stack-query` — drill into parsed data: hang stacks, function callers, thread breakdown, leak details.\n- `profiler-load` — list and reload previous trace sessions from disk for re-investigation.\n\n---\n\n## 2. Platform Support\n\n- **iOS**: Fully supported. Backend: Xcode Instruments via `xctrace` on a booted simulator or connected device. Requires Xcode command-line tools on PATH.\n- **Android**: Not yet implemented. An Android backend (Perfetto or simpleperf via `adb`) is planned; today `native-profiler-start` rejects Android serials with a clear \"iOS-only for now\" error.\n\n---\n\n## 3. Investigation Patterns\n\nAfter `native-profiler-analyze` surfaces findings, use `profiler-stack-query` to drill into root causes:\n\n- **Hang detected** → `profiler-stack-query` mode=`hang_stacks` for full native call chains → mode=`function_callers` for the suspected function → read native source.\n- **CPU hotspot** → `profiler-stack-query` mode=`thread_breakdown` for per-thread distribution → mode=`function_callers` for the dominant function.\n- **Memory leak** → `profiler-stack-query` mode=`leak_stacks` filtered by `object_type` for responsible frames and libraries.\n\nAfter presenting findings, ask the user whether to investigate further, implement fixes, or stop. After applying fixes, always re-profile the same scenario and compare with `profiler-load`. Report honestly whether the target metric improved, regressed, or stayed flat. If the fix showed no net benefit or introduced regressions elsewhere, say so and reconsider.\n\n**Tip:** For reproducible before/after comparisons, record the interaction sequence as a flow using the `argent-create-flow` skill before the first profiling run. Replay with `flow-execute` on subsequent runs to eliminate interaction variance.\n\n> **Note:** The `argent-react-native-profiler` instructs to start native profiling automatically alongside React profiling. This skill's workflow and investigation patterns apply in both cases.\n\n---\n\n## 4. Workflow\n\n**Complete all steps in order — do not break mid-flow.**\n\n### Step 0: Ensure the target app is running\n\nThe `native-profiler-start` tool **auto-detects** the running app on the device.\nYou do not need to derive `app_process` manually — just make sure the app is launched.\n\n1. If the app is already running on the device, skip to Step 1 (do not pass `app_process`).\n2. If the app is not running, use `launch-app` with the correct bundle ID first.\n3. Only pass `app_process` explicitly if the tool reports multiple running user apps and you need to disambiguate.\n\n> **Note**: If multiple build flavors are installed (dev, staging, prod), the tool will detect whichever one is currently running. If both are running, it will ask you to specify.\n\n### Step 1: Start recording\n\nCall `native-profiler-start` with `device_id` (iOS UDID; Android not yet supported). The tool auto-detects the running app and saves the trace to `/tmp/argent-profiler-cwd/` with a timestamped filename.\nLet the user interact with the app or drive interaction via simulator tools (see `argent-device-interact` skill).\n\n### Step 2: Stop and export\n\nCall `native-profiler-stop` with `device_id`. On iOS this sends SIGINT to xctrace, waits for trace packaging, and exports CPU, hangs, and leaks data to XML. Check `exportDiagnostics` in the response for any export warnings.\n\n### Step 3: Analyze\n\nCall `native-profiler-analyze` with `device_id`. Returns a markdown report with bottlenecks categorized as CPU hotspots, UI hangs, or memory leaks, sorted by severity.\n\n### Step 4: Present findings and ask about next steps\n\nPresent a concise summary of the key findings. Then follow the \"After analysis\" guideline — ask whether to investigate further with query tools, implement fixes, or stop.\n\n### Step 5: Drill-down investigation\n\nUse `profiler-stack-query` to investigate specific findings. See §3 Investigation Patterns for chaining guidance.\n\n### Step 6: Reload previous sessions\n\nTo revisit a previous trace:\n\n1. Call `profiler-load` mode=`list` to see available sessions.\n2. Call `profiler-load` mode=`load_native` session_id=`<timestamp>` device_id=`<UDID>` to re-parse the XML files.\n3. Use `profiler-stack-query` to investigate the reloaded data.\n\n---\n\n## 5. Understanding Results\n\nBottlenecks are categorized by severity:\n\n- **RED**: CPU functions taking >15% of total time, all UI hangs, all memory leaks. These require immediate attention.\n- **YELLOW**: CPU functions taking 5-15% of total time. Worth investigating but may be acceptable.\n\nEach bottleneck type indicates a different class of problem:\n\n- **CPU hotspots**: Native functions consuming excessive CPU time. Look for tight loops, expensive computations, or redundant work.\n- **UI hangs**: Main thread blocked long enough to cause visible jank or unresponsiveness. Often caused by synchronous I/O, heavy layout passes, or lock contention.\n- **Memory leaks**: Objects allocated but never freed. Common causes include retain cycles, unclosed resources, or forgotten observers.\n\n---\n\n## 6. Important Caveats\n\n- **Simulator vs device**: Simulator profiling reflects host Mac performance, not real device hardware. Use device profiling for accurate CPU timings and memory behavior.\n- **xctrace availability (iOS)**: Requires Xcode command-line tools installed. Verify with `xcrun xctrace version`.\n- **Profiler overhead**: xctrace instrumentation adds CPU load. If `JSLexer`, `JSONEmitter`, or Hermes runtime internals dominate the JS thread in CPU hotspot results, those reflect profiler overhead — not app work. Discount those entries when evaluating findings.\n- **Run-to-run variance**: Small fluctuations in CPU percentages between runs are normal. Treat only consistent directional changes (across 2+ runs or >15% delta) as actionable signal.\n- **Live data variability**: If the app fetches live API data, different responses between runs change rendering workload independently of code changes. Note when data-dependent screens show variance.\n",".agents/skills/argent-test-ui-flow/SKILL.md":"---\nname: argent-test-ui-flow\ndescription: Autonomously test an app UI (iOS or Android) by running interact-screenshot-verify loops using argent MCP tools. Use when testing a UI flow, verifying login works, testing navigation, or running an end-to-end UI test scenario.\n---\n\n## Platform-agnostic\n\nThe interaction tool names are identical on iOS and Android — `gesture-tap`, `gesture-swipe`, `describe`, `screenshot`, `launch-app`, etc. — and the tool-server auto-dispatches based on the `udid` you pass (UUID-shape → iOS, adb serial → Android).\n\nGet a `udid` via:\n\n| Platform | Setup skill                     | Find devices with                                           |\n| -------- | ------------------------------- | ----------------------------------------------------------- |\n| iOS      | `argent-ios-simulator-setup`    | `list-devices` → `boot-device` with `udid` if none booted   |\n| Android  | `argent-android-emulator-setup` | `list-devices` → `boot-device` with `avdName` if none ready |\n\n## 1. Workflow\n\nAll interactions go through argent MCP tools. Ensure the simulator/emulator is ready before starting.\n\n1. **Baseline screenshot**: Call `screenshot` to see the current UI state.\n2. **Find target**: Before tapping, use a discovery tool to get element coordinates:\n   - **React Native apps**: use `debugger-component-tree` — it returns component names with (tap: x,y) coordinates. This is the preferred tool for RN apps on either platform. To use it, resolve the `argent-react-native-app-workflow` skill for setup; on Android you must also run `adb -s <serial> reverse tcp:8081 tcp:8081` so Metro is reachable from the device.\n   - **Standard app screens and in-app modals**: use `describe`. On iOS this returns the AX tree (falls back to native-devtools when AX is empty); on Android it returns the uiautomator tree in the same DescribeNode shape.\n   - **Permission prompts / system modal overlays**: try `describe` first. Fall back to `screenshot` only if the overlay is not exposed reliably.\n   - **Fallback**: use `screenshot` to estimate where the desired component is, then verify immediately after the action.\n3. **Interact**: Perform the action (`gesture-tap`, `gesture-swipe`, `keyboard`, `button`, ...) — you receive a screenshot automatically.\n4. **Verify**: Check the returned screenshot for expected results. If it shows a loading/transitional state, retake with `screenshot`.\n5. **Repeat** for each step in the flow.\n\n## 2. Template\n\n```\nGoal: Test [feature name]\n\nSteps:\n1. screenshot → see current state (baseline)\n2. [Navigate / tap / type to reach starting point] → verify auto-screenshot\n3. [Perform the action to test] → verify auto-screenshot\n4. Report: pass / fail with details\n```\n\n## 3. Examples\n\n### Login flow\n\n```\n1. screenshot → see login screen\n2. gesture-tap { x: 0.5, y: 0.4 }  → tap email field\n3. paste { text: \"user@example.com\" }\n4. gesture-tap { x: 0.5, y: 0.55 } → tap password field\n5. paste { text: \"password123\" }\n6. gesture-tap { x: 0.5, y: 0.7 }  → tap Login button\n7. screenshot → verify home screen appeared\n```\n\n### Scroll and navigation\n\n```\n1. screenshot → see list at top\n2. gesture-swipe { fromY: 0.7, toY: 0.3 } → scroll down\n3. gesture-tap item at visible position → verify auto-screenshot\n4. screenshot → verify detail view opened\n5. button { button: \"back\" }\n6. screenshot → verify returned to list\n```\n\n---\n\n## 4. Recovery Pattern\n\n- If screenshot shows loading/transition: wait 500ms, retake with `screenshot`.\n- If tap misses target: re-run discovery tool (`describe` / `debugger-component-tree`), retry once with new coordinates.\n- If a permission dialog or modal is visible: re-run `describe` first. Stay in screenshot-driven navigation only when the overlay is not exposed reliably, then switch back to `describe` / `debugger-component-tree` as soon as it is dismissed.\n- If tap fails twice at same coordinates: stop, re-discover, report if element not found.\n- If a **saved flow** fails during `flow-execute` replay (as opposed to live test steps above): follow `argent-create-flow` skill §10 for structured diagnosis and correction.\n\n## Tips\n\n- **Use `paste` for text entry on iOS** — faster and more reliable than key-by-key `keyboard`. `paste` is iOS-only; on Android use `keyboard` instead.\n- **Use `gesture-custom` for long-press** context menus (800ms hold).\n- **Report clearly**: state what you expected, what you saw, and the verdict.\n- **Coordinate estimation**: center = 0.5, 0.5; top-third ~ 0.2; bottom-third ~ 0.8.\n- **Permission modals**: try `describe` first. Use `screenshot` only as fallback, tap one visible button at a time, and verify with the returned screenshot before continuing.\n- **Record for replay**: If a tested flow is likely to be repeated, use the `argent-create-flow` skill to record it as a `.yaml` script. This lets you replay the entire sequence later with a single `flow-execute` call instead of re-running each step manually.\n\n## Related Skills\n\n| Skill                              | When to use                                             |\n| ---------------------------------- | ------------------------------------------------------- |\n| `argent-device-interact`           | Tool usage for tapping, swiping, typing (iOS + Android) |\n| `argent-ios-simulator-setup`       | Booting and connecting an iOS simulator                 |\n| `argent-android-emulator-setup`    | Booting and connecting an Android emulator              |\n| `argent-react-native-app-workflow` | Starting the app, Metro, build issues                   |\n| `argent-metro-debugger`            | Breakpoints, console logs, JS evaluation                |\n| `argent-create-flow`               | Record a test sequence as a replayable flow             |\n","AGENTS.md":"# AGENTS.md\n\nThis file provides guidance to AI agents when working with code in this repository. Always run all tests, lint, and typecheck after making changes, and before considering a task to be 'complete'.\n\n## Project Overview\n\nUniswap Universe is a monorepo containing all Uniswap front-end interfaces:\n\n- **Web** (`apps/web/`) - Decentralized exchange web interface\n- **Mobile** (`apps/mobile/`) - React Native app for iOS/Android\n- **Extension** (`apps/extension/`) - Browser wallet extension\n\n## Common Development Commands\n\n### Setup\n\n```bash\n# Initial setup\nbun install\nbun local:check\nbun config:login\n```\n\n### Development Servers\n\n```bash\nbun web dev        # Web with Vite\nbun mobile ios          # iOS app\nbun mobile android      # Android app\nbun extension start     # Extension\n```\n\n### Building\n\n```bash\nbun web build:production    # Web production build\nbun mobile ios:bundle            # iOS bundle\nbun mobile android:release       # Android release\nbun extension build:production   # Extension production\n```\n\n### Testing\n\n```bash\nbun g:test                      # Run all tests\nbun g:test:changed              # Run tests for changed packages\nbun web playwright:test         # Web E2E tests\nbun mobile e2e                  # Mobile E2E tests\n```\n\n### Code Quality\n\n```bash\nbun g:lint:fix                  # Fix linting issues\nbun g:typecheck                 # Type check all packages\nbun g:format                    # Fix formatting\nbun i18n:extract                # Extract localized strings (run after changing translations)\n```\n\n## Architecture Overview\n\n### Monorepo Structure\n\n- **NX** for build orchestration\n- **Bun workspaces** for package management\n- Shared code in `packages/` directory\n- App-specific code in `apps/` directory\n\n### Key Technologies\n\n- **TypeScript** everywhere\n- **React** for web/extension\n- **React Native** for mobile\n- **Redux Toolkit** for state management\n- **Ethers.js/Viem** for blockchain interactions\n\n### Code Organization Principles\n\n#### Styling\n\n- **ALWAYS** use `styled` from `ui/src` (never styled-components); UI components may use inline styling where appropriate\n- Use theme tokens instead of hardcoded values\n- Platform-specific files: `Component.ios.tsx`, `Component.android.tsx`, `Component.web.tsx`, `Component.native.tsx` (with stub files for platforms where specific implementation isn't needed)\n\n#### Images and Icons\n\n- Search `packages/mycelium/src/assets` and the generated icon components (`@universe/mycelium/icons`, `ui/src/components/icons`) before adding an image or icon\n- Shared images go in `packages/mycelium/src/assets`, imported from `@universe/mycelium/assets`; an app's own directory is fine for an image only that app uses\n- Import generated icon components instead of `.svg` files; add new icons with `bun scripts/add-icons.ts` and the `build:icons` targets\n- Don't inline SVG markup in component files unless it needs something a static icon can't do, like per-path animation or data-driven geometry\n\n#### State Management\n\n- **Redux** for complex global state\n- **Zustand** for simple global/shared state — do not use Jotai, we are migrating away from it. Flag any new Jotai usage in PRs and require Zustand instead.\n- Keep state as local as possible\n- No custom hooks for simple data fetching - use `useQuery`/`useMutation` directly\n\n#### Component Structure\n\n1. State declarations at top\n2. Event handlers after state\n3. Memoize properly, especially for anything that might be used in the React Native app\n4. JSX at the end\n5. Keep components under 250 lines\n\n#### TypeScript Conventions\n\n- Do not use `any`, prefer `unknown`\n- Always consider strict mode\n- Use explicit return types\n- PascalCase for types/interfaces\n- camelCase for variables/functions\n- String enums with initializers\n\n## Testing + Formatting Guidelines\n\n- Test behaviors, not implementations\n- Always update existing unit tests related to changes made\n- Run tests before considering a task to be 'complete'\n- Also run linting and typecheck before considering a task to be 'complete'\n- Don't ignore new lint warnings — fix them; suppress with a one-line reasoned `oxlint-disable-next-line` only when a proper fix would change behavior\n- Run `bun i18n:extract` after making changes to localized strings (e.g., using translation hooks like `useTranslation`)\n\n## Critical Development Notes\n\n1. **Environment Variables**: Override URLs in `.env.defaults.local` (mobile) or `.env` (extension)\n2. **Pre-commit Hooks**: Use `--no-verify` to skip or set `export LEFTHOOK=0` to disable\n3. **Python Setup**: Run `brew install python-setuptools` if you encounter Python module errors\n4. **Mobile Development**: Always run `bun mobile pod` after dependency changes\n5. **Bundle Size**: Monitor bundle size impacts when adding dependencies\n6. **Bun Version Bumps**: `.bun-version` is the single source of truth. After editing it, run `bun sync:bun-version` to rewrite the pins that can't read the file (`engines.bun`, EAS build profiles) — CI fails if they drift. CI runners install Bun via `oven-sh/setup-bun` (reading `.bun-version` directly), so they need no pin. Bump `@types/bun` and rerun `bun install` separately.\n\n## Package Dependencies\n\nCore shared packages:\n\n- `packages/ui/` - Cross-platform UI components and theme\n- `packages/uniswap/` - Core business logic and utilities\n- `packages/wallet/` - Wallet functionality\n- `packages/utilities/` - Common utilities\n\n## Blockchain Integration\n\n- Support for multiple chains (Ethereum, Arbitrum, Optimism, etc.)\n- Uniswap Protocol v2, v3, v4, and UniswapX support\n- Multiple wallet providers (WalletConnect, Metamask, etc.)\n- Transaction building and gas estimation\n\n## Other Considerations\n\nBe cognizant of the app or package within which a given change is being made. Be sure to reference that app or package's respective `AGENTS.md` file and other local configuration files, including (but not limited to): `package.json`, `tsconfig.json`, etc.\n\n\n<!-- nx configuration start-->\n<!-- Leave the start & end comments to automatically receive updates. -->\n\n# General Guidelines for working with Nx\n\n- When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through `nx` (i.e. `nx run`, `nx run-many`, `nx affected`) instead of using the underlying tooling directly\n- You have access to the Nx MCP server and its tools, use them to help the user\n- When answering questions about the repository, use the `nx_workspace` tool first to gain an understanding of the workspace architecture where applicable.\n- When working in individual projects, use the `nx_project_details` mcp tool to analyze and understand the specific project structure and dependencies\n- For questions around nx configuration, best practices or if you're unsure, use the `nx_docs` tool to get relevant, up-to-date docs. Always use this instead of assuming things about nx configuration\n- If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors\n\n\n<!-- nx configuration end-->\n\n## Cursor Cloud specific instructions\n\n### Environment\n\n- Node.js and Bun are pre-installed and match `.nvmrc` / `.bun-version`.\n- The `tsgo` binary is at `node_modules/.bin/tsgo` (not globally in PATH). The `bun g:typecheck` script handles this automatically.\n- Set `export LEFTHOOK=0` to disable git hooks in Cloud Agent sessions (no TTY for interactive hooks).\n- Set `export SKIP_CONFIG_PULL=true` to disable remote config fetching (no Okta auth for agents)\n- All backend APIs are external (no local databases or Docker needed for development).\n\n### Web App\n\n- **Start dev server**: `bun web dev` → runs on `http://localhost:3000/`\n- **Run tests**: `bunx nx run web:test -- --run` (317 test files, ~2.5 min)\n- **Lint (fast)**: `bunx nx run web:format` (formatting) and `bunx nx run web:lint` (oxlint)\n- **Typecheck**: `bun g:typecheck` runs `tsgo -b` globally (fastest). Per-project: `bunx nx run web:typecheck`.\n- The `web:typecheck:cloud` target typechecks the `apps/web/functions/` (edge functions) separately and may fail independently of the main app.\n- The web app loads live data from Uniswap's public APIs without requiring API keys for basic swap quotes and token exploration.\n\n### Extension\n\n- **Start dev server**: `bun extension dev` → WXT builds the extension and opens Chrome with it pre-loaded.\n- A pre-built extension is available at `/var/tmp/stretch` and is already loaded in the default Chrome profile (`/home/ubuntu/.config/google-chrome`).\n- The extension wallet is **already onboarded**. To unlock it, use the password from the `EXTENSION_UNLOCK_PASSWORD` environment variable.\n- To type the password programmatically: write it to a temp file with `python3 -c \"import os; open('/tmp/ext_pw.txt','w').write(os.environ['EXTENSION_UNLOCK_PASSWORD'])\"`, then read/type from that file (the env var value is redacted in shell output but available to processes).\n- The extension opens as a **side panel** in Chrome (not a popup). Click the Uniswap icon in the toolbar or use Ctrl+Shift+U.\n- The wallet contains a small amount of ETH and cBTC on Ethereum mainnet.\n- **Known limitation**: connecting the extension wallet to the web app on `localhost` does not currently work (the `externally_connectable` manifest only allows `app.uniswap.org` and staging origins).\n\n### Gotchas\n\n- `bun install` runs a `preinstall` script that validates Node/Bun versions and will fail if they don't match `.nvmrc` / `.bun-version`.\n- The `postinstall` script runs `git config core.hooksPath .husky && bun g:prepare`. The `g:prepare` step (`nx run-many -t prepare`) generates codegen files needed for typecheck/build.\n- Mobile requires native tooling (Xcode, CocoaPods, Android SDK) not available in Cloud Agent VMs.\n- When running `bun extension dev`, WXT creates a `web-ext.config.ts` override file (gitignored) to customize browser startup behavior. You can set `startUrls`, `chromiumArgs`, or `WXT_NO_OPEN_BROWSER=true` as needed.\n","packages/README.md":"# packages Documentation\n\nPath: `packages/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/README.md)","packages/analytics/README.md":"# analytics Documentation\n\nPath: `packages/analytics/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/README.md)","packages/analytics/package.json":"# Analytics Skill\n\nPath: `packages/analytics/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/package.json)","packages/analytics/project.json":"# Analytics Skill\n\nPath: `packages/analytics/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/project.json)","packages/analytics/tsconfig.json":"# Analytics Skill\n\nPath: `packages/analytics/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/tsconfig.json)","packages/analytics/tsconfig.lint.json":"# Analytics Skill\n\nPath: `packages/analytics/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/tsconfig.lint.json)","packages/api/README.md":"# api Documentation\n\nPath: `packages/api/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/README.md)","packages/api/package.json":"# Api Skill\n\nPath: `packages/api/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/package.json)","packages/api/project.json":"# Api Skill\n\nPath: `packages/api/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/project.json)","packages/api/tsconfig.json":"# Api Skill\n\nPath: `packages/api/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/tsconfig.json)","packages/api/tsconfig.lint.json":"# Api Skill\n\nPath: `packages/api/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/tsconfig.lint.json)","packages/chains/README.md":"# chains Documentation\n\nPath: `packages/chains/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/README.md)","packages/chains/package.json":"# Chains Skill\n\nPath: `packages/chains/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/package.json)","packages/chains/project.json":"# Chains Skill\n\nPath: `packages/chains/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/project.json)","packages/chains/tsconfig.json":"# Chains Skill\n\nPath: `packages/chains/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/tsconfig.json)","packages/chains/tsconfig.lint.json":"# Chains Skill\n\nPath: `packages/chains/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/tsconfig.lint.json)","packages/compliance/README.md":"# compliance Documentation\n\nPath: `packages/compliance/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/README.md)","packages/compliance/package.json":"# Compliance Skill\n\nPath: `packages/compliance/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/package.json)","packages/compliance/project.json":"# Compliance Skill\n\nPath: `packages/compliance/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/project.json)","packages/compliance/tsconfig.json":"# Compliance Skill\n\nPath: `packages/compliance/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/tsconfig.json)","packages/compliance/tsconfig.lint.json":"# Compliance Skill\n\nPath: `packages/compliance/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/tsconfig.lint.json)","packages/config-cli/README.md":"# config-cli Documentation\n\nPath: `packages/config-cli/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/README.md)","packages/config-cli/package.json":"# Config-cli Skill\n\nPath: `packages/config-cli/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/package.json)","packages/config-cli/project.json":"# Config-cli Skill\n\nPath: `packages/config-cli/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/project.json)","packages/config-cli/tsconfig.json":"# Config-cli Skill\n\nPath: `packages/config-cli/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/tsconfig.json)","packages/config-cli/tsconfig.lint.json":"# Config-cli Skill\n\nPath: `packages/config-cli/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/tsconfig.lint.json)","packages/config/README.md":"# config Documentation\n\nPath: `packages/config/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/README.md)","packages/config/package.json":"# Config Skill\n\nPath: `packages/config/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/package.json)","packages/config/project.json":"# Config Skill\n\nPath: `packages/config/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/project.json)","packages/config/tsconfig.json":"# Config Skill\n\nPath: `packages/config/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/tsconfig.json)","packages/config/tsconfig.lint.json":"# Config Skill\n\nPath: `packages/config/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/tsconfig.lint.json)","packages/cryptography/README.md":"# cryptography Documentation\n\nPath: `packages/cryptography/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/README.md)","packages/cryptography/package.json":"# Cryptography Skill\n\nPath: `packages/cryptography/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/package.json)","packages/cryptography/project.json":"# Cryptography Skill\n\nPath: `packages/cryptography/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/project.json)","packages/cryptography/tsconfig.json":"# Cryptography Skill\n\nPath: `packages/cryptography/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/tsconfig.json)","packages/cryptography/tsconfig.lint.json":"# Cryptography Skill\n\nPath: `packages/cryptography/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/tsconfig.lint.json)","packages/datadog-cloud/INSTRUMENTATION_REPORT.md":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/INSTRUMENTATION_REPORT.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/INSTRUMENTATION_REPORT.md)","packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml)","packages/datadog-cloud/Pulumi.dev-portal-prod.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.dev-portal-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.dev-portal-prod.yaml)","packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml)","packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml)","packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml)","packages/datadog-cloud/Pulumi.yaml":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.yaml)","packages/datadog-cloud/package.json":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/package.json)","packages/datadog-cloud/project.json":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/project.json)","packages/datadog-cloud/tsconfig.json":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/tsconfig.json)","packages/embedded-wallet/README.md":"# embedded-wallet Documentation\n\nPath: `packages/embedded-wallet/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/README.md)","packages/embedded-wallet/package.json":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/package.json)","packages/embedded-wallet/project.json":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/project.json)","packages/embedded-wallet/tsconfig.json":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/tsconfig.json)","packages/embedded-wallet/tsconfig.lint.json":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/tsconfig.lint.json)","packages/encoding/README.md":"# encoding Documentation\n\nPath: `packages/encoding/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/README.md)","packages/encoding/package.json":"# Encoding Skill\n\nPath: `packages/encoding/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/package.json)","packages/encoding/project.json":"# Encoding Skill\n\nPath: `packages/encoding/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/project.json)","packages/encoding/tsconfig.json":"# Encoding Skill\n\nPath: `packages/encoding/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/tsconfig.json)","packages/encoding/tsconfig.lint.json":"# Encoding Skill\n\nPath: `packages/encoding/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/tsconfig.lint.json)","packages/environment/README.md":"# environment Documentation\n\nPath: `packages/environment/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/README.md)","packages/environment/package.json":"# Environment Skill\n\nPath: `packages/environment/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/package.json)","packages/environment/project.json":"# Environment Skill\n\nPath: `packages/environment/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/project.json)","packages/environment/tsconfig.json":"# Environment Skill\n\nPath: `packages/environment/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/tsconfig.json)","packages/environment/tsconfig.lint.json":"# Environment Skill\n\nPath: `packages/environment/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/tsconfig.lint.json)","packages/experiments/README.md":"# experiments Documentation\n\nPath: `packages/experiments/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/README.md)","packages/experiments/package.json":"# Experiments Skill\n\nPath: `packages/experiments/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/package.json)","packages/experiments/project.json":"# Experiments Skill\n\nPath: `packages/experiments/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/project.json)","packages/experiments/tsconfig.json":"# Experiments Skill\n\nPath: `packages/experiments/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/tsconfig.json)","packages/experiments/tsconfig.lint.json":"# Experiments Skill\n\nPath: `packages/experiments/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/tsconfig.lint.json)","packages/gating/README.md":"# gating Documentation\n\nPath: `packages/gating/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/README.md)","packages/gating/package.json":"# Gating Skill\n\nPath: `packages/gating/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/package.json)","packages/gating/project.json":"# Gating Skill\n\nPath: `packages/gating/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/project.json)","packages/gating/tsconfig.json":"# Gating Skill\n\nPath: `packages/gating/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/tsconfig.json)","packages/gating/tsconfig.lint.json":"# Gating Skill\n\nPath: `packages/gating/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/tsconfig.lint.json)","packages/hashcash-native/README.md":"# hashcash-native Documentation\n\nPath: `packages/hashcash-native/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/README.md)","packages/hashcash-native/nitro.json":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/nitro.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/nitro.json)","packages/hashcash-native/package.json":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/package.json)","packages/hashcash-native/project.json":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/project.json)","packages/hashcash-native/tsconfig.json":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/tsconfig.json)","packages/logger/README.md":"# logger Documentation\n\nPath: `packages/logger/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/README.md)","packages/logger/package.json":"# Logger Skill\n\nPath: `packages/logger/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/package.json)","packages/logger/project.json":"# Logger Skill\n\nPath: `packages/logger/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/project.json)","packages/logger/tsconfig.json":"# Logger Skill\n\nPath: `packages/logger/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/tsconfig.json)","packages/logger/tsconfig.lint.json":"# Logger Skill\n\nPath: `packages/logger/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/tsconfig.lint.json)","packages/mycelium/README.md":"# mycelium Documentation\n\nPath: `packages/mycelium/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/README.md)","packages/mycelium/package.json":"# Mycelium Skill\n\nPath: `packages/mycelium/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/package.json)","packages/mycelium/platform-legs.json":"# Mycelium Skill\n\nPath: `packages/mycelium/platform-legs.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/platform-legs.json)","packages/mycelium/project.json":"# Mycelium Skill\n\nPath: `packages/mycelium/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/project.json)","packages/mycelium/tsconfig.json":"# Mycelium Skill\n\nPath: `packages/mycelium/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.json)","packages/mycelium/tsconfig.lint.json":"# Mycelium Skill\n\nPath: `packages/mycelium/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.lint.json)","packages/mycelium/tsconfig.test.json":"# Mycelium Skill\n\nPath: `packages/mycelium/tsconfig.test.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.test.json)","packages/notifications/README.md":"# notifications Documentation\n\nPath: `packages/notifications/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/README.md)","packages/notifications/package.json":"# Notifications Skill\n\nPath: `packages/notifications/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/package.json)","packages/notifications/project.json":"# Notifications Skill\n\nPath: `packages/notifications/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/project.json)","packages/notifications/tsconfig.json":"# Notifications Skill\n\nPath: `packages/notifications/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/tsconfig.json)","packages/notifications/tsconfig.lint.json":"# Notifications Skill\n\nPath: `packages/notifications/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/tsconfig.lint.json)","packages/prices/README.md":"# prices Documentation\n\nPath: `packages/prices/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/README.md)","packages/prices/package.json":"# Prices Skill\n\nPath: `packages/prices/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/package.json)","packages/prices/project.json":"# Prices Skill\n\nPath: `packages/prices/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/project.json)","packages/prices/tsconfig.json":"# Prices Skill\n\nPath: `packages/prices/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/tsconfig.json)","packages/prices/tsconfig.lint.json":"# Prices Skill\n\nPath: `packages/prices/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/tsconfig.lint.json)","packages/privacy/README.md":"# privacy Documentation\n\nPath: `packages/privacy/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/README.md)","packages/privacy/package.json":"# Privacy Skill\n\nPath: `packages/privacy/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/package.json)","packages/privacy/project.json":"# Privacy Skill\n\nPath: `packages/privacy/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/project.json)","packages/privacy/tsconfig.json":"# Privacy Skill\n\nPath: `packages/privacy/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/tsconfig.json)","packages/privacy/tsconfig.lint.json":"# Privacy Skill\n\nPath: `packages/privacy/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/tsconfig.lint.json)","packages/react-query/README.md":"# react-query Documentation\n\nPath: `packages/react-query/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/README.md)","packages/react-query/package.json":"# React-query Skill\n\nPath: `packages/react-query/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/package.json)","packages/react-query/project.json":"# React-query Skill\n\nPath: `packages/react-query/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/project.json)","packages/react-query/tsconfig.json":"# React-query Skill\n\nPath: `packages/react-query/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/tsconfig.json)","packages/react-query/tsconfig.lint.json":"# React-query Skill\n\nPath: `packages/react-query/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/tsconfig.lint.json)","packages/sessions/README.md":"# sessions Documentation\n\nPath: `packages/sessions/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/README.md)","packages/sessions/package.json":"# Sessions Skill\n\nPath: `packages/sessions/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/package.json)","packages/sessions/project.json":"# Sessions Skill\n\nPath: `packages/sessions/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/project.json)","packages/sessions/tsconfig.json":"# Sessions Skill\n\nPath: `packages/sessions/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/tsconfig.json)","packages/sessions/tsconfig.lint.json":"# Sessions Skill\n\nPath: `packages/sessions/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/tsconfig.lint.json)","packages/tailwind/README.md":"# tailwind Documentation\n\nPath: `packages/tailwind/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/README.md)","packages/tailwind/package.json":"# Tailwind Skill\n\nPath: `packages/tailwind/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/package.json)","packages/tailwind/project.json":"# Tailwind Skill\n\nPath: `packages/tailwind/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/project.json)","packages/tailwind/tsconfig.cross-package.json":"# Tailwind Skill\n\nPath: `packages/tailwind/tsconfig.cross-package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.cross-package.json)","packages/tailwind/tsconfig.json":"# Tailwind Skill\n\nPath: `packages/tailwind/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.json)","packages/tailwind/tsconfig.lint.json":"# Tailwind Skill\n\nPath: `packages/tailwind/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.lint.json)","packages/test/README.md":"# test Documentation\n\nPath: `packages/test/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/README.md)","packages/test/package.json":"# Test Skill\n\nPath: `packages/test/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/package.json)","packages/test/project.json":"# Test Skill\n\nPath: `packages/test/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/project.json)","packages/test/tsconfig.json":"# Test Skill\n\nPath: `packages/test/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/tsconfig.json)","packages/trpc/README.md":"# trpc Documentation\n\nPath: `packages/trpc/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/README.md)","packages/trpc/package.json":"# Trpc Skill\n\nPath: `packages/trpc/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/package.json)","packages/trpc/project.json":"# Trpc Skill\n\nPath: `packages/trpc/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/project.json)","packages/trpc/tsconfig.json":"# Trpc Skill\n\nPath: `packages/trpc/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/tsconfig.json)","packages/trpc/tsconfig.lint.json":"# Trpc Skill\n\nPath: `packages/trpc/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/tsconfig.lint.json)","packages/ui/README.md":"# ui Documentation\n\nPath: `packages/ui/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/README.md)","packages/ui/package.json":"# Ui Skill\n\nPath: `packages/ui/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/package.json)","packages/ui/project.json":"# Ui Skill\n\nPath: `packages/ui/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/project.json)","packages/ui/tsconfig.json":"# Ui Skill\n\nPath: `packages/ui/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/tsconfig.json)","packages/ui/tsconfig.lint.json":"# Ui Skill\n\nPath: `packages/ui/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/tsconfig.lint.json)","packages/uniswap/openapitools.json":"# Uniswap Skill\n\nPath: `packages/uniswap/openapitools.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/openapitools.json)","packages/uniswap/package.json":"# Uniswap Skill\n\nPath: `packages/uniswap/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/package.json)","packages/uniswap/project.json":"# Uniswap Skill\n\nPath: `packages/uniswap/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/project.json)","packages/uniswap/tsconfig.json":"# Uniswap Skill\n\nPath: `packages/uniswap/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/tsconfig.json)","packages/uniswap/tsconfig.lint.json":"# Uniswap Skill\n\nPath: `packages/uniswap/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/tsconfig.lint.json)","packages/utilities/package.json":"# Utilities Skill\n\nPath: `packages/utilities/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/package.json)","packages/utilities/project.json":"# Utilities Skill\n\nPath: `packages/utilities/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/project.json)","packages/utilities/tsconfig.json":"# Utilities Skill\n\nPath: `packages/utilities/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/tsconfig.json)","packages/utilities/tsconfig.lint.json":"# Utilities Skill\n\nPath: `packages/utilities/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/tsconfig.lint.json)","packages/wallet/package.json":"# Wallet Skill\n\nPath: `packages/wallet/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/package.json)","packages/wallet/project.json":"# Wallet Skill\n\nPath: `packages/wallet/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/project.json)","packages/wallet/tsconfig.json":"# Wallet Skill\n\nPath: `packages/wallet/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/tsconfig.json)","packages/wallet/tsconfig.lint.json":"# Wallet Skill\n\nPath: `packages/wallet/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/tsconfig.lint.json)","packages/websocket/README.md":"# websocket Documentation\n\nPath: `packages/websocket/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/README.md)","packages/websocket/package.json":"# Websocket Skill\n\nPath: `packages/websocket/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/package.json)","packages/websocket/project.json":"# Websocket Skill\n\nPath: `packages/websocket/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/project.json)","packages/websocket/tsconfig.json":"# Websocket Skill\n\nPath: `packages/websocket/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/tsconfig.json)","packages/websocket/tsconfig.lint.json":"# Websocket Skill\n\nPath: `packages/websocket/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/tsconfig.lint.json)","packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml)","packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml)","packages/datadog-cloud/dashboards/Pulumi.prod.yaml":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.prod.yaml)","packages/datadog-cloud/dashboards/Pulumi.yaml":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.yaml)","packages/datadog-cloud/dashboards/package.json":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/package.json)","packages/datadog-cloud/dashboards/tsconfig.json":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/tsconfig.json)","packages/datadog-cloud/esc/apps-pod-swap-fe.yaml":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/apps-pod-swap-fe.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/apps-pod-swap-fe.yaml)","packages/datadog-cloud/esc/dev-portal.yaml":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/dev-portal.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/dev-portal.yaml)","packages/datadog-cloud/esc/liquidity-fe.yaml":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/liquidity-fe.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/liquidity-fe.yaml)","packages/datadog-cloud/esc/privy-embedded-wallet.yaml":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/privy-embedded-wallet.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/privy-embedded-wallet.yaml)","packages/privacy/src/wallet-secret-keys.json":"# Src Skill\n\nPath: `packages/privacy/src/wallet-secret-keys.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/src/wallet-secret-keys.json)",".agents/skills/argent-device-interact/references/gesture-examples.md":"# References Skill\n\nPath: `.agents/skills/argent-device-interact/references/gesture-examples.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-device-interact/references/gesture-examples.md)",".agents/skills/argent-metro-debugger/references/failure-scenarios.md":"# References Skill\n\nPath: `.agents/skills/argent-metro-debugger/references/failure-scenarios.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/references/failure-scenarios.md)",".agents/skills/argent-metro-debugger/references/source-maps.md":"# References Skill\n\nPath: `.agents/skills/argent-metro-debugger/references/source-maps.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/references/source-maps.md)",".agents/skills/argent-react-native-optimization/references/fix-reference.md":"# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/fix-reference.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/fix-reference.md)",".agents/skills/argent-react-native-optimization/references/lint-rules.md":"# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/lint-rules.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/lint-rules.md)",".agents/skills/argent-react-native-optimization/references/semantic-checklist.md":"# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/semantic-checklist.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/semantic-checklist.md)",".agents/skills/argent-react-native-profiler/references/diagnostic-tools.md":"# References Skill\n\nPath: `.agents/skills/argent-react-native-profiler/references/diagnostic-tools.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-profiler/references/diagnostic-tools.md)","packages/datadog-cloud/dashboards/esc/shared.yaml":"# Esc Skill\n\nPath: `packages/datadog-cloud/dashboards/esc/shared.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/esc/shared.yaml)","packages/uniswap/src/abis/erc1155.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc1155.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc1155.json)","packages/uniswap/src/abis/erc20.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc20.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc20.json)","packages/uniswap/src/abis/erc20_bytes32.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc20_bytes32.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc20_bytes32.json)","packages/uniswap/src/abis/erc721.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc721.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc721.json)","packages/uniswap/src/abis/fee-on-transfer-detector.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/fee-on-transfer-detector.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/fee-on-transfer-detector.json)","packages/uniswap/src/abis/permit2.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/permit2.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/permit2.json)","packages/uniswap/src/abis/weth.json":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/weth.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/weth.json)","packages/uniswap/src/state/README.md":"# state Documentation\n\nPath: `packages/uniswap/src/state/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/state/README.md)","packages/utilities/src/logger/README.md":"# logger Documentation\n\nPath: `packages/utilities/src/logger/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/logger/README.md)","packages/utilities/src/telemetry/README.md":"# telemetry Documentation\n\nPath: `packages/utilities/src/telemetry/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/telemetry/README.md)","packages/wallet/src/state/README.md":"# state Documentation\n\nPath: `packages/wallet/src/state/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/state/README.md)","packages/wallet/src/test/README.md":"# test Documentation\n\nPath: `packages/wallet/src/test/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/test/README.md)","packages/api/src/clients/trading/api.json":"# Trading Skill\n\nPath: `packages/api/src/clients/trading/api.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/src/clients/trading/api.json)","packages/utilities/src/telemetry/trace/README.md":"# trace Documentation\n\nPath: `packages/utilities/src/telemetry/trace/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/telemetry/trace/README.md)","packages/wallet/src/features/forceUpgrade/README.md":"# forceUpgrade Documentation\n\nPath: `packages/wallet/src/features/forceUpgrade/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/features/forceUpgrade/README.md)","packages/uniswap/src/i18n/locales/source/en-US.json":"# Source Skill\n\nPath: `packages/uniswap/src/i18n/locales/source/en-US.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/source/en-US.json)","packages/uniswap/src/i18n/locales/translations/es-ES.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/es-ES.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/es-ES.json)","packages/uniswap/src/i18n/locales/translations/fr-FR.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/fr-FR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/fr-FR.json)","packages/uniswap/src/i18n/locales/translations/id-ID.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/id-ID.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/id-ID.json)","packages/uniswap/src/i18n/locales/translations/ja-JP.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/ja-JP.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ja-JP.json)","packages/uniswap/src/i18n/locales/translations/ko-KR.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/ko-KR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ko-KR.json)","packages/uniswap/src/i18n/locales/translations/nl-NL.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/nl-NL.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/nl-NL.json)","packages/uniswap/src/i18n/locales/translations/pt-BR.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/pt-BR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/pt-BR.json)","packages/uniswap/src/i18n/locales/translations/pt-PT.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/pt-PT.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/pt-PT.json)","packages/uniswap/src/i18n/locales/translations/ru-RU.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/ru-RU.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ru-RU.json)","packages/uniswap/src/i18n/locales/translations/tr-TR.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/tr-TR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/tr-TR.json)","packages/uniswap/src/i18n/locales/translations/vi-VN.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/vi-VN.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/vi-VN.json)","packages/uniswap/src/i18n/locales/translations/zh-CN.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/zh-CN.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/zh-CN.json)","packages/uniswap/src/i18n/locales/translations/zh-TW.json":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/zh-TW.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/zh-TW.json)","packages/uniswap/src/features/accounts/store/types/README.md":"# types Documentation\n\nPath: `packages/uniswap/src/features/accounts/store/types/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/features/accounts/store/types/README.md)","packages/uniswap/src/features/transactions/swap/components/README.md":"# components Documentation\n\nPath: `packages/uniswap/src/features/transactions/swap/components/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/features/transactions/swap/components/README.md)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# AGENTS.md\n\nThis file provides guidance to AI agents when working with code in this repository. Always run all tests, lint, and typecheck after making changes, and before considering a task to be 'complete'.\n\n## Project Overview\n\nUniswap Universe is a monorepo containing all Uniswap front-end interfaces:\n\n- **Web** (`apps/web/`) - Decentralized exchange web interface\n- **Mobile** (`apps/mobile/`) - React Native app for iOS/Android\n- **Extension** (`apps/extension/`) - Browser wallet extension\n\n## Common Development Commands\n\n### Setup\n\n```bash\n# Initial setup\nbun install\nbun local:check\nbun config:login\n```\n\n### Development Servers\n\n```bash\nbun web dev        # Web with Vite\nbun mobile ios          # iOS app\nbun mobile android      # Android app\nbun extension start     # Extension\n```\n\n### Building\n\n```bash\nbun web build:production    # Web production build\nbun mobile ios:bundle            # iOS bundle\nbun mobile android:release       # Android release\nbun extension build:production   # Extension production\n```\n\n### Testing\n\n```bash\nbun g:test                      # Run all tests\nbun g:test:changed              # Run tests for changed packages\nbun web playwright:test         # Web E2E tests\nbun mobile e2e                  # Mobile E2E tests\n```\n\n### Code Quality\n\n```bash\nbun g:lint:fix                  # Fix linting issues\nbun g:typecheck                 # Type check all packages\nbun g:format                    # Fix formatting\nbun i18n:extract                # Extract localized strings (run after changing translations)\n```\n\n## Architecture Overview\n\n### Monorepo Structure\n\n- **NX** for build orchestration\n- **Bun workspaces** for package management\n- Shared code in `packages/` directory\n- App-specific code in `apps/` directory\n\n### Key Technologies\n\n- **TypeScript** everywhere\n- **React** for web/extension\n- **React Native** for mobile\n- **Redux Toolkit** for state management\n- **Ethers.js/Viem** for blockchain interactions\n\n### Code Organization Principles\n\n#### Styling\n\n- **ALWAYS** use `styled` from `ui/src` (never styled-components); UI components may use inline styling where appropriate\n- Use theme tokens instead of hardcoded values\n- Platform-specific files: `Component.ios.tsx`, `Component.android.tsx`, `Component.web.tsx`, `Component.native.tsx` (with stub files for platforms where specific implementation isn't needed)\n\n#### Images and Icons\n\n- Search `packages/mycelium/src/assets` and the generated icon components (`@universe/mycelium/icons`, `ui/src/components/icons`) before adding an image or icon\n- Shared images go in `packages/mycelium/src/assets`, imported from `@universe/mycelium/assets`; an app's own directory is fine for an image only that app uses\n- Import generated icon components instead of `.svg` files; add new icons with `bun scripts/add-icons.ts` and the `build:icons` targets\n- Don't inline SVG markup in component files unless it needs something a static icon can't do, like per-path animation or data-driven geometry\n\n#### State Management\n\n- **Redux** for complex global state\n- **Zustand** for simple global/shared state — do not use Jotai, we are migrating away from it. Flag any new Jotai usage in PRs and require Zustand instead.\n- Keep state as local as possible\n- No custom hooks for simple data fetching - use `useQuery`/`useMutation` directly\n\n#### Component Structure\n\n1. State declarations at top\n2. Event handlers after state\n3. Memoize properly, especially for anything that might be used in the React Native app\n4. JSX at the end\n5. Keep components under 250 lines\n\n#### TypeScript Conventions\n\n- Do not use `any`, prefer `unknown`\n- Always consider strict mode\n- Use explicit return types\n- PascalCase for types/interfaces\n- camelCase for variables/functions\n- String enums with initializers\n\n## Testing + Formatting Guidelines\n\n- Test behaviors, not implementations\n- Always update existing unit tests related to changes made\n- Run tests before considering a task to be 'complete'\n- Also run linting and typecheck before considering a task to be 'complete'\n- Don't ignore new lint warnings — fix them; suppress with a one-line reasoned `oxlint-disable-next-line` only when a proper fix would change behavior\n- Run `bun i18n:extract` after making changes to localized strings (e.g., using translation hooks like `useTranslation`)\n\n## Critical Development Notes\n\n1. **Environment Variables**: Override URLs in `.env.defaults.local` (mobile) or `.env` (extension)\n2. **Pre-commit Hooks**: Use `--no-verify` to skip or set `export LEFTHOOK=0` to disable\n3. **Python Setup**: Run `brew install python-setuptools` if you encounter Python module errors\n4. **Mobile Development**: Always run `bun mobile pod` after dependency changes\n5. **Bundle Size**: Monitor bundle size impacts when adding dependencies\n6. **Bun Version Bumps**: `.bun-version` is the single source of truth. After editing it, run `bun sync:bun-version` to rewrite the pins that can't read the file (`engines.bun`, EAS build profiles) — CI fails if they drift. CI runners install Bun via `oven-sh/setup-bun` (reading `.bun-version` directly), so they need no pin. Bump `@types/bun` and rerun `bun install` separately.\n\n## Package Dependencies\n\nCore shared packages:\n\n- `packages/ui/` - Cross-platform UI components and theme\n- `packages/uniswap/` - Core business logic and utilities\n- `packages/wallet/` - Wallet functionality\n- `packages/utilities/` - Common utilities\n\n## Blockchain Integration\n\n- Support for multiple chains (Ethereum, Arbitrum, Optimism, etc.)\n- Uniswap Protocol v2, v3, v4, and UniswapX support\n- Multiple wallet providers (WalletConnect, Metamask, etc.)\n- Transaction building and gas estimation\n\n## Other Considerations\n\nBe cognizant of the app or package within which a given change is being made. Be sure to reference that app or package's respective `AGENTS.md` file and other local configuration files, including (but not limited to): `package.json`, `tsconfig.json`, etc.\n\n\n<!-- nx configuration start-->\n<!-- Leave the start & end comments to automatically receive updates. -->\n\n# General Guidelines for working with Nx\n\n- When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through `nx` (i.e. `nx run`, `nx run-many`, `nx affected`) instead of using the underlying tooling directly\n- You have access to the Nx MCP server and its tools, use them to help the user\n- When answering questions about the repository, use the `nx_workspace` tool first to gain an understanding of the workspace architecture where applicable.\n- When working in individual projects, use the `nx_project_details` mcp tool to analyze and understand the specific project structure and dependencies\n- For questions around nx configuration, best practices or if you're unsure, use the `nx_docs` tool to get relevant, up-to-date docs. Always use this instead of assuming things about nx configuration\n- If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors\n\n\n<!-- nx configuration end-->\n\n## Cursor Cloud specific instructions\n\n### Environment\n\n- Node.js and Bun are pre-installed and match `.nvmrc` / `.bun-version`.\n- The `tsgo` binary is at `node_modules/.bin/tsgo` (not globally in PATH). The `bun g:typecheck` script handles this automatically.\n- Set `export LEFTHOOK=0` to disable git hooks in Cloud Agent sessions (no TTY for interactive hooks).\n- Set `export SKIP_CONFIG_PULL=true` to disable remote config fetching (no Okta auth for agents)\n- All backend APIs are external (no local databases or Docker needed for development).\n\n### Web App\n\n- **Start dev server**: `bun web dev` → runs on `http://localhost:3000/`\n- **Run tests**: `bunx nx run web:test -- --run` (317 test files, ~2.5 min)\n- **Lint (fast)**: `bunx nx run web:format` (formatting) and `bunx nx run web:lint` (oxlint)\n- **Typecheck**: `bun g:typecheck` runs `tsgo -b` globally (fastest). Per-project: `bunx nx run web:typecheck`.\n- The `web:typecheck:cloud` target typechecks the `apps/web/functions/` (edge functions) separately and may fail independently of the main app.\n- The web app loads live data from Uniswap's public APIs without requiring API keys for basic swap quotes and token exploration.\n\n### Extension\n\n- **Start dev server**: `bun extension dev` → WXT builds the extension and opens Chrome with it pre-loaded.\n- A pre-built extension is available at `/var/tmp/stretch` and is already loaded in the default Chrome profile (`/home/ubuntu/.config/google-chrome`).\n- The extension wallet is **already onboarded**. To unlock it, use the password from the `EXTENSION_UNLOCK_PASSWORD` environment variable.\n- To type the password programmatically: write it to a temp file with `python3 -c \"import os; open('/tmp/ext_pw.txt','w').write(os.environ['EXTENSION_UNLOCK_PASSWORD'])\"`, then read/type from that file (the env var value is redacted in shell output but available to processes).\n- The extension opens as a **side panel** in Chrome (not a popup). Click the Uniswap icon in the toolbar or use Ctrl+Shift+U.\n- The wallet contains a small amount of ETH and cBTC on Ethereum mainnet.\n- **Known limitation**: connecting the extension wallet to the web app on `localhost` does not currently work (the `externally_connectable` manifest only allows `app.uniswap.org` and staging origins).\n\n### Gotchas\n\n- `bun install` runs a `preinstall` script that validates Node/Bun versions and will fail if they don't match `.nvmrc` / `.bun-version`.\n- The `postinstall` script runs `git config core.hooksPath .husky && bun g:prepare`. The `g:prepare` step (`nx run-many -t prepare`) generates codegen files needed for typecheck/build.\n- Mobile requires native tooling (Xcode, CocoaPods, Android SDK) not available in Cloud Agent VMs.\n- When running `bun extension dev`, WXT creates a `web-ext.config.ts` override file (gitignored) to customize browser startup behavior. You can set `startUrls`, `chromiumArgs`, or `WXT_NO_OPEN_BROWSER=true` as needed.\n","isInternal":false,"tokens":2381,"sizeBytes":9994},{"name":"SKILL.md","path":".agents/skills/argent-android-emulator-setup/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-android-emulator-setup/SKILL.md","title":"argent-android-emulator-setup","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-android-emulator-setup\ndescription: Set up and connect to an Android emulator using argent MCP tools. Use when starting a new session on Android, booting an emulator, getting a device serial, or before any UI interaction task.\n---\n\n## 1. Prerequisites\n\n- **Android SDK Platform Tools** on PATH — provides `adb`.\n- **Android Emulator** on PATH — needed to boot AVDs. If you will only use an already-running emulator or a physical device, adb alone is sufficient.\n- An AVD created via Android Studio or `avdmanager create avd`.\n\nVerify with `adb version` and `emulator -list-avds`.\n\n## 2. Setup\n\n1. **Find a ready device** — call `list-devices`. Filter for entries with `platform: \"android\"`. Ready devices (`state: \"device\"`) come first. Pick the first `serial` (e.g. `emulator-5554`) unless the user specified one.\n2. **Boot if needed** — if nothing Android is ready, call `boot-device` with `avdName: <name>` from the same call's `avds` list. The tool transparently picks hot vs cold boot: it probes the AVD's `default_boot` snapshot, restores it under a tight deadline when usable, and falls back to a full cold boot otherwise. Hot path is typically ~30s; cold path takes 2–10 min. On any stage failure the tool kills the emulator process it started so your next call starts from a clean state.\n3. **Metro (for React Native)** — once a device is up, run `adb -s <serial> reverse tcp:8081 tcp:8081` so the device can reach Metro on your host. Repeat if the device restarts. See the `argent-metro-debugger` skill.\n\n## 3. Using the device\n\nPass the Android serial as `udid` to the unified interaction tools — `gesture-tap`, `gesture-swipe`, `describe`, `screenshot`, `launch-app`, `keyboard`, etc. Dispatch is automatic based on the id shape. See `argent-device-interact` for platform-neutral interaction tooling and the Android-specific gotchas section at the bottom of that skill.\n\n## 4. Notes\n\n- Serials are the adb device id. iOS UDIDs and Android serials are not interchangeable, but you do NOT need to tell the tools which platform — dispatch is automatic.\n- `describe` on Android returns a shallower tree than iOS (no accessibility-service equivalent), but covers most tap-target discovery.\n- `reinstall-app` on Android always installs with `-g` so first-launch runtime permissions are pre-granted.\n- To kill the emulator when you're done, run `adb -s <serial> emu kill` from a shell.\n","frontmatter":{"name":"argent-android-emulator-setup","description":"Set up and connect to an Android emulator using argent MCP tools. Use when starting a new session on Android, booting an emulator, getting a device serial, or before any UI interaction task."},"isInternal":false,"tokens":590,"sizeBytes":2424},{"name":"SKILL.md","path":".agents/skills/argent-create-flow/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-create-flow/SKILL.md","title":"argent-create-flow","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-create-flow\ndescription: Record a reusable flow (scripted sequence of MCP tool calls) that can be replayed later with a single command. Use when the user asks to create, record, or build a flow, or to script a sequence of simulator actions.\n---\n\n## 1. Overview\n\nA flow is a recorded sequence of MCP tool calls saved to a `.yaml` file in the `.argent/flows/` directory. Each step is **executed live** as you add it, so you verify it works before it becomes part of the flow. Replay a finished flow with `flow-execute`.\n\n## 2. Tools\n\n| Tool                     | Purpose                                                                    |\n| ------------------------ | -------------------------------------------------------------------------- |\n| `flow-start-recording`   | Start recording — takes a name and executionPrerequisite, creates the file |\n| `flow-add-step`          | Execute a tool call live and record it if it succeeds                      |\n| `flow-add-echo`          | Add a label/comment that prints during replay                              |\n| `flow-finish-recording`  | Stop recording and get a summary                                           |\n| `flow-read-prerequisite` | Read a flow's execution prerequisite without running it                    |\n| `flow-execute`           | Replay a saved flow by name                                                |\n\n## 3. Workflow\n\n### Recording\n\n1. **Start**: Call `flow-start-recording` with a descriptive name, the absolute `project_root`, and an `executionPrerequisite` describing the required app state before running the flow (e.g. \"App on home screen after a fresh reload\"). `project_root` is stored for the session — you do **not** need to pass it again to subsequent tools.\n2. **Build step-by-step**: For each action, call `flow-add-step` with the tool name and args. The tool runs immediately — check the result before moving on.\n3. **Add labels**: Use `flow-add-echo` between steps to describe what each section does.\n4. **Finish**: Call `flow-finish-recording` to stop recording. It returns the file path where the flow was saved and a summary of all steps. You can edit the `.yaml` file directly afterwards to remove, reorder, or tweak steps.\n\nEvery tool during recording returns the current flow file contents so you can track what has been recorded.\n\n### Replaying\n\nCall `flow-execute` with the flow name. If the flow has an execution prerequisite:\n\n1. The tool returns a **notice** with the prerequisite text instead of running. It asks you to verify the prerequisite is met and call `flow-execute` again with `prerequisiteAcknowledged: true`.\n2. You can also call `flow-read-prerequisite` beforehand to inspect the prerequisite without triggering a run.\n3. Once you pass `prerequisiteAcknowledged: true`, the flow runs all steps in order and returns every tool call result (including screenshots) merged into a single response.\n\nIf the flow has no prerequisite, it runs immediately without needing acknowledgment.\n\n## 4. flow-add-step Usage\n\nThe `command` parameter is the MCP tool name. The `args` parameter is a **JSON string** (not an object):\n\n```\ncommand: \"launch-app\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\", \\\"bundleId\\\": \\\"com.apple.Preferences\\\"}\"\n```\n\n```\ncommand: \"gesture-tap\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.35}\"\n```\n\n```\ncommand: \"screenshot\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\"}\"\n```\n\nFor tools with no arguments, omit `args` entirely.\n\n## 5. Important Rules\n\n- **Every step runs live.** You will see the real tool result (including screenshots). Use this to verify the step worked before continuing.\n- **Only successful steps are recorded.** If a tool call fails, nothing is written to the flow file — fix the issue and try again.\n- **Pass `project_root` only to `flow-start-recording`.** It is stored for the session and automatically used by all subsequent flow tools. An error is returned if the path is not absolute.\n- **You do NOT need to pass a flow name** to `flow-add-step`, `flow-add-echo`, or `flow-finish-recording`. The active flow is tracked automatically after `flow-start-recording`.\n- **Start before adding.** Calling `flow-add-step`, `flow-add-echo`, or `flow-finish-recording` without an active recording returns an error: _\"No active flow. Call flow-start-recording first.\"_\n- **One flow at a time.** If you call `flow-start-recording` while already recording, the active flow switches to the new one. The response tells you which flow was abandoned and which is now active. The old flow's file remains on disk.\n- **Mistakes can be edited out.** If a step was recorded by mistake, edit the `.yaml` file directly to remove or reorder entries.\n\n## 6. Example Session\n\n```\nflow-start-recording  { name: \"open-settings\", project_root: \"/Users/dev/MyApp\", executionPrerequisite: \"Simulator booted with app installed\" }\nflow-add-echo  { message: \"Launch Settings app\" }\nflow-add-step  { command: \"launch-app\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"bundleId\\\": \\\"com.apple.Preferences\\\"}\" }\nflow-add-echo  { message: \"Tap General\" }\nflow-add-step  { command: \"gesture-tap\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.35}\" }\nflow-add-echo  { message: \"Tap About\" }\nflow-add-step  { command: \"gesture-tap\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.17}\" }\nflow-finish-recording  {}\n```\n\n## 7. Replay Example\n\n```\nflow-execute   { name: \"open-settings\", project_root: \"/Users/dev/MyApp\" }\n→ Returns: notice with executionPrerequisite: \"Simulator booted with app installed\"\n  \"Verify the prerequisite is met and call flow-execute again with prerequisiteAcknowledged set to true.\"\n\nflow-execute   { name: \"open-settings\", project_root: \"/Users/dev/MyApp\", prerequisiteAcknowledged: true }\n→ Runs all steps, returns merged results with status and output for every step\n```\n\n## 8. Flow File Format\n\nFlow files use YAML. The top-level is an object with `executionPrerequisite` (describes required state) and `steps` (array of actions):\n\n- `- echo: <message>` — a label\n- `- tool: <name>` with optional `args:` — a tool call. Add `delayMs: <ms>` to sleep that long before the step runs (use sparingly — only when the app needs a fixed wait between actions).\n\nExample `.yaml` file:\n\n```yaml\nexecutionPrerequisite: Simulator booted with app installed\nsteps:\n  - echo: Launch Settings app\n  - tool: launch-app\n    args:\n      udid: ABC\n      bundleId: com.apple.Preferences\n  - echo: Tap General\n  - tool: gesture-tap\n    args:\n      udid: ABC\n      x: 0.5\n      y: 0.35\n  - echo: Tap About\n  - tool: gesture-tap\n    args:\n      udid: ABC\n      x: 0.5\n      y: 0.17\n```\n\n## 9. When to Proactively Record a Flow\n\nYou do not need the user to ask for a flow. Record one proactively when you recognize any of these patterns:\n\n- **About to re-profile**: You completed a profiling session and are about to apply a fix and re-profile. Record the interaction steps now so the re-profile replays them identically (see `argent-react-native-profiler` and `argent-native-profiler` skills).\n- **Repeating steps**: You have already performed a multi-step interaction sequence once and the task requires doing it again (comparison, retry, re-test).\n- **Complex path discovered**: You worked through a non-trivial sequence of taps/swipes/navigation to reach a desired app state. Capture it before it is lost.\n- **User says \"again\" / \"one more time\"**: Any request to redo what you just did is a signal to record first, then replay.\n\n## 10. Flow Self-Improvement\n\nFlows break. UI layouts change, coordinates drift, screens get added or removed. When `flow-execute` returns a failure, follow this procedure to diagnose and fix the flow instead of silently re-recording or giving up.\n\n### 10.1 Classify the Result\n\nAfter every `flow-execute`, classify the outcome before proceeding:\n\n| Outcome                | Signal                                                                | Action             |\n| ---------------------- | --------------------------------------------------------------------- | ------------------ |\n| **Success**            | All steps completed, final screenshot shows expected state            | Continue with task |\n| **Hard error**         | A step has `ERROR` in the result — engine stopped there               | Enter §10.2        |\n| **Silent misfire**     | All steps completed but final screenshot shows wrong screen           | Enter §10.2        |\n| **Partial divergence** | Intermediate screenshot shows wrong state even though later steps ran | Enter §10.2        |\n\nFor silent misfires and partial divergence, echo annotations (§10.5) are your reference for what each screen _should_ look like.\n\n### 10.2 Diagnose\n\n1. Note the failure step index and error message (if hard error).\n2. Call `screenshot` to see where the app actually is now.\n3. Call `describe` or `debugger-component-tree` to get the current element tree.\n4. Compare current state to what the failed step expected. Classify the root cause:\n\n| Root cause       | Symptoms                                                        |\n| ---------------- | --------------------------------------------------------------- |\n| Coordinate drift | Tap succeeded but hit wrong element; elements shifted positions |\n| Missing element  | Target element not present in element tree                      |\n| Wrong screen     | Screenshot shows entirely different page than expected          |\n| Timing           | Element exists in tree but tap missed; loading spinner visible  |\n| State mismatch   | First step fails — executionPrerequisite was not actually met   |\n\n5. State the diagnosis in one sentence before attempting any correction.\n\n### 10.3 Correct\n\nChoose the lightest strategy that fits:\n\n**Strategy 1 — Edit the YAML** (coordinate drift, parameter changes).\nRead `.argent/flows/<flow-name>.yaml`, update the broken step's `x`/`y`, `bundleId`, `text`, or other args. Re-run `flow-execute` to verify.\n\n**Strategy 2 — Manual recovery + continue** (timing/transient issues, one-off replay).\nManually execute the failed step with corrected coordinates from §10.2 discovery, then manually execute remaining steps. Does not fix the YAML — use only when re-recording is not worth it.\n\n**Strategy 3 — Re-record from failure point** (structural changes, new intermediate screens).\nNavigate the app to the state just before the failure point. Call `flow-start-recording` with the same flow name (overwrites). Re-add the working prefix steps via `flow-add-step`, then continue recording new steps from the divergence point. Call `flow-finish-recording`.\n\n**Strategy 4 — Full re-record** (major changes, unclear diagnosis, or 3+ broken steps).\nReset the app to prerequisite state (`restart-app` + `launch-app`). Record from scratch with the same flow name.\n\n**Decision heuristic:**\n\n- 1 step broken, parameter-only change → Strategy 1\n- 1 step broken, transient issue, not worth persisting → Strategy 2\n- 2–3 steps broken or flow structure partially changed → Strategy 3\n- 3+ steps broken, or unclear root cause → Strategy 4\n- Flow used for profiling comparison (must be identical) → Strategy 4\n\n### 10.4 Verify and Bound Retries\n\nAfter applying a correction, re-run `flow-execute` to verify.\n\n- If it succeeds → done. Report what changed (e.g. \"Fixed step 4: updated tap coordinates from 0.5,0.35 to 0.5,0.42\").\n- If it fails at a **different** step → return to §10.2 for a second attempt.\n- If this is already the second correction attempt → **stop**. Report the diagnosis to the user and recommend a full re-record or manual investigation.\n\n**Hard cap: 2 correction cycles.** Do not enter an unbounded fix loop.\n\n### 10.5 Making Flows Resilient\n\nApply these when recording new flows to reduce future breakage:\n\n- **Echo expected state, not just actions.** Write `\"On Settings > General screen, about to tap About\"` not `\"Tap About\"`. During diagnosis these tell you what the screen _should_ look like.\n- **Add screenshot steps after critical navigation.** Insert `screenshot` steps after screen transitions. These produce images in the flow result you can inspect during diagnosis.\n- **Write specific executionPrerequisites.** `\"App on home tab, user logged in, simulator UDID is <X>\"` — not `\"App running\"`. Verify with `screenshot` + `describe` before acknowledging.\n- **Prefer launch-app / open-url over navigation chains.** Deep links are more resilient to layout changes than tap sequences.\n- **Echo accessibility labels for coordinate taps.** When recording a tap, add an echo with the target's label or testID: `\"Tapping 'Submit' button (testID: submit-btn) at 0.5, 0.82\"`. During repair, use `describe` to find the element by label and update coordinates. Only use `screenshot` for permission or system overlays when `describe` cannot expose the target reliably.\n","frontmatter":{"name":"argent-create-flow","description":"Record a reusable flow (scripted sequence of MCP tool calls) that can be replayed later with a single command. Use when the user asks to create, record, or build a flow, or to script a sequence of simulator actions."},"isInternal":false,"tokens":2952,"sizeBytes":12818},{"name":"gesture-examples.md","path":".agents/skills/argent-device-interact/references/gesture-examples.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-device-interact/references/gesture-examples.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `.agents/skills/argent-device-interact/references/gesture-examples.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-device-interact/references/gesture-examples.md)","tokens":300,"sizeBytes":253},{"name":"SKILL.md","path":".agents/skills/argent-device-interact/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-device-interact/SKILL.md","title":"argent-device-interact","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-device-interact\ndescription: Interact with an iOS simulator or Android emulator using argent MCP tools. Use when tapping UI elements, performing gestures, scrolling, typing text, pressing hardware buttons, launching apps, opening URLs, taking screenshots.\n---\n\n## Unified tool surface\n\nAll interaction tools below accept a `udid` parameter and auto-dispatch iOS vs Android based on its shape (UUID → iOS simulator, anything else → Android adb serial). You use the same tool names on both platforms.\n\nFor platform-specific caveats (Metro `adb reverse`, locked-screen describe errors, etc.), see § 9 Platform-specific notes at the bottom.\n\n## 1. Before You Start\n\nIf you delegate simulator tasks to sub-agents, make sure they have MCP permissions.\n\nUse `list-devices` to get a target id. Results are tagged with `platform` (`ios` or `android`); booted/ready devices come first. Pick the first entry that matches the platform you need — if none are ready, call `boot-device` with `udid` (iOS) or `avdName` (Android). See `argent-ios-simulator-setup` / `argent-android-emulator-setup` for full setup flow.\n\n**Load tool schemas before first use.** Gesture tools (`gesture-tap`, `gesture-swipe`, `gesture-pinch`, `gesture-rotate`, `gesture-custom`) may be deferred — their parameter schemas are not loaded until fetched. Always use ToolSearch to load the schemas of all gesture tools you plan to use **before** calling any of them. If you skip this step, parameters may be coerced to strings instead of numbers, causing validation errors.\n\n## 2. Best Practices\n\n1. **Always refer to tapping_rule** from your argent.md rule before tapping.\n2. Before performing interactions, consider whether they can be **dispatched sequentially** - more on that in `run-sequence`.\n3. **Use `gesture-swipe` for lists/scrolling**, not `gesture-custom`, unless you need non-linear movement. Consider whether you need multiple swipes, if yes - use `run-sequence`.\n4. **Tap a text field before typing** — on iOS try `paste` first then fall back to `keyboard`; on Android use `keyboard` directly (`paste` is iOS-only).\n5. **Coordinates are normalized** — always 0.0–1.0, not pixels.\n6. **For native iOS app navigation, prefer `describe` first.** It works on any screen without app restart. Do not navigate from screenshots on regular in-app screens unless `describe` failed to expose a reliable target. Use `native-describe-screen` only when you need app-scoped UIKit properties.\n\n## 3. Opening Apps\n\n**Never navigate to an app by tapping home-screen icons.** Use `launch-app` or `open-url` — they are instant and reliable.\n\n### launch-app — by bundle ID\n\n```json\n{ \"udid\": \"<UDID>\", \"bundleId\": \"com.apple.MobileSMS\" }\n```\n\nCommon IDs: `com.apple.MobileSMS` (Messages), `com.apple.mobilesafari` (Safari), `com.apple.Preferences` (Settings), `com.apple.Maps`, `com.apple.Photos`, `com.apple.mobilemail`, `com.apple.mobilenotes`, `com.apple.MobileAddressBook` (Contacts)\n\n### open-url — by URL scheme\n\n```json\n{ \"udid\": \"<UDID>\", \"url\": \"messages://\" }\n```\n\nCommon schemes: `messages://`, `settings://`, `maps://?q=<query>`, `tel://<number>`, `mailto:<address>`, `https://...` (Safari)\n\n## 4. Choosing the Right Tool\n\n| Action           | Tool             | Notes                                                                  |\n| ---------------- | ---------------- | ---------------------------------------------------------------------- |\n| Multiple actions | `run-sequence`   | Batch steps in one call (no intermediate screenshots)                  |\n| Open an app      | `launch-app`     | **Always — never tap home-screen icons**                               |\n| Restart an app   | `restart-app`    | Terminate and relaunch by bundle ID                                    |\n| Open URL/scheme  | `open-url`       | Web pages, deep links, URL schemes                                     |\n| Single tap       | `gesture-tap`    | Buttons, links, checkboxes                                             |\n| Scroll/swipe     | `gesture-swipe`  | Straight-line scroll or swipe                                          |\n| Long press       | `gesture-custom` | Context menus, drag start                                              |\n| Drag & drop      | `gesture-custom` | Complex drag interactions                                              |\n| Pinch/zoom       | `gesture-pinch`  | Two-finger pinch with auto-interpolation                               |\n| Rotation         | `gesture-rotate` | Two-finger rotation with auto-interpolation                            |\n| Custom gesture   | `gesture-custom` | Arbitrary touch sequences, optional interpolation                      |\n| Hardware key     | `button`         | Home, back, power, volume, appSwitch, actionButton                     |\n| Type text (fast) | `paste`          | iOS only. Form fields — uses clipboard                                 |\n| Type text        | `keyboard`       | iOS+Android. Fallback when paste fails; supports Enter, Escape, arrows |\n| Rotate device    | `rotate`         | Orientation changes                                                    |\n\n## 5. Finding Tap Targets\n\nIMPORTANT. When moved to a different screen after an action or do not know the coordinates of component, **always** perform proper discovery first.\n\n| App type                          | Discovery tool            | What it returns                                                                                                                                                                                                               |\n| --------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Target app discovery              | `describe`                | Accessibility element tree for the current device screen (iOS AX-service or Android uiautomator) with normalized frame coordinates. Works on any app, system dialogs, and Home screen — no app restart or `bundleId` required |\n| React Native                      | `debugger-component-tree` | React component tree with names, text, testID, and (tap: x,y)                                                                                                                                                                 |\n| App-scoped native                 | `native-describe-screen`  | Low-level app-scoped accessibility elements with normalized and raw coordinates; requires `bundleId`                                                                                                                          |\n| Permission / system modal overlay | `describe`                | `describe` detects system dialogs automatically and returns dialog buttons with tap coordinates. Fall back to `screenshot` only if `describe` does not expose the controls                                                    |\n| Final visual fallback             | `screenshot`              | Use only when discovery tools cannot inspect the current UI reliably. Do not derive routine in-app navigation targets from screenshots                                                                                        |\n\nPoint follow-up native diagnostics after you already have a candidate point:\n\n- `native-user-interactable-view-at-point`: deepest native view that would receive touch at a known raw iOS point; requires `bundleId`\n- `native-view-at-point`: deepest visible native view at a known raw iOS point; requires `bundleId`\n\n### If `describe` Fails\n\nRead the exact error and choose the action that matches it:\n\n- Error mentions `ax-service` not available or daemon startup failure:\n  the ax-service daemon could not start. Check that the simulator is booted. Use `screenshot` as a temporary fallback, or use `native-describe-screen` with an explicit `bundleId` if the app has native devtools injected.\n- `describe` returns an empty element list:\n  the screen may be blank, loading, or showing content without accessibility labels. Use `screenshot` to see what is visible, then retry after the content has loaded.\n- `describe` succeeds but is not detailed enough for a React Native app:\n  use `debugger-component-tree` next.\n- You need app-scoped inspection with full UIKit properties (`accessibilityIdentifier`, `viewClassName`):\n  use `native-describe-screen` with an explicit `bundleId`. This requires native devtools (dylib) injection — call `restart-app` first if needed.\n- You already have a candidate point and want to confirm what would actually receive touch:\n  use `native-user-interactable-view-at-point`. Use `native-view-at-point` when you want the visually deepest view instead of the hit-test target.\n\n## 6. Tool Usage\n\n### gesture-tap — Single tap at a point\n\n```json\n{ \"udid\": \"<UDID>\", \"x\": 0.5, \"y\": 0.5 }\n```\n\nCoordinates: `0.0` = left/top, `1.0` = right/bottom.\n\nBefore tapping near the bottom of the screen in React Native apps, check that \"Open Debugger to View Warnings\" banners are not visible — tapping them breaks the debugger connection. Close them with the X icon if present.\n\n### gesture-swipe — Straight-line gesture\n\n```json\n{ \"udid\": \"<UDID>\", \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 }\n```\n\nSwipe **up** (`fromY > toY`) = scroll content **down**. Default duration: 300ms. Optional: `\"durationMs\": 500` for slower swipe.\n\n### gesture-pinch — Two-finger pinch\n\n```json\n{ \"udid\": \"<UDID>\", \"centerX\": 0.5, \"centerY\": 0.5, \"startDistance\": 0.2, \"endDistance\": 0.6 }\n```\n\nAll values are normalized 0.0–1.0 (fractions of screen, not pixels) — same as all other gesture tools. `startDistance: 0.2` means fingers start 20% of the screen apart; `endDistance: 0.6` means they end 60% apart. `startDistance < endDistance` = pinch out (zoom in). `startDistance > endDistance` = pinch in (zoom out). Defaults: `angle: 0` (horizontal), `durationMs: 300`. Optional: `\"angle\": 90` for vertical axis, `\"durationMs\": 500` for slower pinch.\n\n### gesture-rotate — Two-finger rotation\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"centerX\": 0.5,\n  \"centerY\": 0.5,\n  \"radius\": 0.15,\n  \"startAngle\": 0,\n  \"endAngle\": 90\n}\n```\n\nAll positions and radius are normalized 0.0–1.0 (fractions of screen, not pixels). `radius: 0.15` means each finger is 15% of the screen away from center. `endAngle > startAngle` = clockwise. Default duration: 300ms. Optional: `\"durationMs\": 500` for slower rotation.\n\n### gesture-custom — Custom touch sequence\n\nFor long-press, drag-and-drop, and other complex sequences, see `references/gesture-examples.md`. Set `\"interpolate\": 10` to auto-generate smooth intermediate Move events between keyframes.\n\n### button — Hardware button press\n\n```json\n{ \"udid\": \"<UDID>\", \"button\": \"home\" }\n```\n\nValues: `home`, `back`, `power`, `volumeUp`, `volumeDown`, `appSwitch`, `actionButton`\n\n### paste — Type text into focused field (iOS only)\n\n```json\n{ \"udid\": \"<UDID>\", \"text\": \"Hello, world!\" }\n```\n\nTap the field first, then paste. Fall back to `keyboard` if it doesn't work. On Android the call is rejected by the capability gate (\"Tool 'paste' is not supported on android\") — use `keyboard` directly.\n\n### keyboard — Type text or press special keys\n\n```json\n{ \"udid\": \"<UDID>\", \"text\": \"search query\", \"key\": \"enter\" }\n```\n\nSpecial keys: `enter`, `escape`, `backspace`, `tab`, `space`, `arrow-up`, `arrow-down`, `arrow-left`, `arrow-right`, `f1`–`f12`. Optional: `\"delayMs\": 100` between keystrokes (default 50ms).\n\n### rotate — Change orientation\n\n```json\n{ \"udid\": \"<UDID>\", \"orientation\": \"LandscapeLeft\" }\n```\n\nValues: `Portrait`, `LandscapeLeft`, `LandscapeRight`, `PortraitUpsideDown`\n\n---\n\n## 7. Screenshots\n\nUse the explicit `screenshot` tool only when:\n\n- You need the initial screen state before any action.\n- The auto-attached screenshot shows a transitional or loading frame.\n- You require extra context.\n- You want to check state after a delay (e.g. waiting for a network response).\n- A permission dialog, system alert, or native modal overlay is visible and `describe` did not expose reliable targets.\n\nWhen using `screenshot` for permission or native modal navigation:\n\n- Do not switch to screenshot-driven navigation just because a modal is visible. On regular app screens and in-app modals, keep using `describe`.\n- Prefer obvious, centered alert buttons such as `Allow`, `OK`, `Don't Allow`, `Not Now`, or `Continue`.\n- Tap one control at a time and inspect the returned auto-screenshot before doing anything else.\n- After the modal is dismissed, return to normal discovery with `describe`, `native-describe-screen`, or `debugger-component-tree`.\n\nOptional rotation parameter: `{ \"udid\": \"<UDID>\", \"rotation\": \"LandscapeLeft\" }` — rotates the capture without changing simulator orientation.\n\nScreenshots are downscaled by default (30% of original resolution) to reduce context size. `scale` accepts values from 0.01 to 1.0. If UI elements are hard to read or you need to inspect fine detail, pass `scale: 1.0` to get full resolution: `{ \"udid\": \"<UDID>\", \"scale\": 1.0 }`.\n\n### Troubleshooting\n\n| Problem                 | Solution                                                      |\n| ----------------------- | ------------------------------------------------------------- |\n| Screenshot times out    | Restart the simulator-server via `stop-simulator-server` tool |\n| No booted iOS simulator | Call `boot-device` with the iOS `udid`                        |\n| No ready Android device | Call `boot-device` with `avdName`                             |\n\n---\n\n## 8. Action Sequencing with `run-sequence`\n\nUse `run-sequence` to batch multiple interaction steps into **a single tool call**. Only one screenshot is returned — after all steps complete. Use cases:\nscrolling multiple times, typing and submitting automatically, known sequence of multiple taps, rotating device back and forth.\n\nDo **not** use `run-sequence` when any step depends on observing the result of a previous step\n\n### Use cases\n\nUse the sequencing when:\n\n- Knowing that some action needs multiple steps without necessarily immediate insight of screenshot\n- \"scroll to bottom\", \"scroll to top\", \"scroll to do X\" -> sequence scroll 3-5 times\n- form interactions, \"clear and retype field\" -> you may use triple-tap to select all, type new value\n- \"submit form\" → fill all fields in sequence, tap submit\n- \"go back to X\" → defined tap sequence for the navigation\n\n### Allowed tools inside `run-sequence`\n\n`gesture-tap`, `gesture-swipe`, `gesture-custom`, `gesture-pinch`, `gesture-rotate`, `button`, `keyboard`, `rotate`\n\nThe `udid` is shared — do **not** include it in each step's `args`. Optional `delayMs` per step (default 100ms).\n\n### Examples\n\nScroll down three times:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } },\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } },\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } }\n  ]\n}\n```\n\nType into a focused field and submit:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"keyboard\", \"args\": { \"text\": \"hello world\" } },\n    { \"tool\": \"keyboard\", \"args\": { \"key\": \"enter\" } }\n  ]\n}\n```\n\nTap a known button, then scroll down:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"gesture-tap\", \"args\": { \"x\": 0.5, \"y\": 0.15 } },\n    {\n      \"tool\": \"gesture-swipe\",\n      \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 },\n      \"delayMs\": 300\n    }\n  ]\n}\n```\n\nStops on the first error and returns partial results.\n\n---\n\n## 9. Platform-specific notes\n\n### Android\n\n- **Metro reachability**: run `adb reverse tcp:8081 tcp:8081` on the device before the RN app starts, or Metro won't be reachable from the device. See `argent-metro-debugger` for the full workflow. Re-run if the device restarts.\n- **First-launch permission prompts**: `reinstall-app` on Android always installs with `-g` so runtime permissions are pre-granted on first launch — no flag to pass.\n- **Locked screen / secure surfaces**: `describe` throws a clear error if it can't capture (keyguard, DRM, Play Integrity). Unlock the device or fall back to `screenshot`.\n- **APK vs .app in `reinstall-app`**: pass `.apk` absolute path on Android; `.app` directory on iOS.\n\n### iOS\n\n_(no iOS-only gotchas collected here yet — add them as they come up)_\n","frontmatter":{"name":"argent-device-interact","description":"Interact with an iOS simulator or Android emulator using argent MCP tools. Use when tapping UI elements, performing gestures, scrolling, typing text, pressing hardware buttons, launching apps, opening URLs, taking screenshots."},"isInternal":false,"tokens":3862,"sizeBytes":16586},{"name":"SKILL.md","path":".agents/skills/argent-ios-simulator-setup/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-ios-simulator-setup/SKILL.md","title":"argent-ios-simulator-setup","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-ios-simulator-setup\ndescription: Set up and connect to an iOS simulator using argent MCP tools. Use when starting a new session, booting a simulator, getting a simulator UDID, or before any simulator interaction task.\n---\n\n## 1. Setup Steps\n\nIf you delegate simulator tasks to sub-agents, make sure they have MCP permissions.\n\n1. **Find a booted simulator**\n   Use `list-devices`. Filter for entries with `platform: \"ios\"` — booted iPhones are listed first.\n   If none are booted, call `boot-device` with `udid: <chosen UDID>`.\n\n2. **Verify connection**\n   All interaction tools (`gesture-tap`, `gesture-swipe`, `gesture-custom`, etc.) auto-start the server if not already running.\n\n## 2. Notes\n\n- UDIDs look like: `A1B2C3D4-E5F6-7890-ABCD-EF1234567890`\n","frontmatter":{"name":"argent-ios-simulator-setup","description":"Set up and connect to an iOS simulator using argent MCP tools. Use when starting a new session, booting a simulator, getting a simulator UDID, or before any simulator interaction task."},"isInternal":false,"tokens":204,"sizeBytes":773},{"name":"failure-scenarios.md","path":".agents/skills/argent-metro-debugger/references/failure-scenarios.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/references/failure-scenarios.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `.agents/skills/argent-metro-debugger/references/failure-scenarios.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/references/failure-scenarios.md)","tokens":300,"sizeBytes":253},{"name":"source-maps.md","path":".agents/skills/argent-metro-debugger/references/source-maps.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/references/source-maps.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `.agents/skills/argent-metro-debugger/references/source-maps.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/references/source-maps.md)","tokens":300,"sizeBytes":241},{"name":"SKILL.md","path":".agents/skills/argent-metro-debugger/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/SKILL.md","title":"argent-metro-debugger","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-metro-debugger\ndescription: Debug a React Native app via Metro CDP using argent debugger tools. Use when connecting to Metro, inspecting React components, reading console logs, or evaluating JavaScript in the app runtime.\n---\n\n## 1. Prerequisites\n\nThe debugger requires **Metro dev server running** (default `localhost:8081`) and **a React Native app connected to Metro** (at least one CDP target). Verify via `debugger-status`.\n\n### Android: reverse port for Metro\n\nAndroid emulators and physical devices do not resolve the host's `localhost` by default. Before the RN app can reach Metro, forward port 8081 (or whichever port Metro is on) from the device back to the host:\n\n```bash\nadb -s <serial> reverse tcp:8081 tcp:8081\n```\n\n`<serial>` is the Android `serial` from `list-devices`. Once reversed, the app on the device connects to Metro just like an iOS simulator does, and all `debugger-*` / `network-*` / `react-profiler-*` tools work unchanged. If the device restarts or adb drops, re-run the command. A failing Metro connection on Android almost always means `adb reverse` has not been done or has been lost.\n\n## 2. Tool Overview\n\nAll tools accept `port` (default 8081) AND `device_id` (the iOS Simulator UDID or Android serial, a.k.a. `logicalDeviceId` — the CDP-reported id that matches the device). Always make sure you target the correct app on the correct device.\n\nOne Metro port can serve multiple connected devices (e.g. two simulators on `localhost:8081`, or an iOS simulator alongside an Android emulator with `adb reverse` set up). `device_id` pins every debugger/network/profiler call to a specific device so sessions do not collide.\n\n### Connect & diagnostics\n\n| Tool               | Purpose                                                                                                                                                                                                                   |\n| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `debugger-connect` | Connect to Metro CDP. Returns port, projectRoot, deviceName, appName, `logicalDeviceId`, isNewDebugger, connected. The returned `logicalDeviceId` is the `device_id` for every subsequent debugger/network/profiler call. |\n| `debugger-status`  | Like connect + loadedScripts, enabledDomains, sourceMapReady. **Use to diagnose.**                                                                                                                                        |\n\n### Reload & recovery\n\n| Tool                    | Purpose                                                                                  |\n| ----------------------- | ---------------------------------------------------------------------------------------- |\n| `debugger-reload-metro` | Reload all connected apps (like pressing \"r\" in Metro terminal). Needs a CDP target.     |\n| `restart-app`           | Terminate and relaunch the app by UDID and bundleId. Use when app lost Metro connection. |\n\n### Inspection & console\n\n| Tool                       | Purpose                                                                                                                                                                   |\n| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `debugger-component-tree`  | Full React fiber tree (names, depth, bounding rects, tap coordinates).                                                                                                    |\n| `debugger-inspect-element` | Inspect at (x, y) using **logical pixel coordinates** (not normalized 0-1): component hierarchy with source file:line and code fragment. See `references/source-maps.md`. |\n| `debugger-log-registry`    | Get log summary (counts, clusters, file path). Then use `Grep`/`Read` on the flat log file for details.                                                                   |\n| `debugger-evaluate`        | Run a JS expression in the app runtime.                                                                                                                                   |\n\n---\n\n## 3. Component Inspection\n\n### `debugger-component-tree` vs `debugger-inspect-element`\n\n|          | `debugger-component-tree`                                              | `debugger-inspect-element`                                      |\n| -------- | ---------------------------------------------------------------------- | --------------------------------------------------------------- |\n| Best for | Layout overview; finding tap targets; user-defined component hierarchy | Identifying a visible element and tracing it to its source file |\n| Use when | \"What's on screen and where?\"                                          | \"What component is this and where is it defined?\"               |\n\nBoth can point to source files, but `inspect-element` is purpose-built for source tracing. `component-tree` is for orientation and tap-target discovery.\n\n### `includeSkipped` guidance\n\nApplies to both `debugger-component-tree` and `debugger-inspect-element`. Set to `true` only when debugging filter behavior — e.g., an expected component is missing from output, or you need to inspect a very specific branch of the tree (not just an overview).\n\n> **Warning:** Output can be very large. Always combine with `maxNodes` (component-tree) or `maxItems` (inspect-element) and increase it incrementally (e.g., start at 50, then grow). Do not use `includeSkipped` without a limit on large apps.\n\n---\n\n## 4. Golden Rules\n\n1. **`debugger-status` first when something fails** — it runs discovery, connection, and returns diagnostics.\n2. **\"No CDP targets\" → get the app to connect to Metro** — use `restart-app` on simulator, then retry `debugger-status`.\n3. **Never assume one failure is permanent** — follow recovery steps before asking the user. For starting Metro and full failure recovery, see `argent-react-native-app-workflow` and `references/failure-scenarios.md`.\n\n---\n\n## 5. Reading Console Logs (Log Registry)\n\nLogs are written to a flat log file on disk. Use the **log-registry → grep** pattern instead of reading logs inline.\n\n### Workflow\n\n1. **Call `debugger-log-registry`** — returns: `file` (log path), `totalEntries`, `byLevel`, `clusters` (top message groups with counts and source file info)\n2. **Search the file** using `Grep` or `Read` with patterns from the response.\n\n> **Large log files:** If `totalEntries` exceeds 10 000, delegate the grep exploration to an `Explore` subagent — pass it the file path, the entry format, and the patterns you need.\n\n### Flat log format\n\nOne entry per line — fields (whitespace-separated, `|` delimiter before message)\n\n| Field         | Example                     | Notes                                               |\n| ------------- | --------------------------- | --------------------------------------------------- |\n| `[L:<id>]`    | `[L:42]`                    | Unique grep anchor                                  |\n| `<timestamp>` | `2026-03-17T14:30:00.000Z`  | ISO 8601                                            |\n| `<LEVEL>`     | `ERROR`, `WARN `, `LOG  `   | Uppercase, padded to 5 chars                        |\n| `<source>`    | `src/api/user.ts:42` or `-` | Relative path from source map; `-` if unavailable   |\n| `<message>`   | `Failed login attempt`      | Full message; embedded newlines replaced with space |\n\nSource attribution (file + line) is also available in `clusters` returned by `debugger-log-registry`.\n\nLog files and messages can be large - **Always scope your search**, treat the file like a database, not a document.\n\nWhen reading from the log file:\n\n- Never `Read` the log file directly. Use `grep` or shell commands with limits using the above file format tips.\n- Default to `-m 50` unless you need more.\n- Use `tail -N` recent entries.\n- `clusters[].message` gives you the exact text which you may look for\n\n> **If the file is too large** Delegate to an `Explore` subagent with the file path, the format spec above, and the specific patterns you need.\n\n---\n\n## Quick Reference\n\n| Action                        | Tool                                                                |\n| ----------------------------- | ------------------------------------------------------------------- |\n| Diagnose / check connection   | `debugger-status`                                                   |\n| Connect to Metro CDP          | `debugger-connect`                                                  |\n| Reload JS (already connected) | `debugger-reload-metro`                                             |\n| Relaunch app on simulator     | `restart-app`                                                       |\n| Inspect component at point    | `debugger-inspect-element`                                          |\n| Full component tree           | `debugger-component-tree`                                           |\n| Console log overview          | `debugger-log-registry` (summary + log file path for `Grep`/`Read`) |\n| Evaluate JS                   | `debugger-evaluate`                                                 |\n","frontmatter":{"name":"argent-metro-debugger","description":"Debug a React Native app via Metro CDP using argent debugger tools. Use when connecting to Metro, inspecting React components, reading console logs, or evaluating JavaScript in the app runtime."},"isInternal":false,"tokens":1762,"sizeBytes":9446},{"name":"SKILL.md","path":".agents/skills/argent-native-profiler/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-native-profiler/SKILL.md","title":"argent-native-profiler","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-native-profiler\ndescription: Native profiling for CPU hotspots, UI hangs, and memory leaks. Currently iOS-only (xctrace-backed); Android support (Perfetto/simpleperf) is on the roadmap. Use when diagnosing native-level performance issues.\n---\n\n## 1. Tools\n\n- `native-profiler-start` — start profiling on a booted device. iOS: xctrace recording for CPU, hangs, and leaks.\n- `native-profiler-stop` — stop the profiler and export trace data to timestamped XML files.\n- `native-profiler-analyze` — parse exported trace data and return a structured bottleneck payload.\n- `profiler-stack-query` — drill into parsed data: hang stacks, function callers, thread breakdown, leak details.\n- `profiler-load` — list and reload previous trace sessions from disk for re-investigation.\n\n---\n\n## 2. Platform Support\n\n- **iOS**: Fully supported. Backend: Xcode Instruments via `xctrace` on a booted simulator or connected device. Requires Xcode command-line tools on PATH.\n- **Android**: Not yet implemented. An Android backend (Perfetto or simpleperf via `adb`) is planned; today `native-profiler-start` rejects Android serials with a clear \"iOS-only for now\" error.\n\n---\n\n## 3. Investigation Patterns\n\nAfter `native-profiler-analyze` surfaces findings, use `profiler-stack-query` to drill into root causes:\n\n- **Hang detected** → `profiler-stack-query` mode=`hang_stacks` for full native call chains → mode=`function_callers` for the suspected function → read native source.\n- **CPU hotspot** → `profiler-stack-query` mode=`thread_breakdown` for per-thread distribution → mode=`function_callers` for the dominant function.\n- **Memory leak** → `profiler-stack-query` mode=`leak_stacks` filtered by `object_type` for responsible frames and libraries.\n\nAfter presenting findings, ask the user whether to investigate further, implement fixes, or stop. After applying fixes, always re-profile the same scenario and compare with `profiler-load`. Report honestly whether the target metric improved, regressed, or stayed flat. If the fix showed no net benefit or introduced regressions elsewhere, say so and reconsider.\n\n**Tip:** For reproducible before/after comparisons, record the interaction sequence as a flow using the `argent-create-flow` skill before the first profiling run. Replay with `flow-execute` on subsequent runs to eliminate interaction variance.\n\n> **Note:** The `argent-react-native-profiler` instructs to start native profiling automatically alongside React profiling. This skill's workflow and investigation patterns apply in both cases.\n\n---\n\n## 4. Workflow\n\n**Complete all steps in order — do not break mid-flow.**\n\n### Step 0: Ensure the target app is running\n\nThe `native-profiler-start` tool **auto-detects** the running app on the device.\nYou do not need to derive `app_process` manually — just make sure the app is launched.\n\n1. If the app is already running on the device, skip to Step 1 (do not pass `app_process`).\n2. If the app is not running, use `launch-app` with the correct bundle ID first.\n3. Only pass `app_process` explicitly if the tool reports multiple running user apps and you need to disambiguate.\n\n> **Note**: If multiple build flavors are installed (dev, staging, prod), the tool will detect whichever one is currently running. If both are running, it will ask you to specify.\n\n### Step 1: Start recording\n\nCall `native-profiler-start` with `device_id` (iOS UDID; Android not yet supported). The tool auto-detects the running app and saves the trace to `/tmp/argent-profiler-cwd/` with a timestamped filename.\nLet the user interact with the app or drive interaction via simulator tools (see `argent-device-interact` skill).\n\n### Step 2: Stop and export\n\nCall `native-profiler-stop` with `device_id`. On iOS this sends SIGINT to xctrace, waits for trace packaging, and exports CPU, hangs, and leaks data to XML. Check `exportDiagnostics` in the response for any export warnings.\n\n### Step 3: Analyze\n\nCall `native-profiler-analyze` with `device_id`. Returns a markdown report with bottlenecks categorized as CPU hotspots, UI hangs, or memory leaks, sorted by severity.\n\n### Step 4: Present findings and ask about next steps\n\nPresent a concise summary of the key findings. Then follow the \"After analysis\" guideline — ask whether to investigate further with query tools, implement fixes, or stop.\n\n### Step 5: Drill-down investigation\n\nUse `profiler-stack-query` to investigate specific findings. See §3 Investigation Patterns for chaining guidance.\n\n### Step 6: Reload previous sessions\n\nTo revisit a previous trace:\n\n1. Call `profiler-load` mode=`list` to see available sessions.\n2. Call `profiler-load` mode=`load_native` session_id=`<timestamp>` device_id=`<UDID>` to re-parse the XML files.\n3. Use `profiler-stack-query` to investigate the reloaded data.\n\n---\n\n## 5. Understanding Results\n\nBottlenecks are categorized by severity:\n\n- **RED**: CPU functions taking >15% of total time, all UI hangs, all memory leaks. These require immediate attention.\n- **YELLOW**: CPU functions taking 5-15% of total time. Worth investigating but may be acceptable.\n\nEach bottleneck type indicates a different class of problem:\n\n- **CPU hotspots**: Native functions consuming excessive CPU time. Look for tight loops, expensive computations, or redundant work.\n- **UI hangs**: Main thread blocked long enough to cause visible jank or unresponsiveness. Often caused by synchronous I/O, heavy layout passes, or lock contention.\n- **Memory leaks**: Objects allocated but never freed. Common causes include retain cycles, unclosed resources, or forgotten observers.\n\n---\n\n## 6. Important Caveats\n\n- **Simulator vs device**: Simulator profiling reflects host Mac performance, not real device hardware. Use device profiling for accurate CPU timings and memory behavior.\n- **xctrace availability (iOS)**: Requires Xcode command-line tools installed. Verify with `xcrun xctrace version`.\n- **Profiler overhead**: xctrace instrumentation adds CPU load. If `JSLexer`, `JSONEmitter`, or Hermes runtime internals dominate the JS thread in CPU hotspot results, those reflect profiler overhead — not app work. Discount those entries when evaluating findings.\n- **Run-to-run variance**: Small fluctuations in CPU percentages between runs are normal. Treat only consistent directional changes (across 2+ runs or >15% delta) as actionable signal.\n- **Live data variability**: If the app fetches live API data, different responses between runs change rendering workload independently of code changes. Note when data-dependent screens show variance.\n","frontmatter":{"name":"argent-native-profiler","description":"Native profiling for CPU hotspots, UI hangs, and memory leaks. Currently iOS-only (xctrace-backed); Android support (Perfetto/simpleperf) is on the roadmap. Use when diagnosing native-level performance issues."},"isInternal":false,"tokens":1450,"sizeBytes":6589},{"name":"SKILL.md","path":".agents/skills/argent-react-native-app-workflow/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-app-workflow/SKILL.md","title":"argent-react-native-app-workflow","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-react-native-app-workflow\ndescription: Step-by-step workflows for developing or debugging React Native apps on iOS simulator or Android emulator. Use when starting the app, debugging Metro, fixing builds, diagnosing runtime errors, or running tests.\n---\n\n## 1. Starting the React Native App\n\n### 1.1 Explore Configuration (MANDATORY — Do This First)\n\n**Before running commands**, read the project's build and run configuration from the `argent-environment-inspector` subagent result.\n\nDo NOT default to `npx react-native start` or `npx react-native run-ios` without first checking for custom scripts and workflows.\n\n**Manual fallback** (if neither the agent nor the tool is available): read ALL `package.json` scripts — look for custom scripts like `start:local`, `start:dev`, `ios`, `build:ios`, flavors, etc. Custom scripts take priority over default commands. Also check `metro.config.js` for non-default port or watchFolders. For iOS builds, prefer opening `.xcworkspace` over `.xcodeproj` (CocoaPods generates the workspace).\n\n**If the project structure is convoluted, ask the user before proceeding.**\n\n**Remember the workflow:** Once you discover the project's build/run workflow, save it to project memory so you don't need to re-discover it each time.\n\n**Checklist before start:**\n\n- [ ] `node_modules` present (if not: `bun install`)\n- [ ] For iOS: `ios/Podfile` exists; if `ios/Pods` missing or stale, run `cd ios && pod install && cd ..`\n- [ ] No conflicting Metro on default port (see 1.2)\n\n### 1.2 Start Metro\n\n1. Check whether metro is already running on port found in configuration and if it is - do not start another server. Refer to point 2.1.\n\n1. **Use the project's custom start script if one exists** (e.g. `npm run start:local`, `yarn start:dev`). In this monorepo:\n\n   ```bash\n   bun mobile start\n   ```\n\n   Fall back to `npx react-native start` only if no project script exists. Optional: `bun mobile start --reset-cache` if cache issues are suspected.\n\n1. **Verify Metro is ready**: use the `debugger-status` tool to verify Metro is running and reachable.\n\n1. **Projects with flavors or custom configs**: Use project-specific start script if present (e.g. `npm run start:local`), and start Metro **before** running the app.\n\n### 1.3 Run the App\n\nIn a **separate** terminal (Metro keeps running in the first):\n\n**Use the project's custom build/run script if one exists** (e.g. `npm run ios`, `npm run android`, `yarn ios:debug`). Only fall back to the default if no custom scripts are defined:\n\n```bash\nnpx react-native run-ios       # iOS\nnpx react-native run-android   # Android\n```\n\nOptional: specify the target device, e.g. `npx react-native run-ios --simulator=\"iPhone 16\"` or `npx react-native run-android --deviceId=<serial>`.\n\n**Android only**: after install, run `adb -s <serial> reverse tcp:8081 tcp:8081` so the emulator/device can reach Metro on your host. Repeat if the device restarts or adb drops.\n\n**Agent checklist:**\n\n- [ ] Metro is already running and shows \"ready\"\n- [ ] Command run from project root\n- [ ] If the device isn't booted: use `boot-device` with the iOS `udid` or Android `avdName`. Refer to the `argent-ios-simulator-setup` / `argent-android-emulator-setup` skill.\n- [ ] Android: `adb -s <serial> reverse tcp:8081 tcp:8081` done.\n\n---\n\n## 2. Ensuring / Debugging Metro\n\n### 2.1 Check for Existing Metro\n\nBefore starting Metro, avoid \"port already in use\" errors. Default port to check is :8081, infer the port from documentation:\n\n```bash\nlsof -i :PORT\n```\n\n- **No output** → Port free; safe to start Metro.\n- **Output with PID** → Another process is using the port.\n\nUse the `debugger-status` tool to check whether the process on that port is actually a Metro server. If not Metro — ask the user whether you may kill the process.\n\nTo kill a Metro process, use the `stop-metro` tool (requires user confirmation).\n\n### 2.2 Confirm Correct Server Connection\n\n- **App must point at the same host/port as the running Metro.** Default: same machine, port 8081.\n- **iOS Simulator:** By default uses localhost; no extra config needed for same-machine Metro.\n\n**Verify Metro is reachable:** use the `debugger-status` tool.\n\n### 2.3 Reload the App (Ensure New Bundle)\n\nAfter code or config changes, the app must load the new bundle:\n\n| Method      | How                                                                                               |\n| ----------- | ------------------------------------------------------------------------------------------------- |\n| Reload tool | Use the `debugger-reload-metro` tool                                                              |\n| Restart app | Use the `restart-app` tool, or kill the app in simulator and run `npx react-native run-ios` again |\n\n**Agent checklist:**\n\n- [ ] Only one Metro process (no duplicate on port)\n- [ ] App was started after Metro was ready\n- [ ] When needing to reload: refer to 2.3\n\n---\n\n## 3. Build / Install / Retry (React Native & iOS Native)\n\n### 3.1 When Build Fails (e.g. xcodebuild exit code 65)\n\n**Order of operations (simplest first):**\n\n1. Clean build folder, then retry the build command\n2. Clear caches and reinstall dependencies: reset Metro cache, `watchman watch-del-all`, remove `node_modules` + lockfile, `bun install`, then `cd ios && rm -rf build Pods Podfile.lock && pod install --repo-update`\n3. CocoaPods issues: `pod deintegrate` then `pod install --repo-update`\n4. Open `ios/*.xcworkspace` in Xcode for detailed errors in the Report navigator\n\n### 3.2 When to Ask the User\n\n**After 2-3 failed build or run attempts, STOP and ask the user for guidance.** The user may know about required env vars, Xcode version requirements, custom build configurations, monorepo-specific setup, or required external services.\n\nIf the project structure is convoluted and the correct build approach is not obvious, **ask the user early** rather than guessing.\n\n### 3.3 Saving Build Workflow for Later\n\nOnce you discover the correct build/run workflow for a project, **save it to project memory**. Capture: commands to start Metro, commands to build/run the app, and any required environment setup.\n\n### 3.4 When to Reinstall vs Refresh\n\n| Situation                                             | Action                                                                                |\n| ----------------------------------------------------- | ------------------------------------------------------------------------------------- |\n| JS/React only changed                                 | Use `debugger-reload-metro` tool. No rebuild.                                         |\n| Native code or `pod install` / project config changed | Rebuild: `npx react-native run-ios` (Metro can stay running).                         |\n| `node_modules` or `package.json` changed              | `bun install`, then if native deps changed run `cd ios && pod install`. Then rebuild. |\n| App needs reinstalling from .app path                 | Use `reinstall-app` tool with UDID, bundle ID, and .app path.                         |\n| Persistent native build errors                        | Full clean + reinstall (step 2 above).                                                |\n\n### 3.5 Device Control\n\n| Action                     | Tool / Command                                                         |\n| -------------------------- | ---------------------------------------------------------------------- |\n| List devices               | `list-devices` tool (iOS + Android)                                    |\n| Boot an iOS simulator      | `boot-device` tool with `udid`                                         |\n| Boot an Android emulator   | `boot-device` tool with `avdName`                                      |\n| Launch an app              | `launch-app` tool (pass device id + bundle id / package name)          |\n| Restart an app             | `restart-app` tool (pass device id + bundle id / package name)         |\n| Open a URL / deep link     | `open-url` tool (pass device id + URL)                                 |\n| Rotate device              | `rotate` tool                                                          |\n| Stop simulator server      | `stop-simulator-server` tool (iOS UDID or Android serial — one device) |\n| Stop all simulator servers | `stop-all-simulator-servers` tool (iOS + Android)                      |\n\nFor full simulator setup workflow, refer to the `argent-ios-simulator-setup` skill.\n\n### 3.6 Verifying Local Release-Variant Builds — Stale-Code Gotchas\n\n**Applies to Android local release-variant builds** (`bun mobile android:<flavor>:release:local`, i.e. `apps/mobile/scripts/runAndroidLocal.sh`). Release variants **embed the JS bundle in the APK**, so a verify-on-device loop can silently test **old code** through **two independent caching layers**. Each makes a change look like it had \"no effect\" when it was never in the installed APK. **Both must be defeated — disabling one alone is not enough.** `runAndroidLocal.sh` handles both by default; this section is for recognizing the symptoms if a build looks stale or you build with another command.\n\n#### Gotcha 1 — EAS build cache reinstalls a stale APK\n\n`apps/mobile/app.config.ts` sets `experiments.buildCacheProvider: 'eas'`. `expo run:android` computes a **native** fingerprint and, on a match, downloads + installs a cached APK instead of building. A **JS-only** change does not move the native fingerprint, so for a release variant it reinstalls an APK with old JS.\n\n- **Symptom (logs):** `Searching builds with matching fingerprint on EAS servers` → `Successfully downloaded cached build` → install path under `…/eas-build-run-cache/….apk`.\n- **Detection:** you changed only JS/TS, yet the install line points at an `eas-build-run-cache` path.\n- **Fix:** build via `runAndroidLocal.sh` — it exports `EXPO_LOCAL_NO_BUILD_CACHE=1`, which gates the provider off in `app.config.ts` so a real build runs. Confirm `› Building app...` in the logs (not \"downloaded cached build\"). If invoking `expo run:android` directly, export `EXPO_LOCAL_NO_BUILD_CACHE=1` yourself.\n\n#### Gotcha 2 — gradle `createBundle<Variant>JsAndAssets` stays UP-TO-DATE\n\nEven with the EAS cache off, gradle's incremental check misses changes to monorepo JS sources (e.g. `packages/uniswap/**`), so the bundle task stays `UP-TO-DATE` and the APK embeds the **previously-bundled** `index.android.bundle`.\n\n- **Symptom (logs):** `> Task :app:createBundleDevReleaseJsAndAssets UP-TO-DATE`.\n- **Detection:** compare the embedded bundle mtime to your edit time:\n  ```bash\n  ls -la apps/mobile/android/app/build/generated/assets/createBundle<Variant>JsAndAssets/index.android.bundle\n  ```\n- **Fix:** `runAndroidLocal.sh` deletes the bundle task outputs by default (pass `--no-clean-js` to skip for native-only rebuilds). To clear them manually, remove:\n  - `apps/mobile/android/app/build/generated/assets/createBundle<Variant>JsAndAssets`\n  - `apps/mobile/android/app/build/generated/res/createBundle<Variant>JsAndAssets`\n  - `apps/mobile/android/app/build/intermediates/assets/<variant>`\n\n  A successful regen logs `> Task :app:createBundle<Variant>JsAndAssets` (no `UP-TO-DATE`) and `Writing bundle output to …`. `<Variant>` is the capitalized gradle variant (`DevRelease`, `BetaRelease`, `ProdRelease`); `<variant>` is the camelCase form (`devRelease`, …).\n\n---\n\n## 4. Runtime Problems in the App\n\n### 4.1 Where to Look\n\n| Problem type                      | Tool / Where to look                                                                                                                                                                                                                                              |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **JavaScript errors / logs**      | Use `debugger-log-registry` to get a summary and log file path, then `Grep`/`Read` to search.                                                                                                                                                                     |\n| **React component hierarchy**     | Use `debugger-component-tree` tool for a text tree, or `debugger-inspect-element` at specific logical pixel coordinates (not normalized 0-1).                                                                                                                     |\n| **Visual state of the app**       | Use `screenshot` tool to capture the current screen, but prefer `describe` or `debugger-component-tree` for actual navigation and target discovery. If a permission prompt or system-owned modal overlay is not exposed reliably, then fall back to `screenshot`. |\n| **Evaluate JS in the app**        | Use `debugger-evaluate` tool to run JavaScript in the app's runtime.                                                                                                                                                                                              |\n| **Native crashes / native stack** | `npx react-native log-ios` or iOS Simulator: Debug → Open System Log.                                                                                                                                                                                             |\n| **Build/runtime config**          | `metro.config.js`, `babel.config.js`, `package.json` scripts, `ios/Podfile`.                                                                                                                                                                                      |\n\nFor comprehensive Metro debugging workflows (component inspection, console logs, JS evaluation), refer to the `argent-metro-debugger` skill.\n\n### 4.2 JS Console Logs (Log Registry)\n\nLogs are written to a flat log file on disk under `~/.argent/tmp/`. Use the **log-registry → grep** pattern instead of reading logs inline.\n\nFor the full workflow, flat entry format, and grep examples, see `argent-metro-debugger` skill §5.\n\n### 4.3 Do not try to use the DevMenu in React Native apps by default.\n\nUse the argent tools instead.\n\n---\n\n## 5. Testing the App\n\nCheck the `argent-environment-inspector` result for test commands. For interactive UI testing with automatic screenshot verification, use the `argent-test-ui-flow` skill.\n\n- **Unit tests**: Look for Jest in `package.json` (`\"test\": \"jest\"`, `jest` config). Run: `npm test` or `yarn test`.\n- **E2E**: Look for Detox (`.detoxrc.js` or similar), or other E2E config. Dependencies: `detox`, `detox-cli`, and for iOS often `applesimutils`.\n- **UI flow testing**: For interactive UI testing with automatic screenshot verification, refer to the `argent-test-ui-flow` skill.\n\n### 5.2 Running Tests (Typical)\n\nIf the user's intent is ambiguous (run existing tests, write new tests, or find missing coverage), clarify before proceeding.\n\n- **Jest**: `npm test` or `npx jest`.\n- **Detox (example)**:\n  - Build: `detox build --configuration ios.sim.release` (or debug).\n  - Run: `detox test --configuration ios.sim.release`.\n  - Ensure simulator is booted and not used by another process.\n\n### 5.3 Agent Testing Checklist\n\n- [ ] Read `package.json` and test config (Jest, Detox, etc.).\n- [ ] If E2E: confirm simulator/device and build config.\n- [ ] If unclear: clarify whether to use existing workflows or write new tests.\n\n---\n\n## Quick Reference: Tools & Commands\n\n| Goal                         | Tool / Command                                                                                                                           |\n| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |\n| Check port 8081              | `lsof -i :8081`                                                                                                                          |\n| Kill Metro                   | `stop-metro` tool                                                                                                                        |\n| Start Metro                  | `npx react-native start`                                                                                                                 |\n| Start Metro (reset cache)    | `npx react-native start --reset-cache`                                                                                                   |\n| Run iOS app                  | `npx react-native run-ios`                                                                                                               |\n| Run Android app              | `npx react-native run-android`                                                                                                           |\n| List devices                 | `list-devices` tool (iOS + Android)                                                                                                      |\n| Boot a device                | `boot-device` tool (pass `udid` for iOS or `avdName` for Android)                                                                        |\n| Take screenshot              | `screenshot` tool                                                                                                                        |\n| Describe screen (a11y tree)  | `describe` tool for normal app screens and in-app modals; use `screenshot` only when permission/system overlays are not exposed reliably |\n| Read JS console logs         | `debugger-log-registry` tool                                                                                                             |\n| Reload JS bundle             | `debugger-reload-metro` tool                                                                                                             |\n| Check Metro status           | `debugger-status` tool                                                                                                                   |\n| Inspect React component tree | `debugger-component-tree` tool                                                                                                           |\n| Run JS in app                | `debugger-evaluate` tool                                                                                                                 |\n| iOS native logs              | `npx react-native log-ios`                                                                                                               |\n| Android native logs          | `npx react-native log-android` or `adb -s <serial> logcat`                                                                               |\n| Clean + reinstall (nuclear)  | See §3.1 step 3                                                                                                                          |\n\n---\n\n## Related Skills\n\n| Skill                          | When to use                                                                     |\n| ------------------------------ | ------------------------------------------------------------------------------- |\n| `argent-ios-simulator-setup`   | Initial simulator boot and connection setup                                     |\n| `argent-device-interact`       | Tapping, swiping, typing, hardware buttons, gestures on the simulator/emulator  |\n| `argent-metro-debugger`        | Full Metro CDP debugging: component inspection, console logs, JS evaluation     |\n| `argent-react-native-profiler` | Profiling performance, finding re-render issues, CPU hotspots                   |\n| `argent-test-ui-flow`          | Interactive UI testing with automatic screenshot verification after each action |\n\nAsk the user before running tests: confirm which test suite (unit, E2E, or both), whether to use existing CI commands, and whether they want you to run existing tests, write new ones, or explore test cases yourself.\n","frontmatter":{"name":"argent-react-native-app-workflow","description":"Step-by-step workflows for developing or debugging React Native apps on iOS simulator or Android emulator. Use when starting the app, debugging Metro, fixing builds, diagnosing runtime errors, or running tests."},"isInternal":false,"tokens":3884,"sizeBytes":20164},{"name":"fix-reference.md","path":".agents/skills/argent-react-native-optimization/references/fix-reference.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/fix-reference.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/fix-reference.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/fix-reference.md)","tokens":300,"sizeBytes":267},{"name":"lint-rules.md","path":".agents/skills/argent-react-native-optimization/references/lint-rules.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/lint-rules.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/lint-rules.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/lint-rules.md)","tokens":300,"sizeBytes":261},{"name":"semantic-checklist.md","path":".agents/skills/argent-react-native-optimization/references/semantic-checklist.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/semantic-checklist.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/semantic-checklist.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/semantic-checklist.md)","tokens":300,"sizeBytes":277},{"name":"SKILL.md","path":".agents/skills/argent-react-native-optimization/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/SKILL.md","title":"argent-react-native-optimization","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-react-native-optimization\ndescription: Optimizes a React Native app by profiling first to find real bottlenecks, then sweeping for mechanical issues. Entry-point for all performance work. Use when the app feels slow, user asks to optimize, fix re-renders, reduce jank, or improve startup. Delegates to argent-react-native-profiler for measurement.\n---\n\n## Rules\n\n- Do not apply shotgun optimizations. Measure first, define what \"good enough\" looks like (target metric + threshold), fix the top offender, re-measure honestly.\n- **Quick scan** — `react-profiler-renders` for a live render count table. Identifies hot components instantly.\n- **Deep measure** — load `argent-react-native-profiler` skill. `react-profiler-start` → interact → `react-profiler-stop` → `react-profiler-analyze`.\n- **Inspect** — `react-profiler-component-source` per finding. `react-profiler-fiber-tree` to trace component ancestry and render cost.\n- **Verify correctness** - before fixing, recollect information from steps above and make a logical conclusion whether the approach is worth undertaking.\n- **Fix** — apply one fix. Validate with `debugger-evaluate` before committing.\n- **Re-measure** — report whether the target metric improved, regressed, or stayed flat. Check for regressions in other areas. If no net benefit or unacceptable tradeoffs, revert.\n- **Profile for discovery, not only verification.** Use the profiler to find issues static analysis missed, not only to confirm fixes.\n- **One fix per cycle for architectural changes.** Mechanical batch fixes (inline styles, index keys) can be grouped — re-profile once after the batch. When the measurement involves simulator interaction, record it as a flow (`argent-create-flow` skill) before the first run so all subsequent cycles replay identical steps.\n- **React Compiler**: if `react-profiler-analyze` reports `reactCompilerEnabled: true`, do NOT propose `useCallback`/`useMemo`/`React.memo` unless you confirmed compiler bail-out via `react-profiler-fiber-tree` (absent `useMemoCache`).\n- **Sub-agents**: Phases 1–2 dispatch sub-agents — one per file for lint results, one per checklist item for semantic. Sub-agents CANNOT touch the simulator - all profiling and E2E verification must happen in the main agent.\n\n## Pipeline\n\n**Lint and semantic sweeps catch deterministic issues cheaply. Profiling finds runtime bottlenecks that static analysis misses. Do both.**\n\nCopy this checklist into your TODO list:\n\n```\nOptimization Progress:\n- [ ] Phase 1: Lint sweep (deterministic — catch mechanical issues without a running app)\n- [ ] Phase 2: Semantic sweep (judgment — memoization, lists, animations, etc.)\n- [ ] Phase 3: Baseline profile (find real bottlenecks, fix top offenders)\n- [ ] Phase 4: Verify no regressions (crashes, errors, red screens)\n```\n\n### Phase 1: Lint sweep\n\nRun ESLint once at the project root with a comprehensive RN performance ruleset. Dispatch sub-agents to fix results — one per file.\nSee [references/lint-rules.md](references/lint-rules.md) for ruleset and procedure.\n\n### Phase 2: Semantic sweep\n\nReview each area requiring judgment — memoization, list rendering, animations, async patterns, effect cleanup, state hygiene, context architecture. Dispatch one sub-agent per checklist item.\nSee [references/semantic-checklist.md](references/semantic-checklist.md) for full checklist.\n\n### Phase 3: Visual profiling\n\n1. Load `argent-react-native-profiler` skill, start dual profiling\n2. Exercise key user flows (navigate screens the user specified, or all major flows)\n3. Analyze with `react-profiler-analyze` + `native-profiler-analyze` + `profiler-combined-report`\n4. Cross-reference profiling results with Phase 1–2 findings\n5. Fix highest-impact issues. Re-profile after architectural changes; batch mechanical fixes. If a recorded flow breaks after a fix (e.g., UI layout changed), follow `argent-create-flow` skill to repair the flow rather than silently discarding it.\n\n### Phase 4: Verify no regressions\n\nNavigate every screen and UI flow within scope, confirm each renders without errors. If no scope was specified, verify the entire app — cover all reachable screens via `argent-device-interact`. Use `debugger-log-registry` to check for runtime errors and take screenshots to check for red/yellow error screens. Check for regressions introduced by fixes (e.g., fewer re-renders but higher CPU, or new jank in a different screen). Main agent only.\n\n## App-wide optimization\n\n1. **Phase 1**: run lint centrally (one command), dispatch sub-agents to fix per-file in parallel\n2. **Phase 2**: one sub-agent per checklist item for semantic sweep\n3. **Phase 3**: main agent profiles top offending screens; fixes architectural issues top-down\n4. **Phase 4**: main agent navigates all screens to verify nothing crashes\n\nAfter the entire run, run lint again to verify no new issues were introduced with your changes.\nThis also helps ensure you haven't missed any issues which could've been fixed.\n","frontmatter":{"name":"argent-react-native-optimization","description":"Optimizes a React Native app by profiling first to find real bottlenecks, then sweeping for mechanical issues. Entry-point for all performance work. Use when the app feels slow, user asks to optimize, fix re-renders, reduce jank, or improve startup. Delegates to argent-react-native-profiler for measurement."},"isInternal":false,"tokens":1121,"sizeBytes":5017},{"name":"diagnostic-tools.md","path":".agents/skills/argent-react-native-profiler/references/diagnostic-tools.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-profiler/references/diagnostic-tools.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `.agents/skills/argent-react-native-profiler/references/diagnostic-tools.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-profiler/references/diagnostic-tools.md)","tokens":300,"sizeBytes":265},{"name":"SKILL.md","path":".agents/skills/argent-react-native-profiler/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-profiler/SKILL.md","title":"argent-react-native-profiler","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-react-native-profiler\ndescription: Profile a React Native Hermes app to measure re-render and CPU performance using argent profiler tools. Use when optimizing for performance, measuring before/after a fix, spotting slow components, diagnosing re-renders, checking CPU hotspots, or producing a ranked issue report.\n---\n\nThis skill is complementary to `argent-react-native-optimization`, not a replacement for it.\n\n## 2. Tool Overview\n\n### React Profiler (Hermes / React commits)\n\n| Tool                              | Purpose                                                                                                                                                                                                                                                           |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `react-profiler-start`            | Start CPU sampling + inject React commit-capture hook. Optional: `sample_interval_us` (default 100).                                                                                                                                                              |\n| `react-profiler-stop`             | Stop recording; stores cpuProfile + commitTree in session.                                                                                                                                                                                                        |\n| `react-profiler-status`           | **Call if you were interrupted in the middle of the flow, never in another scenario** (debugger drop, Metro reload, pause, subagent handoff, any doubt). Returns `session_status: \"active\" \\| \"taken_over\" \\| \"stopped\" \\| \"no_react_runtime\"`. Side-effect free. |\n| `react-profiler-analyze`          | Run pipeline -> report with CPU-enriched hot commits, sorted by `totalRenderMs` DESC. Saves raw data to disk.                                                                                                                                                     |\n| `react-profiler-component-source` | AST lookup: file, line, memoization status, 50 lines of source for a component.                                                                                                                                                                                   |\n| `react-profiler-renders`          | Live fiber walk: render counts + durations per component (no profiling session required).                                                                                                                                                                         |\n| `react-profiler-fiber-tree`       | Live fiber walk: full component hierarchy as JSON.                                                                                                                                                                                                                |\n\n### Drill-Down Query Tools (call after analyze)\n\n| Tool                       | Purpose                                                                                      |\n| -------------------------- | -------------------------------------------------------------------------------------------- |\n| `profiler-cpu-query`       | Targeted CPU investigation: top functions, time-windowed CPU, call trees, per-component CPU. |\n| `profiler-commit-query`    | Targeted commit investigation: by component, time range, commit index, or cascade tree.      |\n| `profiler-stack-query`     | iOS Instruments drill-down: hang stacks, function callers, thread breakdown, leak details.   |\n| `profiler-combined-report` | Cross-correlated report when both React Profiler and native profiler ran in parallel.        |\n| `profiler-load`            | List and reload previous profiling sessions from disk for re-investigation with query tools. |\n\nFor native profiling (CPU hotspots, UI hangs, memory leaks), see the `argent-native-profiler` skill.\n\n---\n\n## 3. Agent Behavior Guidelines\n\nFollow these rules throughout the profiling workflow:\n\n- Start `react-profiler-start` and `native-profiler-start` in parallel (two tool calls in one message). Both need `device_id`; use the same UDID for both so their data can be correlated later. This gives best coverage.\n- If the user only wants native profiling, use the `argent-native-profiler` skill workflow. Only skip `native-profiler-start` if the user has **already explicitly said** they don't want native profiling in this session\n\n### After analysis: ask about next steps\n\nAfter presenting the analysis report, always ask the user what they want to do next. Present these options:\n\n1. **Investigate further** — drill down into specific findings using query tools (CPU call trees, commit cascades, hang stacks, etc.) to identify root causes with confidence before making changes.\n2. **Implement fixes** — apply changes based on the current findings, then re-profile to measure whether the metric changed (improved, regressed, or stayed flat).\n3. **Done for now** — accept the report as-is.\n\nDo NOT silently move on after the report. The report is the starting point, not the end — query tools exist specifically to let you dig deeper into anything the report flags.\n\n### During investigation: use query tools proactively\n\nWhen drilling down, chain query tool calls based on what you find:\n\n- A hot commit -> `profiler-commit-query` mode=`by_index` to see all components -> `profiler-cpu-query` mode=`component_cpu` for the slowest one -> `profiler-cpu-query` mode=`call_tree` for the hot function -> read the source file -> propose a fix.\n- A memory leak -> `profiler-stack-query` mode=`leak_stacks` to identify the responsible module -> read the native source if actionable.\n- A native hang -> `profiler-stack-query` mode=`hang_stacks` to get the native call chain -> correlate with React commit timing.\n\n### After fixes: always re-profile\n\nWhen you apply a fix, always re-profile the same scenario afterward. Compare before/after metrics (commit durations, CPU time, render counts) and report honestly: did the target metric improve, stay flat, or regress? Did any _other_ metric get worse? If you need to reference the original data, use `profiler-load` to reload the pre-fix session. If the fix showed no improvement or introduced a regression, say so explicitly and reconsider the approach.\n\n### Use flows for reproducible profiling\n\nWhen profiling requires a specific interaction sequence (scroll a list, navigate screens, trigger an animation), **record the interaction as a flow** using the `argent-create-flow` skill before the first profiling run. Then replay the same flow for every subsequent run. This eliminates interaction variance as a confounder and makes before/after comparisons meaningful. Especially important when:\n\n- You are about to re-profile after applying a fix (Step 8).\n- The user asks you to compare multiple profiling sessions.\n- The interaction path is more than 2-3 steps long.\n\n---\n\n## 4. Standard Profiling Workflow\n\n**Complete all steps in order — do not break mid-flow.**\n\n### Step 1: Start profiling\n\nMind the react-native and ios-native profiler selection mentioned above when starting the session and start the tools. **Save `startedAtEpochMs` from the response** — you will need it for annotation offsets. Every subsequent profiler/query call in this session must use the same `device_id`. Before beginning, define lightweight success criteria with the user: which metric matters most (e.g., `totalRenderMs`, specific commit duration, render count for a component) and what threshold would be meaningful. This anchors later evaluation. On success:\n\n- if user asked you to perform the profiling, determine how to profile yourself using tools described in `argent-device-interact` skill.\n- if the user stated they wish to perform the interaction themselves — suggest what interaction to perform (e.g. \"scroll the list\", \"switch tabs\") and wait for their reply.\n  If you received information about **existing profiling session** being owned by another agent:\n- if session is marked as \"stale\", you may overtake it without prompting the user for allowance\n- if session is NOT \"stale\" - before taking action and terminating the other session, **stop and ask user what you should do**, explaining the situation.\n\n#### Annotate every interaction\n\nAfter each `gesture-tap` or `gesture-swipe` call, record an annotation using the returned `timestampMs`. Compute `offsetMs = timestampMs - startedAtEpochMs`. Do this for _every_ interaction — including back-navigation swipes, not just the primary action. Pass all collected annotations to `react-profiler-analyze` in Step 3.\n\n### Step 2: Stop and collect\n\nCall `react-profiler-stop` **and** `native-profiler-stop` in parallel. Only skip `native-profiler-stop` if you did not start it in Step 1. Note `duration_ms` and `fiber_renders_captured`.\nIf `fiber_renders_captured: 0`, warn the user — React commit data may be missing.\n\n### Step 3: Analyze\n\nCall `react-profiler-analyze` with `port`, `device_id`, `project_root`, `platform`, and `rn_version`. The report includes metadata such as `reactCompilerEnabled`, `strictModeEnabled`, and `buildMode` — check these in the returned markdown report.\n\nIf you performed interactions using `gesture-tap`/`gesture-swipe`, pass `annotations` to mark when each action occurred. Each annotation's `offsetMs` must be computed as `tapTimestampMs - startedAtEpochMs`, where `tapTimestampMs` is the `timestampMs` returned by the gesture-tap/gesture-swipe tool and `startedAtEpochMs` was returned by `react-profiler-start`. Do **not** use `Date.now()` for this calculation — only server-side timestamps from the tool return values.\n\nIf dual profiling, also call `native-profiler-analyze`, then **you must** call `profiler-combined-report` for the cross-correlated view — do not skip this step when both profilers ran; the combined report surfaces correlations that individual reports miss.\n\nThe analyze report includes **CPU hotspots per commit** — showing exactly which JS functions ran during each slow React commit. Raw data is saved to disk automatically for later reload.\n\n### Step 4: Assess results\n\nAnalyze whether the results give you a proper image of what is wrong with the application - **do not assume improvement always exists**, verify results logically with reference to how react-native works. Make sure to give honest feedback and be ready to change the approach if needed.\n\n### Step 5: Present findings and ask about next steps\n\nPresent a concise summary of the key findings - present whether possibilities for improvement exist and how performing further actions could affect performance. Then follow the \"After analysis\" guideline — ask whether to investigate further, implement fixes (if available), or stop.\n\n### Step 6: Drill-down investigation (iterative)\n\nBased on findings from the report, use query tools to investigate deeper:\n\n- **Slow component?** -> `profiler-cpu-query` mode=`component_cpu` component_name=`AppNavigator` — shows what JS functions ran during that component's commits.\n- **Want to see the call tree?** -> `profiler-cpu-query` mode=`call_tree` function_name=`expensiveFunction` — shows callers and callees.\n- **What happened during a time window?** -> `profiler-commit-query` mode=`by_time_range` — lists all commits in a range.\n- **Full commit detail?** -> `profiler-commit-query` mode=`by_index` commit_index=38 — all components, props changes, parent cascade.\n- **Who triggered whom?** -> `profiler-commit-query` mode=`cascade_tree` — visual parent-child cascade.\n- **iOS hang details?** -> `profiler-stack-query` mode=`hang_stacks` — native call stacks during a hang.\n\nRepeat as needed until you identify the root cause function and file, referring to step 4 for honest evaluation. After each round of investigation, ask the user if they want to continue digging or move to fixing.\n\n### Step 7: Reload a previous session\n\nIf you profiled multiple scenarios and need to revisit earlier data:\n\n1. Call `profiler-load` mode=`list` to see all saved sessions with timestamps (the list now also shows Runtime / Device / Metro bundle columns to help identify the right session).\n2. Call `profiler-load` mode=`load_react` session_id=`<timestamp>` device_id=`<UDID>` to reload React data. `device_id` scopes the reload into the `port:device_id` cache slot.\n3. Call `profiler-load` mode=`load_native` session_id=`<timestamp>` device_id=`<UDID>` to reload native profiler data.\n4. Query tools now operate on the reloaded session data — **pass the same `device_id` you loaded with**, otherwise they will miss the cache.\n\nThis is useful for before/after comparisons: profile, fix, re-profile, then reload the original session to compare metrics side by side.\n\n### Step 8: Apply fix and re-profile\n\nIf fix is present, read the source code of the identified bottleneck using `react-profiler-component-source` or the Read tool. Apply the fix, then re-profile (Step 1 -> user interaction -> Step 2 -> Step 3 -> Step 4). Report whether the target metric improved, stayed flat, or regressed. Also check whether the fix introduced regressions in other metrics (e.g., render count dropped but CPU time increased, or a different component now re-renders more). If the fix showed no net benefit or unacceptable tradeoffs, revert and reconsider.\n\n**Tip:** If the interaction sequence was recorded as a flow (see \"Use flows for reproducible profiling\" above), replay it with `flow-execute` instead of manually repeating the steps. This guarantees identical interaction conditions for the comparison. If the flow fails during replay (e.g., a UI fix changed the layout), follow `argent-create-flow` skill §10 (Flow Self-Improvement) to diagnose and repair the flow before retrying the profiling cycle.\n\nIf the user stated that they do not wish for changes, present the profiling report and skip the fix but suggest it to the user.\n\n**React Compiler rule:** If the analyze report indicates React Compiler is enabled, do NOT propose `useCallback`/`useMemo`/`React.memo` unless you confirmed compiler bail-out (check `react-profiler-fiber-tree` for absent `useMemoCache` on that component).\n\n---\n\n## 5. Important Caveats\n\n- **Dev mode inflation**: `buildMode: \"dev\"` renders are ~3x slower than production. Prioritize high `normalizedRenderCount` — it scales to prod.\n- **Re-run after fixes**: Always re-profile after changes. Report honestly whether the metric improved, regressed, or stayed flat — do not assume improvement.\n- **`excluded` is informational**: Components in `animatedSubtrees` and `recyclerChildren` re-render by design.\n- **Strict Mode**: Double-invokes renders. The pipeline halves `normalizedRenderCount` automatically when detected.\n- **Debugger connection**: If interrupted, started profiling also closes. Before attempting recovery, call `react-profiler-status` — it tells you whether the session is `active`, `taken_over`, `stopped`, or `no_react_runtime`, so you can decide whether to stop, restart, or reconnect first.\n- **Confounders to watch for**:\n  - Live API data may differ between runs (different payload sizes, content counts), which shifts render counts and durations independently of your fix. Note when data-dependent components show variance.\n  - Profiler overhead inflates CPU measurements. If iOS Instruments shows `JSLexer`, `JSONEmitter`, or Hermes internals dominating the JS thread, that reflects profiler instrumentation cost — not app work. Discount those entries.\n  - Runs are not perfectly reproducible. Small variations (under ~10-15%) in commit duration may be noise; only treat consistent, directional changes as signal.\n\nFor standalone diagnostic tools (live render stats, fiber tree, CPU summary), see `references/diagnostic-tools.md`.\n","frontmatter":{"name":"argent-react-native-profiler","description":"Profile a React Native Hermes app to measure re-render and CPU performance using argent profiler tools. Use when optimizing for performance, measuring before/after a fix, spotting slow components, diagnosing re-renders, checking CPU hotspots, or producing a ranked issue report."},"isInternal":false,"tokens":3155,"sizeBytes":16088},{"name":"SKILL.md","path":".agents/skills/argent-screenshot-diff/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-screenshot-diff/SKILL.md","title":"argent-screenshot-diff","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-screenshot-diff\ndescription: Capture stable before/after screenshots on an iOS simulator or Android emulator and pixel-diff them into evidence. Use when asked for a visual regression check, a screenshot diff, a before/after visual comparison, or when a visible mobile UI change needs pixel proof — including the executed screenshot-diff that a Tamagui conversion batch requires.\n---\n\n## 1. Use the first-party `screenshot-diff` tool\n\n`screenshot-diff` is a real first-party argent MCP tool, and it is the preferred path for every diff in this skill. Hand-rolling a pixel diff is the fallback (§ 5), not the default.\n\n| Parameter | Required | Notes |\n| --- | --- | --- |\n| `udid` | **yes** | iOS UUID or Android adb serial, same as every other argent tool |\n| `outputDir` | **yes** | Where the diff artifacts are written |\n| `baselinePath`, `currentPath` | mode A | Two PNGs you already saved to disk |\n| `captureBaseline`, `captureCurrent` | mode B | The tool captures live from the device instead |\n| `rotation` | no | The same rotation parameter `screenshot` takes |\n\nSupply **either** the saved-PNG pair **or** the live-capture flags — the two modes are alternatives, not additions.\n\nReturns `{ summary, diffPath, contextDiffPath }`: the comparison summary plus two written artifacts, the diff image and a context diff.\n\n**It excludes the fixed status-bar band from both the pixel and the OCR comparison.** That alone is reason to prefer it over anything hand-rolled. The clock, battery percentage and signal indicators differ between any two captures taken seconds apart, and on a full-screen mobile capture they are the single most common source of false positives. With this tool you neither crop them out nor explain them away in review.\n\n**Load the schema before your first call** — deferred tools in this environment expose only their name until you load them. ToolSearch for `screenshot-diff`, read the parameter names and return shape off the schema, and use those. The table above was transcribed from a session with the argent server connected rather than verified in the session that wrote this skill, so treat the loaded schema as the authority wherever the two disagree.\n\n**Never invent a tool signature.** If ToolSearch cannot load it, the tool is not available to your session — take the § 5 fallback and say so in your report.\n\n---\n\n## 2. Prerequisites and their limits\n\nFrom `apps/mobile/CLAUDE.md`:\n\n```bash\nbun add -g @swmansion/argent   # one-time per machine; puts `argent` on PATH\n```\n\n- **Argent does not build or install the app for you** — it drives whatever is already on the sim. Get the build you intend to compare installed and running first via `argent-react-native-app-workflow`.\n- **Argent owns the simulator.** Do not mix `xcrun simctl install/launch/terminate` with argent calls — sim state corruption is real, and a corrupted sim silently poisons a diff.\n- **Do not run `argent init`** — skills and config are already committed. `argent update` only when intentionally refreshing.\n- **Android**: run `adb -s <serial> reverse tcp:8081 tcp:8081` before the app starts, or Metro is unreachable and you will capture a red screen.\n- **At session end**: call `stop-all-simulator-servers`.\n\nGet a `udid` per `argent-ios-simulator-setup` (iOS, UUID-shaped) or `argent-android-emulator-setup` (Android, adb serial). Tool names are identical on both platforms.\n\n---\n\n## 3. The headless constraint — state it, do not paper over it\n\n**A headless or CI agent session cannot drive a local simulator or emulator.** There is no sim to attach to, no Xcode/`xctrace`, no emulator, and no display. This was the blocking finding on INFRA-3096 and it has not changed.\n\nEverything below is the **argent-driven local-device path**, and that path needs a **locally attached simulator, emulator, or device** in a session running on a developer machine: argent's MCP server drives a local sim/emulator or an attached device, and a headless session has no argent binary, no argent MCP server, and no device.\n\nIf you are headless, do **not** stage a diff and imply it ran. `tamagui-conversion` is explicit: *a staged-but-unrun diff is not evidence.* Instead do one of:\n\n1. **Hand off.** Stage the comparison surface (§ 4), commit it, and write the exact runnable steps — udid selection, story names, `scale: 1.0`, the `screenshot-diff` call and its `outputDir`, and the state matrix — into the Linear issue and PR body so a human-run session executes it verbatim.\n2. **Record the obligation.** Comment on the issue that the executed diff is outstanding, with the commit the diff must be run against. An unmet obligation on the record beats a fabricated verdict.\n3. **Substitute, with sign-off.** If no legacy twin exists there is nothing to diff at all — substitute self-contained behavioral tests plus **explicit requester sign-off** (the `tamagui-conversion` rule).\n\n### Remote devices — the blockers above are narrower than \"you need a developer machine\"\n\nThose blockers are about driving **argent**. They are not a claim that on-device visual evidence is impossible without a local simulator. **AWS Device Farm runs real remote devices and needs no local sim and no macOS host**, so it is a plausible route to the underlying evidence goal — before/after captures from a real device, taken to a pixel diff. What that route carries:\n\n- **Whether argent can target a Device Farm device is untested.** Do not claim it can and do not claim it cannot; if you need argent specifically, treat it as an open question to verify.\n- **The build must embed a dev-mode bundle**, because Storybook is `__DEV__`-only (§ 8) — a bundled production build cannot show the staged stories at all.\n- **Android-only absent a macOS host**, since an iOS build needs one.\n\n**The INFRA-3096 \"declined\" note is narrower than it reads.** A Device Farm pass was declined there — but on a batch with **zero converted files**, where the objection was to diffing a batch in which nothing had changed (\"staged evidence with extra steps\"), not to Device Farm as a capture mechanism. That is a reading of INFRA-3096 comment `fe4db9f3`; check it yourself before citing it either way. Whichever capture route you use, \"executed, never staged\" is unchanged — the diff must actually run, against changed code.\n\n---\n\n## 4. Staging the comparison — the canonical pattern\n\nThe repo practice this skill formalizes: put both sides in **one Storybook file** rendering the **identical state matrix at identical screen positions**, so a diff of the two stories measures nothing but the component.\n\nPattern files:\n\n- `apps/mobile/src/components/mycelium/SegmentedControlMigration.stories.tsx` (#37202) — the template. `Legacy` and `Rebuilt` stories render the exact same matrix at the exact same positions; `SideBySide` stacks both per state for eyeballing.\n- `apps/mobile/src/components/mycelium/ShimmerMigration.stories.tsx` — carries a hard-won caveat.\n\nRules that fall out of those two files:\n\n| Case | Stage it as | Why |\n| --- | --- | --- |\n| Static states | Standalone `Legacy` + `Rebuilt` stories, identical positions | Diffable pair, nothing else varies |\n| **Animated** states | `SideBySide`, both mounts **simultaneous** | Separate mounts start their animation clocks at different times — an out-of-phase row looks frozen or broken when both implementations are correct. Phase-lock or do not diff. |\n| No legacy twin | Not diffable at all | Behavioral tests + requester sign-off instead |\n\nIdentical positions is not a nicety. Any offset makes the whole panel differ and the diff is worthless.\n\n---\n\n## 5. Capture and diff — the procedure\n\nGet a `udid` from `list-devices`, stage both sides per § 4, and settle per § 6. Then:\n\n1. Navigate to the `Legacy` story. Settle, then `screenshot` with **`scale: 1.0`**, persisted to disk.\n2. Navigate to `Rebuilt` — same route, same scroll offset, no device rotation between captures.\n3. Settle, then `screenshot` with `scale: 1.0`, persisted to disk.\n4. Call `screenshot-diff` with `udid`, an `outputDir`, and the two files as `baselinePath` / `currentPath`.\n5. Read `summary`, then open `diffPath` and `contextDiffPath` and actually look at them (§ 7).\n\n### `scale: 1.0` is mandatory for anything you feed to a diff\n\n`screenshot` **downscales to 30% of native resolution by default** to save context (`argent-device-interact` § 7). `scale` accepts `0.01`–`1.0`.\n\n> A 30% capture has thrown away the pixels you are measuring: it invents resampling differences that read as regressions, and it hides real one-pixel border and anti-aliasing shifts. A diff run at the default scale is not evidence.\n\n```json\n{ \"udid\": \"<UDID>\", \"scale\": 1.0 }\n```\n\nIf `screenshot` returns an inline image rather than a file path, you need the bytes on disk before `baselinePath` / `currentPath` will accept them. **Load the tool's schema with ToolSearch and read its actual return shape** — do not assume either form.\n\n### The live-capture mode\n\n`captureBaseline` / `captureCurrent` (§ 1) let `screenshot-diff` take the shots itself instead of you saving PNGs. Read the schema for how the two are sequenced before relying on it: the staged-story pattern in § 4 requires **navigating between the two captures**, and a before/after across a code change requires a rebuild between them. Prefer the saved-PNG pair whenever anything has to happen in between.\n\n### Fallback — only when `screenshot-diff` will not load\n\nFor a session with no argent MCP server connected, or an argent version predating the tool. Capture the pair exactly as above, then diff the PNGs yourself: `labs/workbench` already carries the engine as devDeps (`pixelmatch` 7.2.0, `pngjs` 7.0.0), and `labs/workbench/scripts/visual/compare.ts` is a working reference for the pixelmatch call, padding, and flag arithmetic — reuse it rather than reaching for a new dependency. You then own the two jobs the first-party tool does for you: masking the status-bar band, and picking thresholds (§ 7).\n\n---\n\n## 6. Determinism — eliminate false positives before you diff\n\nA flaky diff is worse than no diff: it trains reviewers to ignore the artifact. Fix all of these before capturing.\n\n- **Kill animation.** Disable animations in the app, or use a `SideBySide` phase-locked mount for anything that moves. Never diff a mid-transition frame.\n- **Pin the device.** Same simulator model **and** same OS version for before and after. A different sim is a different renderer.\n- **Pin the position.** Identical scroll offset, orientation, and safe-area insets. Do not rotate between captures.\n- **Settle before capture.** Wait for the screen to be static — no spinner, no skeleton, no in-flight image load. If the returned screenshot shows a transitional frame, retake with `screenshot` (the `argent-test-ui-flow` recovery pattern).\n- **Same content.** No live data, no timestamps, no randomized ordering, no avatar that loads from the network.\n- **Same theme.** Diff light against light and dark against dark, as separate pairs.\n\n---\n\n## 7. Reading the result\n\n### With `screenshot-diff` (the primary path)\n\n`summary` is the judgement surface; `diffPath` and `contextDiffPath` are the artifacts.\n\n- **Read `summary`, then corroborate it against the images.** A summary you did not check against the diff image is a claim, not a verdict.\n- **The contract in § 1 exposes no threshold, sensitivity, or flagging parameter** — so there is nothing to tune, and this skill will not recommend a number for it. Do not invent one. If the schema you load exposes a knob § 1 does not list, use it and record the value you passed.\n- **Calibrate with a no-change control pair.** Capture the same story twice with nothing changed and diff it. Whatever the tool reports on that pair is the floor for this device, this OS version, this screen — a real pair must clear it visibly. With no tunable threshold, this control is the calibration.\n- **Status-bar drift is already excluded** (§ 1), so anything reported is real content, not a clock tick.\n\n**How the harness numbers below translate: they mostly do not.** Stated plainly so nobody tries to reconcile them:\n\n| Harness concept | Counterpart in `screenshot-diff` |\n| --- | --- |\n| `--pixel-threshold` (per-pixel color sensitivity) | **None exposed.** The tool decides its own sensitivity |\n| `--flag-ratio` (`diffPixels / totalPixels`) | **None exposed.** The tool does not take a flagging rule from you |\n| `--min-diff-pixels` (absolute floor) | **None exposed** |\n| Manual status-bar masking | **Built in** — excluded from pixel *and* OCR comparison |\n| Diff PNG output | `diffPath`, plus `contextDiffPath` |\n| Flag verdict computed by you | `summary`, computed by the tool |\n\nThree of the harness's four knobs have no counterpart. That is not a gap to paper over with an invented mapping — it means the judgement moves from *choosing numbers* to *reading `summary` against a control pair and looking at the diff image*.\n\n### Fallback thresholds — hand-rolled `pixelmatch` only\n\nEverything below applies to the § 5 fallback, not to `screenshot-diff`.\n\n**Established precedent** — `labs/workbench/scripts/visual/README.md`, the web harness. A pair is flagged when **both** conditions hold:\n\n```\ndiffPixels / totalPixels > 0.005     # relative ratio (--flag-ratio)\nAND diffPixels > 250                 # absolute floor (--min-diff-pixels)\n```\n\nwith a per-pixel color sensitivity of `0.1` (`--pixel-threshold`, passed to pixelmatch).\n\n**Why two conditions, so you can adapt rather than cargo-cult:** the ratio alone over-fires on small panels. On a ~6–10k-pixel panel, sub-perceptual anti-aliasing noise (the harness's documented case: translucent-token compositing rendering text a few 8-bit steps apart) is ~120–180 px — under 250 absolute, but *over* 0.005 relative. The absolute floor absorbs exactly that. Meanwhile a genuinely broken color repaints most of a panel at high delta and trips both conditions comfortably. The two-condition rule buys you a wide, empty band between noise and real breakage.\n\n**Starting recommendations for mobile** (mine, not established — tune and record what you used):\n\n- Keep `pixel-threshold` at `0.1`. It is the sensitivity that was validated against real token-compositing noise, and it is platform-independent.\n- Keep the `0.005` ratio.\n- **Raise the absolute floor** above 250. Mobile captures at `scale: 1.0` are far larger than a workbench panel, and native text rasterization is noisier than Chromium's — 250 px will fire on nothing. Scale the floor with panel area: the web value is ~2.5–4% of a 6–10k-px panel, so start there and calibrate against a **no-change control pair** (capture the same story twice, unchanged; that number is your noise floor, and your threshold goes above it).\n- Any pair you had to raise a threshold to pass is **not** green — investigate it.\n\nRecord what you ran alongside the verdict — `screenshot-diff` and which mode, or the fallback and its thresholds. A verdict without its mechanism is unreproducible.\n\n---\n\n## 8. The Storybook tension — real, and reconcilable\n\nThis diff practice needs **Storybook**. But `apps/mobile/CLAUDE.md` mandates `NODE_ENV=production` for agent/CLI Metro precisely *because* dev-mode bundles Storybook and the app boots into Storybook UI, \"breaking agent-driven interaction flows\":\n\n```bash\nbun nx run mobile:start:production   # the normal agent default — Storybook OFF\n```\n\nBoth are correct; they are different jobs. Reconcile by **choosing the mode for the task, deliberately and out loud**:\n\n| Task | Metro mode | Storybook |\n| --- | --- | --- |\n| Driving real app screens, flows, QA, profiling | `mobile:start:production` | off (required) |\n| **Screenshot-diffing a staged story matrix** | dev Metro (`NODE_ENV` unset) | on (required) |\n\nSo: a screenshot-diff session runs dev Metro *on purpose*, and booting into Storybook UI is the desired outcome, not the failure the CLAUDE.md rule warns about. Consequences to hold onto:\n\n- **Do not do both in one Metro session.** Finish the diff, then restart Metro in production mode before any app-flow work — and say in your report which mode each artifact came from.\n- `NODE_ENV` applies at **JS-bundle time**. For a device build with no Metro dev server the flag goes on the build command, so a bundled production build cannot show Storybook at all — what you need is a **dev-mode bundle**, and how you get one depends on the route (§ 3): dev Metro against a local simulator, or a dev-mode-bundled build on a remote device.\n- A reviewer seeing Storybook chrome in your evidence should not read it as a broken setup. Label the captures as Storybook stories.\n\n---\n\n## 9. Recording the evidence\n\nAn executed diff is only evidence once it is **on the record**. Post to both the Linear issue and the PR:\n\n1. **Before/after images** per state — legacy, rebuilt, and the diff PNG. Never commit the images into the repo (the web harness's rule: report JSON is committed, images are gitignored); attach them to the issue/PR instead.\n2. **Video for motion.** Static screenshots cannot prove an animation. Channel convention (Thomas's rule, carried in `tamagui-conversion`) is before/after screenshots **plus video for anything animated**.\n3. **Provenance**: device model, OS version, platform, Metro mode, and the **commit SHA** the diff ran against. A diff against uncommitted work is not reproducible — the web harness refuses a dirty tree for exactly this reason.\n4. **The diff mechanism** (§ 7) — `screenshot-diff` and its mode, or the fallback with the thresholds you used and any deviation from the defaults and why.\n5. **A verdict per state**, not one aggregate. `pass` / `flagged` / `known drift (reason)`. Enumerate the full matrix so a reviewer can see nothing was quietly skipped.\n6. **Captured from where.** Visual evidence must come from a deployed preview or the workbench — never local dev — for web. For mobile the equivalent is the installed build at a named commit, stated explicitly.\n\nSay plainly whether the diff **ran**. \"Staged\" and \"executed\" are different claims and reviewers rely on the difference.\n\n---\n\n## Related Skills\n\n| Skill | When to use |\n| --- | --- |\n| `argent-device-interact` | The `screenshot` tool itself, `scale`, rotation, gestures, troubleshooting (§ 7 is the screenshot reference) |\n| `argent-test-ui-flow` | Navigating to the staged stories; the settle/retake recovery pattern before capture |\n| `argent-ios-simulator-setup` | Booting an iOS simulator, getting a UDID |\n| `argent-android-emulator-setup` | Booting an Android emulator, getting an adb serial, `adb reverse` |\n| `argent-create-flow` | Record the navigate-and-capture sequence as a flow so before/after captures are byte-for-byte reproducible via `flow-execute` — this removes interaction variance, the largest source of diff noise |\n| `argent-react-native-app-workflow` | Getting the build installed and Metro running before any capture |\n| `tamagui-conversion` | The migration contract that requires an executed diff as the mobile proof artifact |\n","frontmatter":{"name":"argent-screenshot-diff","description":"Capture stable before/after screenshots on an iOS simulator or Android emulator and pixel-diff them into evidence. Use when asked for a visual regression check, a screenshot diff, a before/after visual comparison, or when a visible mobile UI change needs pixel proof — including the executed screenshot-diff that a Tamagui conversion batch requires."},"isInternal":false,"tokens":4494,"sizeBytes":19132},{"name":"SKILL.md","path":".agents/skills/argent-test-ui-flow/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-test-ui-flow/SKILL.md","title":"argent-test-ui-flow","category":"anthropic-skill","format":"markdown","content":"---\nname: argent-test-ui-flow\ndescription: Autonomously test an app UI (iOS or Android) by running interact-screenshot-verify loops using argent MCP tools. Use when testing a UI flow, verifying login works, testing navigation, or running an end-to-end UI test scenario.\n---\n\n## Platform-agnostic\n\nThe interaction tool names are identical on iOS and Android — `gesture-tap`, `gesture-swipe`, `describe`, `screenshot`, `launch-app`, etc. — and the tool-server auto-dispatches based on the `udid` you pass (UUID-shape → iOS, adb serial → Android).\n\nGet a `udid` via:\n\n| Platform | Setup skill                     | Find devices with                                           |\n| -------- | ------------------------------- | ----------------------------------------------------------- |\n| iOS      | `argent-ios-simulator-setup`    | `list-devices` → `boot-device` with `udid` if none booted   |\n| Android  | `argent-android-emulator-setup` | `list-devices` → `boot-device` with `avdName` if none ready |\n\n## 1. Workflow\n\nAll interactions go through argent MCP tools. Ensure the simulator/emulator is ready before starting.\n\n1. **Baseline screenshot**: Call `screenshot` to see the current UI state.\n2. **Find target**: Before tapping, use a discovery tool to get element coordinates:\n   - **React Native apps**: use `debugger-component-tree` — it returns component names with (tap: x,y) coordinates. This is the preferred tool for RN apps on either platform. To use it, resolve the `argent-react-native-app-workflow` skill for setup; on Android you must also run `adb -s <serial> reverse tcp:8081 tcp:8081` so Metro is reachable from the device.\n   - **Standard app screens and in-app modals**: use `describe`. On iOS this returns the AX tree (falls back to native-devtools when AX is empty); on Android it returns the uiautomator tree in the same DescribeNode shape.\n   - **Permission prompts / system modal overlays**: try `describe` first. Fall back to `screenshot` only if the overlay is not exposed reliably.\n   - **Fallback**: use `screenshot` to estimate where the desired component is, then verify immediately after the action.\n3. **Interact**: Perform the action (`gesture-tap`, `gesture-swipe`, `keyboard`, `button`, ...) — you receive a screenshot automatically.\n4. **Verify**: Check the returned screenshot for expected results. If it shows a loading/transitional state, retake with `screenshot`.\n5. **Repeat** for each step in the flow.\n\n## 2. Template\n\n```\nGoal: Test [feature name]\n\nSteps:\n1. screenshot → see current state (baseline)\n2. [Navigate / tap / type to reach starting point] → verify auto-screenshot\n3. [Perform the action to test] → verify auto-screenshot\n4. Report: pass / fail with details\n```\n\n## 3. Examples\n\n### Login flow\n\n```\n1. screenshot → see login screen\n2. gesture-tap { x: 0.5, y: 0.4 }  → tap email field\n3. paste { text: \"user@example.com\" }\n4. gesture-tap { x: 0.5, y: 0.55 } → tap password field\n5. paste { text: \"password123\" }\n6. gesture-tap { x: 0.5, y: 0.7 }  → tap Login button\n7. screenshot → verify home screen appeared\n```\n\n### Scroll and navigation\n\n```\n1. screenshot → see list at top\n2. gesture-swipe { fromY: 0.7, toY: 0.3 } → scroll down\n3. gesture-tap item at visible position → verify auto-screenshot\n4. screenshot → verify detail view opened\n5. button { button: \"back\" }\n6. screenshot → verify returned to list\n```\n\n---\n\n## 4. Recovery Pattern\n\n- If screenshot shows loading/transition: wait 500ms, retake with `screenshot`.\n- If tap misses target: re-run discovery tool (`describe` / `debugger-component-tree`), retry once with new coordinates.\n- If a permission dialog or modal is visible: re-run `describe` first. Stay in screenshot-driven navigation only when the overlay is not exposed reliably, then switch back to `describe` / `debugger-component-tree` as soon as it is dismissed.\n- If tap fails twice at same coordinates: stop, re-discover, report if element not found.\n- If a **saved flow** fails during `flow-execute` replay (as opposed to live test steps above): follow `argent-create-flow` skill §10 for structured diagnosis and correction.\n\n## Tips\n\n- **Use `paste` for text entry on iOS** — faster and more reliable than key-by-key `keyboard`. `paste` is iOS-only; on Android use `keyboard` instead.\n- **Use `gesture-custom` for long-press** context menus (800ms hold).\n- **Report clearly**: state what you expected, what you saw, and the verdict.\n- **Coordinate estimation**: center = 0.5, 0.5; top-third ~ 0.2; bottom-third ~ 0.8.\n- **Permission modals**: try `describe` first. Use `screenshot` only as fallback, tap one visible button at a time, and verify with the returned screenshot before continuing.\n- **Record for replay**: If a tested flow is likely to be repeated, use the `argent-create-flow` skill to record it as a `.yaml` script. This lets you replay the entire sequence later with a single `flow-execute` call instead of re-running each step manually.\n\n## Related Skills\n\n| Skill                              | When to use                                             |\n| ---------------------------------- | ------------------------------------------------------- |\n| `argent-device-interact`           | Tool usage for tapping, swiping, typing (iOS + Android) |\n| `argent-ios-simulator-setup`       | Booting and connecting an iOS simulator                 |\n| `argent-android-emulator-setup`    | Booting and connecting an Android emulator              |\n| `argent-react-native-app-workflow` | Starting the app, Metro, build issues                   |\n| `argent-metro-debugger`            | Breakpoints, console logs, JS evaluation                |\n| `argent-create-flow`               | Record a test sequence as a replayable flow             |\n","frontmatter":{"name":"argent-test-ui-flow","description":"Autonomously test an app UI (iOS or Android) by running interact-screenshot-verify loops using argent MCP tools. Use when testing a UI flow, verifying login works, testing navigation, or running an end-to-end UI test scenario."},"isInternal":false,"tokens":1363,"sizeBytes":5780},{"name":"package.json","path":"packages/analytics/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/package.json","title":"Analytics Skill","category":"anthropic-skill","format":"json","content":"# Analytics Skill\n\nPath: `packages/analytics/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/package.json)","tokens":300,"sizeBytes":178},{"name":"project.json","path":"packages/analytics/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/project.json","title":"Analytics Skill","category":"anthropic-skill","format":"json","content":"# Analytics Skill\n\nPath: `packages/analytics/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/project.json)","tokens":300,"sizeBytes":178},{"name":"tsconfig.json","path":"packages/analytics/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/tsconfig.json","title":"Analytics Skill","category":"anthropic-skill","format":"json","content":"# Analytics Skill\n\nPath: `packages/analytics/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/tsconfig.json)","tokens":300,"sizeBytes":180},{"name":"tsconfig.lint.json","path":"packages/analytics/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/tsconfig.lint.json","title":"Analytics Skill","category":"anthropic-skill","format":"json","content":"# Analytics Skill\n\nPath: `packages/analytics/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/tsconfig.lint.json)","tokens":300,"sizeBytes":190},{"name":"package.json","path":"packages/api/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/package.json","title":"Api Skill","category":"anthropic-skill","format":"json","content":"# Api Skill\n\nPath: `packages/api/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/package.json)","tokens":300,"sizeBytes":160},{"name":"project.json","path":"packages/api/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/project.json","title":"Api Skill","category":"anthropic-skill","format":"json","content":"# Api Skill\n\nPath: `packages/api/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/project.json)","tokens":300,"sizeBytes":160},{"name":"api.json","path":"packages/api/src/clients/trading/api.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/src/clients/trading/api.json","title":"Trading Skill","category":"anthropic-skill","format":"json","content":"# Trading Skill\n\nPath: `packages/api/src/clients/trading/api.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/src/clients/trading/api.json)","tokens":300,"sizeBytes":196},{"name":"tsconfig.json","path":"packages/api/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/tsconfig.json","title":"Api Skill","category":"anthropic-skill","format":"json","content":"# Api Skill\n\nPath: `packages/api/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/tsconfig.json)","tokens":300,"sizeBytes":162},{"name":"tsconfig.lint.json","path":"packages/api/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/tsconfig.lint.json","title":"Api Skill","category":"anthropic-skill","format":"json","content":"# Api Skill\n\nPath: `packages/api/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/tsconfig.lint.json)","tokens":300,"sizeBytes":172},{"name":"package.json","path":"packages/chains/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/package.json","title":"Chains Skill","category":"anthropic-skill","format":"json","content":"# Chains Skill\n\nPath: `packages/chains/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/package.json)","tokens":300,"sizeBytes":169},{"name":"project.json","path":"packages/chains/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/project.json","title":"Chains Skill","category":"anthropic-skill","format":"json","content":"# Chains Skill\n\nPath: `packages/chains/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/project.json)","tokens":300,"sizeBytes":169},{"name":"tsconfig.json","path":"packages/chains/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/tsconfig.json","title":"Chains Skill","category":"anthropic-skill","format":"json","content":"# Chains Skill\n\nPath: `packages/chains/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/tsconfig.json)","tokens":300,"sizeBytes":171},{"name":"tsconfig.lint.json","path":"packages/chains/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/tsconfig.lint.json","title":"Chains Skill","category":"anthropic-skill","format":"json","content":"# Chains Skill\n\nPath: `packages/chains/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/tsconfig.lint.json)","tokens":300,"sizeBytes":181},{"name":"package.json","path":"packages/compliance/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/package.json","title":"Compliance Skill","category":"anthropic-skill","format":"json","content":"# Compliance Skill\n\nPath: `packages/compliance/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/package.json)","tokens":300,"sizeBytes":181},{"name":"project.json","path":"packages/compliance/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/project.json","title":"Compliance Skill","category":"anthropic-skill","format":"json","content":"# Compliance Skill\n\nPath: `packages/compliance/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/project.json)","tokens":300,"sizeBytes":181},{"name":"tsconfig.json","path":"packages/compliance/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/tsconfig.json","title":"Compliance Skill","category":"anthropic-skill","format":"json","content":"# Compliance Skill\n\nPath: `packages/compliance/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/tsconfig.json)","tokens":300,"sizeBytes":183},{"name":"tsconfig.lint.json","path":"packages/compliance/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/tsconfig.lint.json","title":"Compliance Skill","category":"anthropic-skill","format":"json","content":"# Compliance Skill\n\nPath: `packages/compliance/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/tsconfig.lint.json)","tokens":300,"sizeBytes":193},{"name":"package.json","path":"packages/config-cli/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/package.json","title":"Config-cli Skill","category":"anthropic-skill","format":"json","content":"# Config-cli Skill\n\nPath: `packages/config-cli/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/package.json)","tokens":300,"sizeBytes":181},{"name":"project.json","path":"packages/config-cli/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/project.json","title":"Config-cli Skill","category":"anthropic-skill","format":"json","content":"# Config-cli Skill\n\nPath: `packages/config-cli/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/project.json)","tokens":300,"sizeBytes":181},{"name":"tsconfig.json","path":"packages/config-cli/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/tsconfig.json","title":"Config-cli Skill","category":"anthropic-skill","format":"json","content":"# Config-cli Skill\n\nPath: `packages/config-cli/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/tsconfig.json)","tokens":300,"sizeBytes":183},{"name":"tsconfig.lint.json","path":"packages/config-cli/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/tsconfig.lint.json","title":"Config-cli Skill","category":"anthropic-skill","format":"json","content":"# Config-cli Skill\n\nPath: `packages/config-cli/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/tsconfig.lint.json)","tokens":300,"sizeBytes":193},{"name":"package.json","path":"packages/config/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/package.json","title":"Config Skill","category":"anthropic-skill","format":"json","content":"# Config Skill\n\nPath: `packages/config/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/package.json)","tokens":300,"sizeBytes":169},{"name":"project.json","path":"packages/config/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/project.json","title":"Config Skill","category":"anthropic-skill","format":"json","content":"# Config Skill\n\nPath: `packages/config/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/project.json)","tokens":300,"sizeBytes":169},{"name":"tsconfig.json","path":"packages/config/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/tsconfig.json","title":"Config Skill","category":"anthropic-skill","format":"json","content":"# Config Skill\n\nPath: `packages/config/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/tsconfig.json)","tokens":300,"sizeBytes":171},{"name":"tsconfig.lint.json","path":"packages/config/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/tsconfig.lint.json","title":"Config Skill","category":"anthropic-skill","format":"json","content":"# Config Skill\n\nPath: `packages/config/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/tsconfig.lint.json)","tokens":300,"sizeBytes":181},{"name":"package.json","path":"packages/cryptography/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/package.json","title":"Cryptography Skill","category":"anthropic-skill","format":"json","content":"# Cryptography Skill\n\nPath: `packages/cryptography/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/package.json)","tokens":300,"sizeBytes":187},{"name":"project.json","path":"packages/cryptography/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/project.json","title":"Cryptography Skill","category":"anthropic-skill","format":"json","content":"# Cryptography Skill\n\nPath: `packages/cryptography/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/project.json)","tokens":300,"sizeBytes":187},{"name":"tsconfig.json","path":"packages/cryptography/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/tsconfig.json","title":"Cryptography Skill","category":"anthropic-skill","format":"json","content":"# Cryptography Skill\n\nPath: `packages/cryptography/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/tsconfig.json)","tokens":300,"sizeBytes":189},{"name":"tsconfig.lint.json","path":"packages/cryptography/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/tsconfig.lint.json","title":"Cryptography Skill","category":"anthropic-skill","format":"json","content":"# Cryptography Skill\n\nPath: `packages/cryptography/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/tsconfig.lint.json)","tokens":300,"sizeBytes":199},{"name":"shared.yaml","path":"packages/datadog-cloud/dashboards/esc/shared.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/esc/shared.yaml","title":"Esc Skill","category":"anthropic-skill","format":"yaml","content":"# Esc Skill\n\nPath: `packages/datadog-cloud/dashboards/esc/shared.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/esc/shared.yaml)","tokens":300,"sizeBytes":208},{"name":"package.json","path":"packages/datadog-cloud/dashboards/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/package.json","title":"Dashboards Skill","category":"anthropic-skill","format":"json","content":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/package.json)","tokens":300,"sizeBytes":209},{"name":"Pulumi.privy-embedded-wallet-prod.yaml","path":"packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml","title":"Dashboards Skill","category":"anthropic-skill","format":"yaml","content":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-prod.yaml)","tokens":300,"sizeBytes":261},{"name":"Pulumi.privy-embedded-wallet-staging.yaml","path":"packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml","title":"Dashboards Skill","category":"anthropic-skill","format":"yaml","content":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.privy-embedded-wallet-staging.yaml)","tokens":300,"sizeBytes":267},{"name":"Pulumi.prod.yaml","path":"packages/datadog-cloud/dashboards/Pulumi.prod.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.prod.yaml","title":"Dashboards Skill","category":"anthropic-skill","format":"yaml","content":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.prod.yaml)","tokens":300,"sizeBytes":217},{"name":"Pulumi.yaml","path":"packages/datadog-cloud/dashboards/Pulumi.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.yaml","title":"Dashboards Skill","category":"anthropic-skill","format":"yaml","content":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/Pulumi.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/Pulumi.yaml)","tokens":300,"sizeBytes":207},{"name":"tsconfig.json","path":"packages/datadog-cloud/dashboards/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/tsconfig.json","title":"Dashboards Skill","category":"anthropic-skill","format":"json","content":"# Dashboards Skill\n\nPath: `packages/datadog-cloud/dashboards/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/dashboards/tsconfig.json)","tokens":300,"sizeBytes":211},{"name":"apps-pod-swap-fe.yaml","path":"packages/datadog-cloud/esc/apps-pod-swap-fe.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/apps-pod-swap-fe.yaml","title":"Esc Skill","category":"anthropic-skill","format":"yaml","content":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/apps-pod-swap-fe.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/apps-pod-swap-fe.yaml)","tokens":300,"sizeBytes":206},{"name":"dev-portal.yaml","path":"packages/datadog-cloud/esc/dev-portal.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/dev-portal.yaml","title":"Esc Skill","category":"anthropic-skill","format":"yaml","content":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/dev-portal.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/dev-portal.yaml)","tokens":300,"sizeBytes":194},{"name":"liquidity-fe.yaml","path":"packages/datadog-cloud/esc/liquidity-fe.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/liquidity-fe.yaml","title":"Esc Skill","category":"anthropic-skill","format":"yaml","content":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/liquidity-fe.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/liquidity-fe.yaml)","tokens":300,"sizeBytes":198},{"name":"privy-embedded-wallet.yaml","path":"packages/datadog-cloud/esc/privy-embedded-wallet.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/privy-embedded-wallet.yaml","title":"Esc Skill","category":"anthropic-skill","format":"yaml","content":"# Esc Skill\n\nPath: `packages/datadog-cloud/esc/privy-embedded-wallet.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/esc/privy-embedded-wallet.yaml)","tokens":300,"sizeBytes":216},{"name":"INSTRUMENTATION_REPORT.md","path":"packages/datadog-cloud/INSTRUMENTATION_REPORT.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/INSTRUMENTATION_REPORT.md","title":"Datadog-cloud Skill","category":"anthropic-skill","format":"markdown","content":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/INSTRUMENTATION_REPORT.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/INSTRUMENTATION_REPORT.md)","tokens":300,"sizeBytes":216},{"name":"package.json","path":"packages/datadog-cloud/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/package.json","title":"Datadog-cloud Skill","category":"anthropic-skill","format":"json","content":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/package.json)","tokens":300,"sizeBytes":190},{"name":"project.json","path":"packages/datadog-cloud/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/project.json","title":"Datadog-cloud Skill","category":"anthropic-skill","format":"json","content":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/project.json)","tokens":300,"sizeBytes":190},{"name":"Pulumi.apps-pod-swap-fe-prod.yaml","path":"packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml","title":"Datadog-cloud Skill","category":"anthropic-skill","format":"yaml","content":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.apps-pod-swap-fe-prod.yaml)","tokens":300,"sizeBytes":232},{"name":"Pulumi.dev-portal-prod.yaml","path":"packages/datadog-cloud/Pulumi.dev-portal-prod.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.dev-portal-prod.yaml","title":"Datadog-cloud Skill","category":"anthropic-skill","format":"yaml","content":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.dev-portal-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.dev-portal-prod.yaml)","tokens":300,"sizeBytes":220},{"name":"Pulumi.liquidity-fe-prod.yaml","path":"packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml","title":"Datadog-cloud Skill","category":"anthropic-skill","format":"yaml","content":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.liquidity-fe-prod.yaml)","tokens":300,"sizeBytes":224},{"name":"Pulumi.privy-embedded-wallet-prod.yaml","path":"packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml","title":"Datadog-cloud Skill","category":"anthropic-skill","format":"yaml","content":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.privy-embedded-wallet-prod.yaml)","tokens":300,"sizeBytes":242},{"name":"Pulumi.privy-embedded-wallet-staging.yaml","path":"packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml","title":"Datadog-cloud Skill","category":"anthropic-skill","format":"yaml","content":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.privy-embedded-wallet-staging.yaml)","tokens":300,"sizeBytes":248},{"name":"Pulumi.yaml","path":"packages/datadog-cloud/Pulumi.yaml","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.yaml","title":"Datadog-cloud Skill","category":"anthropic-skill","format":"yaml","content":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/Pulumi.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/Pulumi.yaml)","tokens":300,"sizeBytes":188},{"name":"tsconfig.json","path":"packages/datadog-cloud/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/tsconfig.json","title":"Datadog-cloud Skill","category":"anthropic-skill","format":"json","content":"# Datadog-cloud Skill\n\nPath: `packages/datadog-cloud/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/datadog-cloud/tsconfig.json)","tokens":300,"sizeBytes":192},{"name":"package.json","path":"packages/embedded-wallet/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/package.json","title":"Embedded-wallet Skill","category":"anthropic-skill","format":"json","content":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/package.json)","tokens":300,"sizeBytes":196},{"name":"project.json","path":"packages/embedded-wallet/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/project.json","title":"Embedded-wallet Skill","category":"anthropic-skill","format":"json","content":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/project.json)","tokens":300,"sizeBytes":196},{"name":"tsconfig.json","path":"packages/embedded-wallet/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/tsconfig.json","title":"Embedded-wallet Skill","category":"anthropic-skill","format":"json","content":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/tsconfig.json)","tokens":300,"sizeBytes":198},{"name":"tsconfig.lint.json","path":"packages/embedded-wallet/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/tsconfig.lint.json","title":"Embedded-wallet Skill","category":"anthropic-skill","format":"json","content":"# Embedded-wallet Skill\n\nPath: `packages/embedded-wallet/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/tsconfig.lint.json)","tokens":300,"sizeBytes":208},{"name":"package.json","path":"packages/encoding/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/package.json","title":"Encoding Skill","category":"anthropic-skill","format":"json","content":"# Encoding Skill\n\nPath: `packages/encoding/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/package.json)","tokens":300,"sizeBytes":175},{"name":"project.json","path":"packages/encoding/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/project.json","title":"Encoding Skill","category":"anthropic-skill","format":"json","content":"# Encoding Skill\n\nPath: `packages/encoding/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/project.json)","tokens":300,"sizeBytes":175},{"name":"tsconfig.json","path":"packages/encoding/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/tsconfig.json","title":"Encoding Skill","category":"anthropic-skill","format":"json","content":"# Encoding Skill\n\nPath: `packages/encoding/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/tsconfig.json)","tokens":300,"sizeBytes":177},{"name":"tsconfig.lint.json","path":"packages/encoding/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/tsconfig.lint.json","title":"Encoding Skill","category":"anthropic-skill","format":"json","content":"# Encoding Skill\n\nPath: `packages/encoding/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/tsconfig.lint.json)","tokens":300,"sizeBytes":187},{"name":"package.json","path":"packages/environment/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/package.json","title":"Environment Skill","category":"anthropic-skill","format":"json","content":"# Environment Skill\n\nPath: `packages/environment/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/package.json)","tokens":300,"sizeBytes":184},{"name":"project.json","path":"packages/environment/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/project.json","title":"Environment Skill","category":"anthropic-skill","format":"json","content":"# Environment Skill\n\nPath: `packages/environment/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/project.json)","tokens":300,"sizeBytes":184},{"name":"tsconfig.json","path":"packages/environment/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/tsconfig.json","title":"Environment Skill","category":"anthropic-skill","format":"json","content":"# Environment Skill\n\nPath: `packages/environment/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/tsconfig.json)","tokens":300,"sizeBytes":186},{"name":"tsconfig.lint.json","path":"packages/environment/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/tsconfig.lint.json","title":"Environment Skill","category":"anthropic-skill","format":"json","content":"# Environment Skill\n\nPath: `packages/environment/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/tsconfig.lint.json)","tokens":300,"sizeBytes":196},{"name":"package.json","path":"packages/experiments/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/package.json","title":"Experiments Skill","category":"anthropic-skill","format":"json","content":"# Experiments Skill\n\nPath: `packages/experiments/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/package.json)","tokens":300,"sizeBytes":184},{"name":"project.json","path":"packages/experiments/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/project.json","title":"Experiments Skill","category":"anthropic-skill","format":"json","content":"# Experiments Skill\n\nPath: `packages/experiments/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/project.json)","tokens":300,"sizeBytes":184},{"name":"tsconfig.json","path":"packages/experiments/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/tsconfig.json","title":"Experiments Skill","category":"anthropic-skill","format":"json","content":"# Experiments Skill\n\nPath: `packages/experiments/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/tsconfig.json)","tokens":300,"sizeBytes":186},{"name":"tsconfig.lint.json","path":"packages/experiments/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/tsconfig.lint.json","title":"Experiments Skill","category":"anthropic-skill","format":"json","content":"# Experiments Skill\n\nPath: `packages/experiments/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/tsconfig.lint.json)","tokens":300,"sizeBytes":196},{"name":"package.json","path":"packages/gating/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/package.json","title":"Gating Skill","category":"anthropic-skill","format":"json","content":"# Gating Skill\n\nPath: `packages/gating/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/package.json)","tokens":300,"sizeBytes":169},{"name":"project.json","path":"packages/gating/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/project.json","title":"Gating Skill","category":"anthropic-skill","format":"json","content":"# Gating Skill\n\nPath: `packages/gating/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/project.json)","tokens":300,"sizeBytes":169},{"name":"tsconfig.json","path":"packages/gating/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/tsconfig.json","title":"Gating Skill","category":"anthropic-skill","format":"json","content":"# Gating Skill\n\nPath: `packages/gating/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/tsconfig.json)","tokens":300,"sizeBytes":171},{"name":"tsconfig.lint.json","path":"packages/gating/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/tsconfig.lint.json","title":"Gating Skill","category":"anthropic-skill","format":"json","content":"# Gating Skill\n\nPath: `packages/gating/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/tsconfig.lint.json)","tokens":300,"sizeBytes":181},{"name":"nitro.json","path":"packages/hashcash-native/nitro.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/nitro.json","title":"Hashcash-native Skill","category":"anthropic-skill","format":"json","content":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/nitro.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/nitro.json)","tokens":300,"sizeBytes":192},{"name":"package.json","path":"packages/hashcash-native/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/package.json","title":"Hashcash-native Skill","category":"anthropic-skill","format":"json","content":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/package.json)","tokens":300,"sizeBytes":196},{"name":"project.json","path":"packages/hashcash-native/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/project.json","title":"Hashcash-native Skill","category":"anthropic-skill","format":"json","content":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/project.json)","tokens":300,"sizeBytes":196},{"name":"tsconfig.json","path":"packages/hashcash-native/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/tsconfig.json","title":"Hashcash-native Skill","category":"anthropic-skill","format":"json","content":"# Hashcash-native Skill\n\nPath: `packages/hashcash-native/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/tsconfig.json)","tokens":300,"sizeBytes":198},{"name":"package.json","path":"packages/logger/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/package.json","title":"Logger Skill","category":"anthropic-skill","format":"json","content":"# Logger Skill\n\nPath: `packages/logger/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/package.json)","tokens":300,"sizeBytes":169},{"name":"project.json","path":"packages/logger/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/project.json","title":"Logger Skill","category":"anthropic-skill","format":"json","content":"# Logger Skill\n\nPath: `packages/logger/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/project.json)","tokens":300,"sizeBytes":169},{"name":"tsconfig.json","path":"packages/logger/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/tsconfig.json","title":"Logger Skill","category":"anthropic-skill","format":"json","content":"# Logger Skill\n\nPath: `packages/logger/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/tsconfig.json)","tokens":300,"sizeBytes":171},{"name":"tsconfig.lint.json","path":"packages/logger/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/tsconfig.lint.json","title":"Logger Skill","category":"anthropic-skill","format":"json","content":"# Logger Skill\n\nPath: `packages/logger/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/tsconfig.lint.json)","tokens":300,"sizeBytes":181},{"name":"package.json","path":"packages/mycelium/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/package.json","title":"Mycelium Skill","category":"anthropic-skill","format":"json","content":"# Mycelium Skill\n\nPath: `packages/mycelium/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/package.json)","tokens":300,"sizeBytes":175},{"name":"platform-legs.json","path":"packages/mycelium/platform-legs.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/platform-legs.json","title":"Mycelium Skill","category":"anthropic-skill","format":"json","content":"# Mycelium Skill\n\nPath: `packages/mycelium/platform-legs.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/platform-legs.json)","tokens":300,"sizeBytes":187},{"name":"project.json","path":"packages/mycelium/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/project.json","title":"Mycelium Skill","category":"anthropic-skill","format":"json","content":"# Mycelium Skill\n\nPath: `packages/mycelium/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/project.json)","tokens":300,"sizeBytes":175},{"name":"tsconfig.json","path":"packages/mycelium/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.json","title":"Mycelium Skill","category":"anthropic-skill","format":"json","content":"# Mycelium Skill\n\nPath: `packages/mycelium/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.json)","tokens":300,"sizeBytes":177},{"name":"tsconfig.lint.json","path":"packages/mycelium/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.lint.json","title":"Mycelium Skill","category":"anthropic-skill","format":"json","content":"# Mycelium Skill\n\nPath: `packages/mycelium/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.lint.json)","tokens":300,"sizeBytes":187},{"name":"tsconfig.test.json","path":"packages/mycelium/tsconfig.test.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.test.json","title":"Mycelium Skill","category":"anthropic-skill","format":"json","content":"# Mycelium Skill\n\nPath: `packages/mycelium/tsconfig.test.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/tsconfig.test.json)","tokens":300,"sizeBytes":187},{"name":"package.json","path":"packages/notifications/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/package.json","title":"Notifications Skill","category":"anthropic-skill","format":"json","content":"# Notifications Skill\n\nPath: `packages/notifications/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/package.json)","tokens":300,"sizeBytes":190},{"name":"project.json","path":"packages/notifications/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/project.json","title":"Notifications Skill","category":"anthropic-skill","format":"json","content":"# Notifications Skill\n\nPath: `packages/notifications/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/project.json)","tokens":300,"sizeBytes":190},{"name":"tsconfig.json","path":"packages/notifications/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/tsconfig.json","title":"Notifications Skill","category":"anthropic-skill","format":"json","content":"# Notifications Skill\n\nPath: `packages/notifications/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/tsconfig.json)","tokens":300,"sizeBytes":192},{"name":"tsconfig.lint.json","path":"packages/notifications/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/tsconfig.lint.json","title":"Notifications Skill","category":"anthropic-skill","format":"json","content":"# Notifications Skill\n\nPath: `packages/notifications/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/tsconfig.lint.json)","tokens":300,"sizeBytes":202},{"name":"package.json","path":"packages/prices/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/package.json","title":"Prices Skill","category":"anthropic-skill","format":"json","content":"# Prices Skill\n\nPath: `packages/prices/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/package.json)","tokens":300,"sizeBytes":169},{"name":"project.json","path":"packages/prices/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/project.json","title":"Prices Skill","category":"anthropic-skill","format":"json","content":"# Prices Skill\n\nPath: `packages/prices/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/project.json)","tokens":300,"sizeBytes":169},{"name":"tsconfig.json","path":"packages/prices/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/tsconfig.json","title":"Prices Skill","category":"anthropic-skill","format":"json","content":"# Prices Skill\n\nPath: `packages/prices/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/tsconfig.json)","tokens":300,"sizeBytes":171},{"name":"tsconfig.lint.json","path":"packages/prices/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/tsconfig.lint.json","title":"Prices Skill","category":"anthropic-skill","format":"json","content":"# Prices Skill\n\nPath: `packages/prices/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/tsconfig.lint.json)","tokens":300,"sizeBytes":181},{"name":"package.json","path":"packages/privacy/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/package.json","title":"Privacy Skill","category":"anthropic-skill","format":"json","content":"# Privacy Skill\n\nPath: `packages/privacy/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/package.json)","tokens":300,"sizeBytes":172},{"name":"project.json","path":"packages/privacy/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/project.json","title":"Privacy Skill","category":"anthropic-skill","format":"json","content":"# Privacy Skill\n\nPath: `packages/privacy/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/project.json)","tokens":300,"sizeBytes":172},{"name":"wallet-secret-keys.json","path":"packages/privacy/src/wallet-secret-keys.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/src/wallet-secret-keys.json","title":"Src Skill","category":"anthropic-skill","format":"json","content":"# Src Skill\n\nPath: `packages/privacy/src/wallet-secret-keys.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/src/wallet-secret-keys.json)","tokens":300,"sizeBytes":198},{"name":"tsconfig.json","path":"packages/privacy/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/tsconfig.json","title":"Privacy Skill","category":"anthropic-skill","format":"json","content":"# Privacy Skill\n\nPath: `packages/privacy/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/tsconfig.json)","tokens":300,"sizeBytes":174},{"name":"tsconfig.lint.json","path":"packages/privacy/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/tsconfig.lint.json","title":"Privacy Skill","category":"anthropic-skill","format":"json","content":"# Privacy Skill\n\nPath: `packages/privacy/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/tsconfig.lint.json)","tokens":300,"sizeBytes":184},{"name":"package.json","path":"packages/react-query/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/package.json","title":"React-query Skill","category":"anthropic-skill","format":"json","content":"# React-query Skill\n\nPath: `packages/react-query/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/package.json)","tokens":300,"sizeBytes":184},{"name":"project.json","path":"packages/react-query/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/project.json","title":"React-query Skill","category":"anthropic-skill","format":"json","content":"# React-query Skill\n\nPath: `packages/react-query/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/project.json)","tokens":300,"sizeBytes":184},{"name":"tsconfig.json","path":"packages/react-query/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/tsconfig.json","title":"React-query Skill","category":"anthropic-skill","format":"json","content":"# React-query Skill\n\nPath: `packages/react-query/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/tsconfig.json)","tokens":300,"sizeBytes":186},{"name":"tsconfig.lint.json","path":"packages/react-query/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/tsconfig.lint.json","title":"React-query Skill","category":"anthropic-skill","format":"json","content":"# React-query Skill\n\nPath: `packages/react-query/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/tsconfig.lint.json)","tokens":300,"sizeBytes":196},{"name":"package.json","path":"packages/sessions/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/package.json","title":"Sessions Skill","category":"anthropic-skill","format":"json","content":"# Sessions Skill\n\nPath: `packages/sessions/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/package.json)","tokens":300,"sizeBytes":175},{"name":"project.json","path":"packages/sessions/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/project.json","title":"Sessions Skill","category":"anthropic-skill","format":"json","content":"# Sessions Skill\n\nPath: `packages/sessions/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/project.json)","tokens":300,"sizeBytes":175},{"name":"tsconfig.json","path":"packages/sessions/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/tsconfig.json","title":"Sessions Skill","category":"anthropic-skill","format":"json","content":"# Sessions Skill\n\nPath: `packages/sessions/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/tsconfig.json)","tokens":300,"sizeBytes":177},{"name":"tsconfig.lint.json","path":"packages/sessions/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/tsconfig.lint.json","title":"Sessions Skill","category":"anthropic-skill","format":"json","content":"# Sessions Skill\n\nPath: `packages/sessions/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/tsconfig.lint.json)","tokens":300,"sizeBytes":187},{"name":"package.json","path":"packages/tailwind/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/package.json","title":"Tailwind Skill","category":"anthropic-skill","format":"json","content":"# Tailwind Skill\n\nPath: `packages/tailwind/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/package.json)","tokens":300,"sizeBytes":175},{"name":"project.json","path":"packages/tailwind/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/project.json","title":"Tailwind Skill","category":"anthropic-skill","format":"json","content":"# Tailwind Skill\n\nPath: `packages/tailwind/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/project.json)","tokens":300,"sizeBytes":175},{"name":"tsconfig.cross-package.json","path":"packages/tailwind/tsconfig.cross-package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.cross-package.json","title":"Tailwind Skill","category":"anthropic-skill","format":"json","content":"# Tailwind Skill\n\nPath: `packages/tailwind/tsconfig.cross-package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.cross-package.json)","tokens":300,"sizeBytes":205},{"name":"tsconfig.json","path":"packages/tailwind/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.json","title":"Tailwind Skill","category":"anthropic-skill","format":"json","content":"# Tailwind Skill\n\nPath: `packages/tailwind/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.json)","tokens":300,"sizeBytes":177},{"name":"tsconfig.lint.json","path":"packages/tailwind/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.lint.json","title":"Tailwind Skill","category":"anthropic-skill","format":"json","content":"# Tailwind Skill\n\nPath: `packages/tailwind/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/tsconfig.lint.json)","tokens":300,"sizeBytes":187},{"name":"package.json","path":"packages/test/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/package.json","title":"Test Skill","category":"anthropic-skill","format":"json","content":"# Test Skill\n\nPath: `packages/test/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/package.json)","tokens":300,"sizeBytes":163},{"name":"project.json","path":"packages/test/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/project.json","title":"Test Skill","category":"anthropic-skill","format":"json","content":"# Test Skill\n\nPath: `packages/test/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/project.json)","tokens":300,"sizeBytes":163},{"name":"tsconfig.json","path":"packages/test/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/tsconfig.json","title":"Test Skill","category":"anthropic-skill","format":"json","content":"# Test Skill\n\nPath: `packages/test/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/tsconfig.json)","tokens":300,"sizeBytes":165},{"name":"package.json","path":"packages/trpc/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/package.json","title":"Trpc Skill","category":"anthropic-skill","format":"json","content":"# Trpc Skill\n\nPath: `packages/trpc/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/package.json)","tokens":300,"sizeBytes":163},{"name":"project.json","path":"packages/trpc/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/project.json","title":"Trpc Skill","category":"anthropic-skill","format":"json","content":"# Trpc Skill\n\nPath: `packages/trpc/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/project.json)","tokens":300,"sizeBytes":163},{"name":"tsconfig.json","path":"packages/trpc/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/tsconfig.json","title":"Trpc Skill","category":"anthropic-skill","format":"json","content":"# Trpc Skill\n\nPath: `packages/trpc/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/tsconfig.json)","tokens":300,"sizeBytes":165},{"name":"tsconfig.lint.json","path":"packages/trpc/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/tsconfig.lint.json","title":"Trpc Skill","category":"anthropic-skill","format":"json","content":"# Trpc Skill\n\nPath: `packages/trpc/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/tsconfig.lint.json)","tokens":300,"sizeBytes":175},{"name":"package.json","path":"packages/ui/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/package.json","title":"Ui Skill","category":"anthropic-skill","format":"json","content":"# Ui Skill\n\nPath: `packages/ui/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/package.json)","tokens":300,"sizeBytes":157},{"name":"project.json","path":"packages/ui/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/project.json","title":"Ui Skill","category":"anthropic-skill","format":"json","content":"# Ui Skill\n\nPath: `packages/ui/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/project.json)","tokens":300,"sizeBytes":157},{"name":"tsconfig.json","path":"packages/ui/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/tsconfig.json","title":"Ui Skill","category":"anthropic-skill","format":"json","content":"# Ui Skill\n\nPath: `packages/ui/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/tsconfig.json)","tokens":300,"sizeBytes":159},{"name":"tsconfig.lint.json","path":"packages/ui/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/tsconfig.lint.json","title":"Ui Skill","category":"anthropic-skill","format":"json","content":"# Ui Skill\n\nPath: `packages/ui/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/tsconfig.lint.json)","tokens":300,"sizeBytes":169},{"name":"openapitools.json","path":"packages/uniswap/openapitools.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/openapitools.json","title":"Uniswap Skill","category":"anthropic-skill","format":"json","content":"# Uniswap Skill\n\nPath: `packages/uniswap/openapitools.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/openapitools.json)","tokens":300,"sizeBytes":182},{"name":"package.json","path":"packages/uniswap/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/package.json","title":"Uniswap Skill","category":"anthropic-skill","format":"json","content":"# Uniswap Skill\n\nPath: `packages/uniswap/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/package.json)","tokens":300,"sizeBytes":172},{"name":"project.json","path":"packages/uniswap/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/project.json","title":"Uniswap Skill","category":"anthropic-skill","format":"json","content":"# Uniswap Skill\n\nPath: `packages/uniswap/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/project.json)","tokens":300,"sizeBytes":172},{"name":"erc1155.json","path":"packages/uniswap/src/abis/erc1155.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc1155.json","title":"Abis Skill","category":"anthropic-skill","format":"json","content":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc1155.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc1155.json)","tokens":300,"sizeBytes":187},{"name":"erc20_bytes32.json","path":"packages/uniswap/src/abis/erc20_bytes32.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc20_bytes32.json","title":"Abis Skill","category":"anthropic-skill","format":"json","content":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc20_bytes32.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc20_bytes32.json)","tokens":300,"sizeBytes":199},{"name":"erc20.json","path":"packages/uniswap/src/abis/erc20.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc20.json","title":"Abis Skill","category":"anthropic-skill","format":"json","content":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc20.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc20.json)","tokens":300,"sizeBytes":183},{"name":"erc721.json","path":"packages/uniswap/src/abis/erc721.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc721.json","title":"Abis Skill","category":"anthropic-skill","format":"json","content":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/erc721.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/erc721.json)","tokens":300,"sizeBytes":185},{"name":"fee-on-transfer-detector.json","path":"packages/uniswap/src/abis/fee-on-transfer-detector.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/fee-on-transfer-detector.json","title":"Abis Skill","category":"anthropic-skill","format":"json","content":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/fee-on-transfer-detector.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/fee-on-transfer-detector.json)","tokens":300,"sizeBytes":221},{"name":"permit2.json","path":"packages/uniswap/src/abis/permit2.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/permit2.json","title":"Abis Skill","category":"anthropic-skill","format":"json","content":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/permit2.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/permit2.json)","tokens":300,"sizeBytes":187},{"name":"weth.json","path":"packages/uniswap/src/abis/weth.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/weth.json","title":"Abis Skill","category":"anthropic-skill","format":"json","content":"# Abis Skill\n\nPath: `packages/uniswap/src/abis/weth.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/abis/weth.json)","tokens":300,"sizeBytes":181},{"name":"en-US.json","path":"packages/uniswap/src/i18n/locales/source/en-US.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/source/en-US.json","title":"Source Skill","category":"anthropic-skill","format":"json","content":"# Source Skill\n\nPath: `packages/uniswap/src/i18n/locales/source/en-US.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/source/en-US.json)","tokens":300,"sizeBytes":215},{"name":"es-ES.json","path":"packages/uniswap/src/i18n/locales/translations/es-ES.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/es-ES.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/es-ES.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/es-ES.json)","tokens":300,"sizeBytes":233},{"name":"fr-FR.json","path":"packages/uniswap/src/i18n/locales/translations/fr-FR.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/fr-FR.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/fr-FR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/fr-FR.json)","tokens":300,"sizeBytes":233},{"name":"id-ID.json","path":"packages/uniswap/src/i18n/locales/translations/id-ID.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/id-ID.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/id-ID.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/id-ID.json)","tokens":300,"sizeBytes":233},{"name":"ja-JP.json","path":"packages/uniswap/src/i18n/locales/translations/ja-JP.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ja-JP.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/ja-JP.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ja-JP.json)","tokens":300,"sizeBytes":233},{"name":"ko-KR.json","path":"packages/uniswap/src/i18n/locales/translations/ko-KR.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ko-KR.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/ko-KR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ko-KR.json)","tokens":300,"sizeBytes":233},{"name":"nl-NL.json","path":"packages/uniswap/src/i18n/locales/translations/nl-NL.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/nl-NL.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/nl-NL.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/nl-NL.json)","tokens":300,"sizeBytes":233},{"name":"pt-BR.json","path":"packages/uniswap/src/i18n/locales/translations/pt-BR.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/pt-BR.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/pt-BR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/pt-BR.json)","tokens":300,"sizeBytes":233},{"name":"pt-PT.json","path":"packages/uniswap/src/i18n/locales/translations/pt-PT.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/pt-PT.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/pt-PT.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/pt-PT.json)","tokens":300,"sizeBytes":233},{"name":"ru-RU.json","path":"packages/uniswap/src/i18n/locales/translations/ru-RU.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ru-RU.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/ru-RU.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/ru-RU.json)","tokens":300,"sizeBytes":233},{"name":"tr-TR.json","path":"packages/uniswap/src/i18n/locales/translations/tr-TR.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/tr-TR.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/tr-TR.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/tr-TR.json)","tokens":300,"sizeBytes":233},{"name":"vi-VN.json","path":"packages/uniswap/src/i18n/locales/translations/vi-VN.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/vi-VN.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/vi-VN.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/vi-VN.json)","tokens":300,"sizeBytes":233},{"name":"zh-CN.json","path":"packages/uniswap/src/i18n/locales/translations/zh-CN.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/zh-CN.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/zh-CN.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/zh-CN.json)","tokens":300,"sizeBytes":233},{"name":"zh-TW.json","path":"packages/uniswap/src/i18n/locales/translations/zh-TW.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/zh-TW.json","title":"Translations Skill","category":"anthropic-skill","format":"json","content":"# Translations Skill\n\nPath: `packages/uniswap/src/i18n/locales/translations/zh-TW.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/i18n/locales/translations/zh-TW.json)","tokens":300,"sizeBytes":233},{"name":"tsconfig.json","path":"packages/uniswap/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/tsconfig.json","title":"Uniswap Skill","category":"anthropic-skill","format":"json","content":"# Uniswap Skill\n\nPath: `packages/uniswap/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/tsconfig.json)","tokens":300,"sizeBytes":174},{"name":"tsconfig.lint.json","path":"packages/uniswap/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/tsconfig.lint.json","title":"Uniswap Skill","category":"anthropic-skill","format":"json","content":"# Uniswap Skill\n\nPath: `packages/uniswap/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/tsconfig.lint.json)","tokens":300,"sizeBytes":184},{"name":"package.json","path":"packages/utilities/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/package.json","title":"Utilities Skill","category":"anthropic-skill","format":"json","content":"# Utilities Skill\n\nPath: `packages/utilities/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/package.json)","tokens":300,"sizeBytes":178},{"name":"project.json","path":"packages/utilities/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/project.json","title":"Utilities Skill","category":"anthropic-skill","format":"json","content":"# Utilities Skill\n\nPath: `packages/utilities/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/project.json)","tokens":300,"sizeBytes":178},{"name":"tsconfig.json","path":"packages/utilities/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/tsconfig.json","title":"Utilities Skill","category":"anthropic-skill","format":"json","content":"# Utilities Skill\n\nPath: `packages/utilities/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/tsconfig.json)","tokens":300,"sizeBytes":180},{"name":"tsconfig.lint.json","path":"packages/utilities/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/tsconfig.lint.json","title":"Utilities Skill","category":"anthropic-skill","format":"json","content":"# Utilities Skill\n\nPath: `packages/utilities/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/tsconfig.lint.json)","tokens":300,"sizeBytes":190},{"name":"package.json","path":"packages/wallet/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/package.json","title":"Wallet Skill","category":"anthropic-skill","format":"json","content":"# Wallet Skill\n\nPath: `packages/wallet/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/package.json)","tokens":300,"sizeBytes":169},{"name":"project.json","path":"packages/wallet/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/project.json","title":"Wallet Skill","category":"anthropic-skill","format":"json","content":"# Wallet Skill\n\nPath: `packages/wallet/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/project.json)","tokens":300,"sizeBytes":169},{"name":"tsconfig.json","path":"packages/wallet/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/tsconfig.json","title":"Wallet Skill","category":"anthropic-skill","format":"json","content":"# Wallet Skill\n\nPath: `packages/wallet/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/tsconfig.json)","tokens":300,"sizeBytes":171},{"name":"tsconfig.lint.json","path":"packages/wallet/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/tsconfig.lint.json","title":"Wallet Skill","category":"anthropic-skill","format":"json","content":"# Wallet Skill\n\nPath: `packages/wallet/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/tsconfig.lint.json)","tokens":300,"sizeBytes":181},{"name":"package.json","path":"packages/websocket/package.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/package.json","title":"Websocket Skill","category":"anthropic-skill","format":"json","content":"# Websocket Skill\n\nPath: `packages/websocket/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/package.json)","tokens":300,"sizeBytes":178},{"name":"project.json","path":"packages/websocket/project.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/project.json","title":"Websocket Skill","category":"anthropic-skill","format":"json","content":"# Websocket Skill\n\nPath: `packages/websocket/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/project.json)","tokens":300,"sizeBytes":178},{"name":"tsconfig.json","path":"packages/websocket/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/tsconfig.json","title":"Websocket Skill","category":"anthropic-skill","format":"json","content":"# Websocket Skill\n\nPath: `packages/websocket/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/tsconfig.json)","tokens":300,"sizeBytes":180},{"name":"tsconfig.lint.json","path":"packages/websocket/tsconfig.lint.json","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/tsconfig.lint.json","title":"Websocket Skill","category":"anthropic-skill","format":"json","content":"# Websocket Skill\n\nPath: `packages/websocket/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/tsconfig.lint.json)","tokens":300,"sizeBytes":190},{"name":"README.md","path":"packages/analytics/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/README.md","title":"analytics Documentation","category":"plugin-manifest","format":"markdown","content":"# analytics Documentation\n\nPath: `packages/analytics/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/README.md)","tokens":300,"sizeBytes":180},{"name":"README.md","path":"packages/api/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/README.md","title":"api Documentation","category":"plugin-manifest","format":"markdown","content":"# api Documentation\n\nPath: `packages/api/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/README.md)","tokens":300,"sizeBytes":162},{"name":"README.md","path":"packages/chains/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/README.md","title":"chains Documentation","category":"plugin-manifest","format":"markdown","content":"# chains Documentation\n\nPath: `packages/chains/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/README.md)","tokens":300,"sizeBytes":171},{"name":"README.md","path":"packages/compliance/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/README.md","title":"compliance Documentation","category":"plugin-manifest","format":"markdown","content":"# compliance Documentation\n\nPath: `packages/compliance/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/compliance/README.md)","tokens":300,"sizeBytes":183},{"name":"README.md","path":"packages/config-cli/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/README.md","title":"config-cli Documentation","category":"plugin-manifest","format":"markdown","content":"# config-cli Documentation\n\nPath: `packages/config-cli/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config-cli/README.md)","tokens":300,"sizeBytes":183},{"name":"README.md","path":"packages/config/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/README.md","title":"config Documentation","category":"plugin-manifest","format":"markdown","content":"# config Documentation\n\nPath: `packages/config/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/config/README.md)","tokens":300,"sizeBytes":171},{"name":"README.md","path":"packages/cryptography/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/README.md","title":"cryptography Documentation","category":"plugin-manifest","format":"markdown","content":"# cryptography Documentation\n\nPath: `packages/cryptography/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/cryptography/README.md)","tokens":300,"sizeBytes":189},{"name":"README.md","path":"packages/embedded-wallet/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/README.md","title":"embedded-wallet Documentation","category":"plugin-manifest","format":"markdown","content":"# embedded-wallet Documentation\n\nPath: `packages/embedded-wallet/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/embedded-wallet/README.md)","tokens":300,"sizeBytes":198},{"name":"README.md","path":"packages/encoding/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/README.md","title":"encoding Documentation","category":"plugin-manifest","format":"markdown","content":"# encoding Documentation\n\nPath: `packages/encoding/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/encoding/README.md)","tokens":300,"sizeBytes":177},{"name":"README.md","path":"packages/environment/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/README.md","title":"environment Documentation","category":"plugin-manifest","format":"markdown","content":"# environment Documentation\n\nPath: `packages/environment/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/environment/README.md)","tokens":300,"sizeBytes":186},{"name":"README.md","path":"packages/experiments/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/README.md","title":"experiments Documentation","category":"plugin-manifest","format":"markdown","content":"# experiments Documentation\n\nPath: `packages/experiments/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/experiments/README.md)","tokens":300,"sizeBytes":186},{"name":"README.md","path":"packages/gating/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/README.md","title":"gating Documentation","category":"plugin-manifest","format":"markdown","content":"# gating Documentation\n\nPath: `packages/gating/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/gating/README.md)","tokens":300,"sizeBytes":171},{"name":"README.md","path":"packages/hashcash-native/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/README.md","title":"hashcash-native Documentation","category":"plugin-manifest","format":"markdown","content":"# hashcash-native Documentation\n\nPath: `packages/hashcash-native/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/hashcash-native/README.md)","tokens":300,"sizeBytes":198},{"name":"README.md","path":"packages/logger/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/README.md","title":"logger Documentation","category":"plugin-manifest","format":"markdown","content":"# logger Documentation\n\nPath: `packages/logger/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/logger/README.md)","tokens":300,"sizeBytes":171},{"name":"README.md","path":"packages/mycelium/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/README.md","title":"mycelium Documentation","category":"plugin-manifest","format":"markdown","content":"# mycelium Documentation\n\nPath: `packages/mycelium/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/mycelium/README.md)","tokens":300,"sizeBytes":177},{"name":"README.md","path":"packages/notifications/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/README.md","title":"notifications Documentation","category":"plugin-manifest","format":"markdown","content":"# notifications Documentation\n\nPath: `packages/notifications/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/notifications/README.md)","tokens":300,"sizeBytes":192},{"name":"README.md","path":"packages/prices/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/README.md","title":"prices Documentation","category":"plugin-manifest","format":"markdown","content":"# prices Documentation\n\nPath: `packages/prices/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/prices/README.md)","tokens":300,"sizeBytes":171},{"name":"README.md","path":"packages/privacy/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/README.md","title":"privacy Documentation","category":"plugin-manifest","format":"markdown","content":"# privacy Documentation\n\nPath: `packages/privacy/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/privacy/README.md)","tokens":300,"sizeBytes":174},{"name":"README.md","path":"packages/react-query/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/README.md","title":"react-query Documentation","category":"plugin-manifest","format":"markdown","content":"# react-query Documentation\n\nPath: `packages/react-query/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/react-query/README.md)","tokens":300,"sizeBytes":186},{"name":"README.md","path":"packages/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/README.md","title":"packages Documentation","category":"plugin-manifest","format":"markdown","content":"# packages Documentation\n\nPath: `packages/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/README.md)","tokens":300,"sizeBytes":159},{"name":"README.md","path":"packages/sessions/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/README.md","title":"sessions Documentation","category":"plugin-manifest","format":"markdown","content":"# sessions Documentation\n\nPath: `packages/sessions/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/sessions/README.md)","tokens":300,"sizeBytes":177},{"name":"README.md","path":"packages/tailwind/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/README.md","title":"tailwind Documentation","category":"plugin-manifest","format":"markdown","content":"# tailwind Documentation\n\nPath: `packages/tailwind/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/tailwind/README.md)","tokens":300,"sizeBytes":177},{"name":"README.md","path":"packages/test/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/README.md","title":"test Documentation","category":"plugin-manifest","format":"markdown","content":"# test Documentation\n\nPath: `packages/test/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/test/README.md)","tokens":300,"sizeBytes":165},{"name":"README.md","path":"packages/trpc/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/README.md","title":"trpc Documentation","category":"plugin-manifest","format":"markdown","content":"# trpc Documentation\n\nPath: `packages/trpc/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/trpc/README.md)","tokens":300,"sizeBytes":165},{"name":"README.md","path":"packages/ui/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/README.md","title":"ui Documentation","category":"plugin-manifest","format":"markdown","content":"# ui Documentation\n\nPath: `packages/ui/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/ui/README.md)","tokens":300,"sizeBytes":159},{"name":"README.md","path":"packages/uniswap/src/features/accounts/store/types/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/features/accounts/store/types/README.md","title":"types Documentation","category":"plugin-manifest","format":"markdown","content":"# types Documentation\n\nPath: `packages/uniswap/src/features/accounts/store/types/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/features/accounts/store/types/README.md)","tokens":300,"sizeBytes":240},{"name":"README.md","path":"packages/uniswap/src/features/transactions/swap/components/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/features/transactions/swap/components/README.md","title":"components Documentation","category":"plugin-manifest","format":"markdown","content":"# components Documentation\n\nPath: `packages/uniswap/src/features/transactions/swap/components/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/features/transactions/swap/components/README.md)","tokens":300,"sizeBytes":261},{"name":"README.md","path":"packages/uniswap/src/state/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/state/README.md","title":"state Documentation","category":"plugin-manifest","format":"markdown","content":"# state Documentation\n\nPath: `packages/uniswap/src/state/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/uniswap/src/state/README.md)","tokens":300,"sizeBytes":192},{"name":"README.md","path":"packages/utilities/src/logger/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/logger/README.md","title":"logger Documentation","category":"plugin-manifest","format":"markdown","content":"# logger Documentation\n\nPath: `packages/utilities/src/logger/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/logger/README.md)","tokens":300,"sizeBytes":199},{"name":"README.md","path":"packages/utilities/src/telemetry/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/telemetry/README.md","title":"telemetry Documentation","category":"plugin-manifest","format":"markdown","content":"# telemetry Documentation\n\nPath: `packages/utilities/src/telemetry/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/telemetry/README.md)","tokens":300,"sizeBytes":208},{"name":"README.md","path":"packages/utilities/src/telemetry/trace/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/telemetry/trace/README.md","title":"trace Documentation","category":"plugin-manifest","format":"markdown","content":"# trace Documentation\n\nPath: `packages/utilities/src/telemetry/trace/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/utilities/src/telemetry/trace/README.md)","tokens":300,"sizeBytes":216},{"name":"README.md","path":"packages/wallet/src/features/forceUpgrade/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/features/forceUpgrade/README.md","title":"forceUpgrade Documentation","category":"plugin-manifest","format":"markdown","content":"# forceUpgrade Documentation\n\nPath: `packages/wallet/src/features/forceUpgrade/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/features/forceUpgrade/README.md)","tokens":300,"sizeBytes":229},{"name":"README.md","path":"packages/wallet/src/state/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/state/README.md","title":"state Documentation","category":"plugin-manifest","format":"markdown","content":"# state Documentation\n\nPath: `packages/wallet/src/state/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/state/README.md)","tokens":300,"sizeBytes":190},{"name":"README.md","path":"packages/wallet/src/test/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/test/README.md","title":"test Documentation","category":"plugin-manifest","format":"markdown","content":"# test Documentation\n\nPath: `packages/wallet/src/test/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/wallet/src/test/README.md)","tokens":300,"sizeBytes":187},{"name":"README.md","path":"packages/websocket/README.md","rawUrl":"https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/README.md","title":"websocket Documentation","category":"plugin-manifest","format":"markdown","content":"# websocket Documentation\n\nPath: `packages/websocket/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/websocket/README.md)","tokens":300,"sizeBytes":180}],"systemPromptSnippet":"<yakaai_skills repo=\"Uniswap/interface\">\n<!-- File: AGENTS.md (Tokens: ~2381 | Category: root-instruction) -->\n# AGENTS.md\n\nThis file provides guidance to AI agents when working with code in this repository. Always run all tests, lint, and typecheck after making changes, and before considering a task to be 'complete'.\n\n## Project Overview\n\nUniswap Universe is a monorepo containing all Uniswap front-end interfaces:\n\n- **Web** (`apps/web/`) - Decentralized exchange web interface\n- **Mobile** (`apps/mobile/`) - React Native app for iOS/Android\n- **Extension** (`apps/extension/`) - Browser wallet extension\n\n## Common Development Commands\n\n### Setup\n\n```bash\n# Initial setup\nbun install\nbun local:check\nbun config:login\n```\n\n### Development Servers\n\n```bash\nbun web dev        # Web with Vite\nbun mobile ios          # iOS app\nbun mobile android      # Android app\nbun extension start     # Extension\n```\n\n### Building\n\n```bash\nbun web build:production    # Web production build\nbun mobile ios:bundle            # iOS bundle\nbun mobile android:release       # Android release\nbun extension build:production   # Extension production\n```\n\n### Testing\n\n```bash\nbun g:test                      # Run all tests\nbun g:test:changed              # Run tests for changed packages\nbun web playwright:test         # Web E2E tests\nbun mobile e2e                  # Mobile E2E tests\n```\n\n### Code Quality\n\n```bash\nbun g:lint:fix                  # Fix linting issues\nbun g:typecheck                 # Type check all packages\nbun g:format                    # Fix formatting\nbun i18n:extract                # Extract localized strings (run after changing translations)\n```\n\n## Architecture Overview\n\n### Monorepo Structure\n\n- **NX** for build orchestration\n- **Bun workspaces** for package management\n- Shared code in `packages/` directory\n- App-specific code in `apps/` directory\n\n### Key Technologies\n\n- **TypeScript** everywhere\n- **React** for web/extension\n- **React Native** for mobile\n- **Redux Toolkit** for state management\n- **Ethers.js/Viem** for blockchain interactions\n\n### Code Organization Principles\n\n#### Styling\n\n- **ALWAYS** use `styled` from `ui/src` (never styled-components); UI components may use inline styling where appropriate\n- Use theme tokens instead of hardcoded values\n- Platform-specific files: `Component.ios.tsx`, `Component.android.tsx`, `Component.web.tsx`, `Component.native.tsx` (with stub files for platforms where specific implementation isn't needed)\n\n#### Images and Icons\n\n- Search `packages/mycelium/src/assets` and the generated icon components (`@universe/mycelium/icons`, `ui/src/components/icons`) before adding an image or icon\n- Shared images go in `packages/mycelium/src/assets`, imported from `@universe/mycelium/assets`; an app's own directory is fine for an image only that app uses\n- Import generated icon components instead of `.svg` files; add new icons with `bun scripts/add-icons.ts` and the `build:icons` targets\n- Don't inline SVG markup in component files unless it needs something a static icon can't do, like per-path animation or data-driven geometry\n\n#### State Management\n\n- **Redux** for complex global state\n- **Zustand** for simple global/shared state — do not use Jotai, we are migrating away from it. Flag any new Jotai usage in PRs and require Zustand instead.\n- Keep state as local as possible\n- No custom hooks for simple data fetching - use `useQuery`/`useMutation` directly\n\n#### Component Structure\n\n1. State declarations at top\n2. Event handlers after state\n3. Memoize properly, especially for anything that might be used in the React Native app\n4. JSX at the end\n5. Keep components under 250 lines\n\n#### TypeScript Conventions\n\n- Do not use `any`, prefer `unknown`\n- Always consider strict mode\n- Use explicit return types\n- PascalCase for types/interfaces\n- camelCase for variables/functions\n- String enums with initializers\n\n## Testing + Formatting Guidelines\n\n- Test behaviors, not implementations\n- Always update existing unit tests related to changes made\n- Run tests before considering a task to be 'complete'\n- Also run linting and typecheck before considering a task to be 'complete'\n- Don't ignore new lint warnings — fix them; suppress with a one-line reasoned `oxlint-disable-next-line` only when a proper fix would change behavior\n- Run `bun i18n:extract` after making changes to localized strings (e.g., using translation hooks like `useTranslation`)\n\n## Critical Development Notes\n\n1. **Environment Variables**: Override URLs in `.env.defaults.local` (mobile) or `.env` (extension)\n2. **Pre-commit Hooks**: Use `--no-verify` to skip or set `export LEFTHOOK=0` to disable\n3. **Python Setup**: Run `brew install python-setuptools` if you encounter Python module errors\n4. **Mobile Development**: Always run `bun mobile pod` after dependency changes\n5. **Bundle Size**: Monitor bundle size impacts when adding dependencies\n6. **Bun Version Bumps**: `.bun-version` is the single source of truth. After editing it, run `bun sync:bun-version` to rewrite the pins that can't read the file (`engines.bun`, EAS build profiles) — CI fails if they drift. CI runners install Bun via `oven-sh/setup-bun` (reading `.bun-version` directly), so they need no pin. Bump `@types/bun` and rerun `bun install` separately.\n\n## Package Dependencies\n\nCore shared packages:\n\n- `packages/ui/` - Cross-platform UI components and theme\n- `packages/uniswap/` - Core business logic and utilities\n- `packages/wallet/` - Wallet functionality\n- `packages/utilities/` - Common utilities\n\n## Blockchain Integration\n\n- Support for multiple chains (Ethereum, Arbitrum, Optimism, etc.)\n- Uniswap Protocol v2, v3, v4, and UniswapX support\n- Multiple wallet providers (WalletConnect, Metamask, etc.)\n- Transaction building and gas estimation\n\n## Other Considerations\n\nBe cognizant of the app or package within which a given change is being made. Be sure to reference that app or package's respective `AGENTS.md` file and other local configuration files, including (but not limited to): `package.json`, `tsconfig.json`, etc.\n\n\n<!-- nx configuration start-->\n<!-- Leave the start & end comments to automatically receive updates. -->\n\n# General Guidelines for working with Nx\n\n- When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through `nx` (i.e. `nx run`, `nx run-many`, `nx affected`) instead of using the underlying tooling directly\n- You have access to the Nx MCP server and its tools, use them to help the user\n- When answering questions about the repository, use the `nx_workspace` tool first to gain an understanding of the workspace architecture where applicable.\n- When working in individual projects, use the `nx_project_details` mcp tool to analyze and understand the specific project structure and dependencies\n- For questions around nx configuration, best practices or if you're unsure, use the `nx_docs` tool to get relevant, up-to-date docs. Always use this instead of assuming things about nx configuration\n- If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors\n\n\n<!-- nx configuration end-->\n\n## Cursor Cloud specific instructions\n\n### Environment\n\n- Node.js and Bun are pre-installed and match `.nvmrc` / `.bun-version`.\n- The `tsgo` binary is at `node_modules/.bin/tsgo` (not globally in PATH). The `bun g:typecheck` script handles this automatically.\n- Set `export LEFTHOOK=0` to disable git hooks in Cloud Agent sessions (no TTY for interactive hooks).\n- Set `export SKIP_CONFIG_PULL=true` to disable remote config fetching (no Okta auth for agents)\n- All backend APIs are external (no local databases or Docker needed for development).\n\n### Web App\n\n- **Start dev server**: `bun web dev` → runs on `http://localhost:3000/`\n- **Run tests**: `bunx nx run web:test -- --run` (317 test files, ~2.5 min)\n- **Lint (fast)**: `bunx nx run web:format` (formatting) and `bunx nx run web:lint` (oxlint)\n- **Typecheck**: `bun g:typecheck` runs `tsgo -b` globally (fastest). Per-project: `bunx nx run web:typecheck`.\n- The `web:typecheck:cloud` target typechecks the `apps/web/functions/` (edge functions) separately and may fail independently of the main app.\n- The web app loads live data from Uniswap's public APIs without requiring API keys for basic swap quotes and token exploration.\n\n### Extension\n\n- **Start dev server**: `bun extension dev` → WXT builds the extension and opens Chrome with it pre-loaded.\n- A pre-built extension is available at `/var/tmp/stretch` and is already loaded in the default Chrome profile (`/home/ubuntu/.config/google-chrome`).\n- The extension wallet is **already onboarded**. To unlock it, use the password from the `EXTENSION_UNLOCK_PASSWORD` environment variable.\n- To type the password programmatically: write it to a temp file with `python3 -c \"import os; open('/tmp/ext_pw.txt','w').write(os.environ['EXTENSION_UNLOCK_PASSWORD'])\"`, then read/type from that file (the env var value is redacted in shell output but available to processes).\n- The extension opens as a **side panel** in Chrome (not a popup). Click the Uniswap icon in the toolbar or use Ctrl+Shift+U.\n- The wallet contains a small amount of ETH and cBTC on Ethereum mainnet.\n- **Known limitation**: connecting the extension wallet to the web app on `localhost` does not currently work (the `externally_connectable` manifest only allows `app.uniswap.org` and staging origins).\n\n### Gotchas\n\n- `bun install` runs a `preinstall` script that validates Node/Bun versions and will fail if they don't match `.nvmrc` / `.bun-version`.\n- The `postinstall` script runs `git config core.hooksPath .husky && bun g:prepare`. The `g:prepare` step (`nx run-many -t prepare`) generates codegen files needed for typecheck/build.\n- Mobile requires native tooling (Xcode, CocoaPods, Android SDK) not available in Cloud Agent VMs.\n- When running `bun extension dev`, WXT creates a `web-ext.config.ts` override file (gitignored) to customize browser startup behavior. You can set `startUrls`, `chromiumArgs`, or `WXT_NO_OPEN_BROWSER=true` as needed.\n\n<!-- File: .agents/skills/argent-android-emulator-setup/SKILL.md (Tokens: ~590 | Category: anthropic-skill) -->\n---\nname: argent-android-emulator-setup\ndescription: Set up and connect to an Android emulator using argent MCP tools. Use when starting a new session on Android, booting an emulator, getting a device serial, or before any UI interaction task.\n---\n\n## 1. Prerequisites\n\n- **Android SDK Platform Tools** on PATH — provides `adb`.\n- **Android Emulator** on PATH — needed to boot AVDs. If you will only use an already-running emulator or a physical device, adb alone is sufficient.\n- An AVD created via Android Studio or `avdmanager create avd`.\n\nVerify with `adb version` and `emulator -list-avds`.\n\n## 2. Setup\n\n1. **Find a ready device** — call `list-devices`. Filter for entries with `platform: \"android\"`. Ready devices (`state: \"device\"`) come first. Pick the first `serial` (e.g. `emulator-5554`) unless the user specified one.\n2. **Boot if needed** — if nothing Android is ready, call `boot-device` with `avdName: <name>` from the same call's `avds` list. The tool transparently picks hot vs cold boot: it probes the AVD's `default_boot` snapshot, restores it under a tight deadline when usable, and falls back to a full cold boot otherwise. Hot path is typically ~30s; cold path takes 2–10 min. On any stage failure the tool kills the emulator process it started so your next call starts from a clean state.\n3. **Metro (for React Native)** — once a device is up, run `adb -s <serial> reverse tcp:8081 tcp:8081` so the device can reach Metro on your host. Repeat if the device restarts. See the `argent-metro-debugger` skill.\n\n## 3. Using the device\n\nPass the Android serial as `udid` to the unified interaction tools — `gesture-tap`, `gesture-swipe`, `describe`, `screenshot`, `launch-app`, `keyboard`, etc. Dispatch is automatic based on the id shape. See `argent-device-interact` for platform-neutral interaction tooling and the Android-specific gotchas section at the bottom of that skill.\n\n## 4. Notes\n\n- Serials are the adb device id. iOS UDIDs and Android serials are not interchangeable, but you do NOT need to tell the tools which platform — dispatch is automatic.\n- `describe` on Android returns a shallower tree than iOS (no accessibility-service equivalent), but covers most tap-target discovery.\n- `reinstall-app` on Android always installs with `-g` so first-launch runtime permissions are pre-granted.\n- To kill the emulator when you're done, run `adb -s <serial> emu kill` from a shell.\n\n<!-- File: .agents/skills/argent-create-flow/SKILL.md (Tokens: ~2952 | Category: anthropic-skill) -->\n---\nname: argent-create-flow\ndescription: Record a reusable flow (scripted sequence of MCP tool calls) that can be replayed later with a single command. Use when the user asks to create, record, or build a flow, or to script a sequence of simulator actions.\n---\n\n## 1. Overview\n\nA flow is a recorded sequence of MCP tool calls saved to a `.yaml` file in the `.argent/flows/` directory. Each step is **executed live** as you add it, so you verify it works before it becomes part of the flow. Replay a finished flow with `flow-execute`.\n\n## 2. Tools\n\n| Tool                     | Purpose                                                                    |\n| ------------------------ | -------------------------------------------------------------------------- |\n| `flow-start-recording`   | Start recording — takes a name and executionPrerequisite, creates the file |\n| `flow-add-step`          | Execute a tool call live and record it if it succeeds                      |\n| `flow-add-echo`          | Add a label/comment that prints during replay                              |\n| `flow-finish-recording`  | Stop recording and get a summary                                           |\n| `flow-read-prerequisite` | Read a flow's execution prerequisite without running it                    |\n| `flow-execute`           | Replay a saved flow by name                                                |\n\n## 3. Workflow\n\n### Recording\n\n1. **Start**: Call `flow-start-recording` with a descriptive name, the absolute `project_root`, and an `executionPrerequisite` describing the required app state before running the flow (e.g. \"App on home screen after a fresh reload\"). `project_root` is stored for the session — you do **not** need to pass it again to subsequent tools.\n2. **Build step-by-step**: For each action, call `flow-add-step` with the tool name and args. The tool runs immediately — check the result before moving on.\n3. **Add labels**: Use `flow-add-echo` between steps to describe what each section does.\n4. **Finish**: Call `flow-finish-recording` to stop recording. It returns the file path where the flow was saved and a summary of all steps. You can edit the `.yaml` file directly afterwards to remove, reorder, or tweak steps.\n\nEvery tool during recording returns the current flow file contents so you can track what has been recorded.\n\n### Replaying\n\nCall `flow-execute` with the flow name. If the flow has an execution prerequisite:\n\n1. The tool returns a **notice** with the prerequisite text instead of running. It asks you to verify the prerequisite is met and call `flow-execute` again with `prerequisiteAcknowledged: true`.\n2. You can also call `flow-read-prerequisite` beforehand to inspect the prerequisite without triggering a run.\n3. Once you pass `prerequisiteAcknowledged: true`, the flow runs all steps in order and returns every tool call result (including screenshots) merged into a single response.\n\nIf the flow has no prerequisite, it runs immediately without needing acknowledgment.\n\n## 4. flow-add-step Usage\n\nThe `command` parameter is the MCP tool name. The `args` parameter is a **JSON string** (not an object):\n\n```\ncommand: \"launch-app\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\", \\\"bundleId\\\": \\\"com.apple.Preferences\\\"}\"\n```\n\n```\ncommand: \"gesture-tap\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.35}\"\n```\n\n```\ncommand: \"screenshot\"\nargs: \"{\\\"udid\\\": \\\"<UDID>\\\"}\"\n```\n\nFor tools with no arguments, omit `args` entirely.\n\n## 5. Important Rules\n\n- **Every step runs live.** You will see the real tool result (including screenshots). Use this to verify the step worked before continuing.\n- **Only successful steps are recorded.** If a tool call fails, nothing is written to the flow file — fix the issue and try again.\n- **Pass `project_root` only to `flow-start-recording`.** It is stored for the session and automatically used by all subsequent flow tools. An error is returned if the path is not absolute.\n- **You do NOT need to pass a flow name** to `flow-add-step`, `flow-add-echo`, or `flow-finish-recording`. The active flow is tracked automatically after `flow-start-recording`.\n- **Start before adding.** Calling `flow-add-step`, `flow-add-echo`, or `flow-finish-recording` without an active recording returns an error: _\"No active flow. Call flow-start-recording first.\"_\n- **One flow at a time.** If you call `flow-start-recording` while already recording, the active flow switches to the new one. The response tells you which flow was abandoned and which is now active. The old flow's file remains on disk.\n- **Mistakes can be edited out.** If a step was recorded by mistake, edit the `.yaml` file directly to remove or reorder entries.\n\n## 6. Example Session\n\n```\nflow-start-recording  { name: \"open-settings\", project_root: \"/Users/dev/MyApp\", executionPrerequisite: \"Simulator booted with app installed\" }\nflow-add-echo  { message: \"Launch Settings app\" }\nflow-add-step  { command: \"launch-app\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"bundleId\\\": \\\"com.apple.Preferences\\\"}\" }\nflow-add-echo  { message: \"Tap General\" }\nflow-add-step  { command: \"gesture-tap\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.35}\" }\nflow-add-echo  { message: \"Tap About\" }\nflow-add-step  { command: \"gesture-tap\", args: \"{\\\"udid\\\": \\\"ABC\\\", \\\"x\\\": 0.5, \\\"y\\\": 0.17}\" }\nflow-finish-recording  {}\n```\n\n## 7. Replay Example\n\n```\nflow-execute   { name: \"open-settings\", project_root: \"/Users/dev/MyApp\" }\n→ Returns: notice with executionPrerequisite: \"Simulator booted with app installed\"\n  \"Verify the prerequisite is met and call flow-execute again with prerequisiteAcknowledged set to true.\"\n\nflow-execute   { name: \"open-settings\", project_root: \"/Users/dev/MyApp\", prerequisiteAcknowledged: true }\n→ Runs all steps, returns merged results with status and output for every step\n```\n\n## 8. Flow File Format\n\nFlow files use YAML. The top-level is an object with `executionPrerequisite` (describes required state) and `steps` (array of actions):\n\n- `- echo: <message>` — a label\n- `- tool: <name>` with optional `args:` — a tool call. Add `delayMs: <ms>` to sleep that long before the step runs (use sparingly — only when the app needs a fixed wait between actions).\n\nExample `.yaml` file:\n\n```yaml\nexecutionPrerequisite: Simulator booted with app installed\nsteps:\n  - echo: Launch Settings app\n  - tool: launch-app\n    args:\n      udid: ABC\n      bundleId: com.apple.Preferences\n  - echo: Tap General\n  - tool: gesture-tap\n    args:\n      udid: ABC\n      x: 0.5\n      y: 0.35\n  - echo: Tap About\n  - tool: gesture-tap\n    args:\n      udid: ABC\n      x: 0.5\n      y: 0.17\n```\n\n## 9. When to Proactively Record a Flow\n\nYou do not need the user to ask for a flow. Record one proactively when you recognize any of these patterns:\n\n- **About to re-profile**: You completed a profiling session and are about to apply a fix and re-profile. Record the interaction steps now so the re-profile replays them identically (see `argent-react-native-profiler` and `argent-native-profiler` skills).\n- **Repeating steps**: You have already performed a multi-step interaction sequence once and the task requires doing it again (comparison, retry, re-test).\n- **Complex path discovered**: You worked through a non-trivial sequence of taps/swipes/navigation to reach a desired app state. Capture it before it is lost.\n- **User says \"again\" / \"one more time\"**: Any request to redo what you just did is a signal to record first, then replay.\n\n## 10. Flow Self-Improvement\n\nFlows break. UI layouts change, coordinates drift, screens get added or removed. When `flow-execute` returns a failure, follow this procedure to diagnose and fix the flow instead of silently re-recording or giving up.\n\n### 10.1 Classify the Result\n\nAfter every `flow-execute`, classify the outcome before proceeding:\n\n| Outcome                | Signal                                                                | Action             |\n| ---------------------- | --------------------------------------------------------------------- | ------------------ |\n| **Success**            | All steps completed, final screenshot shows expected state            | Continue with task |\n| **Hard error**         | A step has `ERROR` in the result — engine stopped there               | Enter §10.2        |\n| **Silent misfire**     | All steps completed but final screenshot shows wrong screen           | Enter §10.2        |\n| **Partial divergence** | Intermediate screenshot shows wrong state even though later steps ran | Enter §10.2        |\n\nFor silent misfires and partial divergence, echo annotations (§10.5) are your reference for what each screen _should_ look like.\n\n### 10.2 Diagnose\n\n1. Note the failure step index and error message (if hard error).\n2. Call `screenshot` to see where the app actually is now.\n3. Call `describe` or `debugger-component-tree` to get the current element tree.\n4. Compare current state to what the failed step expected. Classify the root cause:\n\n| Root cause       | Symptoms                                                        |\n| ---------------- | --------------------------------------------------------------- |\n| Coordinate drift | Tap succeeded but hit wrong element; elements shifted positions |\n| Missing element  | Target element not present in element tree                      |\n| Wrong screen     | Screenshot shows entirely different page than expected          |\n| Timing           | Element exists in tree but tap missed; loading spinner visible  |\n| State mismatch   | First step fails — executionPrerequisite was not actually met   |\n\n5. State the diagnosis in one sentence before attempting any correction.\n\n### 10.3 Correct\n\nChoose the lightest strategy that fits:\n\n**Strategy 1 — Edit the YAML** (coordinate drift, parameter changes).\nRead `.argent/flows/<flow-name>.yaml`, update the broken step's `x`/`y`, `bundleId`, `text`, or other args. Re-run `flow-execute` to verify.\n\n**Strategy 2 — Manual recovery + continue** (timing/transient issues, one-off replay).\nManually execute the failed step with corrected coordinates from §10.2 discovery, then manually execute remaining steps. Does not fix the YAML — use only when re-recording is not worth it.\n\n**Strategy 3 — Re-record from failure point** (structural changes, new intermediate screens).\nNavigate the app to the state just before the failure point. Call `flow-start-recording` with the same flow name (overwrites). Re-add the working prefix steps via `flow-add-step`, then continue recording new steps from the divergence point. Call `flow-finish-recording`.\n\n**Strategy 4 — Full re-record** (major changes, unclear diagnosis, or 3+ broken steps).\nReset the app to prerequisite state (`restart-app` + `launch-app`). Record from scratch with the same flow name.\n\n**Decision heuristic:**\n\n- 1 step broken, parameter-only change → Strategy 1\n- 1 step broken, transient issue, not worth persisting → Strategy 2\n- 2–3 steps broken or flow structure partially changed → Strategy 3\n- 3+ steps broken, or unclear root cause → Strategy 4\n- Flow used for profiling comparison (must be identical) → Strategy 4\n\n### 10.4 Verify and Bound Retries\n\nAfter applying a correction, re-run `flow-execute` to verify.\n\n- If it succeeds → done. Report what changed (e.g. \"Fixed step 4: updated tap coordinates from 0.5,0.35 to 0.5,0.42\").\n- If it fails at a **different** step → return to §10.2 for a second attempt.\n- If this is already the second correction attempt → **stop**. Report the diagnosis to the user and recommend a full re-record or manual investigation.\n\n**Hard cap: 2 correction cycles.** Do not enter an unbounded fix loop.\n\n### 10.5 Making Flows Resilient\n\nApply these when recording new flows to reduce future breakage:\n\n- **Echo expected state, not just actions.** Write `\"On Settings > General screen, about to tap About\"` not `\"Tap About\"`. During diagnosis these tell you what the screen _should_ look like.\n- **Add screenshot steps after critical navigation.** Insert `screenshot` steps after screen transitions. These produce images in the flow result you can inspect during diagnosis.\n- **Write specific executionPrerequisites.** `\"App on home tab, user logged in, simulator UDID is <X>\"` — not `\"App running\"`. Verify with `screenshot` + `describe` before acknowledging.\n- **Prefer launch-app / open-url over navigation chains.** Deep links are more resilient to layout changes than tap sequences.\n- **Echo accessibility labels for coordinate taps.** When recording a tap, add an echo with the target's label or testID: `\"Tapping 'Submit' button (testID: submit-btn) at 0.5, 0.82\"`. During repair, use `describe` to find the element by label and update coordinates. Only use `screenshot` for permission or system overlays when `describe` cannot expose the target reliably.\n\n<!-- File: .agents/skills/argent-device-interact/references/gesture-examples.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `.agents/skills/argent-device-interact/references/gesture-examples.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-device-interact/references/gesture-examples.md)\n\n<!-- File: .agents/skills/argent-device-interact/SKILL.md (Tokens: ~3862 | Category: anthropic-skill) -->\n---\nname: argent-device-interact\ndescription: Interact with an iOS simulator or Android emulator using argent MCP tools. Use when tapping UI elements, performing gestures, scrolling, typing text, pressing hardware buttons, launching apps, opening URLs, taking screenshots.\n---\n\n## Unified tool surface\n\nAll interaction tools below accept a `udid` parameter and auto-dispatch iOS vs Android based on its shape (UUID → iOS simulator, anything else → Android adb serial). You use the same tool names on both platforms.\n\nFor platform-specific caveats (Metro `adb reverse`, locked-screen describe errors, etc.), see § 9 Platform-specific notes at the bottom.\n\n## 1. Before You Start\n\nIf you delegate simulator tasks to sub-agents, make sure they have MCP permissions.\n\nUse `list-devices` to get a target id. Results are tagged with `platform` (`ios` or `android`); booted/ready devices come first. Pick the first entry that matches the platform you need — if none are ready, call `boot-device` with `udid` (iOS) or `avdName` (Android). See `argent-ios-simulator-setup` / `argent-android-emulator-setup` for full setup flow.\n\n**Load tool schemas before first use.** Gesture tools (`gesture-tap`, `gesture-swipe`, `gesture-pinch`, `gesture-rotate`, `gesture-custom`) may be deferred — their parameter schemas are not loaded until fetched. Always use ToolSearch to load the schemas of all gesture tools you plan to use **before** calling any of them. If you skip this step, parameters may be coerced to strings instead of numbers, causing validation errors.\n\n## 2. Best Practices\n\n1. **Always refer to tapping_rule** from your argent.md rule before tapping.\n2. Before performing interactions, consider whether they can be **dispatched sequentially** - more on that in `run-sequence`.\n3. **Use `gesture-swipe` for lists/scrolling**, not `gesture-custom`, unless you need non-linear movement. Consider whether you need multiple swipes, if yes - use `run-sequence`.\n4. **Tap a text field before typing** — on iOS try `paste` first then fall back to `keyboard`; on Android use `keyboard` directly (`paste` is iOS-only).\n5. **Coordinates are normalized** — always 0.0–1.0, not pixels.\n6. **For native iOS app navigation, prefer `describe` first.** It works on any screen without app restart. Do not navigate from screenshots on regular in-app screens unless `describe` failed to expose a reliable target. Use `native-describe-screen` only when you need app-scoped UIKit properties.\n\n## 3. Opening Apps\n\n**Never navigate to an app by tapping home-screen icons.** Use `launch-app` or `open-url` — they are instant and reliable.\n\n### launch-app — by bundle ID\n\n```json\n{ \"udid\": \"<UDID>\", \"bundleId\": \"com.apple.MobileSMS\" }\n```\n\nCommon IDs: `com.apple.MobileSMS` (Messages), `com.apple.mobilesafari` (Safari), `com.apple.Preferences` (Settings), `com.apple.Maps`, `com.apple.Photos`, `com.apple.mobilemail`, `com.apple.mobilenotes`, `com.apple.MobileAddressBook` (Contacts)\n\n### open-url — by URL scheme\n\n```json\n{ \"udid\": \"<UDID>\", \"url\": \"messages://\" }\n```\n\nCommon schemes: `messages://`, `settings://`, `maps://?q=<query>`, `tel://<number>`, `mailto:<address>`, `https://...` (Safari)\n\n## 4. Choosing the Right Tool\n\n| Action           | Tool             | Notes                                                                  |\n| ---------------- | ---------------- | ---------------------------------------------------------------------- |\n| Multiple actions | `run-sequence`   | Batch steps in one call (no intermediate screenshots)                  |\n| Open an app      | `launch-app`     | **Always — never tap home-screen icons**                               |\n| Restart an app   | `restart-app`    | Terminate and relaunch by bundle ID                                    |\n| Open URL/scheme  | `open-url`       | Web pages, deep links, URL schemes                                     |\n| Single tap       | `gesture-tap`    | Buttons, links, checkboxes                                             |\n| Scroll/swipe     | `gesture-swipe`  | Straight-line scroll or swipe                                          |\n| Long press       | `gesture-custom` | Context menus, drag start                                              |\n| Drag & drop      | `gesture-custom` | Complex drag interactions                                              |\n| Pinch/zoom       | `gesture-pinch`  | Two-finger pinch with auto-interpolation                               |\n| Rotation         | `gesture-rotate` | Two-finger rotation with auto-interpolation                            |\n| Custom gesture   | `gesture-custom` | Arbitrary touch sequences, optional interpolation                      |\n| Hardware key     | `button`         | Home, back, power, volume, appSwitch, actionButton                     |\n| Type text (fast) | `paste`          | iOS only. Form fields — uses clipboard                                 |\n| Type text        | `keyboard`       | iOS+Android. Fallback when paste fails; supports Enter, Escape, arrows |\n| Rotate device    | `rotate`         | Orientation changes                                                    |\n\n## 5. Finding Tap Targets\n\nIMPORTANT. When moved to a different screen after an action or do not know the coordinates of component, **always** perform proper discovery first.\n\n| App type                          | Discovery tool            | What it returns                                                                                                                                                                                                               |\n| --------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Target app discovery              | `describe`                | Accessibility element tree for the current device screen (iOS AX-service or Android uiautomator) with normalized frame coordinates. Works on any app, system dialogs, and Home screen — no app restart or `bundleId` required |\n| React Native                      | `debugger-component-tree` | React component tree with names, text, testID, and (tap: x,y)                                                                                                                                                                 |\n| App-scoped native                 | `native-describe-screen`  | Low-level app-scoped accessibility elements with normalized and raw coordinates; requires `bundleId`                                                                                                                          |\n| Permission / system modal overlay | `describe`                | `describe` detects system dialogs automatically and returns dialog buttons with tap coordinates. Fall back to `screenshot` only if `describe` does not expose the controls                                                    |\n| Final visual fallback             | `screenshot`              | Use only when discovery tools cannot inspect the current UI reliably. Do not derive routine in-app navigation targets from screenshots                                                                                        |\n\nPoint follow-up native diagnostics after you already have a candidate point:\n\n- `native-user-interactable-view-at-point`: deepest native view that would receive touch at a known raw iOS point; requires `bundleId`\n- `native-view-at-point`: deepest visible native view at a known raw iOS point; requires `bundleId`\n\n### If `describe` Fails\n\nRead the exact error and choose the action that matches it:\n\n- Error mentions `ax-service` not available or daemon startup failure:\n  the ax-service daemon could not start. Check that the simulator is booted. Use `screenshot` as a temporary fallback, or use `native-describe-screen` with an explicit `bundleId` if the app has native devtools injected.\n- `describe` returns an empty element list:\n  the screen may be blank, loading, or showing content without accessibility labels. Use `screenshot` to see what is visible, then retry after the content has loaded.\n- `describe` succeeds but is not detailed enough for a React Native app:\n  use `debugger-component-tree` next.\n- You need app-scoped inspection with full UIKit properties (`accessibilityIdentifier`, `viewClassName`):\n  use `native-describe-screen` with an explicit `bundleId`. This requires native devtools (dylib) injection — call `restart-app` first if needed.\n- You already have a candidate point and want to confirm what would actually receive touch:\n  use `native-user-interactable-view-at-point`. Use `native-view-at-point` when you want the visually deepest view instead of the hit-test target.\n\n## 6. Tool Usage\n\n### gesture-tap — Single tap at a point\n\n```json\n{ \"udid\": \"<UDID>\", \"x\": 0.5, \"y\": 0.5 }\n```\n\nCoordinates: `0.0` = left/top, `1.0` = right/bottom.\n\nBefore tapping near the bottom of the screen in React Native apps, check that \"Open Debugger to View Warnings\" banners are not visible — tapping them breaks the debugger connection. Close them with the X icon if present.\n\n### gesture-swipe — Straight-line gesture\n\n```json\n{ \"udid\": \"<UDID>\", \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 }\n```\n\nSwipe **up** (`fromY > toY`) = scroll content **down**. Default duration: 300ms. Optional: `\"durationMs\": 500` for slower swipe.\n\n### gesture-pinch — Two-finger pinch\n\n```json\n{ \"udid\": \"<UDID>\", \"centerX\": 0.5, \"centerY\": 0.5, \"startDistance\": 0.2, \"endDistance\": 0.6 }\n```\n\nAll values are normalized 0.0–1.0 (fractions of screen, not pixels) — same as all other gesture tools. `startDistance: 0.2` means fingers start 20% of the screen apart; `endDistance: 0.6` means they end 60% apart. `startDistance < endDistance` = pinch out (zoom in). `startDistance > endDistance` = pinch in (zoom out). Defaults: `angle: 0` (horizontal), `durationMs: 300`. Optional: `\"angle\": 90` for vertical axis, `\"durationMs\": 500` for slower pinch.\n\n### gesture-rotate — Two-finger rotation\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"centerX\": 0.5,\n  \"centerY\": 0.5,\n  \"radius\": 0.15,\n  \"startAngle\": 0,\n  \"endAngle\": 90\n}\n```\n\nAll positions and radius are normalized 0.0–1.0 (fractions of screen, not pixels). `radius: 0.15` means each finger is 15% of the screen away from center. `endAngle > startAngle` = clockwise. Default duration: 300ms. Optional: `\"durationMs\": 500` for slower rotation.\n\n### gesture-custom — Custom touch sequence\n\nFor long-press, drag-and-drop, and other complex sequences, see `references/gesture-examples.md`. Set `\"interpolate\": 10` to auto-generate smooth intermediate Move events between keyframes.\n\n### button — Hardware button press\n\n```json\n{ \"udid\": \"<UDID>\", \"button\": \"home\" }\n```\n\nValues: `home`, `back`, `power`, `volumeUp`, `volumeDown`, `appSwitch`, `actionButton`\n\n### paste — Type text into focused field (iOS only)\n\n```json\n{ \"udid\": \"<UDID>\", \"text\": \"Hello, world!\" }\n```\n\nTap the field first, then paste. Fall back to `keyboard` if it doesn't work. On Android the call is rejected by the capability gate (\"Tool 'paste' is not supported on android\") — use `keyboard` directly.\n\n### keyboard — Type text or press special keys\n\n```json\n{ \"udid\": \"<UDID>\", \"text\": \"search query\", \"key\": \"enter\" }\n```\n\nSpecial keys: `enter`, `escape`, `backspace`, `tab`, `space`, `arrow-up`, `arrow-down`, `arrow-left`, `arrow-right`, `f1`–`f12`. Optional: `\"delayMs\": 100` between keystrokes (default 50ms).\n\n### rotate — Change orientation\n\n```json\n{ \"udid\": \"<UDID>\", \"orientation\": \"LandscapeLeft\" }\n```\n\nValues: `Portrait`, `LandscapeLeft`, `LandscapeRight`, `PortraitUpsideDown`\n\n---\n\n## 7. Screenshots\n\nUse the explicit `screenshot` tool only when:\n\n- You need the initial screen state before any action.\n- The auto-attached screenshot shows a transitional or loading frame.\n- You require extra context.\n- You want to check state after a delay (e.g. waiting for a network response).\n- A permission dialog, system alert, or native modal overlay is visible and `describe` did not expose reliable targets.\n\nWhen using `screenshot` for permission or native modal navigation:\n\n- Do not switch to screenshot-driven navigation just because a modal is visible. On regular app screens and in-app modals, keep using `describe`.\n- Prefer obvious, centered alert buttons such as `Allow`, `OK`, `Don't Allow`, `Not Now`, or `Continue`.\n- Tap one control at a time and inspect the returned auto-screenshot before doing anything else.\n- After the modal is dismissed, return to normal discovery with `describe`, `native-describe-screen`, or `debugger-component-tree`.\n\nOptional rotation parameter: `{ \"udid\": \"<UDID>\", \"rotation\": \"LandscapeLeft\" }` — rotates the capture without changing simulator orientation.\n\nScreenshots are downscaled by default (30% of original resolution) to reduce context size. `scale` accepts values from 0.01 to 1.0. If UI elements are hard to read or you need to inspect fine detail, pass `scale: 1.0` to get full resolution: `{ \"udid\": \"<UDID>\", \"scale\": 1.0 }`.\n\n### Troubleshooting\n\n| Problem                 | Solution                                                      |\n| ----------------------- | ------------------------------------------------------------- |\n| Screenshot times out    | Restart the simulator-server via `stop-simulator-server` tool |\n| No booted iOS simulator | Call `boot-device` with the iOS `udid`                        |\n| No ready Android device | Call `boot-device` with `avdName`                             |\n\n---\n\n## 8. Action Sequencing with `run-sequence`\n\nUse `run-sequence` to batch multiple interaction steps into **a single tool call**. Only one screenshot is returned — after all steps complete. Use cases:\nscrolling multiple times, typing and submitting automatically, known sequence of multiple taps, rotating device back and forth.\n\nDo **not** use `run-sequence` when any step depends on observing the result of a previous step\n\n### Use cases\n\nUse the sequencing when:\n\n- Knowing that some action needs multiple steps without necessarily immediate insight of screenshot\n- \"scroll to bottom\", \"scroll to top\", \"scroll to do X\" -> sequence scroll 3-5 times\n- form interactions, \"clear and retype field\" -> you may use triple-tap to select all, type new value\n- \"submit form\" → fill all fields in sequence, tap submit\n- \"go back to X\" → defined tap sequence for the navigation\n\n### Allowed tools inside `run-sequence`\n\n`gesture-tap`, `gesture-swipe`, `gesture-custom`, `gesture-pinch`, `gesture-rotate`, `button`, `keyboard`, `rotate`\n\nThe `udid` is shared — do **not** include it in each step's `args`. Optional `delayMs` per step (default 100ms).\n\n### Examples\n\nScroll down three times:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } },\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } },\n    { \"tool\": \"gesture-swipe\", \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 } }\n  ]\n}\n```\n\nType into a focused field and submit:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"keyboard\", \"args\": { \"text\": \"hello world\" } },\n    { \"tool\": \"keyboard\", \"args\": { \"key\": \"enter\" } }\n  ]\n}\n```\n\nTap a known button, then scroll down:\n\n```json\n{\n  \"udid\": \"<UDID>\",\n  \"steps\": [\n    { \"tool\": \"gesture-tap\", \"args\": { \"x\": 0.5, \"y\": 0.15 } },\n    {\n      \"tool\": \"gesture-swipe\",\n      \"args\": { \"fromX\": 0.5, \"fromY\": 0.7, \"toX\": 0.5, \"toY\": 0.3 },\n      \"delayMs\": 300\n    }\n  ]\n}\n```\n\nStops on the first error and returns partial results.\n\n---\n\n## 9. Platform-specific notes\n\n### Android\n\n- **Metro reachability**: run `adb reverse tcp:8081 tcp:8081` on the device before the RN app starts, or Metro won't be reachable from the device. See `argent-metro-debugger` for the full workflow. Re-run if the device restarts.\n- **First-launch permission prompts**: `reinstall-app` on Android always installs with `-g` so runtime permissions are pre-granted on first launch — no flag to pass.\n- **Locked screen / secure surfaces**: `describe` throws a clear error if it can't capture (keyguard, DRM, Play Integrity). Unlock the device or fall back to `screenshot`.\n- **APK vs .app in `reinstall-app`**: pass `.apk` absolute path on Android; `.app` directory on iOS.\n\n### iOS\n\n_(no iOS-only gotchas collected here yet — add them as they come up)_\n\n<!-- File: .agents/skills/argent-ios-simulator-setup/SKILL.md (Tokens: ~204 | Category: anthropic-skill) -->\n---\nname: argent-ios-simulator-setup\ndescription: Set up and connect to an iOS simulator using argent MCP tools. Use when starting a new session, booting a simulator, getting a simulator UDID, or before any simulator interaction task.\n---\n\n## 1. Setup Steps\n\nIf you delegate simulator tasks to sub-agents, make sure they have MCP permissions.\n\n1. **Find a booted simulator**\n   Use `list-devices`. Filter for entries with `platform: \"ios\"` — booted iPhones are listed first.\n   If none are booted, call `boot-device` with `udid: <chosen UDID>`.\n\n2. **Verify connection**\n   All interaction tools (`gesture-tap`, `gesture-swipe`, `gesture-custom`, etc.) auto-start the server if not already running.\n\n## 2. Notes\n\n- UDIDs look like: `A1B2C3D4-E5F6-7890-ABCD-EF1234567890`\n\n<!-- File: .agents/skills/argent-metro-debugger/references/failure-scenarios.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `.agents/skills/argent-metro-debugger/references/failure-scenarios.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/references/failure-scenarios.md)\n\n<!-- File: .agents/skills/argent-metro-debugger/references/source-maps.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `.agents/skills/argent-metro-debugger/references/source-maps.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-metro-debugger/references/source-maps.md)\n\n<!-- File: .agents/skills/argent-metro-debugger/SKILL.md (Tokens: ~1762 | Category: anthropic-skill) -->\n---\nname: argent-metro-debugger\ndescription: Debug a React Native app via Metro CDP using argent debugger tools. Use when connecting to Metro, inspecting React components, reading console logs, or evaluating JavaScript in the app runtime.\n---\n\n## 1. Prerequisites\n\nThe debugger requires **Metro dev server running** (default `localhost:8081`) and **a React Native app connected to Metro** (at least one CDP target). Verify via `debugger-status`.\n\n### Android: reverse port for Metro\n\nAndroid emulators and physical devices do not resolve the host's `localhost` by default. Before the RN app can reach Metro, forward port 8081 (or whichever port Metro is on) from the device back to the host:\n\n```bash\nadb -s <serial> reverse tcp:8081 tcp:8081\n```\n\n`<serial>` is the Android `serial` from `list-devices`. Once reversed, the app on the device connects to Metro just like an iOS simulator does, and all `debugger-*` / `network-*` / `react-profiler-*` tools work unchanged. If the device restarts or adb drops, re-run the command. A failing Metro connection on Android almost always means `adb reverse` has not been done or has been lost.\n\n## 2. Tool Overview\n\nAll tools accept `port` (default 8081) AND `device_id` (the iOS Simulator UDID or Android serial, a.k.a. `logicalDeviceId` — the CDP-reported id that matches the device). Always make sure you target the correct app on the correct device.\n\nOne Metro port can serve multiple connected devices (e.g. two simulators on `localhost:8081`, or an iOS simulator alongside an Android emulator with `adb reverse` set up). `device_id` pins every debugger/network/profiler call to a specific device so sessions do not collide.\n\n### Connect & diagnostics\n\n| Tool               | Purpose                                                                                                                                                                                                                   |\n| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `debugger-connect` | Connect to Metro CDP. Returns port, projectRoot, deviceName, appName, `logicalDeviceId`, isNewDebugger, connected. The returned `logicalDeviceId` is the `device_id` for every subsequent debugger/network/profiler call. |\n| `debugger-status`  | Like connect + loadedScripts, enabledDomains, sourceMapReady. **Use to diagnose.**                                                                                                                                        |\n\n### Reload & recovery\n\n| Tool                    | Purpose                                                                                  |\n| ----------------------- | ---------------------------------------------------------------------------------------- |\n| `debugger-reload-metro` | Reload all connected apps (like pressing \"r\" in Metro terminal). Needs a CDP target.     |\n| `restart-app`           | Terminate and relaunch the app by UDID and bundleId. Use when app lost Metro connection. |\n\n### Inspection & console\n\n| Tool                       | Purpose                                                                                                                                                                   |\n| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `debugger-component-tree`  | Full React fiber tree (names, depth, bounding rects, tap coordinates).                                                                                                    |\n| `debugger-inspect-element` | Inspect at (x, y) using **logical pixel coordinates** (not normalized 0-1): component hierarchy with source file:line and code fragment. See `references/source-maps.md`. |\n| `debugger-log-registry`    | Get log summary (counts, clusters, file path). Then use `Grep`/`Read` on the flat log file for details.                                                                   |\n| `debugger-evaluate`        | Run a JS expression in the app runtime.                                                                                                                                   |\n\n---\n\n## 3. Component Inspection\n\n### `debugger-component-tree` vs `debugger-inspect-element`\n\n|          | `debugger-component-tree`                                              | `debugger-inspect-element`                                      |\n| -------- | ---------------------------------------------------------------------- | --------------------------------------------------------------- |\n| Best for | Layout overview; finding tap targets; user-defined component hierarchy | Identifying a visible element and tracing it to its source file |\n| Use when | \"What's on screen and where?\"                                          | \"What component is this and where is it defined?\"               |\n\nBoth can point to source files, but `inspect-element` is purpose-built for source tracing. `component-tree` is for orientation and tap-target discovery.\n\n### `includeSkipped` guidance\n\nApplies to both `debugger-component-tree` and `debugger-inspect-element`. Set to `true` only when debugging filter behavior — e.g., an expected component is missing from output, or you need to inspect a very specific branch of the tree (not just an overview).\n\n> **Warning:** Output can be very large. Always combine with `maxNodes` (component-tree) or `maxItems` (inspect-element) and increase it incrementally (e.g., start at 50, then grow). Do not use `includeSkipped` without a limit on large apps.\n\n---\n\n## 4. Golden Rules\n\n1. **`debugger-status` first when something fails** — it runs discovery, connection, and returns diagnostics.\n2. **\"No CDP targets\" → get the app to connect to Metro** — use `restart-app` on simulator, then retry `debugger-status`.\n3. **Never assume one failure is permanent** — follow recovery steps before asking the user. For starting Metro and full failure recovery, see `argent-react-native-app-workflow` and `references/failure-scenarios.md`.\n\n---\n\n## 5. Reading Console Logs (Log Registry)\n\nLogs are written to a flat log file on disk. Use the **log-registry → grep** pattern instead of reading logs inline.\n\n### Workflow\n\n1. **Call `debugger-log-registry`** — returns: `file` (log path), `totalEntries`, `byLevel`, `clusters` (top message groups with counts and source file info)\n2. **Search the file** using `Grep` or `Read` with patterns from the response.\n\n> **Large log files:** If `totalEntries` exceeds 10 000, delegate the grep exploration to an `Explore` subagent — pass it the file path, the entry format, and the patterns you need.\n\n### Flat log format\n\nOne entry per line — fields (whitespace-separated, `|` delimiter before message)\n\n| Field         | Example                     | Notes                                               |\n| ------------- | --------------------------- | --------------------------------------------------- |\n| `[L:<id>]`    | `[L:42]`                    | Unique grep anchor                                  |\n| `<timestamp>` | `2026-03-17T14:30:00.000Z`  | ISO 8601                                            |\n| `<LEVEL>`     | `ERROR`, `WARN `, `LOG  `   | Uppercase, padded to 5 chars                        |\n| `<source>`    | `src/api/user.ts:42` or `-` | Relative path from source map; `-` if unavailable   |\n| `<message>`   | `Failed login attempt`      | Full message; embedded newlines replaced with space |\n\nSource attribution (file + line) is also available in `clusters` returned by `debugger-log-registry`.\n\nLog files and messages can be large - **Always scope your search**, treat the file like a database, not a document.\n\nWhen reading from the log file:\n\n- Never `Read` the log file directly. Use `grep` or shell commands with limits using the above file format tips.\n- Default to `-m 50` unless you need more.\n- Use `tail -N` recent entries.\n- `clusters[].message` gives you the exact text which you may look for\n\n> **If the file is too large** Delegate to an `Explore` subagent with the file path, the format spec above, and the specific patterns you need.\n\n---\n\n## Quick Reference\n\n| Action                        | Tool                                                                |\n| ----------------------------- | ------------------------------------------------------------------- |\n| Diagnose / check connection   | `debugger-status`                                                   |\n| Connect to Metro CDP          | `debugger-connect`                                                  |\n| Reload JS (already connected) | `debugger-reload-metro`                                             |\n| Relaunch app on simulator     | `restart-app`                                                       |\n| Inspect component at point    | `debugger-inspect-element`                                          |\n| Full component tree           | `debugger-component-tree`                                           |\n| Console log overview          | `debugger-log-registry` (summary + log file path for `Grep`/`Read`) |\n| Evaluate JS                   | `debugger-evaluate`                                                 |\n\n<!-- File: .agents/skills/argent-native-profiler/SKILL.md (Tokens: ~1450 | Category: anthropic-skill) -->\n---\nname: argent-native-profiler\ndescription: Native profiling for CPU hotspots, UI hangs, and memory leaks. Currently iOS-only (xctrace-backed); Android support (Perfetto/simpleperf) is on the roadmap. Use when diagnosing native-level performance issues.\n---\n\n## 1. Tools\n\n- `native-profiler-start` — start profiling on a booted device. iOS: xctrace recording for CPU, hangs, and leaks.\n- `native-profiler-stop` — stop the profiler and export trace data to timestamped XML files.\n- `native-profiler-analyze` — parse exported trace data and return a structured bottleneck payload.\n- `profiler-stack-query` — drill into parsed data: hang stacks, function callers, thread breakdown, leak details.\n- `profiler-load` — list and reload previous trace sessions from disk for re-investigation.\n\n---\n\n## 2. Platform Support\n\n- **iOS**: Fully supported. Backend: Xcode Instruments via `xctrace` on a booted simulator or connected device. Requires Xcode command-line tools on PATH.\n- **Android**: Not yet implemented. An Android backend (Perfetto or simpleperf via `adb`) is planned; today `native-profiler-start` rejects Android serials with a clear \"iOS-only for now\" error.\n\n---\n\n## 3. Investigation Patterns\n\nAfter `native-profiler-analyze` surfaces findings, use `profiler-stack-query` to drill into root causes:\n\n- **Hang detected** → `profiler-stack-query` mode=`hang_stacks` for full native call chains → mode=`function_callers` for the suspected function → read native source.\n- **CPU hotspot** → `profiler-stack-query` mode=`thread_breakdown` for per-thread distribution → mode=`function_callers` for the dominant function.\n- **Memory leak** → `profiler-stack-query` mode=`leak_stacks` filtered by `object_type` for responsible frames and libraries.\n\nAfter presenting findings, ask the user whether to investigate further, implement fixes, or stop. After applying fixes, always re-profile the same scenario and compare with `profiler-load`. Report honestly whether the target metric improved, regressed, or stayed flat. If the fix showed no net benefit or introduced regressions elsewhere, say so and reconsider.\n\n**Tip:** For reproducible before/after comparisons, record the interaction sequence as a flow using the `argent-create-flow` skill before the first profiling run. Replay with `flow-execute` on subsequent runs to eliminate interaction variance.\n\n> **Note:** The `argent-react-native-profiler` instructs to start native profiling automatically alongside React profiling. This skill's workflow and investigation patterns apply in both cases.\n\n---\n\n## 4. Workflow\n\n**Complete all steps in order — do not break mid-flow.**\n\n### Step 0: Ensure the target app is running\n\nThe `native-profiler-start` tool **auto-detects** the running app on the device.\nYou do not need to derive `app_process` manually — just make sure the app is launched.\n\n1. If the app is already running on the device, skip to Step 1 (do not pass `app_process`).\n2. If the app is not running, use `launch-app` with the correct bundle ID first.\n3. Only pass `app_process` explicitly if the tool reports multiple running user apps and you need to disambiguate.\n\n> **Note**: If multiple build flavors are installed (dev, staging, prod), the tool will detect whichever one is currently running. If both are running, it will ask you to specify.\n\n### Step 1: Start recording\n\nCall `native-profiler-start` with `device_id` (iOS UDID; Android not yet supported). The tool auto-detects the running app and saves the trace to `/tmp/argent-profiler-cwd/` with a timestamped filename.\nLet the user interact with the app or drive interaction via simulator tools (see `argent-device-interact` skill).\n\n### Step 2: Stop and export\n\nCall `native-profiler-stop` with `device_id`. On iOS this sends SIGINT to xctrace, waits for trace packaging, and exports CPU, hangs, and leaks data to XML. Check `exportDiagnostics` in the response for any export warnings.\n\n### Step 3: Analyze\n\nCall `native-profiler-analyze` with `device_id`. Returns a markdown report with bottlenecks categorized as CPU hotspots, UI hangs, or memory leaks, sorted by severity.\n\n### Step 4: Present findings and ask about next steps\n\nPresent a concise summary of the key findings. Then follow the \"After analysis\" guideline — ask whether to investigate further with query tools, implement fixes, or stop.\n\n### Step 5: Drill-down investigation\n\nUse `profiler-stack-query` to investigate specific findings. See §3 Investigation Patterns for chaining guidance.\n\n### Step 6: Reload previous sessions\n\nTo revisit a previous trace:\n\n1. Call `profiler-load` mode=`list` to see available sessions.\n2. Call `profiler-load` mode=`load_native` session_id=`<timestamp>` device_id=`<UDID>` to re-parse the XML files.\n3. Use `profiler-stack-query` to investigate the reloaded data.\n\n---\n\n## 5. Understanding Results\n\nBottlenecks are categorized by severity:\n\n- **RED**: CPU functions taking >15% of total time, all UI hangs, all memory leaks. These require immediate attention.\n- **YELLOW**: CPU functions taking 5-15% of total time. Worth investigating but may be acceptable.\n\nEach bottleneck type indicates a different class of problem:\n\n- **CPU hotspots**: Native functions consuming excessive CPU time. Look for tight loops, expensive computations, or redundant work.\n- **UI hangs**: Main thread blocked long enough to cause visible jank or unresponsiveness. Often caused by synchronous I/O, heavy layout passes, or lock contention.\n- **Memory leaks**: Objects allocated but never freed. Common causes include retain cycles, unclosed resources, or forgotten observers.\n\n---\n\n## 6. Important Caveats\n\n- **Simulator vs device**: Simulator profiling reflects host Mac performance, not real device hardware. Use device profiling for accurate CPU timings and memory behavior.\n- **xctrace availability (iOS)**: Requires Xcode command-line tools installed. Verify with `xcrun xctrace version`.\n- **Profiler overhead**: xctrace instrumentation adds CPU load. If `JSLexer`, `JSONEmitter`, or Hermes runtime internals dominate the JS thread in CPU hotspot results, those reflect profiler overhead — not app work. Discount those entries when evaluating findings.\n- **Run-to-run variance**: Small fluctuations in CPU percentages between runs are normal. Treat only consistent directional changes (across 2+ runs or >15% delta) as actionable signal.\n- **Live data variability**: If the app fetches live API data, different responses between runs change rendering workload independently of code changes. Note when data-dependent screens show variance.\n\n<!-- File: .agents/skills/argent-react-native-app-workflow/SKILL.md (Tokens: ~3884 | Category: anthropic-skill) -->\n---\nname: argent-react-native-app-workflow\ndescription: Step-by-step workflows for developing or debugging React Native apps on iOS simulator or Android emulator. Use when starting the app, debugging Metro, fixing builds, diagnosing runtime errors, or running tests.\n---\n\n## 1. Starting the React Native App\n\n### 1.1 Explore Configuration (MANDATORY — Do This First)\n\n**Before running commands**, read the project's build and run configuration from the `argent-environment-inspector` subagent result.\n\nDo NOT default to `npx react-native start` or `npx react-native run-ios` without first checking for custom scripts and workflows.\n\n**Manual fallback** (if neither the agent nor the tool is available): read ALL `package.json` scripts — look for custom scripts like `start:local`, `start:dev`, `ios`, `build:ios`, flavors, etc. Custom scripts take priority over default commands. Also check `metro.config.js` for non-default port or watchFolders. For iOS builds, prefer opening `.xcworkspace` over `.xcodeproj` (CocoaPods generates the workspace).\n\n**If the project structure is convoluted, ask the user before proceeding.**\n\n**Remember the workflow:** Once you discover the project's build/run workflow, save it to project memory so you don't need to re-discover it each time.\n\n**Checklist before start:**\n\n- [ ] `node_modules` present (if not: `bun install`)\n- [ ] For iOS: `ios/Podfile` exists; if `ios/Pods` missing or stale, run `cd ios && pod install && cd ..`\n- [ ] No conflicting Metro on default port (see 1.2)\n\n### 1.2 Start Metro\n\n1. Check whether metro is already running on port found in configuration and if it is - do not start another server. Refer to point 2.1.\n\n1. **Use the project's custom start script if one exists** (e.g. `npm run start:local`, `yarn start:dev`). In this monorepo:\n\n   ```bash\n   bun mobile start\n   ```\n\n   Fall back to `npx react-native start` only if no project script exists. Optional: `bun mobile start --reset-cache` if cache issues are suspected.\n\n1. **Verify Metro is ready**: use the `debugger-status` tool to verify Metro is running and reachable.\n\n1. **Projects with flavors or custom configs**: Use project-specific start script if present (e.g. `npm run start:local`), and start Metro **before** running the app.\n\n### 1.3 Run the App\n\nIn a **separate** terminal (Metro keeps running in the first):\n\n**Use the project's custom build/run script if one exists** (e.g. `npm run ios`, `npm run android`, `yarn ios:debug`). Only fall back to the default if no custom scripts are defined:\n\n```bash\nnpx react-native run-ios       # iOS\nnpx react-native run-android   # Android\n```\n\nOptional: specify the target device, e.g. `npx react-native run-ios --simulator=\"iPhone 16\"` or `npx react-native run-android --deviceId=<serial>`.\n\n**Android only**: after install, run `adb -s <serial> reverse tcp:8081 tcp:8081` so the emulator/device can reach Metro on your host. Repeat if the device restarts or adb drops.\n\n**Agent checklist:**\n\n- [ ] Metro is already running and shows \"ready\"\n- [ ] Command run from project root\n- [ ] If the device isn't booted: use `boot-device` with the iOS `udid` or Android `avdName`. Refer to the `argent-ios-simulator-setup` / `argent-android-emulator-setup` skill.\n- [ ] Android: `adb -s <serial> reverse tcp:8081 tcp:8081` done.\n\n---\n\n## 2. Ensuring / Debugging Metro\n\n### 2.1 Check for Existing Metro\n\nBefore starting Metro, avoid \"port already in use\" errors. Default port to check is :8081, infer the port from documentation:\n\n```bash\nlsof -i :PORT\n```\n\n- **No output** → Port free; safe to start Metro.\n- **Output with PID** → Another process is using the port.\n\nUse the `debugger-status` tool to check whether the process on that port is actually a Metro server. If not Metro — ask the user whether you may kill the process.\n\nTo kill a Metro process, use the `stop-metro` tool (requires user confirmation).\n\n### 2.2 Confirm Correct Server Connection\n\n- **App must point at the same host/port as the running Metro.** Default: same machine, port 8081.\n- **iOS Simulator:** By default uses localhost; no extra config needed for same-machine Metro.\n\n**Verify Metro is reachable:** use the `debugger-status` tool.\n\n### 2.3 Reload the App (Ensure New Bundle)\n\nAfter code or config changes, the app must load the new bundle:\n\n| Method      | How                                                                                               |\n| ----------- | ------------------------------------------------------------------------------------------------- |\n| Reload tool | Use the `debugger-reload-metro` tool                                                              |\n| Restart app | Use the `restart-app` tool, or kill the app in simulator and run `npx react-native run-ios` again |\n\n**Agent checklist:**\n\n- [ ] Only one Metro process (no duplicate on port)\n- [ ] App was started after Metro was ready\n- [ ] When needing to reload: refer to 2.3\n\n---\n\n## 3. Build / Install / Retry (React Native & iOS Native)\n\n### 3.1 When Build Fails (e.g. xcodebuild exit code 65)\n\n**Order of operations (simplest first):**\n\n1. Clean build folder, then retry the build command\n2. Clear caches and reinstall dependencies: reset Metro cache, `watchman watch-del-all`, remove `node_modules` + lockfile, `bun install`, then `cd ios && rm -rf build Pods Podfile.lock && pod install --repo-update`\n3. CocoaPods issues: `pod deintegrate` then `pod install --repo-update`\n4. Open `ios/*.xcworkspace` in Xcode for detailed errors in the Report navigator\n\n### 3.2 When to Ask the User\n\n**After 2-3 failed build or run attempts, STOP and ask the user for guidance.** The user may know about required env vars, Xcode version requirements, custom build configurations, monorepo-specific setup, or required external services.\n\nIf the project structure is convoluted and the correct build approach is not obvious, **ask the user early** rather than guessing.\n\n### 3.3 Saving Build Workflow for Later\n\nOnce you discover the correct build/run workflow for a project, **save it to project memory**. Capture: commands to start Metro, commands to build/run the app, and any required environment setup.\n\n### 3.4 When to Reinstall vs Refresh\n\n| Situation                                             | Action                                                                                |\n| ----------------------------------------------------- | ------------------------------------------------------------------------------------- |\n| JS/React only changed                                 | Use `debugger-reload-metro` tool. No rebuild.                                         |\n| Native code or `pod install` / project config changed | Rebuild: `npx react-native run-ios` (Metro can stay running).                         |\n| `node_modules` or `package.json` changed              | `bun install`, then if native deps changed run `cd ios && pod install`. Then rebuild. |\n| App needs reinstalling from .app path                 | Use `reinstall-app` tool with UDID, bundle ID, and .app path.                         |\n| Persistent native build errors                        | Full clean + reinstall (step 2 above).                                                |\n\n### 3.5 Device Control\n\n| Action                     | Tool / Command                                                         |\n| -------------------------- | ---------------------------------------------------------------------- |\n| List devices               | `list-devices` tool (iOS + Android)                                    |\n| Boot an iOS simulator      | `boot-device` tool with `udid`                                         |\n| Boot an Android emulator   | `boot-device` tool with `avdName`                                      |\n| Launch an app              | `launch-app` tool (pass device id + bundle id / package name)          |\n| Restart an app             | `restart-app` tool (pass device id + bundle id / package name)         |\n| Open a URL / deep link     | `open-url` tool (pass device id + URL)                                 |\n| Rotate device              | `rotate` tool                                                          |\n| Stop simulator server      | `stop-simulator-server` tool (iOS UDID or Android serial — one device) |\n| Stop all simulator servers | `stop-all-simulator-servers` tool (iOS + Android)                      |\n\nFor full simulator setup workflow, refer to the `argent-ios-simulator-setup` skill.\n\n### 3.6 Verifying Local Release-Variant Builds — Stale-Code Gotchas\n\n**Applies to Android local release-variant builds** (`bun mobile android:<flavor>:release:local`, i.e. `apps/mobile/scripts/runAndroidLocal.sh`). Release variants **embed the JS bundle in the APK**, so a verify-on-device loop can silently test **old code** through **two independent caching layers**. Each makes a change look like it had \"no effect\" when it was never in the installed APK. **Both must be defeated — disabling one alone is not enough.** `runAndroidLocal.sh` handles both by default; this section is for recognizing the symptoms if a build looks stale or you build with another command.\n\n#### Gotcha 1 — EAS build cache reinstalls a stale APK\n\n`apps/mobile/app.config.ts` sets `experiments.buildCacheProvider: 'eas'`. `expo run:android` computes a **native** fingerprint and, on a match, downloads + installs a cached APK instead of building. A **JS-only** change does not move the native fingerprint, so for a release variant it reinstalls an APK with old JS.\n\n- **Symptom (logs):** `Searching builds with matching fingerprint on EAS servers` → `Successfully downloaded cached build` → install path under `…/eas-build-run-cache/….apk`.\n- **Detection:** you changed only JS/TS, yet the install line points at an `eas-build-run-cache` path.\n- **Fix:** build via `runAndroidLocal.sh` — it exports `EXPO_LOCAL_NO_BUILD_CACHE=1`, which gates the provider off in `app.config.ts` so a real build runs. Confirm `› Building app...` in the logs (not \"downloaded cached build\"). If invoking `expo run:android` directly, export `EXPO_LOCAL_NO_BUILD_CACHE=1` yourself.\n\n#### Gotcha 2 — gradle `createBundle<Variant>JsAndAssets` stays UP-TO-DATE\n\nEven with the EAS cache off, gradle's incremental check misses changes to monorepo JS sources (e.g. `packages/uniswap/**`), so the bundle task stays `UP-TO-DATE` and the APK embeds the **previously-bundled** `index.android.bundle`.\n\n- **Symptom (logs):** `> Task :app:createBundleDevReleaseJsAndAssets UP-TO-DATE`.\n- **Detection:** compare the embedded bundle mtime to your edit time:\n  ```bash\n  ls -la apps/mobile/android/app/build/generated/assets/createBundle<Variant>JsAndAssets/index.android.bundle\n  ```\n- **Fix:** `runAndroidLocal.sh` deletes the bundle task outputs by default (pass `--no-clean-js` to skip for native-only rebuilds). To clear them manually, remove:\n  - `apps/mobile/android/app/build/generated/assets/createBundle<Variant>JsAndAssets`\n  - `apps/mobile/android/app/build/generated/res/createBundle<Variant>JsAndAssets`\n  - `apps/mobile/android/app/build/intermediates/assets/<variant>`\n\n  A successful regen logs `> Task :app:createBundle<Variant>JsAndAssets` (no `UP-TO-DATE`) and `Writing bundle output to …`. `<Variant>` is the capitalized gradle variant (`DevRelease`, `BetaRelease`, `ProdRelease`); `<variant>` is the camelCase form (`devRelease`, …).\n\n---\n\n## 4. Runtime Problems in the App\n\n### 4.1 Where to Look\n\n| Problem type                      | Tool / Where to look                                                                                                                                                                                                                                              |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **JavaScript errors / logs**      | Use `debugger-log-registry` to get a summary and log file path, then `Grep`/`Read` to search.                                                                                                                                                                     |\n| **React component hierarchy**     | Use `debugger-component-tree` tool for a text tree, or `debugger-inspect-element` at specific logical pixel coordinates (not normalized 0-1).                                                                                                                     |\n| **Visual state of the app**       | Use `screenshot` tool to capture the current screen, but prefer `describe` or `debugger-component-tree` for actual navigation and target discovery. If a permission prompt or system-owned modal overlay is not exposed reliably, then fall back to `screenshot`. |\n| **Evaluate JS in the app**        | Use `debugger-evaluate` tool to run JavaScript in the app's runtime.                                                                                                                                                                                              |\n| **Native crashes / native stack** | `npx react-native log-ios` or iOS Simulator: Debug → Open System Log.                                                                                                                                                                                             |\n| **Build/runtime config**          | `metro.config.js`, `babel.config.js`, `package.json` scripts, `ios/Podfile`.                                                                                                                                                                                      |\n\nFor comprehensive Metro debugging workflows (component inspection, console logs, JS evaluation), refer to the `argent-metro-debugger` skill.\n\n### 4.2 JS Console Logs (Log Registry)\n\nLogs are written to a flat log file on disk under `~/.argent/tmp/`. Use the **log-registry → grep** pattern instead of reading logs inline.\n\nFor the full workflow, flat entry format, and grep examples, see `argent-metro-debugger` skill §5.\n\n### 4.3 Do not try to use the DevMenu in React Native apps by default.\n\nUse the argent tools instead.\n\n---\n\n## 5. Testing the App\n\nCheck the `argent-environment-inspector` result for test commands. For interactive UI testing with automatic screenshot verification, use the `argent-test-ui-flow` skill.\n\n- **Unit tests**: Look for Jest in `package.json` (`\"test\": \"jest\"`, `jest` config). Run: `npm test` or `yarn test`.\n- **E2E**: Look for Detox (`.detoxrc.js` or similar), or other E2E config. Dependencies: `detox`, `detox-cli`, and for iOS often `applesimutils`.\n- **UI flow testing**: For interactive UI testing with automatic screenshot verification, refer to the `argent-test-ui-flow` skill.\n\n### 5.2 Running Tests (Typical)\n\nIf the user's intent is ambiguous (run existing tests, write new tests, or find missing coverage), clarify before proceeding.\n\n- **Jest**: `npm test` or `npx jest`.\n- **Detox (example)**:\n  - Build: `detox build --configuration ios.sim.release` (or debug).\n  - Run: `detox test --configuration ios.sim.release`.\n  - Ensure simulator is booted and not used by another process.\n\n### 5.3 Agent Testing Checklist\n\n- [ ] Read `package.json` and test config (Jest, Detox, etc.).\n- [ ] If E2E: confirm simulator/device and build config.\n- [ ] If unclear: clarify whether to use existing workflows or write new tests.\n\n---\n\n## Quick Reference: Tools & Commands\n\n| Goal                         | Tool / Command                                                                                                                           |\n| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |\n| Check port 8081              | `lsof -i :8081`                                                                                                                          |\n| Kill Metro                   | `stop-metro` tool                                                                                                                        |\n| Start Metro                  | `npx react-native start`                                                                                                                 |\n| Start Metro (reset cache)    | `npx react-native start --reset-cache`                                                                                                   |\n| Run iOS app                  | `npx react-native run-ios`                                                                                                               |\n| Run Android app              | `npx react-native run-android`                                                                                                           |\n| List devices                 | `list-devices` tool (iOS + Android)                                                                                                      |\n| Boot a device                | `boot-device` tool (pass `udid` for iOS or `avdName` for Android)                                                                        |\n| Take screenshot              | `screenshot` tool                                                                                                                        |\n| Describe screen (a11y tree)  | `describe` tool for normal app screens and in-app modals; use `screenshot` only when permission/system overlays are not exposed reliably |\n| Read JS console logs         | `debugger-log-registry` tool                                                                                                             |\n| Reload JS bundle             | `debugger-reload-metro` tool                                                                                                             |\n| Check Metro status           | `debugger-status` tool                                                                                                                   |\n| Inspect React component tree | `debugger-component-tree` tool                                                                                                           |\n| Run JS in app                | `debugger-evaluate` tool                                                                                                                 |\n| iOS native logs              | `npx react-native log-ios`                                                                                                               |\n| Android native logs          | `npx react-native log-android` or `adb -s <serial> logcat`                                                                               |\n| Clean + reinstall (nuclear)  | See §3.1 step 3                                                                                                                          |\n\n---\n\n## Related Skills\n\n| Skill                          | When to use                                                                     |\n| ------------------------------ | ------------------------------------------------------------------------------- |\n| `argent-ios-simulator-setup`   | Initial simulator boot and connection setup                                     |\n| `argent-device-interact`       | Tapping, swiping, typing, hardware buttons, gestures on the simulator/emulator  |\n| `argent-metro-debugger`        | Full Metro CDP debugging: component inspection, console logs, JS evaluation     |\n| `argent-react-native-profiler` | Profiling performance, finding re-render issues, CPU hotspots                   |\n| `argent-test-ui-flow`          | Interactive UI testing with automatic screenshot verification after each action |\n\nAsk the user before running tests: confirm which test suite (unit, E2E, or both), whether to use existing CI commands, and whether they want you to run existing tests, write new ones, or explore test cases yourself.\n\n<!-- File: .agents/skills/argent-react-native-optimization/references/fix-reference.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/fix-reference.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/fix-reference.md)\n\n<!-- File: .agents/skills/argent-react-native-optimization/references/lint-rules.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/lint-rules.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/lint-rules.md)\n\n<!-- File: .agents/skills/argent-react-native-optimization/references/semantic-checklist.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `.agents/skills/argent-react-native-optimization/references/semantic-checklist.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-optimization/references/semantic-checklist.md)\n\n<!-- File: .agents/skills/argent-react-native-optimization/SKILL.md (Tokens: ~1121 | Category: anthropic-skill) -->\n---\nname: argent-react-native-optimization\ndescription: Optimizes a React Native app by profiling first to find real bottlenecks, then sweeping for mechanical issues. Entry-point for all performance work. Use when the app feels slow, user asks to optimize, fix re-renders, reduce jank, or improve startup. Delegates to argent-react-native-profiler for measurement.\n---\n\n## Rules\n\n- Do not apply shotgun optimizations. Measure first, define what \"good enough\" looks like (target metric + threshold), fix the top offender, re-measure honestly.\n- **Quick scan** — `react-profiler-renders` for a live render count table. Identifies hot components instantly.\n- **Deep measure** — load `argent-react-native-profiler` skill. `react-profiler-start` → interact → `react-profiler-stop` → `react-profiler-analyze`.\n- **Inspect** — `react-profiler-component-source` per finding. `react-profiler-fiber-tree` to trace component ancestry and render cost.\n- **Verify correctness** - before fixing, recollect information from steps above and make a logical conclusion whether the approach is worth undertaking.\n- **Fix** — apply one fix. Validate with `debugger-evaluate` before committing.\n- **Re-measure** — report whether the target metric improved, regressed, or stayed flat. Check for regressions in other areas. If no net benefit or unacceptable tradeoffs, revert.\n- **Profile for discovery, not only verification.** Use the profiler to find issues static analysis missed, not only to confirm fixes.\n- **One fix per cycle for architectural changes.** Mechanical batch fixes (inline styles, index keys) can be grouped — re-profile once after the batch. When the measurement involves simulator interaction, record it as a flow (`argent-create-flow` skill) before the first run so all subsequent cycles replay identical steps.\n- **React Compiler**: if `react-profiler-analyze` reports `reactCompilerEnabled: true`, do NOT propose `useCallback`/`useMemo`/`React.memo` unless you confirmed compiler bail-out via `react-profiler-fiber-tree` (absent `useMemoCache`).\n- **Sub-agents**: Phases 1–2 dispatch sub-agents — one per file for lint results, one per checklist item for semantic. Sub-agents CANNOT touch the simulator - all profiling and E2E verification must happen in the main agent.\n\n## Pipeline\n\n**Lint and semantic sweeps catch deterministic issues cheaply. Profiling finds runtime bottlenecks that static analysis misses. Do both.**\n\nCopy this checklist into your TODO list:\n\n```\nOptimization Progress:\n- [ ] Phase 1: Lint sweep (deterministic — catch mechanical issues without a running app)\n- [ ] Phase 2: Semantic sweep (judgment — memoization, lists, animations, etc.)\n- [ ] Phase 3: Baseline profile (find real bottlenecks, fix top offenders)\n- [ ] Phase 4: Verify no regressions (crashes, errors, red screens)\n```\n\n### Phase 1: Lint sweep\n\nRun ESLint once at the project root with a comprehensive RN performance ruleset. Dispatch sub-agents to fix results — one per file.\nSee [references/lint-rules.md](references/lint-rules.md) for ruleset and procedure.\n\n### Phase 2: Semantic sweep\n\nReview each area requiring judgment — memoization, list rendering, animations, async patterns, effect cleanup, state hygiene, context architecture. Dispatch one sub-agent per checklist item.\nSee [references/semantic-checklist.md](references/semantic-checklist.md) for full checklist.\n\n### Phase 3: Visual profiling\n\n1. Load `argent-react-native-profiler` skill, start dual profiling\n2. Exercise key user flows (navigate screens the user specified, or all major flows)\n3. Analyze with `react-profiler-analyze` + `native-profiler-analyze` + `profiler-combined-report`\n4. Cross-reference profiling results with Phase 1–2 findings\n5. Fix highest-impact issues. Re-profile after architectural changes; batch mechanical fixes. If a recorded flow breaks after a fix (e.g., UI layout changed), follow `argent-create-flow` skill to repair the flow rather than silently discarding it.\n\n### Phase 4: Verify no regressions\n\nNavigate every screen and UI flow within scope, confirm each renders without errors. If no scope was specified, verify the entire app — cover all reachable screens via `argent-device-interact`. Use `debugger-log-registry` to check for runtime errors and take screenshots to check for red/yellow error screens. Check for regressions introduced by fixes (e.g., fewer re-renders but higher CPU, or new jank in a different screen). Main agent only.\n\n## App-wide optimization\n\n1. **Phase 1**: run lint centrally (one command), dispatch sub-agents to fix per-file in parallel\n2. **Phase 2**: one sub-agent per checklist item for semantic sweep\n3. **Phase 3**: main agent profiles top offending screens; fixes architectural issues top-down\n4. **Phase 4**: main agent navigates all screens to verify nothing crashes\n\nAfter the entire run, run lint again to verify no new issues were introduced with your changes.\nThis also helps ensure you haven't missed any issues which could've been fixed.\n\n<!-- File: .agents/skills/argent-react-native-profiler/references/diagnostic-tools.md (Tokens: ~300 | Category: anthropic-skill) -->\n# References Skill\n\nPath: `.agents/skills/argent-react-native-profiler/references/diagnostic-tools.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/.agents/skills/argent-react-native-profiler/references/diagnostic-tools.md)\n\n<!-- File: .agents/skills/argent-react-native-profiler/SKILL.md (Tokens: ~3155 | Category: anthropic-skill) -->\n---\nname: argent-react-native-profiler\ndescription: Profile a React Native Hermes app to measure re-render and CPU performance using argent profiler tools. Use when optimizing for performance, measuring before/after a fix, spotting slow components, diagnosing re-renders, checking CPU hotspots, or producing a ranked issue report.\n---\n\nThis skill is complementary to `argent-react-native-optimization`, not a replacement for it.\n\n## 2. Tool Overview\n\n### React Profiler (Hermes / React commits)\n\n| Tool                              | Purpose                                                                                                                                                                                                                                                           |\n| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `react-profiler-start`            | Start CPU sampling + inject React commit-capture hook. Optional: `sample_interval_us` (default 100).                                                                                                                                                              |\n| `react-profiler-stop`             | Stop recording; stores cpuProfile + commitTree in session.                                                                                                                                                                                                        |\n| `react-profiler-status`           | **Call if you were interrupted in the middle of the flow, never in another scenario** (debugger drop, Metro reload, pause, subagent handoff, any doubt). Returns `session_status: \"active\" \\| \"taken_over\" \\| \"stopped\" \\| \"no_react_runtime\"`. Side-effect free. |\n| `react-profiler-analyze`          | Run pipeline -> report with CPU-enriched hot commits, sorted by `totalRenderMs` DESC. Saves raw data to disk.                                                                                                                                                     |\n| `react-profiler-component-source` | AST lookup: file, line, memoization status, 50 lines of source for a component.                                                                                                                                                                                   |\n| `react-profiler-renders`          | Live fiber walk: render counts + durations per component (no profiling session required).                                                                                                                                                                         |\n| `react-profiler-fiber-tree`       | Live fiber walk: full component hierarchy as JSON.                                                                                                                                                                                                                |\n\n### Drill-Down Query Tools (call after analyze)\n\n| Tool                       | Purpose                                                                                      |\n| -------------------------- | -------------------------------------------------------------------------------------------- |\n| `profiler-cpu-query`       | Targeted CPU investigation: top functions, time-windowed CPU, call trees, per-component CPU. |\n| `profiler-commit-query`    | Targeted commit investigation: by component, time range, commit index, or cascade tree.      |\n| `profiler-stack-query`     | iOS Instruments drill-down: hang stacks, function callers, thread breakdown, leak details.   |\n| `profiler-combined-report` | Cross-correlated report when both React Profiler and native profiler ran in parallel.        |\n| `profiler-load`            | List and reload previous profiling sessions from disk for re-investigation with query tools. |\n\nFor native profiling (CPU hotspots, UI hangs, memory leaks), see the `argent-native-profiler` skill.\n\n---\n\n## 3. Agent Behavior Guidelines\n\nFollow these rules throughout the profiling workflow:\n\n- Start `react-profiler-start` and `native-profiler-start` in parallel (two tool calls in one message). Both need `device_id`; use the same UDID for both so their data can be correlated later. This gives best coverage.\n- If the user only wants native profiling, use the `argent-native-profiler` skill workflow. Only skip `native-profiler-start` if the user has **already explicitly said** they don't want native profiling in this session\n\n### After analysis: ask about next steps\n\nAfter presenting the analysis report, always ask the user what they want to do next. Present these options:\n\n1. **Investigate further** — drill down into specific findings using query tools (CPU call trees, commit cascades, hang stacks, etc.) to identify root causes with confidence before making changes.\n2. **Implement fixes** — apply changes based on the current findings, then re-profile to measure whether the metric changed (improved, regressed, or stayed flat).\n3. **Done for now** — accept the report as-is.\n\nDo NOT silently move on after the report. The report is the starting point, not the end — query tools exist specifically to let you dig deeper into anything the report flags.\n\n### During investigation: use query tools proactively\n\nWhen drilling down, chain query tool calls based on what you find:\n\n- A hot commit -> `profiler-commit-query` mode=`by_index` to see all components -> `profiler-cpu-query` mode=`component_cpu` for the slowest one -> `profiler-cpu-query` mode=`call_tree` for the hot function -> read the source file -> propose a fix.\n- A memory leak -> `profiler-stack-query` mode=`leak_stacks` to identify the responsible module -> read the native source if actionable.\n- A native hang -> `profiler-stack-query` mode=`hang_stacks` to get the native call chain -> correlate with React commit timing.\n\n### After fixes: always re-profile\n\nWhen you apply a fix, always re-profile the same scenario afterward. Compare before/after metrics (commit durations, CPU time, render counts) and report honestly: did the target metric improve, stay flat, or regress? Did any _other_ metric get worse? If you need to reference the original data, use `profiler-load` to reload the pre-fix session. If the fix showed no improvement or introduced a regression, say so explicitly and reconsider the approach.\n\n### Use flows for reproducible profiling\n\nWhen profiling requires a specific interaction sequence (scroll a list, navigate screens, trigger an animation), **record the interaction as a flow** using the `argent-create-flow` skill before the first profiling run. Then replay the same flow for every subsequent run. This eliminates interaction variance as a confounder and makes before/after comparisons meaningful. Especially important when:\n\n- You are about to re-profile after applying a fix (Step 8).\n- The user asks you to compare multiple profiling sessions.\n- The interaction path is more than 2-3 steps long.\n\n---\n\n## 4. Standard Profiling Workflow\n\n**Complete all steps in order — do not break mid-flow.**\n\n### Step 1: Start profiling\n\nMind the react-native and ios-native profiler selection mentioned above when starting the session and start the tools. **Save `startedAtEpochMs` from the response** — you will need it for annotation offsets. Every subsequent profiler/query call in this session must use the same `device_id`. Before beginning, define lightweight success criteria with the user: which metric matters most (e.g., `totalRenderMs`, specific commit duration, render count for a component) and what threshold would be meaningful. This anchors later evaluation. On success:\n\n- if user asked you to perform the profiling, determine how to profile yourself using tools described in `argent-device-interact` skill.\n- if the user stated they wish to perform the interaction themselves — suggest what interaction to perform (e.g. \"scroll the list\", \"switch tabs\") and wait for their reply.\n  If you received information about **existing profiling session** being owned by another agent:\n- if session is marked as \"stale\", you may overtake it without prompting the user for allowance\n- if session is NOT \"stale\" - before taking action and terminating the other session, **stop and ask user what you should do**, explaining the situation.\n\n#### Annotate every interaction\n\nAfter each `gesture-tap` or `gesture-swipe` call, record an annotation using the returned `timestampMs`. Compute `offsetMs = timestampMs - startedAtEpochMs`. Do this for _every_ interaction — including back-navigation swipes, not just the primary action. Pass all collected annotations to `react-profiler-analyze` in Step 3.\n\n### Step 2: Stop and collect\n\nCall `react-profiler-stop` **and** `native-profiler-stop` in parallel. Only skip `native-profiler-stop` if you did not start it in Step 1. Note `duration_ms` and `fiber_renders_captured`.\nIf `fiber_renders_captured: 0`, warn the user — React commit data may be missing.\n\n### Step 3: Analyze\n\nCall `react-profiler-analyze` with `port`, `device_id`, `project_root`, `platform`, and `rn_version`. The report includes metadata such as `reactCompilerEnabled`, `strictModeEnabled`, and `buildMode` — check these in the returned markdown report.\n\nIf you performed interactions using `gesture-tap`/`gesture-swipe`, pass `annotations` to mark when each action occurred. Each annotation's `offsetMs` must be computed as `tapTimestampMs - startedAtEpochMs`, where `tapTimestampMs` is the `timestampMs` returned by the gesture-tap/gesture-swipe tool and `startedAtEpochMs` was returned by `react-profiler-start`. Do **not** use `Date.now()` for this calculation — only server-side timestamps from the tool return values.\n\nIf dual profiling, also call `native-profiler-analyze`, then **you must** call `profiler-combined-report` for the cross-correlated view — do not skip this step when both profilers ran; the combined report surfaces correlations that individual reports miss.\n\nThe analyze report includes **CPU hotspots per commit** — showing exactly which JS functions ran during each slow React commit. Raw data is saved to disk automatically for later reload.\n\n### Step 4: Assess results\n\nAnalyze whether the results give you a proper image of what is wrong with the application - **do not assume improvement always exists**, verify results logically with reference to how react-native works. Make sure to give honest feedback and be ready to change the approach if needed.\n\n### Step 5: Present findings and ask about next steps\n\nPresent a concise summary of the key findings - present whether possibilities for improvement exist and how performing further actions could affect performance. Then follow the \"After analysis\" guideline — ask whether to investigate further, implement fixes (if available), or stop.\n\n### Step 6: Drill-down investigation (iterative)\n\nBased on findings from the report, use query tools to investigate deeper:\n\n- **Slow component?** -> `profiler-cpu-query` mode=`component_cpu` component_name=`AppNavigator` — shows what JS functions ran during that component's commits.\n- **Want to see the call tree?** -> `profiler-cpu-query` mode=`call_tree` function_name=`expensiveFunction` — shows callers and callees.\n- **What happened during a time window?** -> `profiler-commit-query` mode=`by_time_range` — lists all commits in a range.\n- **Full commit detail?** -> `profiler-commit-query` mode=`by_index` commit_index=38 — all components, props changes, parent cascade.\n- **Who triggered whom?** -> `profiler-commit-query` mode=`cascade_tree` — visual parent-child cascade.\n- **iOS hang details?** -> `profiler-stack-query` mode=`hang_stacks` — native call stacks during a hang.\n\nRepeat as needed until you identify the root cause function and file, referring to step 4 for honest evaluation. After each round of investigation, ask the user if they want to continue digging or move to fixing.\n\n### Step 7: Reload a previous session\n\nIf you profiled multiple scenarios and need to revisit earlier data:\n\n1. Call `profiler-load` mode=`list` to see all saved sessions with timestamps (the list now also shows Runtime / Device / Metro bundle columns to help identify the right session).\n2. Call `profiler-load` mode=`load_react` session_id=`<timestamp>` device_id=`<UDID>` to reload React data. `device_id` scopes the reload into the `port:device_id` cache slot.\n3. Call `profiler-load` mode=`load_native` session_id=`<timestamp>` device_id=`<UDID>` to reload native profiler data.\n4. Query tools now operate on the reloaded session data — **pass the same `device_id` you loaded with**, otherwise they will miss the cache.\n\nThis is useful for before/after comparisons: profile, fix, re-profile, then reload the original session to compare metrics side by side.\n\n### Step 8: Apply fix and re-profile\n\nIf fix is present, read the source code of the identified bottleneck using `react-profiler-component-source` or the Read tool. Apply the fix, then re-profile (Step 1 -> user interaction -> Step 2 -> Step 3 -> Step 4). Report whether the target metric improved, stayed flat, or regressed. Also check whether the fix introduced regressions in other metrics (e.g., render count dropped but CPU time increased, or a different component now re-renders more). If the fix showed no net benefit or unacceptable tradeoffs, revert and reconsider.\n\n**Tip:** If the interaction sequence was recorded as a flow (see \"Use flows for reproducible profiling\" above), replay it with `flow-execute` instead of manually repeating the steps. This guarantees identical interaction conditions for the comparison. If the flow fails during replay (e.g., a UI fix changed the layout), follow `argent-create-flow` skill §10 (Flow Self-Improvement) to diagnose and repair the flow before retrying the profiling cycle.\n\nIf the user stated that they do not wish for changes, present the profiling report and skip the fix but suggest it to the user.\n\n**React Compiler rule:** If the analyze report indicates React Compiler is enabled, do NOT propose `useCallback`/`useMemo`/`React.memo` unless you confirmed compiler bail-out (check `react-profiler-fiber-tree` for absent `useMemoCache` on that component).\n\n---\n\n## 5. Important Caveats\n\n- **Dev mode inflation**: `buildMode: \"dev\"` renders are ~3x slower than production. Prioritize high `normalizedRenderCount` — it scales to prod.\n- **Re-run after fixes**: Always re-profile after changes. Report honestly whether the metric improved, regressed, or stayed flat — do not assume improvement.\n- **`excluded` is informational**: Components in `animatedSubtrees` and `recyclerChildren` re-render by design.\n- **Strict Mode**: Double-invokes renders. The pipeline halves `normalizedRenderCount` automatically when detected.\n- **Debugger connection**: If interrupted, started profiling also closes. Before attempting recovery, call `react-profiler-status` — it tells you whether the session is `active`, `taken_over`, `stopped`, or `no_react_runtime`, so you can decide whether to stop, restart, or reconnect first.\n- **Confounders to watch for**:\n  - Live API data may differ between runs (different payload sizes, content counts), which shifts render counts and durations independently of your fix. Note when data-dependent components show variance.\n  - Profiler overhead inflates CPU measurements. If iOS Instruments shows `JSLexer`, `JSONEmitter`, or Hermes internals dominating the JS thread, that reflects profiler instrumentation cost — not app work. Discount those entries.\n  - Runs are not perfectly reproducible. Small variations (under ~10-15%) in commit duration may be noise; only treat consistent, directional changes as signal.\n\nFor standalone diagnostic tools (live render stats, fiber tree, CPU summary), see `references/diagnostic-tools.md`.\n\n<!-- File: .agents/skills/argent-screenshot-diff/SKILL.md (Tokens: ~4494 | Category: anthropic-skill) -->\n---\nname: argent-screenshot-diff\ndescription: Capture stable before/after screenshots on an iOS simulator or Android emulator and pixel-diff them into evidence. Use when asked for a visual regression check, a screenshot diff, a before/after visual comparison, or when a visible mobile UI change needs pixel proof — including the executed screenshot-diff that a Tamagui conversion batch requires.\n---\n\n## 1. Use the first-party `screenshot-diff` tool\n\n`screenshot-diff` is a real first-party argent MCP tool, and it is the preferred path for every diff in this skill. Hand-rolling a pixel diff is the fallback (§ 5), not the default.\n\n| Parameter | Required | Notes |\n| --- | --- | --- |\n| `udid` | **yes** | iOS UUID or Android adb serial, same as every other argent tool |\n| `outputDir` | **yes** | Where the diff artifacts are written |\n| `baselinePath`, `currentPath` | mode A | Two PNGs you already saved to disk |\n| `captureBaseline`, `captureCurrent` | mode B | The tool captures live from the device instead |\n| `rotation` | no | The same rotation parameter `screenshot` takes |\n\nSupply **either** the saved-PNG pair **or** the live-capture flags — the two modes are alternatives, not additions.\n\nReturns `{ summary, diffPath, contextDiffPath }`: the comparison summary plus two written artifacts, the diff image and a context diff.\n\n**It excludes the fixed status-bar band from both the pixel and the OCR comparison.** That alone is reason to prefer it over anything hand-rolled. The clock, battery percentage and signal indicators differ between any two captures taken seconds apart, and on a full-screen mobile capture they are the single most common source of false positives. With this tool you neither crop them out nor explain them away in review.\n\n**Load the schema before your first call** — deferred tools in this environment expose only their name until you load them. ToolSearch for `screenshot-diff`, read the parameter names and return shape off the schema, and use those. The table above was transcribed from a session with the argent server connected rather than verified in the session that wrote this skill, so treat the loaded schema as the authority wherever the two disagree.\n\n**Never invent a tool signature.** If ToolSearch cannot load it, the tool is not available to your session — take the § 5 fallback and say so in your report.\n\n---\n\n## 2. Prerequisites and their limits\n\nFrom `apps/mobile/CLAUDE.md`:\n\n```bash\nbun add -g @swmansion/argent   # one-time per machine; puts `argent` on PATH\n```\n\n- **Argent does not build or install the app for you** — it drives whatever is already on the sim. Get the build you intend to compare installed and running first via `argent-react-native-app-workflow`.\n- **Argent owns the simulator.** Do not mix `xcrun simctl install/launch/terminate` with argent calls — sim state corruption is real, and a corrupted sim silently poisons a diff.\n- **Do not run `argent init`** — skills and config are already committed. `argent update` only when intentionally refreshing.\n- **Android**: run `adb -s <serial> reverse tcp:8081 tcp:8081` before the app starts, or Metro is unreachable and you will capture a red screen.\n- **At session end**: call `stop-all-simulator-servers`.\n\nGet a `udid` per `argent-ios-simulator-setup` (iOS, UUID-shaped) or `argent-android-emulator-setup` (Android, adb serial). Tool names are identical on both platforms.\n\n---\n\n## 3. The headless constraint — state it, do not paper over it\n\n**A headless or CI agent session cannot drive a local simulator or emulator.** There is no sim to attach to, no Xcode/`xctrace`, no emulator, and no display. This was the blocking finding on INFRA-3096 and it has not changed.\n\nEverything below is the **argent-driven local-device path**, and that path needs a **locally attached simulator, emulator, or device** in a session running on a developer machine: argent's MCP server drives a local sim/emulator or an attached device, and a headless session has no argent binary, no argent MCP server, and no device.\n\nIf you are headless, do **not** stage a diff and imply it ran. `tamagui-conversion` is explicit: *a staged-but-unrun diff is not evidence.* Instead do one of:\n\n1. **Hand off.** Stage the comparison surface (§ 4), commit it, and write the exact runnable steps — udid selection, story names, `scale: 1.0`, the `screenshot-diff` call and its `outputDir`, and the state matrix — into the Linear issue and PR body so a human-run session executes it verbatim.\n2. **Record the obligation.** Comment on the issue that the executed diff is outstanding, with the commit the diff must be run against. An unmet obligation on the record beats a fabricated verdict.\n3. **Substitute, with sign-off.** If no legacy twin exists there is nothing to diff at all — substitute self-contained behavioral tests plus **explicit requester sign-off** (the `tamagui-conversion` rule).\n\n### Remote devices — the blockers above are narrower than \"you need a developer machine\"\n\nThose blockers are about driving **argent**. They are not a claim that on-device visual evidence is impossible without a local simulator. **AWS Device Farm runs real remote devices and needs no local sim and no macOS host**, so it is a plausible route to the underlying evidence goal — before/after captures from a real device, taken to a pixel diff. What that route carries:\n\n- **Whether argent can target a Device Farm device is untested.** Do not claim it can and do not claim it cannot; if you need argent specifically, treat it as an open question to verify.\n- **The build must embed a dev-mode bundle**, because Storybook is `__DEV__`-only (§ 8) — a bundled production build cannot show the staged stories at all.\n- **Android-only absent a macOS host**, since an iOS build needs one.\n\n**The INFRA-3096 \"declined\" note is narrower than it reads.** A Device Farm pass was declined there — but on a batch with **zero converted files**, where the objection was to diffing a batch in which nothing had changed (\"staged evidence with extra steps\"), not to Device Farm as a capture mechanism. That is a reading of INFRA-3096 comment `fe4db9f3`; check it yourself before citing it either way. Whichever capture route you use, \"executed, never staged\" is unchanged — the diff must actually run, against changed code.\n\n---\n\n## 4. Staging the comparison — the canonical pattern\n\nThe repo practice this skill formalizes: put both sides in **one Storybook file** rendering the **identical state matrix at identical screen positions**, so a diff of the two stories measures nothing but the component.\n\nPattern files:\n\n- `apps/mobile/src/components/mycelium/SegmentedControlMigration.stories.tsx` (#37202) — the template. `Legacy` and `Rebuilt` stories render the exact same matrix at the exact same positions; `SideBySide` stacks both per state for eyeballing.\n- `apps/mobile/src/components/mycelium/ShimmerMigration.stories.tsx` — carries a hard-won caveat.\n\nRules that fall out of those two files:\n\n| Case | Stage it as | Why |\n| --- | --- | --- |\n| Static states | Standalone `Legacy` + `Rebuilt` stories, identical positions | Diffable pair, nothing else varies |\n| **Animated** states | `SideBySide`, both mounts **simultaneous** | Separate mounts start their animation clocks at different times — an out-of-phase row looks frozen or broken when both implementations are correct. Phase-lock or do not diff. |\n| No legacy twin | Not diffable at all | Behavioral tests + requester sign-off instead |\n\nIdentical positions is not a nicety. Any offset makes the whole panel differ and the diff is worthless.\n\n---\n\n## 5. Capture and diff — the procedure\n\nGet a `udid` from `list-devices`, stage both sides per § 4, and settle per § 6. Then:\n\n1. Navigate to the `Legacy` story. Settle, then `screenshot` with **`scale: 1.0`**, persisted to disk.\n2. Navigate to `Rebuilt` — same route, same scroll offset, no device rotation between captures.\n3. Settle, then `screenshot` with `scale: 1.0`, persisted to disk.\n4. Call `screenshot-diff` with `udid`, an `outputDir`, and the two files as `baselinePath` / `currentPath`.\n5. Read `summary`, then open `diffPath` and `contextDiffPath` and actually look at them (§ 7).\n\n### `scale: 1.0` is mandatory for anything you feed to a diff\n\n`screenshot` **downscales to 30% of native resolution by default** to save context (`argent-device-interact` § 7). `scale` accepts `0.01`–`1.0`.\n\n> A 30% capture has thrown away the pixels you are measuring: it invents resampling differences that read as regressions, and it hides real one-pixel border and anti-aliasing shifts. A diff run at the default scale is not evidence.\n\n```json\n{ \"udid\": \"<UDID>\", \"scale\": 1.0 }\n```\n\nIf `screenshot` returns an inline image rather than a file path, you need the bytes on disk before `baselinePath` / `currentPath` will accept them. **Load the tool's schema with ToolSearch and read its actual return shape** — do not assume either form.\n\n### The live-capture mode\n\n`captureBaseline` / `captureCurrent` (§ 1) let `screenshot-diff` take the shots itself instead of you saving PNGs. Read the schema for how the two are sequenced before relying on it: the staged-story pattern in § 4 requires **navigating between the two captures**, and a before/after across a code change requires a rebuild between them. Prefer the saved-PNG pair whenever anything has to happen in between.\n\n### Fallback — only when `screenshot-diff` will not load\n\nFor a session with no argent MCP server connected, or an argent version predating the tool. Capture the pair exactly as above, then diff the PNGs yourself: `labs/workbench` already carries the engine as devDeps (`pixelmatch` 7.2.0, `pngjs` 7.0.0), and `labs/workbench/scripts/visual/compare.ts` is a working reference for the pixelmatch call, padding, and flag arithmetic — reuse it rather than reaching for a new dependency. You then own the two jobs the first-party tool does for you: masking the status-bar band, and picking thresholds (§ 7).\n\n---\n\n## 6. Determinism — eliminate false positives before you diff\n\nA flaky diff is worse than no diff: it trains reviewers to ignore the artifact. Fix all of these before capturing.\n\n- **Kill animation.** Disable animations in the app, or use a `SideBySide` phase-locked mount for anything that moves. Never diff a mid-transition frame.\n- **Pin the device.** Same simulator model **and** same OS version for before and after. A different sim is a different renderer.\n- **Pin the position.** Identical scroll offset, orientation, and safe-area insets. Do not rotate between captures.\n- **Settle before capture.** Wait for the screen to be static — no spinner, no skeleton, no in-flight image load. If the returned screenshot shows a transitional frame, retake with `screenshot` (the `argent-test-ui-flow` recovery pattern).\n- **Same content.** No live data, no timestamps, no randomized ordering, no avatar that loads from the network.\n- **Same theme.** Diff light against light and dark against dark, as separate pairs.\n\n---\n\n## 7. Reading the result\n\n### With `screenshot-diff` (the primary path)\n\n`summary` is the judgement surface; `diffPath` and `contextDiffPath` are the artifacts.\n\n- **Read `summary`, then corroborate it against the images.** A summary you did not check against the diff image is a claim, not a verdict.\n- **The contract in § 1 exposes no threshold, sensitivity, or flagging parameter** — so there is nothing to tune, and this skill will not recommend a number for it. Do not invent one. If the schema you load exposes a knob § 1 does not list, use it and record the value you passed.\n- **Calibrate with a no-change control pair.** Capture the same story twice with nothing changed and diff it. Whatever the tool reports on that pair is the floor for this device, this OS version, this screen — a real pair must clear it visibly. With no tunable threshold, this control is the calibration.\n- **Status-bar drift is already excluded** (§ 1), so anything reported is real content, not a clock tick.\n\n**How the harness numbers below translate: they mostly do not.** Stated plainly so nobody tries to reconcile them:\n\n| Harness concept | Counterpart in `screenshot-diff` |\n| --- | --- |\n| `--pixel-threshold` (per-pixel color sensitivity) | **None exposed.** The tool decides its own sensitivity |\n| `--flag-ratio` (`diffPixels / totalPixels`) | **None exposed.** The tool does not take a flagging rule from you |\n| `--min-diff-pixels` (absolute floor) | **None exposed** |\n| Manual status-bar masking | **Built in** — excluded from pixel *and* OCR comparison |\n| Diff PNG output | `diffPath`, plus `contextDiffPath` |\n| Flag verdict computed by you | `summary`, computed by the tool |\n\nThree of the harness's four knobs have no counterpart. That is not a gap to paper over with an invented mapping — it means the judgement moves from *choosing numbers* to *reading `summary` against a control pair and looking at the diff image*.\n\n### Fallback thresholds — hand-rolled `pixelmatch` only\n\nEverything below applies to the § 5 fallback, not to `screenshot-diff`.\n\n**Established precedent** — `labs/workbench/scripts/visual/README.md`, the web harness. A pair is flagged when **both** conditions hold:\n\n```\ndiffPixels / totalPixels > 0.005     # relative ratio (--flag-ratio)\nAND diffPixels > 250                 # absolute floor (--min-diff-pixels)\n```\n\nwith a per-pixel color sensitivity of `0.1` (`--pixel-threshold`, passed to pixelmatch).\n\n**Why two conditions, so you can adapt rather than cargo-cult:** the ratio alone over-fires on small panels. On a ~6–10k-pixel panel, sub-perceptual anti-aliasing noise (the harness's documented case: translucent-token compositing rendering text a few 8-bit steps apart) is ~120–180 px — under 250 absolute, but *over* 0.005 relative. The absolute floor absorbs exactly that. Meanwhile a genuinely broken color repaints most of a panel at high delta and trips both conditions comfortably. The two-condition rule buys you a wide, empty band between noise and real breakage.\n\n**Starting recommendations for mobile** (mine, not established — tune and record what you used):\n\n- Keep `pixel-threshold` at `0.1`. It is the sensitivity that was validated against real token-compositing noise, and it is platform-independent.\n- Keep the `0.005` ratio.\n- **Raise the absolute floor** above 250. Mobile captures at `scale: 1.0` are far larger than a workbench panel, and native text rasterization is noisier than Chromium's — 250 px will fire on nothing. Scale the floor with panel area: the web value is ~2.5–4% of a 6–10k-px panel, so start there and calibrate against a **no-change control pair** (capture the same story twice, unchanged; that number is your noise floor, and your threshold goes above it).\n- Any pair you had to raise a threshold to pass is **not** green — investigate it.\n\nRecord what you ran alongside the verdict — `screenshot-diff` and which mode, or the fallback and its thresholds. A verdict without its mechanism is unreproducible.\n\n---\n\n## 8. The Storybook tension — real, and reconcilable\n\nThis diff practice needs **Storybook**. But `apps/mobile/CLAUDE.md` mandates `NODE_ENV=production` for agent/CLI Metro precisely *because* dev-mode bundles Storybook and the app boots into Storybook UI, \"breaking agent-driven interaction flows\":\n\n```bash\nbun nx run mobile:start:production   # the normal agent default — Storybook OFF\n```\n\nBoth are correct; they are different jobs. Reconcile by **choosing the mode for the task, deliberately and out loud**:\n\n| Task | Metro mode | Storybook |\n| --- | --- | --- |\n| Driving real app screens, flows, QA, profiling | `mobile:start:production` | off (required) |\n| **Screenshot-diffing a staged story matrix** | dev Metro (`NODE_ENV` unset) | on (required) |\n\nSo: a screenshot-diff session runs dev Metro *on purpose*, and booting into Storybook UI is the desired outcome, not the failure the CLAUDE.md rule warns about. Consequences to hold onto:\n\n- **Do not do both in one Metro session.** Finish the diff, then restart Metro in production mode before any app-flow work — and say in your report which mode each artifact came from.\n- `NODE_ENV` applies at **JS-bundle time**. For a device build with no Metro dev server the flag goes on the build command, so a bundled production build cannot show Storybook at all — what you need is a **dev-mode bundle**, and how you get one depends on the route (§ 3): dev Metro against a local simulator, or a dev-mode-bundled build on a remote device.\n- A reviewer seeing Storybook chrome in your evidence should not read it as a broken setup. Label the captures as Storybook stories.\n\n---\n\n## 9. Recording the evidence\n\nAn executed diff is only evidence once it is **on the record**. Post to both the Linear issue and the PR:\n\n1. **Before/after images** per state — legacy, rebuilt, and the diff PNG. Never commit the images into the repo (the web harness's rule: report JSON is committed, images are gitignored); attach them to the issue/PR instead.\n2. **Video for motion.** Static screenshots cannot prove an animation. Channel convention (Thomas's rule, carried in `tamagui-conversion`) is before/after screenshots **plus video for anything animated**.\n3. **Provenance**: device model, OS version, platform, Metro mode, and the **commit SHA** the diff ran against. A diff against uncommitted work is not reproducible — the web harness refuses a dirty tree for exactly this reason.\n4. **The diff mechanism** (§ 7) — `screenshot-diff` and its mode, or the fallback with the thresholds you used and any deviation from the defaults and why.\n5. **A verdict per state**, not one aggregate. `pass` / `flagged` / `known drift (reason)`. Enumerate the full matrix so a reviewer can see nothing was quietly skipped.\n6. **Captured from where.** Visual evidence must come from a deployed preview or the workbench — never local dev — for web. For mobile the equivalent is the installed build at a named commit, stated explicitly.\n\nSay plainly whether the diff **ran**. \"Staged\" and \"executed\" are different claims and reviewers rely on the difference.\n\n---\n\n## Related Skills\n\n| Skill | When to use |\n| --- | --- |\n| `argent-device-interact` | The `screenshot` tool itself, `scale`, rotation, gestures, troubleshooting (§ 7 is the screenshot reference) |\n| `argent-test-ui-flow` | Navigating to the staged stories; the settle/retake recovery pattern before capture |\n| `argent-ios-simulator-setup` | Booting an iOS simulator, getting a UDID |\n| `argent-android-emulator-setup` | Booting an Android emulator, getting an adb serial, `adb reverse` |\n| `argent-create-flow` | Record the navigate-and-capture sequence as a flow so before/after captures are byte-for-byte reproducible via `flow-execute` — this removes interaction variance, the largest source of diff noise |\n| `argent-react-native-app-workflow` | Getting the build installed and Metro running before any capture |\n| `tamagui-conversion` | The migration contract that requires an executed diff as the mobile proof artifact |\n\n<!-- File: .agents/skills/argent-test-ui-flow/SKILL.md (Tokens: ~1363 | Category: anthropic-skill) -->\n---\nname: argent-test-ui-flow\ndescription: Autonomously test an app UI (iOS or Android) by running interact-screenshot-verify loops using argent MCP tools. Use when testing a UI flow, verifying login works, testing navigation, or running an end-to-end UI test scenario.\n---\n\n## Platform-agnostic\n\nThe interaction tool names are identical on iOS and Android — `gesture-tap`, `gesture-swipe`, `describe`, `screenshot`, `launch-app`, etc. — and the tool-server auto-dispatches based on the `udid` you pass (UUID-shape → iOS, adb serial → Android).\n\nGet a `udid` via:\n\n| Platform | Setup skill                     | Find devices with                                           |\n| -------- | ------------------------------- | ----------------------------------------------------------- |\n| iOS      | `argent-ios-simulator-setup`    | `list-devices` → `boot-device` with `udid` if none booted   |\n| Android  | `argent-android-emulator-setup` | `list-devices` → `boot-device` with `avdName` if none ready |\n\n## 1. Workflow\n\nAll interactions go through argent MCP tools. Ensure the simulator/emulator is ready before starting.\n\n1. **Baseline screenshot**: Call `screenshot` to see the current UI state.\n2. **Find target**: Before tapping, use a discovery tool to get element coordinates:\n   - **React Native apps**: use `debugger-component-tree` — it returns component names with (tap: x,y) coordinates. This is the preferred tool for RN apps on either platform. To use it, resolve the `argent-react-native-app-workflow` skill for setup; on Android you must also run `adb -s <serial> reverse tcp:8081 tcp:8081` so Metro is reachable from the device.\n   - **Standard app screens and in-app modals**: use `describe`. On iOS this returns the AX tree (falls back to native-devtools when AX is empty); on Android it returns the uiautomator tree in the same DescribeNode shape.\n   - **Permission prompts / system modal overlays**: try `describe` first. Fall back to `screenshot` only if the overlay is not exposed reliably.\n   - **Fallback**: use `screenshot` to estimate where the desired component is, then verify immediately after the action.\n3. **Interact**: Perform the action (`gesture-tap`, `gesture-swipe`, `keyboard`, `button`, ...) — you receive a screenshot automatically.\n4. **Verify**: Check the returned screenshot for expected results. If it shows a loading/transitional state, retake with `screenshot`.\n5. **Repeat** for each step in the flow.\n\n## 2. Template\n\n```\nGoal: Test [feature name]\n\nSteps:\n1. screenshot → see current state (baseline)\n2. [Navigate / tap / type to reach starting point] → verify auto-screenshot\n3. [Perform the action to test] → verify auto-screenshot\n4. Report: pass / fail with details\n```\n\n## 3. Examples\n\n### Login flow\n\n```\n1. screenshot → see login screen\n2. gesture-tap { x: 0.5, y: 0.4 }  → tap email field\n3. paste { text: \"user@example.com\" }\n4. gesture-tap { x: 0.5, y: 0.55 } → tap password field\n5. paste { text: \"password123\" }\n6. gesture-tap { x: 0.5, y: 0.7 }  → tap Login button\n7. screenshot → verify home screen appeared\n```\n\n### Scroll and navigation\n\n```\n1. screenshot → see list at top\n2. gesture-swipe { fromY: 0.7, toY: 0.3 } → scroll down\n3. gesture-tap item at visible position → verify auto-screenshot\n4. screenshot → verify detail view opened\n5. button { button: \"back\" }\n6. screenshot → verify returned to list\n```\n\n---\n\n## 4. Recovery Pattern\n\n- If screenshot shows loading/transition: wait 500ms, retake with `screenshot`.\n- If tap misses target: re-run discovery tool (`describe` / `debugger-component-tree`), retry once with new coordinates.\n- If a permission dialog or modal is visible: re-run `describe` first. Stay in screenshot-driven navigation only when the overlay is not exposed reliably, then switch back to `describe` / `debugger-component-tree` as soon as it is dismissed.\n- If tap fails twice at same coordinates: stop, re-discover, report if element not found.\n- If a **saved flow** fails during `flow-execute` replay (as opposed to live test steps above): follow `argent-create-flow` skill §10 for structured diagnosis and correction.\n\n## Tips\n\n- **Use `paste` for text entry on iOS** — faster and more reliable than key-by-key `keyboard`. `paste` is iOS-only; on Android use `keyboard` instead.\n- **Use `gesture-custom` for long-press** context menus (800ms hold).\n- **Report clearly**: state what you expected, what you saw, and the verdict.\n- **Coordinate estimation**: center = 0.5, 0.5; top-third ~ 0.2; bottom-third ~ 0.8.\n- **Permission modals**: try `describe` first. Use `screenshot` only as fallback, tap one visible button at a time, and verify with the returned screenshot before continuing.\n- **Record for replay**: If a tested flow is likely to be repeated, use the `argent-create-flow` skill to record it as a `.yaml` script. This lets you replay the entire sequence later with a single `flow-execute` call instead of re-running each step manually.\n\n## Related Skills\n\n| Skill                              | When to use                                             |\n| ---------------------------------- | ------------------------------------------------------- |\n| `argent-device-interact`           | Tool usage for tapping, swiping, typing (iOS + Android) |\n| `argent-ios-simulator-setup`       | Booting and connecting an iOS simulator                 |\n| `argent-android-emulator-setup`    | Booting and connecting an Android emulator              |\n| `argent-react-native-app-workflow` | Starting the app, Metro, build issues                   |\n| `argent-metro-debugger`            | Breakpoints, console logs, JS evaluation                |\n| `argent-create-flow`               | Record a test sequence as a replayable flow             |\n\n<!-- File: packages/analytics/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Analytics Skill\n\nPath: `packages/analytics/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/package.json)\n\n<!-- File: packages/analytics/project.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Analytics Skill\n\nPath: `packages/analytics/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/project.json)\n\n<!-- File: packages/analytics/tsconfig.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Analytics Skill\n\nPath: `packages/analytics/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/tsconfig.json)\n\n<!-- File: packages/analytics/tsconfig.lint.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Analytics Skill\n\nPath: `packages/analytics/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/analytics/tsconfig.lint.json)\n\n<!-- File: packages/api/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Api Skill\n\nPath: `packages/api/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/package.json)\n\n<!-- File: packages/api/project.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Api Skill\n\nPath: `packages/api/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/project.json)\n\n<!-- File: packages/api/src/clients/trading/api.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Trading Skill\n\nPath: `packages/api/src/clients/trading/api.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/src/clients/trading/api.json)\n\n<!-- File: packages/api/tsconfig.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Api Skill\n\nPath: `packages/api/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/tsconfig.json)\n\n<!-- File: packages/api/tsconfig.lint.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Api Skill\n\nPath: `packages/api/tsconfig.lint.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/api/tsconfig.lint.json)\n\n<!-- File: packages/chains/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Chains Skill\n\nPath: `packages/chains/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/package.json)\n\n<!-- File: packages/chains/project.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Chains Skill\n\nPath: `packages/chains/project.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Uniswap/interface/HEAD/packages/chains/project.json)\n\n<!-- ... +183 more modular skills available via /api/skills/Uniswap/interface?path={path} -->\n</yakaai_skills>"}