gflow-cli 0.8.0__tar.gz → 0.9.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 (297) hide show
  1. gflow_cli-0.9.0/.claude/commands/gflow/doc-review.md +259 -0
  2. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.env.template +9 -0
  3. gflow_cli-0.9.0/AGENTS.md +78 -0
  4. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/CHANGELOG.md +139 -1
  5. gflow_cli-0.9.0/CLAUDE.md +27 -0
  6. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/KNOWN_ISSUES.md +60 -1
  7. gflow_cli-0.9.0/PKG-INFO +186 -0
  8. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/PLAN.md +31 -12
  9. gflow_cli-0.9.0/README.md +132 -0
  10. gflow_cli-0.9.0/ROADMAP.md +45 -0
  11. gflow_cli-0.9.0/docs/AGENT_GUIDE.md +33 -0
  12. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/ARCHITECTURE.md +93 -5
  13. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/CONFIGURATION.md +34 -0
  14. gflow_cli-0.9.0/docs/DATA_LAYER.md +399 -0
  15. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/INDEX.md +15 -3
  16. gflow_cli-0.9.0/docs/LIVE_VERIFICATION_data_layer.md +209 -0
  17. gflow_cli-0.9.0/docs/LIVE_VERIFICATION_v0.8.1.md +53 -0
  18. gflow_cli-0.9.0/docs/LIVE_VERIFICATION_v0.9.0.md +107 -0
  19. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/LIVE_VERIFICATION_video_download.md +5 -3
  20. gflow_cli-0.9.0/docs/PROJECT_STATUS.md +58 -0
  21. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/SECURITY.md +33 -0
  22. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/USAGE.md +148 -36
  23. gflow_cli-0.9.0/docs/superpowers/notes/v0.9.0-schema-reconciliation.md +108 -0
  24. gflow_cli-0.9.0/docs/superpowers/plans/2026-05-23-locale-agnostic-selectors.md +108 -0
  25. gflow_cli-0.9.0/docs/superpowers/plans/2026-05-24-data-layer.md +2452 -0
  26. gflow_cli-0.9.0/docs/superpowers/plans/2026-05-24-v0.9.0-release-implementation.md +2123 -0
  27. gflow_cli-0.9.0/docs/superpowers/specs/2026-05-23-locale-agnostic-selectors.md +66 -0
  28. gflow_cli-0.9.0/docs/superpowers/specs/2026-05-23-readme-v0.8.1-refresh-design.md +359 -0
  29. gflow_cli-0.9.0/docs/superpowers/specs/2026-05-24-data-layer-design.md +403 -0
  30. gflow_cli-0.9.0/docs/superpowers/specs/2026-05-24-v0.9.0-release-design.md +204 -0
  31. gflow_cli-0.9.0/llms.txt +30 -0
  32. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/pyproject.toml +1 -1
  33. gflow_cli-0.9.0/scripts/ci/check_doc_links.py +82 -0
  34. gflow_cli-0.9.0/scripts/dev/capture_image_add_media_dom.py +184 -0
  35. gflow_cli-0.9.0/scripts/dev/capture_locale_invariants.py +87 -0
  36. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/__init__.py +1 -1
  37. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/client.py +99 -30
  38. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/dto.py +2 -0
  39. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/image.py +5 -0
  40. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/transports/_common.py +16 -0
  41. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/transports/base.py +25 -1
  42. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/transports/ui_automation.py +82 -15
  43. gflow_cli-0.9.0/src/gflow_cli/api/transports/ui_automation_video.py +1013 -0
  44. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/video.py +124 -5
  45. gflow_cli-0.9.0/src/gflow_cli/auth/internal_chromium.py +158 -0
  46. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/auth/real_chrome.py +80 -67
  47. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/browser_manager.py +10 -19
  48. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/cli.py +2 -0
  49. gflow_cli-0.9.0/src/gflow_cli/cli_data.py +299 -0
  50. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/cli_image.py +257 -159
  51. gflow_cli-0.9.0/src/gflow_cli/cli_video.py +464 -0
  52. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/config.py +19 -0
  53. gflow_cli-0.9.0/src/gflow_cli/data/__init__.py +5 -0
  54. gflow_cli-0.9.0/src/gflow_cli/data/migrations/0001_initial.sql +100 -0
  55. gflow_cli-0.9.0/src/gflow_cli/data/migrations/__init__.py +1 -0
  56. gflow_cli-0.9.0/src/gflow_cli/data/models.py +179 -0
  57. gflow_cli-0.9.0/src/gflow_cli/data/queries.py +326 -0
  58. gflow_cli-0.9.0/src/gflow_cli/data/recorder.py +407 -0
  59. gflow_cli-0.9.0/src/gflow_cli/data/redaction.py +48 -0
  60. gflow_cli-0.9.0/src/gflow_cli/data/repository.py +585 -0
  61. gflow_cli-0.9.0/src/gflow_cli/data/store.py +239 -0
  62. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/errors.py +32 -0
  63. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/exceptions.py +3 -0
  64. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/image_batch.py +105 -20
  65. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/paths.py +5 -0
  66. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/test_client.py +60 -0
  67. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/test_concurrency.py +27 -0
  68. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/test_video.py +80 -0
  69. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_common.py +16 -0
  70. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_ui_automation.py +43 -0
  71. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_ui_automation_video.py +118 -6
  72. gflow_cli-0.9.0/tests/cli/test_cli_data.py +81 -0
  73. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/cli/test_cli_image.py +208 -18
  74. gflow_cli-0.9.0/tests/cli/test_cli_video.py +208 -0
  75. gflow_cli-0.9.0/tests/data/test_packaging.py +30 -0
  76. gflow_cli-0.9.0/tests/data/test_recorder.py +155 -0
  77. gflow_cli-0.9.0/tests/data/test_redaction.py +31 -0
  78. gflow_cli-0.9.0/tests/data/test_repository.py +272 -0
  79. gflow_cli-0.9.0/tests/data/test_settings_and_errors.py +47 -0
  80. gflow_cli-0.9.0/tests/data/test_store_migrations.py +114 -0
  81. gflow_cli-0.9.0/tests/e2e/test_data_layer_e2e.py +439 -0
  82. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/e2e/test_transports_e2e.py +66 -0
  83. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/features/test_image_steps.py +1 -0
  84. gflow_cli-0.9.0/tests/fixtures/seeded_catalog.py +226 -0
  85. gflow_cli-0.9.0/tests/image_batch/__init__.py +0 -0
  86. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/image_batch/test_image_manifest.py +222 -1
  87. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/image_batch/test_observability_events.py +78 -0
  88. gflow_cli-0.9.0/tests/smoke/__init__.py +0 -0
  89. gflow_cli-0.9.0/tests/test_cli_data.py +147 -0
  90. gflow_cli-0.9.0/tests/test_data_queries.py +151 -0
  91. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/test_errors.py +2 -2
  92. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/uv.lock +1 -1
  93. gflow_cli-0.8.0/.claude/commands/gflow/doc-review.md +0 -137
  94. gflow_cli-0.8.0/CLAUDE.md +0 -219
  95. gflow_cli-0.8.0/PKG-INFO +0 -451
  96. gflow_cli-0.8.0/README.md +0 -397
  97. gflow_cli-0.8.0/src/gflow_cli/api/transports/ui_automation_video.py +0 -543
  98. gflow_cli-0.8.0/src/gflow_cli/auth/internal_chromium.py +0 -147
  99. gflow_cli-0.8.0/src/gflow_cli/cli_video.py +0 -153
  100. gflow_cli-0.8.0/tests/cli/test_cli_video.py +0 -68
  101. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.claude/README.md +0 -0
  102. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.claude/commands/gflow/changelog.md +0 -0
  103. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.claude/commands/gflow/check.md +0 -0
  104. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.claude/commands/gflow/known-issues.md +0 -0
  105. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.claude/commands/gflow/plan.md +0 -0
  106. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.claude/commands/gflow/release.md +0 -0
  107. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.continue-here.md +0 -0
  108. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.gitattributes +0 -0
  109. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.github/CODEOWNERS +0 -0
  110. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  111. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.github/copilot-instructions.md +0 -0
  112. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.github/dependabot.yml +0 -0
  113. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.github/workflows/ci.yml +0 -0
  114. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.github/workflows/external-pr-triage.yml +0 -0
  115. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.github/workflows/release.yml +0 -0
  116. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.gitignore +0 -0
  117. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.gitleaks.toml +0 -0
  118. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.planning/todos/pending/2026-05-11-add-project-logo-and-docs-site-promotion-plan.md +0 -0
  119. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.planning/todos/pending/pr-38-review.md +0 -0
  120. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.pre-commit-config.yaml +0 -0
  121. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/.secrets.baseline +0 -0
  122. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/CONFIGURATION.md +0 -0
  123. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/CONTRIBUTING.md +0 -0
  124. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/DISCLAIMER.md +0 -0
  125. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/LICENSE +0 -0
  126. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/RELEASE.md +0 -0
  127. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/AUTHENTICATION.md +0 -0
  128. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/DEBUGGING.md +0 -0
  129. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/DEVELOPMENT.md +0 -0
  130. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/GITHUB.md +0 -0
  131. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  132. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  133. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/USER_GUIDE.md +0 -0
  134. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/assets/example-run.gif +0 -0
  135. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/2026-05-17-issue-15-handover.md +0 -0
  136. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-09-image-mvp-orchestration.md +0 -0
  137. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-09-image-mvp.md +0 -0
  138. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-09-video-mvp-orchestration.md +0 -0
  139. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-09-video-mvp.md +0 -0
  140. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening-orchestration.md +0 -0
  141. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening.md +0 -0
  142. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/2026-05-14-shell-multi-prompt-orchestration.md +0 -0
  143. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_ARCH.md +0 -0
  144. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_SEC_UX.md +0 -0
  145. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_CODE.md +0 -0
  146. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_GEMINI.md +0 -0
  147. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_SECURITY.md +0 -0
  148. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_PYTHON.md +0 -0
  149. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_SECURITY.md +0 -0
  150. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN.md +0 -0
  151. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_CODE.md +0 -0
  152. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_FOLLOWUP.md +0 -0
  153. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_PLANNER.md +0 -0
  154. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY.md +0 -0
  155. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY_FOLLOWUP.md +0 -0
  156. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_FINAL_SEC_UX_VERIFIED.md +0 -0
  157. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_PLAN_SECURITY.md +0 -0
  158. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_SPEC_SECURITY.md +0 -0
  159. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/PLAN.md +0 -0
  160. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/orchestration.md +0 -0
  161. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-17-e2e-test-coverage.md +0 -0
  162. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-17-issue-15-auth-verification-fix.md +0 -0
  163. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-17-issue-15-i2v-bearer-auth.md +0 -0
  164. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-17-issue-15-orchestration.md +0 -0
  165. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-18-video-phase0-submit-spike.md +0 -0
  166. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-19-video-phase-a-execution-state.md +0 -0
  167. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-19-video-phase-a-orchestration.md +0 -0
  168. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-19-video-phase-a-t2v.md +0 -0
  169. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md +0 -0
  170. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-21-multi-image-prompt-orchestration.md +0 -0
  171. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-21-multi-image-prompt.md +0 -0
  172. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-22-pr-38-review.md +0 -0
  173. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/plans/2026-05-22-stay-mounted-batch-session-plan.md +0 -0
  174. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-10-phase-4-hardening-design.md +0 -0
  175. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-14-shell-multi-prompt-design.md +0 -0
  176. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-15-auth-login-real-chrome-design.md +0 -0
  177. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-17-e2e-test-coverage-design.md +0 -0
  178. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-17-i2v-uploadimage-401-bearer-auth-design.md +0 -0
  179. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-17-issue-15-auth-verification-fix-design.md +0 -0
  180. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-17-issue-15-root-cause-findings.md +0 -0
  181. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-18-ui-automation-video-generation-design.md +0 -0
  182. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-21-multi-image-prompt-design.md +0 -0
  183. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-22-pr-38-review-design.md +0 -0
  184. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/specs/2026-05-22-stay-mounted-batch-session-design.md +0 -0
  185. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -0
  186. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/examples/README.md +0 -0
  187. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/examples/batch_from_config.py +0 -0
  188. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/examples/multi_prompt_t2i.py +0 -0
  189. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/examples/sample_config.json +0 -0
  190. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/examples/sample_prompts.txt +0 -0
  191. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/examples/single_image_t2i.py +0 -0
  192. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/README.md +0 -0
  193. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/01_upload_image.json +0 -0
  194. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  195. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  196. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/04_archive_workflow.json +0 -0
  197. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/05_createProject.json +0 -0
  198. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/06_batchGenerateImages.json +0 -0
  199. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  200. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  201. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  202. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  203. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  204. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/ci/check_repo_hygiene.py +0 -0
  205. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/debug_editor.py +0 -0
  206. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/debug_gen_settings.py +0 -0
  207. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/debug_settings.py +0 -0
  208. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/dev/active_plan.py +0 -0
  209. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/dev/monitor_pr_38.py +0 -0
  210. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/diag_capture_flow_traffic.py +0 -0
  211. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/diag_recaptcha_mint.py +0 -0
  212. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/record_demo.ps1 +0 -0
  213. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/smoke_image.py +0 -0
  214. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/smoke_real_chrome_image.py +0 -0
  215. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/smoke_video_editor.py +0 -0
  216. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/smoke_worker_style.py +0 -0
  217. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/scripts/verify_chrome_auth_viability.py +0 -0
  218. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/skills/README.md +0 -0
  219. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/skills/gflow-cli/SKILL.md +0 -0
  220. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/sonar-project.properties +0 -0
  221. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/__main__.py +0 -0
  222. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/_cli_helpers.py +0 -0
  223. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/__init__.py +0 -0
  224. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/_retry.py +0 -0
  225. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/recaptcha.py +0 -0
  226. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/routes.py +0 -0
  227. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  228. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  229. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  230. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  231. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  232. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  233. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/auth/__init__.py +0 -0
  234. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/auth/base.py +0 -0
  235. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/auth/factory.py +0 -0
  236. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/auth/strategies.py +0 -0
  237. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/auth/verification.py +0 -0
  238. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/cli_run.py +0 -0
  239. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/manifest.py +0 -0
  240. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/observability.py +0 -0
  241. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/src/gflow_cli/profile_store.py +0 -0
  242. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tasks/lessons.md +0 -0
  243. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/test_assets/sample_batch.json +0 -0
  244. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/test_assets/sample_batch.tsv +0 -0
  245. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/test_assets/sample_batch_invalid.tsv +0 -0
  246. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/__init__.py +0 -0
  247. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/__init__.py +0 -0
  248. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/test_client_image.py +0 -0
  249. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/test_dto.py +0 -0
  250. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/test_image.py +0 -0
  251. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/test_image_dto.py +0 -0
  252. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/test_recaptcha.py +0 -0
  253. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/test_retry.py +0 -0
  254. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/test_routes.py +0 -0
  255. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/__init__.py +0 -0
  256. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_base.py +0 -0
  257. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_bearer.py +0 -0
  258. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  259. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_factory.py +0 -0
  260. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_fingerprint.py +0 -0
  261. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_sapisidhash.py +0 -0
  262. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  263. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  264. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/auth/strategies/test_factory.py +0 -0
  265. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/auth/strategies/test_strategies.py +0 -0
  266. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/auth/test_verification.py +0 -0
  267. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/cli/__init__.py +0 -0
  268. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  269. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/cli/test_cli_run.py +0 -0
  270. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/cli/test_error_handling.py +0 -0
  271. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/cli/test_helpers.py +0 -0
  272. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  273. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/conftest.py +0 -0
  274. {gflow_cli-0.8.0/tests/e2e → gflow_cli-0.9.0/tests/data}/__init__.py +0 -0
  275. {gflow_cli-0.8.0/tests/features → gflow_cli-0.9.0/tests/e2e}/__init__.py +0 -0
  276. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/e2e/conftest.py +0 -0
  277. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  278. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  279. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  280. {gflow_cli-0.8.0/tests/image_batch → gflow_cli-0.9.0/tests/features}/__init__.py +0 -0
  281. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/features/auth.feature +0 -0
  282. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/features/auth_login.feature +0 -0
  283. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/features/conftest.py +0 -0
  284. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/features/image.feature +0 -0
  285. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/features/test_auth_login_steps.py +0 -0
  286. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/features/test_auth_steps.py +0 -0
  287. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/features/test_step_collision_guard.py +0 -0
  288. {gflow_cli-0.8.0/tests/smoke → gflow_cli-0.9.0/tests/fixtures}/__init__.py +0 -0
  289. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/smoke/test_real_flow.py +0 -0
  290. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/test_auth.py +0 -0
  291. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/test_browser_manager.py +0 -0
  292. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/test_config.py +0 -0
  293. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/test_manifest.py +0 -0
  294. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/test_observability.py +0 -0
  295. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/test_paths.py +0 -0
  296. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/test_profile_store.py +0 -0
  297. {gflow_cli-0.8.0 → gflow_cli-0.9.0}/tests/test_smoke.py +0 -0
