@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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +3 -3
- package/.cursor-plugin/plugin.json +2 -2
- package/CHANGELOG.md +61 -0
- package/README.md +1 -1
- package/dist/bin/rolepod-uiproof.js +33 -11
- package/dist/bin/rolepod-uiproof.js.map +1 -1
- package/dist/index.d.ts +14 -7
- package/dist/index.js +33 -11
- package/dist/index.js.map +1 -1
- package/dist/schemas/tools.json +1 -1
- package/package.json +1 -1
- package/skills/audit-a11y/SKILL.md +1 -1
- package/skills/check-errors/SKILL.md +1 -1
- package/skills/scaffold-e2e/SKILL.md +1 -1
- package/skills/verify-ui/SKILL.md +1 -1
- package/skills/visual-diff/SKILL.md +1 -1
|
@@ -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.
|
|
14
|
-
"version": "0.6.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
211
|
-
this.mode = opts.mode ?? (
|
|
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(
|
|
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:
|
|
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
|
|
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 (!
|
|
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.
|
|
4168
|
+
var SERVER_VERSION = "0.6.1";
|
|
4147
4169
|
var SUPPORTED_PROTOCOL = "v1";
|
|
4148
4170
|
function checkProtocolCompat() {
|
|
4149
|
-
const
|
|
4150
|
-
if (!
|
|
4151
|
-
if (
|
|
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 ${
|
|
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
|
}
|