plugin-scanner 2.0.3__tar.gz → 2.0.5__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 (266) hide show
  1. plugin_scanner-2.0.5/.github/dependabot.yml +59 -0
  2. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.github/workflows/ci.yml +2 -2
  3. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.github/workflows/codeql.yml +2 -2
  4. plugin_scanner-2.0.5/.github/workflows/dependabot-uv-lock.yml +54 -0
  5. plugin_scanner-2.0.5/.github/workflows/harness-smoke.yml +114 -0
  6. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.github/workflows/publish.yml +65 -8
  7. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.github/workflows/scorecard.yml +1 -1
  8. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.gitignore +6 -0
  9. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/PKG-INFO +94 -74
  10. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/README.md +89 -71
  11. plugin_scanner-2.0.5/dashboard/index.html +38 -0
  12. plugin_scanner-2.0.5/dashboard/package.json +22 -0
  13. plugin_scanner-2.0.5/dashboard/pnpm-lock.yaml +1449 -0
  14. plugin_scanner-2.0.5/dashboard/public/brand/Logo_Whole.png +0 -0
  15. plugin_scanner-2.0.5/dashboard/src/app.tsx +184 -0
  16. plugin_scanner-2.0.5/dashboard/src/approval-center-layout.tsx +485 -0
  17. plugin_scanner-2.0.5/dashboard/src/approval-center-primitives.tsx +342 -0
  18. plugin_scanner-2.0.5/dashboard/src/approval-center-utils.ts +187 -0
  19. plugin_scanner-2.0.5/dashboard/src/guard-api.ts +118 -0
  20. plugin_scanner-2.0.5/dashboard/src/guard-demo.ts +146 -0
  21. plugin_scanner-2.0.5/dashboard/src/guard-types.ts +67 -0
  22. plugin_scanner-2.0.5/dashboard/src/main.tsx +17 -0
  23. plugin_scanner-2.0.5/dashboard/src/styles.css +201 -0
  24. plugin_scanner-2.0.5/dashboard/src/vite-env.d.ts +1 -0
  25. plugin_scanner-2.0.5/dashboard/tsconfig.json +20 -0
  26. plugin_scanner-2.0.5/dashboard/vite.config.ts +41 -0
  27. plugin_scanner-2.0.5/docs/guard/approval-audit.md +66 -0
  28. plugin_scanner-2.0.5/docs/guard/get-started.md +153 -0
  29. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/docs/guard/harness-support.md +11 -0
  30. plugin_scanner-2.0.5/docs/guard/local-dashboard-failure-ledger.md +102 -0
  31. plugin_scanner-2.0.5/docs/guard/local-dashboard-redesign-todo.md +98 -0
  32. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/docs/guard/local-vs-cloud.md +3 -0
  33. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/docs/guard/testing-matrix.md +8 -0
  34. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/pyproject.toml +8 -10
  35. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/pyproject.toml.bak +7 -6
  36. plugin_scanner-2.0.5/requirements.txt +1 -0
  37. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/skill_security.py +1 -1
  38. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/cli.py +26 -10
  39. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/adapters/base.py +10 -0
  40. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/adapters/claude_code.py +5 -0
  41. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/adapters/codex.py +3 -0
  42. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/adapters/cursor.py +5 -0
  43. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/adapters/gemini.py +5 -0
  44. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/adapters/opencode.py +5 -0
  45. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/approvals.py +273 -0
  46. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/cli/approval_commands.py +63 -0
  47. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/cli/commands.py +316 -17
  48. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/cli/product.py +15 -0
  49. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/cli/prompt.py +1 -0
  50. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/cli/render.py +245 -5
  51. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/config.py +42 -0
  52. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/consumer/service.py +166 -14
  53. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/daemon/__init__.py +6 -0
  54. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/daemon/manager.py +131 -0
  55. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/daemon/server.py +349 -0
  56. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +9 -0
  57. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +1 -0
  58. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
  59. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/daemon/static/index.html +39 -0
  60. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/incident.py +128 -0
  61. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/models.py +52 -1
  62. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/policy/engine.py +1 -1
  63. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/protect.py +591 -0
  64. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/receipts/manager.py +2 -0
  65. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/risk.py +83 -0
  66. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/runtime/runner.py +32 -2
  67. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +50 -8
  68. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/store.py +1022 -0
  69. plugin_scanner-2.0.5/src/codex_plugin_scanner/guard/store_approvals.py +284 -0
  70. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +1 -1
  71. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/version.py +1 -1
  72. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_action_bundle.py +36 -5
  73. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_cli.py +9 -7
  74. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_coverage_remaining.py +2 -1
  75. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_edge_cases.py +3 -2
  76. plugin_scanner-2.0.5/tests/test_guard_approvals.py +1061 -0
  77. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_guard_cli.py +359 -2
  78. plugin_scanner-2.0.5/tests/test_guard_events.py +124 -0
  79. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_guard_product_flow.py +27 -0
  80. plugin_scanner-2.0.5/tests/test_guard_protect.py +308 -0
  81. plugin_scanner-2.0.5/tests/test_guard_risk.py +178 -0
  82. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_guard_runtime.py +497 -15
  83. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_integration.py +8 -6
  84. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_live_cisco_smoke.py +5 -4
  85. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_scanner.py +3 -2
  86. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_skill_security.py +1 -1
  87. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_submission.py +2 -1
  88. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/uv.lock +4 -10
  89. plugin_scanner-2.0.3/.github/dependabot.yml +0 -12
  90. plugin_scanner-2.0.3/docs/guard/get-started.md +0 -82
  91. plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -5
  92. plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/daemon/server.py +0 -67
  93. plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/store.py +0 -420
  94. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.clusterfuzzlite/Dockerfile +0 -0
  95. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.clusterfuzzlite/build.sh +0 -0
  96. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.clusterfuzzlite/project.yaml +0 -0
  97. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.clusterfuzzlite/requirements-atheris.txt +0 -0
  98. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.dockerignore +0 -0
  99. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.github/CODEOWNERS +0 -0
  100. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.github/workflows/e2e-test.yml +0 -0
  101. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.github/workflows/fuzz.yml +0 -0
  102. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.github/workflows/publish-action-repo.yml +0 -0
  103. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/.pre-commit-hooks.yaml +0 -0
  104. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/CONTRIBUTING.md +0 -0
  105. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/Dockerfile +0 -0
  106. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/LICENSE +0 -0
  107. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/SECURITY.md +0 -0
  108. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/action/README.legacy.md +0 -0
  109. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/action/README.md +0 -0
  110. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/action/action.yml +0 -0
  111. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/action/cisco-version.txt +0 -0
  112. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/action/pypi-attestations-version.txt +0 -0
  113. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/action/scanner-version.txt +0 -0
  114. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/docker-requirements.txt +0 -0
  115. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/docs/guard/architecture.md +0 -0
  116. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/docs/guard/repo-boundaries.md +0 -0
  117. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/docs/trust/mcp-trust-draft.md +0 -0
  118. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/docs/trust/plugin-trust-draft.md +0 -0
  119. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/docs/trust/skill-trust-local.md +0 -0
  120. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/fuzzers/manifest_fuzzer.py +0 -0
  121. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/schemas/plugin-quality.v1.json +0 -0
  122. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/schemas/scan-result.v1.json +0 -0
  123. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/schemas/verify-result.v1.json +0 -0
  124. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/__init__.py +0 -0
  125. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/action_runner.py +0 -0
  126. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/__init__.py +0 -0
  127. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
  128. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/claude.py +0 -0
  129. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
  130. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
  131. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/gemini.py +0 -0
  132. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/manifest.py +0 -0
  133. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
  134. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
  135. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/opencode.py +0 -0
  136. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
  137. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/checks/security.py +0 -0
  138. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/config.py +0 -0
  139. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
  140. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
  141. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
  142. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
  143. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
  144. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
  145. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
  146. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
  147. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
  148. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/__init__.py +0 -0
  149. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
  150. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
  151. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
  152. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
  153. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
  154. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
  155. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
  156. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
  157. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
  158. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
  159. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/guard/shims.py +0 -0
  160. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
  161. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/lint_fixes.py +0 -0
  162. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/marketplace_support.py +0 -0
  163. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/models.py +0 -0
  164. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/path_support.py +0 -0
  165. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/policy.py +0 -0
  166. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/quality_artifact.py +0 -0
  167. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/repo_detect.py +0 -0
  168. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/reporting.py +0 -0
  169. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/rules/__init__.py +0 -0
  170. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/rules/registry.py +0 -0
  171. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/rules/specs.py +0 -0
  172. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/scanner.py +0 -0
  173. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/submission.py +0 -0
  174. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/suppressions.py +0 -0
  175. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
  176. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/trust_helpers.py +0 -0
  177. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
  178. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/trust_models.py +0 -0
  179. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
  180. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/trust_scoring.py +0 -0
  181. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
  182. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/trust_specs.py +0 -0
  183. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/src/codex_plugin_scanner/verification.py +0 -0
  184. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/__init__.py +0 -0
  185. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/__init__.py +0 -0
  186. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
  187. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/bad-plugin/.mcp.json +0 -0
  188. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/bad-plugin/secrets.js +0 -0
  189. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
  190. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
  191. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/claude-plugin-good/README.md +0 -0
  192. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
  193. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
  194. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
  195. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/code-quality-bad/evil.js +0 -0
  196. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/code-quality-bad/inject.js +0 -0
  197. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
  198. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
  199. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/gemini-extension-good/README.md +0 -0
  200. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
  201. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
  202. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
  203. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
  204. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/good-plugin/.codexignore +0 -0
  205. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/good-plugin/LICENSE +0 -0
  206. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/good-plugin/README.md +0 -0
  207. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/good-plugin/SECURITY.md +0 -0
  208. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
  209. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
  210. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
  211. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
  212. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
  213. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
  214. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
  215. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/mit-license/LICENSE +0 -0
  216. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
  217. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
  218. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
  219. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
  220. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
  221. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
  222. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
  223. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
  224. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
  225. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
  226. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
  227. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
  228. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
  229. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
  230. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
  231. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
  232. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
  233. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
  234. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/opencode-good/LICENSE +0 -0
  235. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/opencode-good/README.md +0 -0
  236. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/opencode-good/SECURITY.md +0 -0
  237. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
  238. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
  239. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
  240. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
  241. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
  242. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
  243. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/fixtures/with-marketplace/marketplace.json +0 -0
  244. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test-trust-scoring.py +0 -0
  245. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test-trust-specs.py +0 -0
  246. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_action_runner.py +0 -0
  247. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_best_practices.py +0 -0
  248. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_code_quality.py +0 -0
  249. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_config.py +0 -0
  250. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_ecosystems.py +0 -0
  251. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_final_coverage.py +0 -0
  252. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_guard_launch_env.py +0 -0
  253. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_lint_fixes.py +0 -0
  254. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_manifest.py +0 -0
  255. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_marketplace.py +0 -0
  256. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_operational_security.py +0 -0
  257. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_policy.py +0 -0
  258. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_quality_artifact.py +0 -0
  259. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_rule_registry.py +0 -0
  260. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_schema_contracts.py +0 -0
  261. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_security.py +0 -0
  262. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_security_ops.py +0 -0
  263. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_trust_scoring.py +0 -0
  264. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_trust_specs.py +0 -0
  265. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_verification.py +0 -0
  266. {plugin_scanner-2.0.3 → plugin_scanner-2.0.5}/tests/test_versioning.py +0 -0
