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.0.2",
"version": "3.1.0",
"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 @@ -120,7 +120,7 @@ jobs:
"$launcher" --project "$SCREENOTE_PROJECT" screenshot create \
--title "Agent plugin release probe" --page "ci-release-probe" \
--file "$integration_dir/capture.png" >"$integration_dir/capture.json"
"$launcher" --project "$SCREENOTE_PROJECT" page list --limit 100 --offset 0 >"$integration_dir/pages.json"
"$launcher" --project "$SCREENOTE_PROJECT" page list >"$integration_dir/pages.json"
"$launcher" --project "$SCREENOTE_PROJECT" screenshot list \
--page "$SCREENOTE_TEST_PAGE_ID" --limit 100 --offset 0 >"$integration_dir/screenshots.json"
"$launcher" --project "$SCREENOTE_PROJECT" annotation list \
Expand Down
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.0.2` | Stable | `skills/{screenote,snapshot,feedback}/SKILL.md` | CLI launcher, references, evals |
| Screenote | `3.1.0` | Stable | `skills/{screenote,snapshot,feedback}/SKILL.md` | CLI launcher, references, evals |

## Plugin invocations

Expand Down
12 changes: 12 additions & 0 deletions docs/screenote-cli-migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,18 @@ An ambiguous or inaccessible project stops. Interactive agents may show
accessible choices after a `missing_project` response; noninteractive runs do
not read stdin, prompt, guess, or launch a browser.

Capture and snapshot workflows may create a project when the input explicitly
requests an exact new name:

```bash
plugins/screenote/scripts/screenote-cli.sh project create --name rabata.io
```

The command deliberately rejects global `--project`. It uses user-scoped OAuth
authorization, returns the created project object, and never runs merely
because project resolution failed. Exact accessible matches are reused instead
of duplicated.

## JSON errors

| Exit | Error | Behavior |
Expand Down
3 changes: 2 additions & 1 deletion plugin-surfaces.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"minimum_release": null,
"approved_commands": [
["project", "list"],
["project", "create"],
["page", "list"],
["screenshot", "list"],
["screenshot", "create"],
Expand Down Expand Up @@ -208,7 +209,7 @@
{
"name": "screenote",
"path": "plugins/screenote",
"version": "3.0.2",
"version": "3.1.0",
"stability": "stable",
"metadata": {
"display_name": "Screenote",
Expand Down
38 changes: 21 additions & 17 deletions plugin-surfaces.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
"project",
"list"
],
[
"project",
"create"
],
[
"page",
"list"
Expand All @@ -34,7 +38,7 @@
]
],
"artifact": "plugins/screenote/scripts/screenote-approved-commands.sh",
"sha256": "18163fe9062ccb7250ec845b101b8f2084c50eb5fe5ea44a6bae980f9d22c54a"
"sha256": "e1ca68f4a7d55bba5f6325b68ef770aef52b33210347b101f31a26f5ac29cdfc"
},
"plugins": {
"agent-reviewer": {
Expand Down Expand Up @@ -845,27 +849,27 @@
}
},
"screenote": {
"version": "3.0.2",
"version": "3.1.0",
"canonical": {
"skills/screenote/SKILL.md": {
"sha256": "28ae0e482177daa54f3131213db1eaffce8eafc4d71008b116ebf6119df9258e",
"semantic_sha256": "ac6c122e1cc07b6b471fe25960eb388d12347dbdea8f4c95231f6bded3ba94fa",
"sha256": "118b0da106447ed69eba5343f5f730b5bcff1a087691af07eeb47b4f31bc9291",
"semantic_sha256": "5a3cfe3c9e550d70327832513a4caa656c949da4640f83ff6170ff7c514927d1",
"sections": {
"1:screenote — one-page visual review": "f2a3832ce0f91c507992d65ac8a5d9dc5362a8b42ddca0df021f1b82f46e29bc",
"1:screenote — one-page visual review": "37a69d0026e5d9f01b90e4a325920bf1ce411d42142a41f9c9ce9f36e58deca9",
"2:parse the request": "38485a573382dad4b7297c049ec4ee43e74be316bef5c3dba11b5abdb4ab3cf2",
"2:resolve a safe target": "329d16bfb9bfa3862ad531e0392ca12ead8ac4d58e175bbcf47abfb516d5be24",
"2:establish the cli and project": "6c66c3fe176811ab90a4106ba5080be0f4e81244fbf1ac904dbda9069ef2d190",
"2:establish the cli and project": "3e721f75c2d0227fb1522d224de9d573d31ad57480f33cfbece0e6b8d5cf0e2b",
"2:existing-image upload mode": "4aeda494603c2484d04bc02a6676c0c188ee851726d1b889ebd9f25c210aa12f",
"2:browser capture and upload mode": "b95ba86e59c30d6f0efde6f3cc460c7cdabd21509012fe065836c21ea904ee02",
"2:report and clean up": "38b91358340d6cc84e27ae602c0489b12b7e6c32062fa2ac2cde81cbb91dd910"
}
},
"skills/snapshot/SKILL.md": {
"sha256": "9880fb48fbfb11e1b3b75ce3d7e274c095cf1ecb8bf8fef80c1d6ac360046797",
"semantic_sha256": "d7314f2c8a0807e1c2f4f650e899d6050c8fd887d531ef43d5c9026f667a1cf5",
"sha256": "7fd2470860cdb8a1de036c1498dd051a94655ddbb2c668afee1100fa4c62c1ce",
"semantic_sha256": "08f65cf3ccfb978237d5b7c7ff1aebc65a56ab6aac665e91279ee3fcc17628a7",
"sections": {
"1:snapshot — multi-page visual review": "cc19b6e91862f2c785543aa5bc9223102b72305451981d73b487ea4970af27c1",
"2:preflight": "089c8c90cacb45fe3bb0320e7cc284fe7d3dbb18d3a1b91774b658abea47d279",
"1:snapshot — multi-page visual review": "cf0f569c8f218283f98815967f07a895c63f579c1359b4be5fb5543b15f0d11b",
"2:preflight": "4a0dd546789198a62058792ec0866f08ac3e9c65d35fc3d856b44a42479c5629",
"2:discover and confirm routes": "219ca5b16548cebf0204c299f51946b257eff32eee3c2c8f1bf7b1a55faf75bb",
"2:capture and publish": "81d60f088f7aeb3e4b7f7e96c50f1e4236ce5fbdea444c3beb243e2a102b06e1"
}
Expand All @@ -884,15 +888,15 @@
"resources": {
"references": {
"exists": true,
"sha256": "54c1794d0bf08f154d341987922890cede96e33f431141fb6f3765698d483647",
"sha256": "83c9cefcc74ff9ad3f6940fd34e6f73e9cc1b1fd10eda17d282ce8a870992cba",
"files": [
"references/cli.md",
"references/workflows.json"
]
},
"evals": {
"exists": true,
"sha256": "0ffe1e6d07882cbc11b5976ccefd6a5b87b66ba5574d71673922dc220fddb2aa",
"sha256": "dae11cf4ea1ce3dda00a8c08d742c89bb00afc2ef0c9dadc009fcc0e46718cff",
"files": [
"evals/README.md",
"evals/lint-skills-test.sh",
Expand All @@ -903,7 +907,7 @@
},
"scripts/screenote-cli.sh": {
"exists": true,
"sha256": "dd76457972f7426917763c635a2ed832ed4c9ed3ec8828b6aa41a3a93146fcd7"
"sha256": "9f54e4717158e2e9ec1485ed7c610951a671fbfaa688c201d82af127e6f29d41"
},
"scripts/screenote_flow.py": {
"exists": true,
Expand All @@ -914,7 +918,7 @@
"pi/skills/screenote/SKILL.md": {
"sha256": "6acc53b130d691fe0fe3288e2079904d52bbb76065b6620524cdcbad7f03be3f",
"canonical": "skills/screenote/SKILL.md",
"canonical_semantic_sha256": "ac6c122e1cc07b6b471fe25960eb388d12347dbdea8f4c95231f6bded3ba94fa",
"canonical_semantic_sha256": "5a3cfe3c9e550d70327832513a4caa656c949da4640f83ff6170ff7c514927d1",
"overlays": [
"frontmatter",
"invocation",
Expand All @@ -924,7 +928,7 @@
"openclaw/skills/screenote/SKILL.md": {
"sha256": "a8e0378d09299bc70297800080e348ad928ea914327b3a761ec5804a6a12f018",
"canonical": "skills/screenote/SKILL.md",
"canonical_semantic_sha256": "ac6c122e1cc07b6b471fe25960eb388d12347dbdea8f4c95231f6bded3ba94fa",
"canonical_semantic_sha256": "5a3cfe3c9e550d70327832513a4caa656c949da4640f83ff6170ff7c514927d1",
"overlays": [
"frontmatter",
"invocation",
Expand All @@ -934,7 +938,7 @@
"pi/skills/snapshot/SKILL.md": {
"sha256": "a7291d9e71b30e440a94b9b2d9d6e2cb001c9ff656fb2bc4e93c659325b4159d",
"canonical": "skills/snapshot/SKILL.md",
"canonical_semantic_sha256": "d7314f2c8a0807e1c2f4f650e899d6050c8fd887d531ef43d5c9026f667a1cf5",
"canonical_semantic_sha256": "08f65cf3ccfb978237d5b7c7ff1aebc65a56ab6aac665e91279ee3fcc17628a7",
"overlays": [
"frontmatter",
"invocation",
Expand All @@ -944,7 +948,7 @@
"openclaw/skills/snapshot/SKILL.md": {
"sha256": "d0bbf6f51de399d7b63fb0cd23ab1f1f097160d4dbe9dca7a0fa11c9e205b763",
"canonical": "skills/snapshot/SKILL.md",
"canonical_semantic_sha256": "d7314f2c8a0807e1c2f4f650e899d6050c8fd887d531ef43d5c9026f667a1cf5",
"canonical_semantic_sha256": "08f65cf3ccfb978237d5b7c7ff1aebc65a56ab6aac665e91279ee3fcc17628a7",
"overlays": [
"frontmatter",
"invocation",
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.0.2",
"version": "3.1.0",
"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.0.2",
"version": "3.1.0",
"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.0.2",
"version": "3.1.0",
"description": "Capture full-page browser snapshots and manage Screenote feedback through the OAuth CLI from Claude Code or Codex.",
"author": {
"name": "ivankuznetsov",
Expand Down
12 changes: 12 additions & 0 deletions plugins/screenote/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,18 @@

All notable changes to the Screenote plugin are documented here.

## [3.1.0] - 2026-07-31

### Added

- Create an exactly named Screenote project during capture or snapshot setup
when the user explicitly requests that mutation.

### Fixed

- Stop passing unsupported pagination flags to `page list` in the protected
integration workflow.

## [3.0.2] - 2026-07-31

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion plugins/screenote/evals/lint-skills.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ done

for tuple in \
'project list' \
'project create' \
'page list' \
'screenshot list' \
'screenshot create' \
Expand Down Expand Up @@ -79,7 +80,6 @@ for forbidden in \
'screenote_browser_use_mcp' \
'create_multi_viewport_screenshot' \
'annotation resolve' \
'project create' \
'snapshot --manifest' \
'--token'; do
if grep -R -n -i -F -- "$forbidden" "${active_files[@]}" >/dev/null 2>&1; then
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.0.2",
"version": "3.1.0",
"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.0.2",
"version": "3.1.0",
"type": "module",
"description": "Capture pages, publish screenshots, and retrieve visual feedback through the Screenote OAuth CLI.",
"homepage": "https://screenote.ai",
Expand Down
22 changes: 21 additions & 1 deletion plugins/screenote/references/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ accepts only these command tuples:
| Tuple | Purpose |
| --- | --- |
| `project list` | Validate authentication and accessible projects. |
| `project create` | Create one explicitly named project before capture or snapshot publication. |
| `page list` | List captured pages in the selected project. |
| `screenshot list` | List versions for a selected page. |
| `screenshot create` | Upload one user-approved local capture file. |
Expand All @@ -70,6 +71,24 @@ Do not maintain a plugin-owned project cache. Run `project list` before a
project-scoped flow and validate that the resolved project is accessible. An
ambiguous name, inaccessible id, or empty list is an error; never guess.

For `screenote` and `snapshot`, an interactive request that explicitly asks to
create an exact project name may run:

```text
screenote-cli.sh project create --name EXACT_NAME
```

Do not pass global `--project` to this command. Require exit zero plus a
`project` object containing an id and the exact requested name, then select the
returned id for the remaining project-scoped calls. If the exact name is
already accessible, select it and do not create a duplicate. A named but
missing destination without explicit create intent requires confirmation;
`missing_project`, an empty project list, an inferred repository name, and an
ambiguous name never authorize creation. Noninteractive creation requires an
exact name and an explicit create directive in its input. Project creation
requires user-scoped OAuth authorization; on exit 3, stop without trying a
project-scoped token or another auth mechanism.

Ordinary CLI commands are noninteractive. In an interactive agent session,
after a `missing_project` error, show the accessible projects and ask the user
which explicit `--project` to use. In a noninteractive run, never read stdin,
Expand All @@ -86,7 +105,8 @@ credential-shaped value before quoting surrounding prose.
`screenote --base-url https://screenote.ai login` for the hosted service;
noninteractively require `SCREENOTE_TOKEN`. Do not run login automatically.
- Exit 2 with `missing_project`: stop and explain the three project sources
above. Only an interactive agent may present accessible choices.
above. Only an interactive agent may present accessible choices; the error
alone never authorizes `project create`.
- Exit 3: stop and report invalid/expired authentication or authorization. Do
not retry with another auth mechanism.
- Every other nonzero exit, including not-found and rate-limit results: stop
Expand Down
7 changes: 7 additions & 0 deletions plugins/screenote/references/workflows.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@
"required_flags": [],
"paginated": false
},
"project create": {
"object": "project",
"required_flags": ["--name"],
"paginated": false
},
"page list": {
"collection": "pages",
"required_flags": [],
Expand Down Expand Up @@ -46,10 +51,12 @@
"screenote": {
"skill": "skills/screenote/SKILL.md",
"input_modes": ["browser_capture", "existing_image"],
"conditional_commands": ["project create"],
"ordered_commands": ["project list", "screenshot create"]
},
"snapshot": {
"skill": "skills/snapshot/SKILL.md",
"conditional_commands": ["project create"],
"ordered_commands": ["project list", "screenshot create"]
},
"feedback": {
Expand Down
2 changes: 2 additions & 0 deletions plugins/screenote/scripts/screenote-approved-commands.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
declare -ar SCREENOTE_APPROVED_COMMANDS=(
project
list
project
create
page
list
screenshot
Expand Down
11 changes: 11 additions & 0 deletions plugins/screenote/scripts/screenote-cli.sh
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ if [[ ${1-} == --check-contract ]]; then
}
required_flags=()
case "$noun $verb" in
'project create') required_flags=(--name) ;;
'screenshot list') required_flags=(--page --status --limit --offset) ;;
'screenshot create') required_flags=(--title --page --file) ;;
'annotation list') required_flags=(--screenshot --status --viewport --limit --offset) ;;
Expand All @@ -99,6 +100,7 @@ if [[ ${1-} == --check-contract ]]; then
fi

screenote_argv=()
project_was_supplied=false
while (($# > 0)); do
case "$1" in
--project)
Expand All @@ -107,6 +109,7 @@ while (($# > 0)); do
exit 64
fi
screenote_argv+=("$1" "$2")
project_was_supplied=true
shift 2
;;
*)
Expand All @@ -129,6 +132,14 @@ if ! screenote_command_is_approved "$noun" "$verb"; then
exit 64
fi

if [[ $noun == project && $verb == create ]]; then
if [[ $project_was_supplied == true ]] || (($# != 2)) ||
[[ $1 != --name || -z ${2//[[:space:]]/} || $2 == -* ]]; then
json_error '{"error":{"code":"invalid_arguments","message":"Project creation requires exactly: project create --name NAME, without a global --project."}}'
exit 64
fi
fi

for argument in "$@"; do
case "$argument" in
--project|--project=*)
Expand Down
Loading
Loading