@swmansion/argent 0.5.1

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.
Files changed (63) hide show
  1. package/LICENSE +195 -0
  2. package/README.md +103 -0
  3. package/agents/argent-environment-inspector.md +106 -0
  4. package/agents/references/quality-control-checklist.md +45 -0
  5. package/bin/ax-service +0 -0
  6. package/bin/simulator-server +0 -0
  7. package/dist/Argent.tracetemplate +0 -0
  8. package/dist/auto-screenshot.d.ts +22 -0
  9. package/dist/auto-screenshot.js +79 -0
  10. package/dist/auto-screenshot.js.map +1 -0
  11. package/dist/cli/constants.d.ts +6 -0
  12. package/dist/cli/constants.js +12 -0
  13. package/dist/cli/constants.js.map +1 -0
  14. package/dist/cli/init.d.ts +2 -0
  15. package/dist/cli/init.js +466 -0
  16. package/dist/cli/init.js.map +1 -0
  17. package/dist/cli/mcp-configs.d.ts +38 -0
  18. package/dist/cli/mcp-configs.js +724 -0
  19. package/dist/cli/mcp-configs.js.map +1 -0
  20. package/dist/cli/uninstall.d.ts +13 -0
  21. package/dist/cli/uninstall.js +389 -0
  22. package/dist/cli/uninstall.js.map +1 -0
  23. package/dist/cli/update.d.ts +1 -0
  24. package/dist/cli/update.js +126 -0
  25. package/dist/cli/update.js.map +1 -0
  26. package/dist/cli/utils.d.ts +27 -0
  27. package/dist/cli/utils.js +158 -0
  28. package/dist/cli/utils.js.map +1 -0
  29. package/dist/cli.d.ts +13 -0
  30. package/dist/cli.js +80 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/content.d.ts +31 -0
  33. package/dist/content.js +59 -0
  34. package/dist/content.js.map +1 -0
  35. package/dist/launcher.d.ts +8 -0
  36. package/dist/launcher.js +183 -0
  37. package/dist/launcher.js.map +1 -0
  38. package/dist/mcp-server.d.ts +1 -0
  39. package/dist/mcp-server.js +228 -0
  40. package/dist/mcp-server.js.map +1 -0
  41. package/dist/tool-server.cjs +51288 -0
  42. package/dylibs/libArgentInjectionBootstrap.dylib +0 -0
  43. package/dylibs/libKeyboardPatch.dylib +0 -0
  44. package/dylibs/libNativeDevtoolsIos.dylib +0 -0
  45. package/package.json +53 -0
  46. package/rules/argent.md +121 -0
  47. package/scripts/postinstall.cjs +34 -0
  48. package/skills/argent-create-flow/SKILL.md +213 -0
  49. package/skills/argent-ios-profiler/SKILL.md +103 -0
  50. package/skills/argent-metro-debugger/SKILL.md +117 -0
  51. package/skills/argent-metro-debugger/references/failure-scenarios.md +10 -0
  52. package/skills/argent-metro-debugger/references/source-maps.md +27 -0
  53. package/skills/argent-react-native-app-workflow/SKILL.md +237 -0
  54. package/skills/argent-react-native-optimization/SKILL.md +64 -0
  55. package/skills/argent-react-native-optimization/references/fix-reference.md +14 -0
  56. package/skills/argent-react-native-optimization/references/lint-rules.md +55 -0
  57. package/skills/argent-react-native-optimization/references/semantic-checklist.md +34 -0
  58. package/skills/argent-react-native-profiler/SKILL.md +160 -0
  59. package/skills/argent-react-native-profiler/references/diagnostic-tools.md +94 -0
  60. package/skills/argent-simulator-interact/SKILL.md +272 -0
  61. package/skills/argent-simulator-interact/references/gesture-examples.md +114 -0
  62. package/skills/argent-simulator-setup/SKILL.md +19 -0
  63. package/skills/argent-test-ui-flow/SKILL.md +84 -0
