plugin-scanner 2.0.6__tar.gz → 2.0.8__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.8/.github/workflows/scorecard.yml +39 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/PKG-INFO +2 -1
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/pyproject.toml +2 -1
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/pyproject.toml.bak +2 -1
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/install_commands.py +2 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/runtime/runner.py +6 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/version.py +1 -1
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_action_bundle.py +28 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_guard_cli.py +97 -0
- plugin_scanner-2.0.6/.github/workflows/scorecard.yml +0 -27
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.dockerignore +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.github/dependabot.yml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.github/workflows/ci.yml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.github/workflows/codeql.yml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.github/workflows/dependabot-uv-lock.yml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.github/workflows/e2e-test.yml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.github/workflows/harness-smoke.yml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.github/workflows/publish-action-repo.yml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.github/workflows/publish.yml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.gitignore +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/Dockerfile +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/LICENSE +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/README.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/SECURITY.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/action/README.legacy.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/action/README.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/action/action.yml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/action/cisco-version.txt +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/action/pypi-attestations-version.txt +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/action/scanner-version.txt +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/index.html +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/package.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/pnpm-lock.yaml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/public/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/src/app.tsx +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/src/approval-center-layout.tsx +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/src/approval-center-primitives.tsx +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/src/approval-center-utils.ts +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/src/guard-api.ts +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/src/guard-demo.ts +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/src/guard-types.ts +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/src/main.tsx +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/src/styles.css +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/src/vite-env.d.ts +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/tsconfig.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/dashboard/vite.config.ts +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/guard/approval-audit.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/guard/architecture.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/guard/get-started.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/guard/harness-support.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/guard/local-dashboard-failure-ledger.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/guard/local-dashboard-redesign-todo.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/guard/local-vs-cloud.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/guard/repo-boundaries.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/guard/testing-matrix.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/requirements.txt +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/cli.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/github_reporting.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/approvals.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/commands.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/render.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/config.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/incident.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/models.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/protect.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/risk.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/shims.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/store.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test-trust-scoring.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test-trust-specs.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_cli.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_coverage_remaining.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_ecosystems.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_edge_cases.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_guard_approvals.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_guard_bootstrap.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_guard_events.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_guard_launch_env.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_guard_product_flow.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_guard_protect.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_guard_risk.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_guard_runtime.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_integration.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_live_cisco_smoke.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_scanner.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_skill_security.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_submission.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_trust_scoring.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/tests/test_versioning.py +0 -0
- {plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/uv.lock +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: OpenSSF Scorecard
|
|
2
|
+
on:
|
|
3
|
+
schedule:
|
|
4
|
+
- cron: '0 0 * * 0'
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
permissions: read-all
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
scorecard:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
permissions:
|
|
13
|
+
actions: read
|
|
14
|
+
contents: read
|
|
15
|
+
id-token: write
|
|
16
|
+
security-events: write
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout code
|
|
19
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
|
20
|
+
with:
|
|
21
|
+
persist-credentials: false
|
|
22
|
+
- name: Run analysis
|
|
23
|
+
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a
|
|
24
|
+
with:
|
|
25
|
+
results_file: results.sarif
|
|
26
|
+
results_format: sarif
|
|
27
|
+
publish_results: true
|
|
28
|
+
- name: Upload artifact
|
|
29
|
+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
|
|
30
|
+
with:
|
|
31
|
+
name: SARIF file
|
|
32
|
+
path: results.sarif
|
|
33
|
+
retention-days: 5
|
|
34
|
+
if: always()
|
|
35
|
+
- name: Upload to code-scanning
|
|
36
|
+
uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13
|
|
37
|
+
with:
|
|
38
|
+
sarif_file: results.sarif
|
|
39
|
+
if: always()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plugin-scanner
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.8
|
|
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
|
|
@@ -30,6 +30,7 @@ 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
|
+
Requires-Dist: pyyaml>=6.0; extra == 'dev'
|
|
33
34
|
Requires-Dist: ruff>=0.4.0; extra == 'dev'
|
|
34
35
|
Provides-Extra: publish
|
|
35
36
|
Requires-Dist: twine>=6.1.0; extra == 'publish'
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "plugin-scanner"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.8"
|
|
8
8
|
description = "Lint, verify, and gate plugin ecosystems for maintainers, CI, and publish workflows."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -37,6 +37,7 @@ cisco = []
|
|
|
37
37
|
dev = [
|
|
38
38
|
"build>=1.2.2",
|
|
39
39
|
"jsonschema>=4.23.0",
|
|
40
|
+
"pyyaml>=6.0",
|
|
40
41
|
"pytest>=7.0",
|
|
41
42
|
"pytest-cov>=4.0",
|
|
42
43
|
"ruff>=0.4.0",
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "hol-guard"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.8"
|
|
8
8
|
description = "Protect local AI harnesses with HOL Guard and run scanner checks for Codex, Claude, Cursor, Gemini, and OpenCode."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -37,6 +37,7 @@ cisco = []
|
|
|
37
37
|
dev = [
|
|
38
38
|
"build>=1.2.2",
|
|
39
39
|
"jsonschema>=4.23.0",
|
|
40
|
+
"pyyaml>=6.0",
|
|
40
41
|
"pytest>=7.0",
|
|
41
42
|
"pytest-cov>=4.0",
|
|
42
43
|
"ruff>=0.4.0",
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/install_commands.py
RENAMED
|
@@ -43,6 +43,8 @@ def _resolve_targets(
|
|
|
43
43
|
context: HarnessContext,
|
|
44
44
|
store: GuardStore,
|
|
45
45
|
) -> list[str]:
|
|
46
|
+
if requested_harness is not None and install_all:
|
|
47
|
+
raise ValueError("Pass either a harness or --all, not both.")
|
|
46
48
|
if requested_harness is not None and not install_all:
|
|
47
49
|
return [requested_harness]
|
|
48
50
|
if not install_all:
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/runtime/runner.py
RENAMED
|
@@ -116,12 +116,18 @@ def sync_receipts(store: GuardStore) -> dict[str, object]:
|
|
|
116
116
|
policy = payload.get("policy")
|
|
117
117
|
if isinstance(policy, dict):
|
|
118
118
|
store.set_sync_payload("policy", policy, now)
|
|
119
|
+
else:
|
|
120
|
+
store.set_sync_payload("policy", {}, now)
|
|
119
121
|
alert_preferences = payload.get("alertPreferences")
|
|
120
122
|
if isinstance(alert_preferences, dict):
|
|
121
123
|
store.set_sync_payload("alert_preferences", alert_preferences, now)
|
|
124
|
+
else:
|
|
125
|
+
store.set_sync_payload("alert_preferences", {}, now)
|
|
122
126
|
team_policy_pack = payload.get("teamPolicyPack")
|
|
123
127
|
if isinstance(team_policy_pack, dict):
|
|
124
128
|
store.set_sync_payload("team_policy_pack", team_policy_pack, now)
|
|
129
|
+
else:
|
|
130
|
+
store.set_sync_payload("team_policy_pack", {}, now)
|
|
125
131
|
exceptions = payload.get("exceptions")
|
|
126
132
|
remote_decisions = _build_remote_policy_decisions(payload)
|
|
127
133
|
store.replace_remote_policies(remote_decisions, now)
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
|
|
5
|
+
import yaml
|
|
6
|
+
|
|
5
7
|
ROOT = Path(__file__).resolve().parent.parent
|
|
6
8
|
|
|
7
9
|
|
|
@@ -134,6 +136,32 @@ def test_ci_workflow_covers_cross_platform_runtime() -> None:
|
|
|
134
136
|
assert "macos-latest" in workflow_text
|
|
135
137
|
|
|
136
138
|
|
|
139
|
+
def test_scorecard_workflow_matches_official_install_pattern() -> None:
|
|
140
|
+
workflow_text = (ROOT / ".github" / "workflows" / "scorecard.yml").read_text(encoding="utf-8")
|
|
141
|
+
workflow = yaml.safe_load(workflow_text)
|
|
142
|
+
|
|
143
|
+
assert "name: OpenSSF Scorecard" in workflow_text
|
|
144
|
+
assert "permissions: read-all" in workflow_text
|
|
145
|
+
assert "branches: [main]" in workflow_text
|
|
146
|
+
assert workflow["jobs"]["scorecard"]["permissions"]["actions"] == "read"
|
|
147
|
+
assert workflow["jobs"]["scorecard"]["permissions"]["contents"] == "read"
|
|
148
|
+
assert "id-token: write" in workflow_text
|
|
149
|
+
assert "security-events: write" in workflow_text
|
|
150
|
+
assert 'uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd' in workflow_text
|
|
151
|
+
assert 'uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a' in workflow_text
|
|
152
|
+
assert "results_file: results.sarif" in workflow_text
|
|
153
|
+
assert "results_format: sarif" in workflow_text
|
|
154
|
+
assert "publish_results: true" in workflow_text
|
|
155
|
+
assert 'uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f' in workflow_text
|
|
156
|
+
assert "persist-credentials: false" in workflow_text
|
|
157
|
+
assert "path: results.sarif" in workflow_text
|
|
158
|
+
assert "retention-days: 5" in workflow_text
|
|
159
|
+
assert workflow_text.count("if: always()") == 2
|
|
160
|
+
assert 'uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13' in workflow_text
|
|
161
|
+
assert "sarif_file: results.sarif" in workflow_text
|
|
162
|
+
assert "if: always()" in workflow_text
|
|
163
|
+
|
|
164
|
+
|
|
137
165
|
def test_harness_smoke_workflow_covers_nightly_self_hosted_release_gate() -> None:
|
|
138
166
|
workflow_text = (ROOT / ".github" / "workflows" / "harness-smoke.yml").read_text(encoding="utf-8")
|
|
139
167
|
|
|
@@ -16,6 +16,7 @@ from codex_plugin_scanner.cli import main
|
|
|
16
16
|
from codex_plugin_scanner.guard.adapters import cursor as cursor_adapter_module
|
|
17
17
|
from codex_plugin_scanner.guard.cli import commands as guard_commands_module
|
|
18
18
|
from codex_plugin_scanner.guard.cli.render import emit_guard_payload
|
|
19
|
+
from codex_plugin_scanner.guard.store import GuardStore
|
|
19
20
|
|
|
20
21
|
FIXTURES = Path(__file__).parent / "fixtures"
|
|
21
22
|
|
|
@@ -1270,6 +1271,29 @@ args = ["workspace-skill.js", "--changed"]
|
|
|
1270
1271
|
assert rc == 2
|
|
1271
1272
|
assert "Guard install requires a harness or --all." in stderr
|
|
1272
1273
|
|
|
1274
|
+
@pytest.mark.parametrize("command", ["install", "uninstall"])
|
|
1275
|
+
def test_guard_install_commands_reject_harness_with_all(self, tmp_path, capsys, command: str):
|
|
1276
|
+
home_dir = tmp_path / "home"
|
|
1277
|
+
workspace_dir = tmp_path / "workspace"
|
|
1278
|
+
_build_guard_fixture(home_dir, workspace_dir)
|
|
1279
|
+
|
|
1280
|
+
rc = main(
|
|
1281
|
+
[
|
|
1282
|
+
"guard",
|
|
1283
|
+
command,
|
|
1284
|
+
"codex",
|
|
1285
|
+
"--all",
|
|
1286
|
+
"--home",
|
|
1287
|
+
str(home_dir),
|
|
1288
|
+
"--workspace",
|
|
1289
|
+
str(workspace_dir),
|
|
1290
|
+
]
|
|
1291
|
+
)
|
|
1292
|
+
stderr = capsys.readouterr().err
|
|
1293
|
+
|
|
1294
|
+
assert rc == 2
|
|
1295
|
+
assert "Pass either a harness or --all, not both." in stderr
|
|
1296
|
+
|
|
1273
1297
|
def test_guard_login_and_sync_posts_receipts(self, tmp_path, capsys):
|
|
1274
1298
|
home_dir = tmp_path / "home"
|
|
1275
1299
|
workspace_dir = tmp_path / "workspace"
|
|
@@ -1519,6 +1543,79 @@ args = ["workspace-skill.js", "--changed"]
|
|
|
1519
1543
|
assert exceptions_rc == 0
|
|
1520
1544
|
assert exceptions_output["items"][0]["expires_at"] == "2099-01-01T00:00:00+00:00"
|
|
1521
1545
|
|
|
1546
|
+
def test_guard_sync_clears_cached_policy_when_server_omits_it(self, tmp_path, capsys):
|
|
1547
|
+
home_dir = tmp_path / "home"
|
|
1548
|
+
_SyncRequestHandler.response_payload = {
|
|
1549
|
+
"syncedAt": "2026-04-09T00:00:00Z",
|
|
1550
|
+
"receiptsStored": 0,
|
|
1551
|
+
"inventoryStored": 0,
|
|
1552
|
+
"inventoryDiff": {"generatedAt": "2026-04-09T00:00:00Z", "items": []},
|
|
1553
|
+
"advisories": [],
|
|
1554
|
+
"policy": {
|
|
1555
|
+
"mode": "enforce",
|
|
1556
|
+
"defaultAction": "warn",
|
|
1557
|
+
"unknownPublisherAction": "review",
|
|
1558
|
+
"changedHashAction": "require-reapproval",
|
|
1559
|
+
},
|
|
1560
|
+
"alertPreferences": {
|
|
1561
|
+
"emailEnabled": True,
|
|
1562
|
+
"digestMode": "daily",
|
|
1563
|
+
},
|
|
1564
|
+
"teamPolicyPack": {
|
|
1565
|
+
"name": "Security team default",
|
|
1566
|
+
"allowedPublishers": ["hashgraph-online"],
|
|
1567
|
+
},
|
|
1568
|
+
}
|
|
1569
|
+
|
|
1570
|
+
server = HTTPServer(("127.0.0.1", 0), _SyncRequestHandler)
|
|
1571
|
+
thread = threading.Thread(target=server.serve_forever, daemon=True)
|
|
1572
|
+
thread.start()
|
|
1573
|
+
try:
|
|
1574
|
+
login_rc = main(
|
|
1575
|
+
[
|
|
1576
|
+
"guard",
|
|
1577
|
+
"login",
|
|
1578
|
+
"--home",
|
|
1579
|
+
str(home_dir),
|
|
1580
|
+
"--sync-url",
|
|
1581
|
+
f"http://127.0.0.1:{server.server_port}/receipts",
|
|
1582
|
+
"--token",
|
|
1583
|
+
"demo-token",
|
|
1584
|
+
"--json",
|
|
1585
|
+
]
|
|
1586
|
+
)
|
|
1587
|
+
json.loads(capsys.readouterr().out)
|
|
1588
|
+
|
|
1589
|
+
first_sync_rc = main(["guard", "sync", "--home", str(home_dir), "--json"])
|
|
1590
|
+
json.loads(capsys.readouterr().out)
|
|
1591
|
+
|
|
1592
|
+
_SyncRequestHandler.response_payload = {
|
|
1593
|
+
"syncedAt": "2026-04-10T00:00:00Z",
|
|
1594
|
+
"receiptsStored": 0,
|
|
1595
|
+
"inventoryStored": 0,
|
|
1596
|
+
"inventoryDiff": {"generatedAt": "2026-04-10T00:00:00Z", "items": []},
|
|
1597
|
+
"advisories": [],
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
second_sync_rc = main(["guard", "sync", "--home", str(home_dir), "--json"])
|
|
1601
|
+
json.loads(capsys.readouterr().out)
|
|
1602
|
+
finally:
|
|
1603
|
+
server.shutdown()
|
|
1604
|
+
thread.join(timeout=5)
|
|
1605
|
+
|
|
1606
|
+
policy_rc = main(["guard", "policies", "--home", str(home_dir), "--json"])
|
|
1607
|
+
policy_output = json.loads(capsys.readouterr().out)
|
|
1608
|
+
store = GuardStore(home_dir)
|
|
1609
|
+
|
|
1610
|
+
assert login_rc == 0
|
|
1611
|
+
assert first_sync_rc == 0
|
|
1612
|
+
assert second_sync_rc == 0
|
|
1613
|
+
assert policy_rc == 0
|
|
1614
|
+
assert not any(item["source"] == "cloud-sync" for item in policy_output["items"])
|
|
1615
|
+
assert store.get_sync_payload("policy") == {}
|
|
1616
|
+
assert store.get_sync_payload("alert_preferences") == {}
|
|
1617
|
+
assert store.get_sync_payload("team_policy_pack") == {}
|
|
1618
|
+
|
|
1522
1619
|
def test_guard_run_auto_syncs_cloud_policy_bundle(self, tmp_path, capsys):
|
|
1523
1620
|
home_dir = tmp_path / "home"
|
|
1524
1621
|
workspace_dir = tmp_path / "workspace"
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
name: OpenSSF Scorecard
|
|
2
|
-
on:
|
|
3
|
-
schedule:
|
|
4
|
-
- cron: '0 0 * * 0'
|
|
5
|
-
push:
|
|
6
|
-
branches: [main]
|
|
7
|
-
permissions:
|
|
8
|
-
contents: read
|
|
9
|
-
jobs:
|
|
10
|
-
scorecard:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
permissions:
|
|
13
|
-
id-token: write
|
|
14
|
-
security-events: write
|
|
15
|
-
steps:
|
|
16
|
-
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
|
17
|
-
with:
|
|
18
|
-
persist-credentials: false
|
|
19
|
-
- uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a
|
|
20
|
-
with:
|
|
21
|
-
results_file: results.sarif
|
|
22
|
-
results_format: sarif
|
|
23
|
-
publish_results: true
|
|
24
|
-
- uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13
|
|
25
|
-
with:
|
|
26
|
-
sarif_file: results.sarif
|
|
27
|
-
if: always()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/best_practices.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/code_quality.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/ecosystem_common.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/manifest_support.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/marketplace.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/checks/skill_security.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/opencode.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/ecosystems/registry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/__init__.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/base.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/claude_code.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/codex.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/cursor.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/gemini.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/adapters/opencode.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/bootstrap.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/cli/commands.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/consumer/__init__.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/consumer/service.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/daemon/__init__.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/daemon/manager.py
RENAMED
|
File without changes
|
{plugin_scanner-2.0.6 → plugin_scanner-2.0.8}/src/codex_plugin_scanner/guard/daemon/server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|