@@ -0,0 +1,59 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ day: "monday"
8
+ time: "05:00"
9
+ timezone: "America/New_York"
10
+ open-pull-requests-limit: 10
11
+ labels:
12
+ - "dependencies"
13
+ - "python"
14
+ commit-message:
15
+ prefix: "deps(pip)"
16
+ groups:
17
+ pip-patch-minor:
18
+ update-types:
19
+ - "minor"
20
+ - "patch"
21
+ pip-major:
22
+ update-types:
23
+ - "major"
24
+
25
+ - package-ecosystem: "github-actions"
26
+ directory: "/"
27
+ schedule:
28
+ interval: "weekly"
29
+ day: "monday"
30
+ time: "05:15"
31
+ timezone: "America/New_York"
32
+ open-pull-requests-limit: 10
33
+ labels:
34
+ - "dependencies"
35
+ - "github-actions"
36
+ commit-message:
37
+ prefix: "deps(actions)"
38
+ groups:
39
+ github-actions-all:
40
+ patterns:
41
+ - "*"
42
+
43
+ - package-ecosystem: "docker"
44
+ directory: "/"
45
+ schedule:
46
+ interval: "weekly"
47
+ day: "monday"
48
+ time: "05:30"
49
+ timezone: "America/New_York"
50
+ open-pull-requests-limit: 10
51
+ labels:
52
+ - "dependencies"
53
+ - "docker"
54
+ commit-message:
55
+ prefix: "deps(docker)"
56
+ groups:
57
+ docker-all:
58
+ patterns:
59
+ - "*"
@@ -19,7 +19,7 @@ jobs:
19
19
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
20
20
  with:
