@rolepod/uiproof 0.4.0 → 0.4.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rolepod-uiproof",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Multi-platform UI/mobile automation for AI agents — 4 shipped skills (verify-ui, audit-a11y, visual-diff, scaffold-e2e) + MCP server with 15 tools. v0.3 adds AppiumEngine scaffolding for iOS/Android, scope={ref} audit, replay CLI, ddmin minimization, doctor + install:mobile.",
5
5
  "author": {
6
6
  "name": "nuttaruj",
@@ -19,7 +19,7 @@
19
19
  "mcpServers": {
20
20
  "rolepod-uiproof": {
21
21
  "command": "npx",
22
- "args": ["-y", "@rolepod/uiproof"],
22
+ "args": ["-y", "rolepod-uiproof"],
23
23
  "env": {}
24
24
  }
25
25
  }
@@ -21,13 +21,7 @@
21
21
  "visual-regression"
22
22
  ],
23
23
  "skills": "./skills/",
24
- "mcp_servers": {
25
- "rolepod-uiproof": {
26
- "command": "npx",
27
- "args": ["-y", "@rolepod/uiproof"],
28
- "env": {}
29
- }
30
- },
24
+ "mcpServers": "./.mcp.json",
31
25
  "interface": {
32
26
  "displayName": "Rolepod UIProof",
33
27
  "shortDescription": "UI verification, a11y audits, visual diff, e2e scaffolding — for AI coding agents.",
package/.cursor/mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "rolepod-uiproof": {
4
4
  "command": "npx",
5
- "args": ["-y", "@rolepod/uiproof"],
5
+ "args": ["-y", "rolepod-uiproof"],
6
6
  "env": {}
7
7
  }
8
8
  }
package/CHANGELOG.md CHANGED
@@ -7,6 +7,28 @@ release.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.1] — 2026-05-27
11
+
12
+ ### Fixed
13
+
14
+ - **MCP server failed to start via `npx -y @rolepod/uiproof`** — npx
15
+ resolves a scoped package's default executable by the *short* name
16
+ (`uiproof`, after the `/`), but our `bin` field only defined
17
+ `rolepod-uiproof`. The mismatch caused `sh: rolepod-uiproof: command
18
+ not found` and an MCP `-32000` reconnect error in Claude Code,
19
+ Cursor, etc. All `mcpServers` entries (`.mcp.json`, `.cursor/mcp.json`,
20
+ `.claude-plugin/plugin.json`, `plugins/rolepod-uiproof/.mcp.json`)
21
+ now invoke `npx -y rolepod-uiproof`, which npx resolves directly by
22
+ bin name from the registry.
23
+
24
+ ### Added
25
+
26
+ - Tool `title` and `annotations` (`readOnlyHint` / `destructiveHint` /
27
+ `idempotentHint` / `openWorldHint`) on all 15 tools, per the MCP
28
+ 2025-11-25 spec. Clients use these hints to render friendlier names
29
+ in the picker and to auto-approve read-only calls vs. prompting
30
+ harder on destructive ones.
31
+
10
32
  ## [0.4.0] — 2026-05-24
11
33
 
12
34
  **Breaking: project renamed `rolepod-mcp` → `rolepod-uiproof`.**
package/README.md CHANGED
@@ -92,7 +92,7 @@ Use this when your tool reads a standard `mcpServers` config (most non-CLI MCP c
92
92
  "mcpServers": {
93
93
  "rolepod-uiproof": {
94
94
  "command": "npx",
95
- "args": ["-y", "@rolepod/uiproof"]
95
+ "args": ["-y", "rolepod-uiproof"]
96
96
  }
97
97
  }
98
98
  }
@@ -2398,9 +2398,158 @@ var visualDiffTool = {
2398
2398
  }
2399
2399
  };
2400
2400
 
