plugin-scanner 2.0.162__tar.gz → 2.0.163__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.162 → plugin_scanner-2.0.163}/PKG-INFO +1 -1
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-layout.test.ts +22 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-layout.tsx +12 -5
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-primitives.tsx +2 -1
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-utils.ts +3 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/guard-api.ts +2 -2
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/home-dashboard.test.ts +56 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/home-dashboard.tsx +10 -1
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/queue-state.test.ts +4 -4
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/queue-state.ts +3 -3
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/runtime-overview.tsx +8 -3
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/watched-app-card.tsx +3 -3
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/pyproject.toml +1 -1
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/pyproject.toml.bak +1 -1
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +410 -399
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +16 -29
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/store.py +1 -3
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/version.py +1 -1
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.dockerignore +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/dependabot.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/ci.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/codeql.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/dependabot-uv-lock.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/harness-smoke.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/publish.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/scorecard.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.gitignore +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/Dockerfile +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/LICENSE +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/README.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/SECURITY.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/index.html +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/package.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/pnpm-lock.yaml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/favicon.ico +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/app.tsx +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-mobile.test.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-review-cards.tsx +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/data-flow-evidence-card.tsx +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/fleet-workspace.tsx +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/guard-api.test.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/guard-demo.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/guard-types.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/main.tsx +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/queue-chip-filter.tsx +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/receipts-workspace.test.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/receipts-workspace.tsx +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/risk-signal-cards.test.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/risk-signal-cards.tsx +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/runtime-overview.test.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/scanner-evidence-badge.tsx +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/settings-workspace.test.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/settings-workspace.tsx +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/styles.css +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/vite-env.d.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/tsconfig.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/vite.config.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/approval-audit.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/architecture.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/get-started.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/harness-support.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/local-vs-cloud.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/release-checklist.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/release-notes.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/smoke-tests.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/testing-matrix.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/requirements.txt +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/argparse_utils.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/mcp_security.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/cli.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/cli_ui.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/github_reporting.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/access_graph_events.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/antigravity.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/cloud_identity.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/contracts.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/copilot.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/hermes.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/mcp_servers.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/openclaw.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/openclaw_config.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/openclaw_support.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/opencode_artifacts.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/advisory_model.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/approvals.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/bridge/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/capabilities.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/commands.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/connect_flow.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/install_commands.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/render.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/update_commands.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/codex_config.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/config.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/client.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/favicon.ico +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/edge_events.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/incident.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/insights.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/launcher.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/mcp_tool_calls.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/models.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/protect.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/proxy/runtime_mcp.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/redaction.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/risk.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/action_identity.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/actions.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/advisory_escalation.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/advisory_matchers.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/cisco_evidence.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/cisco_preflight.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/composition_rules.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/data_flow.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/data_flow_rules.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/data_flow_variables.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/decisions.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/detectors.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/false_positive_rules.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/mcp_protection.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/persistence_rules.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/prompt_injection.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/runner.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/safe_decode.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/sandbox.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/scanner_cache.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/secret_file_requests.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/secret_sensitivity.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/secret_sources.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/shell_commands.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/signals.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/skill_protection.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/supply_chain.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/surface_server.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/temp_files.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/threat_intel.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/schemas/guard_event_v1.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/schemas/surface_server.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/shims.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/store_connect.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/store_evidence.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/store_threat_intel.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/types.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/integrations/cisco_mcp_scanner.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/conftest.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-codex-malicious-mcp/.codex/config.toml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/README.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/benign-docs-fake-token.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/benign-health-endpoint.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/benign-nvmrc-fake-creds.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/benign-source-search.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/canary-exfil-encoded.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/canary-exfil.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/expected-decisions.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-dockerfile.txt +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-encoded-shell-exfil.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-github-action.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-mcp-delete.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-mcp-secret-read.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-mcp-skill-exfil.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-npm-postinstall.js +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-prompt-env-read.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-prompt-guard-bypass.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-prompt-npmrc-read.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-python-setup.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/smoke-evidence-template.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/config.yaml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/mcp_servers.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/skills/security/malicious/SKILL.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/SKILL.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/references/api-setup.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/scripts/deploy.sh +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/skills/utils/benign/SKILL.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/README.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/skills/leaky-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/mcp-canary-server.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/benign-npm-package.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/benign-pnpm-package.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/benign-pyproject.toml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/malicious-Dockerfile +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/malicious-action.yml +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/malicious-npm-package.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/malicious-setup.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test-trust-scoring.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test-trust-specs.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_cisco_install_surfaces.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_cli.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_coverage_remaining.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_ecosystems.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_edge_cases.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_access_graph.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_action_identity.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_advisory_escalation.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_approval_continuity.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_approval_copy_commands.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_approval_store_dedup.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_approval_store_scale.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_approvals.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_bootstrap.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_bypass_detector.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_canary_fixtures.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_capabilities.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_cisco_evidence.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_cisco_runtime_cli.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_claude_adapter.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_cli.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_cloud_local_sync.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_codex_e2e.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_codex_install.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_codex_proxy.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_config_paths.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_connect_flow.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_consumer_mode.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_copilot_adapter.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_copilot_proxy.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_cli.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_manager.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_perf.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_registry.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_repair_perf.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_wake.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_data_flow.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_decision_propagation.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_detector_fp.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_event_schema_v1.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_events.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_evidence_store.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_harness_contracts.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_harness_setup.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_harness_smoke.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_insights.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_launch_env.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_mcp_detectors.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_mcp_protection.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_opencode_proxy.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_policy_dedup.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_product_flow.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_prompt_injection.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_protect.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_queue_api_contract.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_queue_contract.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_red_team.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_red_team_e2e.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_redaction.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_render.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_resolution_copy.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_risk.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime_action_harnesses.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime_actions.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime_decisions.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime_detectors.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime_signals.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_safe_decode.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_sandbox.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_skill_protection.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_store_migrations.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_supply_chain.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_surface_server.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_threat_intel.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_verdicts.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_web_recovery.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_hermes_adapter.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_integration.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_live_cisco_smoke.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_mcp_security.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_openclaw_adapter.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_scanner.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_skill_security.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_submission.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_trust_scoring.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_versioning.py +0 -0
- {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/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.163
|
|
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
|
{plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-layout.test.ts
RENAMED
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
resolveStoppedCommandText,
|
|
4
4
|
resolveTerminalLabel,
|
|
5
5
|
displayArtifactName,
|
|
6
|
+
EMPTY_QUEUE_TITLE,
|
|
7
|
+
STALE_REQUEST_COPY,
|
|
6
8
|
} from "./approval-center-utils";
|
|
7
9
|
import type { GuardActionEnvelope, GuardApprovalRequest } from "./guard-types";
|
|
8
10
|
|
|
@@ -186,3 +188,23 @@ assert(
|
|
|
186
188
|
resolveTerminalLabel(BASE_REQUEST) === "Stopped command",
|
|
187
189
|
"T479-T484: resolveTerminalLabel returns 'Stopped command' when no envelope present"
|
|
188
190
|
);
|
|
191
|
+
|
|
192
|
+
assert(
|
|
193
|
+
EMPTY_QUEUE_TITLE === "No blocked actions",
|
|
194
|
+
'C5: Empty queue shows friendly copy "No blocked actions" — EMPTY_QUEUE_TITLE constant is correct'
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
assert(
|
|
198
|
+
EMPTY_QUEUE_TITLE.toLowerCase().includes("no blocked"),
|
|
199
|
+
'C5: Empty queue title does not say "no items" — uses friendly language instead'
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
assert(
|
|
203
|
+
STALE_REQUEST_COPY === "This request was already decided.",
|
|
204
|
+
'C6: Stale request shows "already decided" copy — STALE_REQUEST_COPY constant is correct'
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
assert(
|
|
208
|
+
STALE_REQUEST_COPY.toLowerCase().includes("already decided"),
|
|
209
|
+
'C6: Stale request copy contains "already decided" — not approve/block buttons'
|
|
210
|
+
);
|
|
@@ -47,7 +47,8 @@ import {
|
|
|
47
47
|
resolveStoppedCommandText,
|
|
48
48
|
displayArtifactName,
|
|
49
49
|
resolveTerminalLabel,
|
|
50
|
-
scopeLabel
|
|
50
|
+
scopeLabel,
|
|
51
|
+
STALE_REQUEST_COPY,
|
|
51
52
|
} from "./approval-center-utils";
|
|
52
53
|
import {
|
|
53
54
|
WhyThisPaused,
|
|
@@ -210,6 +211,9 @@ function MobileQueueDrawer(props: {
|
|
|
210
211
|
return (
|
|
211
212
|
<div
|
|
212
213
|
className="fixed inset-0 z-50 flex lg:hidden"
|
|
214
|
+
role="dialog"
|
|
215
|
+
aria-label="Review queue"
|
|
216
|
+
aria-modal="true"
|
|
213
217
|
>
|
|
214
218
|
<div className="absolute inset-0 bg-black/30 backdrop-blur-sm" onClick={props.onClose} />
|
|
215
219
|
<div className="relative ml-0 flex w-full max-w-sm flex-col overflow-hidden bg-white shadow-2xl" onClick={(e) => e.stopPropagation()}>
|
|
@@ -278,7 +282,7 @@ function QueueWorkspace(props: {
|
|
|
278
282
|
return (
|
|
279
283
|
<div className="space-y-4">
|
|
280
284
|
<Surface tone="danger">
|
|
281
|
-
<p className="text-sm font-semibold text-brand-purple">Guard is
|
|
285
|
+
<p className="text-sm font-semibold text-brand-purple">Guard connection lost. Check if the daemon is running.</p>
|
|
282
286
|
<p className="mt-1 text-sm text-brand-purple/80">{props.requests.message}</p>
|
|
283
287
|
<div className="mt-4 flex flex-wrap gap-3">
|
|
284
288
|
{props.onRepair !== undefined && (
|
|
@@ -286,6 +290,9 @@ function QueueWorkspace(props: {
|
|
|
286
290
|
{repairing ? "Repairing…" : "Repair"}
|
|
287
291
|
</ActionButton>
|
|
288
292
|
)}
|
|
293
|
+
<code className="inline-flex min-h-10 items-center rounded-lg border border-brand-purple/30 bg-slate-50 px-3 py-2 font-mono text-sm text-brand-purple select-all">
|
|
294
|
+
hol-guard start
|
|
295
|
+
</code>
|
|
289
296
|
{props.onRetry && (
|
|
290
297
|
<ActionButton variant="outline" onClick={props.onRetry}>Retry</ActionButton>
|
|
291
298
|
)}
|
|
@@ -398,7 +405,7 @@ function QueueHeader(props: {
|
|
|
398
405
|
{props.progressCopy}
|
|
399
406
|
</span>
|
|
400
407
|
)}
|
|
401
|
-
<Badge tone="
|
|
408
|
+
<Badge tone="default">{props.requests.length} waiting</Badge>
|
|
402
409
|
{activeItem ? <Tag tone="blue">{harnessDisplayName(activeItem.harness)}</Tag> : null}
|
|
403
410
|
<Tag tone="slate">{runtimeLabel}</Tag>
|
|
404
411
|
</div>
|
|
@@ -510,7 +517,7 @@ function QueueBrowser(props: {
|
|
|
510
517
|
className="min-h-11 w-full rounded-lg border border-slate-200 bg-white px-3 text-sm text-brand-dark placeholder:text-slate-400 transition-colors duration-150 focus:border-brand-blue focus:outline-none focus:ring-2 focus:ring-brand-blue/20"
|
|
511
518
|
/>
|
|
512
519
|
</label>
|
|
513
|
-
{harnesses.length >
|
|
520
|
+
{harnesses.length > 0 && (
|
|
514
521
|
<QueueChipFilter
|
|
515
522
|
harnesses={harnesses}
|
|
516
523
|
activeFilter={harnessFilter}
|
|
@@ -807,7 +814,7 @@ function DecisionWorkspace(props: {
|
|
|
807
814
|
<div className="flex items-start gap-3">
|
|
808
815
|
<HiMiniInformationCircle className="mt-0.5 h-4 w-4 shrink-0 text-slate-400" aria-hidden="true" />
|
|
809
816
|
<div>
|
|
810
|
-
<p className="text-sm font-medium text-brand-dark">
|
|
817
|
+
<p className="text-sm font-medium text-brand-dark">{STALE_REQUEST_COPY}</p>
|
|
811
818
|
<p className="mt-1 text-sm text-muted-foreground">
|
|
812
819
|
Someone already reviewed this blocked action. No further action needed.
|
|
813
820
|
</p>
|
{plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-primitives.tsx
RENAMED
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
} from "react-icons/hi2";
|
|
14
14
|
|
|
15
15
|
import { guardAwareHref } from "./guard-api";
|
|
16
|
+
import { EMPTY_QUEUE_TITLE } from "./approval-center-utils";
|
|
16
17
|
|
|
17
18
|
const footerSections = [
|
|
18
19
|
{
|
|
@@ -538,7 +539,7 @@ export function WelcomeState(props: {
|
|
|
538
539
|
<div className="mb-6 flex h-20 w-20 items-center justify-center rounded-full bg-brand-green-bg/50 ring-1 ring-brand-green/20">
|
|
539
540
|
<HiMiniShieldCheck className="h-10 w-10 text-brand-green" aria-hidden="true" />
|
|
540
541
|
</div>
|
|
541
|
-
<h2 className="text-2xl font-semibold tracking-tight text-brand-dark sm:text-3xl">
|
|
542
|
+
<h2 className="text-2xl font-semibold tracking-tight text-brand-dark sm:text-3xl">{EMPTY_QUEUE_TITLE}</h2>
|
|
542
543
|
<p className="mx-auto mt-4 max-w-lg text-[15px] leading-relaxed text-muted-foreground">
|
|
543
544
|
Guard is still watching your apps. You'll be notified here if something needs your approval.
|
|
544
545
|
</p>
|
|
@@ -6,6 +6,9 @@ import type {
|
|
|
6
6
|
RiskSignalV2
|
|
7
7
|
} from "./guard-types";
|
|
8
8
|
|
|
9
|
+
export const EMPTY_QUEUE_TITLE = "No blocked actions";
|
|
10
|
+
export const STALE_REQUEST_COPY = "This request was already decided.";
|
|
11
|
+
|
|
9
12
|
export type DataFlowEvidenceSummary = {
|
|
10
13
|
signalTitle: string;
|
|
11
14
|
sourceLabel: string;
|
|
@@ -526,7 +526,7 @@ export function buildDemoRuntimeSnapshot(): GuardRuntimeSnapshot {
|
|
|
526
526
|
const cloudState = "paired_waiting";
|
|
527
527
|
const cloudLabel = "Connected";
|
|
528
528
|
const cloudDetail =
|
|
529
|
-
"This machine is connected to Guard Cloud, but the first
|
|
529
|
+
"This machine is connected to Guard Cloud, but the first protected session has not landed yet. Open Watched Apps while the first sync settles.";
|
|
530
530
|
const dashboardUrl = "https://hol.org/guard";
|
|
531
531
|
const inboxUrl = "https://hol.org/guard/inbox";
|
|
532
532
|
const fleetUrl = "https://hol.org/guard/fleet";
|
|
@@ -549,7 +549,7 @@ export function buildDemoRuntimeSnapshot(): GuardRuntimeSnapshot {
|
|
|
549
549
|
headline_detail:
|
|
550
550
|
demoRequests.length > 0
|
|
551
551
|
? "A blocked action is waiting for review."
|
|
552
|
-
: "This machine is connected to Guard Cloud and waiting for the first
|
|
552
|
+
: "This machine is connected to Guard Cloud and waiting for the first protected session to appear.",
|
|
553
553
|
sync_configured: true,
|
|
554
554
|
cloud_state: cloudState,
|
|
555
555
|
cloud_state_label: cloudLabel,
|
|
@@ -178,3 +178,59 @@ for (const copy of [setupCopy, pendingCopy, protectedCopy]) {
|
|
|
178
178
|
`L140: Copy must not contain jargon words — got: "${copy}"`
|
|
179
179
|
);
|
|
180
180
|
}
|
|
181
|
+
|
|
182
|
+
const EXTENDED_JARGON = ["daemon", "runtime", "v1", "MCP", "harness", "artifact"];
|
|
183
|
+
function containsExtendedJargon(text: string): boolean {
|
|
184
|
+
return EXTENDED_JARGON.some((word) =>
|
|
185
|
+
text.toLowerCase().includes(word.toLowerCase())
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const setupOnlyCta = buildHomePrimaryState(0, 0);
|
|
190
|
+
assert(
|
|
191
|
+
setupOnlyCta.ctaLabel === "Set up protection",
|
|
192
|
+
'C1: setup_needed primary CTA is "Set up protection"'
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
assert(
|
|
196
|
+
setupOnlyCta.status === "setup_needed",
|
|
197
|
+
"C1: buildHomePrimaryState returns setup_needed for zero pending and zero installs"
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
const queueCta = buildHomePrimaryState(3, 1);
|
|
201
|
+
assert(
|
|
202
|
+
queueCta.ctaLabel.toLowerCase().includes("review") ||
|
|
203
|
+
queueCta.ctaLabel.toLowerCase().includes("queue") ||
|
|
204
|
+
queueCta.ctaLabel.toLowerCase().includes("action"),
|
|
205
|
+
'C2: Queue count CTA label navigates to Review Queue — label contains "review", "queue", or "action"'
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
const allStates = [
|
|
209
|
+
buildHomePrimaryState(0, 0),
|
|
210
|
+
buildHomePrimaryState(2, 2),
|
|
211
|
+
buildHomePrimaryState(0, 1),
|
|
212
|
+
];
|
|
213
|
+
const allCopies = allStates.map((s) => s.copy);
|
|
214
|
+
const allCtaLabels = allStates.map((s) => s.ctaLabel);
|
|
215
|
+
|
|
216
|
+
const uniqueCopies = new Set(allCopies);
|
|
217
|
+
assert(
|
|
218
|
+
uniqueCopies.size === allCopies.length,
|
|
219
|
+
"C3: No duplicate copy across the three dashboard states"
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
const uniqueCtaLabels = new Set(allCtaLabels);
|
|
223
|
+
assert(
|
|
224
|
+
uniqueCtaLabels.size === allCtaLabels.length,
|
|
225
|
+
"C3: No duplicate CTA labels across the three dashboard states"
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
const setupStateForJargon = buildHomePrimaryState(0, 0);
|
|
229
|
+
assert(
|
|
230
|
+
!containsExtendedJargon(setupStateForJargon.copy),
|
|
231
|
+
`C4: setup_needed copy has no jargon — got: "${setupStateForJargon.copy}"`
|
|
232
|
+
);
|
|
233
|
+
assert(
|
|
234
|
+
!containsExtendedJargon(setupStateForJargon.ctaLabel),
|
|
235
|
+
`C4: setup_needed CTA label has no jargon — got: "${setupStateForJargon.ctaLabel}"`
|
|
236
|
+
);
|
|
@@ -350,7 +350,16 @@ function AppsProtectedSection(props: AppsProtectedSectionProps) {
|
|
|
350
350
|
])
|
|
351
351
|
).sort();
|
|
352
352
|
|
|
353
|
-
if (allHarnesses.length === 0)
|
|
353
|
+
if (allHarnesses.length === 0) {
|
|
354
|
+
return (
|
|
355
|
+
<section className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6">
|
|
356
|
+
<SectionLabel>Apps protected</SectionLabel>
|
|
357
|
+
<p className="mt-3 text-sm text-muted-foreground">
|
|
358
|
+
None yet. Connect an AI harness to start.
|
|
359
|
+
</p>
|
|
360
|
+
</section>
|
|
361
|
+
);
|
|
362
|
+
}
|
|
354
363
|
|
|
355
364
|
return (
|
|
356
365
|
<section className="rounded-[1.75rem] border border-slate-200/70 bg-white/80 p-5 shadow-sm sm:p-6">
|
|
@@ -268,8 +268,8 @@ assert(
|
|
|
268
268
|
"T-QS-32: buildHomePrimaryState returns setup_needed when no watched apps and no pending"
|
|
269
269
|
);
|
|
270
270
|
assert(
|
|
271
|
-
setupNeeded.ctaLabel === "
|
|
272
|
-
"T-QS-33: buildHomePrimaryState CTA is '
|
|
271
|
+
setupNeeded.ctaLabel === "Set up protection",
|
|
272
|
+
"T-QS-33: buildHomePrimaryState CTA is 'Set up protection' when no watched apps"
|
|
273
273
|
);
|
|
274
274
|
|
|
275
275
|
const protectedState = buildHomePrimaryState(0, 2);
|
|
@@ -278,8 +278,8 @@ assert(
|
|
|
278
278
|
"T-QS-34: buildHomePrimaryState returns protected status when guarded with apps present"
|
|
279
279
|
);
|
|
280
280
|
assert(
|
|
281
|
-
protectedState.copy.includes("
|
|
282
|
-
"T-QS-35: buildHomePrimaryState copy mentions
|
|
281
|
+
protectedState.copy.includes("protecting"),
|
|
282
|
+
"T-QS-35: buildHomePrimaryState copy mentions protecting when protected"
|
|
283
283
|
);
|
|
284
284
|
|
|
285
285
|
const singlePending = buildHomePrimaryState(1, 1);
|
|
@@ -177,13 +177,13 @@ export function buildHomePrimaryState(
|
|
|
177
177
|
if (watchedAppsCount === 0) {
|
|
178
178
|
return {
|
|
179
179
|
status: "setup_needed",
|
|
180
|
-
copy: "
|
|
181
|
-
ctaLabel: "
|
|
180
|
+
copy: "Guard is running but no apps are connected yet.",
|
|
181
|
+
ctaLabel: "Set up protection",
|
|
182
182
|
};
|
|
183
183
|
}
|
|
184
184
|
return {
|
|
185
185
|
status: "protected",
|
|
186
|
-
copy: "
|
|
186
|
+
copy: "Guard is protecting your apps. No blocked actions right now.",
|
|
187
187
|
ctaLabel: "Open review queue",
|
|
188
188
|
};
|
|
189
189
|
}
|
|
@@ -32,12 +32,12 @@ function remediationLine(snapshot: GuardRuntimeSnapshot): string {
|
|
|
32
32
|
return "Open the review queue, choose what to do with the blocked action, then retry in the same chat.";
|
|
33
33
|
}
|
|
34
34
|
if (snapshot.cloud_state === "paired_waiting") {
|
|
35
|
-
return "Open Guard Cloud while the first
|
|
35
|
+
return "Open Guard Cloud while the first protected session lands and this machine finishes syncing.";
|
|
36
36
|
}
|
|
37
37
|
if (snapshot.cloud_state === "local_only") {
|
|
38
38
|
return "Stay local for now or connect this machine when you want shared queue memory and cross-device proof.";
|
|
39
39
|
}
|
|
40
|
-
return "Open Guard Cloud for shared
|
|
40
|
+
return "Open Guard Cloud for shared decisions, Watched Apps for local coverage, or the review queue when something needs your choice.";
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
export type ApprovalCenterHealthState = "ready" | "starting" | "stale" | "repair_needed";
|
|
@@ -118,6 +118,11 @@ function cloudSyncHealthTone(state: GuardCloudSyncHealth["state"]): "blue" | "sl
|
|
|
118
118
|
return "blue";
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
+
function humanizeCloudSyncHealthLabel(label: string): string {
|
|
122
|
+
if (label === "Cloud sync stale") return "Your protection history hasn't synced recently";
|
|
123
|
+
return label;
|
|
124
|
+
}
|
|
125
|
+
|
|
121
126
|
function CloudSyncHealthCard(props: { health: GuardCloudSyncHealth }) {
|
|
122
127
|
const copy = resolveCloudSyncHealthCopy(props.health);
|
|
123
128
|
return (
|
|
@@ -126,7 +131,7 @@ function CloudSyncHealthCard(props: { health: GuardCloudSyncHealth }) {
|
|
|
126
131
|
<p className="text-xs font-semibold uppercase tracking-[0.18em] text-brand-blue">
|
|
127
132
|
Cloud sync health
|
|
128
133
|
</p>
|
|
129
|
-
<Tag tone={cloudSyncHealthTone(props.health.state)}>{copy.label}</Tag>
|
|
134
|
+
<Tag tone={cloudSyncHealthTone(props.health.state)}>{humanizeCloudSyncHealthLabel(copy.label)}</Tag>
|
|
130
135
|
</div>
|
|
131
136
|
<p className="mt-2 text-sm leading-relaxed text-brand-dark/80">{copy.detail}</p>
|
|
132
137
|
</div>
|
|
@@ -75,10 +75,10 @@ function StatusBadge(props: StatusBadgeProps) {
|
|
|
75
75
|
return <Badge tone="success">Protected</Badge>;
|
|
76
76
|
}
|
|
77
77
|
if (props.status === "found_unprotected") {
|
|
78
|
-
return <Badge tone="warning">Found</Badge>;
|
|
78
|
+
return <Badge tone="warning">Found, protection not installed</Badge>;
|
|
79
79
|
}
|
|
80
80
|
if (props.status === "needs_repair") {
|
|
81
|
-
return <Badge tone="
|
|
81
|
+
return <Badge tone="warning">Repair needed</Badge>;
|
|
82
82
|
}
|
|
83
83
|
if (props.status === "not_found") {
|
|
84
84
|
return <Badge tone="default">Not found</Badge>;
|
|
@@ -124,7 +124,7 @@ function CardAction(props: CardActionProps) {
|
|
|
124
124
|
}
|
|
125
125
|
if (props.status === "needs_repair") {
|
|
126
126
|
return (
|
|
127
|
-
<ActionButton variant="
|
|
127
|
+
<ActionButton variant="outline" onClick={handleRepair}>
|
|
128
128
|
Repair
|
|
129
129
|
</ActionButton>
|
|
130
130
|
);
|
|
@@ -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.163"
|
|
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.163"
|
|
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"
|