@swmansion/argent 0.14.1-next.2 → 0.14.1-next.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,18 +9,32 @@
9
9
  [![Ad](https://swm-delivery.com/www/images/zone-gh-argent-2?n=1)](https://swm-delivery.com/www/delivery/ck-slug.php?zoneid=zone-gh-argent-2&n=1)
10
10
  [![Ad](https://swm-delivery.com/www/images/zone-gh-argent-3?n=1)](https://swm-delivery.com/www/delivery/ck-slug.php?zoneid=zone-gh-argent-3&n=1)
11
11
 
12
- **[Argent](https://argent.swmansion.com)** is an **agentic toolkit** that gives your AI assistant direct access to iOS Simulators and Android Emulators. Ask it to tap a button, run a profiler or reproduce an issue manually - all from within your CLI, without switching context.
12
+ **[Argent](https://argent.swmansion.com)** is an **agentic toolkit** that gives your AI assistant direct access to iOS Simulators, Android emulators and physical devices, TVs (Apple TV, Android TV, Fire TV) and Electron/Chromium desktop and web apps. Ask it to tap a button, run a profiler or reproduce an issue manually - all from within your CLI, without switching context.
13
13
 
14
14
  ```bash
15
15
  npx @swmansion/argent init
16
16
  ```
17
17
 
18
+ ## Supported platforms
19
+
20
+ Argent drives a growing set of targets through a single toolkit, each with the right interaction model - touch, remote or mouse:
21
+
22
+ | Platform | Targets | Interaction |
23
+ | ----------------- | ----------------------------------------------------------------------- | ---------------- |
24
+ | **iOS** | Simulators | Touch / gesture |
25
+ | **Android** | Emulators (AVDs) and physical devices over adb | Touch / gesture |
26
+ | **TV** | Apple TV (tvOS), Android TV / Google TV, Amazon Fire TV (Vega) | D-pad / remote |
27
+ | **Desktop & web** | Electron and Chromium apps (incl. React Native Web / Expo web) over CDP | Mouse / keyboard |
28
+
18
29
  ## Capabilities
19
30
 
20
- - **Autonomous iOS and Android development** - Allow your agent to work with iOS and Android apps on its own - let it build, open, interact with the app and debug it. Ask for reproducing issues, testing features manually, profiling your app and much more, without ever interrupting your work.
21
- - **UI interaction** - Give your agent full control toolkit - tapping, swiping, pinching, typing, gestures, hardware buttons and all other gears included. Let it navigate your app exactly as a user would, without lifting a finger.
22
- - **Profiling with batteries included** - Argent can perform and analyze both React-Native and Xcode Instruments profiling sessions. Get comprehensive summaries and ask to optimise your app where you find fit.
23
- - **Debugging and diagnostics** - Let your agent inspect logs, capture crash reports, and reproduce failing states on the simulator, so you can jump straight to the fix.
31
+ - **Autonomous mobile, TV and desktop development** - Allow your agent to work with iOS, Android, TV and Electron/web apps on its own - let it build, open, interact with the app and debug it. Ask for reproducing issues, testing features manually, profiling your app and much more, without ever interrupting your work.
32
+ - **UI interaction** - Give your agent the full control toolkit - tapping, swiping, pinching, typing, gestures and hardware buttons on mobile; the directional remote on TV; mouse, scroll and drag on desktop/web. Let it navigate your app exactly as a user would, without lifting a finger.
33
+ - **Record & replay flows** - Capture a sequence of interactions once and let your agent replay it deterministically, so manual repros and smoke tests become repeatable.
34
+ - **Visual regression** - Diff two screenshots (or a saved baseline against a live capture) with OCR- and font-aware comparison to catch unintended UI changes.
35
+ - **Profiling with batteries included** - Argent can perform and analyze React Native (Hermes), React DevTools and native (Xcode Instruments / Android Perfetto) profiling sessions - down to fiber renders, CPU hotspots and cross-correlated commit-vs-hang reports. Get comprehensive summaries and ask to optimise your app where you find fit.
36
+ - **Debugging and diagnostics** - Let your agent inspect logs, capture network traffic (JS `fetch` and native), evaluate JS in the running app, walk the native UIKit and React component trees, and reproduce failing states - so you can jump straight to the fix.
37
+ - **Desktop & web control** - For Electron and Chromium apps your agent can drive tabs, read and write cookies and storage, walk the DOM and inspect network over the Chrome DevTools Protocol.
24
38
  - **React Native out of the box** - Argent works with React Native apps natively, so your agent can build, launch, and iterate on your RN project the same way it would any native app - no extra setup required.
25
39
 
26
40
  > **Tip:** Once installed, ask your assistant _"What can Argent do?"_ - it will walk you through all capabilities available.
@@ -37,8 +51,10 @@ npx @swmansion/argent init
37
51
  #### Prerequisites
38
52
 
39
53
  - **Node.js 20.11** or later
40
- - For iOS: macOS with **Xcode** installed
41
- - For Android: **Android SDK Platform Tools** (`adb`) on `PATH`, and the **Android Emulator** package if you want to boot AVDs from Argent. Create AVDs via Android Studio or `avdmanager`.
54
+ - For iOS / tvOS: macOS with **Xcode** installed (Apple TV uses tvOS simulators — Xcode downloads the tvOS runtime on demand)
55
+ - For Android / Android TV: **Android SDK Platform Tools** (`adb`) on `PATH`, and the **Android Emulator** package if you want to boot AVDs from Argent. Create AVDs via Android Studio or `avdmanager`.
56
+ - For Fire TV (Vega): the **Vega SDK** (`vega` CLI) on `PATH`
57
+ - For Electron / Chromium: nothing extra to control an already-running app - just launch it with `--remote-debugging-port`, or let Argent spawn your Electron app for you
42
58
 
43
59
  ##### Linux host: extra prerequisites for Android emulators
44
60
 
@@ -98,20 +114,53 @@ npm install -g @swmansion/argent
98
114
  argent init
99
115
  ```
100
116
 
117
+ #### Share Argent with your team (committable install)
118
+
119
+ By default Argent installs **globally**. To version Argent _with your repo_ so every
120
+ teammate gets the same setup on `npm install` — no per-developer global install, no
121
+ `argent init` — choose the local mode:
122
+
123
+ ```bash
124
+ npx @swmansion/argent init --local
125
+ ```
126
+
127
+ This adds `@swmansion/argent` to your project's `devDependencies` and writes MCP
128
+ configs that launch the project-local copy (`node node_modules/@swmansion/argent/dist/cli.js mcp`).
129
+ Commit `package.json` + your lockfile, the generated MCP config (`.mcp.json`,
130
+ `.cursor/mcp.json`, …), `.argent/install.json`, and the skills/rules/agents files.
131
+ Teammates then just run `npm install`.
132
+
133
+ Pass `--global` to force the default mode in scripts; `--local` and `--global` are
134
+ mutually exclusive. A non-interactive (`--yes`) run defaults to global unless the
135
+ project already opted into local mode (a committed `.argent/install.json`, or
136
+ `@swmansion/argent` declared in the project's own `package.json`).
137
+
138
+ > In local mode the committed MCP config runs the project-local copy, so the bare
139
+ > `argent` command is **not** on teammates' `PATH`. Note that `npm install` builds
140
+ > Argent's native deps (`tree-sitter`) on each machine — prebuilt for macOS, Linux
141
+ > x64, and Windows x64; other targets (Linux arm64, Windows arm) compile from source
142
+ > and need a C/C++ toolchain.
143
+
101
144
  ## CLI Reference
102
145
 
103
- | Command | Description |
104
- | ------------------ | ---------------------------------------------------------------------- |
105
- | `argent init` | Install globally and configure MCP in the current workspace |
106
- | `argent install` | Alias for `init` command |
107
- | `argent update` | Pull the latest version and refresh workspace configuration |
108
- | `argent remove` | Unregister the MCP server and uninstall the package |
109
- | `argent uninstall` | Alias for `remove` command |
110
- | `argent mcp` | Start MCP server instance, used internally by agent |
111
- | `argent enable` | Enable a predefined feature flag (`--scope project` for project-local) |
112
- | `argent disable` | Disable a feature flag (`--scope project` for project-local) |
113
- | `argent flags` | List available feature flags and their state |
114
- | `argent telemetry` | Manage anonymous telemetry: `status` / `enable` / `disable` |
146
+ | Command | Description |
147
+ | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
148
+ | `argent init` | Install and configure MCP in the current workspace (`--global` default, `--local` for a committable devDependency) |
149
+ | `argent install` | Alias for `init` command |
150
+ | `argent update` | Pull the latest version and refresh workspace configuration (acts on the present install — both when a global install and a project devDependency coexist; `--global`/`--local` select explicitly) |
151
+ | `argent remove` | Unregister the MCP server and uninstall the package (`--global`/`--local` choose which install — and its configs — is removed; non-interactive runs never remove a coexisting global install) |
152
+ | `argent uninstall` | Alias for `remove` command |
153
+ | `argent mcp` | Start MCP server instance, used internally by agent |
154
+ | `argent tools` | List tools exposed by the tool-server (`describe <name>` for details) |
155
+ | `argent run` | Invoke a tool by name |
156
+ | `argent server` | Manage the shared tool-server: `start` / `status` / `stop` / `logs` |
157
+ | `argent lens` | Open Argent Lens bound to a fresh coding-agent session — Claude by default, `--agent` selects codex/gemini/opencode/cursor (macOS; behind the `argent-lens` flag — run `argent enable argent-lens` first) |
158
+ | `argent link` | Route client requests to a remote tool-server |
159
+ | `argent unlink` | Remove the persisted remote tool-server link |
160
+ | `argent enable` | Enable a predefined feature flag (`--scope project` for project-local) |
161
+ | `argent disable` | Disable a feature flag (`--scope project` for project-local) |
162
+ | `argent flags` | List available feature flags and their state |
163
+ | `argent telemetry` | Manage telemetry: `status` / `enable` / `disable` |
115
164
 
116
165
  ## Supported Editors
117
166
 
@@ -123,7 +172,7 @@ argent init
123
172
  | Cursor | `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global) |
124
173
  | VS Code | `.vscode/mcp.json` |
125
174
  | Windsurf | `~/.codeium/windsurf/mcp_config.json` (global) |
126
- | Zed | `.zed/settings.json` |
175
+ | Zed | `.zed/settings.json` (project) or `~/.config/zed/settings.json` (global) |
127
176
  | Gemini CLI | `.gemini/settings.json` |
128
177
  | Codex CLI | `.codex/config.toml` (project) or `~/.codex/config.toml` (global) |
129
178
  | Hermes | `~/.hermes/config.yaml` (global) |
@@ -132,7 +181,7 @@ argent init
132
181
 
133
182
  ## Privacy
134
183
 
135
- Argent collects anonymous, opt-out usage and diagnostic telemetry to help us prioritise features and fix what breaks. It is minimal by design.
184
+ Argent collects opt-out usage and diagnostic telemetry to help us prioritise features and fix what breaks.
136
185
 
137
186
  You can opt out at any time:
138
187
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,2 +1,3 @@
1
1
  import type { ToolsServerPaths } from "@argent/tools-client";
2
+ export declare function findStablePackageDir(startDir: string, packageRoot: string): string | undefined;
2
3
  export declare const BUNDLED_RUNTIME_PATHS: ToolsServerPaths;
@@ -1,9 +1,140 @@
1
+ import * as fs from "node:fs";
1
2
  import * as path from "node:path";
2
- // __dirname in ESM (compiled from TS) will be dist/.
3
- // Bundle artifacts ship next to the compiled launcher.
3
+ // Installed package version, read from the shipped package.json. Lets the
4
+ // launcher detect a stale tool-server after an in-place version bump (a local
5
+ // devDependency update rewrites tool-server.cjs at the same path) and respawn
6
+ // it — without relying on the postinstall script, which is frequently disabled
7
+ // (--ignore-scripts, pnpm onlyBuiltDependencies, Yarn PnP, locked-down CI).
8
+ function readPackageVersion() {
9
+ try {
10
+ const pkg = JSON.parse(fs.readFileSync(path.join(import.meta.dirname, "..", "package.json"), "utf8"));
11
+ return pkg.version;
12
+ }
13
+ catch {
14
+ return undefined;
15
+ }
16
+ }
17
+ const PACKAGE_NAME = "@swmansion/argent";
18
+ // The project a local install belongs to: the nearest ancestor of cwd that
19
+ // DECLARES the package (any dependency field, matching the installer's
20
+ // readManifestDeclaration) or carries a committed .argent/install.json. Can
21
+ // sit BELOW the physical hoist root — npm workspaces hoist a member's
22
+ // devDependency, but update/uninstall must act on the declaring member.
23
+ function findDeclaringRoot(startDir) {
24
+ let dir = startDir;
25
+ for (;;) {
26
+ if (fs.existsSync(path.join(dir, ".argent", "install.json")))
27
+ return dir;
28
+ try {
29
+ const manifest = JSON.parse(fs.readFileSync(path.join(dir, "package.json"), "utf8"));
30
+ if (manifest.devDependencies?.[PACKAGE_NAME] ||
31
+ manifest.dependencies?.[PACKAGE_NAME] ||
32
+ manifest.optionalDependencies?.[PACKAGE_NAME]) {
33
+ return dir;
34
+ }
35
+ }
36
+ catch {
37
+ // no/unreadable manifest at this level — keep walking up
38
+ }
39
+ const parent = path.dirname(dir);
40
+ if (parent === dir)
41
+ return null;
42
+ dir = parent;
43
+ }
44
+ }
45
+ // The version-STABLE package dir: the conventional <dir>/node_modules/<pkg>
46
+ // symlink closest to cwd that resolves to the running package. Unlike
47
+ // import.meta's realpath — pnpm's version-pinned .pnpm store dir, pruned on a
48
+ // bump — this symlink survives an in-place update. In a pnpm WORKSPACE the
49
+ // symlink sits in the DECLARING member's node_modules, a level below the root
50
+ // where the .pnpm store lives, so scan every level from cwd up rather than
51
+ // only the level where the store matched. Only ever returns a path whose
52
+ // realpath equals the running package, so it can never point at a different
53
+ // install — just a different (stable) alias of the same real dir.
54
+ export function findStablePackageDir(startDir, packageRoot) {
55
+ let dir = startDir;
56
+ for (;;) {
57
+ const candidate = path.join(dir, "node_modules", PACKAGE_NAME);
58
+ try {
59
+ if (fs.realpathSync(candidate) === packageRoot)
60
+ return candidate;
61
+ }
62
+ catch {
63
+ // no symlink at this level — keep walking up
64
+ }
65
+ const parent = path.dirname(dir);
66
+ if (parent === dir)
67
+ return undefined;
68
+ dir = parent;
69
+ }
70
+ }
71
+ // Install topology of this running package: a project's local devDependency
72
+ // (package root inside a node_modules found by walking up from cwd) or the
73
+ // global PATH install — and, for local, WHICH project. Classified at process
74
+ // start, the moment cwd is trustworthy (a committed local MCP command only
75
+ // resolves with cwd at the project root); the launcher forwards both as
76
+ // ARGENT_INSTALL_KIND / ARGENT_PROJECT_ROOT so update-argent doesn't re-infer
77
+ // them from the detached server's editor-chosen cwd.
78
+ function classifyInstall() {
79
+ let packageRoot;
80
+ let dir;
81
+ let cwd;
82
+ try {
83
+ packageRoot = fs.realpathSync(path.join(import.meta.dirname, ".."));
84
+ // cwd can throw (ENOENT) when the shell's directory was deleted — and this
85
+ // runs at module import, before any fatal handler is installed.
86
+ cwd = process.cwd();
87
+ dir = cwd;
88
+ }
89
+ catch {
90
+ return { kind: "global" };
91
+ }
92
+ for (;;) {
93
+ try {
94
+ const nmReal = fs.realpathSync(path.join(dir, "node_modules"));
95
+ if (packageRoot === nmReal || packageRoot.startsWith(nmReal + path.sep)) {
96
+ // Local install. Prefer the DECLARING root over this physical hoist
97
+ // root: in a hoisted workspace the declaring manifest sits at cwd
98
+ // (the member root) or an ancestor below `dir`. The version-stable
99
+ // package dir (used for runtime paths that must survive a pnpm store
100
+ // prune) is found by its own cwd-up scan — see findStablePackageDir.
101
+ return {
102
+ kind: "local",
103
+ projectRoot: findDeclaringRoot(cwd) ?? dir,
104
+ stablePackageDir: findStablePackageDir(cwd, packageRoot),
105
+ };
106
+ }
107
+ }
108
+ catch {
109
+ // no node_modules at this level — keep walking up
110
+ }
111
+ const parent = path.dirname(dir);
112
+ if (parent === dir)
113
+ break;
114
+ dir = parent;
115
+ }
116
+ // Yarn PnP local installs have no node_modules anywhere: the package runs
117
+ // from the project's .yarn dir (unplugged/cache). Falling through to
118
+ // "global" would make the agent-triggered update target a global install
119
+ // the user may not even have.
120
+ if (packageRoot.includes(`${path.sep}.yarn${path.sep}`)) {
121
+ const declRoot = findDeclaringRoot(cwd);
122
+ if (declRoot)
123
+ return { kind: "local", projectRoot: declRoot };
124
+ }
125
+ return { kind: "global" };
126
+ }
127
+ const classifiedInstall = classifyInstall();
128
+ // __dirname in ESM (compiled from TS) will be dist/. Bundle artifacts ship
129
+ // next to the compiled launcher; prefer the version-stable package dir when
130
+ // the classification found one (see classifyInstall).
131
+ const packageDir = classifiedInstall.stablePackageDir ?? path.join(import.meta.dirname, "..");
4
132
  export const BUNDLED_RUNTIME_PATHS = {
5
- bundlePath: path.join(import.meta.dirname, "tool-server.cjs"),
6
- simulatorServerDir: path.join(import.meta.dirname, "..", "bin"),
7
- nativeDevtoolsDir: path.join(import.meta.dirname, "..", "dylibs"),
133
+ bundlePath: path.join(packageDir, "dist", "tool-server.cjs"),
134
+ simulatorServerDir: path.join(packageDir, "bin"),
135
+ nativeDevtoolsDir: path.join(packageDir, "dylibs"),
136
+ version: readPackageVersion(),
137
+ installKind: classifiedInstall.kind,
138
+ installProjectRoot: classifiedInstall.projectRoot,
8
139
  };
9
140
  //# sourceMappingURL=bundled-paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bundled-paths.js","sourceRoot":"","sources":["../src/bundled-paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,qDAAqD;AACrD,uDAAuD;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACrD,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC;IAC7D,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC;IAC/D,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;CAClE,CAAC"}
1
+ {"version":3,"file":"bundled-paths.js","sourceRoot":"","sources":["../src/bundled-paths.ts"],"names":[],"mappings":"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"}