plugin-scanner 2.0.0__tar.gz → 2.0.1__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 (218) hide show
  1. plugin_scanner-2.0.1/.github/workflows/publish-action-repo.yml +206 -0
  2. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.github/workflows/publish.yml +1 -1
  3. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/PKG-INFO +24 -22
  4. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/README.md +23 -21
  5. plugin_scanner-2.0.1/action/README.legacy.md +25 -0
  6. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/action/README.md +39 -27
  7. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/action/action.yml +39 -12
  8. plugin_scanner-2.0.1/docs/guard/architecture.md +24 -0
  9. plugin_scanner-2.0.1/docs/guard/harness-support.md +22 -0
  10. plugin_scanner-2.0.1/docs/guard/local-vs-cloud.md +22 -0
  11. plugin_scanner-2.0.1/docs/guard/repo-boundaries.md +21 -0
  12. plugin_scanner-2.0.1/docs/guard/testing-matrix.md +22 -0
  13. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/pyproject.toml +1 -1
  14. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/action_runner.py +29 -18
  15. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/cli.py +24 -2
  16. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/config.py +12 -5
  17. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/__init__.py +5 -0
  18. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/adapters/__init__.py +36 -0
  19. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/adapters/base.py +139 -0
  20. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/adapters/claude_code.py +168 -0
  21. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/adapters/codex.py +82 -0
  22. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/adapters/cursor.py +94 -0
  23. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/adapters/gemini.py +103 -0
  24. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/adapters/opencode.py +78 -0
  25. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/cli/__init__.py +5 -0
  26. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/cli/commands.py +358 -0
  27. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/cli/render.py +429 -0
  28. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/config.py +76 -0
  29. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/consumer/__init__.py +5 -0
  30. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/consumer/service.py +250 -0
  31. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/daemon/__init__.py +5 -0
  32. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/daemon/server.py +67 -0
  33. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/models.py +120 -0
  34. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/policy/__init__.py +5 -0
  35. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/policy/engine.py +31 -0
  36. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/proxy/__init__.py +6 -0
  37. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/proxy/remote.py +50 -0
  38. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/proxy/stdio.py +125 -0
  39. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/receipts/__init__.py +5 -0
  40. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/receipts/manager.py +36 -0
  41. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/runtime/__init__.py +5 -0
  42. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/runtime/runner.py +74 -0
  43. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/schemas/__init__.py +5 -0
  44. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +71 -0
  45. plugin_scanner-2.0.1/src/codex_plugin_scanner/guard/store.py +373 -0
  46. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/version.py +1 -1
  47. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_action_bundle.py +70 -17
  48. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_action_runner.py +46 -1
  49. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_config.py +39 -2
  50. plugin_scanner-2.0.1/tests/test_guard_cli.py +1005 -0
  51. plugin_scanner-2.0.1/tests/test_guard_runtime.py +527 -0
  52. plugin_scanner-2.0.0/.github/workflows/publish-action-repo.yml +0 -169
  53. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.clusterfuzzlite/Dockerfile +0 -0
  54. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.clusterfuzzlite/build.sh +0 -0
  55. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.clusterfuzzlite/project.yaml +0 -0
  56. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.clusterfuzzlite/requirements-atheris.txt +0 -0
  57. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.dockerignore +0 -0
  58. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.github/CODEOWNERS +0 -0
  59. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.github/dependabot.yml +0 -0
  60. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.github/workflows/ci.yml +0 -0
  61. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.github/workflows/codeql.yml +0 -0
  62. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.github/workflows/e2e-test.yml +0 -0
  63. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.github/workflows/fuzz.yml +0 -0
  64. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.github/workflows/scorecard.yml +0 -0
  65. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.gitignore +0 -0
  66. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/.pre-commit-hooks.yaml +0 -0
  67. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/CONTRIBUTING.md +0 -0
  68. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/Dockerfile +0 -0
  69. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/LICENSE +0 -0
  70. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/SECURITY.md +0 -0
  71. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/action/cisco-version.txt +0 -0
  72. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/action/pypi-attestations-version.txt +0 -0
  73. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/action/scanner-version.txt +0 -0
  74. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/docker-requirements.txt +0 -0
  75. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/docs/trust/mcp-trust-draft.md +0 -0
  76. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/docs/trust/plugin-trust-draft.md +0 -0
  77. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/docs/trust/skill-trust-local.md +0 -0
  78. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/fuzzers/manifest_fuzzer.py +0 -0
  79. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/schemas/plugin-quality.v1.json +0 -0
  80. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/schemas/scan-result.v1.json +0 -0
  81. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/schemas/verify-result.v1.json +0 -0
  82. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/__init__.py +0 -0
  83. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/__init__.py +0 -0
  84. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
  85. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/claude.py +0 -0
  86. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
  87. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
  88. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/gemini.py +0 -0
  89. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/manifest.py +0 -0
  90. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
  91. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
  92. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/opencode.py +0 -0
  93. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
  94. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/security.py +0 -0
  95. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
  96. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
  97. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
  98. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
  99. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
  100. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
  101. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
  102. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
  103. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
  104. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
  105. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
  106. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
  107. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/lint_fixes.py +0 -0
  108. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/marketplace_support.py +0 -0
  109. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/models.py +0 -0
  110. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/path_support.py +0 -0
  111. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/policy.py +0 -0
  112. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/quality_artifact.py +0 -0
  113. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/repo_detect.py +0 -0
  114. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/reporting.py +0 -0
  115. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/rules/__init__.py +0 -0
  116. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/rules/registry.py +0 -0
  117. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/rules/specs.py +0 -0
  118. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/scanner.py +0 -0
  119. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/submission.py +0 -0
  120. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/suppressions.py +0 -0
  121. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
  122. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/trust_helpers.py +0 -0
  123. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
  124. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/trust_models.py +0 -0
  125. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
  126. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/trust_scoring.py +0 -0
  127. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
  128. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/trust_specs.py +0 -0
  129. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/src/codex_plugin_scanner/verification.py +0 -0
  130. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/__init__.py +0 -0
  131. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/__init__.py +0 -0
  132. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
  133. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/bad-plugin/.mcp.json +0 -0
  134. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/bad-plugin/secrets.js +0 -0
  135. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
  136. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
  137. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/claude-plugin-good/README.md +0 -0
  138. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
  139. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
  140. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
  141. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/code-quality-bad/evil.js +0 -0
  142. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/code-quality-bad/inject.js +0 -0
  143. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
  144. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
  145. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/gemini-extension-good/README.md +0 -0
  146. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
  147. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
  148. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
  149. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
  150. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/good-plugin/.codexignore +0 -0
  151. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/good-plugin/LICENSE +0 -0
  152. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/good-plugin/README.md +0 -0
  153. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/good-plugin/SECURITY.md +0 -0
  154. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
  155. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
  156. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
  157. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
  158. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
  159. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
  160. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
  161. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/mit-license/LICENSE +0 -0
  162. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
  163. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
  164. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
  165. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
  166. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
  167. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
  168. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
  169. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
  170. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
  171. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
  172. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
  173. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
  174. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
  175. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
  176. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
  177. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
  178. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
  179. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
  180. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/opencode-good/LICENSE +0 -0
  181. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/opencode-good/README.md +0 -0
  182. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/opencode-good/SECURITY.md +0 -0
  183. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
  184. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
  185. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
  186. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
  187. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
  188. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
  189. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/fixtures/with-marketplace/marketplace.json +0 -0
  190. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test-trust-scoring.py +0 -0
  191. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test-trust-specs.py +0 -0
  192. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_best_practices.py +0 -0
  193. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_cli.py +0 -0
  194. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_code_quality.py +0 -0
  195. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_coverage_remaining.py +0 -0
  196. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_ecosystems.py +0 -0
  197. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_edge_cases.py +0 -0
  198. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_final_coverage.py +0 -0
  199. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_integration.py +0 -0
  200. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_lint_fixes.py +0 -0
  201. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_live_cisco_smoke.py +0 -0
  202. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_manifest.py +0 -0
  203. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_marketplace.py +0 -0
  204. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_operational_security.py +0 -0
  205. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_policy.py +0 -0
  206. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_quality_artifact.py +0 -0
  207. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_rule_registry.py +0 -0
  208. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_scanner.py +0 -0
  209. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_schema_contracts.py +0 -0
  210. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_security.py +0 -0
  211. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_security_ops.py +0 -0
  212. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_skill_security.py +0 -0
  213. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_submission.py +0 -0
  214. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_trust_scoring.py +0 -0
  215. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_trust_specs.py +0 -0
  216. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_verification.py +0 -0
  217. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/tests/test_versioning.py +0 -0
  218. {plugin_scanner-2.0.0 → plugin_scanner-2.0.1}/uv.lock +0 -0
