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