@@ -0,0 +1,228 @@
1
+ import { appendFile, mkdir } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { ListToolsRequestSchema, CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";
6
+ import { Server } from "@modelcontextprotocol/sdk/server";
7
+ import { ensureToolsServer } from "./launcher.js";
8
+ import { toMcpContent, flowRunToMcpContent } from "./content.js";
9
+ import { autoScreenshotEnabled, getUdidFromArgs, shouldAutoScreenshot, getAutoScreenshotDelayMs, } from "./auto-screenshot.js";
10
+ export async function startMcpServer() {
11
+ let TOOLS_URL;
12
+ if (process.env.ARGENT_TOOLS_URL) {
13
+ TOOLS_URL = process.env.ARGENT_TOOLS_URL;
14
+ }
15
+ else {
16
+ try {
17
+ TOOLS_URL = await ensureToolsServer();
18
+ }
19
+ catch (err) {
20
+ process.stderr.write(`[argent] Failed to start tools server: ${err}\n`);
21
+ process.exit(1);
22
+ }
23
+ }
24
+ let reconnectPromise = null;
25
+ async function reconnect() {
26
+ if (process.env.ARGENT_TOOLS_URL)
27
+ return;
28
+ if (!reconnectPromise) {
29
+ reconnectPromise = ensureToolsServer()
30
+ .then((url) => {
31
+ TOOLS_URL = url;
32
+ })
33
+ .finally(() => {
34
+ reconnectPromise = null;
35
+ });
36
+ }
37
+ return reconnectPromise;
38
+ }
39
+ async function fetchWithReconnect(getUrl, init) {
40
+ const MAX_RETRIES = 4;
41
+ let lastError;
42
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
43
+ try {
44
+ return await fetch(getUrl(), init);
45
+ }
46
+ catch (err) {
47
+ lastError = err;
48
+ if (attempt === MAX_RETRIES)
49
+ break;
50
+ if (attempt === 0) {
51
+ // First failure: trigger reconnect (spawns new server if dead)
52
+ await reconnect();
53
+ }
54
+ // Exponential backoff: 250ms, 500ms, 1s, 2s (~3.75s total + reconnect time)
55
+ await new Promise((r) => setTimeout(r, 250 * Math.pow(2, attempt)));
56
+ }
57
+ }
58
+ throw lastError;
59
+ }
60
+ const LOG_FILE = process.env.ARGENT_MCP_LOG ?? `${homedir()}/.argent/mcp-calls.log`;
61
+ let logDirReady = false;
62
+ async function spyLog(entry) {
63
+ try {
64
+ if (!logDirReady) {
65
+ await mkdir(dirname(LOG_FILE), { recursive: true });
66
+ logDirReady = true;
67
+ }
68
+ await appendFile(LOG_FILE, JSON.stringify(entry) + "\n");
69
+ }
70
+ catch {
71
+ /* non-fatal */
72
+ }
73
+ }
74
+ async function fetchTools() {
75
+ const res = await fetchWithReconnect(() => `${TOOLS_URL}/tools`);
76
+ const json = (await res.json());
77
+ return json.tools;
78
+ }
79
+ async function callTool(name, args) {
80
+ const tools = await fetchTools();
81
+ const meta = tools.find((t) => t.name === name);
82
+ const res = await fetchWithReconnect(() => `${TOOLS_URL}/tools/${name}`, {
83
+ method: "POST",
84
+ headers: { "Content-Type": "application/json" },
85
+ body: JSON.stringify(args ?? {}),
86
+ });
87
+ const json = (await res.json());
88
+ if (!res.ok)
89
+ throw new Error(json.error ?? json.message ?? res.statusText);
90
+ return { result: json.data, outputHint: meta?.outputHint, note: json.note };
91
+ }
92
+ const server = new Server({ name: "argent", version: "0.1.0" }, {
93
+ capabilities: { tools: {} },
94
+ instructions: "Argent — iOS Simulator Control for interacting, testing, profiling and debugging mobile applications. " +
95
+ "Always use discovery tools (describe / debugger-component-tree / screenshot) before tapping — never guess coordinates. " +
96
+ "On session end: call stop-all-simulator-servers and perform any necessary cleanup. " +
97
+ "Full guidance is in the argent rule loaded from .claude/rules/argent.md.",
98
+ });
99
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
100
+ try {
101
+ const tools = await fetchTools();
102
+ await spyLog({
103
+ ts: new Date().toISOString(),
104
+ event: "list_tools",
105
+ count: tools.length,
106
+ });
107
+ return {
108
+ tools: tools.map((t) => ({
109
+ name: t.name,
110
+ description: t.description,
111
+ inputSchema: { type: "object", ...t.inputSchema },
112
+ })),
113
+ };
114
+ }
115
+ catch (err) {
116
+ process.stderr.write(`[argent] Failed to list tools: ${err instanceof Error ? err.message : err}\n`);
117
+ return { tools: [] };
118
+ }
119
+ });
120
+ server.setRequestHandler(CallToolRequestSchema, async ({ params }) => {
121
+ const t0 = Date.now();
122
+ await spyLog({
123
+ ts: new Date().toISOString(),
124
+ event: "tool_called",
125
+ name: params.name,
126
+ args: params.arguments,
127
+ });
128
+ try {
129
+ const { result, outputHint, note } = await callTool(params.name, params.arguments);
130
+ await spyLog({
131
+ ts: new Date().toISOString(),
132
+ event: "tool_result",
133
+ name: params.name,
134
+ durationMs: Date.now() - t0,
135
+ isError: false,
136
+ result,
137
+ });
138
+ let content = params.name === "flow-execute" &&
139
+ result &&
140
+ typeof result === "object" &&
141
+ "flow" in result &&
142
+ "steps" in result
143
+ ? await flowRunToMcpContent(result)
144
+ : await toMcpContent(result, outputHint);
145
+ const udid = getUdidFromArgs(params.arguments);
146
+ if (autoScreenshotEnabled() && udid && shouldAutoScreenshot(params.name)) {
147
+ const delayMs = getAutoScreenshotDelayMs(params.name);
148
+ if (delayMs > 0)
149
+ await new Promise((r) => setTimeout(r, delayMs));
150
+ try {
151
+ const screenshotResult = await callTool("screenshot", { udid });
152
+ const screenshotContent = await toMcpContent(screenshotResult.result, "image");
153
+ content = [
154
+ ...content,
155
+ {
156
+ type: "text",
157
+ text: "--- Screen after action ---",
158
+ },
159
+ ...screenshotContent,
160
+ ];
161
+ }
162
+ catch (ssErr) {
163
+ content = [
164
+ ...content,
165
+ {
166
+ type: "text",
167
+ text: `(Auto-screenshot skipped: ${ssErr instanceof Error ? ssErr.message : String(ssErr)})`,
168
+ },
169
+ ];
170
+ }
171
+ }
172
+ if (note) {
173
+ content = [{ type: "text", text: note }, ...content];
174
+ }
175
+ return { content };
176
+ }
177
+ catch (err) {
178
+ await spyLog({
179
+ ts: new Date().toISOString(),
180
+ event: "tool_result",
181
+ name: params.name,
182
+ durationMs: Date.now() - t0,
183
+ isError: true,
184
+ error: String(err instanceof Error ? err.message : err),
185
+ });
186
+ return {
187
+ isError: true,
188
+ content: [
189
+ {
190
+ type: "text",
191
+ text: String(err instanceof Error ? err.message : err),
192
+ },
193
+ ],
194
+ };
195
+ }
196
+ });
197
+ await server.connect(new StdioServerTransport());
198
+ // Proactive health monitoring — restart tool server if it dies between requests
199
+ if (!process.env.ARGENT_TOOLS_URL) {
200
+ const HEALTH_INTERVAL_MS = 30_000;
201
+ const healthInterval = setInterval(async () => {
202
+ try {
203
+ const controller = new AbortController();
204
+ const timer = setTimeout(() => controller.abort(), 3_000);
205
+ try {
206
+ const res = await fetch(`${TOOLS_URL}/tools`, { signal: controller.signal });
207
+ if (!res.ok)
208
+ throw new Error(`health check returned ${res.status}`);
209
+ }
210
+ finally {
211
+ clearTimeout(timer);
212
+ }
213
+ }
214
+ catch {
215
+ process.stderr.write("[argent] Health check failed — reconnecting tool server\n");
216
+ reconnect().catch(() => { });
217
+ }
218
+ }, HEALTH_INTERVAL_MS);
219
+ healthInterval.unref();
220
+ }
221
+ if (process.env.ARGENT_AUTO_SHUTDOWN === "1") {
222
+ process.stdin.on("close", () => {
223
+ fetch(`${TOOLS_URL}/shutdown`, { method: "POST" }).catch(() => { });
224
+ setTimeout(() => process.exit(0), 5_000);
225
+ });
226
+ }
227
+ }
228
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}