diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index a03a957..6c481cb 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -42,7 +42,7 @@ "name": "screenote", "source": "./plugins/screenote", "description": "Capture pages, publish OAuth-authenticated snapshots with the Screenote CLI, and retrieve visual feedback from Claude Code or Codex.", - "version": "3.2.0", + "version": "3.2.1", "author": { "name": "ivankuznetsov", "url": "https://github.com/ivankuznetsov" diff --git a/.github/workflows/agent-platforms.yml b/.github/workflows/agent-platforms.yml index 174efbd..d573b9d 100644 --- a/.github/workflows/agent-platforms.yml +++ b/.github/workflows/agent-platforms.yml @@ -96,7 +96,7 @@ jobs: - name: Install the recorded public Screenote CLI baseline run: >- go install - github.com/ivankuznetsov/screenote-cli/cmd/screenote@bc45930aae38acc892324a5e80e097a1761fa17b + github.com/ivankuznetsov/screenote-cli/cmd/screenote@cce90049d1335413bd903d7da4882d20615fa5d3 - name: Exercise noninteractive project, snapshot, capture, and feedback commands shell: bash run: | diff --git a/RELEASING.md b/RELEASING.md index d30b1c4..04d0332 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -94,6 +94,6 @@ The Screenote plugin is released here, while its external CLI is released from [`ivankuznetsov/screenote-cli`](https://github.com/ivankuznetsov/screenote-cli). Keep the contract PR, merge SHA, public test ref, and eventual minimum release as separate fields in `plugin-surfaces.json`. The current plugin baseline is -CLI v0.4.0 from PR 17. When that baseline advances, update all four provenance +CLI v0.4.1 from PR 18. When that baseline advances, update all four provenance fields and compatibility docs, rerun offline/live tests, and do not copy the CLI implementation into skills. diff --git a/docs/agent-compatibility.md b/docs/agent-compatibility.md index b747dc5..4862337 100644 --- a/docs/agent-compatibility.md +++ b/docs/agent-compatibility.md @@ -36,7 +36,7 @@ plugin directory so a copied package does not depend on the repository root. | Agent SEO | `2.0.1` | Stable | `skills/seo/SKILL.md` | agents, context, data sources, hooks, scripts | | Agent Writing | `0.5.2` | Stable | `skills/writing/SKILL.md` | agents, voice/style context | | LLM Wiki | `0.3.5` | Stable | five files under `skills/` | assets, consent-gated maintenance templates | -| Screenote | `3.2.0` | Stable | `skills/{screenote,snapshot,feedback}/SKILL.md` | CLI launcher, references, evals | +| Screenote | `3.2.1` | Stable | `skills/{screenote,snapshot,feedback}/SKILL.md` | CLI launcher, references, evals | ## Plugin invocations diff --git a/docs/screenote-cli-migration.md b/docs/screenote-cli-migration.md index f54eaa0..776722d 100644 --- a/docs/screenote-cli-migration.md +++ b/docs/screenote-cli-migration.md @@ -8,13 +8,13 @@ and comment operations. There is no MCP transport or compatibility fallback. ## Compatible CLI baseline The current contract is released as -[Screenote CLI v0.4.0](https://github.com/ivankuznetsov/screenote-cli/releases/tag/v0.4.0). -It was merged by [PR 17](https://github.com/ivankuznetsov/screenote-cli/pull/17) -at `bc45930aae38acc892324a5e80e097a1761fa17b`. The repository tests that exact +[Screenote CLI v0.4.1](https://github.com/ivankuznetsov/screenote-cli/releases/tag/v0.4.1). +It was merged by [PR 18](https://github.com/ivankuznetsov/screenote-cli/pull/18) +at `cce90049d1335413bd903d7da4882d20615fa5d3`. The repository tests that exact public ref: ```bash -go install github.com/ivankuznetsov/screenote-cli/cmd/screenote@v0.4.0 +go install github.com/ivankuznetsov/screenote-cli/cmd/screenote@v0.4.1 plugins/screenote/scripts/screenote-cli.sh --check-contract ``` diff --git a/plugin-surfaces.json b/plugin-surfaces.json index 83273d0..fbf2576 100644 --- a/plugin-surfaces.json +++ b/plugin-surfaces.json @@ -17,11 +17,11 @@ ] }, "screenote_cli": { - "contract_pr": "https://github.com/ivankuznetsov/screenote-cli/pull/17", - "contract_merge_sha": "bc45930aae38acc892324a5e80e097a1761fa17b", + "contract_pr": "https://github.com/ivankuznetsov/screenote-cli/pull/18", + "contract_merge_sha": "cce90049d1335413bd903d7da4882d20615fa5d3", "public_repository": "https://github.com/ivankuznetsov/screenote-cli", - "public_test_ref": "bc45930aae38acc892324a5e80e097a1761fa17b", - "minimum_release": "0.4.0", + "public_test_ref": "cce90049d1335413bd903d7da4882d20615fa5d3", + "minimum_release": "0.4.1", "approved_commands": [ ["project", "list"], ["project", "create"], @@ -210,7 +210,7 @@ { "name": "screenote", "path": "plugins/screenote", - "version": "3.2.0", + "version": "3.2.1", "stability": "stable", "metadata": { "display_name": "Screenote", diff --git a/plugin-surfaces.lock.json b/plugin-surfaces.lock.json index e87fb67..4373d5f 100644 --- a/plugin-surfaces.lock.json +++ b/plugin-surfaces.lock.json @@ -853,7 +853,7 @@ } }, "screenote": { - "version": "3.2.0", + "version": "3.2.1", "canonical": { "skills/screenote/SKILL.md": { "sha256": "0dd17ee55e234d8e0e92db3c9d991a1f69a5837d6af785e07dcad19b1df23d8a", @@ -893,7 +893,7 @@ "resources": { "references": { "exists": true, - "sha256": "bdc193fa70a54038a311bd3416d3e0c833d82117cc5fe7333314d93f2fd90343", + "sha256": "59612d94d7e0e3d5a2b4a5a057ba3e40c39f8eadc55950899f6d5034db1b5a34", "files": [ "references/cli.md", "references/workflows.json" @@ -901,7 +901,7 @@ }, "evals": { "exists": true, - "sha256": "6638fbb57b71f9df30c5755f0f87315a9cd4a9a8b7de9fab3c985afc03709d74", + "sha256": "0454e8745544da59deb7a8bebf0f61c65757ace381c8690e671508c3b14517ed", "files": [ "evals/README.md", "evals/lint-skills-test.sh", @@ -912,7 +912,7 @@ }, "scripts/screenote-cli.sh": { "exists": true, - "sha256": "21fa315da3b9694514a0deec746c4b35fedbdd3154867a08f3d8d028203f9760" + "sha256": "ee205934229c5d7e0c4e05cb95ba2ef1d14e1de56f9b2143b913b0d47be8e8c3" }, "scripts/screenote_flow.py": { "exists": true, diff --git a/plugins/screenote/.claude-plugin/marketplace.json b/plugins/screenote/.claude-plugin/marketplace.json index 4955d5c..f445989 100644 --- a/plugins/screenote/.claude-plugin/marketplace.json +++ b/plugins/screenote/.claude-plugin/marketplace.json @@ -13,7 +13,7 @@ "name": "screenote", "source": "./", "description": "Capture pages, publish OAuth-authenticated snapshots with the Screenote CLI, and retrieve visual feedback from Claude Code or Codex.", - "version": "3.2.0", + "version": "3.2.1", "author": { "name": "ivankuznetsov" }, diff --git a/plugins/screenote/.claude-plugin/plugin.json b/plugins/screenote/.claude-plugin/plugin.json index 8d4c95f..a8d9415 100644 --- a/plugins/screenote/.claude-plugin/plugin.json +++ b/plugins/screenote/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "screenote", - "version": "3.2.0", + "version": "3.2.1", "description": "Capture full-page browser snapshots and manage Screenote feedback through the OAuth CLI from Claude Code or Codex.", "author": { "name": "ivankuznetsov" diff --git a/plugins/screenote/.codex-plugin/plugin.json b/plugins/screenote/.codex-plugin/plugin.json index 62e69eb..e117ee1 100644 --- a/plugins/screenote/.codex-plugin/plugin.json +++ b/plugins/screenote/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "screenote", - "version": "3.2.0", + "version": "3.2.1", "description": "Capture full-page browser snapshots and manage Screenote feedback through the OAuth CLI from Claude Code or Codex.", "author": { "name": "ivankuznetsov", diff --git a/plugins/screenote/CHANGELOG.md b/plugins/screenote/CHANGELOG.md index 01ebb9b..59f813b 100644 --- a/plugins/screenote/CHANGELOG.md +++ b/plugins/screenote/CHANGELOG.md @@ -4,10 +4,14 @@ All notable changes to the Screenote plugin are documented here. ## [Unreleased] +## [3.2.1] - 2026-09-04 + ### Fixed - Reject snapshot manifests that put several distinct screens under one Page, preventing those screens from appearing as versions of each other. +- Require Screenote CLI v0.4.1, the first tagged CLI release that enforces the + same one-screen-per-Page snapshot contract. ## [3.2.0] - 2026-09-02 diff --git a/plugins/screenote/README.md b/plugins/screenote/README.md index 7659c48..900ab9d 100644 --- a/plugins/screenote/README.md +++ b/plugins/screenote/README.md @@ -32,10 +32,10 @@ openclaw plugins install /path/to/agent-plugins/plugins/screenote ## Prerequisite -Install Screenote CLI v0.4.0 or later: +Install Screenote CLI v0.4.1 or later: ```bash -go install github.com/ivankuznetsov/screenote-cli/cmd/screenote@v0.4.0 +go install github.com/ivankuznetsov/screenote-cli/cmd/screenote@v0.4.1 ``` For an interactive machine using the hosted service, authenticate separately diff --git a/plugins/screenote/evals/lint-skills.sh b/plugins/screenote/evals/lint-skills.sh index 2e93c15..ac69fc3 100755 --- a/plugins/screenote/evals/lint-skills.sh +++ b/plugins/screenote/evals/lint-skills.sh @@ -83,8 +83,8 @@ require_text skills/feedback/SKILL.md 'comment_result_unknown' require_text skills/feedback/SKILL.md 'do not issue another comment command' require_text skills/feedback/SKILL.md 'image_comments_unsupported' require_text skills/feedback/SKILL.md 'do not fall back to a text-only comment' -require_text references/cli.md 'screenote-cli/cmd/screenote@v0.4.0' -require_text references/workflows.json 'bc45930aae38acc892324a5e80e097a1761fa17b' +require_text references/cli.md 'screenote-cli/cmd/screenote@v0.4.1' +require_text references/workflows.json 'cce90049d1335413bd903d7da4882d20615fa5d3' [[ ! -e .mcp.json ]] || fail ".mcp.json must not exist" diff --git a/plugins/screenote/evals/validate-plugin.py b/plugins/screenote/evals/validate-plugin.py index cbfb433..ae60f83 100755 --- a/plugins/screenote/evals/validate-plugin.py +++ b/plugins/screenote/evals/validate-plugin.py @@ -85,7 +85,7 @@ def validate_assets() -> None: fail(f"missing {relative}") workflows = load_json("references/workflows.json") if workflows.get("contract_version") != 2: - fail("workflow contract must use the Screenote CLI v0.4.0 contract version") + fail("workflow contract must use the Screenote CLI v0.4.1 contract version") if set(workflows.get("workflows", {})) != {"screenote", "snapshot", "feedback"}: fail("workflow contract must cover every canonical Screenote skill") commands = workflows.get("commands", {}) diff --git a/plugins/screenote/openclaw.plugin.json b/plugins/screenote/openclaw.plugin.json index b086e77..b8860d2 100644 --- a/plugins/screenote/openclaw.plugin.json +++ b/plugins/screenote/openclaw.plugin.json @@ -2,7 +2,7 @@ "id": "screenote", "name": "Screenote", "description": "Capture pages, publish screenshots, and retrieve visual feedback through the Screenote OAuth CLI.", - "version": "3.2.0", + "version": "3.2.1", "skills": [ "./openclaw/skills" ], diff --git a/plugins/screenote/package.json b/plugins/screenote/package.json index 7016e9f..2e4d11f 100644 --- a/plugins/screenote/package.json +++ b/plugins/screenote/package.json @@ -1,6 +1,6 @@ { "name": "screenote", - "version": "3.2.0", + "version": "3.2.1", "type": "module", "description": "Capture pages, publish screenshots, and retrieve visual feedback through the Screenote OAuth CLI.", "homepage": "https://screenote.ai", diff --git a/plugins/screenote/references/cli.md b/plugins/screenote/references/cli.md index bc5de35..b4e2c1b 100644 --- a/plugins/screenote/references/cli.md +++ b/plugins/screenote/references/cli.md @@ -3,12 +3,12 @@ This plugin depends on the external `screenote` executable. Detect it with `command -v screenote`; never download, install, authenticate, or open a browser on the user's behalf. The compatibility baseline is Screenote CLI -[v0.4.0](https://github.com/ivankuznetsov/screenote-cli/releases/tag/v0.4.0), -merged by [PR 17](https://github.com/ivankuznetsov/screenote-cli/pull/17) at -`bc45930aae38acc892324a5e80e097a1761fa17b`: +[v0.4.1](https://github.com/ivankuznetsov/screenote-cli/releases/tag/v0.4.1), +merged by [PR 18](https://github.com/ivankuznetsov/screenote-cli/pull/18) at +`cce90049d1335413bd903d7da4882d20615fa5d3`: ```bash -go install github.com/ivankuznetsov/screenote-cli/cmd/screenote@v0.4.0 +go install github.com/ivankuznetsov/screenote-cli/cmd/screenote@v0.4.1 ``` Offer that command as guidance only. For hosted interactive setup, suggest diff --git a/plugins/screenote/references/workflows.json b/plugins/screenote/references/workflows.json index ac33016..bc53454 100644 --- a/plugins/screenote/references/workflows.json +++ b/plugins/screenote/references/workflows.json @@ -1,9 +1,9 @@ { "contract_version": 2, "provenance": { - "pull_request": "https://github.com/ivankuznetsov/screenote-cli/pull/17", - "merge_sha": "bc45930aae38acc892324a5e80e097a1761fa17b", - "minimum_release": "0.4.0" + "pull_request": "https://github.com/ivankuznetsov/screenote-cli/pull/18", + "merge_sha": "cce90049d1335413bd903d7da4882d20615fa5d3", + "minimum_release": "0.4.1" }, "success": { "exit_code": 0, diff --git a/plugins/screenote/scripts/screenote-cli.sh b/plugins/screenote/scripts/screenote-cli.sh index 061d699..52bd538 100755 --- a/plugins/screenote/scripts/screenote-cli.sh +++ b/plugins/screenote/scripts/screenote-cli.sh @@ -100,7 +100,7 @@ if [[ ${1-} == --check-contract ]]; then fi done done - printf '%s\n' '{"ok":true,"contract":"screenote-cli-v0.4.0","merge":"bc45930aae38acc892324a5e80e097a1761fa17b","minimum_release":"0.4.0"}' + printf '%s\n' '{"ok":true,"contract":"screenote-cli-v0.4.1","merge":"cce90049d1335413bd903d7da4882d20615fa5d3","minimum_release":"0.4.1"}' exit 0 fi diff --git a/tests/test_screenote_cli_contract.py b/tests/test_screenote_cli_contract.py index b6d0baa..6f7a647 100644 --- a/tests/test_screenote_cli_contract.py +++ b/tests/test_screenote_cli_contract.py @@ -28,6 +28,7 @@ LAUNCHER = PLUGIN_ROOT / "scripts/screenote-cli.sh" SHIPPED_FLOW = PLUGIN_ROOT / "scripts/screenote_flow.py" AGENT_PLATFORMS_WORKFLOW = REPO_ROOT / ".github/workflows/agent-platforms.yml" +PLUGIN_SURFACES = REPO_ROOT / "plugin-surfaces.json" FIXTURE_ROOT = REPO_ROOT / "tests/fixtures/screenote-cli" SCENARIOS = FIXTURE_ROOT / "scenarios" APPROVED = {tuple(command.split()) for command in WORKFLOW_CONTRACT["commands"]} @@ -75,6 +76,16 @@ def test_protected_integration_embeds_a_valid_upload_image(self): self.assertEqual("image/png", prepared.content_type) self.assertEqual((1, 1), (prepared.width, prepared.height)) + def test_protected_integration_installs_the_recorded_cli_baseline(self): + workflow = AGENT_PLATFORMS_WORKFLOW.read_text(encoding="utf-8") + contract = json.loads(PLUGIN_SURFACES.read_text(encoding="utf-8"))["screenote_cli"] + repository = contract["public_repository"].removeprefix("https://") + + self.assertIn( + f"{repository}/cmd/screenote@{contract['public_test_ref']}", + workflow, + ) + def _run(self, arguments): temporary = tempfile.TemporaryDirectory() self.addCleanup(temporary.cleanup) @@ -239,9 +250,9 @@ def test_launcher_rejects_credential_arguments(self): def test_launcher_detects_missing_and_incompatible_cli_contracts(self): compatible, argv = self._run(["--check-contract"]) self.assertEqual(0, compatible.returncode, compatible.stderr) - self.assertIn("screenote-cli-v0.4.0", compatible.stdout) - self.assertIn("bc45930aae38acc892324a5e80e097a1761fa17b", compatible.stdout) - self.assertIn('"minimum_release":"0.4.0"', compatible.stdout) + self.assertIn("screenote-cli-v0.4.1", compatible.stdout) + self.assertIn("cce90049d1335413bd903d7da4882d20615fa5d3", compatible.stdout) + self.assertIn('"minimum_release":"0.4.1"', compatible.stdout) self.assertEqual(["snapshot", "--help"], argv) with tempfile.TemporaryDirectory() as temporary: diff --git a/wiki/dependencies.md b/wiki/dependencies.md index 5782d3b..59ed1c4 100644 --- a/wiki/dependencies.md +++ b/wiki/dependencies.md @@ -9,11 +9,11 @@ The exact native discovery pins are Claude Code `2.1.179`, Codex CLI versions, not claimed formal minimums. Screenote depends on the external `screenote` executable. The current JSON -baseline is Screenote CLI v0.4.0, merged by PR 17 at -`bc45930aae38acc892324a5e80e097a1761fa17b`. The plugin records `0.4.0` as its -minimum release because feedback now requires attachment export and optional -image-comment support. It detects the executable but never installs it. Its -generated allowlist and shipped workflow contract share that pinned public +baseline is Screenote CLI v0.4.1, merged by PR 18 at +`cce90049d1335413bd903d7da4882d20615fa5d3`. The plugin records `0.4.1` as its +minimum release because snapshot publication now also requires one stable Page +identity per logical screen. It detects the executable but never installs it. +Its generated allowlist and shipped workflow contract share that pinned public provenance. Workflow-specific optional dependencies remain local to their plugins: diff --git a/wiki/log.d/20260904T215117Z-screenote-321-release.md b/wiki/log.d/20260904T215117Z-screenote-321-release.md new file mode 100644 index 0000000..c54555c --- /dev/null +++ b/wiki/log.d/20260904T215117Z-screenote-321-release.md @@ -0,0 +1,10 @@ +# Screenote 3.2.1 release + +Prepared Screenote plugin 3.2.1 for screen-specific Page identity. The plugin +and its external CLI baseline now reject snapshot manifests that group +neighboring screens under one Page while retaining desktop, tablet, and mobile +as variants and later captures as versions. + +The external minimum advances to Screenote CLI v0.4.1 from PR 18 at +`cce90049d1335413bd903d7da4882d20615fa5d3`. Canonical skills, generated host +adapters, manifests, provenance, tests, and the semantic lock advance together. diff --git a/wiki/plugins.md b/wiki/plugins.md index 629c1fb..32857f9 100644 --- a/wiki/plugins.md +++ b/wiki/plugins.md @@ -9,7 +9,7 @@ OpenClaw. | `agent-seo` | `2.0.0` | `seo` | agents, context, data sources, hooks, scripts | | `agent-writing` | `0.5.1` | `writing` | agents, context | | `llm-wiki` | `0.3.5` | `bootstrap`, `upgrade`, `research`, `wiki-plan`, `wiki-status` | assets, consent-gated templates | -| `screenote` | `3.2.0` | `screenote`, `snapshot`, `feedback` | CLI launcher, references, evals | +| `screenote` | `3.2.1` | `screenote`, `snapshot`, `feedback` | CLI launcher, references, evals | Claude and Codex install through their root marketplaces. Pi and OpenClaw install a copied `plugins/` directory. Every copied package is complete; @@ -31,6 +31,9 @@ Screenote 3.2.0 uses CLI v0.4.0 to inspect root and reply image attachments locally and to add one explicitly requested image to a feedback comment. Ambiguous image-comment results are not retried, and an unsupported server never receives a text-only fallback. +Screenote 3.2.1 requires CLI v0.4.1 and rejects manifests that reuse one Page +identity for neighboring screens, while preserving viewport variants and later +capture runs as versions of the same logical screen. LLM Wiki bootstrap creates the requested project wiki. Scheduler, managed-hook, shared-Git, and provider-backed maintenance are a separate opt-in; 0.2.x configs without both consent flags are automation-disabled under the 0.3