plugin-scanner 2.0.2__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.2 → plugin_scanner-2.0.3}/.github/workflows/publish.yml +13 -3
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/PKG-INFO +66 -60
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/README.md +64 -58
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/docs/guard/architecture.md +5 -5
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/docs/guard/get-started.md +23 -23
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/docs/guard/local-vs-cloud.md +3 -3
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/docs/guard/testing-matrix.md +10 -10
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/pyproject.toml +3 -2
- plugin_scanner-2.0.3/pyproject.toml.bak +85 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/cli.py +22 -6
- plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/cli/__init__.py +5 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/cli/commands.py +16 -3
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/cli/product.py +9 -8
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/cli/prompt.py +1 -1
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/cli/render.py +1 -2
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/version.py +1 -1
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_action_bundle.py +18 -19
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_ecosystems.py +1 -3
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_guard_cli.py +8 -1
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_guard_product_flow.py +52 -2
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_trust_scoring.py +3 -9
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/uv.lock +42 -42
- plugin_scanner-2.0.2/src/codex_plugin_scanner/guard/cli/__init__.py +0 -5
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.dockerignore +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.github/dependabot.yml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.github/workflows/ci.yml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.github/workflows/codeql.yml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.github/workflows/e2e-test.yml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.github/workflows/publish-action-repo.yml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.github/workflows/scorecard.yml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.gitignore +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/Dockerfile +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/LICENSE +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/SECURITY.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/action/README.legacy.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/action/README.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/action/action.yml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/action/cisco-version.txt +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/action/pypi-attestations-version.txt +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/action/scanner-version.txt +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/docs/guard/harness-support.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/docs/guard/repo-boundaries.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/config.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/models.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/runtime/runner.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/shims.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/store.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test-trust-scoring.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test-trust-specs.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_cli.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_coverage_remaining.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_edge_cases.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_guard_launch_env.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_guard_runtime.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_integration.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_live_cisco_smoke.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_scanner.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_skill_security.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_submission.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.2 → plugin_scanner-2.0.3}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.2 → 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,52 +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
|
-
# See what Guard
|
|
57
|
-
pipx run
|
|
56
|
+
# See what Guard found on this machine
|
|
57
|
+
pipx run hol-guard start
|
|
58
58
|
|
|
59
59
|
# Install Guard in front of Codex
|
|
60
|
-
pipx run
|
|
60
|
+
pipx run hol-guard install codex
|
|
61
61
|
|
|
62
|
-
#
|
|
63
|
-
pipx run
|
|
62
|
+
# Record the current tool state once
|
|
63
|
+
pipx run hol-guard run codex --dry-run
|
|
64
64
|
|
|
65
|
-
#
|
|
66
|
-
pipx run
|
|
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
|
|
67
70
|
```
|
|
68
71
|
|
|
69
|
-
Guard
|
|
72
|
+
How Guard works:
|
|
70
73
|
|
|
71
|
-
1.
|
|
72
|
-
2. install a Guard launcher
|
|
73
|
-
3.
|
|
74
|
-
4.
|
|
75
|
-
5.
|
|
76
|
-
6. connect sync only if you want shared history
|
|
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
|
|
77
80
|
|
|
78
|
-
|
|
81
|
+
Start here if you are trying to stay safe inside a harness:
|
|
79
82
|
|
|
80
|
-
- `
|
|
81
|
-
- `
|
|
82
|
-
- `
|
|
83
|
-
- `
|
|
84
|
-
- `
|
|
85
|
-
- `
|
|
86
|
-
- `
|
|
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
|
|
87
90
|
|
|
88
91
|
See [docs/guard/get-started.md](docs/guard/get-started.md) for the full local flow.
|
|
89
92
|
|
|
90
|
-
## Scanner
|
|
93
|
+
## Use The Scanner In CI
|
|
91
94
|
|
|
92
95
|
```bash
|
|
93
|
-
#
|
|
94
|
-
pipx
|
|
95
|
-
|
|
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 .
|
|
96
100
|
```
|
|
97
101
|
|
|
98
102
|
```yaml
|
|
@@ -107,38 +111,30 @@ pipx run plugin-scanner verify .
|
|
|
107
111
|
|
|
108
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.
|
|
109
113
|
|
|
110
|
-
##
|
|
111
|
-
|
|
112
|
-
### HOL Guard
|
|
113
|
-
|
|
114
|
-
Use Guard when the problem is local runtime safety inside a harness:
|
|
114
|
+
## Start With Guard, Add CI Later
|
|
115
115
|
|
|
116
|
-
|
|
117
|
-
- an existing tool changed after you trusted it
|
|
118
|
-
- you want receipts for what was approved or blocked
|
|
119
|
-
- you want to review changes before Codex, Claude Code, Cursor, Gemini, or OpenCode launches
|
|
116
|
+
If you use Codex, Claude Code, Cursor, Gemini, or OpenCode every day, start with Guard.
|
|
120
117
|
|
|
121
|
-
|
|
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.
|
|
122
120
|
|
|
123
|
-
|
|
121
|
+
If you publish plugins, skills, or marketplace packages, add the scanner in CI too.
|
|
124
122
|
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
- block PRs with policy gates
|
|
128
|
-
- emit artifacts before submission or publishing
|
|
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.
|
|
129
125
|
|
|
130
126
|
## Use Scanner After `$plugin-creator`
|
|
131
127
|
|
|
132
|
-
|
|
128
|
+
If you are building and shipping packages, the scanner fits after `$plugin-creator`:
|
|
133
129
|
|
|
134
130
|
1. Scaffold with `$plugin-creator`.
|
|
135
131
|
2. Run `lint` locally to catch structure, metadata, and security issues early.
|
|
136
132
|
3. Run `verify` in CI to block regressions and enforce quality policy.
|
|
137
133
|
4. Ship or submit with confidence, backed by scanner artifacts and trust signals.
|
|
138
134
|
|
|
139
|
-
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.
|
|
140
136
|
|
|
141
|
-
## Trust
|
|
137
|
+
## How Trust Scoring Works
|
|
142
138
|
|
|
143
139
|
The scanner now emits explicit trust provenance alongside the quality grade:
|
|
144
140
|
|
|
@@ -168,21 +164,23 @@ pytest -q
|
|
|
168
164
|
## Install
|
|
169
165
|
|
|
170
166
|
```bash
|
|
171
|
-
pip install
|
|
167
|
+
pip install hol-guard
|
|
172
168
|
```
|
|
173
169
|
|
|
174
170
|
Cisco-backed skill scanning is optional:
|
|
175
171
|
|
|
176
172
|
```bash
|
|
177
|
-
pip install "
|
|
173
|
+
pip install "hol-guard[cisco]"
|
|
178
174
|
```
|
|
179
175
|
|
|
180
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.
|
|
181
177
|
|
|
182
|
-
You can also
|
|
178
|
+
You can also install once and use both Guard and scanner commands:
|
|
183
179
|
|
|
184
180
|
```bash
|
|
185
|
-
pipx
|
|
181
|
+
pipx install hol-guard
|
|
182
|
+
hol-guard start
|
|
183
|
+
plugin-scanner ./my-plugin
|
|
186
184
|
```
|
|
187
185
|
|
|
188
186
|
Container-first environments can use the published image instead:
|
|
@@ -197,8 +195,16 @@ docker run --rm \
|
|
|
197
195
|
Backward compatibility remains available for teams still pinned to the historical package namespace:
|
|
198
196
|
|
|
199
197
|
```bash
|
|
198
|
+
pip install plugin-scanner
|
|
200
199
|
pip install codex-plugin-scanner
|
|
201
|
-
|
|
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 .
|
|
202
208
|
```
|
|
203
209
|
|
|
204
210
|
## Ecosystem Support
|
|
@@ -212,11 +218,11 @@ pipx run codex-plugin-scanner verify .
|
|
|
212
218
|
|
|
213
219
|
Use `--ecosystem auto` (default) to scan all detected packages in a repository, or select a single ecosystem explicitly.
|
|
214
220
|
|
|
215
|
-
## What The Scanner
|
|
221
|
+
## What The Scanner Checks
|
|
216
222
|
|
|
217
223
|
`plugin-scanner` supports a full quality suite:
|
|
218
224
|
|
|
219
|
-
- `scan` for full-surface security and
|
|
225
|
+
- `scan` for full-surface security and release analysis
|
|
220
226
|
- `lint` for rule-oriented authoring feedback
|
|
221
227
|
- `verify` for runtime and install-surface readiness checks
|
|
222
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,52 +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
|
-
# See what Guard
|
|
22
|
-
pipx run
|
|
21
|
+
# See what Guard found on this machine
|
|
22
|
+
pipx run hol-guard start
|
|
23
23
|
|
|
24
24
|
# Install Guard in front of Codex
|
|
25
|
-
pipx run
|
|
25
|
+
pipx run hol-guard install codex
|
|
26
26
|
|
|
27
|
-
#
|
|
28
|
-
pipx run
|
|
27
|
+
# Record the current tool state once
|
|
28
|
+
pipx run hol-guard run codex --dry-run
|
|
29
29
|
|
|
30
|
-
#
|
|
31
|
-
pipx run
|
|
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
|
|
32
35
|
```
|
|
33
36
|
|
|
34
|
-
Guard
|
|
37
|
+
How Guard works:
|
|
35
38
|
|
|
36
|
-
1.
|
|
37
|
-
2. install a Guard launcher
|
|
38
|
-
3.
|
|
39
|
-
4.
|
|
40
|
-
5.
|
|
41
|
-
6. connect sync only if you want shared history
|
|
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
|
|
42
45
|
|
|
43
|
-
|
|
46
|
+
Start here if you are trying to stay safe inside a harness:
|
|
44
47
|
|
|
45
|
-
- `
|
|
46
|
-
- `
|
|
47
|
-
- `
|
|
48
|
-
- `
|
|
49
|
-
- `
|
|
50
|
-
- `
|
|
51
|
-
- `
|
|
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
|
|
52
55
|
|
|
53
56
|
See [docs/guard/get-started.md](docs/guard/get-started.md) for the full local flow.
|
|
54
57
|
|
|
55
|
-
## Scanner
|
|
58
|
+
## Use The Scanner In CI
|
|
56
59
|
|
|
57
60
|
```bash
|
|
58
|
-
#
|
|
59
|
-
pipx
|
|
60
|
-
|
|
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 .
|
|
61
65
|
```
|
|
62
66
|
|
|
63
67
|
```yaml
|
|
@@ -72,38 +76,30 @@ pipx run plugin-scanner verify .
|
|
|
72
76
|
|
|
73
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.
|
|
74
78
|
|
|
75
|
-
##
|
|
76
|
-
|
|
77
|
-
### HOL Guard
|
|
78
|
-
|
|
79
|
-
Use Guard when the problem is local runtime safety inside a harness:
|
|
79
|
+
## Start With Guard, Add CI Later
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
- an existing tool changed after you trusted it
|
|
83
|
-
- you want receipts for what was approved or blocked
|
|
84
|
-
- you want to review changes before Codex, Claude Code, Cursor, Gemini, or OpenCode launches
|
|
81
|
+
If you use Codex, Claude Code, Cursor, Gemini, or OpenCode every day, start with Guard.
|
|
85
82
|
|
|
86
|
-
|
|
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.
|
|
87
85
|
|
|
88
|
-
|
|
86
|
+
If you publish plugins, skills, or marketplace packages, add the scanner in CI too.
|
|
89
87
|
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
- block PRs with policy gates
|
|
93
|
-
- emit artifacts before submission or publishing
|
|
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.
|
|
94
90
|
|
|
95
91
|
## Use Scanner After `$plugin-creator`
|
|
96
92
|
|
|
97
|
-
|
|
93
|
+
If you are building and shipping packages, the scanner fits after `$plugin-creator`:
|
|
98
94
|
|
|
99
95
|
1. Scaffold with `$plugin-creator`.
|
|
100
96
|
2. Run `lint` locally to catch structure, metadata, and security issues early.
|
|
101
97
|
3. Run `verify` in CI to block regressions and enforce quality policy.
|
|
102
98
|
4. Ship or submit with confidence, backed by scanner artifacts and trust signals.
|
|
103
99
|
|
|
104
|
-
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.
|
|
105
101
|
|
|
106
|
-
## Trust
|
|
102
|
+
## How Trust Scoring Works
|
|
107
103
|
|
|
108
104
|
The scanner now emits explicit trust provenance alongside the quality grade:
|
|
109
105
|
|
|
@@ -133,21 +129,23 @@ pytest -q
|
|
|
133
129
|
## Install
|
|
134
130
|
|
|
135
131
|
```bash
|
|
136
|
-
pip install
|
|
132
|
+
pip install hol-guard
|
|
137
133
|
```
|
|
138
134
|
|
|
139
135
|
Cisco-backed skill scanning is optional:
|
|
140
136
|
|
|
141
137
|
```bash
|
|
142
|
-
pip install "
|
|
138
|
+
pip install "hol-guard[cisco]"
|
|
143
139
|
```
|
|
144
140
|
|
|
145
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.
|
|
146
142
|
|
|
147
|
-
You can also
|
|
143
|
+
You can also install once and use both Guard and scanner commands:
|
|
148
144
|
|
|
149
145
|
```bash
|
|
150
|
-
pipx
|
|
146
|
+
pipx install hol-guard
|
|
147
|
+
hol-guard start
|
|
148
|
+
plugin-scanner ./my-plugin
|
|
151
149
|
```
|
|
152
150
|
|
|
153
151
|
Container-first environments can use the published image instead:
|
|
@@ -162,8 +160,16 @@ docker run --rm \
|
|
|
162
160
|
Backward compatibility remains available for teams still pinned to the historical package namespace:
|
|
163
161
|
|
|
164
162
|
```bash
|
|
163
|
+
pip install plugin-scanner
|
|
165
164
|
pip install codex-plugin-scanner
|
|
166
|
-
|
|
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 .
|
|
167
173
|
```
|
|
168
174
|
|
|
169
175
|
## Ecosystem Support
|
|
@@ -177,11 +183,11 @@ pipx run codex-plugin-scanner verify .
|
|
|
177
183
|
|
|
178
184
|
Use `--ecosystem auto` (default) to scan all detected packages in a repository, or select a single ecosystem explicitly.
|
|
179
185
|
|
|
180
|
-
## What The Scanner
|
|
186
|
+
## What The Scanner Checks
|
|
181
187
|
|
|
182
188
|
`plugin-scanner` supports a full quality suite:
|
|
183
189
|
|
|
184
|
-
- `scan` for full-surface security and
|
|
190
|
+
- `scan` for full-surface security and release analysis
|
|
185
191
|
- `lint` for rule-oriented authoring feedback
|
|
186
192
|
- `verify` for runtime and install-surface readiness checks
|
|
187
193
|
- `submit` for artifact-backed submission gating
|
|
@@ -24,10 +24,10 @@ Guard evaluates local artifacts in this order:
|
|
|
24
24
|
|
|
25
25
|
The local product loop is:
|
|
26
26
|
|
|
27
|
-
1. `guard start` detects supported harnesses and suggests the next step
|
|
28
|
-
2. `guard install <harness>` creates a local launcher shim
|
|
29
|
-
3. `guard run <harness>` evaluates changes before the harness launches
|
|
30
|
-
4. `guard receipts` and `guard status` let users inspect local decisions
|
|
31
|
-
5. `guard login` and `guard sync` stay optional
|
|
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
32
|
|
|
33
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.
|
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
# Guard Get Started
|
|
2
2
|
|
|
3
|
-
Guard
|
|
4
|
-
|
|
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
5
|
|
|
6
6
|
Use it when you want to protect a harness before local MCP servers, skills, hooks, or plugin surfaces run.
|
|
7
7
|
|
|
8
|
-
## The
|
|
8
|
+
## The everyday flow
|
|
9
9
|
|
|
10
|
-
1.
|
|
10
|
+
1. See what Guard found:
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
|
|
13
|
+
hol-guard start
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
2. Install Guard in front of the harness you use most:
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
|
|
19
|
+
hol-guard install codex
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
3. Run one dry pass so Guard records the current state:
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
|
|
25
|
+
hol-guard run codex --dry-run
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
4. Launch through Guard after that. Guard will
|
|
28
|
+
4. Launch through Guard after that. Guard will stop and ask if a tool is new or changed:
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
|
|
31
|
+
hol-guard run codex
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
5. Review changes when Guard blocks or asks for another look:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
40
|
```
|
|
41
41
|
|
|
42
|
-
6.
|
|
42
|
+
6. Check receipts and current status:
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
hol-guard receipts
|
|
46
|
+
hol-guard status
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
7.
|
|
49
|
+
7. Sign in later only if you want shared history:
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
hol-guard login --sync-url <url> --token <token>
|
|
53
|
+
hol-guard sync
|
|
54
54
|
```
|
|
55
55
|
|
|
56
56
|
## What `install` does
|
|
@@ -72,11 +72,11 @@ Use these local repos to prove Guard against real first-party surfaces:
|
|
|
72
72
|
Suggested local validation:
|
|
73
73
|
|
|
74
74
|
```bash
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
80
|
```
|
|
81
81
|
|
|
82
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,22 +3,22 @@
|
|
|
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 `guard start`, `guard status`, and launcher shim creation
|
|
6
|
+
- Guard product-flow tests for `hol-guard start`, `hol-guard status`, and launcher shim creation
|
|
7
7
|
- SQLite persistence through real command execution in temporary homes and workspaces
|
|
8
8
|
- consumer-mode JSON contract generation against scanner fixtures
|
|
9
9
|
- local HTTP sync against a live in-process server instead of mocked transport
|
|
10
10
|
|
|
11
11
|
Manual verification should include:
|
|
12
12
|
|
|
13
|
-
- `guard start`
|
|
14
|
-
- `guard status`
|
|
15
|
-
- `guard detect codex --json`
|
|
16
|
-
- `guard detect cursor --json`
|
|
17
|
-
- `guard detect gemini --json`
|
|
18
|
-
- `guard detect opencode --json`
|
|
19
|
-
- `guard install codex`
|
|
20
|
-
- `guard run codex --dry-run --default-action allow --json`
|
|
21
|
-
- `guard receipts`
|
|
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`
|
|
22
22
|
- `codex mcp list`
|
|
23
23
|
- `cursor-agent mcp list`
|
|
24
24
|
- `gemini --help`
|