@@ -0,0 +1,259 @@
1
+ ---
2
+ description: Use before cutting any gflow-cli release or after a major documentation change — systematic council-driven audit that combines a mechanical 7-section checklist with a 3-agent parallel review (completeness / cross-reference / drift). Produces a consensus verdict and a concrete fix list.
3
+ ---
4
+
5
+ # `/gflow:doc-review` — Documentation Review Gate
6
+
7
+ Run this gate before cutting a release. Two phases:
8
+
9
+ 1. **Mechanical checks** (sections 1–7 below) — fast, scripted, deterministic. Run inline.
10
+ 2. **LLM council audit** (section 8) — 3 parallel review subagents, then consensus synthesis. The mechanical pass catches stale strings and dead links; the council catches drift between docs, fictional claims, and gaps a human reader would notice.
11
+
12
+ Every item reports **PASS / UPDATED / WARN / FAIL**. Any **FAIL** or any **RED** council verdict blocks the release.
13
+
14
+ > **Provenance:** the council protocol below was validated on the v0.8.1 docs refresh release (2026-05-23). The audit found 11 fixable issues that the mechanical checklist alone missed (e.g., the `experimental/` subpackage fiction in 3 files, the `gflow video i2v` non-working hero snippet in README). Keep the council step — it pays for itself.
15
+
16
+ ---
17
+
18
+ ## 0 · Pre-flight
19
+
20
+ - Confirm you are on the release branch (`release/vX.Y.Z` or `hotfix/...`), not on `develop` or `main`.
21
+ - If a release spec exists at `docs/superpowers/specs/YYYY-MM-DD-*-design.md`, identify it now — the council auditors will use it as the ground truth for "what was supposed to ship."
22
+ - If there is no spec, that is also fine — the council will work from the docs alone, but flag the absence as a process risk.
23
+
24
+ ---
25
+
26
+ ## 1 · Version references
27
+
28
+ Check these files for stale version strings (old numbers, outdated status labels):
29
+
30
+ | File | What to verify |
31
+ |---|---|
32
+ | `README.md` | Status badge, "Project status" section, install example |
33
+ | `AGENTS.md` | Module list, exit-code range, dev-environment commands |
34
+ | `llms.txt` | Header summary (Python version, stable surface claims) |
35
+ | `CLAUDE.md` | "Active phase" pointer if present |
36
+ | `PLAN.md` | Phase status (`IN PROGRESS` / `DONE`) and version annotations |
37
+ | `KNOWN_ISSUES.md` | `Open` entries resolved by this release → move to `Resolved` with evidence |
38
+ | `CHANGELOG.md` | `[Unreleased]` empty; link footer matches new version |
39
+ | `pyproject.toml` + `src/gflow_cli/__init__.py` | Both set to the new version |
40
+ | `docs/PROJECT_STATUS.md` | "Current release" subsection + milestone-history row for this version |
41
+
42
+ Quick grep:
43
+
44
+ ```bash
45
+ grep -rn "v[0-9]\+\.[0-9]" README.md AGENTS.md llms.txt CLAUDE.md PLAN.md KNOWN_ISSUES.md CHANGELOG.md pyproject.toml docs/PROJECT_STATUS.md
46
+ ```
47
+
48
+ Historical references in `CHANGELOG.md`, `docs/LIVE_VERIFICATION_v*.md`, and milestone-history rows in `docs/PROJECT_STATUS.md` are allowed.
49
+
50
+ ---
51
+
52
+ ## 2 · `docs/INDEX.md` completeness
53
+
54
+ Every `.md` in `docs/` needs an entry; every entry must point to a real file. AGENTS.md and llms.txt also need rows since they are agent-facing entry points.
55
+
56
+ ```bash
57
+ # Files in docs/ missing from INDEX.md
58
+ for f in docs/*.md; do
59
+ grep -q "$(basename "$f")" docs/INDEX.md || echo "MISSING from INDEX: $f"
60
+ done
61
+
62
+ # Entries in INDEX.md pointing to deleted files
63
+ grep -o 'docs/[^)]*\.md' docs/INDEX.md | while read path; do
64
+ [ -f "$path" ] || echo "DEAD LINK in INDEX: $path"
65
+ done
66
+
67
+ # AGENTS.md, llms.txt rows present?
68
+ grep -E "AGENTS\.md|llms\.txt" docs/INDEX.md || echo "MISSING: agent-facing root files row"
69
+ ```
70
+
71
+ ---
72
+
73
+ ## 3 · Per-release evidence file
74
+
75
+ After each release a `docs/LIVE_VERIFICATION_vX.Y.Z.md` must exist.
76
+
77
+ - Latest version has one (create stub if live run already documented elsewhere).
78
+ - `docs/INDEX.md` "latest release" cue points to it.
79
+ - Previous versions' files are preserved (historical record — never delete).
80
+ - File contains both a **Pre-tag gates** section (filled before signing) and a **Post-tag evidence** section (filled after publish).
81
+
82
+ ---
83
+
84
+ ## 4 · Doc-link validation
85
+
86
+ Run the link checker:
87
+
88
+ ```powershell
89
+ $env:PYTHONUTF8=1
90
+ uv run python scripts/ci/check_doc_links.py
91
+ ```
92
+
93
+ Expected: `All links resolved across N files.` (exit 0). Broken links must be fixed in source docs before continuing — do not edit the script to ignore them.
94
+
95
+ If `scripts/ci/check_doc_links.py` is absent, create it from the v0.8.1 plan (it is a 30-line stdlib-only Python script).
96
+
97
+ ---
98
+
99
+ ## 5 · `.claude/commands/gflow/` skill files
100
+
101
+ Scan all skills for stale phase/version references:
102
+
103
+ ```bash
104
+ grep -rn "v[0-9]\+\.[0-9]\|Phase [A-Z0-9]" .claude/commands/gflow/
105
+ ```
106
+
107
+ Update in the release prep commit if any references are wrong. The `release.md` skill's step list and the `plan.md` skill's phase pointers age fastest.
108
+
109
+ ---
110
+
111
+ ## 6 · CHANGELOG link footer
112
+
113
+ ```bash
114
+ tail -10 CHANGELOG.md
115
+ ```
116
+
117
+ Must read: `[Unreleased]: …compare/vNEW_VERSION…HEAD` and each prior `[X.Y.Z]: …compare/vPREV…vCURR`.
118
+
119
+ ---
120
+
121
+ ## 7 · Memory files
122
+
123
+ Check `C:\Users\ffrol\.claude\projects\C--development-github-gflow-cli\memory\`:
124
+
125
+ | File | What to verify |
126
+ |---|---|
127
+ | `MEMORY.md` | All listed files exist; no dangling entries |
128
+ | `phase-b-followups.md` | Items shipped in this release marked done |
129
+ | `video-generation-spec.md` | PR/status accurate |
130
+ | `image-generation-401-next.md` | Resolution status and evidence pointer still valid |
131
+ | `release-signing.md` | Procedure section matches what was actually done |
132
+ | `release-back-merge-gap-recovery.md` | Still relevant; gap from any prior release recorded |
133
+
134
+ ```bash
135
+ cd "C:\Users\ffrol\.claude\projects\C--development-github-gflow-cli\memory"
136
+ grep -o '\[.*\]([^)]*\.md)' MEMORY.md | grep -o '([^)]*)' | tr -d '()' | while read f; do
137
+ [ -f "$f" ] || echo "DEAD LINK: $f"
138
+ done
139
+ ```
140
+
141
+ ---
142
+
143
+ ## 8 · LLM council audit (NEW — required for every release ≥ v0.8.1)
144
+
145
+ The mechanical checks above catch stale strings, dead links, and missing files. They do **not** catch:
146
+
147
+ - A doc claiming a subpackage exists when it does not (no string sweep would notice).
148
+ - Two docs covering the same topic with subtly different facts.
149
+ - A working-looking hero snippet that points to a stub command (`gflow video i2v` returned "not yet available" but appeared as a production loop above the fold in v0.8.1).
150
+ - A user-facing onboarding gap that a fresh reader would hit immediately.
151
+
152
+ The council does. Dispatch three review subagents **in parallel** (they are read-only and independent). Each writes its verdict to `tmp/council/`.
153
+
154
+ ### Setup
155
+
156
+ ```bash
157
+ mkdir -p tmp/council
158
+ ```
159
+
160
+ ### Auditor 1 — Completeness
161
+
162
+ Role: as a fresh user / fresh AI agent, **what do you need that isn't there?**
163
+
164
+ Audit:
165
+ - `README.md`, `AGENTS.md`, `llms.txt`, `CLAUDE.md`, `docs/INDEX.md`, `docs/PROJECT_STATUS.md`
166
+ - `docs/ARCHITECTURE.md` (especially any new sections)
167
+ - `docs/LIVE_VERIFICATION_v*.md` (latest)
168
+ - `CHANGELOG.md` (just the new entry)
169
+ - `pyproject.toml`
170
+ - The release spec at `docs/superpowers/specs/` (if present)
171
+ - The implementation plan at `docs/superpowers/plans/` (if present)
172
+
173
+ Output to `tmp/council/01-completeness.md` with verdict GREEN / YELLOW / RED and four sections:
174
+ 1. Critical gaps (block release)
175
+ 2. Important gaps (fix before next release)
176
+ 3. Nice-to-haves (track for next version)
177
+ 4. What's done well (preserve)
178
+
179
+ ### Auditor 2 — Cross-reference & alignment
180
+
181
+ Role: do the docs **agree with each other**? Where two files cover the same topic, do they say the same thing?
182
+
183
+ Check:
184
+ - Install instructions, auth flow, headed-browser story, version number, Python requirement — all match exactly?
185
+ - Internal `[X](path)` links — files exist AND claims at the link target equivalent to the linking-doc's claim?
186
+ - Routing chain (README → AGENTS.md → CLAUDE.md → docs/INDEX.md) — consistent? Any contradictions?
187
+ - CHANGELOG vs PROJECT_STATUS — milestone history matches changelog entries?
188
+ - Spec vs implementation — does the shipped state match the design spec?
189
+
190
+ Output to `tmp/council/02-crossref.md` with verdict + four sections (inconsistencies / drift / broken anchors / well-aligned).
191
+
192
+ ### Auditor 3 — Drift & staleness
193
+
194
+ Role: does the documentation match the actual code and project state? **Where are claims unverifiable, contradicted by reality, or referencing things that no longer exist?**
195
+
196
+ Check empirically (every claim needs `ls` / `grep` / `cat` evidence cited inline):
197
+ - Version claims — `pyproject.toml`, `__init__.py`, every "v0.8.1 — alpha" statement agree?
198
+ - Module / file claims — every `src/gflow_cli/{...}` module list verified against the actual source tree?
199
+ - Subpackage claims (e.g., `experimental/`) — do those directories exist?
200
+ - CLI command claims in hero snippets — is the subcommand really implemented? Does it actually do what the example shows, or is it a stub?
201
+ - Exit-code claims — verify the range against `errors.py::EXIT_CODE_MAP`.
202
+ - Skill files, GIF assets, slash-command files — exist at the paths claimed?
203
+
204
+ Output to `tmp/council/03-drift.md` with verdict + three sections (fictional claims / stale references / verified-real).
205
+
206
+ ### Consensus
207
+
208
+ After all three reports return:
209
+
210
+ 1. Read all three. List every distinct finding.
211
+ 2. Tier the findings:
212
+ - **Tier 1 (release-blocking)** — any RED verdict, any "block release" finding, any fictional claim that ships to PyPI.
213
+ - **Tier 2 (important polish)** — drift between related docs, minor mismatches, missing-but-recoverable references.
214
+ - **Tier 3 (track for later)** — nice-to-haves, prose improvements, deferred features.
215
+ 3. Apply Tier 1 fixes immediately (block the release until done).
216
+ 4. Apply Tier 2 fixes if the release schedule permits, otherwise open issues.
217
+ 5. Tier 3 → backlog (memory `phase-X-followups.md` or a new GitHub issue).
218
+
219
+ Synthesize a single fix-plan comment under the relevant `LIVE_VERIFICATION_vX.Y.Z.md` `Pre-tag gates` entry for `/gflow:doc-review`:
220
+
221
+ > _Council verdict: <GREEN|YELLOW|RED> across all 3 auditors. <N> findings; <M> Tier 1 fixed in commit <SHA>, <K> Tier 2 fixed in commit <SHA2>, <J> Tier 3 deferred to backlog. Council reports at `tmp/council/0{1,2,3}-*.md` (local-only)._
222
+
223
+ If any auditor returns RED, **stop and escalate to the user**. Do not apply fixes blindly to a RED finding — it usually means the doc is wrong about the code, the code is wrong about the doc, or both.
224
+
225
+ ---
226
+
227
+ ## Output format
228
+
229
+ After each section write one line:
230
+
231
+ ```
232
+ [0] Pre-flight — PASS (release spec at docs/superpowers/specs/YYYY-MM-DD-*.md)
233
+ [1] Version refs — PASS
234
+ [2] INDEX completeness — UPDATED (added AGENTS.md row)
235
+ [3] Evidence file — PASS
236
+ [4] Doc-link check — PASS (9 files, 0 broken)
237
+ [5] Skill files — UPDATED (refreshed /gflow:plan phase pointer)
238
+ [6] CHANGELOG footer — PASS
239
+ [7] Memory files — WARN: phase-b-followups.md has shipped items not yet ticked
240
+ [8] Council audit — YELLOW (11 findings, all fixed in commit abc1234)
241
+ ```
242
+
243
+ Then list every **UPDATED** change, every **WARN** / **FAIL** finding, and the council fix list for the user to review.
244
+
245
+ ---
246
+
247
+ ## Integration with `/gflow:release`
248
+
249
+ This skill is invoked at **step 9** of `/gflow:release` (between "review commands for staleness" and "commit the release prep"). The mechanical pass (sections 1–7) is the same as before; the council audit (section 8) is the new requirement and runs after the mechanical pass succeeds.
250
+
251
+ All discovered fixes are folded into the release prep commit unless genuinely unrelated to the release.
252
+
253
+ ---
254
+
255
+ ## Post-release: memory consolidation
256
+
257
+ After the release ships and the back-merge completes, the **release spec** and **implementation plan** under `docs/superpowers/{specs,plans}/` are project-management artifacts, not user-facing docs. The durable knowledge they contain (patterns learned, governance rules, architecture decisions) should be extracted into project memory at `~/.claude/projects/<...>/memory/`, then the spec/plan files **deleted from the repo** in a final cleanup commit.
258
+
259
+ This keeps the public-facing `docs/` tree focused on what users and contributors need, while the planning artifacts live on as memory entries usable by future Claude Code sessions. See the `release-back-merge-gap-recovery` memory and the v0.8.1 release commit history for an example.
@@ -77,3 +77,12 @@
77
77
  # (Google's bot-detection sometimes refuses headless Chromium but accepts a
78
78
  # visible window). The session is still reused from the persistent profile.
79
79
  # GFLOW_CLI_HEADLESS=true
80
+
81
+ # BCP-47 locale tag passed to Playwright's launch `locale=` parameter
82
+ # (controls Accept-Language only — Chrome's UI language is forced to
83
+ # en-US via the `--lang=en-US` launch arg regardless of this setting, so
84
+ # Flow stays on /fx/tools/flow/ instead of /fx/<locale>/). Default:
85
+ # `en-US`. Override to capture locale-invariant DOM via
86
+ # scripts/dev/capture_locale_invariants.py or to live-verify a non-EN
87
+ # language end-to-end (see KNOWN_ISSUES § issue #24).
88
+ # GFLOW_CLI_LOCALE=en-US
@@ -0,0 +1,78 @@
1
+ # AGENTS.md — gflow-cli
2
+
3
+ > Universal entry point for AI coding agents. Read this first; everything else routes from here.
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.
6
+
7
+ ## Project at a glance
8
+
9
+ - Unofficial Python CLI for [Google Flow](https://labs.google/fx/tools/flow) — drives Veo (image-to-video, text-to-video) and Imagen (text-to-image) generations from the terminal by reverse-engineering Flow's private REST API at `aisandbox-pa.googleapis.com`.
10
+ - Python 3.11+ · `uv`-managed · `hatchling` builds · Playwright Chromium transport · `pyright` strict · `ruff` · `pytest`.
11
+ - Single-package modular monolith. Top-level modules under `src/gflow_cli/`: `api/`, `auth/`, `browser_manager.py`, `cli.py`, `_cli_helpers.py`, `cli_data.py`, `cli_image.py`, `cli_run.py`, `cli_video.py`, `config.py`, `data/`, `errors.py`, `exceptions.py`, `image_batch.py`, `manifest.py`, `observability.py`, `paths.py`, `profile_store.py`.
12
+ - Requires a Google AI Ultra or Pro subscription with Flow access. All generations bill against the user's own Google account.
13
+
14
+ ## Headed-browser dependency (architectural reality)
15
+
16
+ gflow-cli currently drives Flow via a **real Chrome session managed by Playwright** — `ui_automation` transport. Google's auth + reCAPTCHA stack rejects Playwright's bundled Chromium and most headless approaches. This is the project's defining trade-off:
17
+
18
+ - ✅ Works end-to-end against live Pro/Ultra accounts.
19
+ - ❌ Requires a saved Chrome profile, a display server for one-time login, and ~150 MB for Chromium.
20
+ - ❌ Cannot run on serverless / headless CI workers without prerecorded profile transplant.
21
+ - ❌ Per-account horizontal concurrency is capped by what one warm Page pool can drive.
22
+
23
+ If you can help unblock a pure HTTP transport (especially for video generation, where HTTP 401 + reCAPTCHA mints currently block us), please open an issue — see the README "Architecture & current limitations" section.
24
+
25
+ ## Dev environment tips
26
+
27
+ - `uv sync` then `uv run playwright install chromium`. No global Python install needed.
28
+ - Copy `.env.template` to `.env.local`; never commit `.env.local`. It documents every env var.
29
+ - Output goes to `./tmp/` for scripts/tests or `$GFLOW_CLI_OUTPUT_DIR` for CLI outputs (defaults to `./out/`).
30
+ - One-time auth: `gflow auth login --browser chrome`. The `--browser chrome` flag is mandatory; the CLI fails fast on other strategies.
31
+ - Use `/gflow:plan` to see the active phase before starting work; `/gflow:known-issues` before touching auth or reCAPTCHA code paths.
32
+
33
+ ## Testing instructions — The Impeccable Routine
34
+
35
+ Run these gates in order before every commit:
36
+
37
+ ```powershell
38
+ $env:PYTHONUTF8=1
39
+ uv run python scripts/ci/check_repo_hygiene.py
40
+ uv run ruff check src tests
41
+ uv run ruff format --check src tests
42
+ uv run pyright src
43
+ uv run python -m pytest -q --cov=gflow_cli
44
+ ```
45
+
46
+ Or invoke the wrapper: `/gflow:check`.
47
+
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
+ - TDD is non-negotiable. Coverage floor: 80% overall.
50
+ - Live tests (`@pytest.mark.live`) opt in via `GFLOW_LIVE=1`. E2E tests require `GFLOW_CLI_E2E_PROFILE`.
51
+
52
+ ## Code style
53
+
54
+ - Type hints everywhere; `pyright` strict on `src/gflow_cli`.
55
+ - Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
56
+ - Errors as RFC 9457 Problem Details with stable per-class exit codes (3–16, where 16 is the `DataStoreError` family from `gflow_cli.data`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
57
+ - 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
58
+
59
+ ## PR instructions
60
+
61
+ - Branch naming: `feature/`, `bugfix/`, `hotfix/`, `chore/`, `docs/`, `test/`, `release/` — never `claude/` or unprefixed.
62
+ - `develop` is the integration branch; `main` is protected. Releases tag off `main` only.
63
+ - **Never add AI attribution to commit messages.** `Co-Authored-By:` trailers are fine if the user asks for them; auto-generated "🤖 Generated with Claude Code" footers are not.
64
+ - Run `/gflow:check` (or the Impeccable Routine) before every commit.
65
+ - All releases require a signed annotated tag (`git tag -s vX.Y.Z`); CI rejects unsigned tags.
66
+
67
+ ## Where to look next
68
+
69
+ - **Architecture & target shape** → [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
70
+ - **Mandates & routing rules** → [docs/AGENT_GUIDE.md](docs/AGENT_GUIDE.md)
71
+ - **Full docs index** → [docs/INDEX.md](docs/INDEX.md)
72
+ - **Known issues** (read before touching auth / reCAPTCHA) → [KNOWN_ISSUES.md](KNOWN_ISSUES.md)
73
+ - **Active phase & backlog** → [PLAN.md](PLAN.md) or run `/gflow:plan`
74
+ - **Release protocol** → [RELEASE.md](RELEASE.md)
75
+
76
+ ## Claude Code-specific notes
77
+
78
+ [CLAUDE.md](CLAUDE.md) carries the auto-load instructions Claude Code reads natively. It cross-references this file for the universal rules; Claude-Code-specific session protocol (skills, slash commands, memory) stays in CLAUDE.md.
@@ -7,6 +7,142 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.9.0] — 2026-05-25
11
+
12
+ > **Maturity & Visibility release.** Surfaces the SQLite catalog (PR #52/#58)
13
+ > via a read-only `gflow data list {projects,images,videos,profiles}` CLI,
14
+ > publishes `ROADMAP.md`, and ships the locale-agnostic media-dialog
15
+ > selectors that unblock non-English Chrome profiles. Plus the previously-
16
+ > unreleased video model picker, i2v/r2v, and the I2I ref-attach + model-
17
+ > select fixes. Sponsorship wiring will land in a follow-up patch release
18
+ > once GitHub Sponsors / Buy Me a Coffee accounts are fully provisioned.
19
+
20
+ ### Added
21
+
22
+ - `gflow data list {projects,images,videos,profiles}` — read-only catalog
23
+ query CLI over the local SQLite data layer. Flags: `--limit` (1..1000,
24
+ default 20), `--offset` (≥0, default 0), `--profile NAME`, `--json`.
25
+ Rich table on TTY, JSONL on pipe or `--json`. Default sort: newest first.
26
+ `DataStoreError` family maps to exit code 16. See
27
+ [`docs/DATA_LAYER.md § Querying the data layer`](docs/DATA_LAYER.md#querying-the-data-layer).
28
+ - `ROADMAP.md` at repo root — themed milestones from v0.9 through v1.0 (no
29
+ dates).
30
+ - `gflow video t2v` model picker: `--model` (`omni-flash` | `veo-lite` |
31
+ `veo-fast` | `veo-quality` | `veo-lite-lp`), `--duration` (`4`/`6`/`8`, plus
32
+ `10` for `omni-flash` only), and `--count` (1–4). Driven via the editor's
33
+ generation-settings panel; live-verified against a Pro/Ultra profile.
34
+ - `gflow video i2v <image> "<prompt>"` — image-to-video with a start frame and
35
+ an optional `--end-image` (interpolation). Fires
36
+ `batchAsyncGenerateVideoStartImage` / `…StartAndEndImage`.
37
+ - `gflow video r2v "<prompt>" --ref <img> [--ref …]` — reference-to-video
38
+ (Flow "ingredients"). Model-aware reference cap (omni_flash ≤7, veo_3_1_* ≤3)
39
+ enforced in the request DTO; the transport stops gracefully if Flow hides the
40
+ add-media button at the cap. Fires `batchAsyncGenerateVideoReferenceImages`.
41
+ - `GFLOW_CLI_LOCALE` env var — overrides Playwright's launch `locale=` parameter
42
+ (default: `en-US`). Controls `Accept-Language` only; Chrome's UI language is
43
+ still forced to en-US via `--lang=en-US`. Prep for issue #24 (locale-agnostic
44
+ selectors); live-verified end-to-end with `GFLOW_CLI_LOCALE=pt-BR` against a
45
+ Pro/Ultra account. See `docs/CONFIGURATION.md § GFLOW_CLI_LOCALE`.
46
+ - **Local data layer** — `gflow-cli` now keeps a SQLite catalog of every new
47
+ image, batch, and video operation under `$GFLOW_CLI_DB_PATH` (default:
48
+ `~/.local/share/gflow-cli/data.db`). Records profile, project, asset
49
+ (model / aspect / dimensions / Flow media ID), operation provenance
50
+ (mode / prompt / model / timing / error), input↔output links, and
51
+ downloaded local files. New `gflow data media <id>` command resolves a
52
+ Flow media ID to its origin. `DataRepository` exposes seed-image resolvers
53
+ (`resolve_seed_image_by_path` / `resolve_seed_image` /
54
+ `resolve_latest_image`) — foundation for the upcoming I2V seed-reuse
55
+ path. Pre-Flow store failures exit `16` (`DataStoreError` /
56
+ `DataMigrationError` / `DataIntegrityError`); post-success store
57
+ failures warn and exit `0` (Flow already charged the credits). See
58
+ [`docs/DATA_LAYER.md`](docs/DATA_LAYER.md). (PR #58, stacked on #52.)
59
+
60
+ ### Changed
61
+
62
+ - `MAX_REFERENCE_IMAGES` (in `api/video.py`) now tracks the `omni_flash`
63
+ ceiling of **7** (was **3**). The tighter per-model cap (`veo_3_1_* ≤ 3`) is
64
+ still enforced in `GenerateVideoRequest.__post_init__` when the model is
65
+ known; the constant is only the absolute upper bound. Anyone pinning to the
66
+ old value of 3 should re-check against the per-model caps.
67
+
68
+ ### Fixed
69
+
70
+ - `FlowApiClient.__aenter__` now tears down a partially-launched browser if any
71
+ step after the Playwright driver starts raises (e.g. the persistent-context
72
+ launch, the bootstrap navigation, or `transport.setup`). Python does not call
73
+ `__aexit__` when `__aenter__` raises, so an unguarded failure orphaned the
74
+ chrome process, which then held the profile's user-data-dir lock — the next
75
+ run could not acquire it and spiralled into rapid `about:blank` tabs +
76
+ `TargetClosedError`. Context close + driver stop are now shared by
77
+ `__aenter__`'s guard and `__aexit__` via `_close_browser_resources`.
78
+ - `gflow image i2i --ref <local-file>` now binds the reference through the
79
+ editor's media dialog instead of the REST `uploadImage` endpoint (which 401s —
80
+ same root as #15/#39). Local-path refs ride a new `GenerateImageRequest.ref_paths`
81
+ field and are attached via the inherited R2V `_attach_references` (the image-mode
82
+ add-media dialog is the same `add_2` surface). Bare-UUID `--ref` still flows
83
+ through `refs` unchanged. Re-introduces #50 (reverted in #57 for the account/
84
+ locale variant tracked in #56); the media-dialog selectors are now
85
+ locale-agnostic (see the next entry).
86
+ - The media-dialog upload selectors are now **locale-agnostic** (issue #56/#24).
87
+ `UPLOAD_MEDIA_BUTTON` matched localized text (`has-text('Upload media')`), so on
88
+ a non-English Chrome profile (Flow follows the *Chrome profile* language, which
89
+ the `--lang=en-US` arg cannot override) the click missed and the file chooser
90
+ never opened — a silent ~34s hang. It now anchors on the locale-free `upload`
91
+ icon ligature (`:text-is('upload')`, exact, so it doesn't grab the `Uploads`
92
+ tab), with the original English-text selector kept as a graceful **fallback
93
+ tier** (matches if Google ever changes the icon but keeps the English label);
94
+ 'Add to Prompt' (which has no icon) is selected structurally as the only
95
+ iconless button in the open dialog. If neither tier opens a chooser,
96
+ `_upload_via_open_dialog` raises a clear error + writes a screenshot (no silent
97
+ hang) and points the operator at the Chrome-profile-language workaround. Fixes
98
+ I2I/I2V/R2V upload alike.
99
+ - `gflow image t2i/i2i --model` now actually selects the requested model. It was
100
+ a no-op under `ui_automation` (the wire field was set but the model picker was
101
+ never clicked, so Flow used its UI default). Adds `_select_image_model`.
102
+ - Video selector mismatches: the output-count selector `[id*=-trigger-1]`
103
+ collided with the `-trigger-10` duration tab; the aspect selector matched a
104
+ non-existent `aria-controls*=9_16`; the video-mode tab match was ambiguous.
105
+ All now use exact `[id$=-trigger-X]` suffixes + aria-label text.
106
+
107
+ ### Build
108
+
109
+ - **Wheel build no longer emits duplicate ZIP entries.** An earlier attempt at
110
+ tagging v0.9.0 was rejected by PyPI with HTTP 400 ("Duplicate filename in
111
+ local headers") because `pyproject.toml` had
112
+ `[tool.hatch.build.targets.wheel.force-include]` and
113
+ `[tool.hatch.build.targets.sdist.force-include]` blocks pointing at
114
+ `src/gflow_cli/data/migrations`, on top of the already-comprehensive
115
+ `packages = ["src/gflow_cli"]` directive — hatchling included the
116
+ migrations directory twice (both `__init__.py` and `0001_initial.sql`). The
117
+ force-include blocks have been removed; hatchling's default package
118
+ inclusion already covers `.sql` files inside the package tree. (PR #74.)
119
+
120
+ ### Notes
121
+
122
+ - I2V/R2V image inputs bind through the editor's media dialog (frame slot /
123
+ add-media → "Upload media" → file chooser → "Add to Prompt"). `set_input_files`
124
+ on the generic hidden input only adds to the library and Flow then ignores the
125
+ image (plain Text route). The editor is forced to English via the
126
+ `--lang=en-US` Chromium launch arg because the slot/dialog labels are localized
127
+ with no locale-free anchor.
128
+
129
+ ## [0.8.1] — 2026-05-23
130
+
131
+ ### Documentation
132
+
133
+ - README rewritten as a hybrid router (~150 lines, was 398). New: prominent unofficial-tool + headed-browser callouts above the fold, polished 60-second quick start, in-depth-quick-start link, "For AI agents & LLMs" routing table, ripgrep-style documentation TOC.
134
+ - New [AGENTS.md](AGENTS.md) at repo root — universal agent spec consumed by 60k+ repos' tooling (Cursor, Codex, Aider, Gemini CLI, Claude Code, Copilot, opencode, etc.). Closes the gap left by having Claude-Code-only memory.
135
+ - New [llms.txt](llms.txt) at repo root — llmstxt.org-format summary for end-users feeding the project into an LLM. Forward-staged for a future docs site.
136
+ - New [docs/PROJECT_STATUS.md](docs/PROJECT_STATUS.md) — moved the full milestone table out of README; added lifecycle policy section.
137
+ - [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) absorbed the ASCII system diagram + Auth strategy paragraphs from README; gained a new "Headed-browser dependency — current limitation" subsection that documents the three retired HTTP transports and invites contributor work on a pure-REST path.
138
+ - [CLAUDE.md](CLAUDE.md) trimmed from ~80 to ~25 lines; universal coding-agent rules now live in AGENTS.md, with CLAUDE.md carrying Claude-Code-specific session protocol only.
139
+ - All `v0.7.0` references that meant "current" updated to `v0.8.1`. Historical mentions preserved in CHANGELOG and `docs/LIVE_VERIFICATION_v0.7.0.md`.
140
+ - New per-release evidence file [docs/LIVE_VERIFICATION_v0.8.1.md](docs/LIVE_VERIFICATION_v0.8.1.md).
141
+
142
+ ### Released
143
+
144
+ - PyPI: https://pypi.org/project/gflow-cli/0.8.1/ — refreshes the stale README rendering left over from v0.8.0.
145
+
10
146
  ## [0.8.0] — 2026-05-23
11
147
 
12
148
  > **Multi-image-prompt release + transport hardening.** Introduces the
@@ -809,7 +945,9 @@ shell-script template that branches on these codes.
809
945
 
810
946
  First skeleton. Not functional end-to-end yet.
811
947
 
812
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.8.0...HEAD
948
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.9.0...HEAD
949
+ [0.9.0]: https://github.com/ffroliva/gflow-cli/compare/v0.8.1...v0.9.0
950
+ [0.8.1]: https://github.com/ffroliva/gflow-cli/compare/v0.8.0...v0.8.1
813
951
  [0.8.0]: https://github.com/ffroliva/gflow-cli/compare/v0.7.0...v0.8.0
814
952
  [0.7.0]: https://github.com/ffroliva/gflow-cli/compare/v0.6.0a6...v0.7.0
815
953
  [0.6.0a6]: https://github.com/ffroliva/gflow-cli/compare/v0.6.0a5...v0.6.0a6
@@ -0,0 +1,27 @@
1
+ # CLAUDE.md
2
+
3
+ > Project memory hub for **Claude Code**. The universal coding-agent rules for any tool (Cursor, Codex, Aider, Gemini CLI, etc.) live in [AGENTS.md](AGENTS.md) — this file carries Claude-Code-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
+ ## Claude-Code-specific
20
+
21
+ - Slash commands live under `.claude/commands/gflow/` (all prefixed `/gflow:`).
22
+ - Skills under `skills/` are auto-discoverable; `gflow-cli` ships its own at [`skills/gflow-cli/SKILL.md`](skills/gflow-cli/SKILL.md).
23
+ - Auto-memory at `~/.claude/projects/C--development-github-gflow-cli/memory/MEMORY.md` carries cross-session feedback and project state.
24
+
25
+ ## Active phase
26
+
27
+ See [PLAN.md](PLAN.md) or run `/gflow:plan` for the current detailed plan.
@@ -319,7 +319,21 @@ issue and not blocked by any code change in this repo.
319
319
 
320
320
  - **Status:** Mitigated · **Severity:** Medium · **Tracking:** [issue #24](https://github.com/ffroliva/gflow-cli/issues/24)
321
321
 
322
- The Phase 7 multi-image-prompt work addressed the count-tab selectors:
322
+ **Progress (2026-05-24, develop / post-v0.8.1, unreleased):**
323
+
324
+ - **PR #51** — Playwright's launch `locale=` is now env-overridable via
325
+ `GFLOW_CLI_LOCALE` (default: `en-US`). Live-verified end-to-end with
326
+ `GFLOW_CLI_LOCALE=pt-BR uv run pytest -m e2e tests/e2e/test_video_t2v_e2e.py`
327
+ (1 credit, ~2.5 MB mp4, `MEDIA_GENERATION_STATUS_SUCCESSFUL`).
328
+ - **PR #48** — added the `--lang=en-US` Chromium launch arg so the editor UI
329
+ itself stays in English regardless of the user's profile/system language.
330
+ Currently mandatory because the I2V frame-slot labels and parts of
331
+ `ONBOARDING_SELECTORS` / `NEW_PROJECT_SELECTORS` / `SUBMIT_BUTTON_SELECTORS`
332
+ still match by localized text. Dropping `--lang=en-US` is the goal but
333
+ requires invariant capture across the remaining text-matched selectors
334
+ (`scripts/dev/capture_locale_invariants.py` is the diagnostic).
335
+
336
+ **Earlier — Phase 7 multi-image-prompt work** addressed the count-tab selectors:
323
337
  - `_COUNT_TAB_TEXT_RE = ^(1x|x[2-4])$` only matches the digit+x format Flow
324
338
  renders identically in every locale (numbers/symbols are not translated).
325
339
  - `_set_count` falls back to positional `.nth(count - 1)` when the read-back
@@ -343,6 +357,34 @@ in English or Portuguese.
343
357
 
344
358
  ---
345
359
 
360
+ ### `omni-flash` t2v response omits operation name — `flow_operation_id` persists NULL
361
+
362
+ - **Status:** Open · **Severity:** Low · **Affects:** v0.9.0+ (data layer)
363
+
364
+ The data layer's `on_started` callback captures
365
+ `operations[0].operation.name` from each `batchAsyncGenerateVideoText`
366
+ response and persists it as `operations.flow_operation_id`. The
367
+ `omni-flash` model's response shape does not carry that field, so
368
+ omni-flash rows end up with `flow_operation_id` NULL while `veo-*` rows
369
+ carry the expected `operations/...` identifier. The rest of the row
370
+ (prompt, model, aspect, started/completed timestamps, batch ID, output
371
+ paths) is recorded normally.
372
+
373
+ **Impact:** cosmetic for now — `gflow data media <id>` and provenance
374
+ lookup by Flow media ID still work. Any future feature that joins on
375
+ `flow_operation_id` (none in the current CLI) would miss omni-flash
376
+ rows.
377
+
378
+ **Workaround:** none needed if you don't query by `flow_operation_id`.
379
+
380
+ **Roadmap:** capture an `omni-flash` `batchAsyncGenerateVideoText`
381
+ response sample, identify the equivalent provenance handle (if any), and
382
+ either map it into `flow_operation_id` or document that omni-flash
383
+ legitimately has no such identifier. Track via a follow-up issue once a
384
+ sample is captured.
385
+
386
+ ---
387
+
346
388
  ## Mitigated
347
389
 
348
390
  ### Auth verification depends on Google's NextAuth session endpoint
@@ -364,6 +406,23 @@ change surfaces there as a failing test. Start any investigation of a sudden
364
406
 
365
407
  ## Resolved
366
408
 
409
+ ### `gflow image t2i/i2i --model` was a silent no-op on `ui_automation`
410
+
411
+ - **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)
412
+
413
+ Pre-fix, `gflow image t2i --model nano-banana-2` (or any other model) under
414
+ `ui_automation` would set the wire-level model field correctly but **never
415
+ click the model picker in the editor UI**, so Flow used whichever model the
416
+ UI's dropdown was last set to (typically the account default). Users got
417
+ their requested model silently substituted for the default — no error, just
418
+ wrong output and wrong credit cost. Fixed by `_select_image_model` in
419
+ `src/gflow_cli/api/transports/ui_automation.py` which mirrors the new
420
+ `_select_video_model` helper. If you ran `gflow image t2i --model <X>`
421
+ against v0.7.0–v0.8.1 and noticed the output didn't match `<X>`, this is
422
+ why; re-run on the next release (≥ v0.9.0).
423
+
424
+ ---
425
+
367
426
  ### aisandbox-pa generation 401 — bypassed by the `ui_automation` transport
368
427
 
369
428
  - **Status:** Resolved · **Severity:** Was-High (blocked image gen via HTTP transports) · **Fixed in:** v0.7.0