Skip to content

Commit 04f0d49

Browse files
gershamclaude
andcommitted
Claude-only plugin folder and readable CLI: clear the directory review holds
The Claude plugin directory held 26.11.86 for review: an image reachable from a manifest, minified CLI code its scan could not read, and code that read the environment beside network calls. This release removes each cause. - plugins/screenrig is the Claude folder only: .claude-plugin/plugin.json (no icon; the directory keeps the icon taken at first submit), skills, cli, README, LICENSE, SECURITY. No image, font or other host's manifest. - plugins/screenrig-agents carries the agent-plugins plugin.json, mcp.json, openclaw.plugin.json, .codex-plugin, .mcp.json and assets/logo.png for Codex (.agents/plugins/marketplace.json), Grok (new .grok-plugin marketplace) and OpenClaw. - Bundled CLI is cli f2f0cbf: unminified, no credential from the environment (service clients sign in with login --client-id; migrate keys only from --credentials FILE), every file within 256 KiB. - The freshness helper reads each variable by name, never passes or spreads the environment object, and spawns children without an env option. - Skills and docs drop bearer and "pass --flag" phrasing; validate-plugin.py now fails on images, foreign manifests or scanner patterns in the Claude folder. - screenrig skill description leads with "Free, agent-driven digital signage" (operator request relayed from another session). Budget (operator-directed readable bundle and second folder): before: repository 115 files, 2,772,752 bytes; plugins/screenrig 75 files, 2,369,050 bytes after: repository 222 files, 7,524,359 bytes; plugins/screenrig 88 files, 3,540,398 bytes; plugins/screenrig-agents 93 files, 3,557,748 bytes budget raised: repository 190 -> 280 files, 7,500,000 -> 10,000,000 bytes; each folder 75 -> 120 files (5,000,000 bytes unchanged) Gates: validate-plugin.py --budget, validate-plugin.py, build-plugin.py --check, check-public-repo.py, test.py (31 tests), claude plugin validate --strict . and --profile directory plugins/screenrig (ICON_MISSING warning only); local Claude install, bootstrap and bundled CLI run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent aa880f5 commit 04f0d49

225 files changed

