plugin-scanner 2.0.1__tar.gz → 2.0.3__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 (225) hide show
  1. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/publish.yml +13 -3
  2. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/PKG-INFO +86 -23
  3. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/README.md +84 -21
  4. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/guard/architecture.md +11 -2
  5. plugin_scanner-2.0.3/docs/guard/get-started.md +82 -0
  6. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/guard/local-vs-cloud.md +3 -3
  7. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/guard/testing-matrix.md +15 -5
  8. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/pyproject.toml +13 -2
  9. plugin_scanner-2.0.3/pyproject.toml.bak +85 -0
  10. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/cli.py +26 -6
  11. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/base.py +7 -4
  12. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/claude_code.py +36 -5
  13. plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/cli/__init__.py +5 -0
  14. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/cli/commands.py +92 -12
  15. plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/cli/product.py +190 -0
  16. plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/cli/prompt.py +342 -0
  17. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/cli/render.py +75 -2
  18. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/consumer/service.py +8 -1
  19. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/models.py +2 -1
  20. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/runtime/runner.py +11 -1
  21. plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/shims.py +95 -0
  22. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/store.py +56 -9
  23. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/version.py +1 -1
  24. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_action_bundle.py +18 -19
  25. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_ecosystems.py +1 -3
  26. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_guard_cli.py +46 -5
  27. plugin_scanner-2.0.3/tests/test_guard_launch_env.py +78 -0
  28. plugin_scanner-2.0.3/tests/test_guard_product_flow.py +322 -0
  29. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_guard_runtime.py +100 -0
  30. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_trust_scoring.py +3 -9
  31. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/uv.lock +42 -42
  32. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/cli/__init__.py +0 -5
  33. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.clusterfuzzlite/Dockerfile +0 -0
  34. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.clusterfuzzlite/build.sh +0 -0
  35. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.clusterfuzzlite/project.yaml +0 -0
  36. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.clusterfuzzlite/requirements-atheris.txt +0 -0
  37. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.dockerignore +0 -0
  38. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/CODEOWNERS +0 -0
  39. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/dependabot.yml +0 -0
  40. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/ci.yml +0 -0
  41. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/codeql.yml +0 -0
  42. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/e2e-test.yml +0 -0
  43. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/fuzz.yml +0 -0
  44. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/publish-action-repo.yml +0 -0
  45. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.github/workflows/scorecard.yml +0 -0
  46. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.gitignore +0 -0
  47. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/.pre-commit-hooks.yaml +0 -0
  48. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/CONTRIBUTING.md +0 -0
  49. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/Dockerfile +0 -0
  50. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/LICENSE +0 -0
  51. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/SECURITY.md +0 -0
  52. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/README.legacy.md +0 -0
  53. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/README.md +0 -0
  54. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/action.yml +0 -0
  55. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/cisco-version.txt +0 -0
  56. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/pypi-attestations-version.txt +0 -0
  57. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/action/scanner-version.txt +0 -0
  58. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docker-requirements.txt +0 -0
  59. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/guard/harness-support.md +0 -0
  60. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/guard/repo-boundaries.md +0 -0
  61. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/trust/mcp-trust-draft.md +0 -0
  62. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/trust/plugin-trust-draft.md +0 -0
  63. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/docs/trust/skill-trust-local.md +0 -0
  64. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/fuzzers/manifest_fuzzer.py +0 -0
  65. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/schemas/plugin-quality.v1.json +0 -0
  66. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/schemas/scan-result.v1.json +0 -0
  67. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/schemas/verify-result.v1.json +0 -0
  68. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/__init__.py +0 -0
  69. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/action_runner.py +0 -0
  70. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/__init__.py +0 -0
  71. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
  72. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/claude.py +0 -0
  73. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
  74. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
  75. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/gemini.py +0 -0
  76. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/manifest.py +0 -0
  77. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
  78. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
  79. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/opencode.py +0 -0
  80. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
  81. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/security.py +0 -0
  82. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
  83. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/config.py +0 -0
  84. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
  85. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
  86. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
  87. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
  88. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
  89. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
  90. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
  91. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
  92. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
  93. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/__init__.py +0 -0
  94. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
  95. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
  96. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
  97. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
  98. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
  99. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/config.py +0 -0
  100. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
  101. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
  102. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
  103. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
  104. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
  105. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
  106. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
  107. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
  108. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
  109. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
  110. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
  111. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
  112. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
  113. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
  114. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
  115. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/lint_fixes.py +0 -0
  116. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/marketplace_support.py +0 -0
  117. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/models.py +0 -0
  118. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/path_support.py +0 -0
  119. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/policy.py +0 -0
  120. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/quality_artifact.py +0 -0
  121. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/repo_detect.py +0 -0
  122. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/reporting.py +0 -0
  123. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/rules/__init__.py +0 -0
  124. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/rules/registry.py +0 -0
  125. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/rules/specs.py +0 -0
  126. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/scanner.py +0 -0
  127. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/submission.py +0 -0
  128. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/suppressions.py +0 -0
  129. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
  130. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_helpers.py +0 -0
  131. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
  132. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_models.py +0 -0
  133. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
  134. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_scoring.py +0 -0
  135. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
  136. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/trust_specs.py +0 -0
  137. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/src/codex_plugin_scanner/verification.py +0 -0
  138. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/__init__.py +0 -0
  139. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/__init__.py +0 -0
  140. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
  141. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/bad-plugin/.mcp.json +0 -0
  142. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/bad-plugin/secrets.js +0 -0
  143. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
  144. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
  145. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/README.md +0 -0
  146. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
  147. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
  148. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
  149. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/code-quality-bad/evil.js +0 -0
  150. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/code-quality-bad/inject.js +0 -0
  151. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
  152. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
  153. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/README.md +0 -0
  154. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
  155. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
  156. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
  157. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
  158. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/.codexignore +0 -0
  159. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/LICENSE +0 -0
  160. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/README.md +0 -0
  161. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/SECURITY.md +0 -0
  162. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
  163. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
  164. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
  165. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
  166. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
  167. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
  168. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
  169. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/mit-license/LICENSE +0 -0
  170. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
  171. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
  172. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
  173. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
  174. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
  175. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
  176. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
  177. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
  178. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
  179. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
  180. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
  181. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
  182. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
  183. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
  184. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
  185. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
  186. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
  187. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
  188. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/LICENSE +0 -0
  189. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/README.md +0 -0
  190. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/SECURITY.md +0 -0
  191. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
  192. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
  193. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
  194. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
  195. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
  196. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
  197. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/fixtures/with-marketplace/marketplace.json +0 -0
  198. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test-trust-scoring.py +0 -0
  199. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test-trust-specs.py +0 -0
  200. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_action_runner.py +0 -0
  201. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_best_practices.py +0 -0
  202. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_cli.py +0 -0
  203. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_code_quality.py +0 -0
  204. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_config.py +0 -0
  205. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_coverage_remaining.py +0 -0
  206. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_edge_cases.py +0 -0
  207. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_final_coverage.py +0 -0
  208. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_integration.py +0 -0
  209. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_lint_fixes.py +0 -0
  210. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_live_cisco_smoke.py +0 -0
  211. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_manifest.py +0 -0
  212. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_marketplace.py +0 -0
  213. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_operational_security.py +0 -0
  214. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_policy.py +0 -0
  215. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_quality_artifact.py +0 -0
  216. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_rule_registry.py +0 -0
  217. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_scanner.py +0 -0
  218. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_schema_contracts.py +0 -0
  219. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_security.py +0 -0
  220. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_security_ops.py +0 -0
  221. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_skill_security.py +0 -0
  222. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_submission.py +0 -0
  223. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_trust_specs.py +0 -0
  224. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_verification.py +0 -0
  225. {plugin_scanner-2.0.1 → plugin_scanner-2.0.3}/tests/test_versioning.py +0 -0
