@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.
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +1 -7
- package/.cursor/mcp.json +1 -1
- package/CHANGELOG.md +22 -0
- package/README.md +1 -1
- package/dist/bin/rolepod-uiproof.js +157 -2
- package/dist/bin/rolepod-uiproof.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +157 -2
- package/dist/index.js.map +1 -1
- package/dist/schemas/tools.json +1 -1
- package/package.json +1 -1
- package/skills/verify-ui/SKILL.md +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rolepod-uiproof",
|
|
3
|
-
"version": "0.4.
|
|
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", "
|
|
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
|
-
"
|
|
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
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
|
@@ -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.
|
|
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
|
-
{
|
|
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
|
}
|