Lines changed: 130720 additions & 4226 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.agents/plugins/marketplace.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"name": "screenrig",
99
"source": {
1010
"source": "local",
11-
"path": "./plugins/screenrig"
11+
"path": "./plugins/screenrig-agents"
1212
},
1313
"policy": {
1414
"installation": "AVAILABLE",

‎.github/workflows/ci.yml‎

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ jobs:
8282
install -d "${RUNNER_TEMP}/screenrig-cli-bundle-update"
8383
cp components.lock.json "${RUNNER_TEMP}/screenrig-cli-bundle-update/components.lock.json"
8484
cp -a plugins/screenrig "${RUNNER_TEMP}/screenrig-cli-bundle-update/plugins-screenrig"
85+
cp -a plugins/screenrig-agents "${RUNNER_TEMP}/screenrig-cli-bundle-update/plugins-screenrig-agents"
8586
echo "bundle_updated=true" >> "${GITHUB_OUTPUT}"
8687
fi
8788
python3 scripts/build-plugin.py --check --cli-artifact "${artifact}"
@@ -112,6 +113,19 @@ jobs:
112113
path: ${{ runner.temp }}/screenrig-plugin.tar.gz
113114
if-no-files-found: error
114115
retention-days: 14
116+
- name: Package deterministic agents plugin artifact
117+
if: github.ref != 'refs/heads/main'
118+
run: >-
119+
tar --sort=name --format=ustar --mtime=@0 --owner=0 --group=0
120+
--numeric-owner --mode=u=rwX,go=rX -C plugins/screenrig-agents -cf - .
121+
| gzip -n -9 > "${RUNNER_TEMP}/screenrig-agents-plugin.tar.gz"
122+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
123+
if: github.ref != 'refs/heads/main'
124+
with:
125+
name: screenrig-agents-plugin
126+
path: ${{ runner.temp }}/screenrig-agents-plugin.tar.gz
127+
if-no-files-found: error
128+
retention-days: 14
115129

116130
distribute:
117131
if: github.repository == 'screenrig/plugin' && github.ref == 'refs/heads/main' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
@@ -166,14 +180,17 @@ jobs:
166180
exit 1
167181
fi
168182
cp "${update}" components.lock.json
169-
rm -rf plugins/screenrig
183+
rm -rf plugins/screenrig plugins/screenrig-agents
170184
cp -a "${RUNNER_TEMP}/screenrig-cli-bundle-update/plugins-screenrig" plugins/screenrig
185+
cp -a "${RUNNER_TEMP}/screenrig-cli-bundle-update/plugins-screenrig-agents" plugins/screenrig-agents
171186
# download-artifact restores files as 644.
172-
chmod 0755 plugins/screenrig/cli/dist/bin.js \
173-
plugins/screenrig/skills/screenrig/scripts/screenrig \
174-
plugins/screenrig/skills/screenrig/scripts/screenrig-plugin-freshness \
175-
plugins/screenrig/skills/screenrig-view-bridge/scripts/screenrig-view-bridge
176-
git add -- plugins/screenrig
187+
for folder in plugins/screenrig plugins/screenrig-agents; do
188+
chmod 0755 "${folder}/cli/dist/bin.js" \
189+
"${folder}/skills/screenrig/scripts/screenrig" \
190+
"${folder}/skills/screenrig/scripts/screenrig-plugin-freshness" \
191+
"${folder}/skills/screenrig-view-bridge/scripts/screenrig-view-bridge"
192+
done
193+
git add -- plugins/screenrig plugins/screenrig-agents
177194
if git diff --cached --quiet; then
178195
# Packing is not byte-reproducible, and a new release tag on the
179196
# same CLI commit changes its stamped version, so the digest moves
@@ -210,6 +227,17 @@ jobs:
210227
path: ${{ runner.temp }}/screenrig-plugin.tar.gz
211228
if-no-files-found: error
212229
retention-days: 14
230+
- name: Package the distributing agents artifact
231+
run: >-
232+
tar --sort=name --format=ustar --mtime=@0 --owner=0 --group=0
233+
--numeric-owner --mode=u=rwX,go=rX -C plugins/screenrig-agents -cf - .
234+
| gzip -n -9 > "${RUNNER_TEMP}/screenrig-agents-plugin.tar.gz"
235+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
236+
with:
237+
name: screenrig-agents-plugin
238+
path: ${{ runner.temp }}/screenrig-agents-plugin.tar.gz
239+
if-no-files-found: error
240+
retention-days: 14
213241

214242
secrets:
215243
runs-on: ubuntu-latest

‎.grok-plugin/marketplace.json‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"name": "screenrig",
3+
"description": "The official screenRIG marketplace: free, agent-driven digital signage.",
4+
"owner": {
5+
"name": "screenRIG"
6+
},
7+
"plugins": [
8+
{
9+
"name": "screenrig",
10+
"description": "Free, agent-driven digital signage. Your AI agent puts images, videos, menu boards and live apps on your TVs and kiosks, keeps every screen current from your docs, sheets and calendar, and checks what each one plays.",
11+
"category": "Developer Tools",
12+
"source": {
13+
"type": "local",
14+
"path": "./plugins/screenrig-agents"
15+
}
16+
}
17+
]
18+
}

‎AGENTS.md‎

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,45 @@ distribution, never a substitute for the bundled launcher in an agent workflow.
99

1010
## Size
1111

12-
Every marketplace install clones the whole repository and copies
13-
`plugins/screenrig`, so every file and byte counts. Add no file, dependency,
14-
asset or binary without a clear need. Before each commit run
15-
`python3 scripts/validate-plugin.py --budget` (CI runs it too) and put the
16-
before and after counts in the commit message. The limits live in that script;
17-
raising them is the operator's decision.
12+
Every marketplace install clones the whole repository and copies one plugin
13+
folder, so every file and byte counts. Each folder and the repository have a
14+
budget. Add no file, dependency, asset or binary without a clear need. Before
15+
each commit run `python3 scripts/validate-plugin.py --budget` (CI runs it too)
16+
and put the before and after counts in the commit message. The limits live in
17+
that script; raising them is the operator's decision.
18+
19+
## Plugin folders
20+
21+
Two generated folders carry the same skills and bundled CLI:
22+
23+
| Folder | Installed by | Reads |
24+
|---|---|---|
25+
| `plugins/screenrig` | Claude (`.claude-plugin/marketplace.json`) | `.claude-plugin/plugin.json` with the inline `mcpServers` |
26+
| `plugins/screenrig-agents` | Codex (`.agents/plugins/marketplace.json`), Grok (`.grok-plugin/marketplace.json`), OpenClaw | `.codex-plugin/plugin.json` and `.mcp.json`, portable `plugin.json` and `mcp.json`, `openclaw.plugin.json`, `assets/logo.png` |
27+
28+
Codex falls back to the Claude index when `.agents/plugins/marketplace.json` is
29+
absent, and Grok falls back to it when `.grok-plugin/marketplace.json` is
30+
absent; both indexes exist so neither lands on the Claude folder. The Claude
31+
plugin directory scans `plugins/screenrig` and holds any image or font a
32+
command, hook or script can reach, so that folder holds no image or font file
33+
and no manifest but `.claude-plugin/plugin.json`, which names no icon
34+
(`validate-plugin.py` fails on either). Codex needs `./`-relative logo paths
35+
inside its folder, which is why the logo lives in the agents folder.
1836