@@ -20,7 +20,7 @@ permissions:
20
20
  id-token: write
21
21
 
22
22
  concurrency:
23
- group: plugin-scanner-publish-${{ github.ref }}
23
+ group: hol-guard-publish-${{ github.ref }}
24
24
  cancel-in-progress: false
25
25
 
26
26
  jobs:
@@ -70,9 +70,15 @@ jobs:
70
70
  run: |
71
71
  sed -i "1,/^version = /{s/^version = .*/version = \"$VERSION\"/}" pyproject.toml
72
72
  sed -i "1,/^__version__ = /{s/^__version__ = .*/__version__ = \"$VERSION\"/}" src/codex_plugin_scanner/version.py
73
- - name: Build primary package (plugin-scanner)
73
+ - name: Build primary package (hol-guard)
74
74
  run: uv run --no-sync python -m build
75
- - name: Build legacy compatibility package (codex-plugin-scanner)
75
+ - name: Build compatibility package (plugin-scanner)
76
+ run: |
77
+ cp pyproject.toml pyproject.toml.bak
78
+ sed -i "1,/^name = /{s/^name = .*/name = \"plugin-scanner\"/}" pyproject.toml
79
+ uv run --no-sync python -m build
80
+ mv pyproject.toml.bak pyproject.toml
81
+ - name: Build compatibility package (codex-plugin-scanner)
76
82
  run: |
77
83
  cp pyproject.toml pyproject.toml.bak
78
84
  sed -i "1,/^name = /{s/^name = .*/name = \"codex-plugin-scanner\"/}" pyproject.toml
@@ -171,6 +177,10 @@ jobs:
171
177
  ${LOG}
172
178
 
173
179
  ### Installation