@@ -0,0 +1,206 @@
1
+ name: Publish GitHub Action Repository
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ branches:
7
+ - main
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: ai-plugin-scanner-action-repo-${{ github.ref }}
14
+ cancel-in-progress: false
15
+
16
+ jobs:
17
+ publish-action-repo:
18
+ name: Sync action repo + publish release notes
19
+ runs-on: ubuntu-latest
20
+ permissions:
21
+ contents: read
22
+ env:
23
+ ACTION_CANONICAL_REPOSITORY: ${{ vars.ACTION_CANONICAL_REPOSITORY != '' && vars.ACTION_CANONICAL_REPOSITORY || 'hashgraph-online/ai-plugin-scanner-action' }}
24
+ ACTION_COMPAT_REPOSITORY: ${{ vars.ACTION_COMPAT_REPOSITORY != '' && vars.ACTION_COMPAT_REPOSITORY || 'hashgraph-online/hol-codex-plugin-scanner-action' }}
25
+ SOURCE_REF: ${{ github.sha }}
26
+ SOURCE_REPOSITORY: ${{ github.repository }}
27
+ SOURCE_SERVER_URL: ${{ github.server_url }}
28
+ steps:
29
+ - name: Validate publication credentials
30
+ env:
31
+ ACTION_REPO_TOKEN: ${{ secrets.ACTION_REPO_TOKEN }}
32
+ run: |
33
+ if [ -z "$ACTION_REPO_TOKEN" ]; then
34
+ echo "ACTION_REPO_TOKEN must be configured to publish the Marketplace action repository." >&2
35
+ exit 1
36
+ fi
37
+
38
+ - name: Checkout source repository
39
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
40
+ with:
41
+ fetch-depth: 0
42
+
43
+ - name: Compute next action release tag
44
+ id: version
45
+ env:
46
+ GH_TOKEN: ${{ secrets.ACTION_REPO_TOKEN }}
47
+ run: |
48
+ latest_release_tag() {
49
+ target_repo="$1"
50
+ if ! gh repo view "$target_repo" >/dev/null 2>&1; then
51
+ return
52
+ fi
53
+ gh release list --repo "$target_repo" --limit 1 --json tagName --jq '.[0].tagName // ""'
54
+ }
55
+
56
+ latest_remote_tag() {
57
+ target_repo="$1"
58
+ if ! gh repo view "$target_repo" >/dev/null 2>&1; then
59
+ return
60
+ fi
61
+ git ls-remote --tags --refs "https://x-access-token:${GH_TOKEN}@github.com/${target_repo}.git" "refs/tags/v*" \
62
+ | awk -F'/' '{print $3}' \
63
+ | sort -V \
64
+ | tail -n1
65
+ }
66
+
67
+ LAST_TAG=""
68
+ for candidate in \
69
+ "$(latest_release_tag "$ACTION_CANONICAL_REPOSITORY")" \
70
+ "$(latest_release_tag "$ACTION_COMPAT_REPOSITORY")" \
71
+ "$(latest_remote_tag "$ACTION_CANONICAL_REPOSITORY")" \
72
+ "$(latest_remote_tag "$ACTION_COMPAT_REPOSITORY")"; do
73
+ if [ -z "$candidate" ]; then
74
+ continue
75
+ fi
76
+ if [ -z "$LAST_TAG" ] || [ "$(printf '%s\n%s\n' "$LAST_TAG" "$candidate" | sort -V | tail -n1)" = "$candidate" ]; then
77
+ LAST_TAG="$candidate"
78
+ fi
79
+ done
80
+
81
+ if [ -z "$LAST_TAG" ]; then
82
+ TAG="v1.0.0"
83
+ else
84
+ IFS=. read -r MAJOR MINOR PATCH <<< "${LAST_TAG#v}"
85
+ if [ -z "$MAJOR" ] || [ -z "$MINOR" ] || [ -z "$PATCH" ]; then
86
+ echo "Unsupported release tag format: $LAST_TAG" >&2
87
+ exit 1
88
+ fi
89
+ TAG="v${MAJOR}.${MINOR}.$((PATCH + 1))"
90
+ fi
91
+
92
+ echo "tag=$TAG" >> "$GITHUB_OUTPUT"
93
+
94
+ - name: Compute scanner package version
95
+ id: scanner_version
96
+ env:
97
+ GITHUB_REF: ${{ github.ref }}
98
+ GITHUB_EVENT_NAME: ${{ github.event_name }}
99
+ run: |
100
+ BASE_VERSION=$(python3 -c "import tomllib; p=tomllib.load(open('pyproject.toml','rb')); print(p['project']['version'])")
101
+ VERSION="$BASE_VERSION"
102
+ if [[ "$GITHUB_REF" == refs/tags/v* ]]; then
103
+ VERSION="${GITHUB_REF#refs/tags/v}"
104
+ elif [[ "$GITHUB_EVENT_NAME" == "push" && "$GITHUB_REF" == "refs/heads/main" ]]; then
105
+ LAST_TAG=$(git tag --list 'v*' --sort=-version:refname | head -n1)
106
+ if [[ -n "$LAST_TAG" ]]; then
107
+ IFS=. read -r MAJOR MINOR PATCH <<< "${LAST_TAG#v}"
108
+ if [[ -z "$MAJOR" || -z "$MINOR" || -z "$PATCH" ]]; then
109
+ echo "Unsupported release tag format: $LAST_TAG" >&2
110
+ exit 1
111
+ fi
112
+ VERSION="${MAJOR}.${MINOR}.$((PATCH + 1))"
113
+ fi
114
+ fi
115
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
116
+
117
+ - name: Sync canonical and compatibility action repositories
118
+ env:
119
+ ACTION_REPO_TOKEN: ${{ secrets.ACTION_REPO_TOKEN }}
120
+ GH_TOKEN: ${{ secrets.ACTION_REPO_TOKEN }}
121
+ TAG: ${{ steps.version.outputs.tag }}
122
+ SCANNER_VERSION: ${{ steps.scanner_version.outputs.version }}
123
+ run: |
124
+ any_repo_changed="false"
125
+
126
+ publish_action_release() {
127
+ target_repo="$1"
128
+ repo_dir="$2"
129
+
130
+ git -C "$repo_dir" tag -fa v1 -m "Update floating major tag to ${TAG}"
131
+ if git -C "$repo_dir" ls-remote --tags origin "refs/tags/${TAG}" | grep -q .; then
132
+ echo "Refusing to publish action bundle with colliding existing tag ${TAG} in ${target_repo}." >&2
133
+ exit 1
134
+ fi
135
+ git -C "$repo_dir" tag "${TAG}"
136
+ git -C "$repo_dir" push origin "refs/tags/${TAG}"
137
+ git -C "$repo_dir" push origin refs/tags/v1 --force
138
+
139
+ if ! gh release view "${TAG}" --repo "$target_repo" >/dev/null 2>&1; then
140
+ gh release create "${TAG}" \
141
+ --repo "$target_repo" \
142
+ --title "${TAG}" \
143
+ --generate-notes \
144
+ --notes "Published automatically from ${SOURCE_SERVER_URL}/${SOURCE_REPOSITORY}/tree/${SOURCE_REF}"
145
+ fi
146
+ }
147
+
148
+ sync_action_repo() {
149
+ target_repo="$1"
150
+ readme_source="$2"
151
+ repo_description="$3"
152
+ repo_dir="$GITHUB_WORKSPACE/action-repos/${target_repo##*/}"
153
+ repo_changed="false"
154
+
155
+ if gh repo view "$target_repo" >/dev/null 2>&1; then
156
+ gh repo edit "$target_repo" --description "$repo_description"
157
+ gh repo clone "$target_repo" "$repo_dir" -- --depth 1
158
+ else
159
+ gh repo create "$target_repo" --public --description "$repo_description" --clone
160
+ mv "${target_repo##*/}" "$repo_dir"
161
+ fi
162
+
163
+ git -C "$repo_dir" remote set-url origin "https://x-access-token:${ACTION_REPO_TOKEN}@github.com/${target_repo}.git"
164
+
165
+ cp "${GITHUB_WORKSPACE}/action/action.yml" "${repo_dir}/action.yml"
166
+ cp "$readme_source" "${repo_dir}/README.md"
167
+ printf '%s\n' "$SCANNER_VERSION" > "${repo_dir}/scanner-version.txt"
168
+ cp "${GITHUB_WORKSPACE}/action/cisco-version.txt" "${repo_dir}/cisco-version.txt"
169
+ cp "${GITHUB_WORKSPACE}/action/pypi-attestations-version.txt" "${repo_dir}/pypi-attestations-version.txt"
170
+ cp "${GITHUB_WORKSPACE}/LICENSE" "${repo_dir}/LICENSE"
171
+ cp "${GITHUB_WORKSPACE}/SECURITY.md" "${repo_dir}/SECURITY.md"
172
+ cp "${GITHUB_WORKSPACE}/CONTRIBUTING.md" "${repo_dir}/CONTRIBUTING.md"
173
+
174
+ if [ -n "$(git -C "$repo_dir" status --short -- action.yml README.md scanner-version.txt cisco-version.txt pypi-attestations-version.txt LICENSE SECURITY.md CONTRIBUTING.md)" ]; then
175
+ repo_changed="true"
176
+ git -C "$repo_dir" config user.name "github-actions[bot]"
177
+ git -C "$repo_dir" config user.email "41898282+github-actions[bot]@users.noreply.github.com"
178
+ git -C "$repo_dir" add action.yml README.md scanner-version.txt cisco-version.txt pypi-attestations-version.txt LICENSE SECURITY.md CONTRIBUTING.md
179
+ git -C "$repo_dir" commit -m "chore: publish action bundle ${TAG}"
180
+ git -C "$repo_dir" push origin HEAD:main
181
+ any_repo_changed="true"
182
+ fi
183
+
184
+ printf '%s\t%s\n' "$target_repo" "$repo_dir" >> "$GITHUB_WORKSPACE/action-repos/publish-targets.tsv"
185
+ }
186
+
187
+ mkdir -p "$GITHUB_WORKSPACE/action-repos"
188
+ : > "$GITHUB_WORKSPACE/action-repos/publish-targets.tsv"
189
+
190
+ sync_action_repo \
191
+ "$ACTION_CANONICAL_REPOSITORY" \
192
+ "${GITHUB_WORKSPACE}/action/README.md" \
193
+ "HOL AI Plugin Scanner GitHub Action"
194
+
195
+ sync_action_repo \
196
+ "$ACTION_COMPAT_REPOSITORY" \
197
+ "${GITHUB_WORKSPACE}/action/README.legacy.md" \
198
+ "Compatibility alias for HOL AI Plugin Scanner GitHub Action"
199
+
200
+ if [ "$any_repo_changed" != "true" ]; then
201
+ exit 0
202
+ fi
203
+
204
+ while IFS=$'\t' read -r target_repo repo_dir; do
205
+ publish_action_release "$target_repo" "$repo_dir"
206
+ done < "$GITHUB_WORKSPACE/action-repos/publish-targets.tsv"
@@ -193,7 +193,7 @@ jobs:
193
193
  run: |