21
21
  python-version: ${{ matrix.python-version }}
22
- - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e
22
+ - uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57
23
23
  with:
24
24
  enable-cache: true
25
25
  - run: uv sync --frozen --extra dev --python ${{ matrix.python-version }}
@@ -38,7 +38,7 @@ jobs:
38
38
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
39
39
  with:
40
40
  python-version: ${{ matrix.python-version }}
41
- - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e
41
+ - uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57
42
42
  with:
43
43
  enable-cache: true
44
44
  - run: uv sync --frozen --extra dev --python ${{ matrix.python-version }}
@@ -31,11 +31,11 @@ jobs:
31
31
  LEGACY_ROOT="/home/runner/work/codex-plugin-scanner"
32
32
  mkdir -p "$LEGACY_ROOT"
33
33
  ln -sfn "$GITHUB_WORKSPACE" "$LEGACY_ROOT/codex-plugin-scanner"
34
- - uses: github/codeql-action/init@51f77329afa6477de8c49fc9c7046c15b9a4e79d
34
+ - uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13
35
35
  with:
36
36
  languages: ${{ matrix.language }}
37
37
  build-mode: none
38
38
  source-root: .
39
- - uses: github/codeql-action/analyze@51f77329afa6477de8c49fc9c7046c15b9a4e79d
39
+ - uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13
40
40
  with:
41
41
  category: /language:${{ matrix.language }}
@@ -0,0 +1,54 @@
1
+ name: Dependabot Lockfile Sync
2
+
3
+ on:
4
+ pull_request_target:
5
+ types:
6
+ - opened
7
+ - synchronize
8
+ - reopened
9
+ paths:
10
+ - "pyproject.toml"
11
+ - "requirements.txt"
12
+ - "docker-requirements.txt"
13
+ - ".github/dependabot.yml"
14
+
15
+ permissions:
16
+ contents: write
17
+
18
+ jobs:
19
+ sync-lockfile:
20
+ if: github.actor == 'dependabot[bot]' && github.event.pull_request.head.repo.full_name == github.repository
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - name: Checkout PR branch
24
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
25
+ with:
26
+ repository: ${{ github.event.pull_request.head.repo.full_name }}
27
+ ref: ${{ github.event.pull_request.head.ref }}
28
+ fetch-depth: 0
29
+
30
+ - name: Set up Python
31
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
32
+ with:
33
+ python-version: "3.12"
34
+
35
+ - name: Set up uv
36
+ uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e
37
+ with:
38
+ enable-cache: true
39
+
40
+ - name: Refresh lockfile
41
+ run: uv lock --no-build
42
+
43
+ - name: Commit lockfile updates
44
+ run: |
45
+ if git diff --quiet -- uv.lock; then
46
+ echo "uv.lock unchanged"
47
+ exit 0
48
+ fi
49
+
50
+ git config user.name "github-actions[bot]"
51
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
52
+ git add uv.lock
53
+ git commit -m "chore: sync uv.lock for dependabot"
54
+ git push
@@ -0,0 +1,114 @@
1
+ name: Guard Harness Smoke
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ schedule:
6
+ - cron: "17 7 * * *"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ codex-release-gate:
13
+ name: Codex release gate
14
+ runs-on:
15
+ - self-hosted
16
+ - linux
17
+ - guard
18
+ steps:
19
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
20
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
21
+ with:
22
+ python-version: "3.12"
23
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e
24
+ with:
25
+ enable-cache: true
26
+ - name: Prepare Guard environment
27
+ run: |
28
+ uv sync --frozen --extra dev
29
+ mkdir -p .guard-ci/codex-home/.codex .guard-ci/codex-workspace/.codex
30
+ cat > .guard-ci/codex-home/.codex/config.toml <<'EOF'
31
+ [mcp_servers.global_tools]
32
+ command = "python3"
33
+ args = ["-m", "http.server", "9000"]
34
+ EOF
35
+ cat > .guard-ci/codex-workspace/.codex/config.toml <<'EOF'
36
+ [mcp_servers.workspace_skill]
37
+ command = "node"
38
+ args = ["workspace-skill.js"]
39
+ EOF
40
+ - name: Guard detect and install for Codex
41
+ run: |
42
+ uv run hol-guard detect codex --home .guard-ci/codex-home --workspace .guard-ci/codex-workspace --json
43
+ uv run hol-guard install codex --home .guard-ci/codex-home --workspace .guard-ci/codex-workspace --json
44
+ uv run hol-guard run codex --home .guard-ci/codex-home --workspace .guard-ci/codex-workspace --dry-run --default-action allow --json
45
+ - name: Verify Codex runtime is available
46
+ run: |
47
+ command -v codex
48
+ codex mcp list
49
+
50
+ macos-release-gate:
51
+ name: Claude or Cursor release gate
52
+ runs-on:
53
+ - self-hosted
54
+ - macOS
55
+ - guard
56
+ steps:
57
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
58
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
59
+ with:
60
+ python-version: "3.12"
61
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e
62
+ with:
63
+ enable-cache: true
64
+ - name: Prepare Guard environment
65
+ run: uv sync --frozen --extra dev
66
+ - name: Guard detect for Claude Code
67
+ run: uv run hol-guard detect claude-code --json
68
+ - name: Guard detect for Cursor
69
+ run: uv run hol-guard detect cursor --json
70
+ - name: Verify Claude Code or Cursor runtime
71
+ run: |
72
+ if command -v claude >/dev/null 2>&1; then
73
+ claude --help >/dev/null
74
+ exit 0
75
+ fi
76
+ command -v cursor-agent
77
+ cursor-agent mcp list
78
+
79
+ windows-release-gate:
80
+ name: Gemini or OpenCode release gate
81
+ runs-on:
82
+ - self-hosted
83
+ - windows
84
+ - guard
85
+ steps:
86
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
87
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
88
+ with:
89
+ python-version: "3.12"
90
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e
91
+ with:
92
+ enable-cache: true
93
+ - name: Prepare Guard environment
94
+ shell: pwsh
95
+ run: uv sync --frozen --extra dev
96
+ - name: Guard detect for Gemini
97
+ shell: pwsh
98
+ run: uv run hol-guard detect gemini --json
99
+ - name: Guard detect for OpenCode
100
+ shell: pwsh
101
+ run: uv run hol-guard detect opencode --json
102
+ - name: Verify Gemini or OpenCode runtime
103
+ shell: pwsh
104
+ run: |
105
+ $gemini = Get-Command gemini -ErrorAction SilentlyContinue
106
+ if ($null -ne $gemini) {
107
+ gemini --help | Out-Null
108
+ exit 0
109
+ }
110
+ $opencode = Get-Command opencode -ErrorAction SilentlyContinue
111
+ if ($null -eq $opencode) {
112
+ throw "Expected gemini or opencode on the Windows Guard runner."
113
+ }
114
+ opencode --help | Out-Null
@@ -36,11 +36,11 @@ jobs:
36
36
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
37
37
  with:
38
38
  python-version: "3.12"
39
- - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e
39
+ - uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57
40
40
  with:
41
41
  enable-cache: true
42
42
  - name: Install dependencies
43
- run: uv sync --frozen --extra dev --group publish
43
+ run: uv sync --frozen --extra dev --extra publish
44
44
  - name: Compute publish version
45
45
  id: version
46
46
  env:
@@ -70,18 +70,75 @@ 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 (hol-guard)
74
- run: uv run --no-sync python -m build
75
- - name: Build compatibility package (plugin-scanner)
73
+ - name: Build Guard package (hol-guard)
76
74
  run: |
77
75
  cp pyproject.toml pyproject.toml.bak
78
- sed -i "1,/^name = /{s/^name = .*/name = \"plugin-scanner\"/}" pyproject.toml
76
+ python3 - <<'PY'
77
+ from pathlib import Path
78
+
79
+ path = Path("pyproject.toml")
80
+ text = path.read_text(encoding="utf-8")
81
+ text = text.replace('name = "hol-guard"', 'name = "hol-guard"', 1)
82
+ text = text.replace(
83
+ 'description = "Protect local AI harnesses with HOL Guard and run scanner checks for Codex, Claude, Cursor, Gemini, and OpenCode."',
84
+ 'description = "Protect local AI harnesses with HOL Guard before tools run in Codex, Claude Code, Cursor, Gemini, and OpenCode."',
85
+ 1,
86
+ )
87
+ start = text.index("[project.scripts]")
88
+ end = text.index("\n\n[project.urls]")
89
+ scripts = "[project.scripts]\n" \
90
+ 'hol-guard = "codex_plugin_scanner.cli:main"\n' \
91
+ 'plugin-guard = "codex_plugin_scanner.cli:main"'
92
+ text = text[:start] + scripts + text[end:]
93
+ path.write_text(text, encoding="utf-8")
94
+ PY
95
+ uv run --no-sync python -m build
96
+ mv pyproject.toml.bak pyproject.toml
97
+ - name: Build scanner package (plugin-scanner)
98
+ run: |
99
+ cp pyproject.toml pyproject.toml.bak
100
+ python3 - <<'PY'
101
+ from pathlib import Path
102
+
103
+ path = Path("pyproject.toml")
104
+ text = path.read_text(encoding="utf-8")
105
+ text = text.replace('name = "hol-guard"', 'name = "plugin-scanner"', 1)
106
+ text = text.replace(
107
+ 'description = "Protect local AI harnesses with HOL Guard and run scanner checks for Codex, Claude, Cursor, Gemini, and OpenCode."',
108
+ 'description = "Lint, verify, and gate plugin ecosystems for maintainers, CI, and publish workflows."',
109
+ 1,
110
+ )
111
+ start = text.index("[project.scripts]")
112
+ end = text.index("\n\n[project.urls]")
113
+ scripts = "[project.scripts]\n" \
114
+ 'plugin-scanner = "codex_plugin_scanner.cli:main"\n' \
115
+ 'plugin-ecosystem-scanner = "codex_plugin_scanner.cli:main"'
116
+ text = text[:start] + scripts + text[end:]
117
+ path.write_text(text, encoding="utf-8")
118
+ PY
79
119
  uv run --no-sync python -m build