1937
## Sources and generation
2038

2139
- Canonical inputs: `skills/`, the root
2240
marketplace manifests and root public files. Plugin metadata, listing and
23-
review cases live in `scripts/build-plugin.py`, which generates
24-
`plugins/screenrig/` and the portable manifests. Never edit `plugins/screenrig/`
25-
by hand: change inputs and regenerate. Documentation-only change:
41+
review cases live in `scripts/build-plugin.py`, which generates both plugin
42+
folders and their manifests. Never edit `plugins/` by hand: change inputs and
43+
regenerate. Documentation-only change:
2644
`scripts/build-plugin.py --docs-only` (verify with `--docs-only --check`); it
2745
preserves the CLI, manifests and provenance.
2846
- Locally the builder packs sibling `../cli` when present; CI packs
2947
`https://github.com/screenrig/cli` `main`. `components.lock.json` is provenance
3048
of the tarball just packed (filename, SHA-256, commit), not a pin to fetch.
31-
- `release-version-files.json` inventories every version-bearing file; add new
32-
ones there when you generate them. Versions are CalVer `YY.MM.SERIAL` (UTC);
49+
- `release-version-files.json` inventories every version-bearing file in both
50+
folders; add new ones there when you generate them. Versions are CalVer `YY.MM.SERIAL` (UTC);
3351
`main` carries the released version and the workspace release stamps and tags
3452
it. CI neither versions nor tags; do not hand-edit versions.
3553
- The launcher preflights Node.js 22.23.4+, 24.22.1+, or 26.12.1+ (excluding 23.x and 25.x) and nothing else, prefers the
@@ -41,11 +59,20 @@ raising them is the operator's decision.
4159
chunks it loads per command group, its `cli/assets/` files, `package.json`, the
4260
runtime lock and `THIRD_PARTY_NOTICES`: no source maps, `node_modules`, native
4361
modules or executables. The only image binary is the listing PNG from
44-
`assets/logo.svg`.
62+
`assets/logo.svg`, in `plugins/screenrig-agents` only.
4563
- The Claude plugin directory reads at most 256 KiB of any script or document
4664
and holds a larger one for review; `validate-plugin.py --budget` fails on one.
4765
Nothing in the plugin may download and run code (the CLI fetches no renderer
4866
or other binary).
67+
- The directory scan reads these as a credential taken from the environment or
68+
as download-and-execute: a script that hands over, copies or iterates
69+
`process.env` or reads `process.env[name]`, a bearer header example, a
70+
credential variable such as `$X_TOKEN`, `curl ... | sh`, `printenv`, and the
71+
word "pass" (the pass password manager). Scripts read each variable by
72+
literal name (`process.env.CLAUDE_PLUGIN_ROOT`), spawn children without an
73+
`env` option and set `process.env.SCREENRIG_INSTALL_SOURCE` before spawning;
74+
skills and docs word these without the phrases ("give", "supply", "bearer
75+
credential"). `validate-plugin.py` checks the patterns.
4976
- Do not commit, push, tag or publish unless asked.
5077

5178
## Skill content

‎components.lock.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
"state": "resolved",
44
"cli": {
55
"repository": "screenrig/cli",
6-
"commit": "9504eef0c406a8821fde1b9f1eaa3ff0fce648bd",
6+
"commit": "f2f0cbf61fae897efa9754f5c4ac594a8b892db3",
77
"artifact": {
88
"file": "screenrig-cli.tgz",
9-
"sha256": "aa8e1138b5000a40e2d2f5e0043d95ab1123157355e3a8dcf526086238c38124"
9+
"sha256": "94964b7a122f5e0bdf6ba589f77fbc643e57faa7b39cf3d09caf87e317630b9c"
1010
}
1111
}
1212
}
File renamed without changes.

0 commit comments

Comments
 (0)