plugin-scanner 2.0.3__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.
- plugin_scanner-2.0.4/.github/dependabot.yml +59 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.github/workflows/ci.yml +2 -2
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.github/workflows/codeql.yml +2 -2
- plugin_scanner-2.0.4/.github/workflows/dependabot-uv-lock.yml +54 -0
- plugin_scanner-2.0.4/.github/workflows/harness-smoke.yml +114 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.github/workflows/publish.yml +65 -8
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.github/workflows/scorecard.yml +1 -1
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.gitignore +6 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/PKG-INFO +94 -74
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/README.md +89 -71
- plugin_scanner-2.0.4/dashboard/index.html +38 -0
- plugin_scanner-2.0.4/dashboard/package.json +22 -0
- plugin_scanner-2.0.4/dashboard/pnpm-lock.yaml +1449 -0
- plugin_scanner-2.0.4/dashboard/public/brand/Logo_Whole.png +0 -0
- plugin_scanner-2.0.4/dashboard/src/app.tsx +184 -0
- plugin_scanner-2.0.4/dashboard/src/approval-center-layout.tsx +485 -0
- plugin_scanner-2.0.4/dashboard/src/approval-center-primitives.tsx +342 -0
- plugin_scanner-2.0.4/dashboard/src/approval-center-utils.ts +187 -0
- plugin_scanner-2.0.4/dashboard/src/guard-api.ts +118 -0
- plugin_scanner-2.0.4/dashboard/src/guard-demo.ts +146 -0
- plugin_scanner-2.0.4/dashboard/src/guard-types.ts +67 -0
- plugin_scanner-2.0.4/dashboard/src/main.tsx +17 -0
- plugin_scanner-2.0.4/dashboard/src/styles.css +201 -0
- plugin_scanner-2.0.4/dashboard/src/vite-env.d.ts +1 -0
- plugin_scanner-2.0.4/dashboard/tsconfig.json +20 -0
- plugin_scanner-2.0.4/dashboard/vite.config.ts +41 -0
- plugin_scanner-2.0.4/docs/guard/approval-audit.md +66 -0
- plugin_scanner-2.0.4/docs/guard/competitive-parity-matrix.md +48 -0
- plugin_scanner-2.0.4/docs/guard/get-started.md +153 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/docs/guard/harness-support.md +11 -0
- plugin_scanner-2.0.4/docs/guard/local-dashboard-failure-ledger.md +102 -0
- plugin_scanner-2.0.4/docs/guard/local-dashboard-redesign-todo.md +98 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/docs/guard/local-vs-cloud.md +3 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/docs/guard/testing-matrix.md +8 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/pyproject.toml +8 -10
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/pyproject.toml.bak +7 -6
- plugin_scanner-2.0.4/requirements.txt +1 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/skill_security.py +1 -1
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/cli.py +26 -10
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/base.py +10 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/claude_code.py +5 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/codex.py +3 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/cursor.py +5 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/gemini.py +5 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/opencode.py +5 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/approvals.py +273 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/cli/approval_commands.py +63 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/cli/commands.py +316 -17
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/cli/product.py +15 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/cli/prompt.py +1 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/cli/render.py +245 -5
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/config.py +42 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/consumer/service.py +166 -14
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/__init__.py +6 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/manager.py +131 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/server.py +349 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +9 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +1 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/daemon/static/index.html +39 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/incident.py +128 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/models.py +52 -1
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/policy/engine.py +1 -1
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/protect.py +591 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/receipts/manager.py +2 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/risk.py +83 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/runtime/runner.py +32 -2
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +50 -8
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/store.py +1022 -0
- plugin_scanner-2.0.4/src/codex_plugin_scanner/guard/store_approvals.py +284 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +1 -1
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/version.py +1 -1
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_action_bundle.py +36 -5
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_cli.py +9 -7
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_coverage_remaining.py +2 -1
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_edge_cases.py +3 -2
- plugin_scanner-2.0.4/tests/test_guard_approvals.py +1061 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_guard_cli.py +359 -2
- plugin_scanner-2.0.4/tests/test_guard_events.py +124 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_guard_product_flow.py +27 -0
- plugin_scanner-2.0.4/tests/test_guard_protect.py +308 -0
- plugin_scanner-2.0.4/tests/test_guard_risk.py +178 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_guard_runtime.py +497 -15
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_integration.py +8 -6
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_live_cisco_smoke.py +5 -4
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_scanner.py +3 -2
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_skill_security.py +1 -1
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_submission.py +2 -1
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/uv.lock +4 -10
- plugin_scanner-2.0.3/.github/dependabot.yml +0 -12
- plugin_scanner-2.0.3/docs/guard/get-started.md +0 -82
- plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -5
- plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/daemon/server.py +0 -67
- plugin_scanner-2.0.3/src/codex_plugin_scanner/guard/store.py +0 -420
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.dockerignore +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.github/workflows/e2e-test.yml +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.github/workflows/publish-action-repo.yml +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/Dockerfile +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/LICENSE +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/SECURITY.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/action/README.legacy.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/action/README.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/action/action.yml +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/action/cisco-version.txt +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/action/pypi-attestations-version.txt +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/action/scanner-version.txt +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/docs/guard/architecture.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/docs/guard/repo-boundaries.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/guard/shims.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test-trust-scoring.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test-trust-specs.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_ecosystems.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_guard_launch_env.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_trust_scoring.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.3 → plugin_scanner-2.0.4}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.3 → 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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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 --
|
|
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
|
|
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
|
-
|
|
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
|
|
121
|
+
- name: Build codex compatibility alias (codex-plugin-scanner)
|
|
82
122
|
run: |
|
|
83
123
|
cp pyproject.toml pyproject.toml.bak
|
|
84
|
-
|
|
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@
|
|
24
|
+
- uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13
|
|
25
25
|
with:
|
|
26
26
|
sarif_file: results.sarif
|
|
27
27
|
if: always()
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plugin-scanner
|
|
3
|
-
Version: 2.0.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 2.0.4
|
|
4
|
+
Summary: Lint, verify, and gate plugin ecosystems for maintainers, CI, and publish workflows.
|
|
5
5
|
Project-URL: Homepage, https://github.com/hashgraph-online/ai-plugin-scanner
|
|
6
6
|
Project-URL: Repository, https://github.com/hashgraph-online/ai-plugin-scanner
|
|
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
|
-
[](https://pypi.org/project/hol-guard/)
|
|
41
|
+
[](https://pypi.org/project/plugin-scanner/)
|
|
42
|
+
[](https://pypi.org/project/hol-guard/)
|
|
43
|
+
[](https://pypi.org/project/plugin-scanner/)
|
|
44
|
+
[](#install-the-package-you-need)
|
|
42
45
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/ci.yml)
|
|
43
46
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/actions/workflows/publish.yml)
|
|
44
47
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/pkgs/container/ai-plugin-scanner)
|
|
@@ -47,54 +50,78 @@ Description-Content-Type: text/markdown
|
|
|
47
50
|
[](https://github.com/hashgraph-online/ai-plugin-scanner/stargazers)
|
|
48
51
|
[](https://github.com/astral-sh/ruff)
|
|
49
52
|
|
|
50
|
-
|  | **Protect
|
|
53
|
+
|  | **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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
124
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
147
|
+
## Need More Detail?
|
|
129
148
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
192
|
+
Scanner package:
|
|
171
193
|
|
|
172
194
|
```bash
|
|
173
|
-
pip install
|
|
195
|
+
pip install plugin-scanner
|
|
174
196
|
```
|
|
175
197
|
|
|
176
|
-
|
|
198
|
+
Cisco skill scanning support is included in the default `plugin-scanner` install (via `cisco-ai-skill-scanner`).
|
|
177
199
|
|
|
178
|
-
|
|
200
|
+
If you want both tools in one shell during local development:
|
|
179
201
|
|
|
180
202
|
```bash
|
|
181
203
|
pipx install hol-guard
|
|
182
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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)
|