Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/agent-platforms.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: |
Expand Down
2 changes: 1 addition & 1 deletion RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
2 changes: 1 addition & 1 deletion docs/agent-compatibility.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
8 changes: 4 additions & 4 deletions docs/screenote-cli-migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
```

Expand Down
10 changes: 5 additions & 5 deletions plugin-surfaces.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"],
Expand Down Expand Up @@ -210,7 +210,7 @@
{
"name": "screenote",
"path": "plugins/screenote",
"version": "3.2.0",
"version": "3.2.1",
"stability": "stable",
"metadata": {
"display_name": "Screenote",
Expand Down
8 changes: 4 additions & 4 deletions plugin-surfaces.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -853,7 +853,7 @@
}
},
"screenote": {
"version": "3.2.0",
"version": "3.2.1",
"canonical": {
"skills/screenote/SKILL.md": {
"sha256": "0dd17ee55e234d8e0e92db3c9d991a1f69a5837d6af785e07dcad19b1df23d8a",
Expand Down Expand Up @@ -893,15 +893,15 @@
"resources": {
"references": {
"exists": true,
"sha256": "bdc193fa70a54038a311bd3416d3e0c833d82117cc5fe7333314d93f2fd90343",
"sha256": "59612d94d7e0e3d5a2b4a5a057ba3e40c39f8eadc55950899f6d5034db1b5a34",
"files": [
"references/cli.md",
"references/workflows.json"
]
},
"evals": {
"exists": true,
"sha256": "6638fbb57b71f9df30c5755f0f87315a9cd4a9a8b7de9fab3c985afc03709d74",
"sha256": "0454e8745544da59deb7a8bebf0f61c65757ace381c8690e671508c3b14517ed",
"files": [
"evals/README.md",
"evals/lint-skills-test.sh",
Expand All @@ -912,7 +912,7 @@
},
"scripts/screenote-cli.sh": {
"exists": true,
"sha256": "21fa315da3b9694514a0deec746c4b35fedbdd3154867a08f3d8d028203f9760"
"sha256": "ee205934229c5d7e0c4e05cb95ba2ef1d14e1de56f9b2143b913b0d47be8e8c3"
},
"scripts/screenote_flow.py": {
"exists": true,
Expand Down
2 changes: 1 addition & 1 deletion plugins/screenote/.claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
},
Expand Down
2 changes: 1 addition & 1 deletion plugins/screenote/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
2 changes: 1 addition & 1 deletion plugins/screenote/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
4 changes: 4 additions & 0 deletions plugins/screenote/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions plugins/screenote/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions plugins/screenote/evals/lint-skills.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
2 changes: 1 addition & 1 deletion plugins/screenote/evals/validate-plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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", {})
Expand Down
2 changes: 1 addition & 1 deletion plugins/screenote/openclaw.plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
],
Expand Down
2 changes: 1 addition & 1 deletion plugins/screenote/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
8 changes: 4 additions & 4 deletions plugins/screenote/references/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions plugins/screenote/references/workflows.json
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
2 changes: 1 addition & 1 deletion plugins/screenote/scripts/screenote-cli.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
17 changes: 14 additions & 3 deletions tests/test_screenote_cli_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"]}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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:
Expand Down
10 changes: 5 additions & 5 deletions wiki/dependencies.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
10 changes: 10 additions & 0 deletions wiki/log.d/20260904T215117Z-screenote-321-release.md
Original file line number Diff line number Diff line change
@@ -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.
5 changes: 4 additions & 1 deletion wiki/plugins.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/<name>` directory. Every copied package is complete;
Expand All @@ -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
Expand Down
Loading