gflow-cli 0.6.0a6__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 (258) hide show
  1. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.claude/README.md +8 -3
  2. gflow_cli-0.8.0/.claude/commands/gflow/changelog.md +21 -0
  3. gflow_cli-0.8.0/.claude/commands/gflow/check.md +48 -0
  4. gflow_cli-0.8.0/.claude/commands/gflow/doc-review.md +137 -0
  5. gflow_cli-0.8.0/.claude/commands/gflow/known-issues.md +20 -0
  6. gflow_cli-0.8.0/.claude/commands/gflow/plan.md +39 -0
  7. gflow_cli-0.8.0/.claude/commands/gflow/release.md +168 -0
  8. gflow_cli-0.8.0/.continue-here.md +118 -0
  9. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.github/CODEOWNERS +1 -0
  10. gflow_cli-0.8.0/.github/PULL_REQUEST_TEMPLATE.md +20 -0
  11. gflow_cli-0.8.0/.github/copilot-instructions.md +24 -0
  12. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.github/workflows/ci.yml +16 -8
  13. gflow_cli-0.8.0/.github/workflows/external-pr-triage.yml +126 -0
  14. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.github/workflows/release.yml +18 -3
  15. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.gitignore +3 -0
  16. gflow_cli-0.8.0/.planning/todos/pending/pr-38-review.md +8 -0
  17. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/CHANGELOG.md +179 -1
  18. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/CLAUDE.md +22 -18
  19. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/CONTRIBUTING.md +33 -5
  20. gflow_cli-0.8.0/KNOWN_ISSUES.md +425 -0
  21. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/PKG-INFO +41 -51
  22. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/PLAN.md +85 -8
  23. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/README.md +40 -50
  24. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/RELEASE.md +2 -2
  25. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/ARCHITECTURE.md +1 -0
  26. gflow_cli-0.8.0/docs/DEBUGGING.md +196 -0
  27. gflow_cli-0.8.0/docs/DEVELOPMENT.md +125 -0
  28. gflow_cli-0.8.0/docs/GITHUB.md +139 -0
  29. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/INDEX.md +31 -0
  30. gflow_cli-0.8.0/docs/LIVE_VERIFICATION_image_batch.md +355 -0
  31. gflow_cli-0.8.0/docs/LIVE_VERIFICATION_v0.7.0.md +110 -0
  32. gflow_cli-0.8.0/docs/LIVE_VERIFICATION_video_download.md +97 -0
  33. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/USAGE.md +123 -17
  34. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/USER_GUIDE.md +87 -0
  35. gflow_cli-0.8.0/docs/superpowers/2026-05-17-issue-15-handover.md +59 -0
  36. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-17-e2e-test-coverage.md +463 -0
  37. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-17-issue-15-auth-verification-fix.md +1449 -0
  38. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-17-issue-15-i2v-bearer-auth.md +811 -0
  39. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-17-issue-15-orchestration.md +118 -0
  40. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-18-video-phase0-submit-spike.md +697 -0
  41. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-19-video-phase-a-execution-state.md +64 -0
  42. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-19-video-phase-a-orchestration.md +164 -0
  43. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-19-video-phase-a-t2v.md +2083 -0
  44. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md +784 -0
  45. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-21-multi-image-prompt-orchestration.md +632 -0
  46. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-21-multi-image-prompt.md +2410 -0
  47. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-22-pr-38-review.md +107 -0
  48. gflow_cli-0.8.0/docs/superpowers/plans/2026-05-22-stay-mounted-batch-session-plan.md +1907 -0
  49. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-17-e2e-test-coverage-design.md +190 -0
  50. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-17-i2v-uploadimage-401-bearer-auth-design.md +330 -0
  51. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-17-issue-15-auth-verification-fix-design.md +485 -0
  52. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-17-issue-15-root-cause-findings.md +87 -0
  53. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-18-ui-automation-video-generation-design.md +739 -0
  54. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-21-multi-image-prompt-design.md +457 -0
  55. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-22-pr-38-review-design.md +40 -0
  56. gflow_cli-0.8.0/docs/superpowers/specs/2026-05-22-stay-mounted-batch-session-design.md +389 -0
  57. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/pyproject.toml +2 -1
  58. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/02_batchAsyncGenerateVideoText.json +3 -3
  59. gflow_cli-0.8.0/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +144 -0
  60. gflow_cli-0.8.0/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +136 -0
  61. gflow_cli-0.8.0/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +90 -0
  62. gflow_cli-0.8.0/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +97 -0
  63. gflow_cli-0.8.0/scripts/dev/active_plan.py +188 -0
  64. gflow_cli-0.8.0/scripts/dev/monitor_pr_38.py +37 -0
  65. gflow_cli-0.8.0/scripts/smoke_video_editor.py +874 -0
  66. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/__init__.py +1 -1
  67. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/__init__.py +1 -3
  68. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/client.py +197 -183
  69. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/dto.py +16 -62
  70. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/recaptcha.py +1 -1
  71. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/base.py +2 -2
  72. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/bearer.py +4 -1
  73. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +11 -2
  74. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +4 -1
  75. gflow_cli-0.8.0/src/gflow_cli/api/transports/ui_automation.py +1776 -0
  76. gflow_cli-0.8.0/src/gflow_cli/api/transports/ui_automation_video.py +543 -0
  77. gflow_cli-0.8.0/src/gflow_cli/api/video.py +168 -0
  78. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/internal_chromium.py +57 -23
  79. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/real_chrome.py +62 -34
  80. gflow_cli-0.8.0/src/gflow_cli/auth/verification.py +229 -0
  81. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/browser_manager.py +1 -0
  82. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/cli_image.py +146 -52
  83. gflow_cli-0.8.0/src/gflow_cli/cli_video.py +153 -0
  84. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/errors.py +123 -4
  85. gflow_cli-0.8.0/src/gflow_cli/exceptions.py +25 -0
  86. gflow_cli-0.8.0/src/gflow_cli/image_batch.py +877 -0
  87. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/observability.py +1 -1
  88. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tasks/lessons.md +34 -0
  89. gflow_cli-0.8.0/test_assets/sample_batch.json +5 -0
  90. gflow_cli-0.8.0/test_assets/sample_batch.tsv +3 -0
  91. gflow_cli-0.8.0/test_assets/sample_batch_invalid.tsv +4 -0
  92. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_client.py +102 -2
  93. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_client_image.py +178 -224
  94. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_dto.py +56 -36
  95. gflow_cli-0.8.0/tests/api/test_video.py +236 -0
  96. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_ui_automation.py +853 -4
  97. gflow_cli-0.8.0/tests/api/transports/test_ui_automation_batch.py +1169 -0
  98. gflow_cli-0.8.0/tests/api/transports/test_ui_automation_image_mode.py +177 -0
  99. gflow_cli-0.8.0/tests/api/transports/test_ui_automation_video.py +452 -0
  100. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/auth/strategies/test_strategies.py +128 -50
  101. gflow_cli-0.8.0/tests/auth/test_verification.py +301 -0
  102. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/cli/test_cli_image.py +57 -13
  103. gflow_cli-0.8.0/tests/cli/test_cli_image_seed_removed.py +31 -0
  104. gflow_cli-0.8.0/tests/cli/test_cli_video.py +68 -0
  105. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/cli/test_error_handling.py +17 -1
  106. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/cli/test_t2i_multi_prompt.py +0 -9
  107. gflow_cli-0.8.0/tests/e2e/conftest.py +67 -0
  108. gflow_cli-0.8.0/tests/e2e/test_auth_verification_e2e.py +65 -0
  109. gflow_cli-0.8.0/tests/e2e/test_image_batch_e2e.py +205 -0
  110. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/e2e/test_transports_e2e.py +72 -0
  111. gflow_cli-0.8.0/tests/e2e/test_video_t2v_e2e.py +139 -0
  112. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/conftest.py +0 -2
  113. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/test_image_steps.py +0 -1
  114. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/test_step_collision_guard.py +2 -4
  115. gflow_cli-0.8.0/tests/image_batch/test_image_manifest.py +384 -0
  116. gflow_cli-0.8.0/tests/image_batch/test_observability_events.py +185 -0
  117. gflow_cli-0.8.0/tests/smoke/__init__.py +0 -0
  118. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_errors.py +66 -0
  119. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/uv.lock +89 -0
  120. gflow_cli-0.6.0a6/.claude/commands/release.md +0 -97
  121. gflow_cli-0.6.0a6/KNOWN_ISSUES.md +0 -198
  122. gflow_cli-0.6.0a6/scripts/smoke_e2e.py +0 -78
  123. gflow_cli-0.6.0a6/src/gflow_cli/api/transports/ui_automation.py +0 -871
  124. gflow_cli-0.6.0a6/src/gflow_cli/api/video.py +0 -112
  125. gflow_cli-0.6.0a6/src/gflow_cli/cli_video.py +0 -341
  126. gflow_cli-0.6.0a6/src/gflow_cli/image_batch.py +0 -442
  127. gflow_cli-0.6.0a6/tests/api/test_client_generate_video.py +0 -93
  128. gflow_cli-0.6.0a6/tests/api/test_video.py +0 -83
  129. gflow_cli-0.6.0a6/tests/features/test_video_steps.py +0 -253
  130. gflow_cli-0.6.0a6/tests/features/video.feature +0 -27
  131. gflow_cli-0.6.0a6/tests/test_cli_video.py +0 -220
  132. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.env.template +0 -0
  133. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.gitattributes +0 -0
  134. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.github/dependabot.yml +0 -0
  135. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.gitleaks.toml +0 -0
  136. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.planning/todos/pending/2026-05-11-add-project-logo-and-docs-site-promotion-plan.md +0 -0
  137. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.pre-commit-config.yaml +0 -0
  138. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.secrets.baseline +0 -0
  139. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/CONFIGURATION.md +0 -0
  140. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/DISCLAIMER.md +0 -0
  141. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/LICENSE +0 -0
  142. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/AUTHENTICATION.md +0 -0
  143. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/CONFIGURATION.md +0 -0
  144. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/SECURITY.md +0 -0
  145. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/assets/example-run.gif +0 -0
  146. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-image-mvp-orchestration.md +0 -0
  147. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-image-mvp.md +0 -0
  148. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-video-mvp-orchestration.md +0 -0
  149. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-video-mvp.md +0 -0
  150. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening-orchestration.md +0 -0
  151. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening.md +0 -0
  152. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/2026-05-14-shell-multi-prompt-orchestration.md +0 -0
  153. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_ARCH.md +0 -0
  154. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_SEC_UX.md +0 -0
  155. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_CODE.md +0 -0
  156. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_GEMINI.md +0 -0
  157. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_SECURITY.md +0 -0
  158. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_PYTHON.md +0 -0
  159. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_SECURITY.md +0 -0
  160. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN.md +0 -0
  161. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_CODE.md +0 -0
  162. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_FOLLOWUP.md +0 -0
  163. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_PLANNER.md +0 -0
  164. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY.md +0 -0
  165. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY_FOLLOWUP.md +0 -0
  166. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_FINAL_SEC_UX_VERIFIED.md +0 -0
  167. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_PLAN_SECURITY.md +0 -0
  168. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_SPEC_SECURITY.md +0 -0
  169. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/PLAN.md +0 -0
  170. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/orchestration.md +0 -0
  171. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-10-phase-4-hardening-design.md +0 -0
  172. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-14-shell-multi-prompt-design.md +0 -0
  173. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-15-auth-login-real-chrome-design.md +0 -0
  174. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -0
  175. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/README.md +0 -0
  176. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/batch_from_config.py +0 -0
  177. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/multi_prompt_t2i.py +0 -0
  178. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/sample_config.json +0 -0
  179. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/sample_prompts.txt +0 -0
  180. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/single_image_t2i.py +0 -0
  181. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/README.md +0 -0
  182. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/01_upload_image.json +0 -0
  183. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  184. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/04_archive_workflow.json +0 -0
  185. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/05_createProject.json +0 -0
  186. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/06_batchGenerateImages.json +0 -0
  187. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  188. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/ci/check_repo_hygiene.py +0 -0
  189. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/debug_editor.py +0 -0
  190. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/debug_gen_settings.py +0 -0
  191. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/debug_settings.py +0 -0
  192. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/diag_capture_flow_traffic.py +0 -0
  193. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/diag_recaptcha_mint.py +0 -0
  194. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/record_demo.ps1 +0 -0
  195. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/smoke_image.py +0 -0
  196. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/smoke_real_chrome_image.py +0 -0
  197. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/smoke_worker_style.py +0 -0
  198. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/verify_chrome_auth_viability.py +0 -0
  199. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/skills/README.md +0 -0
  200. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/skills/gflow-cli/SKILL.md +0 -0
  201. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/sonar-project.properties +0 -0
  202. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/__main__.py +0 -0
  203. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/_cli_helpers.py +0 -0
  204. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/_retry.py +0 -0
  205. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/image.py +0 -0
  206. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/routes.py +0 -0
  207. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  208. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/_common.py +0 -0
  209. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  210. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  211. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/__init__.py +0 -0
  212. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/base.py +0 -0
  213. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/factory.py +0 -0
  214. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/strategies.py +0 -0
  215. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/cli.py +0 -0
  216. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/cli_run.py +0 -0
  217. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/config.py +0 -0
  218. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/manifest.py +0 -0
  219. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/paths.py +0 -0
  220. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/profile_store.py +0 -0
  221. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/__init__.py +0 -0
  222. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/__init__.py +0 -0
  223. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_concurrency.py +0 -0
  224. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_image.py +0 -0
  225. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_image_dto.py +0 -0
  226. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_recaptcha.py +0 -0
  227. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_retry.py +0 -0
  228. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_routes.py +0 -0
  229. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/__init__.py +0 -0
  230. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_base.py +0 -0
  231. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_bearer.py +0 -0
  232. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_common.py +0 -0
  233. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  234. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_factory.py +0 -0
  235. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_fingerprint.py +0 -0
  236. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_sapisidhash.py +0 -0
  237. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/auth/strategies/test_factory.py +0 -0
  238. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/cli/__init__.py +0 -0
  239. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/cli/test_cli_run.py +0 -0
  240. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/cli/test_helpers.py +0 -0
  241. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/conftest.py +0 -0
  242. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/e2e/__init__.py +0 -0
  243. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/__init__.py +0 -0
  244. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/auth.feature +0 -0
  245. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/auth_login.feature +0 -0
  246. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/image.feature +0 -0
  247. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/test_auth_login_steps.py +0 -0
  248. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/test_auth_steps.py +0 -0
  249. {gflow_cli-0.6.0a6/tests/smoke → gflow_cli-0.8.0/tests/image_batch}/__init__.py +0 -0
  250. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/smoke/test_real_flow.py +0 -0
  251. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_auth.py +0 -0
  252. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_browser_manager.py +0 -0
  253. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_config.py +0 -0
  254. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_manifest.py +0 -0
  255. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_observability.py +0 -0
  256. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_paths.py +0 -0
  257. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_profile_store.py +0 -0
  258. {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_smoke.py +0 -0
@@ -10,7 +10,12 @@ This directory holds **internal maintainer workflows** that are bundled with the
10
10
  .claude/
11
11
  ├── README.md ← this file
12
12
  └── commands/ ← repo-local slash commands
13
- └── release.md ← `/release` automates the version-bump + tag + push flow
13
+ └── gflow/ ← `/gflow:*` namespace (avoids collision with built-ins)
14
+ ├── check.md ← `/gflow:check` — hygiene + ruff + pyright + pytest
15
+ ├── plan.md ← `/gflow:plan` — show active phase / superpowers plan
16
+ ├── known-issues.md← `/gflow:known-issues` — open/mitigated items
17
+ ├── changelog.md ← `/gflow:changelog` — [Unreleased] + last tagged
18
+ └── release.md ← `/gflow:release` — full release flow (signed tags)
14
19
  ```
15
20
 
16
21
  Optional additions when needed:
@@ -25,9 +30,9 @@ Optional additions when needed:
25
30
 
26
31
  ## Adding a slash command
27
32
 
28
- Drop a Markdown file into `commands/`. Filename (without `.md`) becomes the command name. The first paragraph is the description Claude shows in `/help`. The rest is the prompt the agent executes.
33
+ Drop a Markdown file into `commands/gflow/` to add a `/gflow:<name>` command. Filename (without `.md`) becomes the command name. The first paragraph is the description Claude shows in `/help`. The rest is the prompt the agent executes. **Use the `gflow/` subdirectory** so commands stay namespaced and don't collide with Claude Code built-ins or user-global commands.
29
34
 
30
- Example: `commands/foo.md` → invoked as `/foo`.
35
+ Example: `commands/gflow/foo.md` → invoked as `/gflow:foo`.
31
36
 
32
37
  ## Adding an internal skill
33
38
 
@@ -0,0 +1,21 @@
1
+ ---
2
+ description: Show unreleased changes and last tagged version — insight into recent work.
3
+ ---
4
+
5
+ # `/gflow:changelog` — Recent changes
6
+
7
+ Read CHANGELOG.md and surface what's queued and what recently shipped.
8
+
9
+ ## Steps
10
+
11
+ 1. Read [CHANGELOG.md](../../../CHANGELOG.md)
12
+ 2. Return:
13
+ - All entries under `## [Unreleased]` (empty = nothing queued yet)
14
+ - The most recent versioned section (last tagged release) for comparison
15
+ 3. One-line summary: "X features, Y fixes queued since vZ."
16
+
17
+ ## When to call
18
+
19
+ - Before cutting a release (called automatically by `/gflow:release` as its first step)
20
+ - When you need a quick picture of recent work without opening the file
21
+ - When writing a commit message and unsure if a change is user-visible enough to log
@@ -0,0 +1,48 @@
1
+ ---
2
+ description: Auto-fix lint and formatting, then report types and tests. Run before every commit.
3
+ ---
4
+
5
+ # `/gflow:check` — Quality gates
6
+
7
+ Run in order. Stop and report if a step fails after the fix pass.
8
+
9
+ ## Steps
10
+
11
+ **1. Repo hygiene** (read-only — checks tmp/ output rule, secret files, etc.)
12
+
13
+ ```bash
14
+ PYTHONUTF8=1 uv run python scripts/ci/check_repo_hygiene.py
15
+ ```
16
+
17
+ **2. Auto-fix lint and formatting** (rewrites files in place)
18
+
19
+ ```bash
20
+ uv run ruff check --fix src tests
21
+ uv run ruff format src tests
22
+ ```
23
+
24
+ Report which files were modified. Do NOT stage or commit — leave the diff for review.
25
+
26
+ **3. Type check** (report only — cannot auto-fix)
27
+
28
+ ```bash
29
+ uv run pyright src
30
+ ```
31
+
32
+ **4. Tests + coverage** (report only)
33
+
34
+ ```bash
35
+ uv run pytest -q --cov=gflow_cli --cov-fail-under=80
36
+ ```
37
+
38
+ ## Output
39
+
40
+ - List files changed by the fix pass (empty = nothing needed fixing)
41
+ - All pyright errors with `file:line` references
42
+ - Pytest summary line and coverage percentage
43
+ - Final verdict: all gates pass / which gates failed
44
+
45
+ ## Notes
46
+
47
+ Ruff fix and format may rewrite multiple files. Always `git diff` before staging.
48
+ Pyright errors and test failures require manual intervention — do not attempt silent workarounds.
@@ -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,20 @@
1
+ ---
2
+ description: Surface open known issues. Call before touching auth, reCAPTCHA, or anything previously flagged.
3
+ ---
4
+
5
+ # `/gflow:known-issues` — Open issues
6
+
7
+ Read KNOWN_ISSUES.md and return items that are still open or mitigated (not resolved).
8
+
9
+ ## Steps
10
+
11
+ 1. Read [KNOWN_ISSUES.md](../../../KNOWN_ISSUES.md)
12
+ 2. Return only items with status **open** or **mitigated**
13
+ 3. Flag any that are relevant to the current task context
14
+
15
+ ## When to call
16
+
17
+ - Before touching `src/gflow_cli/auth.py`
18
+ - Before touching `src/gflow_cli/api/recaptcha.py`
19
+ - Before any work the user flags as "this felt flaky before"
20
+ - When a test or behaviour feels unexpectedly broken
@@ -0,0 +1,39 @@
1
+ ---
2
+ description: Show the active plan — next task if a superpowers plan is running, current phase otherwise.
3
+ ---
4
+
5
+ # `/gflow:plan` — Active plan
6
+
7
+ ## Steps
8
+
9
+ **1. Check conversation context.**
10
+
11
+ Has the user mentioned a specific feature or invoked the write-plan skill in this session?
12
+ If yes, note the feature name (e.g. `shell-multi-prompt`, `image-mvp`, `phase-4-hardening`).
13
+
14
+ **2. Run the discovery script.**
15
+
16
+ With a feature name identified in step 1:
17
+ ```bash
18
+ uv run python scripts/dev/active_plan.py --feature <feature-name>
19
+ ```
20
+
21
+ Without a feature name (uses most-recent superpowers plan, falls back to PLAN.md):
22
+ ```bash
23
+ uv run python scripts/dev/active_plan.py
24
+ ```
25
+
26
+ **3. Return the output verbatim.**
27
+
28
+ The script already filters to the relevant block. Do not read additional files.
29
+
30
+ ## What the script returns
31
+
32
+ - **Superpowers plan active:** file path, title, goal, progress (X/N steps), and the next unchecked task block
33
+ - **No superpowers plan:** the first incomplete phase from `PLAN.md` (scope, sequence, definition of done)
34
+
35
+ ## When to call
36
+
37
+ - When starting a task and unsure what's in scope
38
+ - When the user asks "what are we working on?" or "what's next?"
39
+ - Before adding a feature, to check it belongs to the current scope
@@ -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>
@@ -20,3 +20,4 @@
20
20
 
21
21
  # Auth handling — sensitive, never bypass review
22
22
  /src/gflow_cli/auth.py @ffroliva
23
+ /src/gflow_cli/auth/ @ffroliva
@@ -0,0 +1,20 @@
1
+ ## Summary
2
+
3
+ <!-- What changed and why? Link issues with "Fixes #123" when applicable. -->
4
+
5
+ ## Validation
6
+
7
+ <!-- List the focused commands you ran, plus any checks you could not run. -->
8
+
9
+ - [ ] Focused tests added or updated for behavior changes
10
+ - [ ] `uv run ruff check src tests`
11
+ - [ ] `uv run pyright src`
12
+ - [ ] Relevant pytest command:
13
+
14
+ ## Contribution Checklist
15
+
16
+ - [ ] This PR targets `develop`, unless it is a release or emergency fix
17
+ - [ ] My commits use my real Git identity or GitHub noreply email
18
+ - [ ] External contribution commits include `Signed-off-by:` (`git commit -s`)
19
+ - [ ] I did not include secrets, cookies, account tokens, signed URLs, or private captured data
20
+ - [ ] I reviewed any AI-assisted changes before submitting
@@ -0,0 +1,24 @@
1
+ # Copilot Code Review Instructions
2
+
3
+ Review this repository as a Python CLI that automates browser-authenticated
4
+ Google Flow workflows. Treat auth, browser automation, CI, release, and secret
5
+ handling changes as high-risk even when the diff is small.
6
+
7
+ For pull request reviews:
8
+
9
+ - Check that PRs target `develop`, unless they are release PRs.
10
+ - Flag unclear contributor provenance, missing DCO sign-off, placeholder author
11
+ emails, and any copied private data.
12
+ - Look for leaked tokens, cookies, signed URLs, local profile paths, and captured
13
+ Google/Flow request data.
14
+ - For auth/browser changes, check that the implementation preserves profile
15
+ isolation, does not weaken local path boundaries, and avoids remote debugging
16
+ unless explicitly documented.
17
+ - For CI changes, check forked-PR secret behavior and avoid recommending
18
+ `pull_request_target` for jobs that checkout or execute contributor code.
19
+ - For behavior changes, expect focused tests and docs/changelog updates.
20
+ - Keep findings concrete: reference files/lines, explain the user-visible risk,
21
+ and separate blocking issues from cosmetic suggestions.
22
+
23
+ Do not approve pull requests. Copilot review is advisory; maintainer approval is
24
+ still required.