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.
Files changed (417) hide show
  1. {pushframe-5.1.6 → pushframe-5.1.7}/CHANGELOG.md +25 -0
  2. {pushframe-5.1.6 → pushframe-5.1.7}/PKG-INFO +1 -1
  3. {pushframe-5.1.6 → pushframe-5.1.7}/docs/CLI.md +103 -7
  4. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/__init__.py +1 -1
  5. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/sync.py +15 -8
  6. {pushframe-5.1.6 → pushframe-5.1.7}/pyproject.toml +1 -1
  7. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_execute_plan.py +23 -4
  8. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_version.py +1 -1
  9. {pushframe-5.1.6 → pushframe-5.1.7}/uv.lock +1 -1
  10. {pushframe-5.1.6 → pushframe-5.1.7}/.env.sample +0 -0
  11. {pushframe-5.1.6 → pushframe-5.1.7}/.freebuff/project-id +0 -0
  12. {pushframe-5.1.6 → pushframe-5.1.7}/.github/workflows/release.yml +0 -0
  13. {pushframe-5.1.6 → pushframe-5.1.7}/.github/workflows/tests.yml +0 -0
  14. {pushframe-5.1.6 → pushframe-5.1.7}/.gitignore +0 -0
  15. {pushframe-5.1.6 → pushframe-5.1.7}/.gsd/dispatch-isolation-sentinel.json +0 -0
  16. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/MILESTONES.md +0 -0
  17. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/PROJECT.md +0 -0
  18. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/REQUIREMENTS.md +0 -0
  19. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/RETROSPECTIVE.md +0 -0
  20. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/ROADMAP.md +0 -0
  21. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/STATE.md +0 -0
  22. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/WINDOWS.md +0 -0
  23. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/ARCHITECTURE.md +0 -0
  24. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/CONCERNS.md +0 -0
  25. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/CONVENTIONS.md +0 -0
  26. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/INTEGRATIONS.md +0 -0
  27. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/STACK.md +0 -0
  28. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/STRUCTURE.md +0 -0
  29. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/codebase/TESTING.md +0 -0
  30. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/config.json +0 -0
  31. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/gsync-apply-budget-none-crash.md +0 -0
  32. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/knowledge-base.md +0 -0
  33. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/login-475-null-creds.md +0 -0
  34. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/resolved/cli-status-verbose-logging.md +0 -0
  35. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/resolved/inspect-asset-null-fields.md +0 -0
  36. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/resolved/select-asset-401-unauthorized.md +0 -0
  37. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/debug/status-crash-401-trip.md +0 -0
  38. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-REQUIREMENTS.md +0 -0
  39. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-ROADMAP.md +0 -0
  40. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-01-PLAN.md +0 -0
  41. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-01-SUMMARY.md +0 -0
  42. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-02-PLAN.md +0 -0
  43. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-02-SUMMARY.md +0 -0
  44. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-CONTEXT.md +0 -0
  45. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-DISCUSSION-LOG.md +0 -0
  46. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-PATTERNS.md +0 -0
  47. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-RESEARCH.md +0 -0
  48. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-REVIEW.md +0 -0
  49. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/01-toolchain-revival/01-VERIFICATION.md +0 -0
  50. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-01-PLAN.md +0 -0
  51. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-01-SUMMARY.md +0 -0
  52. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-02-PLAN.md +0 -0
  53. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-02-SUMMARY.md +0 -0
  54. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-CONTEXT.md +0 -0
  55. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-DISCUSSION-LOG.md +0 -0
  56. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-LIVE-EVIDENCE.md +0 -0
  57. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-PATTERNS.md +0 -0
  58. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-RESEARCH.md +0 -0
  59. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-REVIEW.md +0 -0
  60. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/02-live-read-path-verification/02-VERIFICATION.md +0 -0
  61. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-01-PLAN.md +0 -0
  62. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-01-SUMMARY.md +0 -0
  63. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-CONTEXT.md +0 -0
  64. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-DISCUSSION-LOG.md +0 -0
  65. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-PATTERNS.md +0 -0
  66. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-RESEARCH.md +0 -0
  67. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-REVIEW.md +0 -0
  68. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.0-phases/03-run-docs-verification-report/03-VERIFICATION.md +0 -0
  69. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-ROADMAP.md +0 -0
  70. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v1.1-phases/04-client-transport-seam-for-offline-testability/.gitkeep +0 -0
  71. {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
  72. {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
  73. {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
  74. {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
  75. {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
  76. {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
  77. {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
  78. {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
  79. {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
  80. {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
  81. {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
  82. {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
  83. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-REQUIREMENTS.md +0 -0
  84. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-ROADMAP.md +0 -0
  85. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-01-PLAN.md +0 -0
  86. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-01-SUMMARY.md +0 -0
  87. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-02-PLAN.md +0 -0
  88. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-02-SUMMARY.md +0 -0
  89. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-CONTEXT.md +0 -0
  90. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-DISCUSSION-LOG.md +0 -0
  91. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-PATTERNS.md +0 -0
  92. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-REVIEW.md +0 -0
  93. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-SECURITY.md +0 -0
  94. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-UAT.md +0 -0
  95. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/05-cli-skeleton-status/05-VERIFICATION.md +0 -0
  96. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-01-PLAN.md +0 -0
  97. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-01-SUMMARY.md +0 -0
  98. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-02-PLAN.md +0 -0
  99. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-02-SUMMARY.md +0 -0
  100. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-CONTEXT.md +0 -0
  101. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-DISCUSSION-LOG.md +0 -0
  102. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-PATTERNS.md +0 -0
  103. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-RESEARCH.md +0 -0
  104. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-REVIEW.md +0 -0
  105. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-SECURITY.md +0 -0
  106. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/06-inspect-frame-resolution/06-VERIFICATION.md +0 -0
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-CONTEXT.md +0 -0
  129. {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
  130. {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
  131. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-PATTERNS.md +0 -0
  132. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-RESEARCH.md +0 -0
  133. {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
  134. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-REVIEW.md +0 -0
  135. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/08-destructive-execution-upload-delete-verification/08-VERIFICATION.md +0 -0
  136. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/09-proactive-write-rate-limiter-geo-guard/.gitkeep +0 -0
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {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
  144. {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
  145. {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
  146. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/.gitkeep +0 -0
  147. {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
  148. {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
  149. {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
  150. {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
  151. {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
  152. {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
  153. {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
  154. {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
  155. {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
  156. {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
  157. {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
  158. {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
  159. {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
  160. {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
  161. {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
  162. {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
  163. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-phases/10-hide-instead-of-delete-sync-mode/COVERAGE.md +0 -0
  164. {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
  165. {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
  166. {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
  167. {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
  168. {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
  169. {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
  170. {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
  171. {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
  172. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v2.0-quick/README.md +0 -0
  173. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-REQUIREMENTS.md +0 -0
  174. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-ROADMAP.md +0 -0
  175. {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
  176. {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
  177. {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
  178. {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
  179. {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
  180. {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
  181. {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
  182. {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
  183. {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
  184. {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
  185. {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
  186. {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
  187. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-CONTEXT.md +0 -0
  188. {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
  189. {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
  190. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-PATTERNS.md +0 -0
  191. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-REVIEW.md +0 -0
  192. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v3.0-phases/11-write-path-reliability-format-support/11-VERIFICATION.md +0 -0
  193. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-REQUIREMENTS.md +0 -0
  194. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-ROADMAP.md +0 -0
  195. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-01-PLAN.md +0 -0
  196. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-01-SUMMARY.md +0 -0
  197. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-02-PLAN.md +0 -0
  198. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-02-SUMMARY.md +0 -0
  199. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-03-PLAN.md +0 -0
  200. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-03-SUMMARY.md +0 -0
  201. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-CONTEXT.md +0 -0
  202. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-DECISION-RECORD.md +0 -0
  203. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-DISCUSSION-LOG.md +0 -0
  204. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/16-LIVE-FINDINGS.md +0 -0
  205. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/16-local-mechanism-spike-decision/COVERAGE.md +0 -0
  206. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-01-PLAN.md +0 -0
  207. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-01-SUMMARY.md +0 -0
  208. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-02-PLAN.md +0 -0
  209. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-02-SUMMARY.md +0 -0
  210. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-CONTEXT.md +0 -0
  211. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-DISCUSS-CHECKPOINT.json +0 -0
  212. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/17-VERIFICATION.md +0 -0
  213. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/17-google-link-album-selection/COVERAGE.md +0 -0
  214. {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
  215. {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
  216. {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
  217. {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
  218. {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
  219. {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
  220. {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
  221. {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
  222. {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
  223. {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
  224. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-01-PLAN.md +0 -0
  225. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-01-SUMMARY.md +0 -0
  226. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-02-PLAN.md +0 -0
  227. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-02-SUMMARY.md +0 -0
  228. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-CONTEXT.md +0 -0
  229. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-RESEARCH.md +0 -0
  230. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v4.0-phases/19-debt-closeout/19-VERIFICATION.md +0 -0
  231. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-REQUIREMENTS.md +0 -0
  232. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-ROADMAP.md +0 -0
  233. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/20-pushframe-rename-migration-repo-switch/20-SUMMARY.md +0 -0
  234. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-01-PLAN.md +0 -0
  235. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-01-SUMMARY.md +0 -0
  236. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-02-PLAN.md +0 -0
  237. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-02-SUMMARY.md +0 -0
  238. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-CONTEXT.md +0 -0
  239. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-RESEARCH.md +0 -0
  240. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/21-debian-package-apt-repo/21-VERIFICATION.md +0 -0
  241. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-01-PLAN.md +0 -0
  242. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-01-SUMMARY.md +0 -0
  243. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-02-PLAN.md +0 -0
  244. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-02-SUMMARY.md +0 -0
  245. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-CONTEXT.md +0 -0
  246. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-RESEARCH.md +0 -0
  247. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/22-VERIFICATION.md +0 -0
  248. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/milestones/v5.0-phases/22-pypi-release-engineering/OPERATOR-STEPS.md +0 -0
  249. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/23-config-wizard-precedence/23-01-PLAN.md +0 -0
  250. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/23-config-wizard-precedence/23-01-SUMMARY.md +0 -0
  251. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/23-config-wizard-precedence/23-CONTEXT.md +0 -0
  252. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/23-config-wizard-precedence/23-RESEARCH.md +0 -0
  253. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/phases/23-config-wizard-precedence/23-VERIFICATION.md +0 -0
  254. {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
  255. {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
  256. {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
  257. {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
  258. {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
  259. {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
  260. {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
  261. {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
  262. {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
  263. {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
  264. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/ALBUM-ACCESS-V4-ADDENDUM.md +0 -0
  265. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/ALBUM-ACCESS.md +0 -0
  266. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/ARCHITECTURE.md +0 -0
  267. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/BROWSER-AUTOMATION.md +0 -0
  268. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/FEATURES.md +0 -0
  269. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/PITFALLS.md +0 -0
  270. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/STACK.md +0 -0
  271. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/research/SUMMARY.md +0 -0
  272. {pushframe-5.1.6 → pushframe-5.1.7}/.planning/state.json +0 -0
  273. {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
  274. {pushframe-5.1.6 → pushframe-5.1.7}/.python-version +0 -0
  275. {pushframe-5.1.6 → pushframe-5.1.7}/CLAUDE.md +0 -0
  276. {pushframe-5.1.6 → pushframe-5.1.7}/LICENSE +0 -0
  277. {pushframe-5.1.6 → pushframe-5.1.7}/README.md +0 -0
  278. {pushframe-5.1.6 → pushframe-5.1.7}/SECURITY.md +0 -0
  279. {pushframe-5.1.6 → pushframe-5.1.7}/VERIFICATION-REPORT.md +0 -0
  280. {pushframe-5.1.6 → pushframe-5.1.7}/docs/agents/domain.md +0 -0
  281. {pushframe-5.1.6 → pushframe-5.1.7}/docs/agents/issue-tracker.md +0 -0
  282. {pushframe-5.1.6 → pushframe-5.1.7}/docs/agents/triage-labels.md +0 -0
  283. {pushframe-5.1.6 → pushframe-5.1.7}/docs/superpowers/specs/2026-07-09-write-rate-limiter-design.md +0 -0
  284. {pushframe-5.1.6 → pushframe-5.1.7}/main.py +0 -0
  285. {pushframe-5.1.6 → pushframe-5.1.7}/packaging/control-template +0 -0
  286. {pushframe-5.1.6 → pushframe-5.1.7}/packaging/lintian-overrides +0 -0
  287. {pushframe-5.1.6 → pushframe-5.1.7}/packaging/postinst +0 -0
  288. {pushframe-5.1.6 → pushframe-5.1.7}/packaging/pushframe.copyright +0 -0
  289. {pushframe-5.1.6 → pushframe-5.1.7}/probes/.gitignore +0 -0
  290. {pushframe-5.1.6 → pushframe-5.1.7}/probes/README.md +0 -0
  291. {pushframe-5.1.6 → pushframe-5.1.7}/probes/browser_bootstrap.py +0 -0
  292. {pushframe-5.1.6 → pushframe-5.1.7}/probes/common.py +0 -0
  293. {pushframe-5.1.6 → pushframe-5.1.7}/probes/cookie_vault.py +0 -0
  294. {pushframe-5.1.6 → pushframe-5.1.7}/probes/fidelity_check.py +0 -0
  295. {pushframe-5.1.6 → pushframe-5.1.7}/probes/rpc_capture.py +0 -0
  296. {pushframe-5.1.6 → pushframe-5.1.7}/probes/shared_link_probe.py +0 -0
  297. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/__init__.py +0 -0
  298. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/accountApi.py +0 -0
  299. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/activityApi.py +0 -0
  300. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/assetApi.py +0 -0
  301. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/baseApi.py +0 -0
  302. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/frameApi.py +0 -0
  303. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/notificationApi.py +0 -0
  304. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/peopleApi.py +0 -0
  305. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/api/playlistApi.py +0 -0
  306. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/aura.py +0 -0
  307. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/aws/__init__.py +0 -0
  308. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/aws/awsclient.py +0 -0
  309. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/aws/s3client.py +0 -0
  310. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/aws/sqsclient.py +0 -0
  311. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/cache.py +0 -0
  312. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/cli.py +0 -0
  313. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/client.py +0 -0
  314. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/config_store.py +0 -0
  315. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/doctor.py +0 -0
  316. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/exif.py +0 -0
  317. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/export.py +0 -0
  318. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/__init__.py +0 -0
  319. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/bootstrap.py +0 -0
  320. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/cache.py +0 -0
  321. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/client.py +0 -0
  322. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/enumerate.py +0 -0
  323. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/manifest.py +0 -0
  324. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/parsers.py +0 -0
  325. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/redaction.py +0 -0
  326. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/google/vault.py +0 -0
  327. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/gsync.py +0 -0
  328. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/migration.py +0 -0
  329. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/__init__.py +0 -0
  330. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/activity.py +0 -0
  331. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/asset.py +0 -0
  332. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/frame.py +0 -0
  333. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/meta.py +0 -0
  334. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/person.py +0 -0
  335. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/models/user.py +0 -0
  336. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/pairs.py +0 -0
  337. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/preflight.py +0 -0
  338. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/ratelimit.py +0 -0
  339. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/reconcile.py +0 -0
  340. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/schedule.py +0 -0
  341. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/session.py +0 -0
  342. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/utils/dt.py +0 -0
  343. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/utils/io.py +0 -0
  344. {pushframe-5.1.6 → pushframe-5.1.7}/pushframe/utils/settings.py +0 -0
  345. {pushframe-5.1.6 → pushframe-5.1.7}/scripts/build-deb.sh +0 -0
  346. {pushframe-5.1.6 → pushframe-5.1.7}/scripts/make-apt-key.sh +0 -0
  347. {pushframe-5.1.6 → pushframe-5.1.7}/scripts/publish-apt-repo.sh +0 -0
  348. {pushframe-5.1.6 → pushframe-5.1.7}/scripts/test-apt-journey-container.sh +0 -0
  349. {pushframe-5.1.6 → pushframe-5.1.7}/scripts/test-config-journey-container.sh +0 -0
  350. {pushframe-5.1.6 → pushframe-5.1.7}/scripts/test-deb-container.sh +0 -0
  351. {pushframe-5.1.6 → pushframe-5.1.7}/scripts/test-install-journey-container.sh +0 -0
  352. {pushframe-5.1.6 → pushframe-5.1.7}/scripts/test-multipair-journey-container.sh +0 -0
  353. {pushframe-5.1.6 → pushframe-5.1.7}/tests/conftest.py +0 -0
  354. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/asset_unprocessed.json +0 -0
  355. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/assets_page1.json +0 -0
  356. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/assets_page2.json +0 -0
  357. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/assets_placeholders.json +0 -0
  358. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/error_envelope.json +0 -0
  359. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/frame_detail.json +0 -0
  360. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/frames.json +0 -0
  361. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/google_rpc_snackc_page.json +0 -0
  362. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/google_share_page_sample.html +0 -0
  363. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/login.json +0 -0
  364. {pushframe-5.1.6 → pushframe-5.1.7}/tests/fixtures/probe_af_initdata_sample.html +0 -0
  365. {pushframe-5.1.6 → pushframe-5.1.7}/tests/offline.py +0 -0
  366. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_asset_partial.py +0 -0
  367. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_asset_unprocessed.py +0 -0
  368. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_aura_logger.py +0 -0
  369. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_batch_update_contract.py +0 -0
  370. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_budget_identity.py +0 -0
  371. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_apply.py +0 -0
  372. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_google_album.py +0 -0
  373. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_google_link.py +0 -0
  374. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_inspect.py +0 -0
  375. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_push_budget_geo.py +0 -0
  376. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_reconcile.py +0 -0
  377. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_status.py +0 -0
  378. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_status_google.py +0 -0
  379. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_cli_sync.py +0 -0
  380. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_client_rate_limit.py +0 -0
  381. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_config_wizard.py +0 -0
  382. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_doctor.py +0 -0
  383. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_execute_plan_budget_geo.py +0 -0
  384. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_fixtures_validity.py +0 -0
  385. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_cache.py +0 -0
  386. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_client.py +0 -0
  387. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_enumerate.py +0 -0
  388. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_manifest.py +0 -0
  389. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_parsers.py +0 -0
  390. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_google_vault.py +0 -0
  391. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_gsync_all.py +0 -0
  392. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_gsync_engine.py +0 -0
  393. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_gsync_execute.py +0 -0
  394. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_imports.py +0 -0
  395. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_logout.py +0 -0
  396. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_migration.py +0 -0
  397. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_network_guard.py +0 -0
  398. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_offline_read_path.py +0 -0
  399. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_pairs.py +0 -0
  400. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_preflight_sweep.py +0 -0
  401. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_preflight_vault.py +0 -0
  402. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_prep_upload_formats.py +0 -0
  403. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_probe_browser.py +0 -0
  404. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_probe_shared_link.py +0 -0
  405. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_ratelimit.py +0 -0
  406. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_read_path.py +0 -0
  407. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_reconcile.py +0 -0
  408. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_retry_401.py +0 -0
  409. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_schedule.py +0 -0
  410. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_session.py +0 -0
  411. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_settings_budget.py +0 -0
  412. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_settings_resolution.py +0 -0
  413. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_sync_engine.py +0 -0
  414. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_token_refresh_extension.py +0 -0
  415. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_write_endpoints_failloud.py +0 -0
  416. {pushframe-5.1.6 → pushframe-5.1.7}/tests/test_write_formats_live.py +0 -0
  417. {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.6
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] {status,inspect,sync,push} ...
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.0.0") and exit
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
- ```The first command to run. With env credentials it logs in fresh; with a
286
- stored token session it resumes it (no login call) and lists your frames.
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] [--delete | --hard-delete] dir
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. The
573
- budget is persisted between runs under `AURA_STATE_DIR`.
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.6"
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('delete', asset.id, True)
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('delete', asset.id, False)
1167
+ progress(removal_verb, asset.id, False)
1161
1168
  note_failure(reason)
1162
- on_error('delete', asset.id, False, reason)
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('delete', asset.id, True)
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('delete', asset.id, False)
1194
+ progress(removal_verb, asset.id, False)
1188
1195
  note_failure(str(resend_exc))
1189
- on_error('delete', asset.id, False, str(resend_exc))
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('delete', asset.id, False)
1214
+ progress(removal_verb, asset.id, False)
1208
1215
  note_failure(str(e))
1209
- on_error('delete', asset.id, False, str(e))
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.6"
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] == 'delete']
443
- assert delete_entries == [('delete', 'asset-good', True)]
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 'delete' entry (D-09).
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] == 'delete']
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.6"
22
+ assert __version__ == "5.1.7"
23
23
 
24
24
 
25
25
  def test_version_matches_pyproject_single_source():
@@ -432,7 +432,7 @@ wheels = [
432
432
 
433
433
  [[package]]
434
434
  name = "pushframe"
435
- version = "5.1.6"
435
+ version = "5.1.7"
436
436
  source = { editable = "." }
437
437
  dependencies = [
438
438
  { name = "boto3" },
File without changes
File without changes
File without changes