gflow-cli 0.7.0__tar.gz → 0.8.0__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 (250) hide show
  1. gflow_cli-0.8.0/.claude/commands/gflow/doc-review.md +137 -0
  2. gflow_cli-0.8.0/.claude/commands/gflow/release.md +168 -0
  3. gflow_cli-0.8.0/.continue-here.md +118 -0
  4. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.gitignore +3 -0
  5. gflow_cli-0.8.0/.planning/todos/pending/pr-38-review.md +8 -0
  6. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/CHANGELOG.md +126 -1
  7. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/CLAUDE.md +6 -6
  8. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/KNOWN_ISSUES.md +101 -2
  9. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/PKG-INFO +31 -21
  10. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/PLAN.md +45 -8
  11. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/README.md +30 -20
  12. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/DEBUGGING.md +16 -3
  13. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/INDEX.md +2 -0
  14. gflow_cli-0.8.0/docs/LIVE_VERIFICATION_image_batch.md +355 -0
  15. gflow_cli-0.8.0/docs/LIVE_VERIFICATION_video_download.md +97 -0
  16. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/USAGE.md +59 -7
  17. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md +784 -0
  18. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-21-multi-image-prompt-orchestration.md +632 -0
  19. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-21-multi-image-prompt.md +2410 -0
  20. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-22-pr-38-review.md +107 -0
  21. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-22-stay-mounted-batch-session-plan.md +1907 -0
  22. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-21-multi-image-prompt-design.md +457 -0
  23. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-22-pr-38-review-design.md +40 -0
  24. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-22-stay-mounted-batch-session-design.md +389 -0
  25. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/pyproject.toml +2 -1
  26. gflow_cli-0.8.0/scripts/dev/monitor_pr_38.py +37 -0
  27. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/__init__.py +1 -1
  28. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/client.py +65 -91
  29. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/dto.py +22 -1
  30. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/bearer.py +1 -0
  31. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +4 -1
  32. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +1 -0
  33. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/ui_automation.py +759 -35
  34. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/ui_automation_video.py +51 -6
  35. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/video.py +12 -0
  36. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/internal_chromium.py +1 -0
  37. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/real_chrome.py +1 -0
  38. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/verification.py +1 -0
  39. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/browser_manager.py +1 -0
  40. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/cli_image.py +146 -52
  41. gflow_cli-0.8.0/src/gflow_cli/cli_video.py +153 -0
  42. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/errors.py +65 -0
  43. gflow_cli-0.8.0/src/gflow_cli/image_batch.py +877 -0
  44. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/observability.py +1 -1
  45. gflow_cli-0.8.0/test_assets/sample_batch.json +5 -0
  46. gflow_cli-0.8.0/test_assets/sample_batch.tsv +3 -0
  47. gflow_cli-0.8.0/test_assets/sample_batch_invalid.tsv +4 -0
  48. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_client.py +16 -0
  49. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_client_image.py +67 -164
  50. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_dto.py +57 -0
  51. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_video.py +23 -0
  52. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_ui_automation.py +611 -0
  53. gflow_cli-0.8.0/tests/api/transports/test_ui_automation_batch.py +1169 -0
  54. gflow_cli-0.8.0/tests/api/transports/test_ui_automation_image_mode.py +177 -0
  55. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_ui_automation_video.py +61 -1
  56. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/auth/strategies/test_strategies.py +1 -0
  57. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/test_cli_image.py +57 -13
  58. gflow_cli-0.8.0/tests/cli/test_cli_image_seed_removed.py +31 -0
  59. gflow_cli-0.8.0/tests/cli/test_cli_video.py +68 -0
  60. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/test_t2i_multi_prompt.py +0 -9
  61. gflow_cli-0.8.0/tests/e2e/test_image_batch_e2e.py +205 -0
  62. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/test_image_steps.py +0 -1
  63. gflow_cli-0.8.0/tests/image_batch/test_image_manifest.py +384 -0
  64. gflow_cli-0.8.0/tests/image_batch/test_observability_events.py +185 -0
  65. gflow_cli-0.8.0/tests/smoke/__init__.py +0 -0
  66. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_errors.py +38 -0
  67. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/uv.lock +90 -1
  68. gflow_cli-0.7.0/.claude/commands/gflow/release.md +0 -118
  69. gflow_cli-0.7.0/src/gflow_cli/cli_video.py +0 -95
  70. gflow_cli-0.7.0/src/gflow_cli/image_batch.py +0 -442
  71. gflow_cli-0.7.0/tests/test_cli_video.py +0 -44
  72. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.claude/README.md +0 -0
  73. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.claude/commands/gflow/changelog.md +0 -0
  74. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.claude/commands/gflow/check.md +0 -0
  75. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.claude/commands/gflow/known-issues.md +0 -0
  76. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.claude/commands/gflow/plan.md +0 -0
  77. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.env.template +0 -0
  78. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.gitattributes +0 -0
  79. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/CODEOWNERS +0 -0
  80. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  81. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/copilot-instructions.md +0 -0
  82. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/dependabot.yml +0 -0
  83. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/workflows/ci.yml +0 -0
  84. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/workflows/external-pr-triage.yml +0 -0
  85. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/workflows/release.yml +0 -0
  86. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.gitleaks.toml +0 -0
  87. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.planning/todos/pending/2026-05-11-add-project-logo-and-docs-site-promotion-plan.md +0 -0
  88. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.pre-commit-config.yaml +0 -0
  89. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.secrets.baseline +0 -0
  90. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/CONFIGURATION.md +0 -0
  91. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/CONTRIBUTING.md +0 -0
  92. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/DISCLAIMER.md +0 -0
  93. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/LICENSE +0 -0
  94. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/RELEASE.md +0 -0
  95. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/ARCHITECTURE.md +0 -0
  96. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/AUTHENTICATION.md +0 -0
  97. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/CONFIGURATION.md +0 -0
  98. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/DEVELOPMENT.md +0 -0
  99. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/GITHUB.md +0 -0
  100. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  101. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/SECURITY.md +0 -0
  102. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/USER_GUIDE.md +0 -0
  103. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/assets/example-run.gif +0 -0
  104. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/2026-05-17-issue-15-handover.md +0 -0
  105. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-image-mvp-orchestration.md +0 -0
  106. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-image-mvp.md +0 -0
  107. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-video-mvp-orchestration.md +0 -0
  108. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-video-mvp.md +0 -0
  109. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening-orchestration.md +0 -0
  110. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening.md +0 -0
  111. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/2026-05-14-shell-multi-prompt-orchestration.md +0 -0
  112. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_ARCH.md +0 -0
  113. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_SEC_UX.md +0 -0
  114. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_CODE.md +0 -0
  115. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_GEMINI.md +0 -0
  116. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_SECURITY.md +0 -0
  117. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_PYTHON.md +0 -0
  118. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_SECURITY.md +0 -0
  119. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN.md +0 -0
  120. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_CODE.md +0 -0
  121. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_FOLLOWUP.md +0 -0
  122. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_PLANNER.md +0 -0
  123. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY.md +0 -0
  124. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY_FOLLOWUP.md +0 -0
  125. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_FINAL_SEC_UX_VERIFIED.md +0 -0
  126. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_PLAN_SECURITY.md +0 -0
  127. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_SPEC_SECURITY.md +0 -0
  128. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/PLAN.md +0 -0
  129. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/orchestration.md +0 -0
  130. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-17-e2e-test-coverage.md +0 -0
  131. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-17-issue-15-auth-verification-fix.md +0 -0
  132. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-17-issue-15-i2v-bearer-auth.md +0 -0
  133. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-17-issue-15-orchestration.md +0 -0
  134. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-18-video-phase0-submit-spike.md +0 -0
  135. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-19-video-phase-a-execution-state.md +0 -0
  136. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-19-video-phase-a-orchestration.md +0 -0
  137. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-19-video-phase-a-t2v.md +0 -0
  138. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-10-phase-4-hardening-design.md +0 -0
  139. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-14-shell-multi-prompt-design.md +0 -0
  140. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-15-auth-login-real-chrome-design.md +0 -0
  141. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-17-e2e-test-coverage-design.md +0 -0
  142. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-17-i2v-uploadimage-401-bearer-auth-design.md +0 -0
  143. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-17-issue-15-auth-verification-fix-design.md +0 -0
  144. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-17-issue-15-root-cause-findings.md +0 -0
  145. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-18-ui-automation-video-generation-design.md +0 -0
  146. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -0
  147. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/README.md +0 -0
  148. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/batch_from_config.py +0 -0
  149. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/multi_prompt_t2i.py +0 -0
  150. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/sample_config.json +0 -0
  151. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/sample_prompts.txt +0 -0
  152. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/single_image_t2i.py +0 -0
  153. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/README.md +0 -0
  154. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/01_upload_image.json +0 -0
  155. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  156. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  157. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/04_archive_workflow.json +0 -0
  158. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/05_createProject.json +0 -0
  159. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/06_batchGenerateImages.json +0 -0
  160. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  161. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  162. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  163. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  164. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  165. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/ci/check_repo_hygiene.py +0 -0
  166. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/debug_editor.py +0 -0
  167. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/debug_gen_settings.py +0 -0
  168. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/debug_settings.py +0 -0
  169. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/dev/active_plan.py +0 -0
  170. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/diag_capture_flow_traffic.py +0 -0
  171. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/diag_recaptcha_mint.py +0 -0
  172. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/record_demo.ps1 +0 -0
  173. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/smoke_image.py +0 -0
  174. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/smoke_real_chrome_image.py +0 -0
  175. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/smoke_video_editor.py +0 -0
  176. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/smoke_worker_style.py +0 -0
  177. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/verify_chrome_auth_viability.py +0 -0
  178. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/skills/README.md +0 -0
  179. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/skills/gflow-cli/SKILL.md +0 -0
  180. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/sonar-project.properties +0 -0
  181. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/__main__.py +0 -0
  182. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/_cli_helpers.py +0 -0
  183. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/__init__.py +0 -0
  184. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/_retry.py +0 -0
  185. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/image.py +0 -0
  186. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/recaptcha.py +0 -0
  187. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/routes.py +0 -0
  188. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  189. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/_common.py +0 -0
  190. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  191. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/base.py +0 -0
  192. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  193. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/__init__.py +0 -0
  194. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/base.py +0 -0
  195. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/factory.py +0 -0
  196. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/strategies.py +0 -0
  197. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/cli.py +0 -0
  198. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/cli_run.py +0 -0
  199. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/config.py +0 -0
  200. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/exceptions.py +0 -0
  201. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/manifest.py +0 -0
  202. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/paths.py +0 -0
  203. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/profile_store.py +0 -0
  204. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tasks/lessons.md +0 -0
  205. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/__init__.py +0 -0
  206. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/__init__.py +0 -0
  207. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_concurrency.py +0 -0
  208. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_image.py +0 -0
  209. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_image_dto.py +0 -0
  210. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_recaptcha.py +0 -0
  211. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_retry.py +0 -0
  212. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_routes.py +0 -0
  213. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/__init__.py +0 -0
  214. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_base.py +0 -0
  215. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_bearer.py +0 -0
  216. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_common.py +0 -0
  217. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  218. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_factory.py +0 -0
  219. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_fingerprint.py +0 -0
  220. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_sapisidhash.py +0 -0
  221. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/auth/strategies/test_factory.py +0 -0
  222. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/auth/test_verification.py +0 -0
  223. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/__init__.py +0 -0
  224. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/test_cli_run.py +0 -0
  225. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/test_error_handling.py +0 -0
  226. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/test_helpers.py +0 -0
  227. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/conftest.py +0 -0
  228. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/e2e/__init__.py +0 -0
  229. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/e2e/conftest.py +0 -0
  230. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  231. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/e2e/test_transports_e2e.py +0 -0
  232. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  233. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/__init__.py +0 -0
  234. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/auth.feature +0 -0
  235. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/auth_login.feature +0 -0
  236. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/conftest.py +0 -0
  237. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/image.feature +0 -0
  238. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/test_auth_login_steps.py +0 -0
  239. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/test_auth_steps.py +0 -0
  240. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/test_step_collision_guard.py +0 -0
  241. {gflow_cli-0.7.0/tests/smoke → gflow_cli-0.8.0/tests/image_batch}/__init__.py +0 -0
  242. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/smoke/test_real_flow.py +0 -0
  243. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_auth.py +0 -0
  244. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_browser_manager.py +0 -0
  245. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_config.py +0 -0
  246. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_manifest.py +0 -0
  247. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_observability.py +0 -0
  248. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_paths.py +0 -0
  249. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_profile_store.py +0 -0
  250. {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_smoke.py +0 -0
@@ -0,0 +1,137 @@
1
+ ---
2
+ description: Use before cutting any gflow-cli release or after a major feature lands — systematic audit of version refs, INDEX completeness, per-release evidence files, CHANGELOG footer, skill files, and memory records for staleness.
3
+ ---
4
+
5
+ # `/gflow:doc-review` — Documentation Review Gate
6
+
7
+ Run this gate before cutting a release. Every item reports **PASS / UPDATED / WARN / FAIL**. Any **FAIL** blocks the release.
8
+
9
+ ---
10
+
11
+ ## 1. Version references
12
+
13
+ Check these files for stale version strings (old numbers, outdated status labels):
14
+
15
+ | File | What to verify |
16
+ |---|---|
17
+ | `README.md` | Status badge, "What's new" section, install example, milestone table |
18
+ | `CLAUDE.md` | `Active phase` — version, PyPI status, active backlog pointer |
19
+ | `PLAN.md` | Phase status (`IN PROGRESS` / `DONE`) and version annotations |
20
+ | `KNOWN_ISSUES.md` | `Open` entries resolved by this release → move to `Resolved` with evidence |
21
+ | `CHANGELOG.md` | `[Unreleased]` empty; link footer matches new version |
22
+ | `pyproject.toml` + `src/gflow_cli/__init__.py` | Both set to the new version |
23
+
24
+ Quick grep to spot stragglers:
25
+
26
+ ```bash
27
+ grep -rn "v[0-9]\+\.[0-9]" README.md CLAUDE.md PLAN.md KNOWN_ISSUES.md CHANGELOG.md pyproject.toml
28
+ ```
29
+
30
+ ---
31
+
32
+ ## 2. `docs/INDEX.md` completeness
33
+
34
+ Every `.md` in `docs/` needs an entry; every entry must point to a real file.
35
+
36
+ ```bash
37
+ # files in docs/ missing from INDEX.md
38
+ for f in docs/*.md; do
39
+ grep -q "$(basename "$f")" docs/INDEX.md || echo "MISSING from INDEX: $f"
40
+ done
41
+
42
+ # entries in INDEX.md pointing to deleted files
43
+ grep -o 'docs/[^)]*\.md' docs/INDEX.md | while read path; do
44
+ [ -f "$path" ] || echo "DEAD LINK in INDEX: $path"
45
+ done
46
+ ```
47
+
48
+ ---
49
+
50
+ ## 3. Per-release evidence file
51
+
52
+ After each release a `docs/LIVE_VERIFICATION_vX.Y.Z.md` must exist.
53
+
54
+ - Latest version has one (create stub if live run already documented elsewhere)
55
+ - `docs/INDEX.md` has an entry for it
56
+ - Previous versions' files are preserved (historical record — never delete)
57
+
58
+ ---
59
+
60
+ ## 4. `.claude/commands/gflow/` skill files
61
+
62
+ Scan all skills for stale phase/version references:
63
+
64
+ ```bash
65
+ grep -rn "v[0-9]\+\.[0-9]\|Phase [A-Z0-9]" .claude/commands/gflow/
66
+ ```
67
+
68
+ Update in the release prep commit if any references are wrong.
69
+
70
+ ---
71
+
72
+ ## 5. CHANGELOG link footer
73
+
74
+ ```bash
75
+ # Verify [Unreleased] compares from the new version, not an older one
76
+ tail -10 CHANGELOG.md
77
+ ```
78
+
79
+ Must read: `[Unreleased]: …compare/vNEW_VERSION…HEAD`
80
+
81
+ ---
82
+
83
+ ## 6. Memory files
84
+
85
+ Check `C:\Users\ffrol\.claude\projects\C--development-github-gflow-cli\memory\`:
86
+
87
+ | File | What to verify |
88
+ |---|---|
89
+ | `MEMORY.md` | All listed files exist; no dangling entries |
90
+ | `phase-b-followups.md` | Items shipped in this release marked done |
91
+ | `video-generation-spec.md` | PR/status accurate |
92
+ | `image-generation-401-next.md` | Resolution status and evidence pointer still valid |
93
+ | `release-signing.md` | Procedure section matches what was actually done |
94
+
95
+ ```bash
96
+ # Check MEMORY.md index integrity
97
+ cd "C:\Users\ffrol\.claude\projects\C--development-github-gflow-cli\memory"
98
+ grep -o '\[.*\]([^)]*\.md)' MEMORY.md | grep -o '([^)]*)' | tr -d '()' | while read f; do
99
+ [ -f "$f" ] || echo "DEAD LINK: $f"
100
+ done
101
+ ```
102
+
103
+ ---
104
+
105
+ ## 7. Stale file cleanup (optional)
106
+
107
+ Flag (do not delete without user confirmation):
108
+
109
+ - Temporary debugging artifacts in `docs/` or repo root that were never meant to be permanent
110
+ - Draft specs whose work has fully shipped (move to `docs/archive/` or add "SHIPPED" header)
111
+ - `LIVE_VERIFICATION` files older than two releases that could be archived
112
+
113
+ Always ask the user before removing or archiving.
114
+
115
+ ---
116
+
117
+ ## Output format
118
+
119
+ After each section write one line:
120
+
121
+ ```
122
+ [1] Version refs — PASS
123
+ [2] INDEX completeness — UPDATED (added LIVE_VERIFICATION_v0.7.0.md entry)
124
+ [3] Evidence file — PASS
125
+ [4] Skill files — UPDATED (removed stale "Phase A in progress" in plan.md)
126
+ [5] CHANGELOG footer — PASS
127
+ [6] Memory files — WARN: release-signing.md procedure section may need update — check with user
128
+ [7] Stale files — PASS
129
+ ```
130
+
131
+ Then list every **UPDATED** change and every **WARN** / **FAIL** finding for the user to review.
132
+
133
+ ---
134
+
135
+ ## Integration with `/gflow:release`
136
+
137
+ This skill is invoked at **step 9** of `/gflow:release` (between "review commands for staleness" and "commit the release prep"). All discovered fixes are folded into the release prep commit unless genuinely unrelated to the release.
@@ -0,0 +1,168 @@
1
+ ---
2
+ description: Cut a new gflow-cli release — bump version, update CHANGELOG, tag, push, and back-merge.
3
+ ---
4
+
5
+ # `/gflow:release` — Cut a new release
6
+
7
+ Follow this sequence verbatim. Every step matters.
8
+
9
+ > **Branch-protection note:** `main` blocks direct pushes. The release commit travels
10
+ > via a `chore/release-vX.Y.Z` branch PR. The signed tag is pushed independently
11
+ > (tag pushes bypass branch protection and trigger the CI release workflow immediately).
12
+
13
+ ## Inputs
14
+
15
+ Ask the user (if not already provided):
16
+
17
+ 1. **Version** — the new version (e.g. `0.4.0`, `0.4.0a3`, `1.0.0rc1`). Use PEP 440 prerelease suffixes (`aN`, `bN`, `rcN`). If they don't know, run `/gflow:changelog` first and propose the next bump (PATCH for fixes only, MINOR for new features, MAJOR for breaks).
18
+ 2. **Pre-release?** — prerelease versions stay marked as GitHub prereleases. Only the user can say when a release line is ready for the stable tag.
19
+
20
+ ---
21
+
22
+ ## Sequence
23
+
24
+ **1. Review what's queued.**
25
+
26
+ Run `/gflow:changelog` — confirm the `[Unreleased]` block is non-empty and accurate before proceeding.
27
+
28
+ **2. Verify clean working tree.**
29
+
30
+ ```bash
31
+ git status --short
32
+ ```
33
+
34
+ Must be empty. If not, abort and tell the user to commit or stash first.
35
+
36
+ **3. Verify `main` is up-to-date.**
37
+
38
+ ```bash
39
+ git rev-parse --abbrev-ref HEAD # must be "main"
40
+ git fetch origin
41
+ git rev-list HEAD..origin/main # must be empty
42
+ ```
43
+
44
+ If not on `main`, switch: `git checkout main && git pull origin main`.
45
+ If `main` is behind, pull first.
46
+
47
+ **4. Run quality gates.**
48
+
49
+ Run `/gflow:check` — all gates must pass. Abort if any fail.
50
+
51
+ **5. Create a release branch.**
52
+
53
+ ```bash
54
+ git checkout -b chore/release-v<NEW_VERSION>
55
+ ```
56
+
57
+ All release prep commits live here; this branch gets PR'd into `main`.
58
+
59
+ **6. Bump version** in `pyproject.toml`:
60
+
61
+ ```toml
62
+ [project]
63
+ version = "<NEW_VERSION>"
64
+ ```
65
+
66
+ **7. Bump package version** in `src/gflow_cli/__init__.py`:
67
+
68
+ ```python
69
+ __version__ = "<NEW_VERSION>"
70
+ ```
71
+
72
+ **8. Update version assertion tests** if present:
73
+
74
+ ```bash
75
+ rg -n "__version__|<OLD_VERSION>|version assertion" tests src pyproject.toml
76
+ ```
77
+
78
+ **9. Migrate CHANGELOG.**
79
+
80
+ - Move all entries under `## [Unreleased]` to a new `## [<NEW_VERSION>] — YYYY-MM-DD` section.
81
+ - Leave `## [Unreleased]` empty.
82
+ - Update the link footer:
83
+ ```
84
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v<NEW_VERSION>...HEAD
85
+ [<NEW_VERSION>]: https://github.com/ffroliva/gflow-cli/releases/tag/v<NEW_VERSION>
86
+ ```
87
+
88
+ **10. Run the documentation review gate.**
89
+
90
+ Run `/gflow:doc-review` — audit all version refs, INDEX completeness, evidence files, skill files, CHANGELOG footer, and memory files. Fix every **FAIL** before continuing. Fold all discovered fixes into the release prep commit.
91
+
92
+ **11. Commit the release prep.**
93
+
94
+ ```bash
95
+ git add pyproject.toml src/gflow_cli/__init__.py CHANGELOG.md
96
+ git add docs/ .claude/commands/gflow/ # include any doc-review fixes
97
+ git commit -m "chore(release): v<NEW_VERSION>"
98
+ ```
99
+
100
+ **12. Tag the release commit.** Use `-s` for a signed annotated tag so GitHub shows **"Verified"** AND `.github/workflows/release.yml` passes the signed-tag gate (unsigned or lightweight tags are rejected by CI).
101
+
102
+ ```bash
103
+ git tag -s v<NEW_VERSION> -m "v<NEW_VERSION>"
104
+ ```
105
+
106
+ Signing requirements:
107
+ - **SSH signing (preferred):** `git config --global gpg.format ssh` + `user.signingkey` pointing at your public key.
108
+ - **GPG:** any registered GPG key works.
109
+ - Run `git config --global user.signingkey` to confirm a key is configured.
110
+
111
+ **13. Push the tag first** (bypasses branch protection; triggers the CI release workflow immediately):
112
+
113
+ ```bash
114
+ git push origin v<NEW_VERSION>
115
+ ```
116
+
117
+ CI will start building the release. Watch <https://github.com/ffroliva/gflow-cli/actions>.
118
+
119
+ **14. Push the release branch and open the PR.**
120
+
121
+ ```bash
122
+ git push origin chore/release-v<NEW_VERSION>
123
+ ```
124
+
125
+ Open PR `chore/release-v<NEW_VERSION> → main` with title `chore(release): v<NEW_VERSION>`. Merge it once CI is green. (The release workflow already ran from the tag push in step 13 — the PR is to keep `main` up-to-date with the bump commit.)
126
+
127
+ **15. Back-merge `main` into `develop`.**
128
+
129
+ After the release PR is merged, bring the bump commit back to `develop` so branches stay aligned:
130
+
131
+ ```bash
132
+ git checkout develop
133
+ git pull origin develop
134
+ git fetch origin main
135
+ git merge origin/main --no-ff -m "chore: back-merge main (v<NEW_VERSION>) into develop"
136
+ git push origin develop
137
+ ```
138
+
139
+ If there are conflicts (rare — only if `develop` has commits that touched the same lines as the bump), resolve them, keeping `develop`'s unreleased work and `main`'s version bump.
140
+
141
+ **16. Report.**
142
+
143
+ Tell the user:
144
+ - Tag push triggered `.github/workflows/release.yml`.
145
+ - Watch <https://github.com/ffroliva/gflow-cli/actions> for the release workflow.
146
+ - On success: PyPI publish + GitHub Release with auto-generated notes.
147
+ - On failure (most common: PyPI Trusted Publishing not yet configured): point to <https://pypi.org/manage/account/publishing/>.
148
+ - `develop` is now synced with `main` (back-merge done in step 15).
149
+ - Next development cycle starts on `develop` — open `## [Unreleased]` in CHANGELOG is ready.
150
+
151
+ ---
152
+
153
+ ## Critical reminders
154
+
155
+ - **NEVER** add `Co-Authored-By: Claude` (or any AI co-author) to the release commit.
156
+ - **NEVER** force-push a release tag once it's on GitHub. Ship a PATCH fix instead.
157
+ - **NEVER** `--no-verify` past hooks. Fix the underlying issue.
158
+ - **NEVER** push directly to `main` — branch protection will reject it. Always use a PR.
159
+ - If quality gates fail at step 4, **STOP**. Surface the failures to the user.
160
+ - If doc-review fails at step 10, **STOP**. Fix before committing.
161
+
162
+ ---
163
+
164
+ ## See also
165
+
166
+ - [RELEASE.md](../../../RELEASE.md) — full release protocol, prerelease policy, and checklist
167
+ - [README § Releases](../../../README.md#releases) — release policy and cadence
168
+ - [PLAN § Phase 5](../../../PLAN.md#phase-5--public-alpha-release-on-pypi) — first-release exit criteria
@@ -0,0 +1,118 @@
1
+ ---
2
+ phase: phase-b-video-download
3
+ task: 0
4
+ total_tasks: 6
5
+ status: ready_to_execute
6
+ last_updated: 2026-05-20T16:22:15.971Z
7
+ ---
8
+
9
+ <current_state>
10
+ Plan written and saved. No code written yet. Ready to execute Task 1 of 6.
11
+
12
+ Branch: develop (clean, up-to-date after back-merge of main v0.7.0)
13
+ Plan file: docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md
14
+ </current_state>
15
+
16
+ <completed_work>
17
+
18
+ This session (prior to plan writing):
19
+ - v0.7.0 release protocol fixed: new /gflow:release (16 steps) with branch-protection-aware push, doc-review gate, back-merge step
20
+ - New /gflow:doc-review skill created at .claude/commands/gflow/doc-review.md
21
+ - PR #34 merged to develop; back-merge main (v0.7.0) → develop done (d012bcd)
22
+ - Memory items D and F in phase-b-followups.md marked resolved
23
+ - develop is fully clean and synced with main
24
+
25
+ Plan tasks (NOT YET STARTED — all 6 remain):
26
+ - Task 1: VideoResult dataclass in api/video.py
27
+ - Task 2: _download_video helper on VideoGenerationMixin
28
+ - Task 3: generate_video returns VideoResult, gains download=True param
29
+ - Task 4: FlowApiClient.download_video wraps self.download()
30
+ - Task 5: gflow video t2v CLI restored (--aspect / --profile / --out-dir)
31
+ - Task 6: CHANGELOG entries
32
+ </completed_work>
33
+
34
+ <remaining_work>
35
+
36
+ All 6 plan tasks. Execute in order — each has TDD steps (RED→GREEN→commit).
37
+
38
+ Task 1: VideoResult dataclass
39
+ - Add to src/gflow_cli/api/video.py after VideoStatus
40
+ - Test in tests/api/test_video.py
41
+
42
+ Task 2: _download_video on VideoGenerationMixin
43
+ - Add to src/gflow_cli/api/transports/ui_automation_video.py
44
+ - Uses page.request.get(routes.media_download_url(media_id), max_redirects=5, timeout=180_000)
45
+ - Test in tests/api/transports/test_ui_automation_video.py
46
+
47
+ Task 3: Update generate_video signature
48
+ - Add download: bool = True param
49
+ - Return type VideoStatus → VideoResult
50
+ - After _poll_video_status: if download and status.succeeded → _download_video
51
+ - Both generate_video and _generate_video_locked change signatures
52
+
53
+ Task 4: FlowApiClient.download_video
54
+ - 3-line wrapper: return await self.download(media_id, out_path)
55
+ - Add after download_image in src/gflow_cli/api/client.py
56
+ - Test in tests/api/test_client.py
57
+
58
+ Task 5: cli_video.py T2V restoration
59
+ - Replace entire file content (plan has full replacement)
60
+ - Uses UiAutomationTransport directly (not FlowApiClient)
61
+ - prompt becomes required argument (was optional)
62
+ - New options: --aspect (9:16/16:9), --profile, --out-dir
63
+ - Test in tests/cli/test_cli_video.py
64
+
65
+ Task 6: CHANGELOG
66
+ - Add entries under [Unreleased]
67
+ </remaining_work>
68
+
69
+ <decisions_made>
70
+
71
+ - VideoResult(status: VideoStatus, local_path: Path | None) — new frozen dataclass,
72
+ NOT a tuple, for clean ergonomics (same pattern as GeneratedImage on image side)
73
+
74
+ - generate_video is a breaking change (VideoStatus → VideoResult return type) —
75
+ acceptable in Phase B; no external callers known
76
+
77
+ - _run_t2v uses UiAutomationTransport directly, NOT FlowApiClient —
78
+ YAGNI: FlowApiClient.generate_video wrapper deferred; transport pattern
79
+ proven by tmp/fetch_video.py
80
+
81
+ - Download uses page.request.get (Playwright, follows 302 natively) NOT httpx —
82
+ httpx _download static method is image-only and doesn't follow redirects;
83
+ video needs the 302 to GCS followed with auth context
84
+
85
+ - Aspect.from_cli() used in CLI (not a hand-rolled mapping) — already exists in
86
+ src/gflow_cli/api/video.py line 37
87
+
88
+ - Default aspect for t2v CLI: 9:16 (PORTRAIT) — matches GenerateVideoRequest default
89
+ </decisions_made>
90
+
91
+ <blockers>
92
+ None. Plan is fully self-contained and executable.
93
+ </blockers>
94
+
95
+ <context>
96
+ Phase B of gflow-cli. Phase A shipped T2V transport (generate_video on
97
+ UiAutomationTransport) in v0.7.0 but generate_video never downloaded the mp4.
98
+ This plan adds the download primitive and wires the CLI.
99
+
100
+ Key files to understand:
101
+ - src/gflow_cli/api/video.py — VideoStatus, GenerateVideoRequest, Aspect.from_cli()
102
+ - src/gflow_cli/api/transports/ui_automation_video.py — VideoGenerationMixin, generate_video, _poll_video_status
103
+ - src/gflow_cli/api/routes.py — media_download_url(media_id) → getMediaUrlRedirect URL
104
+ - src/gflow_cli/api/client.py — download() at ~line 510 (already handles the redirect)
105
+ - src/gflow_cli/cli_video.py — all stubs, full replacement planned
106
+ - tmp/fetch_video.py — throwaway proof-of-concept for the download approach
107
+
108
+ After this plan, the remaining Phase B items are:
109
+ - I2V on UiAutomationTransport (Mode.I2V raises NotImplementedError)
110
+ - R2V on UiAutomationTransport (Mode.R2V raises NotImplementedError)
111
+ - T2V portrait live verification (one credit, one run)
112
+ - Listener-miss flake investigation
113
+ </context>
114
+
115
+ <next_action>
116
+ Read docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md then
117
+ invoke superpowers:subagent-driven-development to execute Task 1.
118
+ </next_action>
@@ -75,3 +75,6 @@ samples/captured/flow_outgoing_*.json
75
75
 
76
76
  # Doc-council scratch dir (bundles + raw reviews + consensus matrix)
77
77
  .doc-council/
78
+
79
+ worktrees/
80
+
@@ -0,0 +1,8 @@
1
+ # PR #38 Review Tasks
2
+
3
+ - [x] Task 1: Worktree Initialization
4
+ - [x] Task 2: Compliance & Hygiene Check (FAILED DCO, found missing flag in _spawn_chrome)
5
+ - [x] Task 3: Functional Verification (Unit/Integration) (PASSED 680 tests)
6
+ - [x] Task 4: E2E Headless Validation (PASSED on Windows)
7
+ - [x] Task 5: Windows Regression Check (PASSED)
8
+ - [x] Task 6: Review Synthesis
@@ -7,6 +7,130 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.8.0] — 2026-05-23
11
+
12
+ > **Multi-image-prompt release + transport hardening.** Introduces the
13
+ > `gflow image batch` subcommand backed by a stay-mounted editor session,
14
+ > restores `gflow video t2v` with first-class auto-download, and ships the
15
+ > image/video mode-switch symmetry invariant that closes the historical
16
+ > "first-attempt listener-miss flake." Also clears all SonarCloud findings
17
+ > on the multi-image-prompt PR (cognitive-complexity refactors of
18
+ > `_set_count`, `parse_tsv_manifest`, and `_generate_images_batch_locked`).
19
+
20
+ ### Added
21
+
22
+ - `gflow image batch <manifest>` subcommand for batch image generation from
23
+ JSON or TSV manifests, with `--continue-on-error`. `MAX_BATCH_PROMPTS = 5`.
24
+ All prompts share one Flow project; jitter (3–7 s default) spaces the
25
+ submission clicks for anti-bot cadence, not completion wait. Closes
26
+ [#14](https://github.com/ffroliva/gflow-cli/issues/14) part 2.
27
+ - Application-layer structlog events for image-batch submission:
28
+ `image_batch.submission_attempt`, `image_batch.submission_result`,
29
+ `image_batch.row_completed`, `image_batch.inter_submission_latency_ms`.
30
+ Use these to debug Flow throttling regressions without re-instrumenting.
31
+ - `BatchPartialError` (in `errors`) — raised by fail-fast batch when
32
+ earlier prompts produced downloadable images before the failing one;
33
+ carries `partial_results` so the orchestrator can salvage them.
34
+ - `BatchIntegrityError` (in `errors`) — raised by the orchestrator when
35
+ post-download file count does not match the expected count.
36
+ - `BatchSubmissionResult` (in `api.dto`) — new transport-layer per-prompt
37
+ outcome with `project_id`, `prompt_idx`, `prompt_hash` fields. Public
38
+ `list[BatchOutcome]` orchestrator return is unchanged.
39
+ - `ui_automation.image_mode_entered` structlog event — emitted when the
40
+ editor is switched into Image mode. Companion to the existing
41
+ `ui_automation_video.video_mode_entered`.
42
+ - `ui_automation.orphaned_project_warning` structlog event — emitted when
43
+ `_enter_editor` succeeded but a later setup step
44
+ (`_dismiss_blocking_overlays` / `_switch_to_image_mode`) raises, so the
45
+ user can find their server-side project record.
46
+ - `ui_automation.batch_403_body` structlog event — emitted (warning level)
47
+ with a 200-char body prefix when a `batchGenerateImages` response is HTTP
48
+ 403 (WAF / reCAPTCHA), immediately before the `WafRejectionError` raise.
49
+ - `VideoResult` dataclass — return type of `generate_video`, carries
50
+ `status` and `local_path` ([#29](https://github.com/ffroliva/gflow-cli/issues/29)).
51
+ - `UiAutomationTransport._download_video` — downloads a generated mp4 via
52
+ `media.getMediaUrlRedirect` using the authenticated page; falls back to
53
+ `self._out_dir` then `tmp/` when no `out_dir` is supplied
54
+ ([#29](https://github.com/ffroliva/gflow-cli/issues/29)).
55
+ - `FlowApiClient.download_video(media_id, out_path)` — public API, mirrors
56
+ `download_image` ([#29](https://github.com/ffroliva/gflow-cli/issues/29)).
57
+ - `gflow video t2v PROMPT` restored — generates and downloads a video
58
+ end-to-end on `UiAutomationTransport`; supports `--aspect`
59
+ (`9:16` / `16:9`), `--profile`, and `--out-dir`
60
+ ([#29](https://github.com/ffroliva/gflow-cli/issues/29)).
61
+ - `UiAutomationTransport._switch_to_image_mode` static method + module-level
62
+ `IMAGE_TAB_IN_MENU_SELECTORS` cascade — mirror of the video side's
63
+ `_switch_to_video_mode`. Called from both `generate_images` and
64
+ `_generate_images_batch_locked` after `_dismiss_blocking_overlays`,
65
+ before `_configure_generation_settings`.
66
+
67
+ ### Changed
68
+
69
+ - `gflow image batch` editor session is now persistent across all prompts
70
+ in a batch. The transport's stay-mounted-session pattern is the
71
+ canonical shape; same-project semantics are the only supported mode.
72
+ - `_attach_batch_response_listener` now returns `(captured, detach_fn)`;
73
+ callers that used the single-list return need to unpack accordingly.
74
+ - `UiAutomationTransport.generate_video` now accepts `download: bool = True`
75
+ and returns `VideoResult` instead of `VideoStatus` — **breaking change
76
+ for direct transport callers** (the `FlowApiClient` boundary is
77
+ unaffected). Pass `download=False` to skip the auto-download step.
78
+ - `_set_count` (count-tab selector) is locale-invariant: regex
79
+ `^(1x|x[2-4])$` (Flow renders digit+x identically in every locale) +
80
+ positional `.nth(count - 1)` fallback when read-back text is
81
+ unrecognised. Partial fix for
82
+ [#24](https://github.com/ffroliva/gflow-cli/issues/24); `ONBOARDING_SELECTORS`
83
+ still localized text — see KNOWN_ISSUES.
84
+
85
+ ### Fixed
86
+
87
+ - `gflow image t2i` and `gflow image batch` now explicitly select Image
88
+ mode in the Flow editor before submitting. Previously, if the account
89
+ was last in Video mode, prompts were silently routed to the video
90
+ endpoint — no `batchGenerateImages` response was observed and the
91
+ listener timed out after 3 minutes. Also resolves the historical
92
+ "first-attempt listener-miss flake" recorded in `phase-b-followups`
93
+ memory item #1. Live-verified on profile `ffroliva` (1 t2i shot + full
94
+ batch e2e); evidence in
95
+ [`docs/LIVE_VERIFICATION_image_batch.md`](docs/LIVE_VERIFICATION_image_batch.md)
96
+ § Post-mode-switch-fix verification.
97
+ - `gflow image batch` now actually shares one Flow project across all
98
+ prompts in a batch. Previously the `--same-project=1` flag was a no-op
99
+ at the `ui_automation` transport layer; each prompt landed in its own
100
+ Flow project. ([spec](docs/superpowers/specs/2026-05-22-stay-mounted-batch-session-design.md))
101
+ - `gflow image t2i -n N` now makes one transport call using Flow's native
102
+ xN count selector instead of fanning out N parallel single-image
103
+ submissions. Closes [#14](https://github.com/ffroliva/gflow-cli/issues/14) part 1.
104
+ - Structlog now uses `cache_logger_on_first_use=False` so per-test
105
+ `LogCapture` fixtures see events fired from production modules
106
+ (previously the cached logger froze the processor chain at import).
107
+ - All SonarCloud findings on the multi-image-prompt PR (S5655 / S5890 /
108
+ S1192 / S1172 / S3776 ×3) — see PR #40 commit `a0cb010` for the
109
+ cognitive-complexity refactors and the cast+pragma pattern for
110
+ `dataclasses.replace`.
111
+
112
+ ### Removed
113
+
114
+ - **BREAKING:** `--same-project` flag on `gflow image batch`. The flag
115
+ collapsed to a single behaviour (always-same-project) — no toggle
116
+ remains. For different-project results, loop `gflow image t2i`
117
+ externally.
118
+ - **BREAKING:** `--seed` flag from `gflow image t2i` and `gflow image i2i`.
119
+ The flag was a no-op under the active UI transport since v0.7.0
120
+ (silently discarded inside the client before reaching the transport).
121
+ If reproducibility via user-controlled seed becomes possible again —
122
+ either through Flow UI exposing a seed control or via HTTP transport
123
+ revival — the surface will be re-introduced at that layer. The
124
+ wire-format body builder retains its `seed` / `batch_id` parameters for
125
+ the experimental HTTP transports' internal use.
126
+ - **BREAKING (library):** `FlowApiClient.generate_image` no longer accepts
127
+ `seed=` or `batch_id=` kwargs. `FlowApiClient.generate_images_batch` no
128
+ longer accepts `seeds=`. Callers passing these will get a `TypeError`.
129
+ Same justification as the CLI removal.
130
+ - **BREAKING (library):** `project_title` parameter removed from
131
+ `run_manifest_image_batch` — the transport now owns project creation
132
+ via `_enter_editor`, making this orchestrator-side knob dead weight.
133
+
10
134
  ## [0.7.0] — 2026-05-20
11
135
 
12
136
  > **Downstream-worker ergonomics release.** Hardens `FlowApiClient` for
@@ -685,7 +809,8 @@ shell-script template that branches on these codes.
685
809
 
686
810
  First skeleton. Not functional end-to-end yet.
687
811
 
688
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.7.0...HEAD
812
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.8.0...HEAD
813
+ [0.8.0]: https://github.com/ffroliva/gflow-cli/compare/v0.7.0...v0.8.0
689
814
  [0.7.0]: https://github.com/ffroliva/gflow-cli/compare/v0.6.0a6...v0.7.0
690
815
  [0.6.0a6]: https://github.com/ffroliva/gflow-cli/compare/v0.6.0a5...v0.6.0a6
691
816
  [0.6.0a5]: https://github.com/ffroliva/gflow-cli/compare/v0.6.0a4...v0.6.0a5
@@ -19,13 +19,13 @@
19
19
 
20
20
  ## Active phase
21
21
 
22
- **Phase A Video T2V DONE (PR #23, merged 2026-05-20 to `develop`).** `UiAutomationTransport.generate_video(T2V)` orchestrates the Flow video editor end-to-end via Playwright UI mimicry the underlying HTTP video path returns 401 from `aisandbox-pa` and was retired. I2V and R2V raise `NotImplementedError` (deferred to Phase B). Companion PRs landed the onboarding-bypass (#27), changelog-overlay dismiss (#28), and signed-tag release verification (#30).
22
+ **v0.7.0 SHIPPED on PyPI (2026-05-20).** First stable (non-`aN`) release. Downstream-worker ergonomics release: `out_dir` plumbing, `health_check()`, optional `project_id`, `BrowserSessionClosedError` (#16 + #18); auth hardening (#15 + #17); overlay-dismiss (#26); 1:1 aspect-ratio cascade; signed-tag CI gate (#30); listener instrumentation. Image generation end-to-end live-verified on `ui_automation` across four aspect ratios (`9:16`, `16:9`, `1:1`, `4:3`) see [`docs/LIVE_VERIFICATION_v0.7.0.md`](docs/LIVE_VERIFICATION_v0.7.0.md). The historical `aisandbox-pa` 401 is RESOLVED in v0.7.0 (KNOWN_ISSUES `## Resolved`).
23
23
 
24
- **Active backlog → Phase B.** See the Phase B follow-ups (project memory, run `/gflow:plan` for current detail) and these GitHub issues:
25
- - [#29](https://github.com/ffroliva/gflow-cli/issues/29) first-class video download (mirror the image-side `download_image` pattern)
26
- - Image-gen 401 live validation (was the bypass branch's whole reason never confirmed e2e)
27
- - CLI restoration: `gflow video t2v/i2v/batch` are currently stubbed
28
- - I2V then R2V on `UiAutomationTransport`
24
+ **Active backlog → Phase B (video CLI).** Phase A (T2V transport, PR #23) shipped with v0.7.0. PR #36 (merged 2026-05-21) restored `gflow video t2v` with first-class video download ([#29](https://github.com/ffroliva/gflow-cli/issues/29) — CLOSED), `VideoResult`, and `FlowApiClient.download_video`; both `9:16` and `16:9` live-verified on profile `ffroliva` (see [`docs/LIVE_VERIFICATION_video_download.md`](docs/LIVE_VERIFICATION_video_download.md)). Remaining Phase B work:
25
+ - I2V (image-to-video) on `UiAutomationTransport` (`Mode.I2V` still raises `NotImplementedError`); then R2V
26
+ - Restore `gflow video i2v` and `gflow video batch` (currently stubbed with "not yet available")
27
+ - Parameterized live e2e under `tests/e2e/test_video_t2v_e2e.py` mirroring the image-side e2e
28
+ - v0.7.0 follow-ups still open: first-attempt listener-miss flake, signed-tag CI auto-signing (sigstore `gitsign`), and the `/gflow:release` doc bridge for the develop→main flow
29
29
 
30
30
  Run `/gflow:plan` for the current detailed plan if a superpowers plan is active.
31
31