plugin-scanner 2.0.69__tar.gz → 2.0.71__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.69 → plugin_scanner-2.0.71}/PKG-INFO +1 -1
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/guard-api.ts +12 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/guard-types.ts +4 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/settings-workspace.tsx +223 -8
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/docs/guard/harness-support.md +14 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/docs/guard/testing-matrix.md +4 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/pyproject.toml +1 -1
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/pyproject.toml.bak +1 -1
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/copilot.py +1 -1
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/cursor.py +7 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/gemini.py +5 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/opencode.py +5 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/cli/commands.py +264 -103
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/config.py +146 -0
- plugin_scanner-2.0.71/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +9 -0
- plugin_scanner-2.0.71/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +1 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/runtime/runner.py +175 -30
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/runtime/secret_file_requests.py +1 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/version.py +1 -1
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_claude_adapter.py +8 -2
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_cli.py +131 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_config_paths.py +80 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_copilot_adapter.py +3 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_launch_env.py +193 -1
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_runtime.py +473 -6
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_surface_server.py +7 -2
- plugin_scanner-2.0.69/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +0 -9
- plugin_scanner-2.0.69/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +0 -1
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.dockerignore +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/dependabot.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/workflows/ci.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/workflows/codeql.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/workflows/dependabot-uv-lock.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/workflows/harness-smoke.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/workflows/publish.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.github/workflows/scorecard.yml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.gitignore +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/Dockerfile +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/LICENSE +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/README.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/SECURITY.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/index.html +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/package.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/pnpm-lock.yaml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/public/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/public/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/public/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/public/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/public/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/public/favicon.ico +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/app.tsx +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/approval-center-layout.tsx +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/approval-center-primitives.tsx +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/approval-center-utils.ts +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/fleet-workspace.tsx +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/guard-demo.ts +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/main.tsx +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/receipts-workspace.tsx +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/runtime-overview.tsx +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/styles.css +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/src/vite-env.d.ts +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/tsconfig.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/dashboard/vite.config.ts +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/docs/guard/approval-audit.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/docs/guard/architecture.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/docs/guard/get-started.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/docs/guard/local-vs-cloud.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/requirements.txt +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/argparse_utils.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/mcp_security.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/cli.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/cli_ui.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/github_reporting.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/antigravity.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/hermes.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/mcp_servers.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/opencode_artifacts.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/approvals.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/bridge/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/capabilities.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/cli/connect_flow.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/cli/install_commands.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/cli/render.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/cli/update_commands.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/codex_config.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/client.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/static/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/static/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/static/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/static/favicon.ico +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/edge_events.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/incident.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/launcher.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/mcp_tool_calls.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/models.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/protect.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/proxy/runtime_mcp.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/risk.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/runtime/surface_server.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/schemas/guard_event_v1.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/schemas/surface_server.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/shims.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/store.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/store_connect.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/types.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/integrations/cisco_mcp_scanner.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/conftest.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/guard-codex-malicious-mcp/.codex/config.toml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/hermes-plugin-evil/config.yaml +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/hermes-plugin-evil/mcp_servers.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/hermes-plugin-evil/skills/security/malicious/SKILL.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/SKILL.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/references/api-setup.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/scripts/deploy.sh +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/hermes-plugin-evil/skills/utils/benign/SKILL.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/malicious-skill-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/malicious-skill-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/malicious-skill-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/malicious-skill-plugin/README.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/malicious-skill-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/malicious-skill-plugin/skills/leaky-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/mcp-canary-server.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test-trust-scoring.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test-trust-specs.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_cisco_install_surfaces.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_cli.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_coverage_remaining.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_ecosystems.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_edge_cases.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_approvals.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_bootstrap.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_capabilities.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_codex_e2e.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_codex_install.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_codex_proxy.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_connect_flow.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_consumer_mode.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_copilot_proxy.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_daemon_manager.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_event_schema_v1.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_events.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_opencode_proxy.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_product_flow.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_protect.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_render.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_risk.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_store_migrations.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_guard_verdicts.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_hermes_adapter.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_integration.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_live_cisco_smoke.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_mcp_security.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_scanner.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_skill_security.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_submission.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_trust_scoring.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/tests/test_versioning.py +0 -0
- {plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/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.71
|
|
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
|
|
@@ -128,11 +128,23 @@ export async function fetchSettings(): Promise<GuardSettingsPayload> {
|
|
|
128
128
|
config_path: "~/.hol-guard/config.toml",
|
|
129
129
|
settings: {
|
|
130
130
|
mode: "prompt",
|
|
131
|
+
security_level: "balanced",
|
|
131
132
|
default_action: "warn",
|
|
132
133
|
unknown_publisher_action: "review",
|
|
133
134
|
changed_hash_action: "require-reapproval",
|
|
134
135
|
new_network_domain_action: "warn",
|
|
135
136
|
subprocess_action: "warn",
|
|
137
|
+
risk_actions: {
|
|
138
|
+
local_secret_read: "require-reapproval",
|
|
139
|
+
credential_exfiltration: "require-reapproval",
|
|
140
|
+
destructive_shell: "require-reapproval",
|
|
141
|
+
encoded_execution: "require-reapproval",
|
|
142
|
+
network_egress: "warn"
|
|
143
|
+
},
|
|
144
|
+
risk_action_overrides: {},
|
|
145
|
+
harness_risk_actions: {
|
|
146
|
+
codex: {}
|
|
147
|
+
},
|
|
136
148
|
approval_wait_timeout_seconds: 120,
|
|
137
149
|
approval_surface_policy: "auto-open-once",
|
|
138
150
|
telemetry: false,
|
|
@@ -136,11 +136,15 @@ export type GuardInventoryItem = {
|
|
|
136
136
|
|
|
137
137
|
export type GuardSettings = {
|
|
138
138
|
mode: "observe" | "prompt" | "enforce";
|
|
139
|
+
security_level: "balanced" | "strict" | "custom";
|
|
139
140
|
default_action: string;
|
|
140
141
|
unknown_publisher_action: string;
|
|
141
142
|
changed_hash_action: string;
|
|
142
143
|
new_network_domain_action: string;
|
|
143
144
|
subprocess_action: string;
|
|
145
|
+
risk_actions: Record<string, string>;
|
|
146
|
+
risk_action_overrides: Record<string, string>;
|
|
147
|
+
harness_risk_actions: Record<string, Record<string, string>>;
|
|
144
148
|
approval_wait_timeout_seconds: number;
|
|
145
149
|
approval_surface_policy: string;
|
|
146
150
|
telemetry: boolean;
|
|
@@ -30,6 +30,100 @@ const surfacePolicyOptions = [
|
|
|
30
30
|
{ value: "native-only", label: "Harness prompt only" }
|
|
31
31
|
];
|
|
32
32
|
|
|
33
|
+
const securityLevels = [
|
|
34
|
+
{
|
|
35
|
+
value: "balanced",
|
|
36
|
+
label: "Balanced",
|
|
37
|
+
description: "Ask before secret access, hidden execution, exfiltration, and destructive actions."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
value: "strict",
|
|
41
|
+
label: "Strict",
|
|
42
|
+
description: "Ask more often, including new network destinations."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
value: "custom",
|
|
46
|
+
label: "Custom",
|
|
47
|
+
description: "Use the exact choices below for this machine and connected apps."
|
|
48
|
+
}
|
|
49
|
+
] as const;
|
|
50
|
+
|
|
51
|
+
const riskControls = [
|
|
52
|
+
{
|
|
53
|
+
key: "local_secret_read",
|
|
54
|
+
label: "Local secrets",
|
|
55
|
+
description: "Files such as .env, .npmrc, .netrc, SSH keys, and cloud credentials."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: "credential_exfiltration",
|
|
59
|
+
label: "Credential sharing",
|
|
60
|
+
description: "Commands or scripts that appear to send keys, tokens, or credentials away."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
key: "destructive_shell",
|
|
64
|
+
label: "Destructive commands",
|
|
65
|
+
description: "Shell actions that delete, overwrite, or rewrite local files."
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
key: "encoded_execution",
|
|
69
|
+
label: "Hidden scripts",
|
|
70
|
+
description: "Encoded, encrypted, or decoded-and-run command payloads."
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
key: "network_egress",
|
|
74
|
+
label: "New network destinations",
|
|
75
|
+
description: "Outbound connections Guard has not seen in this context."
|
|
76
|
+
}
|
|
77
|
+
] as const;
|
|
78
|
+
|
|
79
|
+
type RiskKey = (typeof riskControls)[number]["key"];
|
|
80
|
+
|
|
81
|
+
const riskProfileActions: Record<"balanced" | "strict" | "custom", Record<RiskKey, string>> = {
|
|
82
|
+
balanced: {
|
|
83
|
+
local_secret_read: "require-reapproval",
|
|
84
|
+
credential_exfiltration: "require-reapproval",
|
|
85
|
+
destructive_shell: "require-reapproval",
|
|
86
|
+
encoded_execution: "require-reapproval",
|
|
87
|
+
network_egress: "warn"
|
|
88
|
+
},
|
|
89
|
+
strict: {
|
|
90
|
+
local_secret_read: "require-reapproval",
|
|
91
|
+
credential_exfiltration: "require-reapproval",
|
|
92
|
+
destructive_shell: "require-reapproval",
|
|
93
|
+
encoded_execution: "require-reapproval",
|
|
94
|
+
network_egress: "require-reapproval"
|
|
95
|
+
},
|
|
96
|
+
custom: {
|
|
97
|
+
local_secret_read: "require-reapproval",
|
|
98
|
+
credential_exfiltration: "require-reapproval",
|
|
99
|
+
destructive_shell: "require-reapproval",
|
|
100
|
+
encoded_execution: "require-reapproval",
|
|
101
|
+
network_egress: "warn"
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
function normalizeSettingsPayload(payload: GuardSettingsPayload): GuardSettingsPayload {
|
|
106
|
+
return {
|
|
107
|
+
...payload,
|
|
108
|
+
settings: normalizeGuardSettings(payload.settings)
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function normalizeGuardSettings(settings: GuardSettings): GuardSettings {
|
|
113
|
+
const defaults = riskProfileActions[settings.security_level];
|
|
114
|
+
const explicitOverrides = settings.risk_action_overrides ?? {};
|
|
115
|
+
const effectiveRiskActions = riskControls.reduce<Record<RiskKey, string>>((actions, risk) => {
|
|
116
|
+
actions[risk.key] = settings.risk_actions?.[risk.key] ?? explicitOverrides[risk.key] ?? defaults[risk.key];
|
|
117
|
+
return actions;
|
|
118
|
+
}, {} as Record<RiskKey, string>);
|
|
119
|
+
return {
|
|
120
|
+
...settings,
|
|
121
|
+
risk_actions: effectiveRiskActions,
|
|
122
|
+
risk_action_overrides: explicitOverrides,
|
|
123
|
+
harness_risk_actions: settings.harness_risk_actions ?? {}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
33
127
|
export function SettingsWorkspace() {
|
|
34
128
|
const [state, setState] = useState<SettingsState>({ kind: "loading" });
|
|
35
129
|
const [draft, setDraft] = useState<GuardSettings | null>(null);
|
|
@@ -41,8 +135,9 @@ export function SettingsWorkspace() {
|
|
|
41
135
|
fetchSettings()
|
|
42
136
|
.then((payload) => {
|
|
43
137
|
if (!cancelled) {
|
|
44
|
-
|
|
45
|
-
|
|
138
|
+
const normalizedPayload = normalizeSettingsPayload(payload);
|
|
139
|
+
setState({ kind: "ready", payload: normalizedPayload });
|
|
140
|
+
setDraft(normalizedPayload.settings);
|
|
46
141
|
}
|
|
47
142
|
})
|
|
48
143
|
.catch((error: unknown) => {
|
|
@@ -66,6 +161,63 @@ export function SettingsWorkspace() {
|
|
|
66
161
|
[]
|
|
67
162
|
);
|
|
68
163
|
|
|
164
|
+
const handleSecurityLevelChange = useCallback((securityLevel: GuardSettings["security_level"]) => {
|
|
165
|
+
setDraft((value) => {
|
|
166
|
+
if (value === null) return value;
|
|
167
|
+
if (securityLevel === "custom") {
|
|
168
|
+
return { ...value, security_level: securityLevel };
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
...value,
|
|
172
|
+
security_level: securityLevel,
|
|
173
|
+
risk_actions: riskProfileActions[securityLevel],
|
|
174
|
+
risk_action_overrides: {},
|
|
175
|
+
harness_risk_actions: {}
|
|
176
|
+
};
|
|
177
|
+
});
|
|
178
|
+
setSavedMessage(null);
|
|
179
|
+
}, []);
|
|
180
|
+
|
|
181
|
+
const handleRiskActionChange = useCallback(
|
|
182
|
+
(riskKey: string) => (event: ChangeEvent<HTMLSelectElement>) => {
|
|
183
|
+
setDraft((value) => {
|
|
184
|
+
if (value === null) return value;
|
|
185
|
+
return {
|
|
186
|
+
...value,
|
|
187
|
+
security_level: "custom",
|
|
188
|
+
risk_actions: {
|
|
189
|
+
...value.risk_actions,
|
|
190
|
+
[riskKey]: event.target.value
|
|
191
|
+
},
|
|
192
|
+
risk_action_overrides: {
|
|
193
|
+
...value.risk_action_overrides,
|
|
194
|
+
[riskKey]: event.target.value
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
});
|
|
198
|
+
setSavedMessage(null);
|
|
199
|
+
},
|
|
200
|
+
[]
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
const handleCodexSecretReadChange = useCallback((event: ChangeEvent<HTMLSelectElement>) => {
|
|
204
|
+
setDraft((value) => {
|
|
205
|
+
if (value === null) return value;
|
|
206
|
+
return {
|
|
207
|
+
...value,
|
|
208
|
+
security_level: "custom",
|
|
209
|
+
harness_risk_actions: {
|
|
210
|
+
...value.harness_risk_actions,
|
|
211
|
+
codex: {
|
|
212
|
+
...(value.harness_risk_actions.codex ?? {}),
|
|
213
|
+
local_secret_read: event.target.value
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
});
|
|
218
|
+
setSavedMessage(null);
|
|
219
|
+
}, []);
|
|
220
|
+
|
|
69
221
|
const handleTimeoutChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {
|
|
70
222
|
const nextValue = Number.parseInt(event.target.value, 10);
|
|
71
223
|
setDraft((value) => value === null ? value : { ...value, approval_wait_timeout_seconds: Number.isNaN(nextValue) ? 0 : nextValue });
|
|
@@ -90,9 +242,13 @@ export function SettingsWorkspace() {
|
|
|
90
242
|
setSaving(true);
|
|
91
243
|
setSavedMessage(null);
|
|
92
244
|
try {
|
|
93
|
-
const payload = await updateSettings(
|
|
94
|
-
|
|
95
|
-
|
|
245
|
+
const payload = await updateSettings({
|
|
246
|
+
...draft,
|
|
247
|
+
risk_actions: draft.security_level === "custom" ? draft.risk_actions : draft.risk_action_overrides
|
|
248
|
+
});
|
|
249
|
+
const normalizedPayload = normalizeSettingsPayload(payload);
|
|
250
|
+
setState({ kind: "ready", payload: normalizedPayload });
|
|
251
|
+
setDraft(normalizedPayload.settings);
|
|
96
252
|
setSavedMessage("Settings saved. New Guard checks use these values immediately.");
|
|
97
253
|
} catch (error) {
|
|
98
254
|
setSavedMessage(error instanceof Error ? error.message : "Unable to save settings.");
|
|
@@ -130,10 +286,10 @@ export function SettingsWorkspace() {
|
|
|
130
286
|
</div>
|
|
131
287
|
<SectionLabel>Settings</SectionLabel>
|
|
132
288
|
<h1 className="mt-2 text-3xl font-semibold tracking-tight text-brand-dark">
|
|
133
|
-
|
|
289
|
+
Choose how protective HOL Guard should be.
|
|
134
290
|
</h1>
|
|
135
291
|
<p className="mt-3 max-w-2xl text-sm leading-6 text-brand-dark/70">
|
|
136
|
-
|
|
292
|
+
Start with a simple security level, then tune exact risk types when a trusted app needs more room to work.
|
|
137
293
|
</p>
|
|
138
294
|
</div>
|
|
139
295
|
<div className="rounded-[1.65rem] border border-white/80 bg-white/80 p-4 shadow-[0_16px_40px_rgba(63,65,116,0.10)] backdrop-blur">
|
|
@@ -148,6 +304,27 @@ export function SettingsWorkspace() {
|
|
|
148
304
|
|
|
149
305
|
<section className="grid gap-6 lg:grid-cols-[minmax(0,1fr)_320px]">
|
|
150
306
|
<div className="space-y-6">
|
|
307
|
+
<div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm">
|
|
308
|
+
<SectionLabel>Security level</SectionLabel>
|
|
309
|
+
<div className="mt-4 grid gap-3 md:grid-cols-3">
|
|
310
|
+
{securityLevels.map((level) => (
|
|
311
|
+
<button
|
|
312
|
+
key={level.value}
|
|
313
|
+
type="button"
|
|
314
|
+
onClick={() => handleSecurityLevelChange(level.value)}
|
|
315
|
+
className={`min-h-32 rounded-[1.5rem] border p-4 text-left transition-all duration-150 ${
|
|
316
|
+
draft.security_level === level.value
|
|
317
|
+
? "border-brand-blue/35 bg-brand-blue/[0.07] shadow-[0_12px_32px_rgba(85,153,254,0.14)]"
|
|
318
|
+
: "border-transparent bg-surface-1/80 hover:bg-white"
|
|
319
|
+
}`}
|
|
320
|
+
>
|
|
321
|
+
<span className="text-base font-semibold text-brand-dark">{level.label}</span>
|
|
322
|
+
<span className="mt-2 block text-sm leading-6 text-muted-foreground">{level.description}</span>
|
|
323
|
+
</button>
|
|
324
|
+
))}
|
|
325
|
+
</div>
|
|
326
|
+
</div>
|
|
327
|
+
|
|
151
328
|
<div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm">
|
|
152
329
|
<SectionLabel>Protection mode</SectionLabel>
|
|
153
330
|
<div className="mt-4 grid gap-3 sm:grid-cols-3">
|
|
@@ -174,7 +351,45 @@ export function SettingsWorkspace() {
|
|
|
174
351
|
</div>
|
|
175
352
|
|
|
176
353
|
<div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm">
|
|
177
|
-
<SectionLabel>
|
|
354
|
+
<SectionLabel>Risk choices</SectionLabel>
|
|
355
|
+
<div className="mt-4 divide-y divide-slate-200/70 overflow-hidden rounded-[1.35rem] border border-slate-200/70 bg-white">
|
|
356
|
+
{riskControls.map((risk) => (
|
|
357
|
+
<div key={risk.key} className="grid gap-3 px-4 py-4 md:grid-cols-[minmax(0,1fr)_220px] md:items-center">
|
|
358
|
+
<div>
|
|
359
|
+
<p className="text-sm font-semibold text-brand-dark">{risk.label}</p>
|
|
360
|
+
<p className="mt-1 text-sm leading-6 text-muted-foreground">{risk.description}</p>
|
|
361
|
+
</div>
|
|
362
|
+
<SettingSelect
|
|
363
|
+
label="Guard should"
|
|
364
|
+
value={draft.risk_actions[risk.key] ?? "require-reapproval"}
|
|
365
|
+
options={actionOptions}
|
|
366
|
+
onChange={handleRiskActionChange(risk.key)}
|
|
367
|
+
/>
|
|
368
|
+
</div>
|
|
369
|
+
))}
|
|
370
|
+
</div>
|
|
371
|
+
</div>
|
|
372
|
+
|
|
373
|
+
<div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm">
|
|
374
|
+
<SectionLabel>Codex override</SectionLabel>
|
|
375
|
+
<div className="mt-4 grid gap-4 md:grid-cols-[minmax(0,1fr)_260px] md:items-center">
|
|
376
|
+
<div>
|
|
377
|
+
<p className="text-sm font-semibold text-brand-dark">Codex reading local secret files</p>
|
|
378
|
+
<p className="mt-1 text-sm leading-6 text-muted-foreground">
|
|
379
|
+
Use this only for trusted projects where Codex should be allowed to open files such as .env or .npmrc.
|
|
380
|
+
</p>
|
|
381
|
+
</div>
|
|
382
|
+
<SettingSelect
|
|
383
|
+
label="Codex should"
|
|
384
|
+
value={draft.harness_risk_actions.codex?.local_secret_read ?? draft.risk_actions.local_secret_read ?? "require-reapproval"}
|
|
385
|
+
options={actionOptions}
|
|
386
|
+
onChange={handleCodexSecretReadChange}
|
|
387
|
+
/>
|
|
388
|
+
</div>
|
|
389
|
+
</div>
|
|
390
|
+
|
|
391
|
+
<div className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm">
|
|
392
|
+
<SectionLabel>Advanced defaults</SectionLabel>
|
|
178
393
|
<div className="mt-4 grid gap-4 md:grid-cols-2">
|
|
179
394
|
<SettingSelect label="New action" value={draft.default_action} options={actionOptions} onChange={handleStringChange("default_action")} />
|
|
180
395
|
<SettingSelect label="Unknown source" value={draft.unknown_publisher_action} options={actionOptions} onChange={handleStringChange("unknown_publisher_action")} />
|
|
@@ -8,11 +8,13 @@ Current Guard support in this repo:
|
|
|
8
8
|
- parses configured MCP servers
|
|
9
9
|
- installs Guard-owned Codex `PreToolUse` Bash hooks so native shell commands can be denied before execution even when Codex itself is running in YOLO mode
|
|
10
10
|
- supports wrapper-mode `guard run codex`
|
|
11
|
+
- wrapper prompt screening now suppresses copied debug and incident context while still escalating risky prompt intent
|
|
11
12
|
- uses same-chat MCP elicitation for live managed MCP tool approvals in the interactive CLI and Codex App
|
|
12
13
|
- falls back to the local approval center only for nonresponsive or headless Codex sessions such as `codex exec`
|
|
13
14
|
- `claude-code`
|
|
14
15
|
- detects global and project settings, hooks, `.mcp.json`, and workspace agents
|
|
15
16
|
- supports local hook install and uninstall in `.claude/settings.local.json`
|
|
17
|
+
- has native `UserPromptSubmit` and `PreToolUse` Guard hook coverage
|
|
16
18
|
- is the best current harness for graceful approval deferral
|
|
17
19
|
- `copilot`
|
|
18
20
|
- detects read-only user config in `~/.copilot/config.json` and `~/.copilot/mcp-config.json`
|
|
@@ -20,9 +22,11 @@ Current Guard support in this repo:
|
|
|
20
22
|
- detects repo-local Copilot CLI hooks from `.github/hooks/*.json`
|
|
21
23
|
- installs and removes Guard-owned repo hooks in `.github/hooks/hol-guard-copilot.json`
|
|
22
24
|
- supports wrapper-mode `guard run copilot`
|
|
25
|
+
- has native `userPromptSubmitted`, `preToolUse`, and `postToolUse` hook coverage normalized onto the shared Guard runtime
|
|
23
26
|
- `cursor`
|
|
24
27
|
- detects global and project `mcp.json`
|
|
25
28
|
- supports wrapper-mode management state
|
|
29
|
+
- wrapper prompt screening is covered for benign debug prompts and risky secret-read prompts
|
|
26
30
|
- leaves native Cursor tool approval in place and focuses Guard on artifact trust
|
|
27
31
|
- `antigravity`
|
|
28
32
|
- detects Antigravity user settings, installed extension profiles, and Antigravity-owned MCP and skill roots
|
|
@@ -31,6 +35,7 @@ Current Guard support in this repo:
|
|
|
31
35
|
- `gemini`
|
|
32
36
|
- detects `.gemini/settings.json`, local extension manifests, embedded MCP declarations, hooks, and Gemini skill directories
|
|
33
37
|
- supports wrapper-mode management state
|
|
38
|
+
- wrapper prompt screening is covered for benign debug prompts and risky secret-read prompts
|
|
34
39
|
- falls back to the local approval center when Guard blocks a launch
|
|
35
40
|
- `hermes`
|
|
36
41
|
- detects Hermes skills plus MCP servers from `~/.hermes/config.yaml` and `~/.hermes/mcp_servers.json`
|
|
@@ -42,6 +47,7 @@ Current Guard support in this repo:
|
|
|
42
47
|
plugin files, and OpenCode-compatible skill directories
|
|
43
48
|
- supports wrapper-mode management state plus a Guard-owned runtime overlay for native skill approval prompts
|
|
44
49
|
- supports wrapper-mode `guard run opencode`
|
|
50
|
+
- wrapper prompt screening is covered for benign debug prompts and risky secret-read prompts
|
|
45
51
|
- keeps managed MCP tools on OpenCode native ask so the user can allow once, allow for the session, or reject inline
|
|
46
52
|
- blocks newly introduced OpenCode MCP, plugin, and skill artifacts before launch when local Guard policy requires
|
|
47
53
|
approval
|
|
@@ -54,6 +60,14 @@ Approval tiers:
|
|
|
54
60
|
|
|
55
61
|
The harness adapters are designed to prefer discovery and reversible overlay behavior over invasive config mutation.
|
|
56
62
|
|
|
63
|
+
The Guard Surface Server now provides one shared runtime shape across harnesses:
|
|
64
|
+
|
|
65
|
+
- session attach
|
|
66
|
+
- operation start and status updates
|
|
67
|
+
- approval request items
|
|
68
|
+
- approval-center lease and heartbeat tracking
|
|
69
|
+
- resume or completion after approval
|
|
70
|
+
|
|
57
71
|
Runtime intent protections:
|
|
58
72
|
|
|
59
73
|
- Guard evaluates prompt and tool intent for secret-bearing files beyond `.env`, including SSH, AWS, kubeconfig, Docker, npm, and Python credential files.
|
|
@@ -4,6 +4,8 @@ Automated coverage in this phase includes:
|
|
|
4
4
|
|
|
5
5
|
- Guard CLI behavior tests for detect, scan, run, diff, receipts, install, uninstall, login, and sync
|
|
6
6
|
- Guard product-flow tests for `hol-guard start`, `hol-guard status`, and launcher shim creation
|
|
7
|
+
- prompt-risk regressions for Codex, Cursor, Gemini, and OpenCode wrapper launches
|
|
8
|
+
- native prompt-hook regressions for Claude Code and Copilot hook events
|
|
7
9
|
- SQLite persistence through real command execution in temporary homes and workspaces
|
|
8
10
|
- consumer-mode JSON contract generation against scanner fixtures
|
|
9
11
|
- local HTTP sync against a live in-process server instead of mocked transport
|
|
@@ -20,6 +22,8 @@ Manual verification should include:
|
|
|
20
22
|
- `hol-guard detect opencode --json`
|
|
21
23
|
- `hol-guard install opencode --json`
|
|
22
24
|
- `hol-guard update --dry-run --json`
|
|
25
|
+
- `hol-guard run cursor --dry-run --default-action allow --json`
|
|
26
|
+
- `hol-guard run gemini --dry-run --default-action allow --json`
|
|
23
27
|
- `hol-guard run opencode --dry-run --default-action allow --json`
|
|
24
28
|
- `hol-guard run opencode --default-action require-reapproval --json`
|
|
25
29
|
- `hol-guard approvals --json`
|
|
@@ -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.71"
|
|
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.71"
|
|
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"
|
{plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/copilot.py
RENAMED
|
@@ -25,7 +25,7 @@ from .mcp_servers import (
|
|
|
25
25
|
skipped_stdio_server_names,
|
|
26
26
|
)
|
|
27
27
|
|
|
28
|
-
_MANAGED_HOOK_EVENTS = ("preToolUse", "postToolUse", "permissionRequest")
|
|
28
|
+
_MANAGED_HOOK_EVENTS = ("userPromptSubmitted", "preToolUse", "postToolUse", "permissionRequest")
|
|
29
29
|
_DETECTABLE_HOOK_EVENTS = (
|
|
30
30
|
"sessionStart",
|
|
31
31
|
"sessionEnd",
|
{plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/cursor.py
RENAMED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
5
7
|
from ..models import GuardArtifact, HarnessDetection
|
|
6
8
|
from .base import HarnessAdapter, HarnessContext, _command_available, _json_payload, _run_command_probe
|
|
7
9
|
|
|
@@ -25,6 +27,11 @@ class CursorHarnessAdapter(HarnessAdapter):
|
|
|
25
27
|
return "project"
|
|
26
28
|
return "global"
|
|
27
29
|
|
|
30
|
+
def policy_path(self, context: HarnessContext) -> Path:
|
|
31
|
+
if context.workspace_dir is not None:
|
|
32
|
+
return context.workspace_dir / ".cursor" / "mcp.json"
|
|
33
|
+
return context.home_dir / ".cursor" / "mcp.json"
|
|
34
|
+
|
|
28
35
|
def detect(self, context: HarnessContext) -> HarnessDetection:
|
|
29
36
|
config_paths = [context.home_dir / ".cursor" / "mcp.json"]
|
|
30
37
|
if context.workspace_dir is not None:
|
{plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/gemini.py
RENAMED
|
@@ -39,6 +39,11 @@ class GeminiHarnessAdapter(HarnessAdapter):
|
|
|
39
39
|
return ()
|
|
40
40
|
return tuple(str(value) for value in raw_args if isinstance(value, str))
|
|
41
41
|
|
|
42
|
+
def policy_path(self, context: HarnessContext) -> Path:
|
|
43
|
+
if context.workspace_dir is not None:
|
|
44
|
+
return context.workspace_dir / ".gemini" / "settings.json"
|
|
45
|
+
return context.home_dir / ".gemini" / "settings.json"
|
|
46
|
+
|
|
42
47
|
def detect(self, context: HarnessContext) -> HarnessDetection:
|
|
43
48
|
artifacts: list[GuardArtifact] = []
|
|
44
49
|
found_paths: list[str] = []
|
{plugin_scanner-2.0.69 → plugin_scanner-2.0.71}/src/codex_plugin_scanner/guard/adapters/opencode.py
RENAMED
|
@@ -97,6 +97,11 @@ class OpenCodeHarnessAdapter(HarnessAdapter):
|
|
|
97
97
|
return "project"
|
|
98
98
|
return "global"
|
|
99
99
|
|
|
100
|
+
def policy_path(self, context: HarnessContext) -> Path:
|
|
101
|
+
if context.workspace_dir is not None:
|
|
102
|
+
return context.workspace_dir / "opencode.json"
|
|
103
|
+
return context.home_dir / ".config" / "opencode" / "opencode.json"
|
|
104
|
+
|
|
100
105
|
def detect(self, context: HarnessContext) -> HarnessDetection:
|
|
101
106
|
artifacts = []
|
|
102
107
|
found_paths: list[str] = []
|