plugin-scanner 2.0.2__tar.gz → 2.0.4__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 (269) hide show
  1. plugin_scanner-2.0.4/.github/dependabot.yml +59 -0
  2. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.github/workflows/ci.yml +2 -2
  3. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.github/workflows/codeql.yml +2 -2
  4. plugin_scanner-2.0.4/.github/workflows/dependabot-uv-lock.yml +54 -0
  5. plugin_scanner-2.0.4/.github/workflows/harness-smoke.yml +114 -0
  6. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.github/workflows/publish.yml +74 -7
  7. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.github/workflows/scorecard.yml +1 -1
  8. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.gitignore +6 -0
  9. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/PKG-INFO +107 -81
  10. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/README.md +102 -78
  11. plugin_scanner-2.0.4/dashboard/index.html +38 -0
  12. plugin_scanner-2.0.4/dashboard/package.json +22 -0
  13. plugin_scanner-2.0.4/dashboard/pnpm-lock.yaml +1449 -0
  14. plugin_scanner-2.0.4/dashboard/public/brand/Logo_Whole.png +0 -0
  15. plugin_scanner-2.0.4/dashboard/src/app.tsx +184 -0
  16. plugin_scanner-2.0.4/dashboard/src/approval-center-layout.tsx +485 -0
  17. plugin_scanner-2.0.4/dashboard/src/approval-center-primitives.tsx +342 -0
  18. plugin_scanner-2.0.4/dashboard/src/approval-center-utils.ts +187 -0
  19. plugin_scanner-2.0.4/dashboard/src/guard-api.ts +118 -0
  20. plugin_scanner-2.0.4/dashboard/src/guard-demo.ts +146 -0
  21. plugin_scanner-2.0.4/dashboard/src/guard-types.ts +67 -0
  22. plugin_scanner-2.0.4/dashboard/src/main.tsx +17 -0
  23. plugin_scanner-2.0.4/dashboard/src/styles.css +201 -0
  24. plugin_scanner-2.0.4/dashboard/src/vite-env.d.ts +1 -0
  25. plugin_scanner-2.0.4/dashboard/tsconfig.json +20 -0
  26. plugin_scanner-2.0.4/dashboard/vite.config.ts +41 -0
  27. plugin_scanner-2.0.4/docs/guard/approval-audit.md +66 -0
  28. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/docs/guard/architecture.md +5 -5
  29. plugin_scanner-2.0.4/docs/guard/competitive-parity-matrix.md +48 -0
  30. plugin_scanner-2.0.4/docs/guard/get-started.md +153 -0
  31. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/docs/guard/harness-support.md +11 -0
  32. plugin_scanner-2.0.4/docs/guard/local-dashboard-failure-ledger.md +102 -0
  33. plugin_scanner-2.0.4/docs/guard/local-dashboard-redesign-todo.md +98 -0
  34. plugin_scanner-2.0.4/docs/guard/local-vs-cloud.md +25 -0
  35. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/docs/guard/testing-matrix.md +18 -10
  36. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/pyproject.toml +8 -9
  37. plugin_scanner-2.0.4/pyproject.toml.bak +86 -0
  38. plugin_scanner-2.0.4/requirements.txt +1 -0
  39. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/skill_security.py +1 -1
  40. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/cli.py +41 -9
  41. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/base.py +10 -0
  42. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/claude_code.py +5 -0
  43. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/codex.py +3 -0
  44. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/cursor.py +5 -0
  45. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/gemini.py +5 -0
  46. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/opencode.py +5 -0
  47. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/approvals.py +273 -0
  48. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/cli/__init__.py +5 -0
  49. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/cli/approval_commands.py +63 -0
  50. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/cli/commands.py +331 -19
  51. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/cli/product.py +24 -8
  52. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/cli/prompt.py +2 -1
  53. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/cli/render.py +246 -7
  54. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/config.py +42 -0
  55. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/consumer/service.py +166 -14
  56. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/__init__.py +6 -0
  57. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/manager.py +131 -0
  58. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/server.py +349 -0
  59. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +9 -0
  60. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +1 -0
  61. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
  62. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/static/index.html +39 -0
  63. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/incident.py +128 -0
  64. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/models.py +52 -1
  65. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/policy/engine.py +1 -1
  66. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/protect.py +591 -0
  67. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/receipts/manager.py +2 -0
  68. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/risk.py +83 -0
  69. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/runtime/runner.py +32 -2
  70. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +50 -8
  71. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/store.py +1022 -0
  72. plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/store_approvals.py +284 -0
  73. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +1 -1
  74. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/version.py +1 -1
  75. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_action_bundle.py +50 -20
  76. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_cli.py +9 -7
  77. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_coverage_remaining.py +2 -1
  78. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_ecosystems.py +1 -3
  79. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_edge_cases.py +3 -2
  80. plugin_scanner-2.0.4/tests/test_guard_approvals.py +1061 -0
  81. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_guard_cli.py +367 -3
  82. plugin_scanner-2.0.4/tests/test_guard_events.py +124 -0
  83. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_guard_product_flow.py +79 -2
  84. plugin_scanner-2.0.4/tests/test_guard_protect.py +308 -0
  85. plugin_scanner-2.0.4/tests/test_guard_risk.py +178 -0
  86. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_guard_runtime.py +497 -15
  87. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_integration.py +8 -6
  88. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_live_cisco_smoke.py +5 -4
  89. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_scanner.py +3 -2
  90. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_skill_security.py +1 -1
  91. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_submission.py +2 -1
  92. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_trust_scoring.py +3 -9
  93. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/uv.lock +36 -42
  94. plugin_scanner-2.0.2/.github/dependabot.yml +0 -12
  95. plugin_scanner-2.0.2/docs/guard/get-started.md +0 -82
  96. plugin_scanner-2.0.2/docs/guard/local-vs-cloud.md +0 -22
  97. plugin_scanner-2.0.2/src/codex_plugin_scanner/guard/cli/__init__.py +0 -5
  98. plugin_scanner-2.0.2/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -5
  99. plugin_scanner-2.0.2/src/codex_plugin_scanner/guard/daemon/server.py +0 -67
  100. plugin_scanner-2.0.2/src/codex_plugin_scanner/guard/store.py +0 -420
  101. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.clusterfuzzlite/Dockerfile +0 -0
  102. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.clusterfuzzlite/build.sh +0 -0
  103. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.clusterfuzzlite/project.yaml +0 -0
  104. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.clusterfuzzlite/requirements-atheris.txt +0 -0
  105. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.dockerignore +0 -0
  106. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.github/CODEOWNERS +0 -0
  107. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.github/workflows/e2e-test.yml +0 -0
  108. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.github/workflows/fuzz.yml +0 -0
  109. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.github/workflows/publish-action-repo.yml +0 -0
  110. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/.pre-commit-hooks.yaml +0 -0
  111. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/CONTRIBUTING.md +0 -0
  112. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/Dockerfile +0 -0
  113. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/LICENSE +0 -0
  114. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/SECURITY.md +0 -0
  115. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/action/README.legacy.md +0 -0
  116. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/action/README.md +0 -0
  117. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/action/action.yml +0 -0
  118. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/action/cisco-version.txt +0 -0
  119. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/action/pypi-attestations-version.txt +0 -0
  120. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/action/scanner-version.txt +0 -0
  121. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/docker-requirements.txt +0 -0
  122. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/docs/guard/repo-boundaries.md +0 -0
  123. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/docs/trust/mcp-trust-draft.md +0 -0
  124. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/docs/trust/plugin-trust-draft.md +0 -0
  125. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/docs/trust/skill-trust-local.md +0 -0
  126. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/fuzzers/manifest_fuzzer.py +0 -0
  127. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/schemas/plugin-quality.v1.json +0 -0
  128. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/schemas/scan-result.v1.json +0 -0
  129. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/schemas/verify-result.v1.json +0 -0
  130. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/__init__.py +0 -0
  131. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/action_runner.py +0 -0
  132. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/__init__.py +0 -0
  133. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
  134. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/claude.py +0 -0
  135. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
  136. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
  137. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/gemini.py +0 -0
  138. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/manifest.py +0 -0
  139. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
  140. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
  141. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/opencode.py +0 -0
  142. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
  143. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/security.py +0 -0
  144. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/config.py +0 -0
  145. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
  146. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
  147. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
  148. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
  149. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
  150. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
  151. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
  152. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
  153. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
  154. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/__init__.py +0 -0
  155. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
  156. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
  157. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
  158. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
  159. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
  160. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
  161. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
  162. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
  163. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
  164. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/shims.py +0 -0
  165. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
  166. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/lint_fixes.py +0 -0
  167. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/marketplace_support.py +0 -0
  168. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/models.py +0 -0
  169. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/path_support.py +0 -0
  170. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/policy.py +0 -0
  171. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/quality_artifact.py +0 -0
  172. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/repo_detect.py +0 -0
  173. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/reporting.py +0 -0
  174. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/rules/__init__.py +0 -0
  175. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/rules/registry.py +0 -0
  176. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/rules/specs.py +0 -0
  177. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/scanner.py +0 -0
  178. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/submission.py +0 -0
  179. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/suppressions.py +0 -0
  180. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
  181. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_helpers.py +0 -0
  182. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
  183. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_models.py +0 -0
  184. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
  185. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_scoring.py +0 -0
  186. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
  187. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_specs.py +0 -0
  188. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/verification.py +0 -0
  189. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/__init__.py +0 -0
  190. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/__init__.py +0 -0
  191. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
  192. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/bad-plugin/.mcp.json +0 -0
  193. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/bad-plugin/secrets.js +0 -0
  194. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
  195. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
  196. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/README.md +0 -0
  197. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
  198. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
  199. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
  200. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/code-quality-bad/evil.js +0 -0
  201. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/code-quality-bad/inject.js +0 -0
  202. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
  203. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
  204. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/README.md +0 -0
  205. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
  206. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
  207. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
  208. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
  209. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/.codexignore +0 -0
  210. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/LICENSE +0 -0
  211. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/README.md +0 -0
  212. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/SECURITY.md +0 -0
  213. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
  214. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
  215. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
  216. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
  217. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
  218. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
  219. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
  220. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/mit-license/LICENSE +0 -0
  221. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
  222. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
  223. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
  224. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
  225. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
  226. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
  227. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
  228. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
  229. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
  230. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
  231. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
  232. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
  233. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
  234. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
  235. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
  236. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
  237. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
  238. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
  239. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/LICENSE +0 -0
  240. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/README.md +0 -0
  241. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/SECURITY.md +0 -0
  242. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
  243. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
  244. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
  245. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
  246. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
  247. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
  248. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/fixtures/with-marketplace/marketplace.json +0 -0
  249. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test-trust-scoring.py +0 -0
  250. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test-trust-specs.py +0 -0
  251. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_action_runner.py +0 -0
  252. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_best_practices.py +0 -0
  253. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_code_quality.py +0 -0
  254. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_config.py +0 -0
  255. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_final_coverage.py +0 -0
  256. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_guard_launch_env.py +0 -0
  257. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_lint_fixes.py +0 -0
  258. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_manifest.py +0 -0
  259. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_marketplace.py +0 -0
  260. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_operational_security.py +0 -0
  261. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_policy.py +0 -0
  262. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_quality_artifact.py +0 -0
  263. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_rule_registry.py +0 -0
  264. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_schema_contracts.py +0 -0
  265. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_security.py +0 -0
  266. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_security_ops.py +0 -0
  267. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_trust_specs.py +0 -0
  268. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/tests/test_verification.py +0 -0
  269. {plugin_scanner-2.0.2 → plugin_scanner-2.0.4}/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
@@ -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:
@@ -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,12 +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 (plugin-scanner)
74
- run: uv run --no-sync python -m build
75
- - name: Build legacy compatibility package (codex-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 = \"codex-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
119
+ uv run --no-sync python -m build
120
+ mv pyproject.toml.bak pyproject.toml
121
+ - name: Build codex compatibility alias (codex-plugin-scanner)
122
+ run: |
123
+ cp pyproject.toml pyproject.toml.bak
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
79
142
  uv run --no-sync python -m build
80
143
  mv pyproject.toml.bak pyproject.toml
81
144
  - name: Verify distributions
@@ -171,6 +234,10 @@ jobs:
171
234
  ${LOG}
172
235
 
173
236
  ### Installation
237
+ \`\`\`bash
238
+ uv tool install hol-guard==${VERSION}
239
+ \`\`\`
240
+
174
241
  \`\`\`bash
175
242
  uv tool install plugin-scanner==${VERSION}
176
243
  \`\`\`
@@ -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/