plugin-scanner 2.0.101__tar.gz → 2.0.102__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.101 → plugin_scanner-2.0.102}/PKG-INFO +1 -1
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/pyproject.toml +1 -1
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/pyproject.toml.bak +1 -1
- plugin_scanner-2.0.102/src/codex_plugin_scanner/guard/adapters/cloud_identity.py +88 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/hermes.py +13 -1
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/openclaw.py +13 -1
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/version.py +1 -1
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_hermes_adapter.py +68 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_openclaw_adapter.py +68 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.dockerignore +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/dependabot.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/workflows/ci.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/workflows/codeql.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/workflows/dependabot-uv-lock.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/workflows/harness-smoke.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/workflows/publish.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.github/workflows/scorecard.yml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.gitignore +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/Dockerfile +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/LICENSE +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/README.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/SECURITY.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/index.html +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/package.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/pnpm-lock.yaml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/public/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/public/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/public/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/public/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/public/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/public/favicon.ico +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/app.tsx +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/approval-center-layout.tsx +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/approval-center-primitives.tsx +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/approval-center-utils.ts +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/fleet-workspace.tsx +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/guard-api.test.ts +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/guard-api.ts +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/guard-demo.ts +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/guard-types.ts +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/main.tsx +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/receipts-workspace.tsx +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/runtime-overview.tsx +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/settings-workspace.tsx +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/styles.css +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/src/vite-env.d.ts +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/tsconfig.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/dashboard/vite.config.ts +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/docs/guard/approval-audit.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/docs/guard/architecture.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/docs/guard/get-started.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/docs/guard/harness-support.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/docs/guard/local-vs-cloud.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/docs/guard/testing-matrix.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/requirements.txt +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/argparse_utils.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/mcp_security.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/cli.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/cli_ui.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/github_reporting.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/antigravity.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/copilot.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/mcp_servers.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/openclaw_config.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/openclaw_support.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/opencode_artifacts.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/advisory_model.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/approvals.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/bridge/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/capabilities.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/cli/commands.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/cli/connect_flow.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/cli/install_commands.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/cli/render.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/cli/update_commands.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/codex_config.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/config.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/client.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/static/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/static/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/static/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/static/favicon.ico +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/edge_events.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/incident.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/launcher.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/mcp_tool_calls.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/models.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/protect.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/proxy/runtime_mcp.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/redaction.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/risk.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/runtime/actions.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/runtime/decisions.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/runtime/runner.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/runtime/secret_file_requests.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/runtime/signals.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/runtime/surface_server.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/schemas/guard_event_v1.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/schemas/surface_server.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/shims.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/store.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/store_connect.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/types.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/integrations/cisco_mcp_scanner.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/conftest.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/guard-codex-malicious-mcp/.codex/config.toml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/hermes-plugin-evil/config.yaml +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/hermes-plugin-evil/mcp_servers.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/hermes-plugin-evil/skills/security/malicious/SKILL.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/SKILL.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/references/api-setup.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/scripts/deploy.sh +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/hermes-plugin-evil/skills/utils/benign/SKILL.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/malicious-skill-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/malicious-skill-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/malicious-skill-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/malicious-skill-plugin/README.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/malicious-skill-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/malicious-skill-plugin/skills/leaky-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/mcp-canary-server.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test-trust-scoring.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test-trust-specs.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_cisco_install_surfaces.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_cli.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_coverage_remaining.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_ecosystems.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_edge_cases.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_approvals.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_bootstrap.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_capabilities.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_claude_adapter.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_cli.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_codex_e2e.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_codex_install.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_codex_proxy.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_config_paths.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_connect_flow.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_consumer_mode.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_copilot_adapter.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_copilot_proxy.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_daemon_manager.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_event_schema_v1.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_events.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_launch_env.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_opencode_proxy.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_product_flow.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_protect.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_render.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_risk.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_runtime.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_runtime_action_harnesses.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_runtime_actions.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_runtime_decisions.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_runtime_signals.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_store_migrations.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_surface_server.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_guard_verdicts.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_integration.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_live_cisco_smoke.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_mcp_security.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_scanner.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_skill_security.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_submission.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_trust_scoring.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/tests/test_versioning.py +0 -0
- {plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/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.102
|
|
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.102"
|
|
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.102"
|
|
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,88 @@
|
|
|
1
|
+
"""Guard Cloud agent identity hints for local harness adapters."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import sqlite3
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from .base import HarnessContext
|
|
10
|
+
|
|
11
|
+
_SERVICE_RUNTIME_PROFILE_STATE_KEY = "service_runtime_profile"
|
|
12
|
+
_PROFILE_FIELDS = (
|
|
13
|
+
"runtime",
|
|
14
|
+
"label",
|
|
15
|
+
"workspace",
|
|
16
|
+
"surface",
|
|
17
|
+
"client_name",
|
|
18
|
+
"client_title",
|
|
19
|
+
"client_version",
|
|
20
|
+
"agent_id",
|
|
21
|
+
"principal_id",
|
|
22
|
+
)
|
|
23
|
+
_ENV_FIELDS = {
|
|
24
|
+
"runtime": "RUNTIME",
|
|
25
|
+
"label": "LABEL",
|
|
26
|
+
"workspace": "WORKSPACE",
|
|
27
|
+
"agent_id": "AGENT_ID",
|
|
28
|
+
"principal_id": "PRINCIPAL_ID",
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def cloud_agent_identity_hints(
|
|
33
|
+
context: HarnessContext,
|
|
34
|
+
*,
|
|
35
|
+
runtime: str,
|
|
36
|
+
) -> dict[str, str] | None:
|
|
37
|
+
payload = _read_service_runtime_profile(context.guard_home / "guard.db")
|
|
38
|
+
if payload is None or _string_field(payload, "runtime") != runtime:
|
|
39
|
+
return None
|
|
40
|
+
hints = {field: value for field in _PROFILE_FIELDS if (value := _string_field(payload, field)) is not None}
|
|
41
|
+
return hints if hints else None
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def cloud_agent_identity_environment(
|
|
45
|
+
identity: object,
|
|
46
|
+
*,
|
|
47
|
+
prefix: str,
|
|
48
|
+
) -> dict[str, str]:
|
|
49
|
+
if not isinstance(identity, dict):
|
|
50
|
+
return {}
|
|
51
|
+
env: dict[str, str] = {}
|
|
52
|
+
for field, suffix in _ENV_FIELDS.items():
|
|
53
|
+
value = identity.get(field)
|
|
54
|
+
if isinstance(value, str) and value:
|
|
55
|
+
env[f"{prefix}_GUARD_CLOUD_{suffix}"] = value
|
|
56
|
+
return env
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _read_service_runtime_profile(db_path: Path) -> dict[str, object] | None:
|
|
60
|
+
if not db_path.exists():
|
|
61
|
+
return None
|
|
62
|
+
try:
|
|
63
|
+
db_uri = f"{db_path.resolve().as_uri()}?mode=ro"
|
|
64
|
+
connection = sqlite3.connect(db_uri, uri=True)
|
|
65
|
+
try:
|
|
66
|
+
row = connection.execute(
|
|
67
|
+
"select payload_json from sync_state where state_key = ?",
|
|
68
|
+
(_SERVICE_RUNTIME_PROFILE_STATE_KEY,),
|
|
69
|
+
).fetchone()
|
|
70
|
+
finally:
|
|
71
|
+
connection.close()
|
|
72
|
+
except (OSError, sqlite3.Error):
|
|
73
|
+
return None
|
|
74
|
+
if row is None:
|
|
75
|
+
return None
|
|
76
|
+
try:
|
|
77
|
+
payload = json.loads(str(row[0]))
|
|
78
|
+
except json.JSONDecodeError:
|
|
79
|
+
return None
|
|
80
|
+
return payload if isinstance(payload, dict) else None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _string_field(payload: dict[str, object], field: str) -> str | None:
|
|
84
|
+
value = payload.get(field)
|
|
85
|
+
if not isinstance(value, str):
|
|
86
|
+
return None
|
|
87
|
+
stripped = value.strip()
|
|
88
|
+
return stripped or None
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/guard/adapters/hermes.py
RENAMED
|
@@ -16,6 +16,7 @@ from pathlib import Path
|
|
|
16
16
|
from ..models import GuardArtifact, HarnessDetection
|
|
17
17
|
from ..shims import install_guard_shim, remove_guard_shim
|
|
18
18
|
from .base import HarnessAdapter, HarnessContext, _command_available, _json_payload, _run_command_probe
|
|
19
|
+
from .cloud_identity import cloud_agent_identity_environment, cloud_agent_identity_hints
|
|
19
20
|
|
|
20
21
|
# Optional: PyYAML is preferred when available for robust YAML parsing.
|
|
21
22
|
# The adapter works without it via a line-based fallback parser.
|
|
@@ -83,6 +84,7 @@ class HermesHarnessAdapter(HarnessAdapter):
|
|
|
83
84
|
)
|
|
84
85
|
source_configs = _load_mcp_server_sources(context.home_dir / ".hermes")
|
|
85
86
|
overlay_servers = _overlay_servers(context=context, source_configs=source_configs)
|
|
87
|
+
cloud_identity = cloud_agent_identity_hints(context, runtime=self.harness)
|
|
86
88
|
overlay_path.write_text(json.dumps(overlay_servers, indent=2) + "\n", encoding="utf-8")
|
|
87
89
|
pretool_path.write_text(
|
|
88
90
|
json.dumps(_pretool_payload(context=context), indent=2) + "\n",
|
|
@@ -109,6 +111,8 @@ class HermesHarnessAdapter(HarnessAdapter):
|
|
|
109
111
|
*[str(note) for note in shim_manifest.get("notes", [])],
|
|
110
112
|
],
|
|
111
113
|
}
|
|
114
|
+
if cloud_identity is not None:
|
|
115
|
+
manifest["cloud_agent_identity"] = cloud_identity
|
|
112
116
|
manifest_path.write_text(json.dumps(manifest, indent=2) + "\n", encoding="utf-8")
|
|
113
117
|
return manifest
|
|
114
118
|
|
|
@@ -147,10 +151,17 @@ class HermesHarnessAdapter(HarnessAdapter):
|
|
|
147
151
|
pretool_path = manifest.get("pretool_hook_path")
|
|
148
152
|
if not isinstance(overlay_path, str) or not isinstance(pretool_path, str):
|
|
149
153
|
return {}
|
|
150
|
-
|
|
154
|
+
environment = {
|
|
151
155
|
"HERMES_GUARD_MCP_OVERLAY_PATH": overlay_path,
|
|
152
156
|
"HERMES_GUARD_PRETOOL_PATH": pretool_path,
|
|
153
157
|
}
|
|
158
|
+
environment.update(
|
|
159
|
+
cloud_agent_identity_environment(
|
|
160
|
+
cloud_agent_identity_hints(context, runtime=self.harness),
|
|
161
|
+
prefix="HERMES",
|
|
162
|
+
)
|
|
163
|
+
)
|
|
164
|
+
return environment
|
|
154
165
|
|
|
155
166
|
def runtime_probe(self, context: HarnessContext) -> dict[str, object] | None:
|
|
156
167
|
manifest = _json_payload(_managed_root(context) / "manifest.json")
|
|
@@ -165,6 +176,7 @@ class HermesHarnessAdapter(HarnessAdapter):
|
|
|
165
176
|
and isinstance(pretool_path, str)
|
|
166
177
|
and Path(pretool_path).exists()
|
|
167
178
|
),
|
|
179
|
+
"cloud_agent_identity_configured": bool(cloud_agent_identity_hints(context, runtime=self.harness)),
|
|
168
180
|
}
|
|
169
181
|
|
|
170
182
|
def approval_flow(self, *, managed_install: dict[str, object] | None = None) -> dict[str, object]:
|
|
@@ -15,6 +15,7 @@ from .base import (
|
|
|
15
15
|
_json_payload,
|
|
16
16
|
_run_command_probe,
|
|
17
17
|
)
|
|
18
|
+
from .cloud_identity import cloud_agent_identity_environment, cloud_agent_identity_hints
|
|
18
19
|
from .openclaw_config import load_config
|
|
19
20
|
from .openclaw_support import (
|
|
20
21
|
config_artifacts,
|
|
@@ -77,6 +78,7 @@ class OpenClawHarnessAdapter(HarnessAdapter):
|
|
|
77
78
|
pretool_path=pretool_path,
|
|
78
79
|
)
|
|
79
80
|
detection = self.detect(context)
|
|
81
|
+
cloud_identity = cloud_agent_identity_hints(context, runtime=self.harness)
|
|
80
82
|
overlay_path.write_text(json.dumps(overlay_payload(detection), indent=2) + "\n", encoding="utf-8")
|
|
81
83
|
pretool_path.write_text(json.dumps(pretool_payload(context=context), indent=2) + "\n", encoding="utf-8")
|
|
82
84
|
manifest = {
|
|
@@ -102,6 +104,8 @@ class OpenClawHarnessAdapter(HarnessAdapter):
|
|
|
102
104
|
*[str(note) for note in shim_manifest.get("notes", [])],
|
|
103
105
|
],
|
|
104
106
|
}
|
|
107
|
+
if cloud_identity is not None:
|
|
108
|
+
manifest["cloud_agent_identity"] = cloud_identity
|
|
105
109
|
manifest_path.write_text(json.dumps(manifest, indent=2) + "\n", encoding="utf-8")
|
|
106
110
|
return manifest
|
|
107
111
|
|
|
@@ -137,11 +141,18 @@ class OpenClawHarnessAdapter(HarnessAdapter):
|
|
|
137
141
|
pretool_path = manifest.get("pretool_hook_path")
|
|
138
142
|
if not isinstance(overlay_path, str) or not isinstance(pretool_path, str):
|
|
139
143
|
return {}
|
|
140
|
-
|
|
144
|
+
environment = {
|
|
141
145
|
"OPENCLAW_GUARD_OVERLAY_PATH": overlay_path,
|
|
142
146
|
"OPENCLAW_GUARD_PRETOOL_PATH": pretool_path,
|
|
143
147
|
"OPENCLAW_GUARD_CHANNEL_POSTURE": "enabled",
|
|
144
148
|
}
|
|
149
|
+
environment.update(
|
|
150
|
+
cloud_agent_identity_environment(
|
|
151
|
+
cloud_agent_identity_hints(context, runtime=self.harness),
|
|
152
|
+
prefix="OPENCLAW",
|
|
153
|
+
)
|
|
154
|
+
)
|
|
155
|
+
return environment
|
|
145
156
|
|
|
146
157
|
def runtime_probe(self, context: HarnessContext) -> dict[str, object] | None:
|
|
147
158
|
manifest = _json_payload(managed_root(context) / "manifest.json")
|
|
@@ -156,6 +167,7 @@ class OpenClawHarnessAdapter(HarnessAdapter):
|
|
|
156
167
|
and isinstance(pretool_path, str)
|
|
157
168
|
and Path(pretool_path).exists()
|
|
158
169
|
),
|
|
170
|
+
"cloud_agent_identity_configured": bool(cloud_agent_identity_hints(context, runtime=self.harness)),
|
|
159
171
|
}
|
|
160
172
|
|
|
161
173
|
def approval_flow(self, *, managed_install: dict[str, object] | None = None) -> dict[str, object]:
|
|
@@ -13,6 +13,7 @@ from codex_plugin_scanner.guard.adapters.hermes import (
|
|
|
13
13
|
_looks_like_secret,
|
|
14
14
|
)
|
|
15
15
|
from codex_plugin_scanner.guard.risk import artifact_risk_signals
|
|
16
|
+
from codex_plugin_scanner.guard.store import GuardStore
|
|
16
17
|
|
|
17
18
|
FIXTURES = Path(__file__).parent / "fixtures" / "hermes-plugin-evil"
|
|
18
19
|
|
|
@@ -30,6 +31,26 @@ def _write(path: Path, content: str) -> None:
|
|
|
30
31
|
path.write_text(content, encoding="utf-8")
|
|
31
32
|
|
|
32
33
|
|
|
34
|
+
def _seed_cloud_profile(context: HarnessContext, runtime: str = "hermes") -> None:
|
|
35
|
+
GuardStore(context.guard_home).set_sync_payload(
|
|
36
|
+
"service_runtime_profile",
|
|
37
|
+
{
|
|
38
|
+
"runtime": runtime,
|
|
39
|
+
"label": "Hermes Telegram agent",
|
|
40
|
+
"workspace": "workspace_ops",
|
|
41
|
+
"surface": "agent-sdk",
|
|
42
|
+
"client_name": "hol-guard",
|
|
43
|
+
"client_title": "Hermes Telegram agent",
|
|
44
|
+
"client_version": "2.0.95",
|
|
45
|
+
"agent_id": "agent_123",
|
|
46
|
+
"principal_id": "principal_123",
|
|
47
|
+
"sync_url": "https://hol.org/api/guard/receipts/sync",
|
|
48
|
+
"token": "guard_live_secret",
|
|
49
|
+
},
|
|
50
|
+
"2026-05-05T00:00:00.000Z",
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
33
54
|
def test_install_generates_guard_managed_overlay_and_pretool_files(tmp_path: Path):
|
|
34
55
|
_write(
|
|
35
56
|
tmp_path / ".hermes" / "config.yaml",
|
|
@@ -65,6 +86,53 @@ def test_install_generates_guard_managed_overlay_and_pretool_files(tmp_path: Pat
|
|
|
65
86
|
assert manifest["servers"]["yaml:remote-docs"]["headers"] == {"Authorization": "Bearer test-token"}
|
|
66
87
|
|
|
67
88
|
|
|
89
|
+
def test_install_includes_non_secret_cloud_identity_hints_when_configured(tmp_path: Path):
|
|
90
|
+
context = _ctx(tmp_path)
|
|
91
|
+
_seed_cloud_profile(context)
|
|
92
|
+
|
|
93
|
+
manifest = HermesHarnessAdapter().install(context)
|
|
94
|
+
identity = manifest["cloud_agent_identity"]
|
|
95
|
+
env = HermesHarnessAdapter().launch_environment(context)
|
|
96
|
+
|
|
97
|
+
assert identity == {
|
|
98
|
+
"runtime": "hermes",
|
|
99
|
+
"label": "Hermes Telegram agent",
|
|
100
|
+
"workspace": "workspace_ops",
|
|
101
|
+
"surface": "agent-sdk",
|
|
102
|
+
"client_name": "hol-guard",
|
|
103
|
+
"client_title": "Hermes Telegram agent",
|
|
104
|
+
"client_version": "2.0.95",
|
|
105
|
+
"agent_id": "agent_123",
|
|
106
|
+
"principal_id": "principal_123",
|
|
107
|
+
}
|
|
108
|
+
assert "token" not in identity
|
|
109
|
+
assert "sync_url" not in identity
|
|
110
|
+
assert env["HERMES_GUARD_CLOUD_WORKSPACE"] == "workspace_ops"
|
|
111
|
+
assert env["HERMES_GUARD_CLOUD_AGENT_ID"] == "agent_123"
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def test_install_omits_cloud_identity_hints_for_other_runtimes(tmp_path: Path):
|
|
115
|
+
context = _ctx(tmp_path)
|
|
116
|
+
_seed_cloud_profile(context, runtime="openclaw")
|
|
117
|
+
|
|
118
|
+
manifest = HermesHarnessAdapter().install(context)
|
|
119
|
+
env = HermesHarnessAdapter().launch_environment(context)
|
|
120
|
+
|
|
121
|
+
assert "cloud_agent_identity" not in manifest
|
|
122
|
+
assert "HERMES_GUARD_CLOUD_WORKSPACE" not in env
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def test_launch_environment_recomputes_cloud_identity_hints(tmp_path: Path):
|
|
126
|
+
context = _ctx(tmp_path)
|
|
127
|
+
_seed_cloud_profile(context)
|
|
128
|
+
|
|
129
|
+
HermesHarnessAdapter().install(context)
|
|
130
|
+
_seed_cloud_profile(context, runtime="openclaw")
|
|
131
|
+
env = HermesHarnessAdapter().launch_environment(context)
|
|
132
|
+
|
|
133
|
+
assert "HERMES_GUARD_CLOUD_WORKSPACE" not in env
|
|
134
|
+
|
|
135
|
+
|
|
68
136
|
def test_install_stringifies_typed_env_values_in_managed_manifest(tmp_path: Path):
|
|
69
137
|
_write(
|
|
70
138
|
tmp_path / ".hermes" / "config.yaml",
|
|
@@ -11,6 +11,7 @@ from codex_plugin_scanner.guard.adapters import get_adapter, list_adapters
|
|
|
11
11
|
from codex_plugin_scanner.guard.adapters.base import HarnessContext
|
|
12
12
|
from codex_plugin_scanner.guard.adapters.openclaw import OpenClawHarnessAdapter
|
|
13
13
|
from codex_plugin_scanner.guard.risk import artifact_risk_signals
|
|
14
|
+
from codex_plugin_scanner.guard.store import GuardStore
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
def _ctx(tmp_path: Path) -> HarnessContext:
|
|
@@ -28,6 +29,26 @@ def _write(path: Path, content: str) -> None:
|
|
|
28
29
|
path.write_text(content, encoding="utf-8")
|
|
29
30
|
|
|
30
31
|
|
|
32
|
+
def _seed_cloud_profile(context: HarnessContext, runtime: str = "openclaw") -> None:
|
|
33
|
+
GuardStore(context.guard_home).set_sync_payload(
|
|
34
|
+
"service_runtime_profile",
|
|
35
|
+
{
|
|
36
|
+
"runtime": runtime,
|
|
37
|
+
"label": "OpenClaw runtime",
|
|
38
|
+
"workspace": "workspace_ops",
|
|
39
|
+
"surface": "agent-sdk",
|
|
40
|
+
"client_name": "hol-guard",
|
|
41
|
+
"client_title": "OpenClaw runtime",
|
|
42
|
+
"client_version": "2.0.95",
|
|
43
|
+
"agent_id": "agent_456",
|
|
44
|
+
"principal_id": "principal_456",
|
|
45
|
+
"token": "guard_live_secret",
|
|
46
|
+
"sync_url": "https://hol.org/api/guard/receipts/sync",
|
|
47
|
+
},
|
|
48
|
+
"2026-05-05T00:00:00.000Z",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
31
52
|
def test_openclaw_adapter_is_registered() -> None:
|
|
32
53
|
adapter = get_adapter("openclaw")
|
|
33
54
|
|
|
@@ -325,6 +346,53 @@ def test_install_exports_guard_managed_openclaw_overlay(tmp_path: Path) -> None:
|
|
|
325
346
|
assert env["OPENCLAW_GUARD_CHANNEL_POSTURE"] == "enabled"
|
|
326
347
|
|
|
327
348
|
|
|
349
|
+
def test_install_exports_cloud_identity_hints_without_secret_values(tmp_path: Path) -> None:
|
|
350
|
+
context = _ctx(tmp_path)
|
|
351
|
+
_seed_cloud_profile(context)
|
|
352
|
+
|
|
353
|
+
manifest = OpenClawHarnessAdapter().install(context)
|
|
354
|
+
identity = manifest["cloud_agent_identity"]
|
|
355
|
+
env = OpenClawHarnessAdapter().launch_environment(context)
|
|
356
|
+
|
|
357
|
+
assert identity == {
|
|
358
|
+
"runtime": "openclaw",
|
|
359
|
+
"label": "OpenClaw runtime",
|
|
360
|
+
"workspace": "workspace_ops",
|
|
361
|
+
"surface": "agent-sdk",
|
|
362
|
+
"client_name": "hol-guard",
|
|
363
|
+
"client_title": "OpenClaw runtime",
|
|
364
|
+
"client_version": "2.0.95",
|
|
365
|
+
"agent_id": "agent_456",
|
|
366
|
+
"principal_id": "principal_456",
|
|
367
|
+
}
|
|
368
|
+
assert "token" not in identity
|
|
369
|
+
assert "sync_url" not in identity
|
|
370
|
+
assert env["OPENCLAW_GUARD_CLOUD_WORKSPACE"] == "workspace_ops"
|
|
371
|
+
assert env["OPENCLAW_GUARD_CLOUD_AGENT_ID"] == "agent_456"
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def test_install_ignores_cloud_identity_hints_for_other_runtimes(tmp_path: Path) -> None:
|
|
375
|
+
context = _ctx(tmp_path)
|
|
376
|
+
_seed_cloud_profile(context, runtime="hermes")
|
|
377
|
+
|
|
378
|
+
manifest = OpenClawHarnessAdapter().install(context)
|
|
379
|
+
env = OpenClawHarnessAdapter().launch_environment(context)
|
|
380
|
+
|
|
381
|
+
assert "cloud_agent_identity" not in manifest
|
|
382
|
+
assert "OPENCLAW_GUARD_CLOUD_WORKSPACE" not in env
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def test_launch_environment_recomputes_cloud_identity_hints(tmp_path: Path) -> None:
|
|
386
|
+
context = _ctx(tmp_path)
|
|
387
|
+
_seed_cloud_profile(context)
|
|
388
|
+
|
|
389
|
+
OpenClawHarnessAdapter().install(context)
|
|
390
|
+
_seed_cloud_profile(context, runtime="hermes")
|
|
391
|
+
env = OpenClawHarnessAdapter().launch_environment(context)
|
|
392
|
+
|
|
393
|
+
assert "OPENCLAW_GUARD_CLOUD_WORKSPACE" not in env
|
|
394
|
+
|
|
395
|
+
|
|
328
396
|
def test_openclaw_skips_symlinked_skill_files(tmp_path: Path) -> None:
|
|
329
397
|
context = _ctx(tmp_path)
|
|
330
398
|
skill_root = context.home_dir / ".openclaw" / "workspace" / "skills" / "linked"
|
|
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.101 → plugin_scanner-2.0.102}/.github/ISSUE_TEMPLATE/feature-request.yml
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
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/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
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/argparse_utils.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/__init__.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/best_practices.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/code_quality.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/manifest.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/marketplace.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/mcp_security.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/opencode.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/checks/security.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/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.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/__init__.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/base.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/claude.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/codex.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.101 → plugin_scanner-2.0.102}/src/codex_plugin_scanner/ecosystems/detect.py
RENAMED
|
File without changes
|