Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
161 commits
Select commit Hold shift + click to select a range
26c460c
feat(tool-server): add Android emulator support via unified simulator…
latekvo Apr 17, 2026
2093343
feat(mcp): expose Android emulator control in MCP server + README
latekvo Apr 17, 2026
6e0d64f
docs(skills): Android emulator skills + platform-aware argent rule
latekvo Apr 17, 2026
7e21ef3
refactor: unify list/boot lifecycle tools into list-devices + boot-de…
latekvo Apr 17, 2026
05a6194
refactor(descriptions): drop implementation-detail leaks from tool su…
latekvo Apr 17, 2026
c081fe2
docs(skills): point to list-devices / boot-device and strip impl-deta…
latekvo Apr 17, 2026
caed2c3
refactor: list-based classifyDevice replaces shape heuristic
latekvo Apr 17, 2026
bfa5982
fix(security): validate bundleId/activity/udid on the Android adb-she…
latekvo Apr 17, 2026
804d637
fix: harden uiautomator parser + describe dump-path race
latekvo Apr 17, 2026
65a2cf9
fix: boot-device + adb utility reliability (review #2, #3, #4, #9, #11)
latekvo Apr 17, 2026
47b1503
docs: tighten tool + skill descriptions for SpiderShield gate
latekvo Apr 17, 2026
dcb825d
test: add audit tests for feat/android-emulator-support
latekvo Apr 17, 2026
a59376e
fix: correctness bugs surfaced by review — parser, launcher, temp-file
latekvo Apr 17, 2026
9050ef9
fix(boot-device): terminate orphaned emulator + warm classify cache
latekvo Apr 17, 2026
f81af9d
docs: correct factual drift in tool / server descriptions
latekvo Apr 17, 2026
c3c669f
chore(release): bump to 0.6.0 for breaking tool rename
latekvo Apr 17, 2026
ab90417
test: flip audit-file assertions to match the post-fix state
latekvo Apr 17, 2026
25cb27d
Revert "chore(release): bump to 0.6.0 for breaking tool rename"
latekvo Apr 17, 2026
14a47a9
fix(blueprints): gate iOS-only services against Android targets
latekvo Apr 17, 2026
c46068d
docs+test: strip binary names from tool descriptions, race test via P…
latekvo Apr 17, 2026
a1afa8d
feat(tool-server): pretty error when required host binaries are missing
latekvo Apr 20, 2026
1beb1ca
refactor: rename ios-profiler-* tools to native-profiler-*
latekvo Apr 20, 2026
0d7ad3d
fix: prime dep cache in describe-tool tests, apply prettier
latekvo Apr 20, 2026
b59fc0a
fix: audit follow-ups — stale docs, legacy trace compat, deep cause-c…
latekvo Apr 20, 2026
9c60035
revert: drop ios-profiler-*.xml fallback from profiler-load
latekvo Apr 20, 2026
ead802e
Merge branch 'main' into feat/android-emulator-support
latekvo Apr 21, 2026
5457e05
chore: Simplify MCP server instructions
latekvo Apr 21, 2026
f976e71
Merge branch 'feat/android-emulator-support' of https://github.com/so…
latekvo Apr 21, 2026
743b4be
remove audit test
latekvo Apr 21, 2026
34bda72
test: drop dead / tautological tests
latekvo Apr 21, 2026
e30c59f
revert: restore main tool-description prose for interaction tools
latekvo Apr 21, 2026
cf6279c
revert: restore main argent.md structure, keep only Android-necessary…
latekvo Apr 21, 2026
1c0e83e
revert: drop SpiderShield-grader prose from new-tool descriptions
latekvo Apr 21, 2026
50768bb
docs(skills): drop tool tables from new Android + native-profiler skills
latekvo Apr 21, 2026
e5c1e4f
refactor(adb): const-ify emulator binary name, un-export internal helper
latekvo Apr 21, 2026
17e5525
style: apply prettier formatting
latekvo Apr 21, 2026
4c58f09
docs(argent.md): collapse iOS+Android interact entries into one
latekvo Apr 21, 2026
45153f1
docs: drop stale "replaces react-profiler-cpu-summary" note
latekvo Apr 21, 2026
4c48223
feat(boot-device): hot-boot path with probed snapshot + cold fallback
latekvo Apr 21, 2026
ce5dfdf
docs(debugger,profiler): platform-neutral device_id descriptions
latekvo Apr 22, 2026
3324e3c
Merge branch 'main' into feat/android-emulator-support
latekvo Apr 24, 2026
173b3d1
Merge branch 'main' into feat/android-emulator-support
latekvo Apr 24, 2026
517cbb1
Merge remote-tracking branch 'origin/main' into feat/android-emulator…
latekvo Apr 28, 2026
96eb826
fix(preview): route /preview/simulators through unified list-devices
latekvo Apr 28, 2026
a54576e
refactor: drop android-only tools without iOS counterparts
latekvo Apr 28, 2026
1110b24
Merge origin/main: adopt per-tool dirs + dispatchByPlatform from #164
latekvo Apr 28, 2026
ec64c6c
chore: post-merge cleanup — drop platform-detect.ts and stub-era boil…
latekvo Apr 28, 2026
778ad45
remove old binaries
latekvo Apr 28, 2026
975d88f
chore: bring all changed tools onto PR #164's conventions
latekvo Apr 28, 2026
92e257f
chore: route platform checks through resolveDevice
latekvo Apr 28, 2026
d5945a4
refactor(tools): drop platforms/ split for tools with no per-platform…
latekvo Apr 28, 2026
dd53978
sync readme changes with main
latekvo Apr 29, 2026
d40efac
remove android only install flags
latekvo Apr 29, 2026
a1d17ca
refactor(tools): move shared types into platforms/shared.ts
latekvo Apr 29, 2026
46ddfef
refactor(tools): rename platforms/shared.ts → types.ts at tool root
latekvo Apr 29, 2026
5254ca2
refactor(tools): route every platform decision through dispatchByPlat…
latekvo Apr 29, 2026
2ee784a
revert last commit
latekvo Apr 29, 2026
2a5989f
prettier
latekvo Apr 30, 2026
5e5f205
Merge remote-tracking branch 'origin/main' into feat/android-emulator…
latekvo Apr 30, 2026
946f351
remove unnecessary skill
latekvo Apr 30, 2026
1fb2e41
Revert "remove unnecessary skill"
latekvo Apr 30, 2026
a960add
Merge branch 'main' into feat/android-emulator-support
latekvo Apr 30, 2026
aacceac
make skills cross-platform
latekvo Apr 30, 2026
586986e
update skill references
latekvo Apr 30, 2026
12102cc
single source of truth
latekvo Apr 30, 2026
91d0792
Merge branch 'feat/android-emulator-support' of https://github.com/so…
latekvo Apr 30, 2026
8f666b4
cleanup comments
latekvo May 4, 2026
5815d16
remove redundant zod additions
latekvo May 4, 2026
8a508d1
cleanup
latekvo May 4, 2026
816c9a7
single source of truth
latekvo May 4, 2026
81b8253
tests on SSOT
latekvo May 4, 2026
3e01189
prettier
latekvo May 4, 2026
c31e4e0
fix tests
latekvo May 4, 2026
ab74d30
remove android-only id refs
latekvo May 4, 2026
da4a644
prettier
latekvo May 4, 2026
a2d4840
fix test
latekvo May 4, 2026
61432ab
rename and document ios_has_podfile
latekvo May 4, 2026
bc65399
post-review fix: reject empty udid on open-url, reinstall-app, describe
latekvo May 4, 2026
a73205b
post-review fix: forbid leading dash in bundleId/activity regex
latekvo May 4, 2026
73c415b
post-review fix: prefix skill references with 'argent-'
latekvo May 4, 2026
7a6130d
post-review fix: prefix skill reference in rules/argent.md
latekvo May 4, 2026
fc5ed6f
post-review fix: prefix skill references in optimization SKILL.md
latekvo May 4, 2026
60801f2
post-review fix: drop nonexistent grantPermissions skill references
latekvo May 4, 2026
63a5738
post-review fix: setup skill claims cold-boot default — actually hot
latekvo May 4, 2026
6067c16
post-review fix: mark paste as iOS-only in skills
latekvo May 4, 2026
494145e
post-review fix: cancel waitForEarlyExit timer + race stage 5
latekvo May 4, 2026
e0f2c07
post-review fix: treat empty screencap output as failure, not success
latekvo May 4, 2026
8f79a82
post-review fix: surface adb stderr + use SIGKILL on runAdb timeout
latekvo May 4, 2026
ff27988
post-review fix: parseAdbDevices rejects daemon banner + unknown states
latekvo May 4, 2026
0a6d15c
post-review fix: declare iOS-only capability on native-devtools/profi…
latekvo May 4, 2026
56e8004
post-review fix: stop-*-simulator-server is cross-platform
latekvo May 4, 2026
8885fe2
post-review fix: parser tolerates raw '>' + stray closing tags
latekvo May 4, 2026
69973a3
post-review fix: clip off-screen uiautomator bounds to the screen rect
latekvo May 4, 2026
1c9533a
post-review fix: preserve siblings under a bounds-less wrapper
latekvo May 4, 2026
a20dca3
post-review fix: restart-app Android uses am start -W like launch-app
latekvo May 4, 2026
778214f
post-review fix: regex must exclude '/' so self-closing tags still parse
latekvo May 4, 2026
05712ca
post-review fix: drop android-screen size cache to fix rotation stale…
latekvo May 4, 2026
ca7d6a9
post-review fix: describe Android reports source: 'uiautomator'
latekvo May 4, 2026
0c8dde4
post-review fix: launch-app treats bare activity name as relative
latekvo May 4, 2026
132fce7
post-review fix: HTTP capability gate also reads parsedData.device_id
latekvo May 4, 2026
c2f23cb
post-review fix: open-url Android matches more failure shapes
latekvo May 4, 2026
8d3550c
post-review fix: argent run --help references the renamed tool
latekvo May 4, 2026
91ede5f
post-review fix: generalize cross-platform tool descriptions
latekvo May 4, 2026
54e180c
post-review fix: react-profiler-status device_id description matches …
latekvo May 4, 2026
d52df0e
post-review fix: waitForBootCompleted fails fast on terminal device s…
latekvo May 4, 2026
45a7ff5
post-review fix: bound listAndroidDevices enrichment getprops at 5s
latekvo May 4, 2026
070981d
post-review fix: coalesce concurrent boots for the same AVD
latekvo May 4, 2026
cded985
post-review fix: include Android emulators in /preview/simulators
latekvo May 4, 2026
ca8caf5
post-review fix: gate adb at simulator-server blueprint factory for A…
latekvo May 4, 2026
e705e26
post-review fix: reinstall-app Android uninstalls first for parity wi…
latekvo May 4, 2026
bec8fd9
post-review fix: restart-app forwards optional Android activity
latekvo May 4, 2026
49e4bca
post-review fix: split per-platform Services generic in dispatchByPla…
latekvo May 4, 2026
aff4c53
post-review fix: restore .min(1) on run-sequence steps array
latekvo May 4, 2026
9abb6cf
post-review fix: alwaysLoad + searchHint on list-devices and boot-device
latekvo May 4, 2026
073c219
post-review fix: wrap iOS xcrun errors with verb prefix for parity
latekvo May 4, 2026
4a6e2fb
post-review fix: cover ax-service blueprint Android-rejection gate
latekvo May 4, 2026
75f2188
post-review fix: agent docs recognize Kotlin Gradle DSL
latekvo May 4, 2026
fa7a4af
post-review fix: skill docs catch up with cross-platform stop/describe
latekvo May 4, 2026
6566dda
prettier
latekvo May 4, 2026
fdc3e6d
fix(test): prime adb in simulator-server blueprint test
latekvo May 4, 2026
1b9de3f
Merge remote-tracking branch 'origin/main' into feat/android-emulator…
latekvo May 4, 2026
b135b5e
Revert "post-review fix: wrap iOS xcrun errors with verb prefix for p…
latekvo May 4, 2026
ede2476
rename ios skill to match android
latekvo May 4, 2026
e34cdf0
cleanup argent md
latekvo May 4, 2026
5a5731c
rename refs in tests
latekvo May 4, 2026
02cef6d
cleanup env inspector skill
latekvo May 4, 2026
074e669
cleanup native profiler skill
latekvo May 4, 2026
19d2b38
fix(docs): correct Codex and Windsurf config paths in README editors …
latekvo May 4, 2026
474d240
fix(adb): match terminal errors that include a quoted serial
latekvo May 4, 2026
93f588d
fix(boot-device): handle child spawn errors so tool-server doesn't crash
latekvo May 4, 2026
c239597
fix(stop-metro): only SIGTERM the LISTEN process, not connected clients
latekvo May 4, 2026
4e5e874
fix(native-target-app): tolerate per-app getAppState failures via all…
latekvo May 4, 2026
20f6802
fix(network-interceptor): stringify URLSearchParams and tag binary bo…
latekvo May 4, 2026
eeb69ea
fix(update-argent): clear the in-progress lock when the spawned updat…
latekvo May 4, 2026
c20b4a5
fix(native-find-views): require at least one filter at runtime, match…
latekvo May 4, 2026
cb4ebfe
fix(ios-profiler-analyze): report missing trace files instead of retu…
latekvo May 4, 2026
38e44f4
fix(describe): declare xcrun dep so missing Xcode returns 424 with in…
latekvo May 4, 2026
fc4999b
fix(debugger): selectTarget throws on empty deviceId filter instead o…
latekvo May 4, 2026
90f5a2b
fix(idle-timer): block onIdle while a tool call is in flight
latekvo May 4, 2026
a953bf9
fix(blueprints): reject undefined device.id before spawning helper
latekvo May 4, 2026
531f74b
revert: drop fixes that are out of scope for the Android branch
latekvo May 4, 2026
205b8c8
refactor(boot-device): drop coldBoot input; auto-detection covers eve…
latekvo May 4, 2026
89d8200
boot-device: guard fast-path against wedged framebuffers; drop noWind…
latekvo May 4, 2026
abb5510
chore(tests): move additive tests to stacked PR
latekvo May 4, 2026
a3ad857
isolate HID keymaps
latekvo May 4, 2026
66ec1e8
make RN checklist platform agnostic
latekvo May 4, 2026
eace957
reset package-lock to main
latekvo May 4, 2026
7eca4be
simplify simulator-server.ts
latekvo May 4, 2026
95328f8
Merge remote-tracking branch 'origin/main' into feat/android-emulator…
latekvo May 5, 2026
4f8bd4b
fix(android-describe): promote clickable layouts to Button and hoist …
latekvo May 5, 2026
4185bbb
fix(describe): return a pretty-printed text tree, drop layout-noise c…
latekvo May 5, 2026
66ef490
revert(describe): drop text formatting + tree filter, keep DescribeNo…
latekvo May 5, 2026
27c0f90
fix(android): resolve adb/emulator via $ANDROID_HOME, not just $PATH
latekvo May 5, 2026
0128919
fix(android-describe): visibility-aware trim, --compressed dump, inte…
latekvo May 5, 2026
c96a15a
prettier
latekvo May 5, 2026
bef5e82
fix(qa): scrub stale references to removed/renamed files
latekvo May 5, 2026
c6125e5
refactor describe structure
latekvo May 6, 2026
1d7418c
fix imports in tests
latekvo May 6, 2026
46b65e3
fix(tool-server): correct test imports for relocated iOS describe ada…
latekvo May 6, 2026
fcab689
fix(adb): surface signal/killed/code when adb child writes no output
latekvo May 7, 2026
27b1e3b
Merge remote-tracking branch 'origin/main' into feat/android-emulator…
latekvo May 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@
</p>
<br/>

**[Argent](https://argent.swmansion.com)** is an **agentic toolkit** that gives your AI assistant direct access to iOS Simulators. Ask it to tap a button, run a profiler or reproduce an issue manually - all from within your CLI, without switching context.
**[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.

```bash
npx @swmansion/argent init
```

## Capabilities

- **Autonomous iOS development** - Allow your agent to work with iOS 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.
- **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.
- **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.
- **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.
- **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.
Expand All @@ -33,8 +33,9 @@ npx @swmansion/argent init

#### Prerequisites

- macOS with **Xcode** installed
- **Node.js 18** or later
- For iOS: macOS with **Xcode** installed
- 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`.

#### Run `init` in your project

Expand Down
2 changes: 1 addition & 1 deletion packages/argent-cli/src/run.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ Invoke a tool exposed by the argent tool-server. Run \`argent tools\` to list
available tools, or \`argent tools describe <name>\` to see one tool's flags.

Examples:
argent run list-simulators
argent run list-devices
argent run gesture-tap --udid <UDID> --x 0.5 --y 0.5
argent run screenshot --udid <UDID> --out ./screen.png
argent run run-sequence --udid <UDID> --steps-json '[{"tool":"button","args":{"button":"home"}}]'
Expand Down
2 changes: 1 addition & 1 deletion packages/argent-installer/test/skills.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ describe("refreshArgentSkills", () => {
});

it("resyncs a tracked project scope when the lock has an argent skill", () => {
listBundledSkillsMock.mockReturnValue(["argent-create-flow", "argent-simulator-setup"]);
listBundledSkillsMock.mockReturnValue(["argent-create-flow", "argent-ios-simulator-setup"]);
writeLock(path.join(tmpDir, "skills-lock.json"), {
"argent-create-flow": {},
});
Expand Down
28 changes: 0 additions & 28 deletions packages/argent-installer/test/update.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import {
detectPackageManager,
globalInstallCommand,
formatShellCommand,
isTempRunnerPath,
} from "../src/utils.js";
import { PACKAGE_NAME, NPM_REGISTRY } from "../src/constants.js";

Expand Down Expand Up @@ -68,33 +67,6 @@ describe("update — constants are correct", () => {
});
});

describe("update — temp runner detection", () => {
// npx-cached argent shares the latest version, so without this filter the
// version compare would falsely match latest after the user uninstalled the
// global package via `npx @swmansion/argent uninstall`.
it("flags npx cache paths as transient", () => {
expect(isTempRunnerPath("/Users/me/.npm/_npx/abc123/node_modules/.bin/argent")).toBe(true);
});

it("flags pnpm dlx cache paths as transient", () => {
expect(isTempRunnerPath("/Users/me/.pnpm-store/dlx-1234/node_modules/.bin/argent")).toBe(true);
});

it("flags bun install cache paths as transient", () => {
expect(isTempRunnerPath("/Users/me/.bun/install/cache/argent")).toBe(true);
});

it("flags Windows dlx cache paths as transient", () => {
expect(isTempRunnerPath("C:\\Users\\me\\AppData\\Local\\dlx-abc\\argent.cmd")).toBe(true);
});

it("treats real global install paths as permanent", () => {
expect(isTempRunnerPath("/usr/local/bin/argent")).toBe(false);
expect(isTempRunnerPath("/opt/homebrew/bin/argent")).toBe(false);
expect(isTempRunnerPath("C:\\Users\\me\\AppData\\Roaming\\npm\\argent.cmd")).toBe(false);
});
});

describe("update — registry safety", () => {
it("globalInstallCommand never includes --registry (relies on .npmrc scoped registry)", () => {
for (const pm of ["npm", "yarn", "pnpm", "bun"] as const) {
Expand Down
2 changes: 1 addition & 1 deletion packages/argent-mcp/src/mcp-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ export async function startMcpServer(options: StartMcpServerOptions): Promise<vo
{
capabilities: { tools: {} },
instructions:
"Argent — iOS Simulator Control for interacting, testing, profiling and debugging mobile applications. " +
"Argent — iOS Simulator and Android Emulator control for interacting, testing, profiling and debugging mobile applications. " +
"Always use discovery tools (describe / debugger-component-tree / screenshot) before tapping — never guess coordinates. " +
"On session end: call stop-all-simulator-servers and perform any necessary cleanup. " +
"Full guidance is in the argent rule loaded from .claude/rules/argent.md.",
Expand Down
4 changes: 2 additions & 2 deletions packages/argent-mcp/test/auto-screenshot.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ describe("shouldAutoScreenshot", () => {
});

it("returns false for excluded tools", () => {
expect(shouldAutoScreenshot("list-simulators")).toBe(false);
expect(shouldAutoScreenshot("boot-simulator")).toBe(false);
expect(shouldAutoScreenshot("list-devices")).toBe(false);
expect(shouldAutoScreenshot("boot-device")).toBe(false);
expect(shouldAutoScreenshot("simulator-server")).toBe(false);
expect(shouldAutoScreenshot("activate-sso")).toBe(false);
});
Expand Down
2 changes: 1 addition & 1 deletion packages/argent/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@swmansion/argent",
"version": "0.6.1",
"description": "MCP server for iOS Simulator control",
"description": "MCP server for iOS Simulator and Android Emulator control",
"license": "Apache-2.0",
"repository": {
"type": "git",
Expand Down
2 changes: 1 addition & 1 deletion packages/argent/scripts/bundle-tools.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ if (fs.existsSync(UI_SRC)) {
console.warn(`⚠ Preview UI not found at ${UI_SRC} — skipping copy`);
}

// Copy Argent.tracetemplate so ios-profiler-start can find it at runtime.
// Copy Argent.tracetemplate so native-profiler-start can find it at runtime.
const TRACE_TEMPLATE_SRC = path.resolve(
WORKSPACE_ROOT,
"packages/tool-server/src/utils/ios-profiler/Argent.tracetemplate"
Expand Down
2 changes: 1 addition & 1 deletion packages/registry/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ export interface ToolCapability {
* On a missing binary, the HTTP layer returns 424 Failed Dependency with an
* install hint the agent can surface verbatim.
*/
export type ToolDependency = "adb" | "xcrun";
export type ToolDependency = "adb" | "xcrun" | "emulator";

// ── Tool Types ──

Expand Down
6 changes: 4 additions & 2 deletions packages/skills/agents/argent-environment-inspector.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ but required by the main agent, fill it in by manual inspection of the project.
- `expo` in dependencies or `app.json` with `expo` key → Expo project
- `pubspec.yaml` present → Flutter project
- `ios/*.xcodeproj` or `ios/*.xcworkspace` without `react-native` → native iOS
- `android/build.gradle` without `react-native` → native Android
- `android/build.gradle` or `android/build.gradle.kts` without `react-native` → native Android
- None of the above → classify based on what you find (web app, library, etc.)

3. **Explore beyond the snapshot.** Use Read, Glob, Grep, and Bash to fill
Expand All @@ -64,7 +64,7 @@ but required by the main agent, fill it in by manual inspection of the project.
flows (`.maestro/`).
- For Flutter: `pubspec.yaml`, `analysis_options.yaml`, `lib/` structure.
- For native iOS: Xcode project/workspace, schemes, `Podfile`, `Package.swift`.
- For native Android: `build.gradle`, `settings.gradle`, flavor configs.
- For native Android: `build.gradle` / `build.gradle.kts`, `settings.gradle` / `settings.gradle.kts`, flavor configs.

4. **Populate every field** in the output schema below. Use `null` for
genuinely unknown values or fields that do not apply to this project type.
Expand All @@ -89,6 +89,8 @@ Return a JSON object with these top-level fields:
| `startup_commands` | array | `[{ command, context }]` — concrete dev server start commands |
| `build_commands` | array | `[{ command, platform, context }]` — build commands per platform |
| `argent_workflow` | object | `{ start_dev_server, build_ios, build_android, notes }` — exact commands for Argent |
| `ios_has_podfile` | bool | True when `ios/Podfile` exists |
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

This arg reference was missing. Added ios_has_podfile despite it being out of scope because i didn't want to add android_has_gradle when there appeared to be no ios equivalent.

| `android_has_gradle` | bool | True when `android/gradlew` exists |
| `configs` | object | Paths to metro, babel, app, tsconfig, pubspec, xcode, gradle configs (`null` if absent) |
| `metro_port` | number\|null | From config or default 8081; `null` for non-RN |
| `env_resolution` | object | `{ env_files, strategy, notes }` |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,5 @@ Look for these beyond the obvious lint/test configs, regardless of project type:
- `lint-staged` config — what runs on commit
- CI config files — the CI steps are ground truth for what "passing" means
- `Podfile` / `Package.swift` — iOS dependency management
- `build.gradle` / `settings.gradle` — Android build config and flavor definitions
- `build.gradle` / `build.gradle.kts` / `settings.gradle` / `settings.gradle.kts` — Android build config and flavor definitions (Groovy or Kotlin DSL)
- `pubspec.yaml` / `analysis_options.yaml` — Flutter project config and lint rules
2 changes: 1 addition & 1 deletion packages/skills/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "@argent/skills",
"version": "0.6.1",
"type": "module",
"description": "Claude Code skills for iOS simulator interaction via argent",
"description": "Claude Code skills for iOS simulator and Android emulator interaction via argent",
"scripts": {
"install-skills": "node scripts/install.js"
},
Expand Down
46 changes: 25 additions & 21 deletions packages/skills/rules/argent.md
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
---
description: Argent iOS Simulator Agent — always-on guidance for methodology and tools for working with, interacting, testing and profiling mobile app work
description: Argent iOS Simulator and Android Emulator Agent — always-on guidance for methodology and tools for working with, interacting, testing and profiling mobile app work
alwaysApply: true
---

<description>
Argent MCP tools are available in this project for iOS simulator control. Argent MCP tools are the preferred form of interaction with the application.
Argent MCP tools are available in this project for iOS simulator and Android emulator control. Argent MCP tools are the preferred form of interaction with the application.
Running MCP server and managing the Argent toolkit utilises `argent` command - if asked use `argent --help` for reference.
To check current version of MCP server run `argent --version` command.

Use cases:

- User mentions iOS simulator, device, or app interaction
- The app user is working with is a mobile application which can be run in the simulator
- User mentions iOS simulator, Android emulator, device, or app interaction
- The app user is working with is a mobile application which can be run in a simulator/emulator
- Any tapping, swiping, typing, screenshotting, or inspecting a running app
- Running, debugging, or testing a React Native app
- Profiling performance or diagnosing re-renders in a React Native app
- Running, debugging, or testing a React Native app (iOS or Android)
- Profiling performance or diagnosing re-renders in a React Native app (iOS or Android)
</description>

<tapping_rule>
<important>**Never** derive tap coordinates from a screenshot</important>
Before **every** tap, you MUST call a discovery tool and extract coordinates from the result. This is not optional. Preferred tools are, in order:

- `describe` - native app-level components and safely targetable foreground apps.
- `native-describe-screen` - accessibility screen description via injected native devtools
- `describe` - native app-level components and safely targetable foreground apps (iOS and Android).
- `native-describe-screen` - accessibility screen description via injected native devtools (iOS only)
- `debugger-component-tree` - react-native specific components

`native-user-interactable-view-at-point` / `native-view-at-point` are follow-up diagnostics once you already have a candidate point.
`native-user-interactable-view-at-point` / `native-view-at-point` are follow-up diagnostics once you already have a candidate point (iOS only).

Whenever something changed YOU MUST first call `describe`, or another appropriate discovery tool so you do not hallucinate element positions. Do not guess coordinates if you can use discovery tool. Do not tap if you have not called a discovery tool in the current step. Screenshots alone are never sufficient for coordinates.

If a **tap fails twice** at the same coordinates, **stop retrying**. Re-run the discovery tool.

If `describe` fails, **read the exact error before reacting**, follow the recovery guidance in `argent-simulator-interact` to choose the correct next action.
If `describe` fails, **read the exact error before reacting**, follow the recovery guidance in `argent-device-interact` to choose the correct next action.

Before starting to interact with the app, read the `argent-simulator-interact` skill first.
Before starting to interact with the app, read the `argent-device-interact` skill first.
</tapping_rule>

<skill_reading_rule>
Expand All @@ -42,13 +42,13 @@ Before starting to interact with the app, read the `argent-simulator-interact` s

<general_rules>

- All simulator interactions go through argent MCP tools — never use `xcrun simctl`,
- All simulator/emulator interactions go through argent MCP tools — never use `xcrun simctl`,
raw `curl` to simulator ports, or the simulator-server binary directly.
- Before calling any gesture tool for the first time, use ToolSearch to load its schema.
- Interaction tools (`gesture-tap`, `gesture-swipe`, `gesture-pinch`, `gesture-rotate`, `gesture-custom`, `launch-app`, etc.) return a screenshot automatically.
Call `screenshot` separately only for a baseline before any action or after a delay.
- Always open apps with `launch-app` or `open-url` — never tap home screen icons.
- Always use `run-sequence` when performing multiple sequential simulator actions where you don't need to observe the screen between steps. More in `argent-simulator-interact` skill.
- Always use `run-sequence` when performing multiple sequential simulator actions where you don't need to observe the screen between steps. More in `argent-device-interact` skill.
- When the session ends or the user says they are done: call `stop-all-simulator-servers`.
If the user started Metro separately, ask whether to call `stop-metro` (specify the port if not 8081).
- If tools provided by mcp-server are not sufficient and action can be done using `xcrun` or other commands, use the command. Examples: changing simulator options, performing simulator action such as lock, shake, etc.
Expand All @@ -69,17 +69,21 @@ When `is_react_native` is true: load `argent-react-native-app-workflow` skill. U
Load the matching skill before starting work and executing tools from argent-mcp — skills contain the full step-by-step
procedure and edge-case handling for each workflow.

SIMULATOR SETUP
Skill: `argent-simulator-setup`
When: Beginning a task that involves the simulator, no simulator booted yet, need UDID or simulator-server.
iOS SIMULATOR SETUP
Skill: `argent-ios-simulator-setup`
When: Beginning a task that involves the iOS simulator, no simulator booted yet, need UDID or simulator-server.

ANDROID EMULATOR SETUP
Skill: `argent-android-emulator-setup`
When: Beginning a task that involves the Android emulator, no emulator running yet, need an adb serial, or about to install an APK.

TAPPING, SWIPING, TYPING, GESTURES, SCREENSHOTS, SCROLLING
Skill: `argent-simulator-interact`
Skill: `argent-device-interact`
When: Performing touch interactions, typing, pressing hardware buttons, launching/restarting apps, opening URLs, rotating device, or taking standalone screenshots.

RUNNING / BUILDING / DEBUGGING REACT NATIVE APP
Skill: `argent-react-native-app-workflow`
When: Project is react-native, starting Metro or running iOS app, build failures, pod issues, lost Metro connection, reading logs, reloading JS bundle, reinstalling app.
When: Project is react-native, starting Metro or running the iOS or Android app, build failures, pod issues, lost Metro connection, reading logs, reloading JS bundle, reinstalling app.

JS EVALUATION, METRO CONNECTION, REACT NATIVE
Skill: `argent-metro-debugger`
Expand All @@ -89,9 +93,9 @@ REACT APP & COMPONENT PROFILING
Use skill: `argent-react-native-profiler`
When: To measure performance of specific components, to find app-wide bottlenecks. Investigating re-renders or CPU hotspots, producing ranked performance reports.

NATIVE iOS PROFILING
Use skill: `argent-ios-profiler`
When: Profiling native iOS performance (CPU hotspots, UI hangs, memory leaks via Instruments). Useful as a reference for iOS-specific investigation when running dual profiling via `argent-react-native-profiler`.
NATIVE PROFILING
Use skill: `argent-native-profiler`
When: Profiling native performance (CPU hotspots, UI hangs, memory leaks). iOS only today; Android on the roadmap. Useful as a reference for platform-specific investigation when running dual profiling via `argent-react-native-profiler`.

PERFORMANCE OPTIMIZATION
Use skill: `argent-react-native-optimization`
Expand Down
Loading
Loading