Skip to content
This repository was archived by the owner on Apr 7, 2026. It is now read-only.

Commit eb9a80e

Browse files
committed
feat: dual-publish plugin-scanner and refresh ecosystem docs
Signed-off-by: Michael Kantor <6068672+kantorcodes@users.noreply.github.com>
1 parent 95afdd3 commit eb9a80e

File tree

4 files changed

+77
-53
lines changed

4 files changed

+77
-53
lines changed

.github/workflows/publish.yml

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ permissions:
2020
id-token: write
2121

2222
concurrency:
23-
group: codex-plugin-scanner-publish-${{ github.ref }}
23+
group: plugin-scanner-publish-${{ github.ref }}
2424
cancel-in-progress: false
2525

2626
jobs:
@@ -70,8 +70,12 @@ jobs:
7070
run: |
7171
sed -i "1,/^version = /{s/^version = .*/version = \"$VERSION\"/}" pyproject.toml
7272
sed -i "1,/^__version__ = /{s/^__version__ = .*/__version__ = \"$VERSION\"/}" src/codex_plugin_scanner/version.py
73-
- name: Build package
73+
- name: Build primary package (plugin-scanner)
7474
run: uv run --no-sync python -m build
75+
- name: Build legacy compatibility package (codex-plugin-scanner)
76+
run: |
77+
sed -i "1,/^name = /{s/^name = .*/name = \"codex-plugin-scanner\"/}" pyproject.toml
78+
uv run --no-sync python -m build
7579
- name: Verify distributions
7680
run: uv run --no-sync twine check dist/*
7781
- name: Upload artifacts
@@ -165,15 +169,19 @@ jobs:
165169
${LOG}
166170
167171
### Installation
172+
\`\`\`bash
173+
uv tool install plugin-scanner==${VERSION}
174+
\`\`\`
175+
168176
\`\`\`bash
169177
uv tool install codex-plugin-scanner==${VERSION}
170178
\`\`\`
171179
172180
\`\`\`bash
173-
docker pull ghcr.io/hashgraph-online/codex-plugin-scanner:${VERSION}
181+
docker pull ghcr.io/hashgraph-online/ai-plugin-scanner:${VERSION}
174182
\`\`\`
175183
176-
**Full Changelog**: https://github.com/hashgraph-online/codex-plugin-scanner/compare/${LAST_TAG}...v${VERSION}
184+
**Full Changelog**: https://github.com/hashgraph-online/ai-plugin-scanner/compare/${LAST_TAG}...v${VERSION}
177185
EOF
178186
179187
echo "notes_path=release-notes.md" >> $GITHUB_OUTPUT
@@ -212,7 +220,7 @@ jobs:
212220
env:
213221
VERSION: ${{ needs.build.outputs.version }}
214222
run: |
215-
cp "${{ steps.provenance.outputs.bundle-path }}" "dist/codex-plugin-scanner-v${VERSION}.intoto.jsonl"
223+
cp "${{ steps.provenance.outputs.bundle-path }}" "dist/plugin-scanner-v${VERSION}.intoto.jsonl"
216224
- name: Collect release asset files
217225
if: steps.release_exists.outputs.exists == 'false'
218226
id: release_assets

README.md

Lines changed: 48 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
# HOL Plugin Ecosystem Scanner
22

3-
[![PyPI Version](https://img.shields.io/pypi/v/codex-plugin-scanner.svg?logo=pypi&logoColor=white&cacheSeconds=300)](https://pypi.org/project/codex-plugin-scanner/)
4-
[![Python Versions](https://img.shields.io/pypi/pyversions/codex-plugin-scanner)](https://pypi.org/project/codex-plugin-scanner/)
5-
[![PyPI Downloads](https://img.shields.io/pypi/dm/codex-plugin-scanner)](https://pypistats.org/packages/codex-plugin-scanner)
6-
[![CI](https://github.com/hashgraph-online/codex-plugin-scanner/actions/workflows/ci.yml/badge.svg)](https://github.com/hashgraph-online/codex-plugin-scanner/actions/workflows/ci.yml)
7-
[![Publish](https://github.com/hashgraph-online/codex-plugin-scanner/actions/workflows/publish.yml/badge.svg)](https://github.com/hashgraph-online/codex-plugin-scanner/actions/workflows/publish.yml)
8-
[![Container Image](https://img.shields.io/badge/ghcr-codex--plugin--scanner-2496ED?logo=docker&logoColor=white)](https://github.com/hashgraph-online/codex-plugin-scanner/pkgs/container/codex-plugin-scanner)
9-
[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/hashgraph-online/codex-plugin-scanner/badge)](https://scorecard.dev/viewer/?uri=github.com/hashgraph-online/codex-plugin-scanner)
3+
[![PyPI Version](https://img.shields.io/pypi/v/plugin-scanner.svg?logo=pypi&logoColor=white&cacheSeconds=300)](https://pypi.org/project/plugin-scanner/)
4+
[![Legacy Namespace](https://img.shields.io/badge/legacy-codex--plugin--scanner-6b7280?logo=pypi&logoColor=white)](https://pypi.org/project/codex-plugin-scanner/)
5+
[![Python Versions](https://img.shields.io/pypi/pyversions/plugin-scanner)](https://pypi.org/project/plugin-scanner/)
6+
[![PyPI Downloads](https://img.shields.io/pypi/dm/plugin-scanner)](https://pypistats.org/packages/plugin-scanner)
7+
[![CI](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/ci.yml/badge.svg)](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/ci.yml)
8+
[![Publish](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/publish.yml/badge.svg)](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/publish.yml)
9+
[![Container Image](https://img.shields.io/badge/ghcr-ai--plugin--scanner-2496ED?logo=docker&logoColor=white)](https://github.com/hashgraph-online/ai-plugin-scanner/pkgs/container/ai-plugin-scanner)
10+
[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/hashgraph-online/ai-plugin-scanner/badge)](https://scorecard.dev/viewer/?uri=github.com/hashgraph-online/ai-plugin-scanner)
1011
[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](./LICENSE)
11-
[![GitHub Stars](https://img.shields.io/github/stars/hashgraph-online/codex-plugin-scanner?style=social)](https://github.com/hashgraph-online/codex-plugin-scanner/stargazers)
12+
[![GitHub Stars](https://img.shields.io/github/stars/hashgraph-online/ai-plugin-scanner?style=social)](https://github.com/hashgraph-online/ai-plugin-scanner/stargazers)
1213
[![Lint: ruff](https://img.shields.io/badge/lint-ruff-D7FF64.svg)](https://github.com/astral-sh/ruff)
1314

14-
| ![Hashgraph Online Logo](https://hol.org/brand/Logo_Whole_Dark.png) | **The default CI gate for Codex plugins**. Lint locally, verify in CI, and ship publish-ready bundles for manifests, skills, MCP, and marketplace metadata.<br><br>Use this after [`$plugin-creator`](https://developers.openai.com/codex/plugins) and before publishing, review, or distribution.<br><br>[PyPI Package](https://pypi.org/project/codex-plugin-scanner/)<br>[HOL Plugin Registry](https://hol.org/registry/plugins)<br>[HOL GitHub Organization](https://github.com/hashgraph-online)<br>[Report an Issue](https://github.com/hashgraph-online/codex-plugin-scanner/issues) |
15+
| ![Hashgraph Online Logo](https://hol.org/brand/Logo_Whole_Dark.png) | **The default CI gate for AI agent plugin ecosystems**. Lint locally, verify in CI, and ship publish-ready bundles for manifests, skills, MCP, and marketplace metadata across Codex, Claude, Gemini, and OpenCode.<br><br>Use this after scaffolding and before publishing, review, or distribution.<br><br>[PyPI Package (`plugin-scanner`)](https://pypi.org/project/plugin-scanner/)<br>[Legacy Namespace (`codex-plugin-scanner`)](https://pypi.org/project/codex-plugin-scanner/)<br>[HOL Plugin Registry](https://hol.org/registry/plugins)<br>[HOL GitHub Organization](https://github.com/hashgraph-online)<br>[Report an Issue](https://github.com/hashgraph-online/ai-plugin-scanner/issues) |
1516
| :--- | :--- |
1617

1718
## Start In 30 Seconds
1819

1920
```bash
20-
# Local preflight after scaffolding with $plugin-creator
21-
pipx run codex-plugin-scanner lint .
22-
pipx run codex-plugin-scanner verify .
21+
# Local preflight
22+
pipx run plugin-scanner lint .
23+
pipx run plugin-scanner verify .
2324
```
2425

2526
```yaml
@@ -36,7 +37,7 @@ If your repository uses a Codex marketplace root like `.agents/plugins/marketpla
3637

3738
## Use After `$plugin-creator`
3839

39-
`codex-plugin-scanner` is designed as the quality gate between plugin creation and distribution:
40+
`plugin-scanner` is designed as the quality gate between plugin creation and distribution:
4041

4142
1. Scaffold with `$plugin-creator`.
4243
2. Run `lint` locally to catch structure, metadata, and security issues early.
@@ -64,8 +65,8 @@ This keeps the quality grade and the trust score separate. Signals like `SECURIT
6465
## Quick Start For Contributors
6566

6667
```bash
67-
git clone https://github.com/hashgraph-online/codex-plugin-scanner.git
68-
cd codex-plugin-scanner
68+
git clone https://github.com/hashgraph-online/ai-plugin-scanner.git
69+
cd ai-plugin-scanner
6970
python -m venv .venv
7071
source .venv/bin/activate
7172
pip install -e ".[dev]"
@@ -75,32 +76,39 @@ pytest -q
7576
## Install
7677

7778
```bash
78-
pip install codex-plugin-scanner
79+
pip install plugin-scanner
7980
```
8081

8182
Cisco-backed skill scanning is optional:
8283

8384
```bash
84-
pip install "codex-plugin-scanner[cisco]"
85+
pip install "plugin-scanner[cisco]"
8586
```
8687

8788
The `cisco` extra installs the published `cisco-ai-skill-scanner` package from PyPI so the scanner remains publishable on PyPI and the optional Cisco analysis path works with standard package metadata.
8889

8990
You can also run the scanner without a local install:
9091

9192
```bash
92-
pipx run codex-plugin-scanner ./my-plugin
93+
pipx run plugin-scanner ./my-plugin
9394
```
9495

9596
Container-first environments can use the published image instead:
9697

9798
```bash
9899
docker run --rm \
99100
-v "$PWD:/workspace" \
100-
ghcr.io/hashgraph-online/codex-plugin-scanner:<version> \
101+
ghcr.io/hashgraph-online/ai-plugin-scanner:<version> \
101102
scan /workspace --format text
102103
```
103104

105+
Backward compatibility remains available for teams still pinned to the historical package namespace:
106+
107+
```bash
108+
pip install codex-plugin-scanner
109+
pipx run codex-plugin-scanner verify .
110+
```
111+
104112
## Ecosystem Support
105113

106114
| Ecosystem | Detection Surfaces |
@@ -114,7 +122,7 @@ Use `--ecosystem auto` (default) to scan all detected packages in a repository,
114122

115123
## What The Scanner Covers
116124

117-
`codex-plugin-scanner` supports a full quality suite:
125+
`plugin-scanner` supports a full quality suite:
118126

119127
- `scan` for full-surface security and publishability analysis
120128
- `lint` for rule-oriented authoring feedback
@@ -138,54 +146,54 @@ The scanner evaluates only the surfaces a plugin actually exposes, then normaliz
138146

139147
```bash
140148
# Scan a plugin directory
141-
codex-plugin-scanner ./my-plugin
149+
plugin-scanner ./my-plugin
142150
143151
# Auto-detect all supported ecosystems inside a repo (default)
144-
codex-plugin-scanner ./plugins-repo --ecosystem auto
152+
plugin-scanner ./plugins-repo --ecosystem auto
145153
146154
# Scan only Claude package surfaces
147-
codex-plugin-scanner ./plugins-repo --ecosystem claude
155+
plugin-scanner ./plugins-repo --ecosystem claude
148156
149157
# List supported ecosystems
150-
codex-plugin-scanner --list-ecosystems
158+
plugin-scanner --list-ecosystems
151159
152160
# Output JSON
153-
codex-plugin-scanner ./my-plugin --json
161+
plugin-scanner ./my-plugin --json
154162
155163
# Write a SARIF report for GitHub code scanning
156-
codex-plugin-scanner ./my-plugin --format sarif --output codex-plugin-scanner.sarif
164+
plugin-scanner ./my-plugin --format sarif --output plugin-scanner.sarif
157165
158166
# Fail CI on findings at or above high severity
159-
codex-plugin-scanner ./my-plugin --fail-on-severity high
167+
plugin-scanner ./my-plugin --fail-on-severity high
160168
161169
# Require Cisco skill scanning with a strict policy
162-
codex-plugin-scanner ./my-plugin --cisco-skill-scan on --cisco-policy strict
170+
plugin-scanner ./my-plugin --cisco-skill-scan on --cisco-policy strict
163171
```
164172

165173
## Quality Suite Commands
166174

167175
```bash
168176
# Summary scan (legacy form still works)
169-
codex-plugin-scanner scan ./my-plugin --format json --profile public-marketplace
177+
plugin-scanner scan ./my-plugin --format json --profile public-marketplace
170178
171179
# Scan a multi-plugin repo from the marketplace root
172-
codex-plugin-scanner scan . --format json
180+
plugin-scanner scan . --format json
173181
174182
# Rule-oriented lint (with optional mechanical fixes)
175-
codex-plugin-scanner lint ./my-plugin --list-rules
176-
codex-plugin-scanner lint ./my-plugin --explain README_MISSING
177-
codex-plugin-scanner lint ./my-plugin --fix --profile strict-security
183+
plugin-scanner lint ./my-plugin --list-rules
184+
plugin-scanner lint ./my-plugin --explain README_MISSING
185+
plugin-scanner lint ./my-plugin --fix --profile strict-security
178186
179187
# Runtime readiness verification
180-
codex-plugin-scanner verify ./my-plugin --format json
181-
codex-plugin-scanner verify . --format json
182-
codex-plugin-scanner verify ./my-plugin --online --format text
188+
plugin-scanner verify ./my-plugin --format json
189+
plugin-scanner verify . --format json
190+
plugin-scanner verify ./my-plugin --online --format text
183191
184192
# Artifact-backed submission gate
185-
codex-plugin-scanner submit ./my-plugin --profile public-marketplace --attest dist/plugin-quality.json
193+
plugin-scanner submit ./my-plugin --profile public-marketplace --attest dist/plugin-quality.json
186194
187195
# Diagnostic bundle
188-
codex-plugin-scanner doctor ./my-plugin --component mcp --bundle dist/doctor.zip
196+
plugin-scanner doctor ./my-plugin --component mcp --bundle dist/doctor.zip
189197
```
190198

191199
## Codex Spec Alignment
@@ -219,7 +227,7 @@ severity_overrides = { CODEXIGNORE_MISSING = "low" }
219227
## Example Output
220228

221229
```text
222-
🔗 Codex Plugin Scanner v2.0.0
230+
🔗 Plugin Scanner v2.0.0
223231
Scanning: ./my-plugin
224232
225233
── Manifest Validation (31/31) ──
@@ -480,7 +488,7 @@ The [HOL Registry Broker Codex Plugin](https://github.com/hashgraph-online/regis
480488
HOL Registry scores: **Trust 80** / **Review 83** / **Enforce 74**
481489

482490
```text
483-
🔗 Codex Plugin Scanner v2.0.0
491+
🔗 Plugin Scanner v2.0.0
484492
Scanning: ./registry-broker-codex-plugin
485493
486494
── Manifest Validation (31/31) ──

pyproject.toml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ requires = ["hatchling"]
33
build-backend = "hatchling.build"
44

55
[project]
6-
name = "codex-plugin-scanner"
6+
name = "plugin-scanner"
77
version = "2.0.0"
88
description = "Security, operational-security, and publishability scanner for Codex, Claude, Gemini, and OpenCode plugin ecosystems."
99
readme = "README.md"
@@ -12,7 +12,7 @@ requires-python = ">=3.10"
1212
authors = [
1313
{ name = "Hashgraph Online", email = "dev@hol.org" },
1414
]
15-
keywords = ["codex", "plugin", "scanner", "security", "mcp", "cli"]
15+
keywords = ["plugin", "scanner", "security", "mcp", "cli", "codex", "claude", "gemini", "opencode", "ecosystem"]
1616
classifiers = [
1717
"Development Status :: 5 - Production/Stable",
1818
"Environment :: Console",
@@ -49,13 +49,14 @@ publish = [
4949
]
5050

5151
[project.scripts]
52+
plugin-scanner = "codex_plugin_scanner.cli:main"
5253
codex-plugin-scanner = "codex_plugin_scanner.cli:main"
5354
plugin-ecosystem-scanner = "codex_plugin_scanner.cli:main"
5455

5556
[project.urls]
56-
Homepage = "https://github.com/hashgraph-online/codex-plugin-scanner"
57-
Repository = "https://github.com/hashgraph-online/codex-plugin-scanner"
58-
Issues = "https://github.com/hashgraph-online/codex-plugin-scanner/issues"
57+
Homepage = "https://github.com/hashgraph-online/ai-plugin-scanner"
58+
Repository = "https://github.com/hashgraph-online/ai-plugin-scanner"
59+
Issues = "https://github.com/hashgraph-online/ai-plugin-scanner/issues"
5960

6061
[tool.ruff]
6162
target-version = "py310"

tests/test_action_bundle.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,19 @@ def test_publish_workflow_attaches_marketplace_action_bundle() -> None:
8787
assert """printf '%s\\n' "${VERSION}" > "${BUNDLE_ROOT}/scanner-version.txt" """[:-1] in workflow_text
8888
assert 'cp action/cisco-version.txt "${BUNDLE_ROOT}/cisco-version.txt"' in workflow_text
8989
assert 'cp action/pypi-attestations-version.txt "${BUNDLE_ROOT}/pypi-attestations-version.txt"' in workflow_text
90-
assert "dist/codex-plugin-scanner-v${VERSION}.intoto.jsonl" in workflow_text
90+
assert "dist/plugin-scanner-v${VERSION}.intoto.jsonl" in workflow_text
9191
assert "Collect release asset files" in workflow_text
9292
assert "find dist -maxdepth 1 -type f -print0 | sort -z" in workflow_text
9393
assert 'mapfile -t RELEASE_ASSETS <<\'EOF\'' in workflow_text
9494
assert '"${RELEASE_ASSETS[@]}"' in workflow_text
9595
assert "subject-path: |" in workflow_text
9696
assert "dist/*" in workflow_text
97-
assert "docker pull ghcr.io/hashgraph-online/codex-plugin-scanner:${VERSION}" in workflow_text
97+
assert "Build legacy compatibility package (codex-plugin-scanner)" in workflow_text
98+
assert "codex-plugin-scanner" in workflow_text
99+
assert "uv tool install plugin-scanner==${VERSION}" in workflow_text
100+
assert "uv tool install codex-plugin-scanner==${VERSION}" in workflow_text
101+
assert "docker pull ghcr.io/hashgraph-online/ai-plugin-scanner:${VERSION}" in workflow_text
102+
assert "dist/plugin-scanner-v${VERSION}.intoto.jsonl" in workflow_text
98103
assert "publish-container:" in workflow_text
99104
assert "packages: write" in workflow_text
100105
assert "docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2" in workflow_text
@@ -184,7 +189,9 @@ def test_readme_uses_stable_apache_license_badge() -> None:
184189
assert "https://img.shields.io/github/license/hashgraph-online/codex-plugin-scanner" not in readme
185190
assert "publish-action-repo.yml" in readme
186191
assert "docs/github-action-marketplace.md" not in readme
187-
assert "ghcr.io/hashgraph-online/codex-plugin-scanner:<version>" in readme
192+
assert "ghcr.io/hashgraph-online/ai-plugin-scanner:<version>" in readme
193+
assert "https://pypi.org/project/plugin-scanner/" in readme
194+
assert "https://pypi.org/project/codex-plugin-scanner/" in readme
188195
assert "Container Image" in readme
189196

190197

0 commit comments

Comments
 (0)