2401
+ // src/tools/metadata.ts
2402
+ var toolMetadata = {
2403
+ // ---------- atomic ----------
2404
+ [ToolNames.browserOpen]: {
2405
+ title: "Open Browser/Mobile Session",
2406
+ annotations: {
2407
+ title: "Open Browser/Mobile Session",
2408
+ readOnlyHint: false,
2409
+ destructiveHint: true,
2410
+ idempotentHint: false,
2411
+ openWorldHint: true
2412
+ }
2413
+ },
2414
+ [ToolNames.browserClose]: {
2415
+ title: "Close Session",
2416
+ annotations: {
2417
+ title: "Close Session",
2418
+ readOnlyHint: false,
2419
+ destructiveHint: true,
2420
+ idempotentHint: true,
2421
+ openWorldHint: false
2422
+ }
2423
+ },
2424
+ [ToolNames.browserSnapshot]: {
2425
+ title: "Capture Accessibility Snapshot",
2426
+ annotations: {
2427
+ title: "Capture Accessibility Snapshot",
2428
+ readOnlyHint: true,
2429
+ openWorldHint: true
2430
+ }
2431
+ },
2432
+ [ToolNames.browserClick]: {
2433
+ title: "Click Element",
2434
+ annotations: {
2435
+ title: "Click Element",
2436
+ readOnlyHint: false,
2437
+ destructiveHint: true,
2438
+ idempotentHint: false,
2439
+ openWorldHint: true
2440
+ }
2441
+ },
2442
+ [ToolNames.browserType]: {
2443
+ title: "Type Text",
2444
+ annotations: {
2445
+ title: "Type Text",
2446
+ readOnlyHint: false,
2447
+ destructiveHint: true,
2448
+ idempotentHint: false,
2449
+ openWorldHint: true
2450
+ }
2451
+ },
2452
+ [ToolNames.browserKey]: {
2453
+ title: "Press Key",
2454
+ annotations: {
2455
+ title: "Press Key",
2456
+ readOnlyHint: false,
2457
+ destructiveHint: true,
2458
+ idempotentHint: false,
2459
+ openWorldHint: true
2460
+ }
2461
+ },
2462
+ [ToolNames.browserScroll]: {
2463
+ title: "Scroll Viewport",
2464
+ annotations: {
2465
+ title: "Scroll Viewport",
2466
+ readOnlyHint: false,
2467
+ destructiveHint: false,
2468
+ idempotentHint: true,
2469
+ openWorldHint: true
2470
+ }
2471
+ },
2472
+ [ToolNames.browserWaitFor]: {
2473
+ title: "Wait For Condition",
2474
+ annotations: {
2475
+ title: "Wait For Condition",
2476
+ readOnlyHint: true,
2477
+ openWorldHint: true
2478
+ }
2479
+ },
2480
+ [ToolNames.browserScreenshot]: {
2481
+ title: "Take Screenshot",
2482
+ annotations: {
2483
+ title: "Take Screenshot",
2484
+ readOnlyHint: true,
2485
+ openWorldHint: true
2486
+ }
2487
+ },
2488
+ [ToolNames.browserNavigate]: {
2489
+ title: "Navigate URL",
2490
+ annotations: {
2491
+ title: "Navigate URL",
2492
+ readOnlyHint: false,
2493
+ destructiveHint: true,
2494
+ idempotentHint: false,
2495
+ openWorldHint: true
2496
+ }
2497
+ },
2498
+ // ---------- composite ----------
2499
+ [ToolNames.verifyUiFlow]: {
2500
+ title: "Verify UI Flow",
2501
+ annotations: {
2502
+ title: "Verify UI Flow",
2503
+ readOnlyHint: false,
2504
+ destructiveHint: true,
2505
+ idempotentHint: false,
2506
+ openWorldHint: true
2507
+ }
2508
+ },
2509
+ [ToolNames.auditA11y]: {
2510
+ title: "Audit Accessibility (axe-core)",
2511
+ annotations: {
2512
+ title: "Audit Accessibility (axe-core)",
2513
+ readOnlyHint: true,
2514
+ openWorldHint: true
2515
+ }
2516
+ },
2517
+ [ToolNames.visualDiff]: {
2518
+ title: "Visual Diff vs Baseline",
2519
+ annotations: {
2520
+ title: "Visual Diff vs Baseline",
2521
+ // Writes to ./.rolepod-uiproof/{baselines,artifacts}/ but only adds files —
2522
+ // never destroys an existing baseline silently.
2523
+ readOnlyHint: false,
2524
+ destructiveHint: false,
2525
+ idempotentHint: true,
2526
+ openWorldHint: true
2527
+ }
2528
+ },
2529
+ [ToolNames.scaffoldE2e]: {
2530
+ title: "Scaffold E2E Test File",
2531
+ annotations: {
2532
+ title: "Scaffold E2E Test File",
2533
+ // Writes a test file to the local repo.
2534
+ readOnlyHint: false,
2535
+ destructiveHint: true,
2536
+ idempotentHint: false,
2537
+ openWorldHint: false
2538
+ }
2539
+ },
2540
+ [ToolNames.extractUiState]: {
2541
+ title: "Extract UI State (NL Query)",
2542
+ annotations: {
2543
+ title: "Extract UI State (NL Query)",
2544
+ readOnlyHint: true,
2545
+ openWorldHint: true
2546
+ }
2547
+ }
2548
+ };
2549
+
2401
2550
  // src/server.ts
2402
2551
  var SERVER_NAME = "rolepod-uiproof";
2403
- var SERVER_VERSION = "0.4.0";
2552
+ var SERVER_VERSION = "0.4.1";
2404
2553
  function buildServer(opts = {}) {
2405
2554
  const webEngine = createWebEngine();
2406
2555
  const registry = new SessionRegistry({ idleTimeoutMs: opts.idleTimeoutMs });
@@ -2436,9 +2585,15 @@ function buildServer(opts = {}) {
2436
2585
  extractUiStateTool
2437
2586
  ];
2438
2587
  for (const t of tools) {
2588
+ const meta = toolMetadata[t.name];
2439
2589
  mcp.registerTool(
2440
2590
  t.name,
2441
- { description: t.description, inputSchema: t.inputShape },
2591
+ {
2592
+ title: meta?.title,
2593
+ description: t.description,
2594
+ inputSchema: t.inputShape,
2595
+ annotations: meta?.annotations
2596
+ },
2442
2597
  t.build(ctx)
2443
2598
  );
2444
2599
  }