@rolepod/uiproof 0.6.0 → 0.6.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.
@@ -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.1",
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.1",
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"
@@ -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.1",
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"],
@@ -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.1",
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,67 @@ release.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.6.1] — 2026-05-28
11
+
12
+ ### Fixed
13
+
14
+ - **Extension Protocol v1 detection** swapped from environment variable
15
+ (`ROLEPOD_PARENT=1`) to filesystem marker
16
+ (`<git-root>/.rolepod/parent-active`). The env-var mechanism never
17
+ fired in practice because Claude Code SessionStart hooks cannot
18
+ propagate env to the Bash tool or to the MCP server subprocess
19
+ Claude later spawns. The marker file is what the parent v2.7+ hook
20
+ actually writes — v0.6.1 reads it. **End-to-end combined mode now
21
+ works.**
22
+ - Same swap for the protocol-version compatibility warning. Previously
23
+ read `process.env.ROLEPOD_PROTOCOL`; now reads the first trimmed
24
+ line of the marker file content.
25
+
26
+ ### Added
27
+
28
+ - `src/util/rolepodProtocol.ts` — shared `detectRolepodParent()`
29
+ helper returning `{ active, protocol, gitRoot }`. ArtifactStore and
30
+ the server both call it.
31
+
32
+ ### Changed
33
+
34
+ - With-parent runs anchor at **git root** (resolved via
35
+ `git rev-parse --show-toplevel`), not at `process.cwd()`. A uiproof
36
+ skill invoked from a subdirectory now lands its evidence under the
37
+ worktree root where parent's `check-work` skill looks — previously
38
+ it would have landed at `<cwd>/.rolepod/evidence/` and been
39
+ invisible to the aggregator.
40
+ - Standalone path is unchanged — still anchored at `process.cwd()`.
41
+ - All 5 SKILL.md files (+ mirrors under `plugins/`) updated to
42
+ describe the marker mechanism instead of the env var.
43
+ - README "Standalone vs Combined" section updated with the marker
44
+ language and the `touch .rolepod/parent-active` force-on hint.
45
+
46
+ ### Removed
47
+
48
+ - All reads of `process.env.ROLEPOD_PARENT` and
49
+ `process.env.ROLEPOD_PROTOCOL` from runtime code. Only historical
50
+ references remain in JSDoc that explains why the mechanism changed.
51
+
52
+ ### Migration from 0.6.0
53
+
54
+ No API change. Standalone users see no difference (same evidence
55
+ path, same tool output, same `manifest.json`). Combined-mode users
56
+ gain working evidence routing — provided the parent plugin actually
57
+ writes the marker (parent v2.7+ does).
58
+
59
+ To force combined mode without a real parent session:
60
+
61
+ ```bash
62
+ mkdir -p .rolepod && echo v1 > .rolepod/parent-active
63
+ ```
64
+
65
+ To force standalone:
66
+
67
+ ```bash
68
+ rm -f .rolepod/parent-active
69
+ ```
70
+
10
71
  ## [0.6.0] — 2026-05-27
11
72
 
12
73
  **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
  |---|---|
@@ -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.1";
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
  }