194
194
  VERSION="${{ needs.build.outputs.version }}"
195
195
  BUNDLE_ROOT="dist/github-action-bundle"
196
- BUNDLE_PATH="dist/hol-codex-plugin-scanner-action-v${VERSION}.zip"
196
+ BUNDLE_PATH="dist/ai-plugin-scanner-action-v${VERSION}.zip"
197
197
 
198
198
  mkdir -p "${BUNDLE_ROOT}"
199
199
  cp action/action.yml "${BUNDLE_ROOT}/action.yml"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plugin-scanner
3
- Version: 2.0.0
3
+ Version: 2.0.1
4
4
  Summary: Security, operational-security, and publishability scanner for Codex, Claude, Gemini, and OpenCode plugin ecosystems.
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
@@ -60,8 +60,8 @@ pipx run plugin-scanner verify .
60
60
 
61
61
  ```yaml
62
62
  # GitHub Actions PR gate
63
- - name: Codex plugin quality gate
64
- uses: hashgraph-online/hol-codex-plugin-scanner-action@v1
63
+ - name: AI plugin quality gate
64
+ uses: hashgraph-online/ai-plugin-scanner-action@v1
65
65
  with:
66
66
  plugin_dir: "."
67
67
  fail_on_severity: high
@@ -248,7 +248,7 @@ For repo-scoped marketplaces, `scan`, `lint`, `verify`, and `doctor` can target
248
248
  ## Config + Baseline Example
249
249
 
250
250
  ```toml
