plugin-scanner 2.0.1__tar.gz → 2.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/publish.yml +13 -3
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/PKG-INFO +86 -23
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/README.md +84 -21
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/guard/architecture.md +11 -2
- plugin_scanner-2.0.3/docs/guard/get-started.md +82 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/guard/local-vs-cloud.md +3 -3
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/guard/testing-matrix.md +15 -5
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/pyproject.toml +13 -2
- plugin_scanner-2.0.3/pyproject.toml.bak +85 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/cli.py +26 -6
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/base.py +7 -4
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/claude_code.py +36 -5
- plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/cli/__init__.py +5 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/cli/commands.py +92 -12
- plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/cli/product.py +190 -0
- plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/cli/prompt.py +342 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/cli/render.py +75 -2
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/consumer/service.py +8 -1
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/models.py +2 -1
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/runtime/runner.py +11 -1
- plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/shims.py +95 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/store.py +56 -9
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/version.py +1 -1
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_action_bundle.py +18 -19
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_ecosystems.py +1 -3
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_guard_cli.py +46 -5
- plugin_scanner-2.0.3/tests/test_guard_launch_env.py +78 -0
- plugin_scanner-2.0.3/tests/test_guard_product_flow.py +322 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_guard_runtime.py +100 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_trust_scoring.py +3 -9
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/uv.lock +42 -42
- plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/cli/__init__.py +0 -5
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.dockerignore +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/dependabot.yml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/ci.yml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/codeql.yml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/e2e-test.yml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/publish-action-repo.yml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/scorecard.yml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.gitignore +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/Dockerfile +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/LICENSE +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/SECURITY.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/README.legacy.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/README.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/action.yml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/cisco-version.txt +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/pypi-attestations-version.txt +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/scanner-version.txt +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/guard/harness-support.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/guard/repo-boundaries.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/config.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test-trust-scoring.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test-trust-specs.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_cli.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_coverage_remaining.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_edge_cases.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_integration.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_live_cisco_smoke.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_scanner.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_skill_security.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_submission.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_versioning.py +0 -0
|
@@ -20,7 +20,7 @@ permissions:
|
|
|
20
20
|
id-token: write
|
|
21
21
|
|
|
22
22
|
concurrency:
|
|
23
|
-
group:
|
|
23
|
+
group: hol-guard-publish-${{ github.ref }}
|
|
24
24
|
cancel-in-progress: false
|
|
25
25
|
|
|
26
26
|
jobs:
|
|
@@ -70,9 +70,15 @@ jobs:
|
|
|
70
70
|
run: |
|
|
71
71
|
sed -i "1,/^version = /{s/^version = .*/version = \"$VERSION\"/}" pyproject.toml
|
|
72
72
|
sed -i "1,/^__version__ = /{s/^__version__ = .*/__version__ = \"$VERSION\"/}" src/codex_plugin_scanner/version.py
|
|
73
|
-
- name: Build primary package (
|
|
73
|
+
- name: Build primary package (hol-guard)
|
|
74
74
|
run: uv run --no-sync python -m build
|
|
75
|
-
- name: Build
|
|
75
|
+
- name: Build compatibility package (plugin-scanner)
|
|
76
|
+
run: |
|
|
77
|
+
cp pyproject.toml pyproject.toml.bak
|
|
78
|
+
sed -i "1,/^name = /{s/^name = .*/name = \"plugin-scanner\"/}" pyproject.toml
|
|
79
|
+
uv run --no-sync python -m build
|
|
80
|
+
mv pyproject.toml.bak pyproject.toml
|
|
81
|
+
- name: Build compatibility package (codex-plugin-scanner)
|
|
76
82
|
run: |
|
|
77
83
|
cp pyproject.toml pyproject.toml.bak
|
|
78
84
|
sed -i "1,/^name = /{s/^name = .*/name = \"codex-plugin-scanner\"/}" pyproject.toml
|
|
@@ -171,6 +177,10 @@ jobs:
|
|
|
171
177
|
${LOG}
|
|
172
178
|
|
|
173
179
|
### Installation
|
|
180
|
+
\`\`\`bash
|
|
181
|
+
uv tool install hol-guard==${VERSION}
|
|
182
|
+
\`\`\`
|
|
183
|
+
|
|
174
184
|
\`\`\`bash
|
|
175
185
|
uv tool install plugin-scanner==${VERSION}
|
|
176
186
|
\`\`\`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plugin-scanner
|
|
3
|
-
Version: 2.0.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 2.0.3
|
|
4
|
+
Summary: Protect local AI harnesses with HOL Guard and run scanner checks for Codex, Claude, Cursor, Gemini, and OpenCode.
|
|
5
5
|
Project-URL: Homepage, https://github.com/hashgraph-online/ai-plugin-scanner
|
|
6
6
|
Project-URL: Repository, https://github.com/hashgraph-online/ai-plugin-scanner
|
|
7
7
|
Project-URL: Issues, https://github.com/hashgraph-online/ai-plugin-scanner/issues
|
|
@@ -33,12 +33,12 @@ Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
|
33
33
|
Requires-Dist: ruff>=0.4.0; extra == 'dev'
|
|
34
34
|
Description-Content-Type: text/markdown
|
|
35
35
|
|
|
36
|
-
# HOL
|
|
36
|
+
# HOL Guard
|
|
37
37
|
|
|
38
|
-
[](https://pypi.org/project/hol-guard/)
|
|
39
|
+
[](https://pypi.org/project/plugin-scanner/)
|
|
40
|
+
[](https://pypi.org/project/hol-guard/)
|
|
41
|
+
[](https://pypistats.org/packages/hol-guard)
|
|
42
42
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/ci.yml)
|
|
43
43
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/publish.yml)
|
|
44
44
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/pkgs/container/ai-plugin-scanner)
|
|
@@ -47,15 +47,56 @@ Description-Content-Type: text/markdown
|
|
|
47
47
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/stargazers)
|
|
48
48
|
[](https://github.com/astral-sh/ruff)
|
|
49
49
|
|
|
50
|
-
|  | **
|
|
50
|
+
|  | **Protect Codex, Claude Code, Cursor, Gemini, and OpenCode before local tools run.** HOL Guard watches the tools wired into your harness, shows you what changed, and records what you approved or blocked. The scanner commands stay available for teams that also want linting and CI checks for plugin, skill, MCP, and marketplace packages.<br><br>Start with `hol-guard` if you want local protection. Add the scanner commands later if you also publish or review packages in CI.<br><br>[PyPI Package (`hol-guard`)](https://pypi.org/project/hol-guard/)<br>[Legacy Namespace (`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) |
|
|
51
51
|
| :--- | :--- |
|
|
52
52
|
|
|
53
|
-
##
|
|
53
|
+
## Protect A Harness In 60 Seconds
|
|
54
54
|
|
|
55
55
|
```bash
|
|
56
|
-
#
|
|
57
|
-
pipx run
|
|
58
|
-
|
|
56
|
+
# See what Guard found on this machine
|
|
57
|
+
pipx run hol-guard start
|
|
58
|
+
|
|
59
|
+
# Install Guard in front of Codex
|
|
60
|
+
pipx run hol-guard install codex
|
|
61
|
+
|
|
62
|
+
# Record the current tool state once
|
|
63
|
+
pipx run hol-guard run codex --dry-run
|
|
64
|
+
|
|
65
|
+
# Launch through Guard after that
|
|
66
|
+
pipx run hol-guard run codex
|
|
67
|
+
|
|
68
|
+
# Check what Guard approved or blocked
|
|
69
|
+
pipx run hol-guard receipts
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
How Guard works:
|
|
73
|
+
|
|
74
|
+
1. find the harnesses on your machine
|
|
75
|
+
2. install a Guard launcher in front of the one you use
|
|
76
|
+
3. record the current tool state once
|
|
77
|
+
4. let Guard stop and review new or changed tools before launch
|
|
78
|
+
5. check receipts locally
|
|
79
|
+
6. connect sync later only if you want shared history
|
|
80
|
+
|
|
81
|
+
Start here if you are trying to stay safe inside a harness:
|
|
82
|
+
|
|
83
|
+
- `hol-guard start` shows the first steps
|
|
84
|
+
- `hol-guard status` shows what Guard is watching now
|
|
85
|
+
- `hol-guard install <harness>` creates the launcher
|
|
86
|
+
- `hol-guard run <harness> --dry-run` records the current state
|
|
87
|
+
- `hol-guard run <harness>` reviews changes before launch
|
|
88
|
+
- `hol-guard diff <harness>` shows what changed
|
|
89
|
+
- `hol-guard receipts` shows local history
|
|
90
|
+
|
|
91
|
+
See [docs/guard/get-started.md](docs/guard/get-started.md) for the full local flow.
|
|
92
|
+
|
|
93
|
+
## Use The Scanner In CI
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Install the package once, then use the scanner commands in your shell
|
|
97
|
+
pipx install hol-guard
|
|
98
|
+
plugin-scanner lint .
|
|
99
|
+
plugin-scanner verify .
|
|
59
100
|
```
|
|
60
101
|
|
|
61
102
|
```yaml
|
|
@@ -70,18 +111,30 @@ pipx run plugin-scanner verify .
|
|
|
70
111
|
|
|
71
112
|
If your repository uses a Codex marketplace root like `.agents/plugins/marketplace.json`, keep `plugin_dir: "."`. The scanner will discover local `./plugins/...` entries automatically, scan each local plugin manifest, and skip remote marketplace entries instead of treating the repo root as a single plugin.
|
|
72
113
|
|
|
73
|
-
##
|
|
114
|
+
## Start With Guard, Add CI Later
|
|
74
115
|
|
|
75
|
-
|
|
116
|
+
If you use Codex, Claude Code, Cursor, Gemini, or OpenCode every day, start with Guard.
|
|
117
|
+
|
|
118
|
+
- Guard is the part that protects your local harness before tools run.
|
|
119
|
+
- It helps when a new MCP server appears, when a tool changes after you trusted it, or when you want a receipt for what was approved or blocked.
|
|
120
|
+
|
|
121
|
+
If you publish plugins, skills, or marketplace packages, add the scanner in CI too.
|
|
122
|
+
|
|
123
|
+
- The scanner checks manifests, metadata, runtime surfaces, and policy rules before a release or CI gate passes.
|
|
124
|
+
- It is the publishing and repo review side of this package, not the first thing a local Guard user needs to learn.
|
|
125
|
+
|
|
126
|
+
## Use Scanner After `$plugin-creator`
|
|
127
|
+
|
|
128
|
+
If you are building and shipping packages, the scanner fits after `$plugin-creator`:
|
|
76
129
|
|
|
77
130
|
1. Scaffold with `$plugin-creator`.
|
|
78
131
|
2. Run `lint` locally to catch structure, metadata, and security issues early.
|
|
79
132
|
3. Run `verify` in CI to block regressions and enforce quality policy.
|
|
80
133
|
4. Ship or submit with confidence, backed by scanner artifacts and trust signals.
|
|
81
134
|
|
|
82
|
-
The score
|
|
135
|
+
The score stays available as a trust and triage signal, but the day-to-day workflow is simple: check locally, verify in CI, then release.
|
|
83
136
|
|
|
84
|
-
## Trust
|
|
137
|
+
## How Trust Scoring Works
|
|
85
138
|
|
|
86
139
|
The scanner now emits explicit trust provenance alongside the quality grade:
|
|
87
140
|
|
|
@@ -111,21 +164,23 @@ pytest -q
|
|
|
111
164
|
## Install
|
|
112
165
|
|
|
113
166
|
```bash
|
|
114
|
-
pip install
|
|
167
|
+
pip install hol-guard
|
|
115
168
|
```
|
|
116
169
|
|
|
117
170
|
Cisco-backed skill scanning is optional:
|
|
118
171
|
|
|
119
172
|
```bash
|
|
120
|
-
pip install "
|
|
173
|
+
pip install "hol-guard[cisco]"
|
|
121
174
|
```
|
|
122
175
|
|
|
123
176
|
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.
|
|
124
177
|
|
|
125
|
-
You can also
|
|
178
|
+
You can also install once and use both Guard and scanner commands:
|
|
126
179
|
|
|
127
180
|
```bash
|
|
128
|
-
pipx
|
|
181
|
+
pipx install hol-guard
|
|
182
|
+
hol-guard start
|
|
183
|
+
plugin-scanner ./my-plugin
|
|
129
184
|
```
|
|
130
185
|
|
|
131
186
|
Container-first environments can use the published image instead:
|
|
@@ -140,8 +195,16 @@ docker run --rm \
|
|
|
140
195
|
Backward compatibility remains available for teams still pinned to the historical package namespace:
|
|
141
196
|
|
|
142
197
|
```bash
|
|
198
|
+
pip install plugin-scanner
|
|
143
199
|
pip install codex-plugin-scanner
|
|
144
|
-
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Compatibility command names also stay available:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
plugin-guard start
|
|
206
|
+
plugin-scanner verify .
|
|
207
|
+
codex-plugin-scanner verify .
|
|
145
208
|
```
|
|
146
209
|
|
|
147
210
|
## Ecosystem Support
|
|
@@ -155,11 +218,11 @@ pipx run codex-plugin-scanner verify .
|
|
|
155
218
|
|
|
156
219
|
Use `--ecosystem auto` (default) to scan all detected packages in a repository, or select a single ecosystem explicitly.
|
|
157
220
|
|
|
158
|
-
## What The Scanner
|
|
221
|
+
## What The Scanner Checks
|
|
159
222
|
|
|
160
223
|
`plugin-scanner` supports a full quality suite:
|
|
161
224
|
|
|
162
|
-
- `scan` for full-surface security and
|
|
225
|
+
- `scan` for full-surface security and release analysis
|
|
163
226
|
- `lint` for rule-oriented authoring feedback
|
|
164
227
|
- `verify` for runtime and install-surface readiness checks
|
|
165
228
|
- `submit` for artifact-backed submission gating
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# HOL
|
|
1
|
+
# HOL Guard
|
|
2
2
|
|
|
3
|
-
[](https://pypi.org/project/hol-guard/)
|
|
4
|
+
[](https://pypi.org/project/plugin-scanner/)
|
|
5
|
+
[](https://pypi.org/project/hol-guard/)
|
|
6
|
+
[](https://pypistats.org/packages/hol-guard)
|
|
7
7
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/ci.yml)
|
|
8
8
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/publish.yml)
|
|
9
9
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/pkgs/container/ai-plugin-scanner)
|
|
@@ -12,15 +12,56 @@
|
|
|
12
12
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/stargazers)
|
|
13
13
|
[](https://github.com/astral-sh/ruff)
|
|
14
14
|
|
|
15
|
-
|  | **
|
|
15
|
+
|  | **Protect Codex, Claude Code, Cursor, Gemini, and OpenCode before local tools run.** HOL Guard watches the tools wired into your harness, shows you what changed, and records what you approved or blocked. The scanner commands stay available for teams that also want linting and CI checks for plugin, skill, MCP, and marketplace packages.<br><br>Start with `hol-guard` if you want local protection. Add the scanner commands later if you also publish or review packages in CI.<br><br>[PyPI Package (`hol-guard`)](https://pypi.org/project/hol-guard/)<br>[Legacy Namespace (`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) |
|
|
16
16
|
| :--- | :--- |
|
|
17
17
|
|
|
18
|
-
##
|
|
18
|
+
## Protect A Harness In 60 Seconds
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
#
|
|
22
|
-
pipx run
|
|
23
|
-
|
|
21
|
+
# See what Guard found on this machine
|
|
22
|
+
pipx run hol-guard start
|
|
23
|
+
|
|
24
|
+
# Install Guard in front of Codex
|
|
25
|
+
pipx run hol-guard install codex
|
|
26
|
+
|
|
27
|
+
# Record the current tool state once
|
|
28
|
+
pipx run hol-guard run codex --dry-run
|
|
29
|
+
|
|
30
|
+
# Launch through Guard after that
|
|
31
|
+
pipx run hol-guard run codex
|
|
32
|
+
|
|
33
|
+
# Check what Guard approved or blocked
|
|
34
|
+
pipx run hol-guard receipts
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
How Guard works:
|
|
38
|
+
|
|
39
|
+
1. find the harnesses on your machine
|
|
40
|
+
2. install a Guard launcher in front of the one you use
|
|
41
|
+
3. record the current tool state once
|
|
42
|
+
4. let Guard stop and review new or changed tools before launch
|
|
43
|
+
5. check receipts locally
|
|
44
|
+
6. connect sync later only if you want shared history
|
|
45
|
+
|
|
46
|
+
Start here if you are trying to stay safe inside a harness:
|
|
47
|
+
|
|
48
|
+
- `hol-guard start` shows the first steps
|
|
49
|
+
- `hol-guard status` shows what Guard is watching now
|
|
50
|
+
- `hol-guard install <harness>` creates the launcher
|
|
51
|
+
- `hol-guard run <harness> --dry-run` records the current state
|
|
52
|
+
- `hol-guard run <harness>` reviews changes before launch
|
|
53
|
+
- `hol-guard diff <harness>` shows what changed
|
|
54
|
+
- `hol-guard receipts` shows local history
|
|
55
|
+
|
|
56
|
+
See [docs/guard/get-started.md](docs/guard/get-started.md) for the full local flow.
|
|
57
|
+
|
|
58
|
+
## Use The Scanner In CI
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Install the package once, then use the scanner commands in your shell
|
|
62
|
+
pipx install hol-guard
|
|
63
|
+
plugin-scanner lint .
|
|
64
|
+
plugin-scanner verify .
|
|
24
65
|
```
|
|
25
66
|
|
|
26
67
|
```yaml
|
|
@@ -35,18 +76,30 @@ pipx run plugin-scanner verify .
|
|
|
35
76
|
|
|
36
77
|
If your repository uses a Codex marketplace root like `.agents/plugins/marketplace.json`, keep `plugin_dir: "."`. The scanner will discover local `./plugins/...` entries automatically, scan each local plugin manifest, and skip remote marketplace entries instead of treating the repo root as a single plugin.
|
|
37
78
|
|
|
38
|
-
##
|
|
79
|
+
## Start With Guard, Add CI Later
|
|
39
80
|
|
|
40
|
-
|
|
81
|
+
If you use Codex, Claude Code, Cursor, Gemini, or OpenCode every day, start with Guard.
|
|
82
|
+
|
|
83
|
+
- Guard is the part that protects your local harness before tools run.
|
|
84
|
+
- It helps when a new MCP server appears, when a tool changes after you trusted it, or when you want a receipt for what was approved or blocked.
|
|
85
|
+
|
|
86
|
+
If you publish plugins, skills, or marketplace packages, add the scanner in CI too.
|
|
87
|
+
|
|
88
|
+
- The scanner checks manifests, metadata, runtime surfaces, and policy rules before a release or CI gate passes.
|
|
89
|
+
- It is the publishing and repo review side of this package, not the first thing a local Guard user needs to learn.
|
|
90
|
+
|
|
91
|
+
## Use Scanner After `$plugin-creator`
|
|
92
|
+
|
|
93
|
+
If you are building and shipping packages, the scanner fits after `$plugin-creator`:
|
|
41
94
|
|
|
42
95
|
1. Scaffold with `$plugin-creator`.
|
|
43
96
|
2. Run `lint` locally to catch structure, metadata, and security issues early.
|
|
44
97
|
3. Run `verify` in CI to block regressions and enforce quality policy.
|
|
45
98
|
4. Ship or submit with confidence, backed by scanner artifacts and trust signals.
|
|
46
99
|
|
|
47
|
-
The score
|
|
100
|
+
The score stays available as a trust and triage signal, but the day-to-day workflow is simple: check locally, verify in CI, then release.
|
|
48
101
|
|
|
49
|
-
## Trust
|
|
102
|
+
## How Trust Scoring Works
|
|
50
103
|
|
|
51
104
|
The scanner now emits explicit trust provenance alongside the quality grade:
|
|
52
105
|
|
|
@@ -76,21 +129,23 @@ pytest -q
|
|
|
76
129
|
## Install
|
|
77
130
|
|
|
78
131
|
```bash
|
|
79
|
-
pip install
|
|
132
|
+
pip install hol-guard
|
|
80
133
|
```
|
|
81
134
|
|
|
82
135
|
Cisco-backed skill scanning is optional:
|
|
83
136
|
|
|
84
137
|
```bash
|
|
85
|
-
pip install "
|
|
138
|
+
pip install "hol-guard[cisco]"
|
|
86
139
|
```
|
|
87
140
|
|
|
88
141
|
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.
|
|
89
142
|
|
|
90
|
-
You can also
|
|
143
|
+
You can also install once and use both Guard and scanner commands:
|
|
91
144
|
|
|
92
145
|
```bash
|
|
93
|
-
pipx
|
|
146
|
+
pipx install hol-guard
|
|
147
|
+
hol-guard start
|
|
148
|
+
plugin-scanner ./my-plugin
|
|
94
149
|
```
|
|
95
150
|
|
|
96
151
|
Container-first environments can use the published image instead:
|
|
@@ -105,8 +160,16 @@ docker run --rm \
|
|
|
105
160
|
Backward compatibility remains available for teams still pinned to the historical package namespace:
|
|
106
161
|
|
|
107
162
|
```bash
|
|
163
|
+
pip install plugin-scanner
|
|
108
164
|
pip install codex-plugin-scanner
|
|
109
|
-
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Compatibility command names also stay available:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
plugin-guard start
|
|
171
|
+
plugin-scanner verify .
|
|
172
|
+
codex-plugin-scanner verify .
|
|
110
173
|
```
|
|
111
174
|
|
|
112
175
|
## Ecosystem Support
|
|
@@ -120,11 +183,11 @@ pipx run codex-plugin-scanner verify .
|
|
|
120
183
|
|
|
121
184
|
Use `--ecosystem auto` (default) to scan all detected packages in a repository, or select a single ecosystem explicitly.
|
|
122
185
|
|
|
123
|
-
## What The Scanner
|
|
186
|
+
## What The Scanner Checks
|
|
124
187
|
|
|
125
188
|
`plugin-scanner` supports a full quality suite:
|
|
126
189
|
|
|
127
|
-
- `scan` for full-surface security and
|
|
190
|
+
- `scan` for full-surface security and release analysis
|
|
128
191
|
- `lint` for rule-oriented authoring feedback
|
|
129
192
|
- `verify` for runtime and install-surface readiness checks
|
|
130
193
|
- `submit` for artifact-backed submission gating
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# Guard Architecture
|
|
2
2
|
|
|
3
|
-
Guard lives inside `codex_plugin_scanner` and
|
|
3
|
+
Guard lives inside `codex_plugin_scanner` and is the local product surface for harness protection. The existing scan engine remains the trust and evidence core, but the user workflow starts with local harness installs and launch interception rather than CI.
|
|
4
4
|
|
|
5
5
|
The runtime is split into:
|
|
6
6
|
|
|
7
7
|
- `guard/adapters`: harness discovery for Codex, Claude Code, Cursor, Gemini, and OpenCode
|
|
8
|
+
- `guard/shims`: local launcher shims that route harness launches through Guard
|
|
8
9
|
- `guard/consumer`: orchestration for detection, policy evaluation, and consumer-mode scan output
|
|
9
10
|
- `guard/policy`: local action resolution for allow, review, warn, and block decisions
|
|
10
11
|
- `guard/receipts`: receipt creation for first use and changed-artifact events
|
|
@@ -21,4 +22,12 @@ Guard evaluates local artifacts in this order:
|
|
|
21
22
|
5. Record a receipt and optional diff
|
|
22
23
|
6. Launch the harness only if the effective action is not `block`
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
The local product loop is:
|
|
26
|
+
|
|
27
|
+
1. `hol-guard start` detects supported harnesses and suggests the next step
|
|
28
|
+
2. `hol-guard install <harness>` creates a local launcher shim
|
|
29
|
+
3. `hol-guard run <harness>` evaluates changes before the harness launches
|
|
30
|
+
4. `hol-guard receipts` and `hol-guard status` let users inspect local decisions
|
|
31
|
+
5. `hol-guard login` and `hol-guard sync` stay optional
|
|
32
|
+
|
|
33
|
+
Wrapper mode is still the core execution strategy in this phase. Config mutation is limited to the Claude Code hook helper, where Guard can add and remove its own hook entry in workspace-local settings.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Guard Get Started
|
|
2
|
+
|
|
3
|
+
Guard ships as the `hol-guard` package and command.
|
|
4
|
+
The scanner commands stay available in the same install for CI and package checks.
|
|
5
|
+
|
|
6
|
+
Use it when you want to protect a harness before local MCP servers, skills, hooks, or plugin surfaces run.
|
|
7
|
+
|
|
8
|
+
## The everyday flow
|
|
9
|
+
|
|
10
|
+
1. See what Guard found:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
hol-guard start
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
2. Install Guard in front of the harness you use most:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
hol-guard install codex
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
3. Run one dry pass so Guard records the current state:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
hol-guard run codex --dry-run
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
4. Launch through Guard after that. Guard will stop and ask if a tool is new or changed:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
hol-guard run codex
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
5. Review changes when Guard blocks or asks for another look:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
hol-guard diff codex
|
|
38
|
+
hol-guard allow codex --scope artifact --artifact-id codex:project:workspace_skill
|
|
39
|
+
hol-guard deny codex --scope artifact --artifact-id codex:project:workspace_skill
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
6. Check receipts and current status:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
hol-guard receipts
|
|
46
|
+
hol-guard status
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
7. Sign in later only if you want shared history:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
hol-guard login --sync-url <url> --token <token>
|
|
53
|
+
hol-guard sync
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## What `install` does
|
|
57
|
+
|
|
58
|
+
`guard install <harness>` creates a local launcher shim under Guard’s home directory:
|
|
59
|
+
|
|
60
|
+
- macOS/Linux: `~/.config/.ai-plugin-scanner-guard/bin/guard-<harness>`
|
|
61
|
+
- Windows: `~/.config/.ai-plugin-scanner-guard/bin/guard-<harness>.cmd`
|
|
62
|
+
|
|
63
|
+
Claude Code also gets Guard hook entries in `.claude/settings.local.json` when you install from a workspace.
|
|
64
|
+
|
|
65
|
+
## First-party canaries
|
|
66
|
+
|
|
67
|
+
Use these local repos to prove Guard against real first-party surfaces:
|
|
68
|
+
|
|
69
|
+
- `hashnet-mcp-js` for a real MCP server harness target
|
|
70
|
+
- `registry-broker-skills` for a real skills registry fixture during scan and trust checks
|
|
71
|
+
|
|
72
|
+
Suggested local validation:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
hol-guard detect codex --json
|
|
76
|
+
hol-guard install codex
|
|
77
|
+
hol-guard status
|
|
78
|
+
hol-guard run codex --dry-run
|
|
79
|
+
hol-guard receipts
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
For a real Codex canary, point `~/.codex/config.toml` or `<workspace>/.codex/config.toml` at a local `hashnet-mcp` command, then repeat the Guard loop above.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Works Locally First
|
|
2
2
|
|
|
3
|
-
Guard
|
|
3
|
+
Guard works on your machine before you sign in anywhere.
|
|
4
4
|
|
|
5
5
|
Local features available without sign-in:
|
|
6
6
|
|
|
@@ -19,4 +19,4 @@ Optional cloud features:
|
|
|
19
19
|
- billing and entitlements
|
|
20
20
|
- shared team policy
|
|
21
21
|
|
|
22
|
-
The local runtime does not require any hosted service. `guard login` and `guard sync`
|
|
22
|
+
The local runtime does not require any hosted service. `hol-guard login` and `hol-guard sync` add optional cloud features later. They do not unlock the core safety workflow.
|
|
@@ -3,20 +3,30 @@
|
|
|
3
3
|
Automated coverage in this phase includes:
|
|
4
4
|
|
|
5
5
|
- Guard CLI behavior tests for detect, scan, run, diff, receipts, install, uninstall, login, and sync
|
|
6
|
+
- Guard product-flow tests for `hol-guard start`, `hol-guard status`, and launcher shim creation
|
|
6
7
|
- SQLite persistence through real command execution in temporary homes and workspaces
|
|
7
8
|
- consumer-mode JSON contract generation against scanner fixtures
|
|
8
9
|
- local HTTP sync against a live in-process server instead of mocked transport
|
|
9
10
|
|
|
10
11
|
Manual verification should include:
|
|
11
12
|
|
|
12
|
-
- `guard
|
|
13
|
-
- `guard
|
|
14
|
-
- `guard detect
|
|
15
|
-
- `guard detect
|
|
16
|
-
- `guard
|
|
13
|
+
- `hol-guard start`
|
|
14
|
+
- `hol-guard status`
|
|
15
|
+
- `hol-guard detect codex --json`
|
|
16
|
+
- `hol-guard detect cursor --json`
|
|
17
|
+
- `hol-guard detect gemini --json`
|
|
18
|
+
- `hol-guard detect opencode --json`
|
|
19
|
+
- `hol-guard install codex`
|
|
20
|
+
- `hol-guard run codex --dry-run --default-action allow --json`
|
|
21
|
+
- `hol-guard receipts`
|
|
17
22
|
- `codex mcp list`
|
|
18
23
|
- `cursor-agent mcp list`
|
|
19
24
|
- `gemini --help`
|
|
20
25
|
- `opencode --help`
|
|
21
26
|
|
|
27
|
+
First-party canaries for local manual validation:
|
|
28
|
+
|
|
29
|
+
- a local `hashnet-mcp-js` checkout wired into Codex, Cursor, or Claude Code config
|
|
30
|
+
- a local `registry-broker-skills` checkout for scanner fixtures and trust review
|
|
31
|
+
|
|
22
32
|
Claude Code smoke tests remain conditional on the local `claude` binary being available.
|
|
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "plugin-scanner"
|
|
7
|
-
version = "2.0.
|
|
8
|
-
description = "
|
|
7
|
+
version = "2.0.3"
|
|
8
|
+
description = "Protect local AI harnesses with HOL Guard and run scanner checks for Codex, Claude, Cursor, Gemini, and OpenCode."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
11
11
|
requires-python = ">=3.10"
|
|
@@ -49,7 +49,9 @@ publish = [
|
|
|
49
49
|
]
|
|
50
50
|
|
|
51
51
|
[project.scripts]
|
|
52
|
+
hol-guard = "codex_plugin_scanner.cli:main"
|
|
52
53
|
plugin-scanner = "codex_plugin_scanner.cli:main"
|
|
54
|
+
plugin-guard = "codex_plugin_scanner.cli:main"
|
|
53
55
|
codex-plugin-scanner = "codex_plugin_scanner.cli:main"
|
|
54
56
|
plugin-ecosystem-scanner = "codex_plugin_scanner.cli:main"
|
|
55
57
|
|
|
@@ -66,6 +68,15 @@ extend-exclude = ["tests/test-trust-scoring.py", "tests/test-trust-specs.py"]
|
|
|
66
68
|
[tool.hatch.build.targets.wheel]
|
|
67
69
|
packages = ["src/codex_plugin_scanner"]
|
|
68
70
|
|
|
71
|
+
[tool.hatch.build]
|
|
72
|
+
exclude = [
|
|
73
|
+
".guard-e2e/**",
|
|
74
|
+
".guard-e2e-prod/**",
|
|
75
|
+
".guard-e2e-prod2/**",
|
|
76
|
+
".guard-prod-venv/**",
|
|
77
|
+
".guard-prod-venv-fresh/**",
|
|
78
|
+
]
|
|
79
|
+
|
|
69
80
|
[tool.ruff.lint]
|
|
70
81
|
select = ["E", "F", "W", "I", "N", "UP", "B", "A", "SIM", "RUF"]
|
|
71
82
|
|