180
+ \`\`\`bash
181
+ uv tool install hol-guard==${VERSION}
182
+ \`\`\`
183
+
174
184
  \`\`\`bash
175
185
  uv tool install plugin-scanner==${VERSION}
176
186
  \`\`\`
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plugin-scanner
3
- Version: 2.0.1
4
- Summary: Security, operational-security, and publishability scanner for Codex, Claude, Gemini, and OpenCode plugin ecosystems.
3
+ Version: 2.0.3
4
+ Summary: Protect local AI harnesses with HOL Guard and run scanner checks for Codex, Claude, Cursor, Gemini, and OpenCode.
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
7
7
  Project-URL: Issues, https://github.com/hashgraph-online/ai-plugin-scanner/issues
@@ -33,12 +33,12 @@ Requires-Dist: pytest>=7.0; extra == 'dev'
33
33
  Requires-Dist: ruff>=0.4.0; extra == 'dev'
34
34
  Description-Content-Type: text/markdown
35
35
 
36
- # HOL Plugin Ecosystem Scanner
36
+ # HOL Guard
37
37
 
38
- [![PyPI Version](https://img.shields.io/pypi/v/plugin-scanner.svg?logo=pypi&logoColor=white&cacheSeconds=300)](https://pypi.org/project/plugin-scanner/)
39
- [![Legacy Namespace](https://img.shields.io/badge/legacy-codex--plugin--scanner-6b7280?logo=pypi&logoColor=white)](https://pypi.org/project/codex-plugin-scanner/)
40
- [![Python Versions](https://img.shields.io/pypi/pyversions/plugin-scanner)](https://pypi.org/project/plugin-scanner/)
41
- [![PyPI Downloads](https://img.shields.io/pypi/dm/plugin-scanner)](https://pypistats.org/packages/plugin-scanner)
38
+ [![PyPI Version](https://img.shields.io/pypi/v/hol-guard.svg?logo=pypi&logoColor=white&cacheSeconds=300)](https://pypi.org/project/hol-guard/)
39
+ [![Legacy Namespace](https://img.shields.io/badge/legacy-plugin--scanner_and_codex--plugin--scanner-6b7280?logo=pypi&logoColor=white)](https://pypi.org/project/plugin-scanner/)
40
+ [![Python Versions](https://img.shields.io/pypi/pyversions/hol-guard)](https://pypi.org/project/hol-guard/)
41
+ [![PyPI Downloads](https://img.shields.io/pypi/dm/hol-guard)](https://pypistats.org/packages/hol-guard)
42
42
  [![CI](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/ci.yml/badge.svg)](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/ci.yml)
43
43
  [![Publish](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/publish.yml/badge.svg)](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/publish.yml)
44
44
  [![Container Image](https://img.shields.io/badge/ghcr-ai--plugin--scanner-2496ED?logo=docker&logoColor=white)](https://github.com/hashgraph-online/ai-plugin-scanner/pkgs/container/ai-plugin-scanner)
@@ -47,15 +47,56 @@ Description-Content-Type: text/markdown
47
47
  [![GitHub Stars](https://img.shields.io/github/stars/hashgraph-online/ai-plugin-scanner?style=social)](https://github.com/hashgraph-online/ai-plugin-scanner/stargazers)
48
48
  [![Lint: ruff](https://img.shields.io/badge/lint-ruff-D7FF64.svg)](https://github.com/astral-sh/ruff)
49
49
 
50
- | ![Hashgraph Online Logo](https://hol.org/brand/Logo_Whole_Dark.png) | **The default CI gate for AI agent plugin ecosystems**. Lint locally, verify in CI, and ship publish-ready bundles for manifests, skills, MCP, and marketplace metadata across Codex, Claude, Gemini, and OpenCode.<br><br>Use this after scaffolding and before publishing, review, or distribution.<br><br>[PyPI Package (`plugin-scanner`)](https://pypi.org/project/plugin-scanner/)<br>[Legacy Namespace (`codex-plugin-scanner`)](https://pypi.org/project/codex-plugin-scanner/)<br>[HOL Plugin Registry](https://hol.org/registry/plugins)<br>[HOL GitHub Organization](https://github.com/hashgraph-online)<br>[Report an Issue](https://github.com/hashgraph-online/ai-plugin-scanner/issues) |
50
+ | ![Hashgraph Online Logo](https://hol.org/brand/Logo_Whole_Dark.png) | **Protect Codex, Claude Code, Cursor, Gemini, and OpenCode before local tools run.** HOL Guard watches the tools wired into your harness, shows you what changed, and records what you approved or blocked. The scanner commands stay available for teams that also want linting and CI checks for plugin, skill, MCP, and marketplace packages.<br><br>Start with `hol-guard` if you want local protection. Add the scanner commands later if you also publish or review packages in CI.<br><br>[PyPI Package (`hol-guard`)](https://pypi.org/project/hol-guard/)<br>[Legacy Namespace (`plugin-scanner`)](https://pypi.org/project/plugin-scanner/)<br>[Legacy Namespace (`codex-plugin-scanner`)](https://pypi.org/project/codex-plugin-scanner/)<br>[HOL Plugin Registry](https://hol.org/registry/plugins)<br>[HOL GitHub Organization](https://github.com/hashgraph-online)<br>[Report an Issue](https://github.com/hashgraph-online/ai-plugin-scanner/issues) |
51
51
  | :--- | :--- |
52
52
 
53
- ## Start In 30 Seconds
53
+ ## Protect A Harness In 60 Seconds
54
54
 
55
55
  ```bash