251
- # .codex-plugin-scanner.toml
251
+ # .plugin-scanner.toml
252
252
  [scanner]
253
253
  profile = "public-marketplace"
254
254
  baseline_file = "baseline.txt"
@@ -338,7 +338,7 @@ jobs:
338
338
  runs-on: ubuntu-latest
339
339
  steps:
340
340
  - uses: actions/checkout@v6
341
- - uses: hashgraph-online/hol-codex-plugin-scanner-action@v1
341
+ - uses: hashgraph-online/ai-plugin-scanner-action@v1
342
342
  with:
343
343
  plugin_dir: "."
344
344
  mode: scan
@@ -357,9 +357,9 @@ Local pre-commit style hook:
357
357
  repos:
358
358
  - repo: local
359
359
  hooks:
360
- - id: codex-plugin-scanner
361
- name: Codex Plugin Scanner
362
- entry: codex-plugin-scanner
360
+ - id: plugin-scanner
361
+ name: Plugin Scanner
362
+ entry: plugin-scanner
363
363
  language: system
364
364
  types: [directory]
365
365
  pass_filenames: false
@@ -386,17 +386,19 @@ The source repository can publish the GitHub Action automatically into a dedicat
386
386
  Configure:
387
387
 
388
388
  - repository secret `ACTION_REPO_TOKEN`
