plugin-scanner 2.0.99__tar.gz → 2.0.100__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.99 → plugin_scanner-2.0.100}/PKG-INFO +1 -1
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/pyproject.toml +1 -1
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/pyproject.toml.bak +1 -1
- plugin_scanner-2.0.100/src/codex_plugin_scanner/guard/runtime/decisions.py +211 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/version.py +1 -1
- plugin_scanner-2.0.100/tests/test_guard_runtime_decisions.py +129 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.dockerignore +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/dependabot.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/workflows/ci.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/workflows/codeql.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/workflows/dependabot-uv-lock.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/workflows/harness-smoke.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/workflows/publish.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.github/workflows/scorecard.yml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.gitignore +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/Dockerfile +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/LICENSE +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/README.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/SECURITY.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/index.html +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/package.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/pnpm-lock.yaml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/public/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/public/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/public/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/public/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/public/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/public/favicon.ico +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/app.tsx +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/approval-center-layout.tsx +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/approval-center-primitives.tsx +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/approval-center-utils.ts +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/fleet-workspace.tsx +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/guard-api.test.ts +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/guard-api.ts +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/guard-demo.ts +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/guard-types.ts +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/main.tsx +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/receipts-workspace.tsx +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/runtime-overview.tsx +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/settings-workspace.tsx +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/styles.css +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/vite-env.d.ts +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/tsconfig.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/vite.config.ts +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/docs/guard/approval-audit.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/docs/guard/architecture.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/docs/guard/get-started.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/docs/guard/harness-support.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/docs/guard/local-vs-cloud.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/docs/guard/testing-matrix.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/requirements.txt +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/argparse_utils.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/mcp_security.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/cli.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/cli_ui.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/github_reporting.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/antigravity.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/copilot.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/hermes.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/mcp_servers.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/openclaw.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/openclaw_config.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/openclaw_support.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/opencode_artifacts.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/advisory_model.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/approvals.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/bridge/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/capabilities.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/cli/commands.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/cli/connect_flow.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/cli/install_commands.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/cli/render.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/cli/update_commands.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/codex_config.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/config.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/client.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/static/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/static/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/static/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/static/favicon.ico +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/edge_events.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/incident.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/launcher.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/mcp_tool_calls.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/models.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/protect.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/proxy/runtime_mcp.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/redaction.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/risk.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/runtime/actions.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/runtime/runner.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/runtime/secret_file_requests.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/runtime/signals.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/runtime/surface_server.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/schemas/guard_event_v1.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/schemas/surface_server.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/shims.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/store.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/store_connect.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/types.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/integrations/cisco_mcp_scanner.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/conftest.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/guard-codex-malicious-mcp/.codex/config.toml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/hermes-plugin-evil/config.yaml +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/hermes-plugin-evil/mcp_servers.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/hermes-plugin-evil/skills/security/malicious/SKILL.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/SKILL.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/references/api-setup.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/scripts/deploy.sh +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/hermes-plugin-evil/skills/utils/benign/SKILL.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/malicious-skill-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/malicious-skill-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/malicious-skill-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/malicious-skill-plugin/README.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/malicious-skill-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/malicious-skill-plugin/skills/leaky-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/mcp-canary-server.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test-trust-scoring.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test-trust-specs.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_cisco_install_surfaces.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_cli.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_coverage_remaining.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_ecosystems.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_edge_cases.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_approvals.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_bootstrap.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_capabilities.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_claude_adapter.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_cli.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_codex_e2e.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_codex_install.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_codex_proxy.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_config_paths.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_connect_flow.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_consumer_mode.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_copilot_adapter.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_copilot_proxy.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_daemon_manager.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_event_schema_v1.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_events.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_launch_env.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_opencode_proxy.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_product_flow.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_protect.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_render.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_risk.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_runtime.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_runtime_action_harnesses.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_runtime_actions.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_runtime_signals.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_store_migrations.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_surface_server.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_guard_verdicts.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_hermes_adapter.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_integration.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_live_cisco_smoke.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_mcp_security.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_openclaw_adapter.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_scanner.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_skill_security.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_submission.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_trust_scoring.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/tests/test_versioning.py +0 -0
- {plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plugin-scanner
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.100
|
|
4
4
|
Summary: Lint, verify, and gate plugin ecosystems for maintainers, CI, and publish workflows.
|
|
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
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "plugin-scanner"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.100"
|
|
8
8
|
description = "Lint, verify, and gate plugin ecosystems for maintainers, CI, and publish workflows."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "hol-guard"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.100"
|
|
8
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"
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"""Typed runtime decisions for Guard pause and approval UX."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Mapping, Sequence
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Literal
|
|
8
|
+
|
|
9
|
+
from codex_plugin_scanner.guard.models import GuardAction
|
|
10
|
+
from codex_plugin_scanner.guard.runtime.signals import (
|
|
11
|
+
RiskConfidenceLabel,
|
|
12
|
+
RiskSignalV2,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
GuardDecisionAction = Literal["allow", "warn", "ask", "block"]
|
|
16
|
+
|
|
17
|
+
_ACTION_MESSAGES: dict[GuardAction, tuple[GuardDecisionAction, str, str, str]] = {
|
|
18
|
+
"allow": (
|
|
19
|
+
"allow",
|
|
20
|
+
"Allowed by policy",
|
|
21
|
+
"Policy allows this action.",
|
|
22
|
+
"HOL Guard allowed this action because policy already trusts it.",
|
|
23
|
+
),
|
|
24
|
+
"warn": (
|
|
25
|
+
"warn",
|
|
26
|
+
"Risk signals found",
|
|
27
|
+
"HOL Guard noticed risk signals, but policy allows the harness to continue.",
|
|
28
|
+
"Review the warning if this action was unexpected.",
|
|
29
|
+
),
|
|
30
|
+
"review": (
|
|
31
|
+
"ask",
|
|
32
|
+
"Approval required",
|
|
33
|
+
"HOL Guard needs your approval before this action can run.",
|
|
34
|
+
"Choose an approval scope, then retry in the harness.",
|
|
35
|
+
),
|
|
36
|
+
"sandbox-required": (
|
|
37
|
+
"ask",
|
|
38
|
+
"Sandbox review required",
|
|
39
|
+
"HOL Guard wants this action reviewed and run in a sandboxed path.",
|
|
40
|
+
"Run it in a sandbox or choose a scoped approval before retrying.",
|
|
41
|
+
),
|
|
42
|
+
"require-reapproval": (
|
|
43
|
+
"ask",
|
|
44
|
+
"Fresh approval required",
|
|
45
|
+
"HOL Guard needs a fresh approval because this action changed.",
|
|
46
|
+
"Choose the smallest approval scope that matches your intent, then retry.",
|
|
47
|
+
),
|
|
48
|
+
"block": (
|
|
49
|
+
"block",
|
|
50
|
+
"Blocked by policy",
|
|
51
|
+
"HOL Guard blocked this action.",
|
|
52
|
+
"Review the details before changing policy or retrying.",
|
|
53
|
+
),
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass(frozen=True, slots=True)
|
|
58
|
+
class GuardDecisionV2:
|
|
59
|
+
"""Product-facing Guard decision with harness and dashboard copy."""
|
|
60
|
+
|
|
61
|
+
action: GuardDecisionAction
|
|
62
|
+
reason: str
|
|
63
|
+
user_title: str
|
|
64
|
+
user_body: str
|
|
65
|
+
harness_message: str
|
|
66
|
+
dashboard_primary_detail: str
|
|
67
|
+
approval_scopes: tuple[str, ...]
|
|
68
|
+
retry_instruction: str | None
|
|
69
|
+
signals: tuple[RiskSignalV2, ...]
|
|
70
|
+
confidence: RiskConfidenceLabel
|
|
71
|
+
|
|
72
|
+
def to_dict(self) -> dict[str, object]:
|
|
73
|
+
return {
|
|
74
|
+
"action": self.action,
|
|
75
|
+
"reason": self.reason,
|
|
76
|
+
"user_title": self.user_title,
|
|
77
|
+
"user_body": self.user_body,
|
|
78
|
+
"harness_message": self.harness_message,
|
|
79
|
+
"dashboard_primary_detail": self.dashboard_primary_detail,
|
|
80
|
+
"approval_scopes": list(self.approval_scopes),
|
|
81
|
+
"retry_instruction": self.retry_instruction,
|
|
82
|
+
"signals": [signal.to_dict() for signal in self.signals],
|
|
83
|
+
"confidence": self.confidence,
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@classmethod
|
|
87
|
+
def from_dict(cls, payload: Mapping[str, object]) -> GuardDecisionV2:
|
|
88
|
+
return cls(
|
|
89
|
+
action=_parse_action(payload.get("action")),
|
|
90
|
+
reason=_required_string(payload, "reason"),
|
|
91
|
+
user_title=_required_string(payload, "user_title"),
|
|
92
|
+
user_body=_required_string(payload, "user_body"),
|
|
93
|
+
harness_message=_required_string(payload, "harness_message"),
|
|
94
|
+
dashboard_primary_detail=_required_string(payload, "dashboard_primary_detail"),
|
|
95
|
+
approval_scopes=_parse_string_tuple(payload.get("approval_scopes"), "approval_scopes"),
|
|
96
|
+
retry_instruction=_optional_string(payload, "retry_instruction"),
|
|
97
|
+
signals=_parse_signals(payload.get("signals")),
|
|
98
|
+
confidence=_parse_confidence(payload.get("confidence")),
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def decision_from_legacy_policy_action(
|
|
103
|
+
policy_action: GuardAction,
|
|
104
|
+
*,
|
|
105
|
+
reason: str,
|
|
106
|
+
signals: Sequence[RiskSignalV2] = (),
|
|
107
|
+
) -> GuardDecisionV2:
|
|
108
|
+
action, user_title, harness_message, retry_instruction = _ACTION_MESSAGES[policy_action]
|
|
109
|
+
signal_tuple = tuple(signals)
|
|
110
|
+
confidence = _highest_confidence(signal_tuple)
|
|
111
|
+
dashboard_detail = _dashboard_detail_from_signals(signal_tuple, harness_message)
|
|
112
|
+
return GuardDecisionV2(
|
|
113
|
+
action=action,
|
|
114
|
+
reason=reason,
|
|
115
|
+
user_title=user_title,
|
|
116
|
+
user_body=dashboard_detail,
|
|
117
|
+
harness_message=harness_message,
|
|
118
|
+
dashboard_primary_detail=dashboard_detail,
|
|
119
|
+
approval_scopes=_approval_scopes_for_action(action),
|
|
120
|
+
retry_instruction=None if action in {"allow", "warn"} else retry_instruction,
|
|
121
|
+
signals=signal_tuple,
|
|
122
|
+
confidence=confidence,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _approval_scopes_for_action(action: GuardDecisionAction) -> tuple[str, ...]:
|
|
127
|
+
if action != "ask":
|
|
128
|
+
return ()
|
|
129
|
+
return ("artifact", "workspace", "publisher", "harness")
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _dashboard_detail_from_signals(signals: tuple[RiskSignalV2, ...], fallback: str) -> str:
|
|
133
|
+
if not signals:
|
|
134
|
+
return fallback
|
|
135
|
+
strongest = max(signals, key=lambda item: _confidence_rank(item.confidence))
|
|
136
|
+
return strongest.plain_reason
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _highest_confidence(signals: tuple[RiskSignalV2, ...]) -> RiskConfidenceLabel:
|
|
140
|
+
if not signals:
|
|
141
|
+
return "likely"
|
|
142
|
+
return max((signal.confidence for signal in signals), key=_confidence_rank)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def _confidence_rank(confidence: RiskConfidenceLabel) -> int:
|
|
146
|
+
match confidence:
|
|
147
|
+
case "strong":
|
|
148
|
+
return 3
|
|
149
|
+
case "likely":
|
|
150
|
+
return 2
|
|
151
|
+
case "weak":
|
|
152
|
+
return 1
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _parse_action(value: object) -> GuardDecisionAction:
|
|
156
|
+
match value:
|
|
157
|
+
case "allow":
|
|
158
|
+
return "allow"
|
|
159
|
+
case "warn":
|
|
160
|
+
return "warn"
|
|
161
|
+
case "ask":
|
|
162
|
+
return "ask"
|
|
163
|
+
case "block":
|
|
164
|
+
return "block"
|
|
165
|
+
case _:
|
|
166
|
+
raise ValueError("action must be a known Guard decision action")
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _parse_confidence(value: object) -> RiskConfidenceLabel:
|
|
170
|
+
match value:
|
|
171
|
+
case "weak":
|
|
172
|
+
return "weak"
|
|
173
|
+
case "likely":
|
|
174
|
+
return "likely"
|
|
175
|
+
case "strong":
|
|
176
|
+
return "strong"
|
|
177
|
+
case _:
|
|
178
|
+
raise ValueError("confidence must be a known confidence label")
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def _parse_signals(value: object) -> tuple[RiskSignalV2, ...]:
|
|
182
|
+
if not isinstance(value, list):
|
|
183
|
+
raise ValueError("signals must be a list")
|
|
184
|
+
signals: list[RiskSignalV2] = []
|
|
185
|
+
for item in value:
|
|
186
|
+
if not isinstance(item, Mapping):
|
|
187
|
+
raise ValueError(f"signal item must be an object, got {type(item).__name__}")
|
|
188
|
+
signals.append(RiskSignalV2.from_dict(item))
|
|
189
|
+
return tuple(signals)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def _parse_string_tuple(value: object, key: str) -> tuple[str, ...]:
|
|
193
|
+
if not isinstance(value, list) or not all(isinstance(item, str) and item.strip() for item in value):
|
|
194
|
+
raise ValueError(f"{key} must be a list of non-empty strings")
|
|
195
|
+
return tuple(value)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _required_string(payload: Mapping[str, object], key: str) -> str:
|
|
199
|
+
value = payload.get(key)
|
|
200
|
+
if not isinstance(value, str) or not value.strip():
|
|
201
|
+
raise ValueError(f"{key} must be a non-empty string")
|
|
202
|
+
return value
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def _optional_string(payload: Mapping[str, object], key: str) -> str | None:
|
|
206
|
+
value = payload.get(key)
|
|
207
|
+
if value is None:
|
|
208
|
+
return None
|
|
209
|
+
if not isinstance(value, str):
|
|
210
|
+
raise ValueError(f"{key} must be a string or null")
|
|
211
|
+
return value
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""Behavior tests for typed Guard runtime decisions."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from codex_plugin_scanner.guard.runtime.decisions import (
|
|
8
|
+
GuardDecisionV2,
|
|
9
|
+
decision_from_legacy_policy_action,
|
|
10
|
+
)
|
|
11
|
+
from codex_plugin_scanner.guard.runtime.signals import RiskSignalV2
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _signal() -> RiskSignalV2:
|
|
15
|
+
return RiskSignalV2(
|
|
16
|
+
signal_id="secret:env-read",
|
|
17
|
+
category="secret",
|
|
18
|
+
severity="high",
|
|
19
|
+
confidence="strong",
|
|
20
|
+
detector="guard-risk-v2",
|
|
21
|
+
title="Can read local environment secrets",
|
|
22
|
+
plain_reason="can read local environment secrets",
|
|
23
|
+
technical_detail=None,
|
|
24
|
+
evidence_ref="artifact",
|
|
25
|
+
redaction_level="summary",
|
|
26
|
+
false_positive_hint="Review whether this is read-only source search.",
|
|
27
|
+
advisory_id=None,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _weak_signal() -> RiskSignalV2:
|
|
32
|
+
return RiskSignalV2(
|
|
33
|
+
signal_id="network:traffic",
|
|
34
|
+
category="network",
|
|
35
|
+
severity="medium",
|
|
36
|
+
confidence="weak",
|
|
37
|
+
detector="guard-risk-v2",
|
|
38
|
+
title="Can send network traffic",
|
|
39
|
+
plain_reason="can send or receive network traffic",
|
|
40
|
+
technical_detail=None,
|
|
41
|
+
evidence_ref="artifact",
|
|
42
|
+
redaction_level="summary",
|
|
43
|
+
false_positive_hint=None,
|
|
44
|
+
advisory_id=None,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_guard_decision_v2_round_trips_to_dict_payload() -> None:
|
|
49
|
+
decision = GuardDecisionV2(
|
|
50
|
+
action="ask",
|
|
51
|
+
reason="require-reapproval",
|
|
52
|
+
user_title="Review this changed action",
|
|
53
|
+
user_body="HOL Guard needs a fresh decision before this can run.",
|
|
54
|
+
harness_message="HOL Guard paused this changed action.",
|
|
55
|
+
dashboard_primary_detail="Changed shell command reads local secrets.",
|
|
56
|
+
approval_scopes=("artifact", "workspace"),
|
|
57
|
+
retry_instruction="Choose an approval scope, then retry in the harness.",
|
|
58
|
+
signals=(_signal(),),
|
|
59
|
+
confidence="strong",
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
payload = decision.to_dict()
|
|
63
|
+
|
|
64
|
+
assert payload == {
|
|
65
|
+
"action": "ask",
|
|
66
|
+
"reason": "require-reapproval",
|
|
67
|
+
"user_title": "Review this changed action",
|
|
68
|
+
"user_body": "HOL Guard needs a fresh decision before this can run.",
|
|
69
|
+
"harness_message": "HOL Guard paused this changed action.",
|
|
70
|
+
"dashboard_primary_detail": "Changed shell command reads local secrets.",
|
|
71
|
+
"approval_scopes": ["artifact", "workspace"],
|
|
72
|
+
"retry_instruction": "Choose an approval scope, then retry in the harness.",
|
|
73
|
+
"signals": [_signal().to_dict()],
|
|
74
|
+
"confidence": "strong",
|
|
75
|
+
}
|
|
76
|
+
assert GuardDecisionV2.from_dict(payload) == decision
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def test_guard_decision_v2_rejects_non_object_signal_entries() -> None:
|
|
80
|
+
payload = GuardDecisionV2(
|
|
81
|
+
action="ask",
|
|
82
|
+
reason="require-reapproval",
|
|
83
|
+
user_title="Review this changed action",
|
|
84
|
+
user_body="HOL Guard needs a fresh decision before this can run.",
|
|
85
|
+
harness_message="HOL Guard paused this changed action.",
|
|
86
|
+
dashboard_primary_detail="Changed shell command reads local secrets.",
|
|
87
|
+
approval_scopes=("artifact", "workspace"),
|
|
88
|
+
retry_instruction="Choose an approval scope, then retry in the harness.",
|
|
89
|
+
signals=(_signal(),),
|
|
90
|
+
confidence="strong",
|
|
91
|
+
).to_dict()
|
|
92
|
+
payload["signals"] = [_signal().to_dict(), "not-a-signal"]
|
|
93
|
+
|
|
94
|
+
with pytest.raises(ValueError, match="signal item must be an object"):
|
|
95
|
+
GuardDecisionV2.from_dict(payload)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_decision_from_legacy_policy_action_maps_all_actions() -> None:
|
|
99
|
+
cases = {
|
|
100
|
+
"allow": ("allow", "Policy allows this action."),
|
|
101
|
+
"warn": ("warn", "HOL Guard noticed risk signals, but policy allows the harness to continue."),
|
|
102
|
+
"review": ("ask", "HOL Guard needs your approval before this action can run."),
|
|
103
|
+
"sandbox-required": ("ask", "HOL Guard wants this action reviewed and run in a sandboxed path."),
|
|
104
|
+
"require-reapproval": ("ask", "HOL Guard needs a fresh approval because this action changed."),
|
|
105
|
+
"block": ("block", "HOL Guard blocked this action."),
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
for legacy_action, expected in cases.items():
|
|
109
|
+
decision = decision_from_legacy_policy_action(
|
|
110
|
+
legacy_action,
|
|
111
|
+
reason="test-reason",
|
|
112
|
+
signals=(_signal(),),
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
assert (decision.action, decision.harness_message) == expected
|
|
116
|
+
assert decision.reason == "test-reason"
|
|
117
|
+
assert decision.confidence == "strong"
|
|
118
|
+
assert decision.signals == (_signal(),)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def test_decision_from_legacy_policy_action_uses_highest_confidence_signal() -> None:
|
|
122
|
+
decision = decision_from_legacy_policy_action(
|
|
123
|
+
"review",
|
|
124
|
+
reason="mixed-signals",
|
|
125
|
+
signals=(_weak_signal(), _signal()),
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
assert decision.confidence == "strong"
|
|
129
|
+
assert decision.dashboard_primary_detail == "can read local environment secrets"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/dashboard/src/approval-center-primitives.tsx
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/__init__.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/best_practices.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/code_quality.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/ecosystem_common.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/manifest.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/manifest_support.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/marketplace.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/mcp_security.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/opencode.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/security.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/checks/skill_security.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/__init__.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/base.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/claude.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/codex.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/detect.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/gemini.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/opencode.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/registry.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/ecosystems/types.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/github_reporting.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/base.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.99 → plugin_scanner-2.0.100}/src/codex_plugin_scanner/guard/adapters/codex.py
RENAMED
|
File without changes
|