plugin-scanner 2.0.75__tar.gz → 2.0.77__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.75 → plugin_scanner-2.0.77}/PKG-INFO +1 -1
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/receipts-workspace.tsx +40 -28
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/pyproject.toml +1 -1
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/pyproject.toml.bak +1 -1
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/commands.py +14 -1
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/render.py +76 -3
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/runtime/secret_file_requests.py +219 -39
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/version.py +1 -1
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_cli.py +10 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_connect_flow.py +2 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_render.py +34 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_risk.py +372 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.dockerignore +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/dependabot.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/workflows/ci.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/workflows/codeql.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/workflows/dependabot-uv-lock.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/workflows/harness-smoke.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/workflows/publish.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.github/workflows/scorecard.yml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.gitignore +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/Dockerfile +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/LICENSE +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/README.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/SECURITY.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/index.html +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/package.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/pnpm-lock.yaml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/public/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/public/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/public/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/public/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/public/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/public/favicon.ico +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/app.tsx +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/approval-center-layout.tsx +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/approval-center-primitives.tsx +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/approval-center-utils.ts +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/fleet-workspace.tsx +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/guard-api.ts +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/guard-demo.ts +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/guard-types.ts +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/main.tsx +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/runtime-overview.tsx +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/settings-workspace.tsx +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/styles.css +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/src/vite-env.d.ts +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/tsconfig.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/dashboard/vite.config.ts +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/docs/guard/approval-audit.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/docs/guard/architecture.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/docs/guard/get-started.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/docs/guard/harness-support.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/docs/guard/local-vs-cloud.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/docs/guard/testing-matrix.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/requirements.txt +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/argparse_utils.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/mcp_security.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/cli.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/cli_ui.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/github_reporting.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/antigravity.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/copilot.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/hermes.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/mcp_servers.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/adapters/opencode_artifacts.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/approvals.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/bridge/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/capabilities.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/connect_flow.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/install_commands.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/update_commands.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/codex_config.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/config.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/client.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/static/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/static/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/static/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/static/favicon.ico +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/edge_events.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/incident.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/launcher.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/mcp_tool_calls.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/models.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/protect.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/proxy/runtime_mcp.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/risk.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/runtime/runner.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/runtime/surface_server.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/schemas/guard_event_v1.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/schemas/surface_server.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/shims.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/store.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/store_connect.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/types.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/integrations/cisco_mcp_scanner.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/conftest.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/guard-codex-malicious-mcp/.codex/config.toml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/hermes-plugin-evil/config.yaml +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/hermes-plugin-evil/mcp_servers.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/hermes-plugin-evil/skills/security/malicious/SKILL.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/SKILL.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/references/api-setup.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/scripts/deploy.sh +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/hermes-plugin-evil/skills/utils/benign/SKILL.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/malicious-skill-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/malicious-skill-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/malicious-skill-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/malicious-skill-plugin/README.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/malicious-skill-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/malicious-skill-plugin/skills/leaky-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/mcp-canary-server.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test-trust-scoring.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test-trust-specs.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_cisco_install_surfaces.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_cli.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_coverage_remaining.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_ecosystems.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_edge_cases.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_approvals.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_bootstrap.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_capabilities.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_claude_adapter.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_codex_e2e.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_codex_install.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_codex_proxy.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_config_paths.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_consumer_mode.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_copilot_adapter.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_copilot_proxy.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_daemon_manager.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_event_schema_v1.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_events.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_launch_env.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_opencode_proxy.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_product_flow.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_protect.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_runtime.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_store_migrations.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_surface_server.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_guard_verdicts.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_hermes_adapter.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_integration.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_live_cisco_smoke.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_mcp_security.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_scanner.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_skill_security.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_submission.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_trust_scoring.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/tests/test_versioning.py +0 -0
- {plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/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.77
|
|
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
|
|
@@ -19,6 +19,7 @@ type ReceiptsState =
|
|
|
19
19
|
| { kind: "ready"; items: GuardReceipt[] };
|
|
20
20
|
|
|
21
21
|
const receiptPageSize = 8;
|
|
22
|
+
const EMPTY_RECEIPTS: GuardReceipt[] = [];
|
|
22
23
|
|
|
23
24
|
export function ReceiptsWorkspace(props: { receipts: ReceiptsState }) {
|
|
24
25
|
const [searchTerm, setSearchTerm] = useState("");
|
|
@@ -47,32 +48,18 @@ export function ReceiptsWorkspace(props: { receipts: ReceiptsState }) {
|
|
|
47
48
|
setPage(1);
|
|
48
49
|
}, [decisionFilter, harnessFilter, searchTerm, receiptCount]);
|
|
49
50
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
</Surface>
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
if (props.receipts.items.length === 0) {
|
|
66
|
-
return (
|
|
67
|
-
<EmptyState
|
|
68
|
-
title="No history yet"
|
|
69
|
-
body="Saved choices appear here after HOL Guard reviews or blocks an action."
|
|
70
|
-
/>
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
const receiptItems = props.receipts.items;
|
|
74
|
-
const harnesses = Array.from(new Set(receiptItems.map((receipt) => receipt.harness))).sort();
|
|
75
|
-
const decisions = Array.from(new Set(receiptItems.map((receipt) => receipt.policy_decision))).sort();
|
|
51
|
+
const receiptItems = props.receipts.kind === "ready" ? props.receipts.items : EMPTY_RECEIPTS;
|
|
52
|
+
|
|
53
|
+
const harnesses = useMemo(
|
|
54
|
+
() => Array.from(new Set(receiptItems.map((receipt) => receipt.harness))).sort(),
|
|
55
|
+
[receiptItems],
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
const decisions = useMemo(
|
|
59
|
+
() => Array.from(new Set(receiptItems.map((receipt) => receipt.policy_decision))).sort(),
|
|
60
|
+
[receiptItems],
|
|
61
|
+
);
|
|
62
|
+
|
|
76
63
|
const filteredReceipts = useMemo(() => {
|
|
77
64
|
const normalizedSearchTerm = searchTerm.trim().toLowerCase();
|
|
78
65
|
return receiptItems.filter((receipt) => {
|
|
@@ -97,14 +84,39 @@ export function ReceiptsWorkspace(props: { receipts: ReceiptsState }) {
|
|
|
97
84
|
return searchable.includes(normalizedSearchTerm);
|
|
98
85
|
});
|
|
99
86
|
}, [decisionFilter, harnessFilter, receiptItems, searchTerm]);
|
|
87
|
+
|
|
100
88
|
const totalPages = Math.max(1, Math.ceil(filteredReceipts.length / receiptPageSize));
|
|
101
89
|
const currentPage = Math.min(page, totalPages);
|
|
102
90
|
const pageStart = (currentPage - 1) * receiptPageSize;
|
|
103
91
|
const visibleReceipts = filteredReceipts.slice(pageStart, pageStart + receiptPageSize);
|
|
104
92
|
|
|
105
|
-
const handleNextPage = () => {
|
|
93
|
+
const handleNextPage = useCallback(() => {
|
|
106
94
|
setPage((value) => Math.min(totalPages, value + 1));
|
|
107
|
-
};
|
|
95
|
+
}, [totalPages]);
|
|
96
|
+
|
|
97
|
+
if (props.receipts.kind === "loading") {
|
|
98
|
+
return (
|
|
99
|
+
<div className="space-y-4">
|
|
100
|
+
<div className="guard-skeleton h-8 w-64" />
|
|
101
|
+
<div className="guard-skeleton h-32 w-full" />
|
|
102
|
+
</div>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
if (props.receipts.kind === "error") {
|
|
106
|
+
return (
|
|
107
|
+
<Surface tone="danger">
|
|
108
|
+
<p className="text-sm text-brand-purple">{props.receipts.message}</p>
|
|
109
|
+
</Surface>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
if (receiptItems.length === 0) {
|
|
113
|
+
return (
|
|
114
|
+
<EmptyState
|
|
115
|
+
title="No history yet"
|
|
116
|
+
body="Saved choices appear here after HOL Guard reviews or blocks an action."
|
|
117
|
+
/>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
108
120
|
|
|
109
121
|
return (
|
|
110
122
|
<div className="space-y-6">
|
|
@@ -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.77"
|
|
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.77"
|
|
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.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/commands.py
RENAMED
|
@@ -939,7 +939,7 @@ def run_guard_command(
|
|
|
939
939
|
except ValueError as error:
|
|
940
940
|
print(str(error), file=sys.stderr)
|
|
941
941
|
return 2
|
|
942
|
-
_emit("settings",
|
|
942
|
+
_emit("settings", _guard_cli_settings_payload(config), getattr(args, "json", False))
|
|
943
943
|
return 0
|
|
944
944
|
|
|
945
945
|
if args.guard_command == "exceptions":
|
|
@@ -2833,6 +2833,19 @@ def _guard_settings_payload(config: GuardConfig) -> dict[str, object]:
|
|
|
2833
2833
|
}
|
|
2834
2834
|
|
|
2835
2835
|
|
|
2836
|
+
def _guard_cli_settings_payload(config: GuardConfig) -> dict[str, object]:
|
|
2837
|
+
payload = _guard_settings_payload(config)
|
|
2838
|
+
settings = payload.get("settings")
|
|
2839
|
+
if not isinstance(settings, dict):
|
|
2840
|
+
return payload
|
|
2841
|
+
cli_settings = dict(settings)
|
|
2842
|
+
cli_settings.pop("billing", None)
|
|
2843
|
+
return {
|
|
2844
|
+
**payload,
|
|
2845
|
+
"settings": cli_settings,
|
|
2846
|
+
}
|
|
2847
|
+
|
|
2848
|
+
|
|
2836
2849
|
def _update_guard_cli_settings(*, args: argparse.Namespace, config: GuardConfig, guard_home: Path) -> GuardConfig:
|
|
2837
2850
|
settings_command = getattr(args, "settings_set_command", None)
|
|
2838
2851
|
if settings_command == "security-level":
|
{plugin_scanner-2.0.75 → plugin_scanner-2.0.77}/src/codex_plugin_scanner/guard/cli/render.py
RENAMED
|
@@ -7,6 +7,7 @@ import math
|
|
|
7
7
|
import re
|
|
8
8
|
import sys
|
|
9
9
|
import textwrap
|
|
10
|
+
from collections.abc import Callable
|
|
10
11
|
from pathlib import Path
|
|
11
12
|
from typing import Any
|
|
12
13
|
|
|
@@ -53,13 +54,15 @@ _SENSITIVE_STRING_PATTERNS: tuple[tuple[re.Pattern[str], str], ...] = (
|
|
|
53
54
|
def emit_guard_payload(command: str, payload: dict[str, object], as_json: bool) -> None:
|
|
54
55
|
"""Render Guard payloads as JSON or human-friendly rich output."""
|
|
55
56
|
|
|
57
|
+
redacted_payload = _redact_payload(payload)
|
|
56
58
|
if as_json or not _RICH_AVAILABLE:
|
|
57
|
-
|
|
59
|
+
sys.stdout.write(_render_redacted_json_payload(_json_payload_for_command(command, redacted_payload)))
|
|
60
|
+
sys.stdout.write("\n")
|
|
58
61
|
return
|
|
59
62
|
|
|
60
63
|
console = Console(file=sys.stdout, soft_wrap=True)
|
|
61
64
|
renderer = _RENDERERS.get(command, _render_fallback)
|
|
62
|
-
renderer(console,
|
|
65
|
+
renderer(console, redacted_payload)
|
|
63
66
|
|
|
64
67
|
|
|
65
68
|
def _redact_payload(value: object, *, key: str | None = None) -> object:
|
|
@@ -79,6 +82,76 @@ def _redact_payload(value: object, *, key: str | None = None) -> object:
|
|
|
79
82
|
return value
|
|
80
83
|
|
|
81
84
|
|
|
85
|
+
def _render_redacted_json_payload(redacted_payload: object) -> str:
|
|
86
|
+
if not isinstance(redacted_payload, dict):
|
|
87
|
+
return "{}"
|
|
88
|
+
return _serialize_redacted_json(redacted_payload, indent=0)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _json_payload_for_command(command: str, redacted_payload: dict[str, object]) -> dict[str, object]:
|
|
92
|
+
json_renderer = _JSON_RENDERERS.get(command)
|
|
93
|
+
if json_renderer is None:
|
|
94
|
+
return redacted_payload
|
|
95
|
+
return json_renderer(redacted_payload)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _render_settings_json_payload(redacted_payload: dict[str, object]) -> dict[str, object]:
|
|
99
|
+
settings = redacted_payload.get("settings")
|
|
100
|
+
safe_keys = (
|
|
101
|
+
"mode",
|
|
102
|
+
"security_level",
|
|
103
|
+
"default_action",
|
|
104
|
+
"unknown_publisher_action",
|
|
105
|
+
"changed_hash_action",
|
|
106
|
+
"new_network_domain_action",
|
|
107
|
+
"subprocess_action",
|
|
108
|
+
"risk_actions",
|
|
109
|
+
"risk_action_overrides",
|
|
110
|
+
"harness_risk_actions",
|
|
111
|
+
"approval_wait_timeout_seconds",
|
|
112
|
+
"approval_surface_policy",
|
|
113
|
+
"telemetry",
|
|
114
|
+
"sync",
|
|
115
|
+
)
|
|
116
|
+
safe_settings = {key: settings[key] for key in safe_keys if isinstance(settings, dict) and key in settings}
|
|
117
|
+
return {
|
|
118
|
+
"generated_at": redacted_payload.get("generated_at"),
|
|
119
|
+
"guard_home": redacted_payload.get("guard_home"),
|
|
120
|
+
"config_path": redacted_payload.get("config_path"),
|
|
121
|
+
"settings": safe_settings,
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _serialize_redacted_json(value: object, *, indent: int) -> str:
|
|
126
|
+
if isinstance(value, dict):
|
|
127
|
+
if not value:
|
|
128
|
+
return "{}"
|
|
129
|
+
child_indent = indent + 2
|
|
130
|
+
entries = [
|
|
131
|
+
(
|
|
132
|
+
f"{' ' * child_indent}{json.dumps(str(item_key))}: "
|
|
133
|
+
f"{_serialize_redacted_json(item_value, indent=child_indent)}"
|
|
134
|
+
)
|
|
135
|
+
for item_key, item_value in value.items()
|
|
136
|
+
]
|
|
137
|
+
return "{\n" + ",\n".join(entries) + "\n" + (" " * indent) + "}"
|
|
138
|
+
if isinstance(value, list):
|
|
139
|
+
if not value:
|
|
140
|
+
return "[]"
|
|
141
|
+
child_indent = indent + 2
|
|
142
|
+
items = [f"{' ' * child_indent}{_serialize_redacted_json(item, indent=child_indent)}" for item in value]
|
|
143
|
+
return "[\n" + ",\n".join(items) + "\n" + (" " * indent) + "]"
|
|
144
|
+
try:
|
|
145
|
+
return json.dumps(value)
|
|
146
|
+
except TypeError:
|
|
147
|
+
return json.dumps(str(value))
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
_JSON_RENDERERS: dict[str, Callable[[dict[str, object]], dict[str, object]]] = {
|
|
151
|
+
"settings": _render_settings_json_payload,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
|
|
82
155
|
def _render_detect(console: Console, payload: dict[str, object]) -> None:
|
|
83
156
|
detections = _coerce_dict_list(payload.get("harnesses"))
|
|
84
157
|
total_artifacts = sum(len(_coerce_dict_list(item.get("artifacts"))) for item in detections)
|
|
@@ -1040,7 +1113,7 @@ def _render_protect(console: Console, payload: dict[str, object]) -> None:
|
|
|
1040
1113
|
def _render_fallback(console: Console, payload: dict[str, object]) -> None:
|
|
1041
1114
|
console.print(
|
|
1042
1115
|
Syntax(
|
|
1043
|
-
|
|
1116
|
+
_render_redacted_json_payload(payload),
|
|
1044
1117
|
"json",
|
|
1045
1118
|
theme="ansi_dark",
|
|
1046
1119
|
word_wrap=True,
|