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.
Files changed (463) hide show
  1. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/PKG-INFO +1 -1
  2. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-layout.test.ts +22 -0
  3. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-layout.tsx +12 -5
  4. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-primitives.tsx +2 -1
  5. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-utils.ts +3 -0
  6. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/guard-api.ts +2 -2
  7. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/home-dashboard.test.ts +56 -0
  8. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/home-dashboard.tsx +10 -1
  9. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/queue-state.test.ts +4 -4
  10. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/queue-state.ts +3 -3
  11. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/runtime-overview.tsx +8 -3
  12. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/watched-app-card.tsx +3 -3
  13. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/pyproject.toml +1 -1
  14. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/pyproject.toml.bak +1 -1
  15. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +410 -399
  16. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +16 -29
  17. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/store.py +1 -3
  18. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/version.py +1 -1
  19. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.clusterfuzzlite/Dockerfile +0 -0
  20. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.clusterfuzzlite/build.sh +0 -0
  21. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.clusterfuzzlite/project.yaml +0 -0
  22. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.clusterfuzzlite/requirements-atheris.txt +0 -0
  23. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.dockerignore +0 -0
  24. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/CODEOWNERS +0 -0
  25. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  26. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  27. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  28. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/dependabot.yml +0 -0
  29. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/ci.yml +0 -0
  30. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/codeql.yml +0 -0
  31. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/dependabot-uv-lock.yml +0 -0
  32. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/fuzz.yml +0 -0
  33. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/harness-smoke.yml +0 -0
  34. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/publish.yml +0 -0
  35. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.github/workflows/scorecard.yml +0 -0
  36. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.gitignore +0 -0
  37. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/.pre-commit-hooks.yaml +0 -0
  38. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/CONTRIBUTING.md +0 -0
  39. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/Dockerfile +0 -0
  40. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/LICENSE +0 -0
  41. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/README.md +0 -0
  42. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/SECURITY.md +0 -0
  43. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/index.html +0 -0
  44. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/package.json +0 -0
  45. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/pnpm-lock.yaml +0 -0
  46. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/apple-touch-icon.png +0 -0
  47. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/brand/Logo_Icon_Dark.png +0 -0
  48. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/brand/Logo_Whole.png +0 -0
  49. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/favicon-16x16.png +0 -0
  50. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/favicon-32x32.png +0 -0
  51. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/public/favicon.ico +0 -0
  52. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/app.tsx +0 -0
  53. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-mobile.test.ts +0 -0
  54. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/approval-center-review-cards.tsx +0 -0
  55. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/data-flow-evidence-card.tsx +0 -0
  56. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/fleet-workspace.tsx +0 -0
  57. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/guard-api.test.ts +0 -0
  58. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/guard-demo.ts +0 -0
  59. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/guard-types.ts +0 -0
  60. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/main.tsx +0 -0
  61. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/queue-chip-filter.tsx +0 -0
  62. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/receipts-workspace.test.ts +0 -0
  63. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/receipts-workspace.tsx +0 -0
  64. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/risk-signal-cards.test.ts +0 -0
  65. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/risk-signal-cards.tsx +0 -0
  66. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/runtime-overview.test.ts +0 -0
  67. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/scanner-evidence-badge.tsx +0 -0
  68. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/settings-workspace.test.ts +0 -0
  69. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/settings-workspace.tsx +0 -0
  70. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/styles.css +0 -0
  71. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/src/vite-env.d.ts +0 -0
  72. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/tsconfig.json +0 -0
  73. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/dashboard/vite.config.ts +0 -0
  74. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docker-requirements.txt +0 -0
  75. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/approval-audit.md +0 -0
  76. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/architecture.md +0 -0
  77. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/get-started.md +0 -0
  78. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/harness-support.md +0 -0
  79. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/local-vs-cloud.md +0 -0
  80. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/release-checklist.md +0 -0
  81. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/release-notes.md +0 -0
  82. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/smoke-tests.md +0 -0
  83. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/guard/testing-matrix.md +0 -0
  84. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/trust/mcp-trust-draft.md +0 -0
  85. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/trust/plugin-trust-draft.md +0 -0
  86. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/docs/trust/skill-trust-local.md +0 -0
  87. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/fuzzers/manifest_fuzzer.py +0 -0
  88. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/requirements.txt +0 -0
  89. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/schemas/plugin-quality.v1.json +0 -0
  90. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/schemas/scan-result.v1.json +0 -0
  91. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/schemas/verify-result.v1.json +0 -0
  92. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/__init__.py +0 -0
  93. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/action_runner.py +0 -0
  94. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/argparse_utils.py +0 -0
  95. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/__init__.py +0 -0
  96. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
  97. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/claude.py +0 -0
  98. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
  99. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
  100. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/gemini.py +0 -0
  101. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/manifest.py +0 -0
  102. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
  103. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
  104. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/mcp_security.py +0 -0
  105. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/opencode.py +0 -0
  106. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
  107. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/security.py +0 -0
  108. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
  109. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/cli.py +0 -0
  110. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/cli_ui.py +0 -0
  111. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/config.py +0 -0
  112. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
  113. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
  114. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
  115. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
  116. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
  117. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
  118. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
  119. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
  120. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
  121. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/github_reporting.py +0 -0
  122. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/__init__.py +0 -0
  123. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/access_graph_events.py +0 -0
  124. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
  125. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/antigravity.py +0 -0
  126. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
  127. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
  128. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/cloud_identity.py +0 -0
  129. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
  130. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/contracts.py +0 -0
  131. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/copilot.py +0 -0
  132. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
  133. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
  134. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/hermes.py +0 -0
  135. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/mcp_servers.py +0 -0
  136. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/openclaw.py +0 -0
  137. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/openclaw_config.py +0 -0
  138. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/openclaw_support.py +0 -0
  139. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
  140. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/adapters/opencode_artifacts.py +0 -0
  141. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/advisory_model.py +0 -0
  142. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/approvals.py +0 -0
  143. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/bridge/__init__.py +0 -0
  144. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/capabilities.py +0 -0
  145. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
  146. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
  147. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
  148. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/commands.py +0 -0
  149. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/connect_flow.py +0 -0
  150. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/install_commands.py +0 -0
  151. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
  152. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
  153. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/render.py +0 -0
  154. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/cli/update_commands.py +0 -0
  155. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/codex_config.py +0 -0
  156. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/config.py +0 -0
  157. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
  158. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
  159. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
  160. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/client.py +0 -0
  161. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
  162. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
  163. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/apple-touch-icon.png +0 -0
  164. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Icon_Dark.png +0 -0
  165. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
  166. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/favicon-16x16.png +0 -0
  167. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/favicon-32x32.png +0 -0
  168. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/favicon.ico +0 -0
  169. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
  170. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/edge_events.py +0 -0
  171. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/incident.py +0 -0
  172. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/insights.py +0 -0
  173. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/launcher.py +0 -0
  174. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/mcp_tool_calls.py +0 -0
  175. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/models.py +0 -0
  176. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
  177. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
  178. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/protect.py +0 -0
  179. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
  180. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
  181. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/proxy/runtime_mcp.py +0 -0
  182. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
  183. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
  184. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
  185. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/redaction.py +0 -0
  186. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/risk.py +0 -0
  187. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
  188. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/action_identity.py +0 -0
  189. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/actions.py +0 -0
  190. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/advisory_escalation.py +0 -0
  191. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/advisory_matchers.py +0 -0
  192. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/cisco_evidence.py +0 -0
  193. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/cisco_preflight.py +0 -0
  194. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/composition_rules.py +0 -0
  195. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/data_flow.py +0 -0
  196. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/data_flow_rules.py +0 -0
  197. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/data_flow_variables.py +0 -0
  198. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/decisions.py +0 -0
  199. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/detectors.py +0 -0
  200. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/false_positive_rules.py +0 -0
  201. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/mcp_protection.py +0 -0
  202. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/persistence_rules.py +0 -0
  203. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/prompt_injection.py +0 -0
  204. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/runner.py +0 -0
  205. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/safe_decode.py +0 -0
  206. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/sandbox.py +0 -0
  207. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/scanner_cache.py +0 -0
  208. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/secret_file_requests.py +0 -0
  209. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/secret_sensitivity.py +0 -0
  210. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/secret_sources.py +0 -0
  211. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/shell_commands.py +0 -0
  212. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/signals.py +0 -0
  213. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/skill_protection.py +0 -0
  214. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/supply_chain.py +0 -0
  215. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/surface_server.py +0 -0
  216. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/temp_files.py +0 -0
  217. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/runtime/threat_intel.py +0 -0
  218. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
  219. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
  220. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/schemas/guard_event_v1.py +0 -0
  221. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/schemas/surface_server.py +0 -0
  222. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/shims.py +0 -0
  223. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
  224. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/store_connect.py +0 -0
  225. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/store_evidence.py +0 -0
  226. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/store_threat_intel.py +0 -0
  227. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/guard/types.py +0 -0
  228. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
  229. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/integrations/cisco_mcp_scanner.py +0 -0
  230. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
  231. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/lint_fixes.py +0 -0
  232. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/marketplace_support.py +0 -0
  233. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/models.py +0 -0
  234. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/path_support.py +0 -0
  235. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/policy.py +0 -0
  236. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/quality_artifact.py +0 -0
  237. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/repo_detect.py +0 -0
  238. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/reporting.py +0 -0
  239. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/rules/__init__.py +0 -0
  240. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/rules/registry.py +0 -0
  241. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/rules/specs.py +0 -0
  242. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/scanner.py +0 -0
  243. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/submission.py +0 -0
  244. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/suppressions.py +0 -0
  245. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
  246. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_helpers.py +0 -0
  247. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
  248. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_models.py +0 -0
  249. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
  250. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_scoring.py +0 -0
  251. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
  252. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/trust_specs.py +0 -0
  253. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/src/codex_plugin_scanner/verification.py +0 -0
  254. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/__init__.py +0 -0
  255. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/conftest.py +0 -0
  256. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/__init__.py +0 -0
  257. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
  258. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/bad-plugin/.mcp.json +0 -0
  259. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/bad-plugin/secrets.js +0 -0
  260. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
  261. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
  262. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/README.md +0 -0
  263. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
  264. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
  265. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
  266. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/code-quality-bad/evil.js +0 -0
  267. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/code-quality-bad/inject.js +0 -0
  268. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
  269. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
  270. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/README.md +0 -0
  271. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
  272. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
  273. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
  274. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
  275. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/.codexignore +0 -0
  276. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/LICENSE +0 -0
  277. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/README.md +0 -0
  278. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/SECURITY.md +0 -0
  279. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
  280. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
  281. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
  282. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
  283. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-codex-malicious-mcp/.codex/config.toml +0 -0
  284. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/README.md +0 -0
  285. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/benign-docs-fake-token.py +0 -0
  286. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/benign-health-endpoint.py +0 -0
  287. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/benign-nvmrc-fake-creds.py +0 -0
  288. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/benign-source-search.py +0 -0
  289. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/canary-exfil-encoded.py +0 -0
  290. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/canary-exfil.py +0 -0
  291. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/expected-decisions.json +0 -0
  292. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-dockerfile.txt +0 -0
  293. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-encoded-shell-exfil.py +0 -0
  294. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-github-action.yml +0 -0
  295. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-mcp-delete.md +0 -0
  296. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-mcp-secret-read.md +0 -0
  297. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-mcp-skill-exfil.md +0 -0
  298. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-npm-postinstall.js +0 -0
  299. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-prompt-env-read.md +0 -0
  300. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-prompt-guard-bypass.md +0 -0
  301. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-prompt-npmrc-read.md +0 -0
  302. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/malicious-python-setup.py +0 -0
  303. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/guard-red-team/smoke-evidence-template.json +0 -0
  304. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/config.yaml +0 -0
  305. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/mcp_servers.json +0 -0
  306. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/skills/security/malicious/SKILL.md +0 -0
  307. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/SKILL.md +0 -0
  308. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/references/api-setup.md +0 -0
  309. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/scripts/deploy.sh +0 -0
  310. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/hermes-plugin-evil/skills/utils/benign/SKILL.md +0 -0
  311. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
  312. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/.codex-plugin/plugin.json +0 -0
  313. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/.codexignore +0 -0
  314. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/LICENSE +0 -0
  315. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/README.md +0 -0
  316. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/SECURITY.md +0 -0
  317. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/malicious-skill-plugin/skills/leaky-skill/SKILL.md +0 -0
  318. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/mcp-canary-server.py +0 -0
  319. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
  320. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
  321. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/mit-license/LICENSE +0 -0
  322. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
  323. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
  324. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
  325. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
  326. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
  327. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
  328. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
  329. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
  330. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
  331. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
  332. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
  333. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
  334. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
  335. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
  336. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
  337. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
  338. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
  339. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
  340. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/LICENSE +0 -0
  341. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/README.md +0 -0
  342. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/SECURITY.md +0 -0
  343. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
  344. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
  345. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
  346. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
  347. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/benign-npm-package.json +0 -0
  348. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/benign-pnpm-package.json +0 -0
  349. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/benign-pyproject.toml +0 -0
  350. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/malicious-Dockerfile +0 -0
  351. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/malicious-action.yml +0 -0
  352. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/malicious-npm-package.json +0 -0
  353. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/supply-chain/malicious-setup.py +0 -0
  354. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
  355. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
  356. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/fixtures/with-marketplace/marketplace.json +0 -0
  357. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test-trust-scoring.py +0 -0
  358. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test-trust-specs.py +0 -0
  359. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_action_runner.py +0 -0
  360. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_best_practices.py +0 -0
  361. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_cisco_install_surfaces.py +0 -0
  362. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_cli.py +0 -0
  363. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_code_quality.py +0 -0
  364. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_config.py +0 -0
  365. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_coverage_remaining.py +0 -0
  366. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_ecosystems.py +0 -0
  367. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_edge_cases.py +0 -0
  368. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_final_coverage.py +0 -0
  369. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_access_graph.py +0 -0
  370. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_action_identity.py +0 -0
  371. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_advisory_escalation.py +0 -0
  372. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_approval_continuity.py +0 -0
  373. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_approval_copy_commands.py +0 -0
  374. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_approval_store_dedup.py +0 -0
  375. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_approval_store_scale.py +0 -0
  376. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_approvals.py +0 -0
  377. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_bootstrap.py +0 -0
  378. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_bypass_detector.py +0 -0
  379. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_canary_fixtures.py +0 -0
  380. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_capabilities.py +0 -0
  381. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_cisco_evidence.py +0 -0
  382. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_cisco_runtime_cli.py +0 -0
  383. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_claude_adapter.py +0 -0
  384. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_cli.py +0 -0
  385. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_cloud_local_sync.py +0 -0
  386. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_codex_e2e.py +0 -0
  387. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_codex_install.py +0 -0
  388. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_codex_proxy.py +0 -0
  389. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_config_paths.py +0 -0
  390. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_connect_flow.py +0 -0
  391. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_consumer_mode.py +0 -0
  392. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_copilot_adapter.py +0 -0
  393. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_copilot_proxy.py +0 -0
  394. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_cli.py +0 -0
  395. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_manager.py +0 -0
  396. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_perf.py +0 -0
  397. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_registry.py +0 -0
  398. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_repair_perf.py +0 -0
  399. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_daemon_wake.py +0 -0
  400. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_data_flow.py +0 -0
  401. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_decision_propagation.py +0 -0
  402. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_detector_fp.py +0 -0
  403. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_event_schema_v1.py +0 -0
  404. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_events.py +0 -0
  405. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_evidence_store.py +0 -0
  406. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_harness_contracts.py +0 -0
  407. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_harness_setup.py +0 -0
  408. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_harness_smoke.py +0 -0
  409. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_insights.py +0 -0
  410. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_launch_env.py +0 -0
  411. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_mcp_detectors.py +0 -0
  412. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_mcp_protection.py +0 -0
  413. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_opencode_proxy.py +0 -0
  414. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_policy_dedup.py +0 -0
  415. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_product_flow.py +0 -0
  416. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_prompt_injection.py +0 -0
  417. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_protect.py +0 -0
  418. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_queue_api_contract.py +0 -0
  419. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_queue_contract.py +0 -0
  420. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_red_team.py +0 -0
  421. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_red_team_e2e.py +0 -0
  422. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_redaction.py +0 -0
  423. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_render.py +0 -0
  424. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_resolution_copy.py +0 -0
  425. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_risk.py +0 -0
  426. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime.py +0 -0
  427. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime_action_harnesses.py +0 -0
  428. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime_actions.py +0 -0
  429. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime_decisions.py +0 -0
  430. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime_detectors.py +0 -0
  431. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_runtime_signals.py +0 -0
  432. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_safe_decode.py +0 -0
  433. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_sandbox.py +0 -0
  434. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_skill_protection.py +0 -0
  435. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_store_migrations.py +0 -0
  436. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_supply_chain.py +0 -0
  437. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_surface_server.py +0 -0
  438. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_threat_intel.py +0 -0
  439. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_verdicts.py +0 -0
  440. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_guard_web_recovery.py +0 -0
  441. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_hermes_adapter.py +0 -0
  442. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_integration.py +0 -0
  443. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_lint_fixes.py +0 -0
  444. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_live_cisco_smoke.py +0 -0
  445. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_manifest.py +0 -0
  446. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_marketplace.py +0 -0
  447. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_mcp_security.py +0 -0
  448. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_openclaw_adapter.py +0 -0
  449. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_operational_security.py +0 -0
  450. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_policy.py +0 -0
  451. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_quality_artifact.py +0 -0
  452. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_rule_registry.py +0 -0
  453. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_scanner.py +0 -0
  454. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_schema_contracts.py +0 -0
  455. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_security.py +0 -0
  456. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_security_ops.py +0 -0
  457. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_skill_security.py +0 -0
  458. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_submission.py +0 -0
  459. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_trust_scoring.py +0 -0
  460. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_trust_specs.py +0 -0
  461. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_verification.py +0 -0
  462. {plugin_scanner-2.0.162 → plugin_scanner-2.0.163}/tests/test_versioning.py +0 -0
  463. {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.162
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
@@ -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 not responding</p>
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="warning">{props.requests.length} waiting</Badge>
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 > 1 && (
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">This request was already decided.</p>
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>
@@ -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">No blocked actions</h2>
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 shared proof has not landed yet. Open Watched Apps while the first sync settles.";
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 shared proof to appear.",
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) return null;
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 === "Connect an app",
272
- "T-QS-33: buildHomePrimaryState CTA is 'Connect an app' when no watched apps"
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("watching"),
282
- "T-QS-35: buildHomePrimaryState copy mentions watching when protected"
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: "HOL Guard is running but no apps are connected yet.",
181
- ctaLabel: "Connect an app",
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: "HOL Guard is watching this machine. No blocked actions right now.",
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 shared proof lands and this machine finishes syncing.";
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 proof, Watched Apps for local coverage, or the review queue when something needs your choice.";
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="destructive">Needs repair</Badge>;
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="danger" onClick={handleRepair}>
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.162"
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.162"
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"