pushframe 5.1.6__tar.gz → 5.1.7__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.6 → pushframe-5.1.7}/CHANGELOG.md +25 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/PKG-INFO +1 -1
- {pushframe-5.1.6 → pushframe-5.1.7}/docs/CLI.md +103 -7
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/__init__.py +1 -1
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/sync.py +15 -8
- {pushframe-5.1.6 → pushframe-5.1.7}/pyproject.toml +1 -1
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_execute_plan.py +23 -4
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_version.py +1 -1
- {pushframe-5.1.6 → pushframe-5.1.7}/uv.lock +1 -1
- {pushframe-5.1.6 → pushframe-5.1.7}/.env.sample +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.freebuff/project-id +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.github/workflows/release.yml +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.github/workflows/tests.yml +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.gitignore +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.gsd/dispatch-isolation-sentinel.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/MILESTONES.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/PROJECT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/REQUIREMENTS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/RETROSPECTIVE.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/ROADMAP.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/STATE.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/WINDOWS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/ARCHITECTURE.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/CONCERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/CONVENTIONS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/INTEGRATIONS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/STACK.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/STRUCTURE.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/TESTING.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/config.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/gsync-apply-budget-none-crash.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/knowledge-base.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/login-475-null-creds.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/resolved/cli-status-verbose-logging.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/resolved/inspect-asset-null-fields.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/resolved/select-asset-401-unauthorized.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/status-crash-401-trip.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-ROADMAP.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-PATTERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-REVIEW.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-LIVE-EVIDENCE.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-PATTERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-REVIEW.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-PATTERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-REVIEW.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-ROADMAP.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/.gitkeep +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-03-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-03-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-PATTERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-REVIEW.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-SECURITY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-UAT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/04-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-ROADMAP.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-PATTERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-REVIEW.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-SECURITY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-UAT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-PATTERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-REVIEW.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-SECURITY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-03-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-03-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-PATTERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-REVIEW-FIX.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-REVIEW.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-SECURITY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/07-sync-diffing-engine-dry-run-only/07-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-03-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-03-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-04-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-04-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-PATTERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-REVIEW-FIX.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-REVIEW.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/.gitkeep +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-REVIEW-FIX.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-REVIEW.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/09-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/.gitkeep +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-03-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-03-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-04-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-04-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-PATTERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-SECURITY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-UAT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/10-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/COVERAGE.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.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.6 → pushframe-5.1.7}/.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.6 → pushframe-5.1.7}/.planning/milestones/v2.0-quick/260708-dt9-add-progress-feedback-to-aura-cli-sync-a/260708-dt9-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-quick/260708-dt9-add-progress-feedback-to-aura-cli-sync-a/260708-dt9-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-quick/260708-dt9-add-progress-feedback-to-aura-cli-sync-a/deferred-items.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-quick/260708-fyr-batch-refactor-of-sync-apply-write-path-/260708-fyr-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-quick/260708-fyr-batch-refactor-of-sync-apply-write-path-/260708-fyr-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-quick/260708-fyr-batch-refactor-of-sync-apply-write-path-/260708-fyr-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-quick/README.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-ROADMAP.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-03-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-03-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-04-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-04-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-05-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-05-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-06-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-06-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-PATTERNS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-REVIEW.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-ROADMAP.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-03-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-03-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-DECISION-RECORD.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-DISCUSSION-LOG.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-LIVE-FINDINGS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/COVERAGE.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-DISCUSS-CHECKPOINT.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/COVERAGE.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-03-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-03-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-UAT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/18-album-frame-mirror-sync-single-pair/18-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-REQUIREMENTS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-ROADMAP.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/20-pushframe-rename-migration-repo-switch/20-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-02-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-02-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/OPERATOR-STEPS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/23-config-wizard-precedence/23-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/23-config-wizard-precedence/23-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/23-config-wizard-precedence/23-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/23-config-wizard-precedence/23-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/23-config-wizard-precedence/23-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/24-token-first-sessions-preflight-sweep-sec-01-03-prf-01-02/24-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-01-PLAN.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-01-SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-CONTEXT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-RESEARCH.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/25-multi-frame-mappings-systemd-user-scheduling-mtf-01-03-tmr-01-03/25-VERIFICATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/ALBUM-ACCESS-V4-ADDENDUM.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/ALBUM-ACCESS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/ARCHITECTURE.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/BROWSER-AUTOMATION.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/FEATURES.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/PITFALLS.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/STACK.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/SUMMARY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/state.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.planning/todos/completed/2026-07-06-promote-debug-flag-to-a-global-cli-convention.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/.python-version +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/CLAUDE.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/LICENSE +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/README.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/SECURITY.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/VERIFICATION-REPORT.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/docs/agents/domain.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/docs/agents/issue-tracker.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/docs/agents/triage-labels.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/docs/superpowers/specs/2026-07-09-write-rate-limiter-design.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/main.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/packaging/control-template +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/packaging/lintian-overrides +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/packaging/postinst +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/packaging/pushframe.copyright +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/probes/.gitignore +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/probes/README.md +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/probes/browser_bootstrap.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/probes/common.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/probes/cookie_vault.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/probes/fidelity_check.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/probes/rpc_capture.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/probes/shared_link_probe.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/__init__.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/accountApi.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/activityApi.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/assetApi.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/baseApi.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/frameApi.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/notificationApi.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/peopleApi.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/playlistApi.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/aura.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/aws/__init__.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/aws/awsclient.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/aws/s3client.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/aws/sqsclient.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/cache.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/cli.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/client.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/config_store.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/doctor.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/exif.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/export.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/__init__.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/bootstrap.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/cache.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/client.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/enumerate.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/manifest.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/parsers.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/redaction.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/vault.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/gsync.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/migration.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/__init__.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/activity.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/asset.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/frame.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/meta.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/person.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/user.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/pairs.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/preflight.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/ratelimit.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/reconcile.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/schedule.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/session.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/utils/dt.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/utils/io.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/utils/settings.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/scripts/build-deb.sh +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/scripts/make-apt-key.sh +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/scripts/publish-apt-repo.sh +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/scripts/test-apt-journey-container.sh +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/scripts/test-config-journey-container.sh +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/scripts/test-deb-container.sh +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/scripts/test-install-journey-container.sh +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/scripts/test-multipair-journey-container.sh +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/conftest.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/asset_unprocessed.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/assets_page1.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/assets_page2.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/assets_placeholders.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/error_envelope.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/frame_detail.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/frames.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/google_rpc_snackc_page.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/google_share_page_sample.html +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/login.json +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/probe_af_initdata_sample.html +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/offline.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_asset_partial.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_asset_unprocessed.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_aura_logger.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_batch_update_contract.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_budget_identity.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_apply.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_google_album.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_google_link.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_inspect.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_push_budget_geo.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_reconcile.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_status.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_status_google.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_sync.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_client_rate_limit.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_config_wizard.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_doctor.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_execute_plan_budget_geo.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_fixtures_validity.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_cache.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_client.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_enumerate.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_manifest.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_parsers.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_vault.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_gsync_all.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_gsync_engine.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_gsync_execute.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_imports.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_logout.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_migration.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_network_guard.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_offline_read_path.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_pairs.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_preflight_sweep.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_preflight_vault.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_prep_upload_formats.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_probe_browser.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_probe_shared_link.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_ratelimit.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_read_path.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_reconcile.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_retry_401.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_schedule.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_session.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_settings_budget.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_settings_resolution.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_sync_engine.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_token_refresh_extension.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_write_endpoints_failloud.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_write_formats_live.py +0 -0
- {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_write_throttling.py +0 -0
|
@@ -12,6 +12,31 @@ 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.7] - 2026-10-01
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- **The live progress bar names the primitive that actually runs** (D-07,
|
|
20
|
+
venus 2026-10-01): the removal loop of `execute_plan` emitted a
|
|
21
|
+
hardcoded `delete` kind on every per-item progress callback, so a hide
|
|
22
|
+
run's bar read `delete ok <asset>` mid-run even though the final summary
|
|
23
|
+
correctly said `Hidden` — the wording contract held on plan headers and
|
|
24
|
+
summaries but not on the live stream. The bar now shows `hide ok` /
|
|
25
|
+
`delete ok` / `hard-delete ok` matching `removal_mode` (a parametrized
|
|
26
|
+
test pins one kind per mode).
|
|
27
|
+
|
|
28
|
+
### Docs
|
|
29
|
+
|
|
30
|
+
- `docs/CLI.md` aligned with the real CLI surface (full audit against
|
|
31
|
+
argparse + code): a new Google commands section (`google-link` incl.
|
|
32
|
+
the browser's auto-close on login detection, `google-album`,
|
|
33
|
+
`google-sync` with `--pair`/`--all`/`--scheduled` and its 0/1/2 exit
|
|
34
|
+
codes), the Contents index covering Pairs/Scheduling/Google, the
|
|
35
|
+
current root usage block (12 verbs), `sync`'s `--batch-size`/
|
|
36
|
+
`--chunk-delay`, the write-budget identity's env-then-stored-session
|
|
37
|
+
resolution (5.1.6), the Google-side environment variables, and the
|
|
38
|
+
removal-verb note on plan lines.
|
|
39
|
+
|
|
15
40
|
## [5.1.6] - 2026-09-30
|
|
16
41
|
|
|
17
42
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pushframe
|
|
3
|
-
Version: 5.1.
|
|
3
|
+
Version: 5.1.7
|
|
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
|
|
@@ -13,12 +13,15 @@ talks to the frame over your local network — everything goes through your Aura
|
|
|
13
13
|
|
|
14
14
|
- [Global usage](#global-usage)
|
|
15
15
|
- [`doctor`](#doctor--can-this-machine-write-today)
|
|
16
|
+
- [Pairs](#pairs--one-album--several-frames-and-back)
|
|
17
|
+
- [Scheduling](#scheduling--systemd-user-timers-no-root)
|
|
16
18
|
- [`config`](#config--set-up-credentials-and-settings-once)
|
|
17
19
|
- [`status`](#status--check-credentials-and-list-frames)
|
|
18
20
|
- [`inspect`](#inspect--look-at-one-frame)
|
|
19
21
|
- [`sync`](#sync--make-a-frame-match-a-directory)
|
|
20
22
|
- [`push`](#push--upload-only-never-removes)
|
|
21
23
|
- [`reconcile`](#reconcile--account-for-stuck-placeholder-rows)
|
|
24
|
+
- [Google commands (`google-link` / `google-album` / `google-sync`)](#google-commands)
|
|
22
25
|
- [Choosing between `sync` and `push`](#choosing-between-sync-and-push)
|
|
23
26
|
- [Environment variables](#environment-variables)
|
|
24
27
|
- [Exit codes](#exit-codes)
|
|
@@ -43,11 +46,13 @@ settings stay (the next `pushframe config` proposes your email). Idempotent;
|
|
|
43
46
|
token material is never printed.
|
|
44
47
|
|
|
45
48
|
```
|
|
46
|
-
usage: pushframe [-h] [--version] [--debug]
|
|
49
|
+
usage: pushframe [-h] [--version] [--debug]
|
|
50
|
+
{status,logout,doctor,config,inspect,sync,push,reconcile,
|
|
51
|
+
google-link,google-album,google-sync,schedule} ...
|
|
47
52
|
|
|
48
53
|
options:
|
|
49
54
|
-h, --help show this help message and exit
|
|
50
|
-
--version show the program version ("pushframe 5.
|
|
55
|
+
--version show the program version (e.g. "pushframe 5.1.6") and exit
|
|
51
56
|
--debug Show verbose loguru request/response logging on stderr
|
|
52
57
|
```
|
|
53
58
|
|
|
@@ -282,8 +287,10 @@ it is the value a command would actually use).
|
|
|
282
287
|
|
|
283
288
|
```
|
|
284
289
|
usage: pushframe status [-h]
|
|
285
|
-
```
|
|
286
|
-
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
The first command to run. With env credentials it logs in fresh; with a stored token session
|
|
293
|
+
it resumes it (no login call) and lists your frames.
|
|
287
294
|
Nothing is ever written except a session token: if the stored token is
|
|
288
295
|
refused (HTTP 401), an interactive run offers ONE re-login right there and
|
|
289
296
|
continues — a refused fresh login is never retried (that shape is the
|
|
@@ -349,7 +356,10 @@ than bugs in this client — see [Known issues](#known-issues):
|
|
|
349
356
|
## `sync` — make a frame match a directory
|
|
350
357
|
|
|
351
358
|
```
|
|
352
|
-
usage: pushframe sync [-h] --frame FRAME [--apply] [--yes]
|
|
359
|
+
usage: pushframe sync [-h] [--frame FRAME] [--apply] [--yes]
|
|
360
|
+
[--delete | --hard-delete]
|
|
361
|
+
[--batch-size BATCH_SIZE] [--chunk-delay CHUNK_DELAY]
|
|
362
|
+
dir
|
|
353
363
|
|
|
354
364
|
positional arguments:
|
|
355
365
|
dir Local directory to scan for photos
|
|
@@ -362,6 +372,8 @@ options:
|
|
|
362
372
|
(frame-scoped; the photo leaves this frame)
|
|
363
373
|
--hard-delete IRREVERSIBLY destroy gone-local photos instead of hiding them
|
|
364
374
|
(account-wide; requires typing the exact count to confirm)
|
|
375
|
+
--batch-size BATCH_SIZE Assets per select_asset/batch_update call (default 50)
|
|
376
|
+
--chunk-delay CHUNK_DELAY Seconds to pause between write chunks (default 5)
|
|
365
377
|
```
|
|
366
378
|
|
|
367
379
|
`sync` makes the frame **match the directory**. Photos in the directory but not on the frame
|
|
@@ -390,6 +402,9 @@ Already hidden: 3 (no action needed)
|
|
|
390
402
|
58 frame assets without a content hash (e.g. videos) left untouched
|
|
391
403
|
```
|
|
392
404
|
|
|
405
|
+
(The removal line names the verb of the active mode — `To hide:` by
|
|
406
|
+
default, `To delete:` / `To hard-delete:` with the corresponding flag.)
|
|
407
|
+
|
|
393
408
|
Reading the plan:
|
|
394
409
|
|
|
395
410
|
| Line | Meaning |
|
|
@@ -569,8 +584,12 @@ requests.
|
|
|
569
584
|
### Write budget and geo guard
|
|
570
585
|
|
|
571
586
|
`push` and `sync --apply` both run a client-side token-bucket budget and a geo pre-flight
|
|
572
|
-
check before any write, so the anti-abuse lockout is difficult to reach by accident.
|
|
573
|
-
|
|
587
|
+
check before any write, so the anti-abuse lockout is difficult to reach by accident.The budget is persisted between runs under `AURA_STATE_DIR` (default
|
|
588
|
+
`~/.config/pushframe/`), keyed by a hash of the **account identity**: the
|
|
589
|
+
`PUSHFRAME_EMAIL`/`AURA_EMAIL` override when set, otherwise the email of
|
|
590
|
+
the stored session (the same env-then-config resolution auth uses —
|
|
591
|
+
5.1.6). A run with no resolvable identity at all skips pacing with a
|
|
592
|
+
named stderr line instead of crashing.
|
|
574
593
|
|
|
575
594
|
| Flag | Effect |
|
|
576
595
|
|---|---|
|
|
@@ -748,6 +767,71 @@ candidate list.
|
|
|
748
767
|
(see [Write budget and geo guard](#write-budget-and-geo-guard)) and paces its requests the
|
|
749
768
|
same way.
|
|
750
769
|
|
|
770
|
+
## Google commands
|
|
771
|
+
|
|
772
|
+
Three verbs mirror a Google Photos album onto a frame. The full narrative
|
|
773
|
+
(with a verified end-to-end walkthrough, cache/manifest internals and
|
|
774
|
+
SAFE-01..04 semantics) lives in [README.md](../README.md); this is the
|
|
775
|
+
command-level reference.
|
|
776
|
+
|
|
777
|
+
### `google-link` — link (or re-link) Google Photos
|
|
778
|
+
|
|
779
|
+
One command for both linking and re-linking: opens a **visible** Chrome
|
|
780
|
+
window (anti-bot posture — never headless) on a dedicated profile, waits
|
|
781
|
+
for the login (auto-detect on auth cookies, 30 min timeout), then
|
|
782
|
+
harvests the session cookies into the vault:
|
|
783
|
+
|
|
784
|
+
```
|
|
785
|
+
~/.config/pushframe/google-cookies.json (0600, outside the repo)
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
The window closes by itself as soon as the login is detected — that is
|
|
789
|
+
the auto-detect working, not a crash. On a headless server, connect with
|
|
790
|
+
`ssh -X` so the window can open on your screen; the vault survives
|
|
791
|
+
logouts and every other command is headless by nature. Profile
|
|
792
|
+
precedence: `PUSHFRAME_PROBE_CHROME_PROFILE` > legacy
|
|
793
|
+
`AURA_PROBE_CHROME_PROFILE` > built-in default (created on demand).
|
|
794
|
+
|
|
795
|
+
### `google-album` — inspect a shared album
|
|
796
|
+
|
|
797
|
+
```
|
|
798
|
+
usage: pushframe google-album [-h] [--list] [target]
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
`--list` lists the account's shared albums (discovery aid). With a
|
|
802
|
+
`target` (share URL, `AF1Qip…` id, or album-name substring — ambiguity
|
|
803
|
+
prints a numbered list and exits 2), enumerates every item with its exact
|
|
804
|
+
disk weight. Read-only.
|
|
805
|
+
|
|
806
|
+
### `google-sync` — mirror an album onto a frame
|
|
807
|
+
|
|
808
|
+
```
|
|
809
|
+
usage: pushframe google-sync [-h] [--frame FRAME] [--all] [--pair PAIR]
|
|
810
|
+
[--scheduled] [--apply] [--yes] [--debug]
|
|
811
|
+
[--batch-size BATCH_SIZE]
|
|
812
|
+
album
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
Dry-run by default. `--apply` runs one y/N (echoing the resolved frame's
|
|
816
|
+
name and id) then mirrors: uploads, and removals as **hides only** —
|
|
817
|
+
this verb has no delete tier (SAFE-03). An empty or truncated album
|
|
818
|
+
listing aborts instead of planning (SAFE-01); a plan whose removals
|
|
819
|
+
exceed the mass-hide threshold needs an explicit confirmation (SAFE-02;
|
|
820
|
+
skip-and-log instead when `--scheduled`); videos are counted and skipped,
|
|
821
|
+
never silently dropped. Prerequisites: the cookie vault (`google-link`,
|
|
822
|
+
checked named before anything else) and an Aura session (same one-session
|
|
823
|
+
path as every verb).
|
|
824
|
+
|
|
825
|
+
Frame targeting: `--frame "Name"` for one album→frame pair, `--pair NAME`
|
|
826
|
+
for a named pair from the config, or `--all` for every configured pair in
|
|
827
|
+
sorted order with one shared write budget (a failing pair never blocks
|
|
828
|
+
the others; exit 1 if any failed). Exit codes: `0` dry-run/aborted
|
|
829
|
+
confirmation, `1` failure, `2` usage/ambiguity (album not found,
|
|
830
|
+
no pairs configured…).
|
|
831
|
+
|
|
832
|
+
A real steady-state run prints `Applied: N uploaded, K hidden, R re-shown`,
|
|
833
|
+
then prunes the staging cache — only manifest-backed progress survives.
|
|
834
|
+
|
|
751
835
|
## Choosing between `sync` and `push`
|
|
752
836
|
|
|
753
837
|
| | `sync` | `push` |
|
|
@@ -796,6 +880,18 @@ to adopt one.
|
|
|
796
880
|
| `AURA_DEVICE_IDENTIFIER` | `0000000000000000` |
|
|
797
881
|
| `AURA_USER_AGENT` | `Aura/4.7.4271 (Android 36; Client)` |
|
|
798
882
|
|
|
883
|
+
The client-identity defaults are the ones a fresh install ships with —
|
|
884
|
+
`config set DEVICE_IDENTIFIER "$(uuidgen)"` (and optionally `USER_AGENT`)
|
|
885
|
+
overwrites them in the config file, which is the documented posture above.
|
|
886
|
+
|
|
887
|
+
**Optional — Google-side**
|
|
888
|
+
|
|
889
|
+
| Variable | Purpose |
|
|
890
|
+
|---|---|
|
|
891
|
+
| `PUSHFRAME_PROBE_CHROME_PROFILE` | Dedicated Chrome profile dir for `google-link` (precedence over the legacy `AURA_PROBE_CHROME_PROFILE`, then the built-in default created on demand) |
|
|
892
|
+
| `PUSHFRAME_GOOGLE_SYNC_REMOVAL_THRESHOLD` | SAFE-02 mass-hide threshold for `google-sync` (fraction of the frame's photos; see README) |
|
|
893
|
+
| `PUSHFRAME_VAULT_PATH` | Override the Google cookie vault path (mainly for tests) |
|
|
894
|
+
|
|
799
895
|
Booleans accept `1`, `true`, `yes`, `on` (case-insensitive); anything else is false.
|
|
800
896
|
|
|
801
897
|
## Exit codes
|
|
@@ -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.7"
|
|
@@ -1112,6 +1112,13 @@ def execute_plan(plan: SyncPlan, aura, frame_id: str, *, s3_client, sqs_client,
|
|
|
1112
1112
|
if budget is not None:
|
|
1113
1113
|
budget.save()
|
|
1114
1114
|
|
|
1115
|
+
# D-07 for the LIVE bar too (venus 2026-09-30): the per-item progress
|
|
1116
|
+
# kind must name the primitive that actually runs — a hide run must
|
|
1117
|
+
# never say 'delete ok' mid-bar. Mirrors cli.py's _REMOVAL_VERB_PRESENT
|
|
1118
|
+
# (the report-side wording contract) and gsync's dry-run plan header.
|
|
1119
|
+
removal_verb = {'hide': 'hide', 'delete': 'delete',
|
|
1120
|
+
'hard_delete': 'hard-delete'}[removal_mode]
|
|
1121
|
+
|
|
1115
1122
|
for chunk in _chunked(plan.to_delete, batch_size):
|
|
1116
1123
|
interchunk_pause()
|
|
1117
1124
|
if budget is not None:
|
|
@@ -1130,7 +1137,7 @@ def execute_plan(plan: SyncPlan, aura, frame_id: str, *, s3_client, sqs_client,
|
|
|
1130
1137
|
for asset in chunk:
|
|
1131
1138
|
result.delete_succeeded += 1
|
|
1132
1139
|
consecutive_failures = 0
|
|
1133
|
-
progress(
|
|
1140
|
+
progress(removal_verb, asset.id, True)
|
|
1134
1141
|
except httpx.HTTPStatusError as e:
|
|
1135
1142
|
# Same rationale as the re-show loop above: this loop acts
|
|
1136
1143
|
# on server-assigned asset ids, hiding/removing an
|
|
@@ -1157,9 +1164,9 @@ def execute_plan(plan: SyncPlan, aura, frame_id: str, *, s3_client, sqs_client,
|
|
|
1157
1164
|
reason = ('HTTP 401 after a successful re-login -- classified as an '
|
|
1158
1165
|
'anti-abuse trip, not authentication')
|
|
1159
1166
|
result.delete_failures.append((asset.id, reason))
|
|
1160
|
-
progress(
|
|
1167
|
+
progress(removal_verb, asset.id, False)
|
|
1161
1168
|
note_failure(reason)
|
|
1162
|
-
on_error(
|
|
1169
|
+
on_error(removal_verb, asset.id, False, reason)
|
|
1163
1170
|
if budget is not None:
|
|
1164
1171
|
budget.save()
|
|
1165
1172
|
continue
|
|
@@ -1176,7 +1183,7 @@ def execute_plan(plan: SyncPlan, aura, frame_id: str, *, s3_client, sqs_client,
|
|
|
1176
1183
|
for asset in chunk:
|
|
1177
1184
|
result.delete_succeeded += 1
|
|
1178
1185
|
consecutive_failures = 0
|
|
1179
|
-
progress(
|
|
1186
|
+
progress(removal_verb, asset.id, True)
|
|
1180
1187
|
except (RateLimitError, ConsecutiveWriteFailureError):
|
|
1181
1188
|
raise
|
|
1182
1189
|
except Exception as resend_exc:
|
|
@@ -1184,9 +1191,9 @@ def execute_plan(plan: SyncPlan, aura, frame_id: str, *, s3_client, sqs_client,
|
|
|
1184
1191
|
for asset in chunk:
|
|
1185
1192
|
reason = f'HTTP 401 retry failed: {resend_exc}'
|
|
1186
1193
|
result.delete_failures.append((asset.id, reason))
|
|
1187
|
-
progress(
|
|
1194
|
+
progress(removal_verb, asset.id, False)
|
|
1188
1195
|
note_failure(str(resend_exc))
|
|
1189
|
-
on_error(
|
|
1196
|
+
on_error(removal_verb, asset.id, False, str(resend_exc))
|
|
1190
1197
|
except RateLimitError:
|
|
1191
1198
|
if budget is not None:
|
|
1192
1199
|
budget.reconcile_tripped(clock())
|
|
@@ -1204,9 +1211,9 @@ def execute_plan(plan: SyncPlan, aura, frame_id: str, *, s3_client, sqs_client,
|
|
|
1204
1211
|
# (coarser than upload attribution, T-fyr-01).
|
|
1205
1212
|
for asset in chunk:
|
|
1206
1213
|
result.delete_failures.append((asset.id, str(e)))
|
|
1207
|
-
progress(
|
|
1214
|
+
progress(removal_verb, asset.id, False)
|
|
1208
1215
|
note_failure(str(e))
|
|
1209
|
-
on_error(
|
|
1216
|
+
on_error(removal_verb, asset.id, False, str(e))
|
|
1210
1217
|
|
|
1211
1218
|
if budget is not None:
|
|
1212
1219
|
budget.save()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pushframe"
|
|
3
|
-
version = "5.1.
|
|
3
|
+
version = "5.1.7"
|
|
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"
|
|
@@ -439,12 +439,12 @@ def test_execute_plan_reports_progress_per_item(tmp_path):
|
|
|
439
439
|
succeeded_upload = [r for r in recorded if r[0] == 'upload' and r[2] is True]
|
|
440
440
|
assert succeeded_upload == [('upload', path_b, True)]
|
|
441
441
|
|
|
442
|
-
delete_entries = [r for r in recorded if r[0] == '
|
|
443
|
-
assert delete_entries == [('
|
|
442
|
+
delete_entries = [r for r in recorded if r[0] == 'hide']
|
|
443
|
+
assert delete_entries == [('hide', 'asset-good', True)]
|
|
444
444
|
|
|
445
|
-
# Every 'upload' entry appears before every
|
|
445
|
+
# Every 'upload' entry appears before every removal entry (D-09).
|
|
446
446
|
upload_indices = [i for i, r in enumerate(recorded) if r[0] == 'upload']
|
|
447
|
-
delete_indices = [i for i, r in enumerate(recorded) if r[0] == '
|
|
447
|
+
delete_indices = [i for i, r in enumerate(recorded) if r[0] == 'hide']
|
|
448
448
|
assert max(upload_indices) < min(delete_indices)
|
|
449
449
|
|
|
450
450
|
|
|
@@ -514,6 +514,25 @@ def _run(plan, aura, **kwargs):
|
|
|
514
514
|
sqs_client=_FakeSQSClient(), sleep=lambda *_: None, **kwargs)
|
|
515
515
|
|
|
516
516
|
|
|
517
|
+
@pytest.mark.parametrize('removal_mode,expected_kind', [
|
|
518
|
+
('hide', 'hide'), ('delete', 'delete'), ('hard_delete', 'hard-delete')])
|
|
519
|
+
def test_removal_progress_kind_names_the_running_primitive(removal_mode, expected_kind):
|
|
520
|
+
"""D-07 on the LIVE progress stream (venus 2026-09-30): a hide run's
|
|
521
|
+
per-item kind must never say 'delete' — the operator watching the bar
|
|
522
|
+
reads the primitive off it, and the report-side wording contract
|
|
523
|
+
(_REMOVAL_VERB_PRESENT) already forbids this drift on summaries."""
|
|
524
|
+
plan = SyncPlan(to_delete=[_asset('a1')])
|
|
525
|
+
aura = offline_aura(overrides=_default_overrides())
|
|
526
|
+
recorded: list = []
|
|
527
|
+
|
|
528
|
+
_run(plan, aura, removal_mode=removal_mode,
|
|
529
|
+
progress=lambda kind, identifier, ok: recorded.append((kind, identifier, ok)))
|
|
530
|
+
|
|
531
|
+
kinds = {kind for kind, _, _ in recorded}
|
|
532
|
+
assert kinds == {expected_kind}, \
|
|
533
|
+
f'{removal_mode} run emitted {kinds!r} — expected {expected_kind!r} only'
|
|
534
|
+
|
|
535
|
+
|
|
517
536
|
def test_hide_mode_excludes_and_never_removes_or_deletes():
|
|
518
537
|
"""The default mode must reach ONLY the non-destructive primitive."""
|
|
519
538
|
plan = SyncPlan(to_upload=[], to_delete=[_asset('a1'), _asset('a2')])
|
|
@@ -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.7"
|
|
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
|
|
File without changes
|
{pushframe-5.1.6 → pushframe-5.1.7}/.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
|