gflow-cli 0.9.1__tar.gz → 0.10.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 (337) hide show
  1. gflow_cli-0.10.0/.claude/commands/gflow/branch-review.md +13 -0
  2. gflow_cli-0.10.0/.claude/commands/gflow/pr-council-review.md +11 -0
  3. gflow_cli-0.10.0/.claude/commands/gflow/predict.md +19 -0
  4. gflow_cli-0.10.0/.claude/commands/gflow/scenario.md +23 -0
  5. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.env.template +28 -0
  6. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.github/PULL_REQUEST_TEMPLATE.md +2 -0
  7. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.github/workflows/ci.yml +7 -2
  8. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.github/workflows/release.yml +2 -1
  9. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.gitignore +2 -0
  10. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/AGENTS.md +4 -2
  11. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/CHANGELOG.md +177 -1
  12. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/CONTRIBUTING.md +27 -3
  13. gflow_cli-0.10.0/GEMINI.md +27 -0
  14. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/KNOWN_ISSUES.md +27 -0
  15. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/PKG-INFO +13 -3
  16. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/PLAN.md +2 -1
  17. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/README.md +6 -2
  18. gflow_cli-0.10.0/conftest.py +48 -0
  19. gflow_cli-0.10.0/docker-compose.yml +47 -0
  20. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/AGENT_GUIDE.md +15 -1
  21. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/ARCHITECTURE.md +12 -8
  22. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/AUTHENTICATION.md +121 -5
  23. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/CONFIGURATION.md +73 -4
  24. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/DATA_LAYER.md +75 -11
  25. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/DEVELOPMENT.md +7 -0
  26. gflow_cli-0.10.0/docs/E2E_TESTING.md +272 -0
  27. gflow_cli-0.10.0/docs/EXTERNAL_STORAGE.md +140 -0
  28. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/GITHUB.md +38 -0
  29. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/INDEX.md +9 -1
  30. gflow_cli-0.10.0/docs/LIVE_VERIFICATION_v0.10.0.md +95 -0
  31. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/PROJECT_STATUS.md +8 -2
  32. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/SECURITY.md +29 -2
  33. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/USAGE.md +103 -5
  34. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/USER_GUIDE.md +70 -1
  35. gflow_cli-0.10.0/docs/superpowers/specs/2026-05-27-public-event-surface-design.md +397 -0
  36. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/llms.txt +1 -0
  37. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/pyproject.toml +37 -2
  38. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/ci/check_doc_links.py +13 -0
  39. gflow_cli-0.10.0/scripts/dev/capture_locale_invariants.py +235 -0
  40. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/skills/README.md +8 -0
  41. gflow_cli-0.10.0/skills/pr-council-review/SKILL.md +350 -0
  42. gflow_cli-0.10.0/skills/predict/SKILL.md +208 -0
  43. gflow_cli-0.10.0/skills/scenario/SKILL.md +200 -0
  44. gflow_cli-0.10.0/sonar-project.properties +54 -0
  45. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/__init__.py +1 -1
  46. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/_cli_helpers.py +32 -6
  47. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/_retry.py +7 -4
  48. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/client.py +92 -65
  49. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/dto.py +13 -7
  50. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/image.py +62 -10
  51. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/recaptcha.py +12 -3
  52. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/routes.py +2 -1
  53. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/transports/__init__.py +2 -1
  54. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/transports/_common.py +17 -9
  55. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/transports/_fingerprint.py +5 -5
  56. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/transports/base.py +5 -4
  57. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/transports/experimental/bearer.py +32 -16
  58. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +26 -12
  59. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +39 -15
  60. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/transports/ui_automation.py +176 -94
  61. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/transports/ui_automation_video.py +150 -59
  62. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/video.py +155 -59
  63. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/auth/__init__.py +5 -2
  64. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/auth/base.py +4 -2
  65. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/auth/factory.py +9 -3
  66. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/auth/internal_chromium.py +31 -10
  67. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/auth/real_chrome.py +19 -7
  68. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/auth/verification.py +18 -9
  69. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/browser_manager.py +23 -10
  70. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/cli.py +73 -7
  71. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/cli_data.py +136 -31
  72. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/cli_image.py +139 -35
  73. gflow_cli-0.10.0/src/gflow_cli/cli_models.py +121 -0
  74. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/cli_run.py +34 -16
  75. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/cli_video.py +100 -10
  76. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/config.py +34 -2
  77. gflow_cli-0.10.0/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +20 -0
  78. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/data/models.py +7 -3
  79. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/data/queries.py +119 -26
  80. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/data/recorder.py +82 -31
  81. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/data/redaction.py +2 -2
  82. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/data/repository.py +45 -16
  83. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/data/store.py +18 -9
  84. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/errors.py +16 -16
  85. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/image_batch.py +125 -50
  86. gflow_cli-0.10.0/src/gflow_cli/json_output.py +176 -0
  87. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/manifest.py +2 -1
  88. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/observability.py +13 -5
  89. gflow_cli-0.10.0/src/gflow_cli/paths.py +212 -0
  90. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/profile_store.py +68 -6
  91. gflow_cli-0.10.0/src/gflow_cli/storage.py +145 -0
  92. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/test_client.py +16 -0
  93. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/test_client_image.py +61 -0
  94. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/test_image.py +44 -0
  95. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/test_video.py +41 -5
  96. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_bearer.py +6 -2
  97. gflow_cli-0.10.0/tests/api/transports/test_transport_timeout.py +98 -0
  98. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/auth/strategies/test_strategies.py +6 -0
  99. gflow_cli-0.10.0/tests/cli/test_cli_auth_list.py +143 -0
  100. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/cli/test_cli_data.py +56 -0
  101. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/cli/test_cli_image.py +180 -3
  102. gflow_cli-0.10.0/tests/cli/test_cli_models.py +92 -0
  103. gflow_cli-0.10.0/tests/cli/test_cli_video.py +475 -0
  104. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/conftest.py +1 -0
  105. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/data/test_recorder.py +59 -0
  106. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/data/test_store_migrations.py +1 -1
  107. gflow_cli-0.10.0/tests/e2e/conftest.py +123 -0
  108. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/e2e/test_auth_verification_e2e.py +1 -1
  109. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/e2e/test_data_layer_e2e.py +10 -31
  110. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/e2e/test_image_batch_e2e.py +10 -19
  111. gflow_cli-0.10.0/tests/e2e/test_image_i2i_ref_cap_e2e.py +117 -0
  112. gflow_cli-0.10.0/tests/e2e/test_json_output_e2e.py +213 -0
  113. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/e2e/test_locale_selectors_e2e.py +1 -0
  114. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/e2e/test_transports_e2e.py +31 -129
  115. gflow_cli-0.10.0/tests/e2e/test_video_r2v_ref_cap_e2e.py +161 -0
  116. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/e2e/test_video_t2v_e2e.py +3 -31
  117. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/features/test_image_steps.py +1 -0
  118. gflow_cli-0.10.0/tests/integration/conftest.py +163 -0
  119. gflow_cli-0.10.0/tests/integration/constants.py +13 -0
  120. gflow_cli-0.10.0/tests/integration/test_storage_gcs.py +57 -0
  121. gflow_cli-0.10.0/tests/integration/test_storage_s3.py +87 -0
  122. gflow_cli-0.10.0/tests/scripts/test_capture_locale_invariants.py +77 -0
  123. gflow_cli-0.10.0/tests/smoke/__init__.py +0 -0
  124. gflow_cli-0.10.0/tests/smoke/test_profile_account_smoke.py +181 -0
  125. gflow_cli-0.10.0/tests/smoke/test_real_flow.py +118 -0
  126. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/test_cli_data.py +197 -0
  127. gflow_cli-0.10.0/tests/test_data_queries.py +613 -0
  128. gflow_cli-0.10.0/tests/test_documentation_gate.py +34 -0
  129. gflow_cli-0.10.0/tests/test_json_output.py +148 -0
  130. gflow_cli-0.10.0/tests/test_marker_registry.py +173 -0
  131. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/test_observability.py +23 -4
  132. gflow_cli-0.10.0/tests/test_paths.py +211 -0
  133. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/test_profile_store.py +50 -0
  134. gflow_cli-0.10.0/uv.lock +2477 -0
  135. gflow_cli-0.9.1/.claude/commands/gflow/pr-council-review.md +0 -265
  136. gflow_cli-0.9.1/conftest.py +0 -25
  137. gflow_cli-0.9.1/scripts/dev/capture_locale_invariants.py +0 -87
  138. gflow_cli-0.9.1/sonar-project.properties +0 -35
  139. gflow_cli-0.9.1/src/gflow_cli/paths.py +0 -107
  140. gflow_cli-0.9.1/tests/cli/test_cli_auth_list.py +0 -80
  141. gflow_cli-0.9.1/tests/cli/test_cli_video.py +0 -208
  142. gflow_cli-0.9.1/tests/e2e/conftest.py +0 -67
  143. gflow_cli-0.9.1/tests/smoke/test_real_flow.py +0 -92
  144. gflow_cli-0.9.1/tests/test_data_queries.py +0 -177
  145. gflow_cli-0.9.1/tests/test_paths.py +0 -96
  146. gflow_cli-0.9.1/uv.lock +0 -1169
  147. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.claude/README.md +0 -0
  148. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.claude/commands/gflow/changelog.md +0 -0
  149. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.claude/commands/gflow/check.md +0 -0
  150. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.claude/commands/gflow/doc-review.md +0 -0
  151. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.claude/commands/gflow/known-issues.md +0 -0
  152. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.claude/commands/gflow/plan.md +0 -0
  153. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.claude/commands/gflow/release.md +0 -0
  154. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.continue-here.md +0 -0
  155. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.gitattributes +0 -0
  156. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.github/CODEOWNERS +0 -0
  157. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.github/copilot-instructions.md +0 -0
  158. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.github/dependabot.yml +0 -0
  159. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.github/workflows/external-pr-triage.yml +0 -0
  160. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.gitleaks.toml +0 -0
  161. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.planning/todos/pending/2026-05-11-add-project-logo-and-docs-site-promotion-plan.md +0 -0
  162. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.planning/todos/pending/pr-38-review.md +0 -0
  163. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.pre-commit-config.yaml +0 -0
  164. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/.secrets.baseline +0 -0
  165. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/CLAUDE.md +0 -0
  166. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/CONFIGURATION.md +0 -0
  167. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/DISCLAIMER.md +0 -0
  168. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/LICENSE +0 -0
  169. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/RELEASE.md +0 -0
  170. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/ROADMAP.md +0 -0
  171. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/DEBUGGING.md +0 -0
  172. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  173. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  174. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  175. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  176. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  177. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  178. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  179. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/assets/example-run.gif +0 -0
  180. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/2026-05-17-issue-15-handover.md +0 -0
  181. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-09-image-mvp-orchestration.md +0 -0
  182. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-09-image-mvp.md +0 -0
  183. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-09-video-mvp-orchestration.md +0 -0
  184. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-09-video-mvp.md +0 -0
  185. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening-orchestration.md +0 -0
  186. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening.md +0 -0
  187. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/2026-05-14-shell-multi-prompt-orchestration.md +0 -0
  188. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_ARCH.md +0 -0
  189. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_SEC_UX.md +0 -0
  190. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_CODE.md +0 -0
  191. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_GEMINI.md +0 -0
  192. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_SECURITY.md +0 -0
  193. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_PYTHON.md +0 -0
  194. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_SECURITY.md +0 -0
  195. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN.md +0 -0
  196. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_CODE.md +0 -0
  197. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_FOLLOWUP.md +0 -0
  198. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_PLANNER.md +0 -0
  199. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY.md +0 -0
  200. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY_FOLLOWUP.md +0 -0
  201. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_FINAL_SEC_UX_VERIFIED.md +0 -0
  202. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_PLAN_SECURITY.md +0 -0
  203. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_SPEC_SECURITY.md +0 -0
  204. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/PLAN.md +0 -0
  205. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/orchestration.md +0 -0
  206. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-17-e2e-test-coverage.md +0 -0
  207. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-17-issue-15-auth-verification-fix.md +0 -0
  208. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-17-issue-15-i2v-bearer-auth.md +0 -0
  209. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-17-issue-15-orchestration.md +0 -0
  210. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-18-video-phase0-submit-spike.md +0 -0
  211. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-19-video-phase-a-execution-state.md +0 -0
  212. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-19-video-phase-a-orchestration.md +0 -0
  213. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-19-video-phase-a-t2v.md +0 -0
  214. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md +0 -0
  215. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-21-multi-image-prompt-orchestration.md +0 -0
  216. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-21-multi-image-prompt.md +0 -0
  217. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-22-pr-38-review.md +0 -0
  218. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-22-stay-mounted-batch-session-plan.md +0 -0
  219. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-23-locale-agnostic-selectors.md +0 -0
  220. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/plans/2026-05-24-data-layer.md +0 -0
  221. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-10-phase-4-hardening-design.md +0 -0
  222. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-14-shell-multi-prompt-design.md +0 -0
  223. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-15-auth-login-real-chrome-design.md +0 -0
  224. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-17-e2e-test-coverage-design.md +0 -0
  225. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-17-i2v-uploadimage-401-bearer-auth-design.md +0 -0
  226. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-17-issue-15-auth-verification-fix-design.md +0 -0
  227. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-17-issue-15-root-cause-findings.md +0 -0
  228. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-18-ui-automation-video-generation-design.md +0 -0
  229. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-21-multi-image-prompt-design.md +0 -0
  230. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-22-pr-38-review-design.md +0 -0
  231. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-22-stay-mounted-batch-session-design.md +0 -0
  232. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-23-locale-agnostic-selectors.md +0 -0
  233. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-23-readme-v0.8.1-refresh-design.md +0 -0
  234. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/specs/2026-05-24-data-layer-design.md +0 -0
  235. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -0
  236. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/examples/README.md +0 -0
  237. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/examples/batch_from_config.py +0 -0
  238. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/examples/multi_prompt_t2i.py +0 -0
  239. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/examples/sample_config.json +0 -0
  240. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/examples/sample_prompts.txt +0 -0
  241. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/examples/single_image_t2i.py +0 -0
  242. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/README.md +0 -0
  243. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/01_upload_image.json +0 -0
  244. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  245. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  246. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/04_archive_workflow.json +0 -0
  247. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/05_createProject.json +0 -0
  248. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/06_batchGenerateImages.json +0 -0
  249. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  250. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  251. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  252. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  253. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  254. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/ci/check_repo_hygiene.py +0 -0
  255. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/debug_editor.py +0 -0
  256. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/debug_gen_settings.py +0 -0
  257. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/debug_settings.py +0 -0
  258. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/dev/active_plan.py +0 -0
  259. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  260. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  261. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  262. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/dev/monitor_pr_38.py +0 -0
  263. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/diag_capture_flow_traffic.py +0 -0
  264. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/diag_recaptcha_mint.py +0 -0
  265. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/record_demo.ps1 +0 -0
  266. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/smoke_image.py +0 -0
  267. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/smoke_real_chrome_image.py +0 -0
  268. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/smoke_video_editor.py +0 -0
  269. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/smoke_worker_style.py +0 -0
  270. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/scripts/verify_chrome_auth_viability.py +0 -0
  271. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/skills/gflow-cli/SKILL.md +0 -0
  272. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/__main__.py +0 -0
  273. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/__init__.py +0 -0
  274. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  275. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/auth/strategies.py +0 -0
  276. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/data/__init__.py +0 -0
  277. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  278. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  279. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/src/gflow_cli/exceptions.py +0 -0
  280. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tasks/lessons.md +0 -0
  281. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/test_assets/sample_batch.json +0 -0
  282. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/test_assets/sample_batch.tsv +0 -0
  283. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/test_assets/sample_batch_invalid.tsv +0 -0
  284. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/__init__.py +0 -0
  285. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/__init__.py +0 -0
  286. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/test_concurrency.py +0 -0
  287. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/test_dto.py +0 -0
  288. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/test_image_dto.py +0 -0
  289. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/test_recaptcha.py +0 -0
  290. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/test_retry.py +0 -0
  291. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/test_routes.py +0 -0
  292. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/__init__.py +0 -0
  293. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_base.py +0 -0
  294. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_common.py +0 -0
  295. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  296. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_factory.py +0 -0
  297. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_fingerprint.py +0 -0
  298. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_sapisidhash.py +0 -0
  299. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_ui_automation.py +0 -0
  300. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  301. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  302. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  303. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/auth/strategies/test_factory.py +0 -0
  304. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/auth/test_verification.py +0 -0
  305. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/cli/__init__.py +0 -0
  306. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  307. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/cli/test_cli_run.py +0 -0
  308. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/cli/test_error_handling.py +0 -0
  309. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/cli/test_helpers.py +0 -0
  310. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  311. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/data/__init__.py +0 -0
  312. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/data/test_packaging.py +0 -0
  313. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/data/test_redaction.py +0 -0
  314. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/data/test_repository.py +0 -0
  315. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/data/test_settings_and_errors.py +0 -0
  316. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/e2e/__init__.py +0 -0
  317. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/features/__init__.py +0 -0
  318. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/features/auth.feature +0 -0
  319. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/features/auth_login.feature +0 -0
  320. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/features/conftest.py +0 -0
  321. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/features/image.feature +0 -0
  322. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/features/test_auth_login_steps.py +0 -0
  323. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/features/test_auth_steps.py +0 -0
  324. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/features/test_step_collision_guard.py +0 -0
  325. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/fixtures/__init__.py +0 -0
  326. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/fixtures/seeded_catalog.py +0 -0
  327. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/image_batch/__init__.py +0 -0
  328. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/image_batch/test_image_manifest.py +0 -0
  329. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/image_batch/test_observability_events.py +0 -0
  330. {gflow_cli-0.9.1/tests/smoke → gflow_cli-0.10.0/tests/integration}/__init__.py +0 -0
  331. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/test_auth.py +0 -0
  332. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/test_browser_manager.py +0 -0
  333. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/test_config.py +0 -0
  334. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/test_conftest_isolation.py +0 -0
  335. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/test_errors.py +0 -0
  336. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/test_manifest.py +0 -0
  337. {gflow_cli-0.9.1 → gflow_cli-0.10.0}/tests/test_smoke.py +0 -0