56
- # Local preflight
57
- pipx run plugin-scanner lint .
58
- pipx run plugin-scanner verify .
56
+ # See what Guard found on this machine
57
+ pipx run hol-guard start
58
+
59
+ # Install Guard in front of Codex
60
+ pipx run hol-guard install codex
61
+
62
+ # Record the current tool state once
63
+ pipx run hol-guard run codex --dry-run
64
+
65
+ # Launch through Guard after that
66
+ pipx run hol-guard run codex
67
+
68
+ # Check what Guard approved or blocked
69
+ pipx run hol-guard receipts
70
+ ```
71
+
72
+ How Guard works:
73
+
74
+ 1. find the harnesses on your machine
75
+ 2. install a Guard launcher in front of the one you use
76
+ 3. record the current tool state once
77
+ 4. let Guard stop and review new or changed tools before launch
78
+ 5. check receipts locally
79
+ 6. connect sync later only if you want shared history
80
+
81
+ Start here if you are trying to stay safe inside a harness:
82
+
83
+ - `hol-guard start` shows the first steps
84
+ - `hol-guard status` shows what Guard is watching now
85
+ - `hol-guard install <harness>` creates the launcher
86
+ - `hol-guard run <harness> --dry-run` records the current state
87
+ - `hol-guard run <harness>` reviews changes before launch
88
+ - `hol-guard diff <harness>` shows what changed
89
+ - `hol-guard receipts` shows local history
90
+
91
+ See [docs/guard/get-started.md](docs/guard/get-started.md) for the full local flow.
92
+
93
+ ## Use The Scanner In CI
94
+
95
+ ```bash
96
+ # Install the package once, then use the scanner commands in your shell
97
+ pipx install hol-guard
98
+ plugin-scanner lint .
99
+ plugin-scanner verify .
59
100
  ```
60
101
 
61
102
  ```yaml
@@ -70,18 +111,30 @@ pipx run plugin-scanner verify .
70
111
 
71
112
  If your repository uses a Codex marketplace root like `.agents/plugins/marketplace.json`, keep `plugin_dir: "."`. The scanner will discover local `./plugins/...` entries automatically, scan each local plugin manifest, and skip remote marketplace entries instead of treating the repo root as a single plugin.
72
113
 
73
- ## Use After `$plugin-creator`
114
+ ## Start With Guard, Add CI Later
74
115
 
75
- `plugin-scanner` is designed as the quality gate between plugin creation and distribution:
116
+ If you use Codex, Claude Code, Cursor, Gemini, or OpenCode every day, start with Guard.
117
+
118
+ - Guard is the part that protects your local harness before tools run.
119
+ - It helps when a new MCP server appears, when a tool changes after you trusted it, or when you want a receipt for what was approved or blocked.
120
+
121
+ If you publish plugins, skills, or marketplace packages, add the scanner in CI too.
122
+
123
+ - The scanner checks manifests, metadata, runtime surfaces, and policy rules before a release or CI gate passes.
124
+ - It is the publishing and repo review side of this package, not the first thing a local Guard user needs to learn.
125
+
126
+ ## Use Scanner After `$plugin-creator`
127
+
128
+ If you are building and shipping packages, the scanner fits after `$plugin-creator`:
76
129
 
77
130
  1. Scaffold with `$plugin-creator`.
78
131
  2. Run `lint` locally to catch structure, metadata, and security issues early.
79
132
  3. Run `verify` in CI to block regressions and enforce quality policy.
80
133
  4. Ship or submit with confidence, backed by scanner artifacts and trust signals.
81
134
 
82
- The score remains available as a trust and triage signal, but the primary workflow is **preflight + CI gating + publish readiness**.
135
+ The score stays available as a trust and triage signal, but the day-to-day workflow is simple: check locally, verify in CI, then release.
83
136
 
84
- ## Trust Score Provenance
137
+ ## How Trust Scoring Works
85
138
 
86
139
  The scanner now emits explicit trust provenance alongside the quality grade:
87
140
 
@@ -111,21 +164,23 @@ pytest -q
111
164
  ## Install
112
165
 
113
166
  ```bash
114
- pip install plugin-scanner
167
+ pip install hol-guard
115
168
  ```
116
169
 
117
170
  Cisco-backed skill scanning is optional:
118
171
 
119
172
  ```bash
120
- pip install "plugin-scanner[cisco]"
173
+ pip install "hol-guard[cisco]"
121
174
  ```
122
175
 
123
176
  The `cisco` extra installs the published `cisco-ai-skill-scanner` package from PyPI so the scanner remains publishable on PyPI and the optional Cisco analysis path works with standard package metadata.
124
177
 
125
- You can also run the scanner without a local install:
178
+ You can also install once and use both Guard and scanner commands:
126
179
 
127
180
  ```bash
128
- pipx run plugin-scanner ./my-plugin
181
+ pipx install hol-guard
182
+ hol-guard start
183
+ plugin-scanner ./my-plugin
129
184
  ```
130
185
 
131
186
  Container-first environments can use the published image instead:
@@ -140,8 +195,16 @@ docker run --rm \
140
195
  Backward compatibility remains available for teams still pinned to the historical package namespace:
141
196
 
142
197
  ```bash
198
+ pip install plugin-scanner
143
199
  pip install codex-plugin-scanner
144
- pipx run codex-plugin-scanner verify .
200
+ ```
201
+
202
+ Compatibility command names also stay available:
203
+
204
+ ```bash
205
+ plugin-guard start
206
+ plugin-scanner verify .
207
+ codex-plugin-scanner verify .
145
208
  ```