389
- It should be a token that can create or update repositories and releases in the target repository.
390
- - optional repository variable `ACTION_REPOSITORY`
389
+ It should be a token that can create or update repositories and releases in the canonical and compatibility action repositories.
390
+ - optional repository variable `ACTION_CANONICAL_REPOSITORY`
391
+ Defaults to `hashgraph-online/ai-plugin-scanner-action`.
392
+ - optional repository variable `ACTION_COMPAT_REPOSITORY`
391
393
  Defaults to `hashgraph-online/hol-codex-plugin-scanner-action`.
392
394
 
393
- When a tagged release is published, [publish-action-repo.yml](./.github/workflows/publish-action-repo.yml) will:
395
+ When changes land on `main`, [publish-action-repo.yml](./.github/workflows/publish-action-repo.yml) will:
394
396
 
395
- - create the dedicated action repository if it does not already exist
396
- - sync the root-ready `action.yml`, `README.md`, `LICENSE`, and `SECURITY.md`
397
+ - create the canonical Marketplace repository if it does not already exist
398
+ - sync the root-ready `action.yml`, repo-specific `README.md`, `LICENSE`, and `SECURITY.md` into both the canonical repo and the legacy compatibility repo
397
399
  - push the immutable release tag such as `v2.0.0`
398
400
  - move the floating `v1` tag