@@ -0,0 +1,13 @@
1
+ ---
2
+ description: Multi-dimensional LLM council review on the current local feature branch — pre-PR review. Same dimensions as `/gflow:pr-council-review` but reads `git diff <base>..HEAD` instead of a PR; never posts to GitHub. Wrapper around skills/pr-council-review/SKILL.md § 8 (branch mode).
3
+ ---
4
+
5
+ # `/gflow:branch-review [--base <ref>]`
6
+
7
+ **Read `skills/pr-council-review/SKILL.md` and follow its protocol now in BRANCH MODE (§ 8)**, passing `$ARGUMENTS` (optional `--base <ref>`; default `develop`).
8
+
9
+ > Do **not** call `Skill(skill="pr-council-review")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not registered as Skill-tool-invocable (only `.claude/commands/gflow/*` are). Invoking it errors with `Unknown skill: pr-council-review`. Read the file directly instead.
10
+
11
+ The canonical body is `skills/pr-council-review/SKILL.md`. § 8 documents branch-mode-specific behavior: pre-flight, the PR→branch translation table, `release/*` downgrade, SHA drift, and local-only output. All other phases (gather context, detect dimensions, dispatch, synthesize, report) are identical to PR mode.
12
+
13
+ Sibling: `/gflow:pr-council-review <N>` runs the same council against an open PR.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Multi-dimensional LLM council review of an open PR. Five baseline dimensions (correctness, quality, security, tests, memory-hygiene) plus adaptive per-surface dimensions. Sub-agents invoke specialized skills (security-review, code-review, verify). With no argument, lists open PRs ranked by priority. Wrapper around skills/pr-council-review/SKILL.md (canonical body).
3
+ ---
4
+
5
+ # `/gflow:pr-council-review [PR#]`
6
+
7
+ **Read `skills/pr-council-review/SKILL.md` and follow its protocol now**, treating `$ARGUMENTS` as the PR number (or empty for prioritize-mode). That file is the canonical body: preflight, dimension detection, parallel dispatch, synthesis, report.
8
+
9
+ > Do **not** call `Skill(skill="pr-council-review")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not registered as Skill-tool-invocable (only `.claude/commands/gflow/*` are). Invoking it errors with `Unknown skill: pr-council-review`. Read the file directly instead.
10
+
11
+ Sibling: `/review` is the single-agent Claude-Code built-in (fast, one-pass). Use it for spot-checks; use this command for pre-merge multi-dim audits.
@@ -0,0 +1,19 @@
1
+ ---
2
+ description: >
3
+ Pre-implementation 5-persona adversarial analysis for high-stakes gflow-cli proposals.
4
+ Produces a GO / CAUTION / STOP verdict before any code is written.
5
+ Invoke before new transports, auth changes, selector redesigns, schema migrations,
6
+ or any PLAN.md backlog item gated on an investigation step.
7
+ ---
8
+
9
+ # `/gflow:predict [proposal]`
10
+
11
+ **Read `skills/predict/SKILL.md` and follow its protocol now**, passing `$ARGUMENTS` as the proposal description.
12
+
13
+ > Do **not** call `Skill(skill="predict")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not registered as Skill-tool-invocable (only `.claude/commands/gflow/*` are). Invoking it errors with `Unknown skill: predict`. Read the file directly instead.
14
+
15
+ The skill at `skills/predict/SKILL.md` runs five independent expert personas
16
+ (Architect · Security/reCAPTCHA · Performance/Playwright · CLI UX · Devil's Advocate),
17
+ resolves conflicts, and returns a GO / CAUTION / STOP verdict with a confidence score.
18
+
19
+ **Pair with `/gflow:scenario`** after a GO or CAUTION to enumerate edge cases before EXECUTE.
@@ -0,0 +1,23 @@
1
+ ---
2
+ description: >
3
+ Pre-implementation edge-case explorer for gflow-cli features.
4
+ Decomposes a proposed change across 12 gflow-cli-specific dimensions
5
+ (WAF/reCAPTCHA, selector drift, auth lifecycle, batch resume, data layer,
6
+ cross-platform paths, error propagation, observability) and produces a
7
+ severity-ranked scenario table and BDD skeleton.
8
+ ---
9
+
10
+ # `/gflow:scenario [feature description]`
11
+
12
+ **Read `skills/scenario/SKILL.md` and follow its protocol now**, passing `$ARGUMENTS` as the feature or change description.
13
+
14
+ > Do **not** call `Skill(skill="scenario")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not registered as Skill-tool-invocable (only `.claude/commands/gflow/*` are). Invoking it errors with `Unknown skill: scenario`. Read the file directly instead.
15
+
16
+ The skill at `skills/scenario/SKILL.md` covers 12 dimensions tuned to gflow-cli's
17
+ known failure surfaces and outputs:
18
+ - A severity-ranked scenario table (Critical / High / Medium / Low)
19
+ - Must-cover acceptance criteria for the PLAN.md task
20
+ - Suggested BDD `Scenario:` blocks for `tests/features/`
21
+ - Cross-references to open KNOWN_ISSUES entries
22
+
23
+ **Typical order:** `/gflow:predict` → `/gflow:scenario` → PLAN.md task → `/gflow:check` → PR.
@@ -52,6 +52,34 @@
52
52
  # Get one at https://aistudio.google.com/apikey
53
53
  # GFLOW_CLI_GEMINI_API_KEY=
54
54
 
55
+ # -----------------------------------------------------------------------------
56
+ # Cloud storage
57
+ # -----------------------------------------------------------------------------
58
+
59
+ # Upload generated assets directly to a cloud bucket instead of saving local
60
+ # asset copies. Supported schemes:
61
+ # gs:// – Google Cloud Storage (requires: pip install 'gflow-cli[gcs]')
62
+ # s3:// – Amazon S3 or any S3-compatible store, e.g. MinIO
63
+ # (requires: pip install 'gflow-cli[s3]')
64
+ #
65
+ # Examples:
66
+ # GFLOW_CLI_STORAGE_URI=gs://my-gcs-bucket/gflow/
67
+ # GFLOW_CLI_STORAGE_URI=s3://my-s3-bucket/gflow/
68
+ # GFLOW_CLI_STORAGE_URI=s3://gflow-test/gflow/ # MinIO local dev
69
+ #
70
+ # For S3 / MinIO you also need the standard AWS SDK env vars:
71
+ # AWS_ACCESS_KEY_ID=minioadmin
72
+ # AWS_SECRET_ACCESS_KEY=minioadmin
73
+ # AWS_ENDPOINT_URL=http://localhost:9000 # omit for real AWS
74
+ # AWS_DEFAULT_REGION=us-east-1
75
+ #
76
+ # For GCS (local emulator):
77
+ # STORAGE_EMULATOR_HOST=http://localhost:4443
78
+ #
79
+ # When unset, assets are saved to GFLOW_CLI_OUTPUT_DIR (local disk). gflow-cli
80
+ # does not dual-write local + cloud copies; configure one storage target per run.
81
+ # GFLOW_CLI_STORAGE_URI=
82
+
55
83
  # -----------------------------------------------------------------------------
56
84
  # Runtime tuning
57
85
  # -----------------------------------------------------------------------------
@@ -7,6 +7,8 @@
7
7
  <!-- List the focused commands you ran, plus any checks you could not run. -->
8
8
 
9
9
  - [ ] Focused tests added or updated for behavior changes
10
+ - [ ] Documentation updated or explicitly marked not applicable
11
+ - [ ] `uv run python scripts/ci/check_doc_links.py`
10
12
  - [ ] `uv run ruff check src tests`
11
13
  - [ ] `uv run pyright src`
12
14
  - [ ] Relevant pytest command:
@@ -6,7 +6,9 @@ on:
6
6
  pull_request:
7
7
 
8
8
  env:
9
- FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
9
+ # Suppress Node.js deprecation warnings and align with user request to use Node 22/remove noise.
10
+ ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
11
+ NODE_VERSION: '22'
10
12
 
11
13
  jobs:
12
14
  # ── Security gate: runs first, on every push/PR, never skippable ──────────
@@ -44,6 +46,9 @@ jobs:
44
46
  - name: Repo hygiene (no artefacts, no hardcoded paths)
45
47
  run: uv run python scripts/ci/check_repo_hygiene.py
46
48
 
49
+ - name: Documentation links
50
+ run: uv run python scripts/ci/check_doc_links.py
51
+
47
52
  - name: Lint
48
53
  run: uv run ruff check src tests
49
54
 
@@ -94,7 +99,7 @@ jobs:
94
99
  continue-on-error: true # graceful if coverage upload was skipped
95
100
 
96
101
  - name: SonarCloud scan
97
- uses: SonarSource/sonarcloud-github-action@master
102
+ uses: SonarSource/sonarcloud-github-action@v5.0.0
98
103
  env:
99
104
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # PR decoration
100
105
  SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} # set in repo → Settings → Secrets
@@ -16,7 +16,8 @@ jobs:
16
16
  name: pypi
17
17
  url: https://pypi.org/p/gflow-cli
18
18
  env:
19
- FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
19
+ ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
20
+ NODE_VERSION: '22'
20
21
  steps:
21
22
  - uses: actions/checkout@v6
22
23
  with:
@@ -71,6 +71,8 @@ samples/captured/flow_outgoing_*.jsonl
71
71
  samples/captured/flow_outgoing_*.json
72
72
 
73
73
  # Claude Code worktrees and lock files
74
+ .claude/settings.json
75
+ .claude/settings.local.json
74
76
  .claude/worktrees/
75
77
  .claude/scheduled_tasks.lock
76
78
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Universal entry point for AI coding agents. Read this first; everything else routes from here.
4
4
 
5
- Supported tools that auto-discover this file: Cursor, Codex, Aider, Gemini CLI, Jules, Devin, Windsurf, Zed, Warp, opencode, RooCode, Amp, Junie, Phoenix, GitHub Copilot, VS Code, Factory, Augment, Semgrep, Kilo Code, UiPath. Claude Code reads [CLAUDE.md](CLAUDE.md), which cross-references this file.
5
+ Supported tools that auto-discover this file: Cursor, Codex, Aider, Jules, Devin, Windsurf, Zed, Warp, opencode, RooCode, Amp, Junie, Phoenix, GitHub Copilot, VS Code, Factory, Augment, Semgrep, Kilo Code, UiPath. Gemini CLI reads [GEMINI.md](GEMINI.md) and Claude Code reads [CLAUDE.md](CLAUDE.md), both of which cross-reference this file.
6
6
 
7
7
  ## Project at a glance
8
8
 
@@ -37,6 +37,7 @@ Run these gates in order before every commit:
37
37
  ```powershell
38
38
  $env:PYTHONUTF8=1
39
39
  uv run python scripts/ci/check_repo_hygiene.py
40
+ uv run python scripts/ci/check_doc_links.py
40
41
  uv run ruff check src tests
41
42
  uv run ruff format --check src tests
42
43
  uv run pyright src
@@ -45,8 +46,9 @@ uv run python -m pytest -q --cov=gflow_cli
45
46
 
46
47
  Or invoke the wrapper: `/gflow:check`.
47
48
 
48
- - Use `pytest -m "not live and not e2e"` locally; full suite OOMs on small dev machines. Scope to changed dirs; trust CI for the full sweep.
49
+ - Use `pytest -m "not live and not e2e and not smoke"` locally; full suite OOMs on small dev machines. Scope to changed dirs; trust CI for the full sweep.
49
50
  - TDD is non-negotiable. Coverage floor: 80% overall.
51
+ - Documentation is a first-class deliverable. Every behavior, workflow, config, or operator-facing change must update the relevant docs or state why no docs changed in the PR/checklist. `scripts/ci/check_doc_links.py` is a merge gate.
50
52
  - Live tests (`@pytest.mark.live`) opt in via `GFLOW_LIVE=1`. E2E tests require `GFLOW_CLI_E2E_PROFILE`.
51
53
 
52
54
  ## Code style
@@ -7,6 +7,181 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.10.0] — 2026-05-29
11
+
12
+ ### Fixed
13
+
14
+ - **Image and video counts leaking across profiles in `gflow data list projects` (issue #113).**
15
+ Fixed an issue where project media counts were combined if two different profiles
16
+ happened to share the same `flow_project_id`. The counts in `_LIST_PROJECTS_SQL`
17
+ are now strictly scoped to the active `profile_name`.
18
+
19
+ - **List queries fan-out when multiple operations claim an asset (issue #111).**
20
+ Fixed a bug in `gflow data list images` and `gflow data list videos` where
21
+ assets would be duplicated or have non-deterministic prompts if multiple
22
+ operations (e.g., retries) claimed the same output asset. The SQL queries
23
+ now use a deterministic subquery grouping by `asset_id` to ensure exactly
24
+ one-to-one cardinality.
25
+
26
+ ### Added
27
+
28
+ - **Google account identity persisted to every profile (`issue #92`).** Both
29
+ auth strategies (`real_chrome`, `internal_chromium`) now write a
30
+ `.gflow_account` file to the profile directory immediately after the session
31
+ is verified, durably associating the signed-in email with the profile on disk.
32
+ `ProfileMeta` gains a `google_account: str | None` field populated by
33
+ `profile_store.list_profiles()` from that file. `gflow auth list` (table and
34
+ `--json`) now includes a **Google account** column so every profile is
35
+ immediately identifiable — no more opaque `default` entries. The `--json`
36
+ output gains the `google_account` key for programmatic callers. Closes #92.
37
+
38
+ - **Auto-rename of the first-run `default` profile to email local-part.** When
39
+ `gflow auth login` creates the first profile and no `--profile` flag was given,
40
+ the profile is named `default` as a placeholder. After the session is verified
41
+ and the email is known, `auth login` automatically renames `profile_default` to
42
+ `profile_<email-local-part>` (e.g. `profile_ffroliva`) and updates
43
+ `config.toml`'s `default_profile` pointer atomically. The local-part is
44
+ sanitized to a filesystem-safe name (characters outside letters, digits, `-`,
45
+ and `_` become `-`), so `flavio.oliva@gmail.com` → `profile_flavio-oliva` and
46
+ `user+flow@gmail.com` → `profile_user-flow`. Existing `default`
47
+ profiles that were created before this change continue to work; they gain the
48
+ email column the next time `gflow auth login` is run against them. Closes #92.
49
+
50
+ - **`profile_store.rename_profile(old_name, new_name)`** — reusable primitive that
51
+ renames a profile directory and updates `config.toml` when the renamed profile
52
+ was the default. Raises `FileNotFoundError` / `FileExistsError` on invalid input.
53
+
54
+ - **Zero-credit smoke test for profile account persistence
55
+ (`tests/smoke/test_profile_account_smoke.py`).** Three smoke tests that verify
56
+ the full observable chain — account file present + readable, `list_profiles()`
57
+ surfaces `google_account`, `gflow auth list --json` includes the field — against
58
+ a real authenticated profile. No image or video generation; zero Flow credits.
59
+ Backfills the `.gflow_account` file for profiles created before the fix so the
60
+ tests work on existing sessions. Opt-in via
61
+ `GFLOW_CLI_E2E_PROFILE=<name> pytest -m smoke tests/smoke/test_profile_account_smoke.py`.
62
+
63
+ - **Aggregated asset view in `gflow data list images/videos`.** By default,
64
+ listing images or videos now returns one row per asset (Flow media ID),
65
+ collapsing multiple local copies into a single entry with a `COPIES` count
66
+ and the path of the latest copy. This prevents duplicate rows when
67
+ re-downloading the same media to different directories. The `copy_count`
68
+ is also exposed in JSONL output.
69
+ - **`--all-copies` flag on `gflow data list images/videos`.** Restores the
70
+ previous behavior of showing every local file as a separate row.
71
+ - **`gflow data prune` command.** New maintenance utility to remove stale
72
+ `local_files` database entries for local paths that no longer exist on
73
+ disk. Only targets local files (ignores cloud-stored assets). Supports
74
+ `--dry-run` to preview deletions and `--profile` to limit the scan.
75
+ - **External storage documentation for S3, MinIO, and Google Cloud Storage.**
76
+ Adds `docs/EXTERNAL_STORAGE.md`, cross-links it from the README, docs index,
77
+ configuration, data-layer, usage, security, and user-guide docs, and clarifies
78
+ that `GFLOW_CLI_STORAGE_URI` is a cloud-only output mode rather than
79
+ local-plus-cloud dual-write.
80
+ - **`--json` flag on `gflow video t2v`, `gflow video i2v`, and `gflow video r2v`.**
81
+ Emits the `VideoResult` (status / command / media_id / generation_status /
82
+ succeeded / local_path / failure_reasons / error_message) plus the request
83
+ echo (model / mode / aspect / duration / count / seed) as a single JSON
84
+ object on stdout. A failed generation still emits its JSON payload and
85
+ then exits 1. The data-layer recorder
86
+ (`record_started_video` / `record_completed_video`) fires regardless of
87
+ `--json` so audit history is independent of the output channel. E2e
88
+ coverage for `--json` shape across image / video / auth / models lives at
89
+ `tests/e2e/test_json_output_e2e.py`.
90
+ - **`--json` flag on `gflow image t2i` and `gflow image i2i`.** Emits the
91
+ complete `GeneratedImage` result (every field — `media_name`,
92
+ `workflow_id`, `seed`, `prompt`, `model_name_type`, `aspect_ratio`,
93
+ `dimensions`, `fife_url`, `is_signed_url`) plus the on-disk `local_path`
94
+ as a single JSON object on stdout. A worker keys `images[0].seed` for
95
+ refine-regen seed continuity. Single-prompt only (`--json` rejects
96
+ multi-prompt batch with a Click usage error); progress chatter is
97
+ suppressed so stdout is pure JSON. `ref_count` surfaces only on i2i.
98
+ - **`gflow models` catalog command.** New top-level command that enumerates
99
+ the image and video model catalog as a Rich table (default) or as a single
100
+ JSON object (`--json`). Per-model: `name`, CLI aliases (filtered to what
101
+ the generation command's `--model` Choice actually accepts), `ref_cap`,
102
+ `default` (image), `max_duration` (video). Built from the
103
+ `Model` / `VideoModel` enums + their alias maps so the catalog can never
104
+ drift from what the generation commands accept. A UI populating its model
105
+ picker from `gflow models --json` is guaranteed to pass any selected alias
106
+ back to `--model`.
107
+ - **`gflow_cli.json_output` module + `--json` error path on
108
+ `run_with_handlers`.** Pure builders for image/video result payloads and
109
+ RFC 9457 problem-details errors (plus a `retryable` flag worker schedulers
110
+ key their retry-vs-absorb decision off — WAF / rate-limit / network /
111
+ timeout). When `as_json=True`, errors emit a parseable JSON payload on
112
+ stdout with the same exit code as the Rich path; the observability event
113
+ still fires.
114
+ - **`--json` flag on `gflow auth list`.** Emits the profile inventory as a JSON
115
+ array (`name` / `is_default` / `cookies_present` / `profile_dir` /
116
+ `last_used_at`) on stdout so a programmatic caller (e.g. a worker discovering
117
+ authenticated profiles) can `json.loads(stdout)` instead of scraping the
118
+ Rich table.
119
+ - **Per-model r2v reference-image cap rebuilt as a data table.** Replaces the
120
+ prior pair of constants (`OMNI_REFERENCE_CAP=7`, `VEO_REFERENCE_CAP=3`) with
121
+ a `VideoModel -> int` mapping consulted by
122
+ `gflow_cli.api.video.reference_cap_for(model)`. New entries:
123
+ `veo_3_1_lite_lower_priority=3` (was implicitly covered by the veo branch),
124
+ and `veo_3_1_quality=0` — Veo 3.1 Quality does NOT support
125
+ Ingredients/References to Video at all per Google Flow's official support
126
+ page; passing it to r2v raises a clear `does not support R2V
127
+ (reference-to-video)` error rather than letting the request fail at the
128
+ wire. CLI guard added on `gflow video r2v` (`click.UsageError`, exit 2)
129
+ mirroring the i2i pattern so over-cap and quality+r2v fail before any
130
+ profile/network work. E2e tripwire at
131
+ `tests/e2e/test_video_r2v_ref_cap_e2e.py` asserts Flow actually consumes
132
+ all `cap` refs at the at-cap boundary.
133
+ - **Per-model i2i reference-image cap.** Flow silently keeps only the first N
134
+ reference images when an i2i request attaches more than the model accepts,
135
+ so a caller could believe every ref was used. `gflow_cli.api.image.reference_cap_for(model)`
136
+ exposes the live-observed per-model cap: NARWHAL (Nano Banana 2) and GEM_PIX_2
137
+ (Nano Pro) accept 10, IMAGEN_3_5 (Imagen 4) accepts 3. Enforced as a domain
138
+ invariant in `GenerateImageRequest.__post_init__` and at the CLI boundary in
139
+ `gflow image i2i` (clean `click.UsageError` / exit 2 before any
140
+ profile/network work). Mirrors the existing video r2v cap pattern. E2e
141
+ tripwire at `tests/e2e/test_image_i2i_ref_cap_e2e.py` asserts Flow actually
142
+ consumes all `cap` refs (one `reference_attached` event per ref) so a future
143
+ silent truncation on the Flow side fails the test.
144
+ - **Layered e2e test strategy with cost sub-markers.** The single `e2e` marker is
145
+ now augmented by cost sub-markers (`e2e_auth`, `e2e_image`, `e2e_video`,
146
+ `e2e_batch`, `e2e_data`, `smoke`) so callers can run only the tier they can
147
+ afford (zero-credit auth checks, single-credit image smoke, etc.). See
148
+ `docs/E2E_TESTING.md` for the full reference.
149
+ - `tests/e2e/conftest.py` — shared `e2e_profile_dir`, `e2e_nosession_profile`,
150
+ and `e2e_env` fixtures replace duplicated inline helpers in individual test files.
151
+ - `tests/api/transports/test_transport_timeout.py` — extracted from e2e as a
152
+ pure-mock integration test; also fixes `Path("/dev/null")` → `Path(os.devnull)`
153
+ for Windows portability.
154
+ - `tests/test_marker_registry.py` — invariant checks that every e2e test carries a
155
+ cost sub-marker, and self-tests for the auto-marker conftest hook.
156
+ - `docs/E2E_TESTING.md` — comprehensive e2e strategy and layer reference document.
157
+
158
+ ### Fixed
159
+
160
+ - Structlog logs are now routed to stderr (via
161
+ `PrintLoggerFactory(file=sys.stderr)`) instead of stdout. Previously every
162
+ CLI event leaked onto stdout, which broke the `--json` contract for
163
+ programmatic callers — `json.loads(stdout)` failed because the JSON
164
+ payload was preceded by event-log lines. Logs are diagnostics; stdout is
165
+ data. No-op for human users (terminals still show logs the same way).
166
+
167
+ ### Changed
168
+
169
+ - `gflow data media` now labels cloud-backed asset records as `cloud_uri_N`
170
+ while keeping local assets under the existing `local_path_N` labels.
171
+ - `gflow_cli.api.video` no longer exposes the standalone `OMNI_REFERENCE_CAP` /
172
+ `VEO_REFERENCE_CAP` constants. Callers that need a per-model R2V cap should
173
+ use `reference_cap_for(model)` (which returns `0` for `VEO_3_1_QUALITY` —
174
+ R2V is unsupported there). `MAX_REFERENCE_IMAGES` (= 7) is unchanged and
175
+ still the absolute ceiling used when the model is unknown.
176
+ - `GFLOW_CLI_E2E_RUN_VIDEO` default flipped from `"1"` to `"0"`. The Veo step in
177
+ `test_data_layer_e2e.py` is now **opt-in**: set `GFLOW_CLI_E2E_RUN_VIDEO=1` to
178
+ include it. This prevents accidental Veo credit burns on unattended CI runs.
179
+ - `pytest` `addopts` now excludes `smoke` in addition to `e2e` and `live`:
180
+ `not e2e and not live and not smoke`. Bare `pytest` never launches a live
181
+ browser session.
182
+ - Auto-marker conftest hook uses `item.path.parts` instead of a slash-delimited
183
+ string substring, fixing Windows backslash path compatibility.
184
+
10
185
  ## [0.9.1] — 2026-05-27
11
186
 
12
187
  > **Locale and catalog patch release.** Hardens the headed-browser UI
@@ -1034,7 +1209,8 @@ shell-script template that branches on these codes.
1034
1209
 
1035
1210
  First skeleton. Not functional end-to-end yet.
1036
1211
 
1037
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.9.1...HEAD
1212
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.10.0...HEAD
1213
+ [0.10.0]: https://github.com/ffroliva/gflow-cli/compare/v0.9.1...v0.10.0
1038
1214
  [0.9.1]: https://github.com/ffroliva/gflow-cli/compare/v0.9.0...v0.9.1
1039
1215
  [0.9.0]: https://github.com/ffroliva/gflow-cli/compare/v0.8.1...v0.9.0
1040
1216
  [0.8.1]: https://github.com/ffroliva/gflow-cli/compare/v0.8.0...v0.8.1
@@ -39,6 +39,11 @@ def test_parse_uuid_from_url(): ...
39
39
  async def test_upload_returns_asset(): ...
40
40
 
41
41
  @pytest.mark.e2e # Hits the real Flow API. Requires GFLOW_CLI_E2E_PROFILE env var.
42
+ @pytest.mark.e2e_image # Cost sub-marker: spends ~1 Imagen credit.
43
+ async def test_full_t2i_roundtrip(): ...
44
+
45
+ @pytest.mark.e2e
46
+ @pytest.mark.e2e_video # Cost sub-marker: spends ~1 Veo credit (most expensive).
42
47
  async def test_full_i2v_roundtrip(): ...
43
48
  ```
44
49
 
@@ -46,10 +51,23 @@ CI runs `unit` + `integration` on every push. `e2e` tests require a live authent
46
51
 
47
52
  ```bash
48
53
  export GFLOW_CLI_E2E_PROFILE=<profile-name> # name of a logged-in profile
49
- uv run pytest -m e2e -v
54
+
55
+ # Zero-credit sanity check (auth + health)
56
+ uv run pytest -m e2e_auth -v
57
+
58
+ # Single image (1 Imagen credit)
59
+ uv run pytest -m "e2e_image and not e2e_batch" -v
60
+
61
+ # Full regression (all credits)
62
+ GFLOW_CLI_E2E_RUN_VIDEO=1 uv run pytest -m e2e -v
50
63
  ```
51
64
 
52
- E2e tests spend real Veo/Imagen credits run them on `develop` before opening a release PR to `main`. See [docs/DEVELOPMENT.md § E2e gate](docs/DEVELOPMENT.md#e2e-gate-before-merging-develop--main).
65
+ E2e tests spend real Veo/Imagen credits. Video tests default to opt-out set
66
+ `GFLOW_CLI_E2E_RUN_VIDEO=1` to include them. Run the full suite on `develop`
67
+ before opening a release PR to `main`.
68
+
69
+ See [docs/E2E_TESTING.md](docs/E2E_TESTING.md) for the complete layer reference,
70
+ cost table, and run commands.
53
71
 
54
72
  ### Coverage targets
55
73
 
@@ -64,13 +82,19 @@ E2e tests spend real Veo/Imagen credits — run them on `develop` before opening
64
82
 
65
83
  ```bash
66
84
  uv run python scripts/ci/check_repo_hygiene.py # artefact + path hygiene
85
+ uv run python scripts/ci/check_doc_links.py # internal Markdown links
67
86
  uv run ruff check src tests # lint
68
87
  uv run ruff format src tests # auto-format
69
88
  uv run pyright src # type-check (strict on src/gflow_cli/)
70
89
  uv run pytest -q --cov=gflow_cli # tests + coverage
71
90
  ```
72
91
 
73
- CI runs all five on every push. Install local pre-commit hooks (recommended):
92
+ CI runs all six on every push. Documentation is part of the merge gate: update
93
+ the relevant docs for behavior, workflow, configuration, architecture, or
94
+ operator-facing changes. If no documentation change is needed, state that in
95
+ the PR validation checklist.
96
+
97
+ Install local pre-commit hooks (recommended):
74
98
 
75
99
  ```bash
76
100
  pip install pre-commit && pre-commit install
@@ -0,0 +1,27 @@
1
+ # GEMINI.md
2
+
3
+ > Project memory hub for **Gemini CLI**. The universal coding-agent rules for any tool (Cursor, Codex, Aider, Gemini CLI, etc.) live in [AGENTS.md](AGENTS.md) — this file carries Gemini-specific session protocol only.
4
+
5
+ ## What this project is
6
+
7
+ `gflow-cli` is an unofficial Python CLI that drives [Google Flow](https://labs.google/fx/tools/flow) (Veo image-to-video, Imagen text-to-image) from the terminal by reverse-engineering Flow's private REST API. See [README.md](README.md) for the user-facing overview.
8
+
9
+ ## On every session start
10
+
11
+ 1. Read **[AGENTS.md](AGENTS.md)** — universal rules every agent must follow.
12
+ 2. Read **[docs/INDEX.md](docs/INDEX.md)** — routing layer for all project docs and commands.
13
+ 3. Pull deeper context on demand:
14
+ - Starting a feature → `/gflow:plan`
15
+ - Touching auth or reCAPTCHA → `/gflow:known-issues`
16
+ - Cutting a release → `/gflow:release`
17
+ - Before any commit → `/gflow:check`
18
+
19
+ ## Gemini-specific
20
+
21
+ - Use specialized skills when relevant (e.g., `find-docs` for library research, `pr-council-review` for PR audits).
22
+ - Maintain memory via the `mcp-mempalace` tool if available.
23
+ - Prioritize **turn efficiency** and **high-signal output**.
24
+
25
+ ## Active phase
26
+
27
+ See [PLAN.md](PLAN.md) or run `/gflow:plan` for the current detailed plan.
@@ -463,6 +463,33 @@ change surfaces there as a failing test. Start any investigation of a sudden
463
463
 
464
464
  ## Resolved
465
465
 
466
+ ### Profile named `default` is opaque — no Google account identity
467
+
468
+ - **Status:** Resolved · **Severity:** Was-Low (UX confusion, no data loss) · **Was-affecting:** all versions through v0.9.x · **Fixed in:** v0.10.0 via PR #110 (2026-05-28) · **Tracked:** issue #92
469
+
470
+ The first-run default profile name `default` gave no indication of which Google
471
+ account it belonged to, what locale it used, or whether it was valid. On
472
+ developer machines with multiple Google Pro/Ultra accounts, this caused confusion
473
+ when test profiles, expired sessions, or stale `gflow auth login` runs silently
474
+ wrote to the wrong directory.
475
+
476
+ **Resolution:** `gflow auth login` now writes a `.gflow_account` file to the
477
+ profile directory immediately after the session is verified. `profile_store.list_profiles()`
478
+ surfaces this as `ProfileMeta.google_account`, and `gflow auth list` (both table
479
+ and `--json`) now includes a **Google account** column. The first-run `default`
480
+ profile is automatically renamed to the email local-part (e.g. `profile_ffroliva`)
481
+ once the email is known, and `config.toml` is updated atomically.
482
+
483
+ Profiles created before this fix continue to work and display `unknown` in the
484
+ account column. Re-running `gflow auth login` against an existing profile backfills
485
+ the `.gflow_account` file.
486
+
487
+ See [AUTHENTICATION.md § Profile naming](AUTHENTICATION.md#profile-naming) for the
488
+ new naming convention and [AUTHENTICATION.md § gflow auth list](AUTHENTICATION.md#gflow-auth-list)
489
+ for the updated `--json` schema.
490
+
491
+ ---
492
+
466
493
  ### `gflow image t2i/i2i --model` was a silent no-op on `ui_automation`
467
494
 
468
495
  - **Status:** Resolved · **Severity:** Was-Medium (wrong model = wrong cost + quality, silently) · **Was-affecting:** v0.7.0 through v0.8.1 · **Fixed in:** develop post-v0.8.1 via PR #48 (2026-05-24)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.9.1
3
+ Version: 0.10.0
4
4
  Summary: Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal.
5
5
  Project-URL: Homepage, https://github.com/ffroliva/gflow-cli
6
6
  Project-URL: Issues, https://github.com/ffroliva/gflow-cli/issues
@@ -50,6 +50,12 @@ Requires-Dist: pyright>=1.1.0; extra == 'dev'
50
50
  Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
51
51
  Requires-Dist: pytest>=8.0.0; extra == 'dev'
52
52
  Requires-Dist: ruff>=0.5.0; extra == 'dev'
53
+ Provides-Extra: gcs
54
+ Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
55
+ Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
56
+ Provides-Extra: s3
57
+ Requires-Dist: s3fs>=2024.2.0; extra == 's3'
58
+ Requires-Dist: universal-pathlib>=0.2.5; extra == 's3'
53
59
  Description-Content-Type: text/markdown
54
60
 
55
61
  # gflow-cli
@@ -97,7 +103,10 @@ gflow image t2i "a hot air balloon over Tokyo at sunrise"
97
103
  gflow video t2v "Slow cinematic push-in on a sunlit forest clearing" --aspect 16:9
98
104
  ```
99
105
 
100
- Outputs land under `./out/` (or `$GFLOW_CLI_OUTPUT_DIR`). First call is ~30–90 s while Chromium warms; subsequent calls reuse the warm session.
106
+ Outputs land under `$GFLOW_CLI_OUTPUT_DIR` unless
107
+ [`GFLOW_CLI_STORAGE_URI`](docs/EXTERNAL_STORAGE.md) sends generated assets to
108
+ S3, MinIO, or Google Cloud Storage. First call is ~30–90 s while Chromium warms;
109
+ subsequent calls reuse the warm session.
101
110
 
102
111
  > **Why `--browser chrome`?** Google rejects Playwright's bundled Chromium. The CLI fails fast with a friendly error (`AuthBrowserRejectedError`, exit code 14) if you pick anything else.
103
112
 
@@ -120,6 +129,7 @@ Reproduce the recording: [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (W
120
129
  | Topic | Read |
121
130
  |---|---|
122
131
  | 🎯 **Getting started** | [User Guide](docs/USER_GUIDE.md) · [Usage](docs/USAGE.md) · [Configuration](docs/CONFIGURATION.md) |
132
+ | **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
123
133
  | 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
124
134
  | 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
125
135
  | 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
@@ -158,7 +168,7 @@ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (te
158
168
 
159
169
  ## Project status
160
170
 
161
- **v0.9.1 — alpha.** Image (T2I / I2I / upload) + Video T2V / I2V / R2V live end-to-end on `ui_automation`, with a video `--model` picker (5 Veo models) + `--duration` / `--count`. New in v0.9.1: hardened locale-invariant Flow selectors, fixed I2V start/end-frame attachment for non-English Chrome/Flow sessions, and safer first-run catalog behavior. Only video `batch` (manifest runner) is still queued for Phase B — use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)). Full milestone history → [docs/PROJECT_STATUS.md](docs/PROJECT_STATUS.md). Changelog → [CHANGELOG.md](CHANGELOG.md). Where the project is heading → [ROADMAP.md](ROADMAP.md).
171
+ **v0.10.0 — alpha.** Image (T2I / I2I / upload) + Video T2V / I2V / R2V live end-to-end on `ui_automation`, with a video `--model` picker (5 Veo models) + `--duration` / `--count`. New in v0.10.0: `--json` output across every generation command (`image t2i/i2i`, `video t2v/i2v/r2v`, `auth list`) plus a `gflow models` catalog so worker schedulers can drive the CLI machine-to-machine; per-model reference-image caps for `i2i`/`r2v`; profile Google-account identity persisted to disk (with auto-rename of the first-run `default` profile); external cloud storage (S3 / MinIO / GCS) via `GFLOW_CLI_STORAGE_URI`; and a `gflow data prune` maintenance command. Only video `batch` (manifest runner) is still queued for Phase B — use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)). Full milestone history → [docs/PROJECT_STATUS.md](docs/PROJECT_STATUS.md). Changelog → [CHANGELOG.md](CHANGELOG.md). Where the project is heading → [ROADMAP.md](ROADMAP.md).
162
172
 
163
173
  ## License & legal
164
174
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **Status:** Living document. Updated as phases complete.
4
4
  > **Owner:** [@ffroliva](https://github.com/ffroliva)
5
- > **Last revised:** 2026-05-26 (develop — post-v0.9.0; PR #58 data layer, PR #70 locale Phase 2, PR #78 data Windows fixes, PR #81 root cleanup, PR #84 cp1252+plan refresh, PR #89 data list/media UX, PR #90 #63 closure)
5
+ > **Last revised:** 2026-05-29 (v0.10.0 release `--json` everywhere + `gflow models` catalog, per-model i2i/r2v ref caps, profile Google-account persistence (#92), external cloud storage, `gflow data prune`, cross-profile count fixes #111/#113)
6
6
 
7
7
  This plan turns the v0.1 scaffold into a production-grade CLI for Google AI Ultra/Pro subscribers who want to spend their Flow credits via batch automation. The plan is opinionated, treating this repo as a portfolio-grade benchmark.
8
8
 
@@ -359,6 +359,7 @@ The video-generation feature has its own sub-phase plan (spike → Phase A → P
359
359
  - **Phase 4 (Task #6, 2026-05-26, branch `claude/next-quick-win-gBPqS`, PR #93):** `NEW_PROJECT_SELECTORS` expanded to all 14 locales (icon-first tier + 14-locale text tier); English-only ARIA fallbacks (`[aria-label*='New project']`, `[aria-label*='Project']`) removed. `SUBMIT_BUTTON_SELECTORS` drops its English-only `button[aria-label*="Create"]` entry — `arrow_forward` icon selectors cover it in all locales. Both tuples are now fully locale-invariant. Note: issue #24 was closed 2026-05-24 after Phases 1–3; Phase 4 is cosmetic tail work. `--lang=en-US` retained only to stabilise `IMAGE_MODEL_OPTION_SELECTORS` (product names like "Nano Banana 2" may be localised). Removing it requires converting the image model picker to a structural anchor — tracked as issue #94 (Phase 5 below). **R2V live e2e on non-EN not yet exercised** — still open.
360
360
  - **Phase 5 (open):** Convert `IMAGE_MODEL_OPTION_SELECTORS` from English has-text to a locale-invariant anchor (e.g. `data-model-id` attribute or icon ligature), then drop `--lang=en-US`. R2V live e2e on non-EN also pending.
361
361
  - [ ] **Model Context Protocol (MCP) Server.** (Backlog) Expose core gflow-cli tools via MCP for language-agnostic agentic access.
362
+ - [x] **Issue #92: Google account identity persistence shipped 2026-05-28 (PR #110).** After every `gflow auth login`, both auth strategies write the verified email to `$GFLOW_CLI_HOME/profile_<name>/.gflow_account`. `ProfileMeta.google_account` surfaces it; `gflow auth list` and `gflow auth list --json` display it. First-login auto-rename: when no `--profile` flag was given and the only profile is named `default`, it is renamed to the email local-part. `profile_store.rename_profile()` primitive added. Zero-credit smoke test (`tests/smoke/test_profile_account_smoke.py`) ships with backfill path for pre-existing profiles. LLM council (9-dim) run; all must-fix items applied before merge. See `KNOWN_ISSUES.md` § Resolved for full detail.
362
363
  - [x] **`/gflow:pr-council-review` slash command shipped 2026-05-26 (PR #97).** Multi-dimensional LLM council for open PRs (4 baseline + 8 adaptive dimensions, mandatory memory-slug binding, draft-PR guard, YELLOW escape valve, live-verify gate). Validated on PR #93; self-audited by 3-agent meta-council surfacing 13 must-fix items applied before merge. See memory `[[llm-council-code-review-pr93]]`.
363
364
  - **Phase A (Backlog — Portability):** extract command body into `skills/pr-council-review/SKILL.md` so Gemini CLI / Codex / Cursor / Aider can consume it. Keep `.claude/commands/gflow/pr-council-review.md` as a thin wrapper. Memory: `[[pr-council-review-portability-backlog]]`.
364
365
  - **Phase B (Backlog — Token optimization):** add `scripts/dev/pr_council_prefetch.py` (single gh-call producing structured JSON for agents) and `scripts/dev/memory_filter.py` (relevant slug bodies only). Targets ~30-50% per-agent context cost reduction.
@@ -43,7 +43,10 @@ gflow image t2i "a hot air balloon over Tokyo at sunrise"
43
43
  gflow video t2v "Slow cinematic push-in on a sunlit forest clearing" --aspect 16:9
44
44
  ```
45
45
 
46
- Outputs land under `./out/` (or `$GFLOW_CLI_OUTPUT_DIR`). First call is ~30–90 s while Chromium warms; subsequent calls reuse the warm session.
46
+ Outputs land under `$GFLOW_CLI_OUTPUT_DIR` unless
47
+ [`GFLOW_CLI_STORAGE_URI`](docs/EXTERNAL_STORAGE.md) sends generated assets to
48
+ S3, MinIO, or Google Cloud Storage. First call is ~30–90 s while Chromium warms;
49
+ subsequent calls reuse the warm session.
47
50
 
48
51
  > **Why `--browser chrome`?** Google rejects Playwright's bundled Chromium. The CLI fails fast with a friendly error (`AuthBrowserRejectedError`, exit code 14) if you pick anything else.
49
52
 
@@ -66,6 +69,7 @@ Reproduce the recording: [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (W
66
69
  | Topic | Read |
67
70
  |---|---|
68
71
  | 🎯 **Getting started** | [User Guide](docs/USER_GUIDE.md) · [Usage](docs/USAGE.md) · [Configuration](docs/CONFIGURATION.md) |
72
+ | **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
69
73
  | 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
70
74
  | 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
71
75
  | 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
@@ -104,7 +108,7 @@ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (te
104
108
 
105
109
  ## Project status
106
110
 
107
- **v0.9.1 — alpha.** Image (T2I / I2I / upload) + Video T2V / I2V / R2V live end-to-end on `ui_automation`, with a video `--model` picker (5 Veo models) + `--duration` / `--count`. New in v0.9.1: hardened locale-invariant Flow selectors, fixed I2V start/end-frame attachment for non-English Chrome/Flow sessions, and safer first-run catalog behavior. Only video `batch` (manifest runner) is still queued for Phase B — use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)). Full milestone history → [docs/PROJECT_STATUS.md](docs/PROJECT_STATUS.md). Changelog → [CHANGELOG.md](CHANGELOG.md). Where the project is heading → [ROADMAP.md](ROADMAP.md).
111
+ **v0.10.0 — alpha.** Image (T2I / I2I / upload) + Video T2V / I2V / R2V live end-to-end on `ui_automation`, with a video `--model` picker (5 Veo models) + `--duration` / `--count`. New in v0.10.0: `--json` output across every generation command (`image t2i/i2i`, `video t2v/i2v/r2v`, `auth list`) plus a `gflow models` catalog so worker schedulers can drive the CLI machine-to-machine; per-model reference-image caps for `i2i`/`r2v`; profile Google-account identity persisted to disk (with auto-rename of the first-run `default` profile); external cloud storage (S3 / MinIO / GCS) via `GFLOW_CLI_STORAGE_URI`; and a `gflow data prune` maintenance command. Only video `batch` (manifest runner) is still queued for Phase B — use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)). Full milestone history → [docs/PROJECT_STATUS.md](docs/PROJECT_STATUS.md). Changelog → [CHANGELOG.md](CHANGELOG.md). Where the project is heading → [ROADMAP.md](ROADMAP.md).
108
112
 
109
113
  ## License & legal
110
114