80
120
  mv pyproject.toml.bak pyproject.toml
81
- - name: Build compatibility package (codex-plugin-scanner)
121
+ - name: Build codex compatibility alias (codex-plugin-scanner)
82
122
  run: |
83
123
  cp pyproject.toml pyproject.toml.bak
84
- sed -i "1,/^name = /{s/^name = .*/name = \"codex-plugin-scanner\"/}" pyproject.toml
124
+ python3 - <<'PY'
125
+ from pathlib import Path
126
+
127
+ path = Path("pyproject.toml")
128
+ text = path.read_text(encoding="utf-8")
129
+ text = text.replace('name = "hol-guard"', 'name = "codex-plugin-scanner"', 1)
130
+ text = text.replace(
131
+ 'description = "Protect local AI harnesses with HOL Guard and run scanner checks for Codex, Claude, Cursor, Gemini, and OpenCode."',
132
+ 'description = "Compatibility alias for teams still pinned to the codex-plugin-scanner package name."',
133
+ 1,
134
+ )
135
+ start = text.index("[project.scripts]")
136
+ end = text.index("\n\n[project.urls]")
137
+ scripts = "[project.scripts]\n" \
138
+ 'codex-plugin-scanner = "codex_plugin_scanner.cli:main"'
139
+ text = text[:start] + scripts + text[end:]
140
+ path.write_text(text, encoding="utf-8")
141
+ PY
85
142
  uv run --no-sync python -m build
86
143
  mv pyproject.toml.bak pyproject.toml
87
144
  - name: Verify distributions
@@ -21,7 +21,7 @@ jobs:
21
21
  results_file: results.sarif
22
22
  results_format: sarif
23
23
  publish_results: true
24
- - uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d
24
+ - uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13
25
25
  with:
26
26
  sarif_file: results.sarif
27
27
  if: always()
@@ -25,6 +25,12 @@ coverage/
25
25
 
26
26
  # Tooling
27
27
  .ruff_cache/
28
+ dashboard/node_modules/
29
+ dashboard/.vite/
30
+ dashboard/dist/
31
+ .guard-*/
32
+ .guard-ui-review/
33
+ .package-check/
28
34
 
29
35
  # IDE
30
36
  .idea/
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plugin-scanner
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.
3
+ Version: 2.0.5
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
7
7
  Project-URL: Issues, https://github.com/hashgraph-online/ai-plugin-scanner/issues
@@ -21,24 +21,27 @@ Classifier: Programming Language :: Python :: 3.13
21
21
  Classifier: Topic :: Security
22
22
  Classifier: Topic :: Software Development :: Quality Assurance
23
23
  Requires-Python: >=3.10
24
+ Requires-Dist: cisco-ai-skill-scanner~=2.0.8
24
25
  Requires-Dist: rich>=13.0
25
26
  Requires-Dist: tomli>=2.0; python_version < '3.11'
26
27
  Provides-Extra: cisco
27
- Requires-Dist: cisco-ai-skill-scanner==2.0.8; extra == 'cisco'
28
28
  Provides-Extra: dev
29
29
  Requires-Dist: build>=1.2.2; extra == 'dev'
30
30
  Requires-Dist: jsonschema>=4.23.0; extra == 'dev'
31
31
  Requires-Dist: pytest-cov>=4.0; extra == 'dev'
32
32
  Requires-Dist: pytest>=7.0; extra == 'dev'
33
33
  Requires-Dist: ruff>=0.4.0; extra == 'dev'
34
+ Provides-Extra: publish
35
+ Requires-Dist: twine>=6.1.0; extra == 'publish'
34
36
  Description-Content-Type: text/markdown
35
37
 
36
38
  # HOL Guard