399
- - create or update the corresponding release in the action repository
401
+ - create or update the corresponding release in each action repository
400
402
 
401
403
  GitHub Marketplace still requires the one-time listing publication step in the dedicated action repository UI, but after that this repository can keep the action repository current automatically.
402
404
 
@@ -404,7 +406,7 @@ GitHub Marketplace still requires the one-time listing publication step in the d
404
406
 
405
407
  The action can also handle submission intake. A plugin repository can wire the scanner into CI so a passing scan opens or reuses a submission issue in [awesome-codex-plugins](https://github.com/hashgraph-online/awesome-codex-plugins).
406
408
 
407
- It also emits Codex-friendly machine outputs:
409
+ It also emits automation-friendly machine outputs:
408
410
 
409
411
  - `score`, `grade`, `grade_label`, `max_severity`, and `findings_total` as GitHub Action outputs
410
412
  - a concise markdown summary in the job summary by default
@@ -432,7 +434,7 @@ jobs:
432
434
 
433
435
  - name: Scan and submit if eligible
434
436
  id: scan
435
- uses: hashgraph-online/hol-codex-plugin-scanner-action@v1
437
+ uses: hashgraph-online/ai-plugin-scanner-action@v1
436
438
  with:
437
439
  plugin_dir: "."
438
440
  min_score: 80
@@ -448,9 +450,9 @@ jobs:
448
450
 
449
451
  `submission_token` is required when `submission_enabled: true`. This flow is idempotent. If the plugin repository was already submitted, the action reuses the existing open issue instead of opening duplicates by matching an exact hidden plugin URL marker in the existing issue body.
450
452
 
451
- ### Registry Payload For Codex Ecosystem Automation
453
+ ### Registry Payload For Plugin Ecosystem Automation
452
454
 
453
- If you want to feed the same scan into a registry, badge pipeline, or another Codex automation step, request a registry payload file directly from the action:
455
+ If you want to feed the same scan into a registry, badge pipeline, or another plugin ecosystem automation step, request a registry payload file directly from the action:
454
456
 
455
457
  ```yaml
456
458
  permissions:
@@ -464,12 +466,12 @@ jobs:
464
466
 
465
467
  - name: Scan plugin
466
468
  id: scan
467
- uses: hashgraph-online/hol-codex-plugin-scanner-action@v1
469
+ uses: hashgraph-online/ai-plugin-scanner-action@v1
468
470
  with:
469
471
  plugin_dir: "."
470
472
  format: sarif
471
- output: codex-plugin-scanner.sarif
472
- registry_payload_output: codex-plugin-registry-payload.json
473
+ output: ai-plugin-scanner.sarif
474
+ registry_payload_output: ai-plugin-registry-payload.json
473
475
 
474
476
  - name: Show trust signals
475
477
  run: |
@@ -480,7 +482,7 @@ jobs:
480
482
  - name: Upload registry payload
481
483
  uses: actions/upload-artifact@v6
482
484
  with:
483
- name: codex-plugin-registry-payload
485
+ name: ai-plugin-registry-payload
484
486
  path: ${{ steps.scan.outputs.registry_payload_path }}
485
487
  ```
486
488
 
@@ -25,8 +25,8 @@ pipx run plugin-scanner verify .
25
25
 
26
26
  ```yaml
27
27
  # GitHub Actions PR gate
28
- - name: Codex plugin quality gate
29
- uses: hashgraph-online/hol-codex-plugin-scanner-action@v1
28
+ - name: AI plugin quality gate
29
+ uses: hashgraph-online/ai-plugin-scanner-action@v1
30
30
  with:
31
31
  plugin_dir: "."
32
32
  fail_on_severity: high
@@ -213,7 +213,7 @@ For repo-scoped marketplaces, `scan`, `lint`, `verify`, and `doctor` can target
213
213
  ## Config + Baseline Example
214
214
 
215
215
  ```toml
216
- # .codex-plugin-scanner.toml
216
+ # .plugin-scanner.toml
217
217
  [scanner]
218
218
  profile = "public-marketplace"
219
219
  baseline_file = "baseline.txt"
@@ -303,7 +303,7 @@ jobs:
303
303
  runs-on: ubuntu-latest
304
304
  steps:
305
305
  - uses: actions/checkout@v6
306
- - uses: hashgraph-online/hol-codex-plugin-scanner-action@v1
306
+ - uses: hashgraph-online/ai-plugin-scanner-action@v1
307
307
  with:
308
308
  plugin_dir: "."
309
309
  mode: scan
@@ -322,9 +322,9 @@ Local pre-commit style hook:
322
322
  repos:
323
323
  - repo: local
324
324
  hooks:
325
- - id: codex-plugin-scanner
326
- name: Codex Plugin Scanner
327
- entry: codex-plugin-scanner
325
+ - id: plugin-scanner
326
+ name: Plugin Scanner
327
+ entry: plugin-scanner
328
328
  language: system
329
329
  types: [directory]
330
330
  pass_filenames: false
@@ -351,17 +351,19 @@ The source repository can publish the GitHub Action automatically into a dedicat
351
351
  Configure:
352
352
 
353
353
  - repository secret `ACTION_REPO_TOKEN`
354
- It should be a token that can create or update repositories and releases in the target repository.
355
- - optional repository variable `ACTION_REPOSITORY`
354
+ It should be a token that can create or update repositories and releases in the canonical and compatibility action repositories.
355
+ - optional repository variable `ACTION_CANONICAL_REPOSITORY`
356
+ Defaults to `hashgraph-online/ai-plugin-scanner-action`.
357
+ - optional repository variable `ACTION_COMPAT_REPOSITORY`
356
358
  Defaults to `hashgraph-online/hol-codex-plugin-scanner-action`.
357
359
 
358
- When a tagged release is published, [publish-action-repo.yml](./.github/workflows/publish-action-repo.yml) will:
360
+ When changes land on `main`, [publish-action-repo.yml](./.github/workflows/publish-action-repo.yml) will:
359
361
 
360
- - create the dedicated action repository if it does not already exist
361
- - sync the root-ready `action.yml`, `README.md`, `LICENSE`, and `SECURITY.md`
362
+ - create the canonical Marketplace repository if it does not already exist
363
+ - sync the root-ready `action.yml`, repo-specific `README.md`, `LICENSE`, and `SECURITY.md` into both the canonical repo and the legacy compatibility repo
362
364
  - push the immutable release tag such as `v2.0.0`
363
365
  - move the floating `v1` tag
364
- - create or update the corresponding release in the action repository
366
+ - create or update the corresponding release in each action repository
365
367
 
366
368
  GitHub Marketplace still requires the one-time listing publication step in the dedicated action repository UI, but after that this repository can keep the action repository current automatically.
367
369
 
@@ -369,7 +371,7 @@ GitHub Marketplace still requires the one-time listing publication step in the d
369
371
 
370
372
  The action can also handle submission intake. A plugin repository can wire the scanner into CI so a passing scan opens or reuses a submission issue in [awesome-codex-plugins](https://github.com/hashgraph-online/awesome-codex-plugins).
371
373
 
372
- It also emits Codex-friendly machine outputs:
374
+ It also emits automation-friendly machine outputs:
373
375
 
374
376
  - `score`, `grade`, `grade_label`, `max_severity`, and `findings_total` as GitHub Action outputs
375
377
  - a concise markdown summary in the job summary by default
@@ -397,7 +399,7 @@ jobs:
397
399
 
398
400
  - name: Scan and submit if eligible
399
401
  id: scan
400
- uses: hashgraph-online/hol-codex-plugin-scanner-action@v1
402
+ uses: hashgraph-online/ai-plugin-scanner-action@v1
401
403
  with:
402
404
  plugin_dir: "."
403
405
  min_score: 80
@@ -413,9 +415,9 @@ jobs:
413
415
 
414
416
  `submission_token` is required when `submission_enabled: true`. This flow is idempotent. If the plugin repository was already submitted, the action reuses the existing open issue instead of opening duplicates by matching an exact hidden plugin URL marker in the existing issue body.
415
417
 
416
- ### Registry Payload For Codex Ecosystem Automation
418
+ ### Registry Payload For Plugin Ecosystem Automation
417
419
 
418
- If you want to feed the same scan into a registry, badge pipeline, or another Codex automation step, request a registry payload file directly from the action:
420
+ If you want to feed the same scan into a registry, badge pipeline, or another plugin ecosystem automation step, request a registry payload file directly from the action:
419
421
 
420
422
  ```yaml
421
423
  permissions:
@@ -429,12 +431,12 @@ jobs:
429
431
 
430
432
  - name: Scan plugin
431
433
  id: scan
432
- uses: hashgraph-online/hol-codex-plugin-scanner-action@v1
434
+ uses: hashgraph-online/ai-plugin-scanner-action@v1
433
435
  with:
434
436
  plugin_dir: "."
435
437
  format: sarif
436
- output: codex-plugin-scanner.sarif
437
- registry_payload_output: codex-plugin-registry-payload.json
438
+ output: ai-plugin-scanner.sarif
439
+ registry_payload_output: ai-plugin-registry-payload.json
438
440
 
439
441
  - name: Show trust signals
440
442
  run: |
@@ -445,7 +447,7 @@ jobs:
445
447
  - name: Upload registry payload
446
448
  uses: actions/upload-artifact@v6
447
449
  with:
448
- name: codex-plugin-registry-payload
450
+ name: ai-plugin-registry-payload
449
451
  path: ${{ steps.scan.outputs.registry_payload_path }}
450
452
  ```
451
453
 
@@ -0,0 +1,25 @@
1
+ # HOL AI Plugin Scanner GitHub Action
2
+
3
+ [![Latest Release](https://img.shields.io/github/v/release/hashgraph-online/hol-codex-plugin-scanner-action?display_name=tag)](https://github.com/hashgraph-online/hol-codex-plugin-scanner-action/releases/latest)
4
+ [![Compatibility Alias](https://img.shields.io/badge/legacy-slug-supported-6b7280)](https://github.com/hashgraph-online/hol-codex-plugin-scanner-action)
5
+ [![Canonical Repository](https://img.shields.io/badge/canonical-ai--plugin--scanner--action-0A84FF)](https://github.com/hashgraph-online/ai-plugin-scanner-action)
6
+ [![Source of Truth](https://img.shields.io/badge/source-ai--plugin--scanner-111827)](https://github.com/hashgraph-online/ai-plugin-scanner/tree/main/action)
7
+
8
+ This repository remains supported as a compatibility alias for existing workflows that use:
9
+
10
+ ```yaml
11
+ uses: hashgraph-online/hol-codex-plugin-scanner-action@v1
12
+ ```
13
+
14
+ New integrations should move to the canonical action slug:
15
+
16
+ ```yaml
17
+ uses: hashgraph-online/ai-plugin-scanner-action@v1
18
+ ```
19
+
20
+ The action behavior, release train, and source of truth are shared with the canonical repository:
21
+
22
+ - Canonical action repo: [hashgraph-online/ai-plugin-scanner-action](https://github.com/hashgraph-online/ai-plugin-scanner-action)
23
+ - Source repo: [hashgraph-online/ai-plugin-scanner](https://github.com/hashgraph-online/ai-plugin-scanner)
24
+
25
+ The compatibility alias continues to receive the same reviewed root bundle, release tags, and floating `v1` major tag so existing consumers do not break during the identity migration.