plugin-scanner 2.0.1075__tar.gz → 2.0.1076__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.1075 → plugin_scanner-2.0.1076}/PKG-INFO +5 -1
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/README.md +4 -0
- plugin_scanner-2.0.1076/docs/guard/command-extension-architecture.md +106 -0
- plugin_scanner-2.0.1076/docs/guard/command-extension-threat-model.md +119 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/pyproject.toml +1 -1
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/pyproject.toml.bak +1 -1
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/render.py +8 -0
- plugin_scanner-2.0.1076/src/codex_plugin_scanner/guard/runtime/command_builtin_rules.py +134 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/command_extensions.py +58 -20
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/command_inspection.py +27 -3
- plugin_scanner-2.0.1076/src/codex_plugin_scanner/guard/runtime/command_model.py +268 -0
- plugin_scanner-2.0.1076/src/codex_plugin_scanner/guard/runtime/command_rules.py +204 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/shell_command_wrappers.py +2 -2
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/version.py +1 -1
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_command_extensions.py +6 -0
- plugin_scanner-2.0.1076/tests/test_guard_command_model.py +97 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/uv.lock +1 -1
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.clusterfuzzlite/Dockerfile +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.clusterfuzzlite/build.sh +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.clusterfuzzlite/project.yaml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.clusterfuzzlite/requirements-atheris.txt +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.dockerignore +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.factory/droids/hol-guard-runner.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.factory/skills/hol-guard/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/CODEOWNERS +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/dependabot.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/pr-bodies/claude-permission-request-visible.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/workflows/ci.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/workflows/codeql.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/workflows/dependabot-uv-lock.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/workflows/devcontainer-features.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/workflows/fuzz.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/workflows/harness-smoke.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/workflows/publish-action-repo.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/workflows/publish.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/workflows/scorecard.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.github/workflows/security-gates.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.gitignore +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/.pre-commit-hooks.yaml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/Dockerfile +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/LICENSE +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/PRODUCT.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/SECURITY.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/action/CONTRIBUTING.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/action/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/action/SECURITY.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/action/action.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/action/cisco-version.txt +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/action/pypi-attestations-version.txt +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/action/scanner-sha256.txt +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/action/scanner-version.txt +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/e2e/fixture-states.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/e2e/policy-cloud-exceptions-states.spec.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/e2e/proof-dir.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/e2e/scrg172-states.spec.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/e2e/static-server.mjs +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/index.html +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/package-lock.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/package.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/playwright.config.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/pnpm-lock.yaml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/public/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/public/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/public/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/public/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/public/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/public/favicon.ico +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/about-analytics.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/about-content.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/about-content.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/about-design.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/about-external-links.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/about-external-links.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/about-section-shell.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/about-types.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/about-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/about-external-link.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/about-footer.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/about-hero.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/about-runtime-proof-strip.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/data-boundary-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/ecosystem-programs.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/open-standards-map.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/pathway-grid.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/section-shell.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/tracked-action-button.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/about/components/trust-contract-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/app-activity-evidence.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/app-detail-phase11.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/app-detail-workspace.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/app-routing.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/app.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-center-layout.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-center-layout.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-center-mobile.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-center-primitives.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-center-review-cards.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-center-utils.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-gate-utils.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-gate.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-proof-inline.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-proof-modal.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-scopes.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/approval-scopes.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/apps/app-catalog.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/apps/app-detail-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/audit-run-progress.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/audit-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/clear-policy-payload.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/clear-policy-payload.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/cloud-user-menu.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/compare-time-periods.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/consolidated-evidence-alert.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/consolidated-evidence-alert.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/data-flow-evidence-card.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/error-boundary.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/app-tab.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/breakdown-card.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/categories.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/category-tab.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/decision-badge.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-action-detail.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-action-list.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-activity-heatmap-mini.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-activity-heatmap.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-activity-heatmap.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-analytics-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-clear-modal.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-copy.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-data-provenance-strip.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-detail.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-export-drawer.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-export.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-export.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-filter-bar.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-filters.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-filters.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-format.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-format.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-hero.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insight-strip.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insights-headline-bento.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insights-headline-bento.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insights-home-preview.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insights-home-preview.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insights-layout.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insights-share-button.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insights-share-errors.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insights-share-modal.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insights-share-sheet.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-insights-surface.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-metrics.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-metrics.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-pagination.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-pagination.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-perf.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-period.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-share-bar.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-sort.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-sort.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-story.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-table.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-trend-chart.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-trend-chart.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-types.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-url-state.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-url-state.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/evidence-view-shell.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/explore-tab.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/guard-stat-metric.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/index.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/plain-english.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/scoped-evidence-table.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/scoped-evidence-table.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/sparkline.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/story-tab.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/evidence/use-receipt-analytics.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/feed-health-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/fleet-workspace-phase11.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/fleet-workspace.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/fleet-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/github-issue-link.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/github-issue-link.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/guard-api.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/guard-api.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/guard-demo.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/guard-modal-layer.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/guard-types.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/guard-update-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/guard-update.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/harness-action-errors.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/harness-action-errors.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/help-modal.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/history-analytics.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/history-charts.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/history-export.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/home-dashboard.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/home-dashboard.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/home-protection-module.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/logged-action-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/main.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/package-firewall-connect-browser.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/package-firewall-connect-browser.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/package-firewall-connect.test.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/package-workbench-common.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/package-workbench-filter-modal.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/package-workbench-finding-detail.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/package-workbench-panel.test.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/package-workbench-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/phase09-review.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-active-mode-card.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exception-detail-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exception-request-draft.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exception-request-draft.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exception-request-ia.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exception-request-layout.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exception-request-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exception-request-steps.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exceptions-boundary.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exceptions-ia.test.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exceptions-list.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exceptions-summary.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exceptions-tab.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exceptions-utils.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-cloud-exceptions-utils.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-data-truth.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-exception-form.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-export.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-final-release-guard.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-guard-cloud-bundle-card.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-guard-cloud-bundle-card.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-guard-cloud-bundle-helpers.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-page-chrome.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-remembered-cloud-rules.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-remembered-local-rules.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-remembered-rules-right-rail.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-remembered-rules-summary.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-remembered-rules-tab.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-remembered-rules.test.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-review-scope.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-strict-config-enforcement-preview.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-strict-config-ia.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-strict-config-local-policy-card.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-strict-config-right-rail.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-strict-config-segmented.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-strict-config-strict-mode-card.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-strict-config-surfaces.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-strict-config-tab.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-strict-config-utils.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-strict-config-utils.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-summary-surfaces.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-ui-hardening.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-workspace-helpers.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-workspace-helpers.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-workspace-page.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-workspace-views.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/policy-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/queue-bulk-approve-flow.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/queue-bulk-approve.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/queue-bulk-risk-disclosure.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/queue-bulk-risk-disclosure.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/queue-connection-error.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/queue-state.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/queue-state.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/receipts-workspace.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/receipts-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/request-read-state.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/request-read-state.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/review-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/risk-signal-cards.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/risk-signal-cards.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/runtime-overview.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/runtime-overview.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scanner-evidence-badge.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scrg159-170.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scrg171-172.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scsr-phase09-next-action.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scsr-phase09-package-firewall-status.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scsr-phase09c-evidence-rail.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scsr-phase09d-intercept-drawer.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scsr-phase09e-posture-banners.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scsr-phase09f-mobile-polish.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scsr-phase09g-cloud-capabilities.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scsr-phase09h-hero-cards.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/scsr-phase10-package-workbench.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/security-fixes.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/settings/settings-ia.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/settings/settings-ia.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/settings/settings-row-primitives.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/settings/settings-section-shell.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/settings-save-proof-modal.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/settings-save-proof-modal.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/settings-workspace-phase11.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/settings-workspace.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/settings-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/shell-footer.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/shell-footer.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/styles.css +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-connect.test.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-connect.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-findings-summary.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-normalize.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-recovery-modal.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-recovery.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-recovery.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-result.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-result.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-workspace.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-audit-workspace.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-bundle-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-cloud-capabilities-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-cloud-capabilities.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-evidence-rail-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-evidence-rail.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-firewall-action-result.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-firewall-controls.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-firewall-manager-row.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-firewall-next-action.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-firewall-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-firewall-views.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-hub-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-intercept-proof-modal.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-issue-focus.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-issues.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-issues.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-manager-cards.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-manager-drawer.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-posture-banners.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-posture.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-protection-stats.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-status-header.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-ux-consolidation.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-workspace-hero-state.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-workspace-hero.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-workspace-layout.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/supply-chain-workspace.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/totp-enrollment-qr-panel.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/use-copy-feedback-timeout.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/use-debounce.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/use-focus-trap.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/use-keyboard-shortcut.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/use-queue-bulk-approve.test.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/use-queue-bulk-approve.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/use-reduced-motion.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/use-resolved-approval-gate.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/use-route-focus.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/use-supply-chain-audit-session.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/vite-env.d.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/watched-app-card.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/workspace-page-header.test.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/src/workspace-page-header.tsx +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/tsconfig.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/dashboard/vite.config.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/devcontainer-features/hol-guard/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/devcontainer-features/hol-guard/devcontainer-feature.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/devcontainer-features/hol-guard/install.sh +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docker-requirements.txt +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/all-harness-hook-review.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/architecture.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/cursor-local-cloud-contract.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/enterprise-event-taxonomy.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/enterprise-export-examples.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/enterprise-packet.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/get-started.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/harness-support.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/hook-review-engine.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/incident-response.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/local-vs-cloud.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/pi-fast-hook-review.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/policy-cloud-exceptions-boundary.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/release-checklist.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/remediation.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/review-local-queue-contract.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/testing-matrix.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard/troubleshooting.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/guard-review-backend-contract.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/trust/mcp-trust-draft.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/trust/plugin-trust-draft.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/docs/trust/skill-trust-local.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/fuzzers/manifest_fuzzer.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/requirements.txt +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/schemas/plugin-quality.v1.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/schemas/scan-result.v1.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/schemas/verify-result.v1.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/scripts/bench_guard_hooks.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/scripts/codex-auto-resume-smoke.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/scripts/e2e-cursor-hook-smoke.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/scripts/run-cloud-exception-sync-proof.sh +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/scripts/run-policy-cloud-exceptions-release-audit.sh +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/scripts/sync_repo_version.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/scripts/update_awesome_codex_plugins_contributing.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/_scanner_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/action_runner.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/argparse_utils.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/best_practices.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/claude.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/code_quality.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/ecosystem_common.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/gemini.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/manifest.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/manifest_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/marketplace.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/mcp_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/opencode.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/operational_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/checks/skill_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/cli.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/cli_ui.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/config.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/ecosystems/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/ecosystems/base.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/ecosystems/claude.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/ecosystems/codex.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/ecosystems/detect.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/ecosystems/gemini.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/ecosystems/opencode.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/ecosystems/registry.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/ecosystems/types.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/github_reporting.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/access_graph_events.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/antigravity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/base.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/claude_code.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/claude_daemon_hook_bridge.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/cloud_identity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/codex.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/codex_daemon_hook_bridge.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/codex_remote_control.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/contracts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/copilot.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/cursor.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/cursor_cli.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/cursor_hooks.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/cursor_native_approval.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/gemini.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/grok.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/grok_config.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/grok_hooks.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/hermes.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/hook_python.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/kimi.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/kimi_hooks.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/mcp_servers.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/openclaw.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/openclaw_config.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/openclaw_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/opencode.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/opencode_artifacts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/opencode_pretool.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/pi.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/pi_extension_approval_source.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/pi_extension_content_source.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/pi_extension_source.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/pi_hooks.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/pi_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/zcode.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/zcode_config.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/adapters/zcode_hooks.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/advisory_model.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/aibom_cli.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/aibom_content_upload.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/aibom_detection.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/aibom_symlink.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/aibom_trust_metadata.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/approval_gate.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/approval_gate_state.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/approval_scope_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/approvals.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/bridge/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/capabilities.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/_commands_shared.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/approval_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/approval_gate_prompt.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/bootstrap.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_dispatch_admin.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_dispatch_cloud.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_dispatch_local.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_dispatch_proxy.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_dispatch_records.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_dispatch_trust.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_hook.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_hook_claude.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_hook_copilot.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_hook_generic.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_hook_runtime_eval.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_hook_runtime_finish.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_hook_runtime_review.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_hook_runtime_state.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_parser.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_parser_cloud.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_parser_helpers.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_parser_local.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_parser_policy.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_router.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_claude_approval.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_codex_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_codex_git.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_codex_paths.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_codex_reads.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_codex_tool_output.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_codex_tool_output_messages.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_connect.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_hook_payload.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_hook_state.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_interaction.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_native_search.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_permission_store.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_prompts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_runtime_artifacts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_runtime_policy.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_runtime_resolution.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_service.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/commands_support_workspace.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/connect_flow.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/cursor_actions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/dashboard_sync.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/docs.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/install_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/install_dry_run.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/oauth_client.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/product.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/progress.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/prompt.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/protect_approvals.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/remote_pair_flow.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/render_uninstall.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/uninstall_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/update_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cloud_exception_requests.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cloud_exceptions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/codex_app_server.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/codex_config.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/codex_resume.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/codex_skill_config.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/config.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/consumer/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/consumer/service.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/contracts/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/contracts/supply_chain_decision_evidence_v1.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/client.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/command_queue_worker.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/dashboard_update.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/dashboard_update_runner.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/hook_metrics.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/hook_worker.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/manager.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/server.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/apple-touch-icon.png +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/about-workspace.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/app-catalog.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/app-detail-workspace.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/audit-workspace.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/feed-health-workspace.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/fleet-workspace.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/help-modal.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/home-dashboard.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/home-protection-module.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/policy-workspace-page.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/settings-workspace.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/supply-chain-hub-workspace.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/supply-chain-protection-stats.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/chunks/supply-chain-workspace.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/guard-dashboard.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/assets/index.css +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Icon_Dark.png +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/brand/Logo_Whole.png +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/favicon-16x16.png +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/favicon-32x32.png +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/favicon.ico +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/daemon/static/index.html +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/desktop_notifications.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/edge_events.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/harness_resume.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/harness_usage.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/incident.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/insights.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/insights_share.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/inventory_cisco.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/inventory_contract.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/inventory_item_description.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/launcher.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/local_dashboard_session.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/local_supply_chain.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/local_trust_contract.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/local_trust_controller.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/mcp/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/mcp/adapters.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/mcp/sanitizers.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/mcp/schemas.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/mcp/server.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/mcp/tools.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/mcp_tool_calls.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/memory_decision_event.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/memory_decision_outbox.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/memory_pattern_fingerprint.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/models.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/package_firewall_action_rate_limit.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/package_firewall_defaults.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/package_firewall_entitlement.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/package_firewall_receipts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/package_shim_gate.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/package_shim_status.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/policy/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/policy/engine.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/policy_authority.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/policy_bundle_parser.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/policy_bundle_trusted_keys.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/policy_integrity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/product_model.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/protect.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/provenance.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/proxy/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/proxy/_env.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/proxy/remote.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/proxy/runtime_mcp.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/proxy/stdio.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/receipts/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/receipts/manager.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/redaction.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/remote_pairing_constants.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/review_contracts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/review_memory_ack.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/risk.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/action_identity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/actions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/advisory_escalation.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/advisory_matchers.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/approval_attention.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/auto_update.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/browser_mcp_intent.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/cisco_evidence.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/cisco_preflight.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/command_executors.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/command_queue.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/composition_rules.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/data_flow.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/data_flow_rules.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/data_flow_variables.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/decisions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/detectors.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/evidence_hash.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/false_positive_rules.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/harness_attribution.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/homebrew_intent.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/hook_content_scanner.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/hook_decision_cache.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/hook_enrichment_queue.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/hook_output_text.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/hook_payload_reference.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/hook_review_engine.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/hook_review_types.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/hook_source_read.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/js_semver.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/kubernetes_command_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/kubernetes_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/kubernetes_heredoc_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/live_request_sync.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/local_request_snapshots.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/manifest_dependency_targets.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/mcp_protection.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/mcp_skill_firewall.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/package_intent.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/package_intent_common.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/package_intent_parser.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/package_manager_command.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/package_manifest_diff.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/persistence_rules.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/prompt_injection.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/runner.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/safe_decode.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/sandbox.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/scanner_cache.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/secret_file_requests.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/secret_sensitivity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/secret_sources.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/sed_scripts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/self_approval.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/shell_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/signals.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/skill_protection.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/source_paths.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/supply_chain.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/supply_chain_bundle.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/supply_chain_bundle_base.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/supply_chain_bundle_models.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/supply_chain_bundle_runtime.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/supply_chain_package_eval.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/supply_chain_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/surface_server.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/temp_files.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/threat_intel.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/trust_attestation.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/runtime/workspace_path_guard.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/schemas/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/schemas/consumer_mode.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/schemas/guard_event_v1.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/schemas/guard_product_model_v1.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/schemas/surface_server.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/shell_profile_cleanup.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/shim_probe.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/shims.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/skill_document_evidence.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/sqlite_tuning.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/stable_digest.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_approval_facade.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_approvals.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_base.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_cloud_events.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_connect.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_connection_schema.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_event_receipts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_evidence.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_evidence_facade.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_inventory.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_live_request_outbox.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_oauth.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_policy.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_policy_decision.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_policy_integrity_runtime.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_policy_source_context.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_read_state.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_receipt_rollups.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_receipts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_resume.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_secret_policy_integrity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_sessions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_supply_chain.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/store_threat_intel.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/text.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/totp.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/types.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/install_integrity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/integrations/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/integrations/cisco_mcp_scanner.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/integrations/cisco_skill_scanner.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/lint_fixes.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/marketplace_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/models.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/path_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/policy.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/quality_artifact.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/repo_detect.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/reporting.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/rules/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/rules/registry.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/rules/specs.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/scanner.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/submission.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/suppressions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/trust_domain_scoring.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/trust_helpers.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/trust_instruction_scoring.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/trust_mcp_scoring.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/trust_models.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/trust_plugin_scoring.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/trust_scoring.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/trust_skill_scoring.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/trust_specs.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/verification.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/bundle_first_cloud.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/cloud_exception_bundle_fixtures.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/conftest.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/docker/test_all_harness_hooks.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/e2e_droid_exec.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/__init__.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/bad-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/bad-plugin/.mcp.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/bad-plugin/secrets.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/claude-plugin-good/.claude-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/claude-plugin-good/LICENSE +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/claude-plugin-good/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/claude-plugin-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/claude-plugin-good/hooks/hooks.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/claude-plugin-good/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/code-quality-bad/evil.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/code-quality-bad/inject.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/cursor-hooks/benign-echo.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/cursor-hooks/benign-health-check.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/cursor-hooks/expected-permissions.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/cursor-hooks/malicious-aws-credentials-read.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/cursor-hooks/malicious-canary-exfil-shell.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/cursor-hooks/malicious-env-read.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/cursor-hooks/malicious-mcp-secret-read.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/gemini-extension-good/GEMINI.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/gemini-extension-good/LICENSE +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/gemini-extension-good/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/gemini-extension-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/gemini-extension-good/commands/hello.toml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/gemini-extension-good/gemini-extension.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/good-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/good-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/good-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/good-plugin/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/good-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/good-plugin/assets/icon.svg +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/good-plugin/assets/logo.svg +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/good-plugin/assets/screenshot.svg +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/good-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/grok/pretooluse_bash.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/grok/pretooluse_edit.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/grok/pretooluse_grep_safe.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/grok/pretooluse_mcp.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/grok/pretooluse_read_secret.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/grok/pretooluse_unknown_tool.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/grok/pretooluse_webfetch.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/grok/user_prompt_submit.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/benign-docs-fake-token.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/benign-health-endpoint.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/benign-nvmrc-fake-creds.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/benign-source-search.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/canary-exfil-encoded.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/canary-exfil.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/expected-decisions.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-dockerfile.txt +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-encoded-shell-exfil.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-github-action.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-mcp-delete.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-mcp-secret-read.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-mcp-skill-exfil.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-npm-postinstall.js +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-prompt-env-read.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-prompt-guard-bypass.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-prompt-npmrc-read.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/malicious-python-setup.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/guard-red-team/smoke-evidence-template.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/hermes-plugin-evil/config.yaml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/hermes-plugin-evil/mcp_servers.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/hermes-plugin-evil/skills/security/malicious/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/references/api-setup.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/hermes-plugin-evil/skills/stealth/sneaky/scripts/deploy.sh +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/hermes-plugin-evil/skills/utils/benign/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/hook_payloads/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/malformed-json/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/malicious-skill-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/malicious-skill-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/malicious-skill-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/malicious-skill-plugin/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/malicious-skill-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/malicious-skill-plugin/skills/leaky-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/mcp-canary-server.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/minimal-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/missing-fields/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/mit-license/LICENSE +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-ecosystem-repo/codex-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-ecosystem-repo/codex-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-ecosystem-repo/codex-plugin/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-ecosystem-repo/codex-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-ecosystem-repo/gemini-ext/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-ecosystem-repo/gemini-ext/gemini-extension.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-plugin-repo/.agents/plugins/marketplace.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/.codexignore +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/LICENSE +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/SECURITY.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-plugin-repo/plugins/alpha-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/multi-plugin-repo/plugins/beta-plugin/skills/example/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/no-version/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/opencode-good/.opencode/commands/hello.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/opencode-good/.opencode/plugins/example.ts +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/opencode-good/LICENSE +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/opencode-good/README.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/opencode-good/SECURITY.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/opencode-good/opencode.jsonc +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/skills-missing-dir/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/skills-no-frontmatter/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/skills-no-frontmatter/skills/bad-skill/SKILL.md +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/benign-npm-controls-package.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/benign-npm-package.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/benign-pnpm-package.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/benign-pyproject.toml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/critical-base-image-Dockerfile +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/malicious-Dockerfile +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/malicious-action.yml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/malicious-npm-env-fs-network-package.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/malicious-npm-obfuscated-package.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/malicious-npm-package.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/supply-chain/malicious-setup.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/cargo-safe/Cargo.lock +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/cargo-safe/Cargo.toml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/cargo-vulnerable/Cargo.lock +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/cargo-vulnerable/Cargo.toml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/composer-safe/composer.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/composer-safe/composer.lock +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/composer-vulnerable/composer.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/composer-vulnerable/composer.lock +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/go-safe/go.mod +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/go-vulnerable/go.mod +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/gradle-safe/build.gradle +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/gradle-safe/gradle.lockfile +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/gradle-vulnerable/build.gradle +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/gradle-vulnerable/gradle.lockfile +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/maven-safe/pom.xml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/maven-vulnerable/pom.xml +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/rubygems-safe/Gemfile +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/rubygems-safe/Gemfile.lock +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/rubygems-vulnerable/Gemfile +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/tier2/rubygems-vulnerable/Gemfile.lock +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/with-marketplace/.codex-plugin/plugin.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/with-marketplace/marketplace-broken.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/with-marketplace/marketplace.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/zcode/pretooluse_bash.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/zcode/pretooluse_mcp.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/fixtures/zcode/user_prompt_submit.json +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/guard_python_phase12_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/guard_review_signing_helpers.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/guard_tier2_phase13_support.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/shim_execution_helpers.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/support/keyring.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_action_bundle.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_action_runner.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_aibom_chunking.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_best_practices.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cisco_install_surfaces.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_claude_daemon_hook_bridge.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cli.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cli_hook_source_ref.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cloud_exception_requests.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cloud_exception_sync_proof.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_code_quality.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_codex_daemon_hook_bridge.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_codex_remote_control.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_codex_skill_config.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_command_keys_and_uri_schemes.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_config.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_coverage_remaining.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cursor_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cursor_cli.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cursor_completion_gates.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cursor_headless_fixtures.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cursor_hooks.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_cursor_local_actions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_dashboard_sync_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_dashboard_update.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_ecosystems.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_edge_cases.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_final_coverage.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_gemini_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_grok_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_access_graph.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_action_identity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_advisory_escalation.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_aibom_cli.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_aibom_content_upload.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_aibom_detection.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_aibom_local_trust_coverage.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_aibom_serializer_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_aibom_symlink.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_aibom_symlink_negative_matrix.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_aibom_trust_metadata.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_approval_attention.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_approval_continuity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_approval_copy_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_approval_decisions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_approval_gate.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_approval_store_dedup.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_approval_store_phase14.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_approval_store_scale.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_approvals.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_auto_first_sync.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_bootstrap.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_bridge.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_browser_mcp_intent.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_bulk_allow_once.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_bun_install_approval_replay.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_bypass_detector.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_canary_fixtures.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_capabilities.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_cisco_evidence.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_cisco_runtime_cli.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_claude_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_cli.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_cli_commands_facade.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_cloud_exceptions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_cloud_local_sync.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_codex_app_server.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_codex_auto_resume_smoke.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_codex_e2e.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_codex_install.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_codex_proxy.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_codex_resume_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_codex_resume_endpoints.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_command_executors_update.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_command_queue.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_command_queue_stale_pending_result.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_command_snapshot_paging.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_commands_router.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_config_paths.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_connect_flow.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_consumer_mode.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_copilot_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_copilot_proxy.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_daemon_cli.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_daemon_live_sync_lifecycle.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_daemon_manager.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_daemon_perf.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_daemon_registry.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_daemon_repair_perf.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_daemon_wake.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_data_flow.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_decision_propagation.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_desktop_notifications.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_detector_fp.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_docs.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_event_schema_v1.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_events.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_evidence_api_contract.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_evidence_store.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_grok_protection.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_harness_contracts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_harness_setup.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_harness_smoke.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_hashnet_mcp_canaries.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_headless_daemon_api.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_hook_payload_reference.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_hook_worker.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_hosted_dashboard_origin_blocklist.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_init.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_insights.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_install_workspace.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_inventory_cisco.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_inventory_cisco_cloud_authority.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_inventory_contract.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_js_lab_phase11.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_js_lockfile_resolution_phase11.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_js_package_hook_phase11.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_js_package_intent_phase11.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_js_semver_phase11.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_js_supply_chain_phase11.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_kubernetes_runtime.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_launch_env.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_legacy_token_fixtures.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_live_request_outbox.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_live_request_sync.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_local_supply_chain_audit_phase16.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_local_supply_chain_phase15.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_manifest_install_firewall.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_manifest_path_traversal.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_mcp_contract.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_mcp_detectors.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_mcp_package_proxy_phase14.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_mcp_protection.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_mcp_sanitization.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_mcp_skill_firewall.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_memory_decision_event.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_memory_decision_outbox.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_non_codex_resume.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_oauth_client.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_oauth_device_connect.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_oauth_reconnect.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_opencode_proxy.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_package_firewall_entitlement.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_package_firewall_reuse_proof.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_package_hook.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_package_hook_phase14.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_package_intent.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_package_resume_phase14.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_package_shims.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_package_shims_cli.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_package_support_matrix.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase03_local_install.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase03_remainder.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase04_failure_modes.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase04_harness_contracts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase04_harness_ux.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase04_install_reason_proofs.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase05_approval_memory.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase05_manager_coverage.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase06_workspace_audit.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase07_entitlement_daemon_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase07_harness_coverage_matrix.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase11_package_firewall_receipts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_phase11_package_firewall_status.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_policy_bundle_browser_scopes.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_policy_dedup.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_policy_integrity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_policy_source_context.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_product_flow.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_product_model_contracts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_prompt_injection.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_protect.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_protect_package_spec_parsing.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_provenance.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_proxy_env_scrubbing.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_python_lab_phase12.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_python_package_hook_phase12.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_python_package_intent_phase12.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_python_supply_chain_heuristics_phase12.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_python_supply_chain_phase12.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_queue_api_contract.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_queue_contract.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_receipt_command_detail_backfill.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_receipt_p5_fields.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_receipt_persistence.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_receipt_redaction_cursor.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_receipt_redaction_level.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_red_team.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_red_team_e2e.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_redaction.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_registry_broker_skills_canaries.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_remote_pair_flow.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_remote_pair_proof.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_render.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_resolution_copy.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_risk.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_runtime.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_runtime_action_harnesses.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_runtime_actions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_runtime_actions_phase14.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_runtime_decisions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_runtime_detectors.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_runtime_signals.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_safe_decode.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_sandbox.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_settings_api.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_settings_presets.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_shell_command_wrappers.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_shim_intercept_proofs.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_shim_profile.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_shim_truth.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_skill_document_evidence.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_skill_protection.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_skill_protection_phase14.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_source_search_redaction.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_source_view_secret_fixtures.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_stable_digest.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_store_migrations.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_supply_chain.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_supply_chain_bundle.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_supply_chain_daemon.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_supply_chain_decision_contract.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_supply_chain_disclosure_reasons.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_supply_chain_evaluator.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_supply_chain_sync.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_surface_server.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_sync_http_error_message.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_threat_intel.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_tier2_labs_phase13.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_tier2_package_intent_phase13.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_tier2_supply_chain_phase13.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_trust_cli_passive_backend.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_uninstall_commands.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_verdicts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_web_recovery.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_guard_wrapper_flows.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_harness_attribution.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_hermes_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_hook_content_scanner.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_hook_decision_cache.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_hook_enrichment_queue.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_hook_metrics.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_hook_review_engine.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_hook_review_types.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_hook_security_regressions.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_hook_source_paths.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_hook_source_read_fast_path.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_insights_share.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_install_integrity.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_integration.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_inventory_item_description.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_kimi_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_lint_fixes.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_live_cisco_smoke.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_manifest.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_marketplace.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_mcp_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_mcp_tool_call_raw_command_text.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_multi_source_connect.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_openclaw_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_opencode_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_opencode_hook_python.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_opencode_pretool.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_operational_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_pi_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_pi_managed_extension_prune.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_policy.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_policy_bundle_parser.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_policy_decision_source_context.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_pr_testpypi_canary_workflow.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_quality_artifact.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_raw_command_text.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_rule_registry.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_scanner.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_schema_contracts.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_security_ops.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_shim_probe_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_skill_security.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_skill_uri_blocking.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_submission.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_sync_repo_version.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_trust_scoring.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_trust_specs.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_verification.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_versioning.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_zcode_adapter.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_zcode_hooks.py +0 -0
- {plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/tests/test_zcode_mcp.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plugin-scanner
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.1076
|
|
4
4
|
Summary: Lint, verify, and gate plugin ecosystems for maintainers, CI, and publish workflows.
|
|
5
5
|
Project-URL: Homepage, https://hol.org/guard
|
|
6
6
|
Project-URL: Documentation, https://github.com/hashgraph-online/hol-guard/tree/main/docs/guard
|
|
@@ -188,6 +188,10 @@ Command safety extensions make Guard's existing shell, Git, filesystem, data-pro
|
|
|
188
188
|
encoded-execution, and self-protection behavior inspectable. They are built-in capability boundaries over the same
|
|
189
189
|
parser used by harness hooks, not downloadable regex bundles.
|
|
190
190
|
|
|
191
|
+
Each extension publishes stable rule IDs and structured rule metadata. Command inspection also returns a canonical,
|
|
192
|
+
side-effect-free parse model with wrapper, pipeline, environment-override, provenance, and confidence details so
|
|
193
|
+
automation can distinguish exact parsing from malformed or unsupported input.
|
|
194
|
+
|
|
191
195
|
Use `command test` for a concise classification and `command explain` for the complete evaluation trace. Both are
|
|
192
196
|
side-effect free: they do not execute the command, evaluate final policy, create an approval, or record a receipt.
|
|
193
197
|
Use `--json` for a stable automation contract.
|
|
@@ -140,6 +140,10 @@ Command safety extensions make Guard's existing shell, Git, filesystem, data-pro
|
|
|
140
140
|
encoded-execution, and self-protection behavior inspectable. They are built-in capability boundaries over the same
|
|
141
141
|
parser used by harness hooks, not downloadable regex bundles.
|
|
142
142
|
|
|
143
|
+
Each extension publishes stable rule IDs and structured rule metadata. Command inspection also returns a canonical,
|
|
144
|
+
side-effect-free parse model with wrapper, pipeline, environment-override, provenance, and confidence details so
|
|
145
|
+
automation can distinguish exact parsing from malformed or unsupported input.
|
|
146
|
+
|
|
143
147
|
Use `command test` for a concise classification and `command explain` for the complete evaluation trace. Both are
|
|
144
148
|
side-effect free: they do not execute the command, evaluate final policy, create an approval, or record a receipt.
|
|
145
149
|
Use `--json` for a stable automation contract.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Command Extension Architecture
|
|
2
|
+
|
|
3
|
+
## Status and scope
|
|
4
|
+
|
|
5
|
+
This document defines the target contract for Guard command safety extensions. The schema-v2 registry and canonical command model currently preserve compatibility with existing action and risk classes while rule-level evaluation migrates behind them. Extensions detect and explain command facts; Guard's existing policy, approval, memory, and receipt systems retain decision authority.
|
|
6
|
+
|
|
7
|
+
## Parse-once command model
|
|
8
|
+
|
|
9
|
+
Each harness adapter extracts a command and declares its input boundary before parsing:
|
|
10
|
+
|
|
11
|
+
- **Dialect:** `posix`, `powershell`, `cmd`, `argv`, or `unknown`.
|
|
12
|
+
- **Transport:** shell string, argument vector, or embedded script.
|
|
13
|
+
- **Provenance:** harness, event, extraction method, workspace/source scope, and whether text was direct or reconstructed.
|
|
14
|
+
|
|
15
|
+
The parser boundary produces one immutable `CanonicalCommand` per request. The complete contract carries normalized text, cwd and platform context, security-relevant command-local environment overrides, parse confidence, wrapper chain, source spans, embedded scripts, and ordered segments. Segments preserve separators, pipeline position, executable/path source, subcommands, flags, operands, redirects, and execution-versus-data context.
|
|
16
|
+
|
|
17
|
+
Consumers receive this model; they do not retokenize raw text. Dialects never share quoting rules, parsing never expands or executes shell content, and compound-command suffixes are retained. Unsupported dialects, malformed input, and exceeded limits return typed uncertainty rather than a partial success that can imply safety.
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
harness request
|
|
21
|
+
-> adapter extraction with dialect, transport, and provenance
|
|
22
|
+
-> canonical parser (once)
|
|
23
|
+
-> context classification and executable/keyword index
|
|
24
|
+
-> all applicable extension matchers
|
|
25
|
+
-> composite evidence artifact
|
|
26
|
+
-> existing policy and memory evaluation
|
|
27
|
+
-> one response, approval item, and receipt
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Matcher boundary
|
|
31
|
+
|
|
32
|
+
A `CommandMatcher` is side-effect-free and evaluates the canonical invocation or one of its segments. It returns zero or more `RuleMatch` values. Matchers use structured executable, subcommand, flag, operand, path, redirect, pipeline, data-flow, platform, and embedded-script fields. Compound matchers expose explicit `all`, `any`, and `not` semantics.
|
|
33
|
+
|
|
34
|
+
Safe variants are positive, rule-local predicates such as a verified dry run, preview, read-only operation, or bounded target. A safe variant cannot suppress another rule. Regex is a bounded fallback for trusted definitions: compile it at registry construction, validate complexity, constrain input and match count, and evaluate it behind a hard interruption boundary when linear behavior is not guaranteed. Timeout or budget exhaustion produces uncertainty.
|
|
35
|
+
|
|
36
|
+
Every match carries stable extension and rule IDs, extension version, severity, risk classes, matched segment and source-span references, redaction-safe evidence, confidence, safe-variant results, safer alternatives, and evaluation time. Matchers emit evidence only; they never emit `allow`, approve a request, write memory, or execute commands.
|
|
37
|
+
|
|
38
|
+
## Registry boundary
|
|
39
|
+
|
|
40
|
+
The injected registry is the sole source for runtime hooks, command inspection, dashboard APIs, and generated reference documentation. Construction validates:
|
|
41
|
+
|
|
42
|
+
- schema and semantic versions; unique extension and rule IDs; deterministic ordering;
|
|
43
|
+
- required status, source authority, dependencies, conflicts, aliases, and category ownership;
|
|
44
|
+
- declared action/risk compatibility during migration;
|
|
45
|
+
- matcher type, complexity, count, and time budgets;
|
|
46
|
+
- source attribution as built-in, local-admin, or signed managed configuration;
|
|
47
|
+
- rollback protection and the rule that external definitions cannot shadow built-ins.
|
|
48
|
+
|
|
49
|
+
The registry indexes executable and bounded keywords so unrelated extensions are not evaluated. It imports no code from workspace or externally supplied definitions. Declarative external rules remain constrained by the matcher schema and protected configuration authority.
|
|
50
|
+
|
|
51
|
+
Schema v2 makes leaf extensions own rules. Existing extension IDs, action classes, and risk classes remain available through a single compatibility translator until all consumers migrate. Stored extension settings require an explicit, versioned migration; unknown versions fail closed to a non-weaker state.
|
|
52
|
+
|
|
53
|
+
## Evidence and policy authority
|
|
54
|
+
|
|
55
|
+
All matches survive evaluation. The engine creates one composite artifact containing ordered matches, the union of risk classes, parser uncertainty, safe-variant outcomes, and the controlling rule. This produces one policy evaluation and one user action, avoiding duplicate prompts and receipts.
|
|
56
|
+
|
|
57
|
+
The artifact is evidence, not policy. Guard policy resolves configured risk actions, source/workspace scope, managed policy, remembered decisions, approvals, and final `allow`, `warn`, `review`, `sandbox-required`, `require-reapproval`, or `block` behavior. Extension metadata, modes, and safer alternatives cannot grant authority.
|
|
58
|
+
|
|
59
|
+
Decision composition must be monotonic:
|
|
60
|
+
|
|
61
|
+
1. Required critical rules establish a minimum action that lower-authority input cannot reduce.
|
|
62
|
+
2. A safe variant affects only its declaring rule.
|
|
63
|
+
3. Multiple matches retain all evidence and the strongest controlling requirement.
|
|
64
|
+
4. Destructive-executable parser or matcher uncertainty requires at least review.
|
|
65
|
+
5. Remembered allow applies only to an equivalent full security identity.
|
|
66
|
+
6. Managed, local-admin, workspace, and extension inputs may strengthen an outcome only within their authority.
|
|
67
|
+
|
|
68
|
+
A versioned truth table covering source authority, required status, extension mode, severity, uncertainty, safe variants, overlap, memory, and configured policy is a release artifact and executable test fixture.
|
|
69
|
+
|
|
70
|
+
## Memory migration
|
|
71
|
+
|
|
72
|
+
The new security identity hashes the complete canonical command semantics, not a prefix or display label. It binds dialect, transport, normalized segments and suffixes, wrappers, aliases and executable path source, security-relevant environment overrides including `PATH`, cwd scope, workspace/source scope, parser confidence, and controlling rule ID plus semantic version.
|
|
73
|
+
|
|
74
|
+
New memory writes use only the versioned identity. Legacy exact-command and pattern memory may be read during a bounded migration window only when every security-relevant field can be proven equivalent. Missing context, changed rule semantics, uncertainty, or broader legacy scope yields `require-reapproval`; it never falls back to a weaker pattern. Migration records the old and new identity versions without persisting newly exposed raw command material.
|
|
75
|
+
|
|
76
|
+
## Redaction and persistence
|
|
77
|
+
|
|
78
|
+
Raw text, tokens, embedded payloads, environment values, and source spans are ephemeral parser inputs by default. Persistence stores stable IDs, schema and extension versions, classifications, confidence, hashes, timing, controlling-rule metadata, and redacted excerpts or span descriptors. Secret values must not enter evidence, logs, metrics, generated docs, or matcher errors.
|
|
79
|
+
|
|
80
|
+
Existing receipt redaction policy controls any authorized raw-command retention. Inspection and policy simulation are side-effect-free: no receipt, approval, memory, event, queue, lease, migration write, or network refresh. Relaxing a display setting must not reconstruct data that was never retained.
|
|
81
|
+
|
|
82
|
+
## Limits and performance
|
|
83
|
+
|
|
84
|
+
The parser enforces independent byte, token, segment, wrapper-depth, nesting, embedded-payload, and total-time limits. The evaluator enforces per-rule, per-extension, match-count, regex, and total-request budgets. Every limit failure is typed, observable in explain output, and non-allowing for potentially destructive input.
|
|
85
|
+
|
|
86
|
+
Evaluation targets are p95 below 5 ms through 1 KiB and below 20 ms through 32 KiB on supported development hardware, with no more than 10% regression in benign hook p95 from the recorded baseline. Timing is available in debug and explain output, not normal hook output.
|
|
87
|
+
|
|
88
|
+
## Rollout gates
|
|
89
|
+
|
|
90
|
+
1. **Contract gate:** approve models, schemas, monotonic truth table, threat model, capability matrix, and latency/false-positive baselines.
|
|
91
|
+
2. **Parity gate:** ship parser, matcher library, registry v2, and compatibility translator with the existing extension set; remove no legacy path until behavior parity passes.
|
|
92
|
+
3. **Required-core gate:** add critical filesystem, Git, system, self-protection, platform, and embedded-script rules only after bypass and false-positive suites pass.
|
|
93
|
+
4. **Domain gate:** add infrastructure, container, package, cloud, storage, and data domains in review or monitor mode until corpus and performance evidence supports stronger enforcement.
|
|
94
|
+
5. **External-definition gate:** enable declarative local-admin and signed managed definitions only after signature, rollback, authority, corpus, and resource-budget controls pass.
|
|
95
|
+
|
|
96
|
+
## Acceptance tests
|
|
97
|
+
|
|
98
|
+
- Assert exactly one parser invocation per harness request and the same injected registry across runtime, CLI, dashboard, and generated docs.
|
|
99
|
+
- Cover each dialect/transport independently, wrappers, aliases, cwd, `PATH`, separators, suffixes, pipelines, redirects, heredocs, substitutions, malformed input, and every limit.
|
|
100
|
+
- For every rule, test destructive examples, safe counterparts, explicit safe variants, reordered flags, quoted search/print examples, paths with spaces, and platform syntax.
|
|
101
|
+
- Assert deterministic registry output; reject duplicate IDs, invalid dependencies, shadowing, rollback, unknown schemas, and unsafe matcher complexity.
|
|
102
|
+
- Execute the monotonic truth table, cross-extension overlap, required-rule, safe-variant isolation, uncertainty, and remembered-allow cases.
|
|
103
|
+
- Prove one composite artifact, decision, approval item, and receipt while retaining all ordered evidence.
|
|
104
|
+
- Verify legacy policy/action compatibility and require reapproval for any non-equivalent memory migration.
|
|
105
|
+
- Verify full, partial, and no-redaction persistence; assert secrets and ephemeral parse material are absent from default storage and output.
|
|
106
|
+
- Benchmark benign and destructive corpora, matcher timeouts, pathological input, CLI side-effect freedom, harness contracts, and installed-package end-to-end behavior.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Command Extension Threat Model
|
|
2
|
+
|
|
3
|
+
## Security objective
|
|
4
|
+
|
|
5
|
+
Command extensions must improve detection without becoming a second policy engine or a code-loading mechanism. Untrusted command text, workspace content, extension configuration, and remembered decisions must not weaken required protections, disclose secrets, exhaust the hook, or cross workspace/source authority boundaries.
|
|
6
|
+
|
|
7
|
+
## Assets and invariants
|
|
8
|
+
|
|
9
|
+
- Final policy authority, approval signing, leases, step-up checks, and managed-policy isolation remain outside extensions.
|
|
10
|
+
- Built-in registry content, required status, rule semantics, enabled state, and precedence cannot be downgraded by agent- or workspace-controlled input.
|
|
11
|
+
- The complete command, including suffixes, wrappers, executable resolution, cwd, and security-relevant environment, is evaluated once.
|
|
12
|
+
- All relevant matches and parser uncertainty survive into one composite evidence artifact.
|
|
13
|
+
- Raw command material and secrets are ephemeral unless explicit receipt policy authorizes retention.
|
|
14
|
+
- Inspection and simulation never execute commands or mutate Guard state.
|
|
15
|
+
|
|
16
|
+
## Trust boundaries
|
|
17
|
+
|
|
18
|
+
| Boundary | Trust and permitted authority |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| Harness adapter | May extract text and provenance; may not choose dialect silently or declare safety. |
|
|
21
|
+
| Command input and workspace | Untrusted data. Files may recommend extensions but cannot load code, disable required rules, or grant policy authority. |
|
|
22
|
+
| Canonical parser | Trusted code processing hostile input under strict limits; performs no expansion or execution. |
|
|
23
|
+
| Built-in registry | Trusted, versioned product content protected by existing integrity controls. |
|
|
24
|
+
| Local-admin definitions | Declarative and explicitly approved from protected state; cannot shadow or weaken built-ins. |
|
|
25
|
+
| Managed definitions | Declarative, signed, fresh, rollback-protected, and bound to the correct workspace/source authority. |
|
|
26
|
+
| Matcher output | Untrusted evidence until schema, ownership, confidence, and budget checks pass. Never a final decision. |
|
|
27
|
+
| Policy and memory | Sole decision authority, constrained by precedence, scope, identity version, and integrity checks. |
|
|
28
|
+
| Receipts, dashboard, and sync | Persistence and display boundary governed by redaction and workspace/source isolation. |
|
|
29
|
+
|
|
30
|
+
## Threats and controls
|
|
31
|
+
|
|
32
|
+
### Parser confusion and bypass
|
|
33
|
+
|
|
34
|
+
An attacker may exploit dialect confusion, quoting, separators, pipelines, nested wrappers, aliases, command substitution, heredocs, embedded scripts, symlinks, cwd, or command-local `PATH` to hide a destructive suffix or change executable resolution.
|
|
35
|
+
|
|
36
|
+
**Controls:** adapters declare dialect, transport, and provenance; one parser preserves all segments and source spans; dialect parsers do not fall through to another grammar; executable path source and relevant environment are part of the model; parsing performs no expansion; malformed, unsupported, over-limit, or low-confidence destructive input requires review.
|
|
37
|
+
|
|
38
|
+
### Data mistaken for execution
|
|
39
|
+
|
|
40
|
+
Destructive words inside search patterns, tests, comments, echo/printf arguments, or quoted examples can cause denial of service through false approvals. Conversely, substitutions or embedded scripts can make executable content look like inert data.
|
|
41
|
+
|
|
42
|
+
**Controls:** every segment has explicit execution, data, quoted-example, or unknown context; safe variants are structured positive matches; embedded execution is extracted with bounded recursion; unknown context cannot suppress a required rule; canonical corpus tests include quoted and executable counterparts.
|
|
43
|
+
|
|
44
|
+
### Matcher evasion or resource exhaustion
|
|
45
|
+
|
|
46
|
+
Hostile input or declarative patterns may trigger excessive tokenization, match explosions, catastrophic regex behavior, deep nesting, or timeouts. A timeout could otherwise become an allow.
|
|
47
|
+
|
|
48
|
+
**Controls:** independent parser and evaluator byte, token, segment, depth, payload, match-count, and time budgets; executable/keyword indexing; registry-time regex validation and compilation; guaranteed-linear matching or interruptible isolation for non-linear cases; timeout is typed uncertainty and never automatic safety.
|
|
49
|
+
|
|
50
|
+
### Registry poisoning and authority escalation
|
|
51
|
+
|
|
52
|
+
A project or managed source may duplicate a built-in ID, redefine risk, mark a destructive operation safe, disable a required extension, import executable code, introduce invalid dependencies, or replay an older definition.
|
|
53
|
+
|
|
54
|
+
**Controls:** immutable built-in ownership; schema and semantic-version checks; unique IDs; source attribution; dependency/conflict validation; no runtime imports from external locations; local-admin approval; managed signature, freshness, scope, and rollback checks; project definitions remain monitor-only until promoted. External input may not override built-in IDs, required rules, risk classes, or precedence.
|
|
55
|
+
|
|
56
|
+
### Safe-variant and overlap downgrade
|
|
57
|
+
|
|
58
|
+
A broad safe predicate or lower-severity match may suppress a critical match from another rule. First-match evaluation may discard evidence or select the weaker result.
|
|
59
|
+
|
|
60
|
+
**Controls:** evaluate all indexed rules; safe variants apply only to their owner; required critical rules establish a minimum action; union risks and retain ordered evidence; select the strongest controlling requirement through an executable monotonic truth table. Lower-authority input can never reduce that minimum.
|
|
61
|
+
|
|
62
|
+
### Evidence used as policy
|
|
63
|
+
|
|
64
|
+
An extension may attempt to return `allow`, self-approve, alter policy state, or manufacture an authoritative source. Multiple matches may create duplicate approvals that users approve inconsistently.
|
|
65
|
+
|
|
66
|
+
**Controls:** matcher schemas contain facts and safer alternatives, not final actions; extension modes are policy inputs with bounded authority; only the existing policy engine resolves outcomes. One command creates one composite artifact, one policy decision, one approval item, and one receipt.
|
|
67
|
+
|
|
68
|
+
### Remembered-allow replay
|
|
69
|
+
|
|
70
|
+
A remembered allow for a prefix or normalized label may be replayed with a destructive suffix, wrapper, changed cwd, alias, `PATH`, workspace source, parser confidence, or changed rule semantics.
|
|
71
|
+
|
|
72
|
+
**Controls:** versioned memory identity binds the full canonical command, dialect, transport, suffixes, wrappers, executable source, relevant environment, cwd and workspace/source scope, confidence, and controlling rule semantics. Legacy memory is accepted only on proven equivalence; missing context, broader scope, semantic change, or uncertainty requires reapproval.
|
|
73
|
+
|
|
74
|
+
### Secret disclosure and persistence drift
|
|
75
|
+
|
|
76
|
+
Commands, environment overrides, paths, embedded payloads, source spans, errors, traces, receipts, dashboard views, or sync records may expose credentials. A later redaction change may accidentally backfill material that was intended to remain ephemeral.
|
|
77
|
+
|
|
78
|
+
**Controls:** default persistence is stable IDs, hashes, classifications, confidence, timing, and redacted excerpts/span descriptors. Raw parse material is discarded after evaluation unless explicit receipt policy authorizes retention. Matcher errors and metrics contain no raw secrets. Display and sync apply the configured redaction level and workspace/source isolation; relaxed settings cannot recreate unretained data.
|
|
79
|
+
|
|
80
|
+
### Simulation side effects
|
|
81
|
+
|
|
82
|
+
Inspection or evaluation intended for debugging may write memory, create approvals or receipts, refresh policy, enqueue work, acquire leases, emit events, or execute a command.
|
|
83
|
+
|
|
84
|
+
**Controls:** inspection is policy-independent; policy evaluation uses a frozen local snapshot. Both are read-only and have tests asserting no filesystem, database, queue, event, network, lease, or execution side effects.
|
|
85
|
+
|
|
86
|
+
## Monotonic precedence requirements
|
|
87
|
+
|
|
88
|
+
The release truth table must prove these invariants for every combination of source authority, required status, mode, severity, safe variant, uncertainty, overlap, remembered decision, and policy action:
|
|
89
|
+
|
|
90
|
+
1. Required minimum action is never reduced.
|
|
91
|
+
2. Safe evidence cannot cancel unrelated unsafe evidence.
|
|
92
|
+
3. Parser or matcher uncertainty cannot become an allow for potentially destructive input.
|
|
93
|
+
4. A remembered allow cannot outrank changed security identity or controlling rule semantics.
|
|
94
|
+
5. External configuration cannot claim stronger source authority than its validated origin.
|
|
95
|
+
6. Additional evidence or stronger policy can preserve or increase, never decrease, the controlling requirement.
|
|
96
|
+
|
|
97
|
+
## Rollout and operational gates
|
|
98
|
+
|
|
99
|
+
- Record benign/destructive latency and false-positive baselines before enforcement migration.
|
|
100
|
+
- Freeze schemas, parser confidence semantics, memory identity, redaction invariants, and the precedence truth table before replacing legacy classification paths.
|
|
101
|
+
- Require behavioral parity for existing action/risk classes and remembered-policy flows before expanding coverage.
|
|
102
|
+
- Release required rules only after bypass, overlap, safe-variant, and false-positive corpora pass.
|
|
103
|
+
- Default ambiguous new domains to monitor or review until coverage and performance evidence justify enforcement.
|
|
104
|
+
- Admit external declarative definitions only after integrity, rollback, scope, corpus, and resource-limit tests pass.
|
|
105
|
+
- Stop rollout on policy weakening, cross-workspace leakage, secret persistence, matcher budget failure, or benign hook p95 regression above the approved threshold.
|
|
106
|
+
|
|
107
|
+
## Security acceptance tests
|
|
108
|
+
|
|
109
|
+
- Dialect-confusion cases and independent POSIX, PowerShell, cmd, argv, and embedded-script fixtures.
|
|
110
|
+
- Suffix, separator, wrapper, alias, executable-resolution, cwd, symlink, `PATH`, pipeline, substitution, redirect, heredoc, and source-workspace bypass cases.
|
|
111
|
+
- Search/print/test-runner quoted examples paired with executable destructive forms.
|
|
112
|
+
- Required-rule versus safe-variant and cross-extension overlap across the full monotonic truth table.
|
|
113
|
+
- Duplicate/shadowed IDs, invalid source claims, dependency cycles, unknown schemas, version rollback, bad signatures, stale definitions, and wrong-scope managed content.
|
|
114
|
+
- Byte, token, segment, nesting, payload, matcher-count, regex, and wall-time exhaustion with typed uncertainty and no silent allow.
|
|
115
|
+
- Composite evidence retains all matches while creating exactly one decision, approval, and receipt.
|
|
116
|
+
- Memory replay attempts with changed suffix, wrapper, cwd, environment, source, confidence, or rule version require reapproval.
|
|
117
|
+
- Full, partial, and no-redaction tests prove default storage, logs, errors, dashboard output, and sync records contain no unauthorized secret-bearing material.
|
|
118
|
+
- Inspection and simulation tests prove deterministic output and zero execution, persistence, network, queue, event, lease, or approval side effects.
|
|
119
|
+
- Compatibility, harness contract, benchmark, pathological-input, packaged-install, and representative end-to-end tests pass before release.
|
|
@@ -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.1076"
|
|
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"
|
|
@@ -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.1076"
|
|
8
8
|
description = "Open-source antivirus and runtime protection for AI agents, tools, MCP servers, plugins, skills, and package installs."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
{plugin_scanner-2.0.1075 → plugin_scanner-2.0.1076}/src/codex_plugin_scanner/guard/cli/render.py
RENAMED
|
@@ -483,6 +483,7 @@ def _render_command_inspection(console: Console, payload: dict[str, object]) ->
|
|
|
483
483
|
status = str(payload.get("status") or "invalid")
|
|
484
484
|
classification = _coerce_object_dict(payload.get("classification"))
|
|
485
485
|
extensions = _coerce_dict_list(payload.get("extensions"))
|
|
486
|
+
rules = _coerce_dict_list(payload.get("rules"))
|
|
486
487
|
risk_classes = _coerce_string_list(payload.get("risk_classes"))
|
|
487
488
|
border_style = "yellow" if status == "review" else "cyan"
|
|
488
489
|
summary = Table.grid(padding=(0, 1))
|
|
@@ -491,6 +492,8 @@ def _render_command_inspection(console: Console, payload: dict[str, object]) ->
|
|
|
491
492
|
summary.add_row("Action class", Text(str(action_class or "No sensitive action matched")))
|
|
492
493
|
if extensions:
|
|
493
494
|
summary.add_row("Extension", Text(str(extensions[0].get("extension_id") or "unknown"), style="cyan"))
|
|
495
|
+
if rules:
|
|
496
|
+
summary.add_row("Rule", Text(str(rules[0].get("rule_id") or "unknown"), style="cyan"))
|
|
494
497
|
if risk_classes:
|
|
495
498
|
summary.add_row("Risk classes", Text(", ".join(risk_classes)))
|
|
496
499
|
summary.add_row("Policy", Text("Not evaluated; this inspection creates no approvals or receipts", style="dim"))
|
|
@@ -524,12 +527,14 @@ def _render_command_extensions(console: Console, payload: dict[str, object]) ->
|
|
|
524
527
|
table.add_column("Extension", style="bold cyan", no_wrap=True)
|
|
525
528
|
table.add_column("Version", no_wrap=True)
|
|
526
529
|
table.add_column("Coverage")
|
|
530
|
+
table.add_column("Rules")
|
|
527
531
|
table.add_column("Purpose")
|
|
528
532
|
for extension in extensions:
|
|
529
533
|
table.add_row(
|
|
530
534
|
str(extension.get("extension_id") or ""),
|
|
531
535
|
str(extension.get("version") or ""),
|
|
532
536
|
str(len(_coerce_string_list(extension.get("action_classes")))),
|
|
537
|
+
str(extension.get("rule_count") or 0),
|
|
533
538
|
str(extension.get("description") or ""),
|
|
534
539
|
)
|
|
535
540
|
console.print(table)
|
|
@@ -538,6 +543,7 @@ def _render_command_extensions(console: Console, payload: dict[str, object]) ->
|
|
|
538
543
|
def _plain_text_command_inspection(payload: PayloadDict) -> str:
|
|
539
544
|
classification = _coerce_object_dict(payload.get("classification"))
|
|
540
545
|
extensions = _coerce_dict_list(payload.get("extensions"))
|
|
546
|
+
rules = _coerce_dict_list(payload.get("rules"))
|
|
541
547
|
lines = [
|
|
542
548
|
f"HOL Guard command inspection: {str(payload.get('status') or 'invalid').upper()}",
|
|
543
549
|
f"Command: {payload.get('command') or ''}",
|
|
@@ -547,6 +553,8 @@ def _plain_text_command_inspection(payload: PayloadDict) -> str:
|
|
|
547
553
|
]
|
|
548
554
|
if extensions:
|
|
549
555
|
lines.insert(3, f"Extension: {extensions[0].get('extension_id') or 'unknown'}")
|
|
556
|
+
if rules:
|
|
557
|
+
lines.insert(4, f"Rule: {rules[0].get('rule_id') or 'unknown'}")
|
|
550
558
|
return "\n".join(lines)
|
|
551
559
|
|
|
552
560
|
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"""Built-in compatibility rules for existing Guard command action classes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from .command_rules import CommandSafetyRule
|
|
6
|
+
|
|
7
|
+
COMMAND_ACTION_RISK_CLASSES: dict[str, tuple[str, ...]] = {
|
|
8
|
+
"credential exfiltration shell command": (
|
|
9
|
+
"data_flow_exfiltration",
|
|
10
|
+
"credential_exfiltration",
|
|
11
|
+
"network_egress",
|
|
12
|
+
),
|
|
13
|
+
"guard-managed config write": ("destructive_shell",),
|
|
14
|
+
"docker-sensitive command": ("network_egress", "destructive_shell"),
|
|
15
|
+
"docker client config access": ("local_secret_read",),
|
|
16
|
+
"encoded or encrypted shell command": ("encoded_execution",),
|
|
17
|
+
"kubernetes secret read command": ("local_secret_read",),
|
|
18
|
+
"shell file upload command": ("credential_exfiltration", "network_egress"),
|
|
19
|
+
"sensitive local file write": ("destructive_shell", "local_secret_read"),
|
|
20
|
+
"destructive shell command": ("destructive_shell",),
|
|
21
|
+
"guard approval self-authorization command": ("policy_bypass",),
|
|
22
|
+
"github pr body shell substitution": ("execution",),
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _compatibility_rule(
|
|
27
|
+
*,
|
|
28
|
+
rule_id: str,
|
|
29
|
+
title: str,
|
|
30
|
+
description: str,
|
|
31
|
+
action_class: str,
|
|
32
|
+
safer_alternative: str,
|
|
33
|
+
) -> CommandSafetyRule:
|
|
34
|
+
return CommandSafetyRule(
|
|
35
|
+
rule_id=rule_id,
|
|
36
|
+
title=title,
|
|
37
|
+
description=description,
|
|
38
|
+
severity="high",
|
|
39
|
+
risk_classes=COMMAND_ACTION_RISK_CLASSES[action_class.lower()],
|
|
40
|
+
action_classes=(action_class,),
|
|
41
|
+
safer_alternatives=(safer_alternative,),
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
BUILT_IN_COMMAND_RULES = (
|
|
46
|
+
_compatibility_rule(
|
|
47
|
+
rule_id="command.container-runtime.docker-sensitive",
|
|
48
|
+
title="Sensitive container operation",
|
|
49
|
+
description="Identifies container operations that can expose credentials or mutate protected state.",
|
|
50
|
+
action_class="docker-sensitive command",
|
|
51
|
+
safer_alternative="Use a pinned image, minimal privileges, and a preview where the command supports one.",
|
|
52
|
+
),
|
|
53
|
+
_compatibility_rule(
|
|
54
|
+
rule_id="command.container-runtime.docker-config-access",
|
|
55
|
+
title="Container credential access",
|
|
56
|
+
description="Identifies reads of local container client authentication configuration.",
|
|
57
|
+
action_class="Docker client config access",
|
|
58
|
+
safer_alternative="Pass only the specific credential material required by the operation.",
|
|
59
|
+
),
|
|
60
|
+
_compatibility_rule(
|
|
61
|
+
rule_id="command.data-protection.credential-exfiltration",
|
|
62
|
+
title="Credential data transfer",
|
|
63
|
+
description="Identifies shell flows that can send credential material to a network destination.",
|
|
64
|
+
action_class="credential exfiltration shell command",
|
|
65
|
+
safer_alternative="Send an explicit non-secret value and review the exact destination and payload.",
|
|
66
|
+
),
|
|
67
|
+
_compatibility_rule(
|
|
68
|
+
rule_id="command.data-protection.file-upload",
|
|
69
|
+
title="Local file upload",
|
|
70
|
+
description="Identifies shell upload flows that read local files or standard input.",
|
|
71
|
+
action_class="shell file upload command",
|
|
72
|
+
safer_alternative="Upload a reviewed non-secret artifact through an allowlisted destination.",
|
|
73
|
+
),
|
|
74
|
+
_compatibility_rule(
|
|
75
|
+
rule_id="command.encoded-execution.decode-and-execute",
|
|
76
|
+
title="Encoded execution",
|
|
77
|
+
description="Identifies decode or decrypt chains that immediately execute their output.",
|
|
78
|
+
action_class="encoded or encrypted shell command",
|
|
79
|
+
safer_alternative="Decode to a file, inspect the result, then invoke the reviewed file directly.",
|
|
80
|
+
),
|
|
81
|
+
_compatibility_rule(
|
|
82
|
+
rule_id="command.guard-self-protection.self-authorization",
|
|
83
|
+
title="Guard self-authorization",
|
|
84
|
+
description="Identifies commands that attempt to approve or weaken their own Guard decision.",
|
|
85
|
+
action_class="Guard approval self-authorization command",
|
|
86
|
+
safer_alternative="Approve the request through Guard's authenticated approval surface.",
|
|
87
|
+
),
|
|
88
|
+
_compatibility_rule(
|
|
89
|
+
rule_id="command.kubernetes-secrets.secret-read",
|
|
90
|
+
title="Cluster secret read",
|
|
91
|
+
description="Identifies cluster CLI operations that can reveal Secret payloads.",
|
|
92
|
+
action_class="Kubernetes secret read command",
|
|
93
|
+
safer_alternative="Request non-secret metadata or only the specific field required.",
|
|
94
|
+
),
|
|
95
|
+
_compatibility_rule(
|
|
96
|
+
rule_id="command.shell-mutations.destructive-shell",
|
|
97
|
+
title="Destructive shell mutation",
|
|
98
|
+
description="Identifies destructive shell, filesystem, and version-control mutations.",
|
|
99
|
+
action_class="destructive shell command",
|
|
100
|
+
safer_alternative="Use a dry run or narrow preview before applying the mutation.",
|
|
101
|
+
),
|
|
102
|
+
_compatibility_rule(
|
|
103
|
+
rule_id="command.shell-mutations.managed-config-write",
|
|
104
|
+
title="Guard-managed configuration write",
|
|
105
|
+
description="Identifies direct writes to configuration managed by Guard.",
|
|
106
|
+
action_class="guard-managed config write",
|
|
107
|
+
safer_alternative="Use Guard's setup or repair command to update managed configuration.",
|
|
108
|
+
),
|
|
109
|
+
_compatibility_rule(
|
|
110
|
+
rule_id="command.shell-mutations.sensitive-file-write",
|
|
111
|
+
title="Sensitive local file write",
|
|
112
|
+
description="Identifies writes that can replace or expose sensitive local state.",
|
|
113
|
+
action_class="sensitive local file write",
|
|
114
|
+
safer_alternative="Write to a scoped temporary path and review the final destination.",
|
|
115
|
+
),
|
|
116
|
+
_compatibility_rule(
|
|
117
|
+
rule_id="command.shell-mutations.github-body-substitution",
|
|
118
|
+
title="Command substitution in remote body",
|
|
119
|
+
description="Identifies shell substitution used to construct a remote request body.",
|
|
120
|
+
action_class="GitHub PR body shell substitution",
|
|
121
|
+
safer_alternative="Use a literal body file whose contents can be reviewed before submission.",
|
|
122
|
+
),
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
_RULES_BY_EXTENSION: dict[str, tuple[CommandSafetyRule, ...]] = {}
|
|
126
|
+
for _rule_definition in BUILT_IN_COMMAND_RULES:
|
|
127
|
+
_extension_id, _separator, _rule_name = _rule_definition.rule_id.rpartition(".")
|
|
128
|
+
_RULES_BY_EXTENSION[_extension_id] = (*_RULES_BY_EXTENSION.get(_extension_id, ()), _rule_definition)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def rules_for_extension(extension_id: str) -> tuple[CommandSafetyRule, ...]:
|
|
132
|
+
"""Return deterministic built-in rules owned by one extension."""
|
|
133
|
+
|
|
134
|
+
return _RULES_BY_EXTENSION.get(extension_id, ())
|
|
@@ -6,32 +6,17 @@ import re
|
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from typing import final
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
from .command_builtin_rules import COMMAND_ACTION_RISK_CLASSES, rules_for_extension
|
|
10
|
+
from .command_rules import CommandSafetyRule
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"data_flow_exfiltration",
|
|
15
|
-
"credential_exfiltration",
|
|
16
|
-
"network_egress",
|
|
17
|
-
),
|
|
18
|
-
"guard-managed config write": ("destructive_shell",),
|
|
19
|
-
"docker-sensitive command": ("network_egress", "destructive_shell"),
|
|
20
|
-
"docker client config access": ("local_secret_read",),
|
|
21
|
-
"encoded or encrypted shell command": ("encoded_execution",),
|
|
22
|
-
"kubernetes secret read command": ("local_secret_read",),
|
|
23
|
-
"shell file upload command": ("credential_exfiltration", "network_egress"),
|
|
24
|
-
"sensitive local file write": ("destructive_shell", "local_secret_read"),
|
|
25
|
-
"destructive shell command": ("destructive_shell",),
|
|
26
|
-
"guard approval self-authorization command": ("policy_bypass",),
|
|
27
|
-
"github pr body shell substitution": ("execution",),
|
|
28
|
-
}
|
|
12
|
+
COMMAND_EXTENSION_SCHEMA_VERSION = 2
|
|
13
|
+
_VERSION_PATTERN = re.compile(r"^[1-9][0-9]*\.[0-9]+\.[0-9]+$")
|
|
29
14
|
|
|
30
15
|
|
|
31
16
|
def risk_classes_for_command_action(action_class: str) -> tuple[str, ...]:
|
|
32
17
|
"""Return the existing runtime risk classes for a command action class."""
|
|
33
18
|
|
|
34
|
-
return
|
|
19
|
+
return COMMAND_ACTION_RISK_CLASSES.get(action_class.strip().lower(), ())
|
|
35
20
|
|
|
36
21
|
|
|
37
22
|
@dataclass(frozen=True, slots=True)
|
|
@@ -45,6 +30,7 @@ class CommandSafetyExtension:
|
|
|
45
30
|
action_classes: tuple[str, ...]
|
|
46
31
|
risk_classes: tuple[str, ...]
|
|
47
32
|
safer_alternatives: tuple[str, ...]
|
|
33
|
+
rules: tuple[CommandSafetyRule, ...] = ()
|
|
48
34
|
|
|
49
35
|
def to_dict(self) -> dict[str, object]:
|
|
50
36
|
return {
|
|
@@ -58,6 +44,8 @@ class CommandSafetyExtension:
|
|
|
58
44
|
"action_classes": list(self.action_classes),
|
|
59
45
|
"risk_classes": list(self.risk_classes),
|
|
60
46
|
"safer_alternatives": list(self.safer_alternatives),
|
|
47
|
+
"rule_count": len(self.rules),
|
|
48
|
+
"rules": [rule.to_dict() for rule in self.rules],
|
|
61
49
|
}
|
|
62
50
|
|
|
63
51
|
|
|
@@ -69,6 +57,8 @@ class CommandSafetyExtensionRegistry:
|
|
|
69
57
|
ordered = tuple(sorted(extensions, key=lambda extension: extension.extension_id))
|
|
70
58
|
by_id: dict[str, CommandSafetyExtension] = {}
|
|
71
59
|
by_action_class: dict[str, CommandSafetyExtension] = {}
|
|
60
|
+
by_action_rule: dict[str, CommandSafetyRule] = {}
|
|
61
|
+
by_rule_id: dict[str, CommandSafetyRule] = {}
|
|
72
62
|
for extension in ordered:
|
|
73
63
|
_validate_extension(extension)
|
|
74
64
|
if extension.extension_id in by_id:
|
|
@@ -93,9 +83,45 @@ class CommandSafetyExtensionRegistry:
|
|
|
93
83
|
)
|
|
94
84
|
)
|
|
95
85
|
raise ValueError(message)
|
|
86
|
+
for rule in extension.rules:
|
|
87
|
+
if not rule.rule_id.startswith(f"{extension.extension_id}."):
|
|
88
|
+
raise ValueError(
|
|
89
|
+
f"Command safety rule {rule.rule_id} must use extension prefix {extension.extension_id}"
|
|
90
|
+
)
|
|
91
|
+
if rule.rule_id in by_rule_id:
|
|
92
|
+
raise ValueError(f"Duplicate command safety rule ID: {rule.rule_id}")
|
|
93
|
+
undeclared_rule_risks = set(rule.risk_classes).difference(extension.risk_classes)
|
|
94
|
+
if undeclared_rule_risks:
|
|
95
|
+
undeclared = ", ".join(sorted(undeclared_rule_risks))
|
|
96
|
+
raise ValueError(
|
|
97
|
+
f"Command safety rule {rule.rule_id} declares risks outside its extension: {undeclared}"
|
|
98
|
+
)
|
|
99
|
+
by_rule_id[rule.rule_id] = rule
|
|
100
|
+
for action_class in rule.action_classes:
|
|
101
|
+
normalized_action_class = action_class.strip().lower()
|
|
102
|
+
if normalized_action_class not in {item.strip().lower() for item in extension.action_classes}:
|
|
103
|
+
raise ValueError(
|
|
104
|
+
f"Command safety rule {rule.rule_id} owns undeclared action class {action_class!r}"
|
|
105
|
+
)
|
|
106
|
+
existing_rule = by_action_rule.get(normalized_action_class)
|
|
107
|
+
if existing_rule is not None:
|
|
108
|
+
ownership = " and ".join((existing_rule.rule_id, rule.rule_id))
|
|
109
|
+
raise ValueError(f"Command action class {action_class!r} is owned by rules {ownership}")
|
|
110
|
+
by_action_rule[normalized_action_class] = rule
|
|
111
|
+
if extension.rules:
|
|
112
|
+
rule_actions = {
|
|
113
|
+
action_class.strip().lower() for rule in extension.rules for action_class in rule.action_classes
|
|
114
|
+
}
|
|
115
|
+
extension_actions = {action_class.strip().lower() for action_class in extension.action_classes}
|
|
116
|
+
if rule_actions != extension_actions:
|
|
117
|
+
raise ValueError(
|
|
118
|
+
f"Command safety extension {extension.extension_id} rules must own every action class"
|
|
119
|
+
)
|
|
96
120
|
self._extensions = ordered
|
|
97
121
|
self._by_id = by_id
|
|
98
122
|
self._by_action_class = by_action_class
|
|
123
|
+
self._by_action_rule = by_action_rule
|
|
124
|
+
self._by_rule_id = by_rule_id
|
|
99
125
|
|
|
100
126
|
@property
|
|
101
127
|
def extensions(self) -> tuple[CommandSafetyExtension, ...]:
|
|
@@ -107,6 +133,12 @@ class CommandSafetyExtensionRegistry:
|
|
|
107
133
|
def for_action_class(self, action_class: str) -> CommandSafetyExtension | None:
|
|
108
134
|
return self._by_action_class.get(action_class.strip().lower())
|
|
109
135
|
|
|
136
|
+
def get_rule(self, rule_id: str) -> CommandSafetyRule | None:
|
|
137
|
+
return self._by_rule_id.get(rule_id.strip().lower())
|
|
138
|
+
|
|
139
|
+
def rule_for_action_class(self, action_class: str) -> CommandSafetyRule | None:
|
|
140
|
+
return self._by_action_rule.get(action_class.strip().lower())
|
|
141
|
+
|
|
110
142
|
|
|
111
143
|
def _validate_extension(extension: CommandSafetyExtension) -> None:
|
|
112
144
|
if not extension.extension_id.startswith("command."):
|
|
@@ -141,6 +173,7 @@ _BUILT_IN_EXTENSIONS = (
|
|
|
141
173
|
"Use a pinned image and a read-only container filesystem where possible.",
|
|
142
174
|
"Pass only the specific secret or file required by the container.",
|
|
143
175
|
),
|
|
176
|
+
rules=rules_for_extension("command.container-runtime"),
|
|
144
177
|
),
|
|
145
178
|
CommandSafetyExtension(
|
|
146
179
|
extension_id="command.data-protection",
|
|
@@ -153,6 +186,7 @@ _BUILT_IN_EXTENSIONS = (
|
|
|
153
186
|
"Send an explicit non-secret value instead of piping local files or environment output.",
|
|
154
187
|
"Use a destination allowlist and review the exact payload before transmission.",
|
|
155
188
|
),
|
|
189
|
+
rules=rules_for_extension("command.data-protection"),
|
|
156
190
|
),
|
|
157
191
|
CommandSafetyExtension(
|
|
158
192
|
extension_id="command.encoded-execution",
|
|
@@ -164,6 +198,7 @@ _BUILT_IN_EXTENSIONS = (
|
|
|
164
198
|
action_classes=("encoded or encrypted shell command",),
|
|
165
199
|
risk_classes=("encoded_execution",),
|
|
166
200
|
safer_alternatives=("Decode the payload to a file, inspect it, then invoke the reviewed file directly.",),
|
|
201
|
+
rules=rules_for_extension("command.encoded-execution"),
|
|
167
202
|
),
|
|
168
203
|
CommandSafetyExtension(
|
|
169
204
|
extension_id="command.guard-self-protection",
|
|
@@ -173,6 +208,7 @@ _BUILT_IN_EXTENSIONS = (
|
|
|
173
208
|
action_classes=("Guard approval self-authorization command",),
|
|
174
209
|
risk_classes=("policy_bypass",),
|
|
175
210
|
safer_alternatives=("Approve the pending request through Guard's authenticated approval surface.",),
|
|
211
|
+
rules=rules_for_extension("command.guard-self-protection"),
|
|
176
212
|
),
|
|
177
213
|
CommandSafetyExtension(
|
|
178
214
|
extension_id="command.kubernetes-secrets",
|
|
@@ -182,6 +218,7 @@ _BUILT_IN_EXTENSIONS = (
|
|
|
182
218
|
action_classes=("Kubernetes secret read command",),
|
|
183
219
|
risk_classes=("local_secret_read",),
|
|
184
220
|
safer_alternatives=("Request only the required non-secret field or metadata instead of the Secret payload.",),
|
|
221
|
+
rules=rules_for_extension("command.kubernetes-secrets"),
|
|
185
222
|
),
|
|
186
223
|
CommandSafetyExtension(
|
|
187
224
|
extension_id="command.shell-mutations",
|
|
@@ -200,6 +237,7 @@ _BUILT_IN_EXTENSIONS = (
|
|
|
200
237
|
"Narrow the target path or Git ref and avoid recursive or forced mutation.",
|
|
201
238
|
"Use a literal body file instead of shell substitution in command arguments.",
|
|
202
239
|
),
|
|
240
|
+
rules=rules_for_extension("command.shell-mutations"),
|
|
203
241
|
),
|
|
204
242
|
)
|
|
205
243
|
|