pushframe 5.1.4__tar.gz → 5.1.5__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.
- {pushframe-5.1.4 → pushframe-5.1.5}/CHANGELOG.md +21 -1
- {pushframe-5.1.4 → pushframe-5.1.5}/PKG-INFO +1 -1
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/__init__.py +1 -1
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/gsync.py +2 -2
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/preflight.py +28 -4
- {pushframe-5.1.4 → pushframe-5.1.5}/pyproject.toml +1 -1
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_preflight_sweep.py +7 -3
- pushframe-5.1.5/tests/test_preflight_vault.py +78 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_version.py +1 -1
- {pushframe-5.1.4 → pushframe-5.1.5}/uv.lock +1 -1
- {pushframe-5.1.4 → pushframe-5.1.5}/.env.sample +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.freebuff/project-id +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.github/workflows/release.yml +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.github/workflows/tests.yml +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.gitignore +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.gsd/dispatch-isolation-sentinel.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/MILESTONES.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/PROJECT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/REQUIREMENTS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/RETROSPECTIVE.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/ROADMAP.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/STATE.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/WINDOWS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/codebase/ARCHITECTURE.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/codebase/CONCERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/codebase/CONVENTIONS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/codebase/INTEGRATIONS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/codebase/STACK.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/codebase/STRUCTURE.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/codebase/TESTING.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/config.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/debug/knowledge-base.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/debug/login-475-null-creds.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/debug/resolved/cli-status-verbose-logging.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/debug/resolved/inspect-asset-null-fields.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/debug/resolved/select-asset-401-unauthorized.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/debug/status-crash-401-trip.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-ROADMAP.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-PATTERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-REVIEW.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-LIVE-EVIDENCE.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-PATTERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-REVIEW.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-PATTERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-REVIEW.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-ROADMAP.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/.gitkeep +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-03-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-03-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-PATTERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-REVIEW.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-SECURITY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-UAT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-ROADMAP.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-PATTERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-REVIEW.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-SECURITY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-UAT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-PATTERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-REVIEW.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-SECURITY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-03-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-03-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-PATTERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-REVIEW-FIX.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-REVIEW.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-SECURITY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-03-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-03-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-04-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-04-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-PATTERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-REVIEW-FIX.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-REVIEW.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/.gitkeep +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-REVIEW-FIX.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-REVIEW.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/.gitkeep +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-03-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-03-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-04-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-04-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-PATTERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-SECURITY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-UAT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/COVERAGE.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-quick/260630-qs8-make-main-py-load-a-local-env-file-at-st/260630-qs8-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-quick/260630-qs8-make-main-py-load-a-local-env-file-at-st/260630-qs8-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-quick/260708-dt9-add-progress-feedback-to-aura-cli-sync-a/260708-dt9-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-quick/260708-dt9-add-progress-feedback-to-aura-cli-sync-a/260708-dt9-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-quick/260708-dt9-add-progress-feedback-to-aura-cli-sync-a/deferred-items.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-quick/260708-fyr-batch-refactor-of-sync-apply-write-path-/260708-fyr-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-quick/260708-fyr-batch-refactor-of-sync-apply-write-path-/260708-fyr-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-quick/260708-fyr-batch-refactor-of-sync-apply-write-path-/260708-fyr-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v2.0-quick/README.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-ROADMAP.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-03-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-03-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-04-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-04-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-05-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-05-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-06-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-06-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-PATTERNS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-REVIEW.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-ROADMAP.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-03-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-03-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-DECISION-RECORD.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/COVERAGE.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-DISCUSS-CHECKPOINT.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/17-google-link-album-selection/COVERAGE.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-03-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-03-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-UAT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/19-debt-closeout/19-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/19-debt-closeout/19-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/19-debt-closeout/19-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/19-debt-closeout/19-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/19-debt-closeout/19-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/19-debt-closeout/19-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v4.0-phases/19-debt-closeout/19-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-ROADMAP.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/20-pushframe-rename-migration-repo-switch/20-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-02-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-02-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/OPERATOR-STEPS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/23-config-wizard-precedence/23-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/23-config-wizard-precedence/23-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/23-config-wizard-precedence/23-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/23-config-wizard-precedence/23-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/23-config-wizard-precedence/23-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-01-PLAN.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-01-SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-CONTEXT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-RESEARCH.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-VERIFICATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/research/ALBUM-ACCESS-V4-ADDENDUM.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/research/ALBUM-ACCESS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/research/ARCHITECTURE.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/research/BROWSER-AUTOMATION.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/research/FEATURES.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/research/PITFALLS.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/research/STACK.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/research/SUMMARY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/state.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.planning/todos/completed/2026-07-06-promote-debug-flag-to-a-global-cli-convention.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/.python-version +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/CLAUDE.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/LICENSE +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/README.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/SECURITY.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/VERIFICATION-REPORT.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/docs/CLI.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/docs/agents/domain.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/docs/agents/issue-tracker.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/docs/agents/triage-labels.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/docs/superpowers/specs/2026-07-09-write-rate-limiter-design.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/main.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/packaging/control-template +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/packaging/lintian-overrides +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/packaging/postinst +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/packaging/pushframe.copyright +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/probes/.gitignore +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/probes/README.md +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/probes/browser_bootstrap.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/probes/common.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/probes/cookie_vault.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/probes/fidelity_check.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/probes/rpc_capture.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/probes/shared_link_probe.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/api/__init__.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/api/accountApi.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/api/activityApi.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/api/assetApi.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/api/baseApi.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/api/frameApi.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/api/notificationApi.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/api/peopleApi.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/api/playlistApi.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/aura.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/aws/__init__.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/aws/awsclient.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/aws/s3client.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/aws/sqsclient.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/cache.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/cli.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/client.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/config_store.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/doctor.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/exif.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/export.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/google/__init__.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/google/bootstrap.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/google/cache.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/google/client.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/google/enumerate.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/google/manifest.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/google/parsers.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/google/redaction.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/google/vault.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/migration.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/models/__init__.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/models/activity.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/models/asset.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/models/frame.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/models/meta.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/models/person.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/models/user.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/pairs.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/ratelimit.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/reconcile.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/schedule.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/session.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/sync.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/utils/dt.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/utils/io.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/pushframe/utils/settings.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/scripts/build-deb.sh +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/scripts/make-apt-key.sh +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/scripts/publish-apt-repo.sh +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/scripts/test-apt-journey-container.sh +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/scripts/test-config-journey-container.sh +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/scripts/test-deb-container.sh +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/scripts/test-install-journey-container.sh +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/scripts/test-multipair-journey-container.sh +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/conftest.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/asset_unprocessed.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/assets_page1.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/assets_page2.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/assets_placeholders.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/error_envelope.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/frame_detail.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/frames.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/google_rpc_snackc_page.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/google_share_page_sample.html +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/login.json +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/fixtures/probe_af_initdata_sample.html +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/offline.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_asset_partial.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_asset_unprocessed.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_aura_logger.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_batch_update_contract.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_cli_apply.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_cli_google_album.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_cli_google_link.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_cli_inspect.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_cli_push_budget_geo.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_cli_reconcile.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_cli_status.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_cli_status_google.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_cli_sync.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_client_rate_limit.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_config_wizard.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_doctor.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_execute_plan.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_execute_plan_budget_geo.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_fixtures_validity.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_google_cache.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_google_client.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_google_enumerate.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_google_manifest.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_google_parsers.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_google_vault.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_gsync_all.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_gsync_engine.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_gsync_execute.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_imports.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_logout.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_migration.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_network_guard.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_offline_read_path.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_pairs.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_prep_upload_formats.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_probe_browser.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_probe_shared_link.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_ratelimit.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_read_path.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_reconcile.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_retry_401.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_schedule.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_session.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_settings_budget.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_settings_resolution.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_sync_engine.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_token_refresh_extension.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_write_endpoints_failloud.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_write_formats_live.py +0 -0
- {pushframe-5.1.4 → pushframe-5.1.5}/tests/test_write_throttling.py +0 -0
|
@@ -12,7 +12,27 @@ every channel.
|
|
|
12
12
|
`pushframe` is an unofficial community CLI for Aura Frames digital photo
|
|
13
13
|
frames; it is not affiliated with Aura Frames Inc.
|
|
14
14
|
|
|
15
|
-
## [5.1.
|
|
15
|
+
## [5.1.5] - 2026-09-30
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- **`google-sync` no longer claims "no Google session vault" on a healthy
|
|
20
|
+
vault** (venus, 2026-09-30): the vault preflight probed the default path
|
|
21
|
+
WITHOUT `expanduser()` — a literal `~` path never exists, so the check
|
|
22
|
+
fired on every machine whose vault was perfectly healthy (a
|
|
23
|
+
`google-link` seconds earlier had saved it) — and its shape check
|
|
24
|
+
demanded a JSON object while the vault is a JSON list of cookie
|
|
25
|
+
records, so even the right path would have failed. Two stacked
|
|
26
|
+
phase-24 bugs, masked until now because CI has no vault either and the
|
|
27
|
+
scheduled `--pair` branch skips this block entirely. One tell was in
|
|
28
|
+
every transcript: `google-link` prints "existing Google session found"
|
|
29
|
+
only when a vault READ succeeds. The preflight now expands the default
|
|
30
|
+
path, accepts the list shape (dict kept for backward compatibility),
|
|
31
|
+
and takes a `vault_path` argument; `PUSHFRAME_VAULT_PATH` pins the
|
|
32
|
+
path for tests. The preflight-sweep suite is now pinned away from the
|
|
33
|
+
real machine's vault (it silently depended on the bug) and its
|
|
34
|
+
`gsync_no_creds` case asserts what it always meant to (Aura-side named
|
|
35
|
+
auth failure).
|
|
16
36
|
|
|
17
37
|
### Added
|
|
18
38
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pushframe
|
|
3
|
-
Version: 5.1.
|
|
3
|
+
Version: 5.1.5
|
|
4
4
|
Summary: Unofficial community CLI for Aura Frames digital photo frames (sync a local folder or a Google Photos album; not affiliated with Aura Frames Inc.)
|
|
5
5
|
Project-URL: Homepage, https://github.com/coredmp95/pushframe
|
|
6
6
|
Project-URL: Repository, https://github.com/coredmp95/pushframe
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
# pushframe — unofficial community CLI for Aura Frames (not affiliated).
|
|
2
2
|
# Version single source for the CLI surface (REL-02); pyproject keeps the
|
|
3
3
|
# packaging metadata version and tests/test_version.py enforces lockstep.
|
|
4
|
-
__version__ = "5.1.
|
|
4
|
+
__version__ = "5.1.5"
|
|
@@ -215,7 +215,7 @@ def run_google_sync(album_target: str, frame_arg: str, *, apply: bool = False,
|
|
|
215
215
|
aura=None, s3_client=None, sqs_client=None, budget=None,
|
|
216
216
|
workers: int = 4, threshold: float | None = None,
|
|
217
217
|
input_fn=None, is_interactive: bool | None = None,
|
|
218
|
-
list_shared=None, cache_dir=None,
|
|
218
|
+
list_shared=None, cache_dir=None, vault_path=None,
|
|
219
219
|
manifest_path=None, batch_size: int | None = None,
|
|
220
220
|
pair: str | None = None, run_all: bool = False,
|
|
221
221
|
scheduled: bool = False) -> int:
|
|
@@ -314,7 +314,7 @@ def run_google_sync(album_target: str, frame_arg: str, *, apply: bool = False,
|
|
|
314
314
|
# with the full remedy (google-link + the headless ssh -X recipe).
|
|
315
315
|
try:
|
|
316
316
|
from pushframe.preflight import require_google_vault
|
|
317
|
-
require_google_vault()
|
|
317
|
+
require_google_vault(vault_path)
|
|
318
318
|
except Exception as e:
|
|
319
319
|
print(f'google-sync failed: {e}')
|
|
320
320
|
return 1
|
|
@@ -6,6 +6,7 @@ Google cookie vault; sync/push require the source directory to EXIST (D-03:
|
|
|
6
6
|
hard error) while empty stays the friendly "nothing to do" (not an error —
|
|
7
7
|
looping scripts over sometimes-empty dirs must not break).
|
|
8
8
|
"""
|
|
9
|
+
import os
|
|
9
10
|
from pathlib import Path
|
|
10
11
|
|
|
11
12
|
|
|
@@ -14,11 +15,32 @@ class PreflightError(Exception):
|
|
|
14
15
|
action; str() renders both."""
|
|
15
16
|
|
|
16
17
|
|
|
18
|
+
def default_vault_path() -> Path:
|
|
19
|
+
"""The vault path google-sync's preflight probes: PUSHFRAME_VAULT_PATH
|
|
20
|
+
when set (tests and power users pin it — a suite must never depend on
|
|
21
|
+
the real machine's vault), else the production path expanded per-user."""
|
|
22
|
+
from pushframe.google.vault import DEFAULT_VAULT_PATH as _default
|
|
23
|
+
override = os.getenv("PUSHFRAME_VAULT_PATH")
|
|
24
|
+
return Path(override).expanduser() if override else _default.expanduser()
|
|
25
|
+
|
|
26
|
+
|
|
17
27
|
def require_google_vault(vault_path: Path | None = None) -> Path:
|
|
18
|
-
"""google-sync's vault check (PRF-01): present +
|
|
28
|
+
"""google-sync's vault check (PRF-01): present + parseable JSON holding
|
|
29
|
+
at least one cookie record.
|
|
30
|
+
|
|
31
|
+
Two 2026-09-30 live-proven bugs fixed here (venus: link saves fine,
|
|
32
|
+
google-sync claims 'no vault' anyway):
|
|
33
|
+
- the default path was probed WITHOUT expanduser(): a literal `~` path
|
|
34
|
+
never exists, so this preflight always fired on machines whose vault
|
|
35
|
+
was perfectly healthy (phase-24 regression, masked on CI — CI has no
|
|
36
|
+
vault either — and on scheduled runs, whose --pair branch skips this
|
|
37
|
+
block entirely);
|
|
38
|
+
- the shape check demanded a JSON OBJECT while vault.save() writes a
|
|
39
|
+
JSON LIST of cookie records — a healthy vault would have failed the
|
|
40
|
+
'unreadable' branch even with the right path.
|
|
41
|
+
"""
|
|
19
42
|
import json
|
|
20
|
-
|
|
21
|
-
path = vault_path or _default
|
|
43
|
+
path = Path(vault_path).expanduser() if vault_path else default_vault_path()
|
|
22
44
|
if not path.exists():
|
|
23
45
|
raise PreflightError(
|
|
24
46
|
f'no Google session vault at {path} — google-sync needs a linked '
|
|
@@ -27,7 +49,9 @@ def require_google_vault(vault_path: Path | None = None) -> Path:
|
|
|
27
49
|
f'window can open; the 0600 vault survives logouts).')
|
|
28
50
|
try:
|
|
29
51
|
data = json.loads(path.read_text())
|
|
30
|
-
|
|
52
|
+
healthy = (isinstance(data, list) and len(data) > 0) or \
|
|
53
|
+
(isinstance(data, dict) and len(data) > 0)
|
|
54
|
+
if not healthy:
|
|
31
55
|
raise ValueError('empty or malformed vault')
|
|
32
56
|
except (ValueError, OSError) as e:
|
|
33
57
|
raise PreflightError(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pushframe"
|
|
3
|
-
version = "5.1.
|
|
3
|
+
version = "5.1.5"
|
|
4
4
|
description = "Unofficial community CLI for Aura Frames digital photo frames (sync a local folder or a Google Photos album; not affiliated with Aura Frames Inc.)"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.14"
|
|
@@ -34,7 +34,7 @@ CASES = [
|
|
|
34
34
|
id="mode-8-inspect-no-creds"),
|
|
35
35
|
pytest.param(
|
|
36
36
|
"gsync_no_creds", {"album": "Cadre", "frame": "Fabrice"},
|
|
37
|
-
"
|
|
37
|
+
"not authenticated", "pushframe config",
|
|
38
38
|
id="mode-8-gsync-no-creds"),
|
|
39
39
|
pytest.param(
|
|
40
40
|
"sync_dir_no_creds", {"dir": "."},
|
|
@@ -68,6 +68,10 @@ def no_creds(tmp_path, monkeypatch):
|
|
|
68
68
|
for var in ("PUSHFRAME_EMAIL", "AURA_EMAIL",
|
|
69
69
|
"PUSHFRAME_PASSWORD", "AURA_PASSWORD"):
|
|
70
70
|
monkeypatch.delenv(var, raising=False)
|
|
71
|
+
# The vault preflight is pinned AWAY from the real machine's vault: after
|
|
72
|
+
# the 2026-09-30 path fix this suite would otherwise depend on whether
|
|
73
|
+
# the dev box happens to hold a healthy vault (venus live-proven bug).
|
|
74
|
+
monkeypatch.setenv("PUSHFRAME_VAULT_PATH", str(tmp_path / "no-vault.json"))
|
|
71
75
|
|
|
72
76
|
|
|
73
77
|
# --- callables ---------------------------------------------------------------
|
|
@@ -109,10 +113,10 @@ def gsync_no_creds(capsys, no_creds, album, frame):
|
|
|
109
113
|
# named because no credentials of any kind are available.
|
|
110
114
|
vault = settings.CONFIG_PATH.parent / "google-cookies.json"
|
|
111
115
|
vault.parent.mkdir(parents=True, exist_ok=True)
|
|
112
|
-
vault.write_text(json.dumps({"SID": "x"})) #
|
|
116
|
+
vault.write_text(json.dumps([{"name": "SID", "value": "x"}])) # list shape (vault.save's)
|
|
113
117
|
from pushframe.gsync import run_google_sync
|
|
114
118
|
return run_google_sync(album, frame, apply=False, yes=True,
|
|
115
|
-
is_interactive=False)
|
|
119
|
+
is_interactive=False, vault_path=str(vault))
|
|
116
120
|
|
|
117
121
|
|
|
118
122
|
class _MuteAura:
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""google-sync's vault preflight (PRF-01) — the venus live-proven bugs.
|
|
2
|
+
|
|
3
|
+
2026-09-30, venus: `pushframe google-link` saved a perfectly healthy vault
|
|
4
|
+
(28 cookie records) yet `pushframe google-sync` answered "no Google session
|
|
5
|
+
vault". Two stacked bugs in require_google_vault:
|
|
6
|
+
|
|
7
|
+
1. the default path was probed WITHOUT expanduser() — `Path("~/.config/…")
|
|
8
|
+
.exists()` compares a literal `~` directory on disk and never matches,
|
|
9
|
+
so the preflight fired on every healthy machine (masked on CI: no vault
|
|
10
|
+
there either; masked on scheduled runs: the --pair branch skips the
|
|
11
|
+
block — exactly the path the nightly uses);
|
|
12
|
+
2. the shape check demanded a JSON OBJECT while vault.save() writes a JSON
|
|
13
|
+
LIST of cookie records — with the path fixed, a healthy vault would have
|
|
14
|
+
landed in the "unreadable — re-link" branch anyway.
|
|
15
|
+
|
|
16
|
+
The tell was in the transcript: google-link prints "existing Google session
|
|
17
|
+
found" only when from_vault() (a vault READ) succeeds — the vault was
|
|
18
|
+
there; the preflight was the liar.
|
|
19
|
+
"""
|
|
20
|
+
import json
|
|
21
|
+
|
|
22
|
+
import pytest
|
|
23
|
+
|
|
24
|
+
from pushframe.preflight import PreflightError, require_google_vault
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@pytest.fixture
|
|
28
|
+
def vault_root(tmp_path, monkeypatch):
|
|
29
|
+
"""Pinned vault env: default path under tmp, isolated from the machine."""
|
|
30
|
+
monkeypatch.setenv("PUSHFRAME_VAULT_PATH", str(tmp_path / "v.json"))
|
|
31
|
+
return tmp_path / "v.json"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _healthy_vault(path):
|
|
35
|
+
path.write_text(json.dumps([
|
|
36
|
+
{"name": "SID", "value": "x", "domain": ".google.com"},
|
|
37
|
+
{"name": "SAPISID", "value": "y", "domain": ".google.com"},
|
|
38
|
+
]))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_healthy_list_vault_passes(vault_root):
|
|
42
|
+
"""The exact venus shape: vault.save()'s JSON list of records."""
|
|
43
|
+
_healthy_vault(vault_root)
|
|
44
|
+
assert require_google_vault() == vault_root.expanduser()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_missing_vault_fails_named_with_remedy(vault_root):
|
|
48
|
+
with pytest.raises(PreflightError) as e:
|
|
49
|
+
require_google_vault()
|
|
50
|
+
assert 'no Google session vault' in str(e.value)
|
|
51
|
+
assert 'google-link' in str(e.value)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_literal_tilde_default_path_never_probed(monkeypatch):
|
|
55
|
+
"""The regression itself: without PUSHFRAME_VAULT_PATH the default must
|
|
56
|
+
be EXPANDED (probe the real per-user path, not a literal `~` file).
|
|
57
|
+
Pure assertions — this test must never write near the machine's real
|
|
58
|
+
vault (the first draft did a write+unlink there; unacceptable)."""
|
|
59
|
+
monkeypatch.delenv("PUSHFRAME_VAULT_PATH", raising=False)
|
|
60
|
+
from pushframe.preflight import default_vault_path
|
|
61
|
+
from pushframe.google.vault import DEFAULT_VAULT_PATH
|
|
62
|
+
real = default_vault_path()
|
|
63
|
+
assert real == DEFAULT_VAULT_PATH.expanduser()
|
|
64
|
+
assert '~' not in str(real)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_dict_vault_still_accepted_backward_compat(vault_root):
|
|
68
|
+
vault_root.write_text(json.dumps({"SID": "x"}))
|
|
69
|
+
assert require_google_vault() == vault_root.expanduser()
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_empty_shapes_fail_named(vault_root):
|
|
73
|
+
for payload in ("[]", "{}", "not json at all"):
|
|
74
|
+
vault_root.write_text(payload)
|
|
75
|
+
with pytest.raises(PreflightError) as e:
|
|
76
|
+
require_google_vault()
|
|
77
|
+
assert 'unreadable' in str(e.value)
|
|
78
|
+
assert 'google-link' in str(e.value)
|
|
@@ -19,7 +19,7 @@ PYPROJECT = Path(__file__).resolve().parent.parent / "pyproject.toml"
|
|
|
19
19
|
def test_version_is_first_distribution_release():
|
|
20
20
|
"""The current distribution release (moved off 0.1.0 at 5.0.0; page
|
|
21
21
|
metadata fix shipped in 5.0.4)."""
|
|
22
|
-
assert __version__ == "5.1.
|
|
22
|
+
assert __version__ == "5.1.5"
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def test_version_matches_pyproject_single_source():
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pushframe-5.1.4 → pushframe-5.1.5}/.planning/debug/resolved/select-asset-401-unauthorized.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|