37
39
 
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)
40
+ [![HOL Guard Version](https://img.shields.io/pypi/v/hol-guard.svg?logo=pypi&logoColor=white&cacheSeconds=300)](https://pypi.org/project/hol-guard/)
41
+ [![Plugin Scanner Version](https://img.shields.io/pypi/v/plugin-scanner.svg?logo=pypi&logoColor=white&cacheSeconds=300)](https://pypi.org/project/plugin-scanner/)
42
+ [![HOL Guard Downloads](https://img.shields.io/pypi/dm/hol-guard?logo=pypi&logoColor=white)](https://pypi.org/project/hol-guard/)
43
+ [![Plugin Scanner Downloads](https://img.shields.io/pypi/dm/plugin-scanner?logo=pypi&logoColor=white)](https://pypi.org/project/plugin-scanner/)
44
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-3776AB?logo=python&logoColor=white)](#install-the-package-you-need)
42
45
  [![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
46
  [![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
47
  [![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,54 +50,78 @@ Description-Content-Type: text/markdown
47
50
  [![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
51
  [![Lint: ruff](https://img.shields.io/badge/lint-ruff-D7FF64.svg)](https://github.com/astral-sh/ruff)
49
52
 
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) |
53
+ | ![Hashgraph Online Logo](https://hol.org/brand/Logo_Whole_Dark.png) | **Protect your harness locally with `hol-guard`.** Use `plugin-scanner` when you need maintainer and CI checks for plugins, skills, MCP servers, and marketplace packages.<br><br>[PyPI Package (`hol-guard`)](https://pypi.org/project/hol-guard/)<br>[PyPI Package (`plugin-scanner`)](https://pypi.org/project/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
54
  | :--- | :--- |
52
55
 
53
- ## Protect A Harness In 60 Seconds
56
+ ## Start Here
57
+
58
+ | If you want to... | Install | Start with |
59
+ | :--- | :--- | :--- |
60
+ | protect Codex, Claude Code, Cursor, Gemini, or OpenCode before tools run | `hol-guard` | `hol-guard start` |
61
+ | lint and verify packages in CI before release | `plugin-scanner` | `plugin-scanner verify .` |
62
+
63
+ ## Guard Quickstart
54
64
 
55
65
  ```bash
56
- # See what Guard found on this machine
57
66
  pipx run hol-guard start
58
-
59
- # Install Guard in front of Codex
60
67
  pipx run hol-guard install codex
61
-
62
- # Record the current tool state once
63
68
  pipx run hol-guard run codex --dry-run
64
-
65
- # Launch through Guard after that
66
69
  pipx run hol-guard run codex
67
-
68
- # Check what Guard approved or blocked
70
+ pipx run hol-guard approvals
69
71
  pipx run hol-guard receipts
70
72
  ```
71
73
 
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
74
+ What you get from Guard:
80
75
 
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
76
+ - Detects local harness config on your machine
77
+ - Records a baseline before you trust a tool
78
+ - Pauses cleanly on new or changed artifacts before launch
79
+ - Queues blocked changes in a localhost approval center when the harness cannot prompt inline
80
+ - Stores receipts locally so you can review decisions later
81
+ - Keeps sync optional until you actually want shared history
90
82
 
91
83
  See [docs/guard/get-started.md](docs/guard/get-started.md) for the full local flow.
92
84
 
93
- ## Use The Scanner In CI
85
+ <details>
86
+ <summary>Guard commands at a glance</summary>
87
+
88
+ - `hol-guard start`
89
+ Shows the next step for the harnesses Guard found.
90
+ - `hol-guard status`
91
+ Shows what Guard is watching now.
92
+ - `hol-guard install <harness>`
93
+ Creates the launcher shim for that harness.
94
+ - `hol-guard run <harness> --dry-run`
95
+ Records the current state once before you trust it.
96
+ - `hol-guard run <harness>`
97
+ Reviews changes before launch and hands blocked sessions to the approval center when needed.
98
+ - `hol-guard approvals`
99
+ Lists pending approvals or resolves them from the terminal.
100
+ - `hol-guard receipts`
101
+ Shows local approval and block history.
102
+
103
+ </details>
104
+
105
+ <details>
106
+ <summary>Harness approval strategy</summary>
107
+
108
+ - `claude-code`
109
+ Guard prefers Claude hooks first, then the local approval center when the shell cannot prompt.
110
+ - `codex`
111
+ Guard owns artifact approval today through the local approval center. App Server is the future path for richer in-client approvals.
112
+ - `cursor`
113
+ Guard respects Cursor’s native tool approval and focuses on artifact trust before launch.
114
+ - `opencode`
115
+ Guard authors package-level policy while OpenCode keeps native allow or deny rules.
116
+ - `gemini`
117
+ Guard scans extensions and falls back to the local approval center for blocked changes.
118
+
119
+ </details>
120
+
121
+ ## Scanner Quickstart
94
122
 
95
123
  ```bash
96
- # Install the package once, then use the scanner commands in your shell
97
- pipx install hol-guard
124
+ pipx install plugin-scanner
98
125
  plugin-scanner lint .
99
126
  plugin-scanner verify .
100
127
  ```
@@ -109,30 +136,23 @@ plugin-scanner verify .
109
136
  min_score: 80
110
137
  ```
111
138
 
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.
113
-
114
- ## Start With Guard, Add CI Later
115
-
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.
139
+ When to add `plugin-scanner`:
122
140
 
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.
141
+ - You publish plugins, skills, or marketplace packages
142
+ - You want a CI gate before release
143
+ - You need SARIF, verification payloads, or submission artifacts
125
144
 
126
- ## Use Scanner After `$plugin-creator`
145
+ 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.
127
146
 
128
- If you are building and shipping packages, the scanner fits after `$plugin-creator`:
147
+ ## Need More Detail?
129
148
 
130
- 1. Scaffold with `$plugin-creator`.
131
- 2. Run `lint` locally to catch structure, metadata, and security issues early.
132
- 3. Run `verify` in CI to block regressions and enforce quality policy.
133
- 4. Ship or submit with confidence, backed by scanner artifacts and trust signals.
149
+ - Contributor setup: jump to [Development](#development)
150
+ - Local Guard docs: [docs/guard/get-started.md](docs/guard/get-started.md)
151
+ - GitHub Action docs: [action/README.md](action/README.md)
152
+ - Registry and trust references: keep reading below
134
153
 
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.
154
+ <details>
155
+ <summary>Scanner reference: trust scoring, installs, ecosystems, and CLI commands</summary>
136
156
 
137
157
  ## How Trust Scoring Works
138
158
 
@@ -161,26 +181,27 @@ pip install -e ".[dev]"
161
181
  pytest -q
162
182
  ```
163
183
 
164
- ## Install
184
+ ## Install The Package You Need
185
+
186
+ Guard package:
165
187
 
166
188
  ```bash
167
189
  pip install hol-guard
168
190
  ```
169
191
 
170
- Cisco-backed skill scanning is optional:
192
+ Scanner package:
171
193
 
172
194
  ```bash
173
- pip install "hol-guard[cisco]"
195
+ pip install plugin-scanner
174
196
  ```
175
197
 
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.
198
+ Cisco skill scanning support is included in the default `plugin-scanner` install (via `cisco-ai-skill-scanner`).
177
199
 
178
- You can also install once and use both Guard and scanner commands:
200
+ If you want both tools in one shell during local development:
179
201
 
180
202
  ```bash
181
203
  pipx install hol-guard
182
- hol-guard start
183
- plugin-scanner ./my-plugin
204
+ pipx install plugin-scanner
184
205
  ```
185
206
 
186
207
  Container-first environments can use the published image instead:
@@ -192,19 +213,11 @@ docker run --rm \
192
213
  scan /workspace --format text
193
214
  ```
194
215
 
195
- Backward compatibility remains available for teams still pinned to the historical package namespace:
196
-
197
- ```bash
198
- pip install plugin-scanner
199
- pip install codex-plugin-scanner
200
- ```
201
-
202
- Compatibility command names also stay available:
216
+ Command names by package:
203
217
 
204
218
  ```bash
205
- plugin-guard start
219
+ hol-guard start
206
220
  plugin-scanner verify .
207
- codex-plugin-scanner verify .
208
221
  ```
209
222
 
210
223
  ## Ecosystem Support
@@ -294,6 +307,11 @@ plugin-scanner submit ./my-plugin --profile public-marketplace --attest dist/plu
294
307
  plugin-scanner doctor ./my-plugin --component mcp --bundle dist/doctor.zip
295
308
  ```
296
309
 
310
+ </details>
311
+
312
+ <details>
313
+ <summary>Advanced reference: specs, action publishing, automation, and examples</summary>
314
+
297
315
  ## Codex Spec Alignment
298
316
 
299
317
  The scanner follows the current Codex plugin packaging conventions more closely:
@@ -647,6 +665,8 @@ Final Score: 130/130
647
665
 
648
666
  Plugins that pass the scanner with a high score are candidates for listing in the [HOL Plugin Registry](https://hol.org/registry/plugins).
649
667
 
668
+ </details>
669
+
650
670
  ## Resources
651
671
 
652
672
  - [HOL Plugin Registry](https://hol.org/registry/plugins)