146
209
 
147
210
  ## Ecosystem Support
@@ -155,11 +218,11 @@ pipx run codex-plugin-scanner verify .
155
218
 
156
219
  Use `--ecosystem auto` (default) to scan all detected packages in a repository, or select a single ecosystem explicitly.
157
220
 
158
- ## What The Scanner Covers
221
+ ## What The Scanner Checks
159
222
 
160
223
  `plugin-scanner` supports a full quality suite:
161
224
 
162
- - `scan` for full-surface security and publishability analysis
225
+ - `scan` for full-surface security and release analysis
163
226
  - `lint` for rule-oriented authoring feedback
164
227
  - `verify` for runtime and install-surface readiness checks
165
228
  - `submit` for artifact-backed submission gating
@@ -1,9 +1,9 @@
1
- # HOL Plugin Ecosystem Scanner
1
+ # HOL Guard
2
2
 
3
- [![PyPI Version](https://img.shields.io/pypi/v/plugin-scanner.svg?logo=pypi&logoColor=white&cacheSeconds=300)](https://pypi.org/project/plugin-scanner/)
4
- [![Legacy Namespace](https://img.shields.io/badge/legacy-codex--plugin--scanner-6b7280?logo=pypi&logoColor=white)](https://pypi.org/project/codex-plugin-scanner/)
5
- [![Python Versions](https://img.shields.io/pypi/pyversions/plugin-scanner)](https://pypi.org/project/plugin-scanner/)
6
- [![PyPI Downloads](https://img.shields.io/pypi/dm/plugin-scanner)](https://pypistats.org/packages/plugin-scanner)
3
+ [![PyPI Version](https://img.shields.io/pypi/v/hol-guard.svg?logo=pypi&logoColor=white&cacheSeconds=300)](https://pypi.org/project/hol-guard/)
4
+ [![Legacy Namespace](https://img.shields.io/badge/legacy-plugin--scanner_and_codex--plugin--scanner-6b7280?logo=pypi&logoColor=white)](https://pypi.org/project/plugin-scanner/)
5
+ [![Python Versions](https://img.shields.io/pypi/pyversions/hol-guard)](https://pypi.org/project/hol-guard/)
6
+ [![PyPI Downloads](https://img.shields.io/pypi/dm/hol-guard)](https://pypistats.org/packages/hol-guard)
7
7
  [![CI](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/ci.yml/badge.svg)](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/ci.yml)
8
8
  [![Publish](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/publish.yml/badge.svg)](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/publish.yml)
9
9
  [![Container Image](https://img.shields.io/badge/ghcr-ai--plugin--scanner-2496ED?logo=docker&logoColor=white)](https://github.com/hashgraph-online/ai-plugin-scanner/pkgs/container/ai-plugin-scanner)
@@ -12,15 +12,56 @@
12
12
  [![GitHub Stars](https://img.shields.io/github/stars/hashgraph-online/ai-plugin-scanner?style=social)](https://github.com/hashgraph-online/ai-plugin-scanner/stargazers)
13
13
  [![Lint: ruff](https://img.shields.io/badge/lint-ruff-D7FF64.svg)](https://github.com/astral-sh/ruff)
14
14
 
15
- | ![Hashgraph Online Logo](https://hol.org/brand/Logo_Whole_Dark.png) | **The default CI gate for AI agent plugin ecosystems**. Lint locally, verify in CI, and ship publish-ready bundles for manifests, skills, MCP, and marketplace metadata across Codex, Claude, Gemini, and OpenCode.<br><br>Use this after scaffolding and before publishing, review, or distribution.<br><br>[PyPI Package (`plugin-scanner`)](https://pypi.org/project/plugin-scanner/)<br>[Legacy Namespace (`codex-plugin-scanner`)](https://pypi.org/project/codex-plugin-scanner/)<br>[HOL Plugin Registry](https://hol.org/registry/plugins)<br>[HOL GitHub Organization](https://github.com/hashgraph-online)<br>[Report an Issue](https://github.com/hashgraph-online/ai-plugin-scanner/issues) |
15
+ | ![Hashgraph Online Logo](https://hol.org/brand/Logo_Whole_Dark.png) | **Protect Codex, Claude Code, Cursor, Gemini, and OpenCode before local tools run.** HOL Guard watches the tools wired into your harness, shows you what changed, and records what you approved or blocked. The scanner commands stay available for teams that also want linting and CI checks for plugin, skill, MCP, and marketplace packages.<br><br>Start with `hol-guard` if you want local protection. Add the scanner commands later if you also publish or review packages in CI.<br><br>[PyPI Package (`hol-guard`)](https://pypi.org/project/hol-guard/)<br>[Legacy Namespace (`plugin-scanner`)](https://pypi.org/project/plugin-scanner/)<br>[Legacy Namespace (`codex-plugin-scanner`)](https://pypi.org/project/codex-plugin-scanner/)<br>[HOL Plugin Registry](https://hol.org/registry/plugins)<br>[HOL GitHub Organization](https://github.com/hashgraph-online)<br>[Report an Issue](https://github.com/hashgraph-online/ai-plugin-scanner/issues) |
16
16
  | :--- | :--- |
17
17
 
18
- ## Start In 30 Seconds
18
+ ## Protect A Harness In 60 Seconds
19
19
 
20
20
  ```bash
21
- # Local preflight
22
- pipx run plugin-scanner lint .
23
- pipx run plugin-scanner verify .
21
+ # See what Guard found on this machine
22
+ pipx run hol-guard start
23
+
24
+ # Install Guard in front of Codex
25
+ pipx run hol-guard install codex
26
+
27
+ # Record the current tool state once
28
+ pipx run hol-guard run codex --dry-run
29
+
30
+ # Launch through Guard after that
31
+ pipx run hol-guard run codex
32
+
33
+ # Check what Guard approved or blocked
34
+ pipx run hol-guard receipts
35
+ ```
36
+
37
+ How Guard works:
38
+
39
+ 1. find the harnesses on your machine
40
+ 2. install a Guard launcher in front of the one you use
41
+ 3. record the current tool state once
42
+ 4. let Guard stop and review new or changed tools before launch
43
+ 5. check receipts locally
44
+ 6. connect sync later only if you want shared history
45
+
46
+ Start here if you are trying to stay safe inside a harness:
47
+
48
+ - `hol-guard start` shows the first steps
49
+ - `hol-guard status` shows what Guard is watching now
50
+ - `hol-guard install <harness>` creates the launcher
51
+ - `hol-guard run <harness> --dry-run` records the current state
52
+ - `hol-guard run <harness>` reviews changes before launch
53
+ - `hol-guard diff <harness>` shows what changed
54
+ - `hol-guard receipts` shows local history
55
+
56
+ See [docs/guard/get-started.md](docs/guard/get-started.md) for the full local flow.
57
+
58
+ ## Use The Scanner In CI
59
+
60
+ ```bash
61
+ # Install the package once, then use the scanner commands in your shell
62
+ pipx install hol-guard
63
+ plugin-scanner lint .
64
+ plugin-scanner verify .
24
65
  ```
25
66
 
26
67
  ```yaml
@@ -35,18 +76,30 @@ pipx run plugin-scanner verify .
35
76
 
36
77
  If your repository uses a Codex marketplace root like `.agents/plugins/marketplace.json`, keep `plugin_dir: "."`. The scanner will discover local `./plugins/...` entries automatically, scan each local plugin manifest, and skip remote marketplace entries instead of treating the repo root as a single plugin.
37
78
 
38
- ## Use After `$plugin-creator`
79
+ ## Start With Guard, Add CI Later
39
80
 
40
- `plugin-scanner` is designed as the quality gate between plugin creation and distribution:
81
+ If you use Codex, Claude Code, Cursor, Gemini, or OpenCode every day, start with Guard.
82
+
83
+ - Guard is the part that protects your local harness before tools run.
84
+ - It helps when a new MCP server appears, when a tool changes after you trusted it, or when you want a receipt for what was approved or blocked.
85
+
86
+ If you publish plugins, skills, or marketplace packages, add the scanner in CI too.
87
+
88
+ - The scanner checks manifests, metadata, runtime surfaces, and policy rules before a release or CI gate passes.
89
+ - It is the publishing and repo review side of this package, not the first thing a local Guard user needs to learn.
90
+
91
+ ## Use Scanner After `$plugin-creator`
92
+
93
+ If you are building and shipping packages, the scanner fits after `$plugin-creator`:
41
94
 
42
95
  1. Scaffold with `$plugin-creator`.
43
96
  2. Run `lint` locally to catch structure, metadata, and security issues early.
44
97
  3. Run `verify` in CI to block regressions and enforce quality policy.
45
98
  4. Ship or submit with confidence, backed by scanner artifacts and trust signals.
46
99
 
47
- The score remains available as a trust and triage signal, but the primary workflow is **preflight + CI gating + publish readiness**.
100
+ The score stays available as a trust and triage signal, but the day-to-day workflow is simple: check locally, verify in CI, then release.
48
101
 
49
- ## Trust Score Provenance
102
+ ## How Trust Scoring Works
50
103
 
51
104
  The scanner now emits explicit trust provenance alongside the quality grade:
52
105
 
@@ -76,21 +129,23 @@ pytest -q
76
129
  ## Install
77
130
 
78
131
  ```bash
79
- pip install plugin-scanner
132
+ pip install hol-guard
80
133
  ```
81
134
 
82
135
  Cisco-backed skill scanning is optional:
83
136
 
84
137
  ```bash
85
- pip install "plugin-scanner[cisco]"
138
+ pip install "hol-guard[cisco]"
86
139
  ```
87
140
 
88
141
  The `cisco` extra installs the published `cisco-ai-skill-scanner` package from PyPI so the scanner remains publishable on PyPI and the optional Cisco analysis path works with standard package metadata.
89
142
 
90
- You can also run the scanner without a local install:
143
+ You can also install once and use both Guard and scanner commands:
91
144
 
92
145
  ```bash
93
- pipx run plugin-scanner ./my-plugin
146
+ pipx install hol-guard
147
+ hol-guard start
148
+ plugin-scanner ./my-plugin
94
149
  ```
95
150
 
96
151
  Container-first environments can use the published image instead:
@@ -105,8 +160,16 @@ docker run --rm \
105
160
  Backward compatibility remains available for teams still pinned to the historical package namespace:
106
161
 
107
162
  ```bash
163
+ pip install plugin-scanner
108
164
  pip install codex-plugin-scanner
109
- pipx run codex-plugin-scanner verify .
165
+ ```
166
+
167
+ Compatibility command names also stay available:
168
+
169
+ ```bash
170
+ plugin-guard start
171
+ plugin-scanner verify .
172
+ codex-plugin-scanner verify .
110
173
  ```
111
174
 
112
175
  ## Ecosystem Support
@@ -120,11 +183,11 @@ pipx run codex-plugin-scanner verify .
120
183
 
121
184
  Use `--ecosystem auto` (default) to scan all detected packages in a repository, or select a single ecosystem explicitly.
122
185
 
123
- ## What The Scanner Covers
186
+ ## What The Scanner Checks
124
187
 
125
188
  `plugin-scanner` supports a full quality suite:
126
189
 
127
- - `scan` for full-surface security and publishability analysis
190
+ - `scan` for full-surface security and release analysis
128
191
  - `lint` for rule-oriented authoring feedback
129
192
  - `verify` for runtime and install-surface readiness checks
130
193
  - `submit` for artifact-backed submission gating
@@ -1,10 +1,11 @@
1
1
  # Guard Architecture
2
2
 
3
- Guard lives inside `codex_plugin_scanner` and uses the existing scan engine as its trust and evidence core.
3
+ Guard lives inside `codex_plugin_scanner` and is the local product surface for harness protection. The existing scan engine remains the trust and evidence core, but the user workflow starts with local harness installs and launch interception rather than CI.
4
4
 
5
5
  The runtime is split into:
6
6
 
7
7
  - `guard/adapters`: harness discovery for Codex, Claude Code, Cursor, Gemini, and OpenCode
8
+ - `guard/shims`: local launcher shims that route harness launches through Guard
8
9
  - `guard/consumer`: orchestration for detection, policy evaluation, and consumer-mode scan output
9
10
  - `guard/policy`: local action resolution for allow, review, warn, and block decisions
10
11
  - `guard/receipts`: receipt creation for first use and changed-artifact events
@@ -21,4 +22,12 @@ Guard evaluates local artifacts in this order:
21
22
  5. Record a receipt and optional diff
22
23
  6. Launch the harness only if the effective action is not `block`
23
24
 
24
- Wrapper mode is the default implementation strategy in this phase. Config mutation is limited to the Claude Code hook helper, where Guard can add and remove its own hook entry in workspace-local settings.
25
+ The local product loop is:
26
+
27
+ 1. `hol-guard start` detects supported harnesses and suggests the next step
28
+ 2. `hol-guard install <harness>` creates a local launcher shim
29
+ 3. `hol-guard run <harness>` evaluates changes before the harness launches
30
+ 4. `hol-guard receipts` and `hol-guard status` let users inspect local decisions
31
+ 5. `hol-guard login` and `hol-guard sync` stay optional
32
+
33
+ Wrapper mode is still the core execution strategy in this phase. Config mutation is limited to the Claude Code hook helper, where Guard can add and remove its own hook entry in workspace-local settings.
@@ -0,0 +1,82 @@
1
+ # Guard Get Started
2
+
3
+ Guard ships as the `hol-guard` package and command.
4
+ The scanner commands stay available in the same install for CI and package checks.
5
+
6
+ Use it when you want to protect a harness before local MCP servers, skills, hooks, or plugin surfaces run.
7
+
8
+ ## The everyday flow
9
+
10
+ 1. See what Guard found:
11
+
12
+ ```bash
13
+ hol-guard start
14
+ ```
15
+
16
+ 2. Install Guard in front of the harness you use most:
17
+
18
+ ```bash
19
+ hol-guard install codex
20
+ ```
21
+
22
+ 3. Run one dry pass so Guard records the current state:
23
+
24
+ ```bash
25
+ hol-guard run codex --dry-run
26
+ ```
27
+
28
+ 4. Launch through Guard after that. Guard will stop and ask if a tool is new or changed:
29
+
30
+ ```bash
31
+ hol-guard run codex
32
+ ```
33
+
34
+ 5. Review changes when Guard blocks or asks for another look:
35
+
36
+ ```bash
37
+ hol-guard diff codex
38
+ hol-guard allow codex --scope artifact --artifact-id codex:project:workspace_skill
39
+ hol-guard deny codex --scope artifact --artifact-id codex:project:workspace_skill
40
+ ```
41
+
42
+ 6. Check receipts and current status:
43
+
44
+ ```bash
45
+ hol-guard receipts
46
+ hol-guard status
47
+ ```
48
+
49
+ 7. Sign in later only if you want shared history:
50
+
51
+ ```bash
52
+ hol-guard login --sync-url <url> --token <token>
53
+ hol-guard sync
54
+ ```
55
+
56
+ ## What `install` does
57
+
58
+ `guard install <harness>` creates a local launcher shim under Guard’s home directory:
59
+
60
+ - macOS/Linux: `~/.config/.ai-plugin-scanner-guard/bin/guard-<harness>`
61
+ - Windows: `~/.config/.ai-plugin-scanner-guard/bin/guard-<harness>.cmd`
62
+
63
+ Claude Code also gets Guard hook entries in `.claude/settings.local.json` when you install from a workspace.
64
+
65
+ ## First-party canaries
66
+
67
+ Use these local repos to prove Guard against real first-party surfaces:
68
+
69
+ - `hashnet-mcp-js` for a real MCP server harness target
70
+ - `registry-broker-skills` for a real skills registry fixture during scan and trust checks
71
+
72
+ Suggested local validation:
73
+
74
+ ```bash
75
+ hol-guard detect codex --json
76
+ hol-guard install codex
77
+ hol-guard status
78
+ hol-guard run codex --dry-run
79
+ hol-guard receipts
80
+ ```
81
+
82
+ For a real Codex canary, point `~/.codex/config.toml` or `<workspace>/.codex/config.toml` at a local `hashnet-mcp` command, then repeat the Guard loop above.
@@ -1,6 +1,6 @@
1
- # Local vs Cloud
1
+ # Works Locally First
2
2
 
3
- Guard is local-first.
3
+ Guard works on your machine before you sign in anywhere.
4
4
 
5
5
  Local features available without sign-in:
6
6
 
@@ -19,4 +19,4 @@ Optional cloud features:
19
19
  - billing and entitlements
20
20
  - shared team policy
21
21
 
22
- The local runtime does not require any hosted service. `guard login` and `guard sync` exist to layer optional cloud features on top of the local product, not to unlock the core safety workflow.
22
+ The local runtime does not require any hosted service. `hol-guard login` and `hol-guard sync` add optional cloud features later. They do not unlock the core safety workflow.
@@ -3,20 +3,30 @@
3
3
  Automated coverage in this phase includes:
4
4
 
5
5
  - Guard CLI behavior tests for detect, scan, run, diff, receipts, install, uninstall, login, and sync
6
+ - Guard product-flow tests for `hol-guard start`, `hol-guard status`, and launcher shim creation
6
7
  - SQLite persistence through real command execution in temporary homes and workspaces
7
8
  - consumer-mode JSON contract generation against scanner fixtures
8
9
  - local HTTP sync against a live in-process server instead of mocked transport
9
10
 
10
11
  Manual verification should include:
11
12
 
12
- - `guard detect codex --json`
13
- - `guard detect cursor --json`
14
- - `guard detect gemini --json`
15
- - `guard detect opencode --json`
16
- - `guard run codex --dry-run --default-action allow --json`
13
+ - `hol-guard start`
14
+ - `hol-guard status`
15
+ - `hol-guard detect codex --json`
16
+ - `hol-guard detect cursor --json`
17
+ - `hol-guard detect gemini --json`
18
+ - `hol-guard detect opencode --json`
19
+ - `hol-guard install codex`
20
+ - `hol-guard run codex --dry-run --default-action allow --json`
21
+ - `hol-guard receipts`
17
22
  - `codex mcp list`
18
23
  - `cursor-agent mcp list`
19
24
  - `gemini --help`
20
25
  - `opencode --help`
21
26
 
27
+ First-party canaries for local manual validation:
28
+
29
+ - a local `hashnet-mcp-js` checkout wired into Codex, Cursor, or Claude Code config
30
+ - a local `registry-broker-skills` checkout for scanner fixtures and trust review
31
+
22
32
  Claude Code smoke tests remain conditional on the local `claude` binary being available.
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "plugin-scanner"
7
- version = "2.0.1"
8
- description = "Security, operational-security, and publishability scanner for Codex, Claude, Gemini, and OpenCode plugin ecosystems."
7
+ version = "2.0.3"
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"
11
11
  requires-python = ">=3.10"
@@ -49,7 +49,9 @@ publish = [
49
49
  ]
50
50
 
51
51
  [project.scripts]
52
+ hol-guard = "codex_plugin_scanner.cli:main"
52
53
  plugin-scanner = "codex_plugin_scanner.cli:main"
54
+ plugin-guard = "codex_plugin_scanner.cli:main"
53
55
  codex-plugin-scanner = "codex_plugin_scanner.cli:main"
54
56
  plugin-ecosystem-scanner = "codex_plugin_scanner.cli:main"
55
57
 
@@ -66,6 +68,15 @@ extend-exclude = ["tests/test-trust-scoring.py", "tests/test-trust-specs.py"]
66
68
  [tool.hatch.build.targets.wheel]
67
69
  packages = ["src/codex_plugin_scanner"]
68
70
 
71
+ [tool.hatch.build]
72
+ exclude = [
73
+ ".guard-e2e/**",
74
+ ".guard-e2e-prod/**",
75
+ ".guard-e2e-prod2/**",
76
+ ".guard-prod-venv/**",
77
+ ".guard-prod-venv-fresh/**",
78
+ ]
79
+
69
80
  [tool.ruff.lint]
70
81
  select = ["E", "F", "W", "I", "N", "UP", "B", "A", "SIM", "RUF"]
71
82