@rolepod/uiproof 0.6.0 → 0.6.2

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.
@@ -10,8 +10,8 @@
10
10
  {
11
11
  "name": "rolepod-uiproof",
12
12
  "source": "./",
13
- "description": "26 MCP tools (21 atomic browser/mobile primitives + 5 composite workflows) + 5 user-invocable skills. v0.6 adds Extension Protocol v1 support works standalone today, becomes the verify-phase UI provider when installed alongside the `rolepod` parent plugin (evidence routes to `.rolepod/evidence/` with `manifest.json`). Replaces chrome-devtools-mcp and playwright-mcp for UI testing. Web production-ready via Playwright; mobile (iOS/Android) via Appium scaffolded — see `rolepod-uiproof doctor` for readiness.",
14
- "version": "0.6.0",
13
+ "description": "26 MCP tools (21 atomic browser/mobile primitives + 5 composite workflows) + 5 user-invocable skills. Works standalone today; pair with the `rolepod` parent plugin (detected via the marker file `<git-root>/.rolepod/parent-active`) and uiproof becomes the verify-phase UI provider evidence routes to `<git-root>/.rolepod/evidence/` with `manifest.json` per Extension Protocol v1. Replaces chrome-devtools-mcp and playwright-mcp for UI testing. Web production-ready via Playwright; mobile (iOS/Android) via Appium scaffolded — see `rolepod-uiproof doctor` for readiness.",
14
+ "version": "0.6.2",
15
15
  "author": {
16
16
  "name": "nuttaruj"
17
17
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rolepod-uiproof",
3
- "version": "0.6.0",
4
- "description": "Multi-platform UI/mobile automation for AI agents — 5 shipped skills (verify-ui, audit-a11y, visual-diff, scaffold-e2e, check-errors) + MCP server with 26 tools. Works standalone OR with the `rolepod` parent plugin: when ROLEPOD_PARENT=1 is set, evidence routes to `.rolepod/evidence/` with a `manifest.json` per Extension Protocol v1, so parent's `check-work` skill can aggregate UI verify results into its phase report. v0.5 completed the UI verification surface (console + network observability, hover/drag/fill_form/upload/dialog, runtime emulation, multi-page, gated JS eval).",
3
+ "version": "0.6.2",
4
+ "description": "Multi-platform UI/mobile automation for AI agents — 5 shipped skills (verify-ui, audit-a11y, visual-diff, scaffold-e2e, check-errors) + MCP server with 26 tools. Works standalone OR with the `rolepod` parent plugin: when the marker file `<git-root>/.rolepod/parent-active` is present (written by the parent's SessionStart hook), evidence routes to `<git-root>/.rolepod/evidence/` with a `manifest.json` per Extension Protocol v1, so parent's `check-work` skill can aggregate UI verify results into its phase report. v0.5 completed the UI verification surface (console + network observability, hover/drag/fill_form/upload/dialog, runtime emulation, multi-page, gated JS eval).",
5
5
  "author": {
6
6
  "name": "nuttaruj",
7
7
  "url": "https://github.com/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
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rolepod-uiproof",
3
- "version": "0.6.0",
4
- "description": "Multi-platform UI/mobile automation for AI agents — 5 shipped skills (verify-ui, audit-a11y, visual-diff, scaffold-e2e, check-errors) + MCP server with 26 tools. v0.6 adds Extension Protocol v1 works standalone today, becomes the verify-phase UI provider when paired with the `rolepod` parent plugin.",
3
+ "version": "0.6.2",
4
+ "description": "Multi-platform UI/mobile automation for AI agents — 5 shipped skills (verify-ui, audit-a11y, visual-diff, scaffold-e2e, check-errors) + MCP server with 26 tools. Works standalone today; pair with the `rolepod` parent plugin (detected via the marker file `<git-root>/.rolepod/parent-active`) and uiproof becomes the verify-phase UI provider.",
5
5
  "author": {
6
6
  "name": "nuttaruj",
7
7
  "url": "https://github.com/nuttaruj"
@@ -25,7 +25,7 @@
25
25
  "interface": {
26
26
  "displayName": "Rolepod UIProof",
27
27
  "shortDescription": "UI verification, a11y audits, visual diff, e2e scaffolding — for AI coding agents.",
28
- "longDescription": "rolepod-uiproof ships an MCP server with 26 tools (21 atomic + 5 composite) and 5 user-invocable skills (/verify-ui, /audit-a11y, /visual-diff, /scaffold-e2e, /check-errors). Web is fully supported via Playwright; mobile (iOS/Android via Appium) supports basic input. v0.6: pair with the `rolepod` parent plugin (v2.7+) and uiproof becomes the verify-phase UI provider — evidence routes to `.rolepod/evidence/` with a `manifest.json` per Extension Protocol v1.",
28
+ "longDescription": "rolepod-uiproof ships an MCP server with 26 tools (21 atomic + 5 composite) and 5 user-invocable skills (/verify-ui, /audit-a11y, /visual-diff, /scaffold-e2e, /check-errors). Web is fully supported via Playwright; mobile (iOS/Android via Appium) supports basic input. v0.6.1: pair with the `rolepod` parent plugin (v2.7+) and uiproof becomes the verify-phase UI provider — evidence routes to `<git-root>/.rolepod/evidence/` with a `manifest.json` per Extension Protocol v1. Parent detection uses the marker file `<git-root>/.rolepod/parent-active`.",
29
29
  "developerName": "nuttaruj",
30
30
  "category": "Productivity",
31
31
  "capabilities": ["Read", "Write", "Bash"],
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
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "rolepod-uiproof",
3
3
  "displayName": "Rolepod UIProof",
4
- "version": "0.6.0",
5
- "description": "Multi-platform UI / mobile automation MCP server + 5 shipped skills (verify-ui, audit-a11y, visual-diff, scaffold-e2e, check-errors) for AI coding agents. v0.6 adds Extension Protocol v1 works standalone today, becomes the verify-phase UI provider when paired with the `rolepod` parent plugin (evidence routes to `.rolepod/evidence/` with `manifest.json`). Replaces chrome-devtools-mcp and playwright-mcp.",
4
+ "version": "0.6.2",
5
+ "description": "Multi-platform UI / mobile automation MCP server + 5 shipped skills (verify-ui, audit-a11y, visual-diff, scaffold-e2e, check-errors) for AI coding agents. Works standalone today; pair with the `rolepod` parent plugin (detected via the marker file `<git-root>/.rolepod/parent-active`) and uiproof becomes the verify-phase UI provider evidence routes to `<git-root>/.rolepod/evidence/` with `manifest.json` per Extension Protocol v1. Replaces chrome-devtools-mcp and playwright-mcp.",
6
6
  "author": {
7
7
  "name": "nuttaruj"
8
8
  },
package/CHANGELOG.md CHANGED
@@ -7,6 +7,108 @@ release.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.6.2] — 2026-05-28
11
+
12
+ ### Fixed
13
+
14
+ - **Plugin MCP server failed to start in fresh sessions** with
15
+ `Failed to reconnect to plugin:rolepod-uiproof:rolepod-uiproof: -32000`.
16
+ Root cause: v0.4.1 changed every `mcpServers` config to invoke
17
+ `npx -y rolepod-uiproof` (unscoped) instead of
18
+ `npx -y @rolepod/uiproof` (scoped). The unscoped name does not
19
+ exist on the npm registry — npx returned `E404` and the spawn
20
+ failed. The earlier "fix" only appeared to work on machines that
21
+ already had `node_modules/.bin/rolepod-uiproof` cached from a
22
+ previous local install; a fresh environment (where Claude Code
23
+ spawns the MCP server in its own subprocess with a clean PATH)
24
+ always 404'd.
25
+
26
+ Verified directly: `npx -y rolepod-uiproof` → `npm error code E404`;
27
+ `npx -y @rolepod/uiproof` → MCP server boots, lists 26 tools,
28
+ responds to `initialize`. v0.4.1's premise that npx couldn't
29
+ resolve a scoped package's bin when the bin name didn't match the
30
+ short name was wrong — modern npx exec selects the single
31
+ available bin regardless of naming.
32
+
33
+ Reverts the four `mcpServers` invocations + the matching
34
+ documentation:
35
+
36
+ - `.mcp.json`
37
+ - `.cursor/mcp.json`
38
+ - `.claude-plugin/plugin.json`
39
+ - `plugins/rolepod-uiproof/.mcp.json`
40
+ - `README.md` (Install snippet)
41
+ - `skills/verify-ui/SKILL.md` + `skills/check-errors/SKILL.md`
42
+ ("If the tool is unavailable" hint)
43
+ - `plugins/rolepod-uiproof/skills/{verify-ui,check-errors}/SKILL.md`
44
+ (mirrors)
45
+
46
+ Plugin and standalone consumers must update to v0.6.2 (or override
47
+ the command manually in `.mcp.json`) to get working spawns. The
48
+ package itself was always installable as `@rolepod/uiproof`; only
49
+ the invocation form was broken.
50
+
51
+ ## [0.6.1] — 2026-05-28
52
+
53
+ ### Fixed
54
+
55
+ - **Extension Protocol v1 detection** swapped from environment variable
56
+ (`ROLEPOD_PARENT=1`) to filesystem marker
57
+ (`<git-root>/.rolepod/parent-active`). The env-var mechanism never
58
+ fired in practice because Claude Code SessionStart hooks cannot
59
+ propagate env to the Bash tool or to the MCP server subprocess
60
+ Claude later spawns. The marker file is what the parent v2.7+ hook
61
+ actually writes — v0.6.1 reads it. **End-to-end combined mode now
62
+ works.**
63
+ - Same swap for the protocol-version compatibility warning. Previously
64
+ read `process.env.ROLEPOD_PROTOCOL`; now reads the first trimmed
65
+ line of the marker file content.
66
+
67
+ ### Added
68
+
69
+ - `src/util/rolepodProtocol.ts` — shared `detectRolepodParent()`
70
+ helper returning `{ active, protocol, gitRoot }`. ArtifactStore and
71
+ the server both call it.
72
+
73
+ ### Changed
74
+
75
+ - With-parent runs anchor at **git root** (resolved via
76
+ `git rev-parse --show-toplevel`), not at `process.cwd()`. A uiproof
77
+ skill invoked from a subdirectory now lands its evidence under the
78
+ worktree root where parent's `check-work` skill looks — previously
79
+ it would have landed at `<cwd>/.rolepod/evidence/` and been
80
+ invisible to the aggregator.
81
+ - Standalone path is unchanged — still anchored at `process.cwd()`.
82
+ - All 5 SKILL.md files (+ mirrors under `plugins/`) updated to
83
+ describe the marker mechanism instead of the env var.
84
+ - README "Standalone vs Combined" section updated with the marker
85
+ language and the `touch .rolepod/parent-active` force-on hint.
86
+
87
+ ### Removed
88
+
89
+ - All reads of `process.env.ROLEPOD_PARENT` and
90
+ `process.env.ROLEPOD_PROTOCOL` from runtime code. Only historical
91
+ references remain in JSDoc that explains why the mechanism changed.
92
+
93
+ ### Migration from 0.6.0
94
+
95
+ No API change. Standalone users see no difference (same evidence
96
+ path, same tool output, same `manifest.json`). Combined-mode users
97
+ gain working evidence routing — provided the parent plugin actually
98
+ writes the marker (parent v2.7+ does).
99
+
100
+ To force combined mode without a real parent session:
101
+
102
+ ```bash
103
+ mkdir -p .rolepod && echo v1 > .rolepod/parent-active
104
+ ```
105
+
106
+ To force standalone:
107
+
108
+ ```bash
109
+ rm -f .rolepod/parent-active
110
+ ```
111
+
10
112
  ## [0.6.0] — 2026-05-27
11
113
 
12
114
  **Extension Protocol v1 — `uiproof` becomes parent-aware. Standalone
package/README.md CHANGED
@@ -33,7 +33,7 @@ Every skill is **single-backend** (D-024) — it calls the rolepod-uiproof serve
33
33
 
34
34
  **Standalone** (default): use the 5 skills directly as atomic browser tools. Evidence saved under `./.rolepod-uiproof/artifacts/<run>/` with a `manifest.json` per Extension Protocol v1.
35
35
 
36
- **Combined with rolepod parent**: when the parent's SessionStart hook sets `ROLEPOD_PARENT=1`, uiproof writes evidence to `./.rolepod/evidence/<ts>-rolepod-uiproof-<skill>/` instead, where parent's `check-work` skill auto-aggregates manifests into the verify report. No skill changes — same 26 tools, same 5 skills, smarter routing.
36
+ **Combined with rolepod parent**: when the parent's SessionStart hook drops the marker file `<git-root>/.rolepod/parent-active` (single line of content = the protocol version, e.g. `v1`), uiproof writes evidence to `<git-root>/.rolepod/evidence/<ts>-rolepod-uiproof-<skill>/` instead, where parent's `check-work` skill auto-aggregates manifests into the verify report. The marker is read fresh per ArtifactStore construction; no env-var, no daemon. To force combined mode without a parent session: `mkdir -p .rolepod && echo v1 > .rolepod/parent-active`. No skill changes — same 26 tools, same 5 skills, smarter routing.
37
37
 
38
38
  | Install | Unlocks |
39
39
  |---|---|
@@ -89,11 +89,11 @@ Skills are not auto-registered under Cursor (no unified plugin format for skills
89
89
  ```bash
90
90
  # Install
91
91
  codex plugin marketplace add nuttaruj/rolepod-uiproof
92
- codex plugin install rolepod-uiproof@rolepod-uiproof
92
+ codex plugin add rolepod-uiproof@rolepod-uiproof
93
93
 
94
94
  # Update
95
95
  codex plugin marketplace upgrade rolepod-uiproof
96
- codex plugin install rolepod-uiproof@rolepod-uiproof
96
+ codex plugin add rolepod-uiproof@rolepod-uiproof
97
97
  ```
98
98
 
99
99
  Codex reads the plugin from `.agents/plugins/marketplace.json` + `.codex-plugin/plugin.json` in this repo. Skills install to `~/.codex/skills/` (Codex's plugin loader handles registration).
@@ -111,7 +111,7 @@ Use this when your tool reads a standard `mcpServers` config (most non-CLI MCP c
111
111
  "mcpServers": {
112
112
  "rolepod-uiproof": {
113
113
  "command": "npx",
114
- "args": ["-y", "rolepod-uiproof"]
114
+ "args": ["-y", "@rolepod/uiproof"]
115
115
  }
116
116
  }
117
117
  }
@@ -201,18 +201,40 @@ var log = {
201
201
  }
202
202
  };
203
203
 
204
+ // src/util/rolepodProtocol.ts
205
+ import { execSync } from "child_process";
206
+ import { existsSync as existsSync2, readFileSync } from "fs";
207
+ import { join as join2 } from "path";
208
+ function detectRolepodParent(cwd = process.cwd()) {
209
+ let gitRoot = cwd;
210
+ try {
211
+ gitRoot = execSync("git rev-parse --show-toplevel", {
212
+ cwd,
213
+ encoding: "utf8",
214
+ stdio: ["ignore", "pipe", "ignore"]
215
+ }).trim();
216
+ } catch {
217
+ }
218
+ const file = join2(gitRoot, ".rolepod", "parent-active");
219
+ if (!existsSync2(file)) {
220
+ return { active: false, protocol: null, gitRoot };
221
+ }
222
+ const protocol = readFileSync(file, "utf8").trim().split(/\r?\n/)[0] ?? null;
223
+ return { active: true, protocol, gitRoot };
224
+ }
225
+
204
226
  // src/artifact/ArtifactStore.ts
205
227
  var ArtifactStore = class {
206
228
  rootDir;
207
229
  mode;
208
230
  baselineRoot;
209
231
  constructor(opts = {}) {
210
- const detectedParent = process.env.ROLEPOD_PARENT === "1";
211
- this.mode = opts.mode ?? (detectedParent ? "with-parent" : "standalone");
232
+ const parent = detectRolepodParent();
233
+ this.mode = opts.mode ?? (parent.active ? "with-parent" : "standalone");
212
234
  if (opts.rootDir !== void 0) {
213
235
  this.rootDir = opts.rootDir;
214
236
  } else if (this.mode === "with-parent") {
215
- this.rootDir = resolve2(process.cwd(), ".rolepod", "evidence");
237
+ this.rootDir = resolve2(parent.gitRoot, ".rolepod", "evidence");
216
238
  } else {
217
239
  this.rootDir = resolve2(process.cwd(), ".rolepod-uiproof", "artifacts");
218
240
  }
@@ -222,7 +244,7 @@ var ArtifactStore = class {
222
244
  * Allocate a fresh run dir and ensure it exists.
223
245
  *
224
246
  * - standalone: `./.rolepod-uiproof/artifacts/{prefix}_{ts}_{uuid}/`
225
- * - with-parent: `./.rolepod/evidence/{ts}-rolepod-uiproof-{skill}/`
247
+ * - with-parent: `<git-root>/.rolepod/evidence/{ts}-rolepod-uiproof-{skill}/`
226
248
  *
227
249
  * `prefix` is preserved for back-compat with v0.5 callers; new callers
228
250
  * should also pass `opts.skill` so the with-parent path can be derived
@@ -3740,7 +3762,7 @@ function indent(block, n) {
3740
3762
  }
3741
3763
 
3742
3764
  // src/tools/composite/visual_diff.ts
3743
- import { existsSync as existsSync2 } from "fs";
3765
+ import { existsSync as existsSync3 } from "fs";
3744
3766
  import { readFile as readFile3 } from "fs/promises";
3745
3767
  import { resolve as resolve6 } from "path";
3746
3768
  import pixelmatch from "pixelmatch";
@@ -3778,7 +3800,7 @@ var visualDiffTool = {
3778
3800
  ctx.store.baselineDir,
3779
3801
  `${args.baseline_id}.png`
3780
3802
  );
3781
- if (!existsSync2(baselinePath)) {
3803
+ if (!existsSync3(baselinePath)) {
3782
3804
  await ctx.store.writeBytes(
3783
3805
  ctx.store.baselineDir,
3784
3806
  `${args.baseline_id}.png`,
@@ -4143,14 +4165,14 @@ var toolMetadata = {
4143
4165
 
4144
4166
  // src/server.ts
4145
4167
  var SERVER_NAME = "rolepod-uiproof";
4146
- var SERVER_VERSION = "0.6.0";
4168
+ var SERVER_VERSION = "0.6.2";
4147
4169
  var SUPPORTED_PROTOCOL = "v1";
4148
4170
  function checkProtocolCompat() {
4149
- const requested = process.env.ROLEPOD_PROTOCOL;
4150
- if (!requested) return;
4151
- if (requested !== SUPPORTED_PROTOCOL) {
4171
+ const parent = detectRolepodParent();
4172
+ if (!parent.active || !parent.protocol) return;
4173
+ if (parent.protocol !== SUPPORTED_PROTOCOL) {
4152
4174
  console.warn(
4153
- `rolepod protocol mismatch: expected ${SUPPORTED_PROTOCOL}, got ${requested}. Manifest will still be written in ${SUPPORTED_PROTOCOL} shape \u2014 parent may not parse it correctly.`
4175
+ `rolepod protocol mismatch: expected ${SUPPORTED_PROTOCOL}, got ${parent.protocol}. Manifest will still be written in ${SUPPORTED_PROTOCOL} shape \u2014 parent may not parse it correctly.`
4154
4176
  );
4155
4177
  }
4156
4178
  }