gflow-cli 0.20.1__tar.gz → 0.21.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 (471) hide show
  1. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.env.template +11 -0
  2. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/workflows/ci.yml +17 -3
  3. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/workflows/governance-advisory.yml +1 -1
  4. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/workflows/governance-benchmark.yml +1 -1
  5. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/workflows/release.yml +1 -1
  6. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.gitignore +1 -0
  7. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/AGENTS.md +2 -1
  8. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/CHANGELOG.md +19 -1
  9. gflow_cli-0.21.0/GEMINI.md +31 -0
  10. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/PKG-INFO +43 -40
  11. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/PLAN.md +16 -1
  12. gflow_cli-0.21.0/README.md +143 -0
  13. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/ROADMAP.md +7 -6
  14. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/INDEX.md +2 -1
  15. gflow_cli-0.21.0/docs/LIVE_VERIFICATION_v0.21.0.md +66 -0
  16. gflow_cli-0.21.0/docs/MCP.md +173 -0
  17. gflow_cli-0.21.0/docs/assets/example-run.gif +0 -0
  18. gflow_cli-0.21.0/docs/assets/examples.webp +0 -0
  19. gflow_cli-0.21.0/docs/medium_tutorial.md +80 -0
  20. gflow_cli-0.21.0/docs/sonar-cleanup-tracker.md +81 -0
  21. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +177 -0
  22. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +69 -0
  23. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +67 -0
  24. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +146 -0
  25. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +56 -0
  26. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +60 -0
  27. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md +117 -0
  28. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md +110 -0
  29. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md +66 -0
  30. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/STUDIO_DESIGN.md +233 -0
  31. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +94 -0
  32. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +78 -0
  33. gflow_cli-0.21.0/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +571 -0
  34. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/pyproject.toml +8 -3
  35. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/__init__.py +1 -1
  36. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/character.py +52 -49
  37. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/client.py +88 -42
  38. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/drivers/agentic.py +11 -6
  39. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/drivers/classic.py +4 -4
  40. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/drivers/factory.py +3 -1
  41. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/ui_automation.py +87 -59
  42. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/ui_automation_video.py +298 -212
  43. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/video.py +26 -16
  44. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/browser_manager.py +14 -0
  45. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/chain.py +89 -51
  46. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/chain_manifest.py +38 -32
  47. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli.py +132 -20
  48. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_image.py +123 -85
  49. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_movie.py +156 -100
  50. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_scene.py +1 -1
  51. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_video.py +243 -146
  52. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/composition.py +101 -62
  53. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/config.py +19 -1
  54. gflow_cli-0.21.0/src/gflow_cli/data/migrations/0007_queue.sql +14 -0
  55. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/recorder.py +148 -99
  56. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/errors.py +8 -0
  57. gflow_cli-0.21.0/src/gflow_cli/mcp/__init__.py +12 -0
  58. gflow_cli-0.21.0/src/gflow_cli/mcp/prompts.py +74 -0
  59. gflow_cli-0.21.0/src/gflow_cli/mcp/resources.py +94 -0
  60. gflow_cli-0.21.0/src/gflow_cli/mcp/server.py +160 -0
  61. gflow_cli-0.21.0/src/gflow_cli/mcp/tools.py +263 -0
  62. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/movie_manifest.py +226 -139
  63. gflow_cli-0.21.0/src/gflow_cli/ui/app.py +151 -0
  64. gflow_cli-0.21.0/src/gflow_cli/ui/server.py +16 -0
  65. gflow_cli-0.21.0/src/gflow_cli/worker/daemon.py +254 -0
  66. gflow_cli-0.21.0/src/gflow_cli/worker/queue.py +179 -0
  67. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_store_migrations.py +9 -1
  68. gflow_cli-0.21.0/tests/e2e/test_daemon_e2e.py +143 -0
  69. gflow_cli-0.21.0/tests/mcp/__init__.py +1 -0
  70. gflow_cli-0.21.0/tests/mcp/conftest.py +15 -0
  71. gflow_cli-0.21.0/tests/mcp/test_server.py +438 -0
  72. gflow_cli-0.21.0/tests/mcp/test_stdio_transport.py +106 -0
  73. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_config.py +30 -0
  74. gflow_cli-0.21.0/tests/ui/test_app.py +137 -0
  75. gflow_cli-0.21.0/tests/worker/test_daemon.py +284 -0
  76. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/uv.lock +463 -82
  77. gflow_cli-0.20.1/GEMINI.md +0 -28
  78. gflow_cli-0.20.1/README.md +0 -144
  79. gflow_cli-0.20.1/docs/assets/example-run.gif +0 -0
  80. gflow_cli-0.20.1/scripts/dev/record_flow_capture.py +0 -271
  81. gflow_cli-0.20.1/tests/dev/test_record_flow_capture.py +0 -88
  82. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/README.md +0 -0
  83. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/active.md +0 -0
  84. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/branch-review.md +0 -0
  85. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/changelog.md +0 -0
  86. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/check.md +0 -0
  87. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/doc-review.md +0 -0
  88. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/known-issues.md +0 -0
  89. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/next.md +0 -0
  90. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/plan.md +0 -0
  91. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  92. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/predict.md +0 -0
  93. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/release.md +0 -0
  94. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/scenario.md +0 -0
  95. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/status.md +0 -0
  96. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.gitattributes +0 -0
  97. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/CODEOWNERS +0 -0
  98. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  99. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/copilot-instructions.md +0 -0
  100. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/dependabot.yml +0 -0
  101. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/workflows/external-pr-triage.yml +0 -0
  102. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.gitleaks.toml +0 -0
  103. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.pre-commit-config.yaml +0 -0
  104. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.secrets.baseline +0 -0
  105. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/CLAUDE.md +0 -0
  106. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/CONFIGURATION.md +0 -0
  107. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/CONTRIBUTING.md +0 -0
  108. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/DISCLAIMER.md +0 -0
  109. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/KNOWN_ISSUES.md +0 -0
  110. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/LICENSE +0 -0
  111. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/RELEASE.md +0 -0
  112. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/conftest.py +0 -0
  113. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docker-compose.yml +0 -0
  114. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/AGENT_GUIDE.md +0 -0
  115. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/AGENT_UI_E2E.md +0 -0
  116. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/AGENT_UI_RECON.md +0 -0
  117. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/ARCHITECTURE.md +0 -0
  118. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/AUTHENTICATION.md +0 -0
  119. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/CHARACTER.md +0 -0
  120. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/CHARACTER_RECON.md +0 -0
  121. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/CONFIGURATION.md +0 -0
  122. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/DATA_LAYER.md +0 -0
  123. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/DEBUGGING.md +0 -0
  124. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/DEMOS.md +0 -0
  125. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/DEVELOPMENT.md +0 -0
  126. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/E2E_TESTING.md +0 -0
  127. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/EXTERNAL_STORAGE.md +0 -0
  128. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/GITHUB.md +0 -0
  129. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  130. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  131. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  132. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  133. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  134. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  135. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  136. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  137. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  138. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  139. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  140. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  141. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  142. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  143. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  144. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  145. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  146. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  147. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  148. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/MOVIE.md +0 -0
  149. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/PROJECT_STATUS.md +0 -0
  150. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/SECURITY.md +0 -0
  151. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/USAGE.md +0 -0
  152. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/USER_GUIDE.md +0 -0
  153. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/assets/demo-split-pf.gif +0 -0
  154. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/schemas/movie-handoff.schema.json +0 -0
  155. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  156. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/README.md +0 -0
  157. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/batch_from_config.py +0 -0
  158. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/multi_prompt_t2i.py +0 -0
  159. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/sample_config.json +0 -0
  160. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/sample_prompts.txt +0 -0
  161. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/single_image_t2i.py +0 -0
  162. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/workflow_chain.py +0 -0
  163. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/llms.txt +0 -0
  164. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/README.md +0 -0
  165. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/01_upload_image.json +0 -0
  166. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  167. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  168. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/04_archive_workflow.json +0 -0
  169. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/05_createProject.json +0 -0
  170. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/06_batchGenerateImages.json +0 -0
  171. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  172. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  173. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  174. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  175. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  176. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/12_create_scene.json +0 -0
  177. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  178. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/14_get_scene_workflows.json +0 -0
  179. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  180. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/ci/check_doc_links.py +0 -0
  181. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/ci/check_materiality.py +0 -0
  182. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/ci/check_repo_hygiene.py +0 -0
  183. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/debug_editor.py +0 -0
  184. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/debug_gen_settings.py +0 -0
  185. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/debug_settings.py +0 -0
  186. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/_recording_client.py +0 -0
  187. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/_spike_common.py +0 -0
  188. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/active_plan.py +0 -0
  189. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  190. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  191. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  192. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  193. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  194. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  195. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_locale_invariants.py +0 -0
  196. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  197. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/character_create_spike.py +0 -0
  198. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/character_create_spike_v2.py +0 -0
  199. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/dump_character_selectors.js +0 -0
  200. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/make_project.py +0 -0
  201. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/materiality_backtest.py +0 -0
  202. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/monitor_pr_38.py +0 -0
  203. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/patch_character.py +0 -0
  204. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/skillopt/README.md +0 -0
  205. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/skillopt/harness.py +0 -0
  206. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/skillopt/tasks.json +0 -0
  207. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  208. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  209. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  210. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  211. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  212. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  213. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  214. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  215. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  216. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  217. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  218. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  219. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  220. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_patch_entity.py +0 -0
  221. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_patchright.py +0 -0
  222. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/diag/README.md +0 -0
  223. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/diag/capture_flow_traffic.py +0 -0
  224. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/diag/memory_profile.py +0 -0
  225. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/diag/recaptcha_mint.py +0 -0
  226. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  227. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  228. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/record_demo.ps1 +0 -0
  229. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/smoke_image.py +0 -0
  230. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/smoke_real_chrome_image.py +0 -0
  231. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/smoke_video_editor.py +0 -0
  232. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/smoke_worker_style.py +0 -0
  233. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/verify_chrome_auth_viability.py +0 -0
  234. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/README.md +0 -0
  235. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/gflow-cli/SKILL.md +0 -0
  236. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/plan/SKILL.md +0 -0
  237. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/pr-council-review/SKILL.md +0 -0
  238. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/predict/SKILL.md +0 -0
  239. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/scenario/SKILL.md +0 -0
  240. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/status/SKILL.md +0 -0
  241. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/sonar-project.properties +0 -0
  242. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/__main__.py +0 -0
  243. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/_cli_helpers.py +0 -0
  244. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/__init__.py +0 -0
  245. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/_engine.py +0 -0
  246. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/_retry.py +0 -0
  247. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  248. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/dto.py +0 -0
  249. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/image.py +0 -0
  250. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/image_upscale.py +0 -0
  251. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/recaptcha.py +0 -0
  252. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/routes.py +0 -0
  253. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/scene.py +0 -0
  254. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  255. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/_common.py +0 -0
  256. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  257. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/base.py +0 -0
  258. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  259. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  260. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  261. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  262. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  263. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  264. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/__init__.py +0 -0
  265. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/base.py +0 -0
  266. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/cookies.py +0 -0
  267. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/factory.py +0 -0
  268. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  269. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  270. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/strategies.py +0 -0
  271. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/verification.py +0 -0
  272. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_character.py +0 -0
  273. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_data.py +0 -0
  274. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_models.py +0 -0
  275. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_run.py +0 -0
  276. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/__init__.py +0 -0
  277. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/chain_repo.py +0 -0
  278. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  279. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  280. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  281. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  282. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  283. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  284. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  285. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/models.py +0 -0
  286. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/queries.py +0 -0
  287. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/redaction.py +0 -0
  288. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/repository.py +0 -0
  289. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/store.py +0 -0
  290. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/exceptions.py +0 -0
  291. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/image_batch.py +0 -0
  292. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/json_output.py +0 -0
  293. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/manifest.py +0 -0
  294. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/media.py +0 -0
  295. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/observability.py +0 -0
  296. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/paths.py +0 -0
  297. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/profile_store.py +0 -0
  298. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/services/__init__.py +0 -0
  299. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/services/character_create.py +0 -0
  300. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/storage.py +0 -0
  301. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tasks/lessons.md +0 -0
  302. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/test_assets/sample_batch.json +0 -0
  303. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/test_assets/sample_batch.tsv +0 -0
  304. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/test_assets/sample_batch_invalid.tsv +0 -0
  305. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/__init__.py +0 -0
  306. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/__init__.py +0 -0
  307. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/fixtures/character_gen_response.json +0 -0
  308. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  309. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  310. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  311. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_bearer_redaction.py +0 -0
  312. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_character.py +0 -0
  313. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client.py +0 -0
  314. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_character.py +0 -0
  315. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_delete_characters.py +0 -0
  316. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_generate_character.py +0 -0
  317. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_image.py +0 -0
  318. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_launch_kwargs.py +0 -0
  319. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_patch_entity.py +0 -0
  320. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_scene.py +0 -0
  321. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_upscale.py +0 -0
  322. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_concurrency.py +0 -0
  323. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_dto.py +0 -0
  324. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_engine.py +0 -0
  325. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_image.py +0 -0
  326. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_image_dto.py +0 -0
  327. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_image_upscale.py +0 -0
  328. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  329. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_recaptcha.py +0 -0
  330. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_retry.py +0 -0
  331. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_routes.py +0 -0
  332. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_routes_character.py +0 -0
  333. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_routes_scene.py +0 -0
  334. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_sapisidhash_helper.py +0 -0
  335. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_scene_models.py +0 -0
  336. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_video.py +0 -0
  337. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_video_request.py +0 -0
  338. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/__init__.py +0 -0
  339. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/conftest.py +0 -0
  340. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/drivers/__init__.py +0 -0
  341. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  342. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/drivers/test_factory.py +0 -0
  343. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_base.py +0 -0
  344. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_bearer.py +0 -0
  345. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_common.py +0 -0
  346. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  347. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_factory.py +0 -0
  348. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_fingerprint.py +0 -0
  349. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_sapisidhash.py +0 -0
  350. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_transport_timeout.py +0 -0
  351. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_ui_automation.py +0 -0
  352. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  353. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  354. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  355. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  356. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/auth/strategies/test_factory.py +0 -0
  357. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/auth/strategies/test_strategies.py +0 -0
  358. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/auth/test_verification.py +0 -0
  359. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/__init__.py +0 -0
  360. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_auth_list.py +0 -0
  361. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_character.py +0 -0
  362. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_character_create.py +0 -0
  363. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_data.py +0 -0
  364. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_image.py +0 -0
  365. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  366. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  367. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_image_upscale.py +0 -0
  368. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_models.py +0 -0
  369. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_movie.py +0 -0
  370. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_run.py +0 -0
  371. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_scene.py +0 -0
  372. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_video.py +0 -0
  373. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_video_chain.py +0 -0
  374. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_error_handling.py +0 -0
  375. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_helpers.py +0 -0
  376. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_movie_manifest.py +0 -0
  377. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_settings_validation.py +0 -0
  378. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  379. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/composition/test_character.py +0 -0
  380. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/composition/test_compose_prompt.py +0 -0
  381. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/composition/test_handoff.py +0 -0
  382. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/conftest.py +0 -0
  383. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/__init__.py +0 -0
  384. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_chain_repo.py +0 -0
  385. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_find_incomplete_character.py +0 -0
  386. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_models.py +0 -0
  387. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_packaging.py +0 -0
  388. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_recorder.py +0 -0
  389. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_recorder_character.py +0 -0
  390. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_redaction.py +0 -0
  391. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_repository.py +0 -0
  392. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_scene_persistence.py +0 -0
  393. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_settings_and_errors.py +0 -0
  394. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/dev/test_recording_client.py +0 -0
  395. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/__init__.py +0 -0
  396. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/conftest.py +0 -0
  397. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  398. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  399. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_chain_e2e.py +0 -0
  400. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_character_create_e2e.py +0 -0
  401. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  402. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  403. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  404. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  405. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_json_output_e2e.py +0 -0
  406. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  407. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_scene_compose_live.py +0 -0
  408. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_transports_e2e.py +0 -0
  409. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  410. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  411. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/__init__.py +0 -0
  412. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/auth.feature +0 -0
  413. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/auth_login.feature +0 -0
  414. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/character_create.feature +0 -0
  415. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/character_read.feature +0 -0
  416. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/conftest.py +0 -0
  417. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/image.feature +0 -0
  418. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/image_upscale.feature +0 -0
  419. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/locale_picker_include.feature +0 -0
  420. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_auth_login_steps.py +0 -0
  421. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_auth_steps.py +0 -0
  422. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_character_create_steps.py +0 -0
  423. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_character_read_steps.py +0 -0
  424. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_image_steps.py +0 -0
  425. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_image_upscale_steps.py +0 -0
  426. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  427. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_step_collision_guard.py +0 -0
  428. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  429. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_video_chain_steps.py +0 -0
  430. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/video_agent_ui.feature +0 -0
  431. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/video_chain.feature +0 -0
  432. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/fixtures/__init__.py +0 -0
  433. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/fixtures/seeded_catalog.py +0 -0
  434. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/image_batch/__init__.py +0 -0
  435. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/image_batch/test_image_manifest.py +0 -0
  436. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/image_batch/test_observability_events.py +0 -0
  437. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/integration/__init__.py +0 -0
  438. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/integration/conftest.py +0 -0
  439. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/integration/constants.py +0 -0
  440. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/integration/test_storage_gcs.py +0 -0
  441. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/integration/test_storage_s3.py +0 -0
  442. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  443. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  444. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/scripts/test_check_materiality.py +0 -0
  445. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  446. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/scripts/test_materiality_backtest.py +0 -0
  447. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/services/__init__.py +0 -0
  448. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/services/test_character_create_redaction.py +0 -0
  449. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/services/test_character_create_saga.py +0 -0
  450. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  451. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/smoke/__init__.py +0 -0
  452. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  453. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/smoke/test_real_flow.py +0 -0
  454. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_auth.py +0 -0
  455. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_browser_manager.py +0 -0
  456. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_chain.py +0 -0
  457. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_chain_manifest.py +0 -0
  458. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_cli_data.py +0 -0
  459. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_conftest_isolation.py +0 -0
  460. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_data_queries.py +0 -0
  461. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_documentation_gate.py +0 -0
  462. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_errors.py +0 -0
  463. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_errors_403.py +0 -0
  464. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_json_output.py +0 -0
  465. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_manifest.py +0 -0
  466. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_marker_registry.py +0 -0
  467. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_media.py +0 -0
  468. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_observability.py +0 -0
  469. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_paths.py +0 -0
  470. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_profile_store.py +0 -0
  471. {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_smoke.py +0 -0
@@ -129,3 +129,14 @@
129
129
  # scripts/dev/capture_locale_invariants.py or to live-verify a non-EN
130
130
  # language end-to-end (see KNOWN_ISSUES § issue #24).
131
131
  # GFLOW_CLI_LOCALE=en-US
132
+
133
+ # -----------------------------------------------------------------------------
134
+ # Headless Daemon (gflow serve)
135
+ # -----------------------------------------------------------------------------
136
+
137
+ # API Token header for gflow serve authentication (required when binding to non-local interface, e.g. 0.0.0.0).
138
+ # GFLOW_DAEMON_TOKEN=
139
+
140
+ # Port for gflow serve. Default is 8000.
141
+ # GFLOW_DAEMON_PORT=8000
142
+
@@ -16,7 +16,7 @@ jobs:
16
16
  name: Secret scan (gitleaks)
17
17
  runs-on: ubuntu-latest
18
18
  steps:
19
- - uses: actions/checkout@v6
19
+ - uses: actions/checkout@v7
20
20
  with:
21
21
  fetch-depth: 0 # full history so gitleaks can diff against base
22
22
 
@@ -25,6 +25,20 @@ jobs:
25
25
  env:
26
26
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
27
27
 
28
+ # ── Security gate: dependency CVE audit against locked deps ──────────────
29
+ deps-audit:
30
+ name: Dependency audit (pip-audit)
31
+ runs-on: ubuntu-latest
32
+ steps:
33
+ - uses: actions/checkout@v7
34
+ - name: Install uv
35
+ uses: astral-sh/setup-uv@v7
36
+ - name: Audit locked dependencies for known CVEs
37
+ # Fails the build on any known advisory. Accept later via: pip-audit --ignore-vuln <GHSA-id>
38
+ run: |
39
+ uv export --frozen --format requirements-txt --no-emit-project > requirements-audit.txt
40
+ uvx pip-audit -r requirements-audit.txt
41
+
28
42
  # ── Main test matrix ──────────────────────────────────────────────────────
29
43
  test:
30
44
  runs-on: ubuntu-latest
@@ -32,7 +46,7 @@ jobs:
32
46
  matrix:
33
47
  python-version: ["3.11", "3.12", "3.13"]
34
48
  steps:
35
- - uses: actions/checkout@v6
49
+ - uses: actions/checkout@v7
36
50
 
37
51
  - name: Install uv
38
52
  uses: astral-sh/setup-uv@v7
@@ -88,7 +102,7 @@ jobs:
88
102
  github.event.pull_request.head.repo.full_name == github.repository
89
103
  )
90
104
  steps:
91
- - uses: actions/checkout@v6
105
+ - uses: actions/checkout@v7
92
106
  with:
93
107
  fetch-depth: 0 # shallow clones break blame / new-code detection
94
108
 
@@ -19,7 +19,7 @@ jobs:
19
19
  name: Materiality + traceability (advisory)
20
20
  runs-on: ubuntu-latest
21
21
  steps:
22
- - uses: actions/checkout@v6
22
+ - uses: actions/checkout@v7
23
23
  with:
24
24
  fetch-depth: 0 # full history so `git diff origin/<base>..HEAD` resolves
25
25
 
@@ -18,7 +18,7 @@ jobs:
18
18
  name: Materiality gate backtest
19
19
  runs-on: ubuntu-latest
20
20
  steps:
21
- - uses: actions/checkout@v6
21
+ - uses: actions/checkout@v7
22
22
  with:
23
23
  fetch-depth: 0 # full history — the backtest replays every commit
24
24
 
@@ -19,7 +19,7 @@ jobs:
19
19
  ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
20
20
  NODE_VERSION: '22'
21
21
  steps:
22
- - uses: actions/checkout@v6
22
+ - uses: actions/checkout@v7
23
23
  with:
24
24
  fetch-depth: 0
25
25
 
@@ -92,3 +92,4 @@ worktrees/
92
92
 
93
93
  # Understand Anything (local knowledge graph)
94
94
  .understand-anything/
95
+ .worktrees
@@ -58,6 +58,7 @@ Or invoke the wrapper: `/gflow:check`.
58
58
  - Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
59
59
  - Errors as RFC 9457 Problem Details with stable per-class exit codes (3–22, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
60
60
  - 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
61
+ - **MCP & CLI Schema Symmetry**: Any updates or additions to user-facing CLI command parameters (e.g., `gflow image t2i`, `gflow video`) must be mirrored in the corresponding MCP tool definitions. Never add option/argument fields to Click commands without updating the MCP server implementation. This symmetry is enforced programmatically in CI via `tests/mcp/test_server.py`.
61
62
 
62
63
  ## PR instructions
63
64
 
@@ -80,7 +81,7 @@ The `skills/` directory ships installable agent skill docs in plain Markdown wit
80
81
  | `status` | [`skills/status/SKILL.md`](skills/status/SKILL.md) | Show current plan state, progress, and next unchecked task |
81
82
  | `pr-council-review` | [`skills/pr-council-review/SKILL.md`](skills/pr-council-review/SKILL.md) | Multi-dimensional PR council review |
82
83
 
83
- **Cursor / Aider / Codex / Gemini CLI:** paste or include the relevant `SKILL.md` in your system context.
84
+ **Cursor / Aider / Codex / Gemini CLI (`agy`):** paste or include the relevant `SKILL.md` in your system context. Note: in the `agy` TUI prompt, custom slash commands (e.g. `/gflow:pr-council-review`) are blocked by the TUI's command parser. Type them as plain text without the leading slash (e.g. `gflow:pr-council-review`, `gflow:branch-review`, or `gflow:check`) to trigger the corresponding agent skill workflow.
84
85
  **Claude Code:** the `/gflow:` slash commands in `.claude/commands/gflow/` are auto-discovered when the project is open — no extra setup needed. To register a skill globally, copy the command file to `~/.claude/commands/`.
85
86
  **Custom agents:** fetch `skills/gflow-cli/SKILL.md` into your knowledge base before answering gflow questions.
86
87
 
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.21.0] — 2026-06-26
11
+
12
+ ### Added
13
+
14
+ - **MCP server** (`gflow mcp run`): a [Model Context Protocol](https://modelcontextprotocol.io) server over **stdio** that exposes gflow's image / video / data operations to MCP-aware agents (Claude Desktop, Cursor, VS Code) as JSON-RPC **tools, resources, and prompts**. Point the client at `gflow mcp run` (example config in `gflow mcp run --help` and [docs/MCP.md](docs/MCP.md)). `gflow mcp setup --target <claude-desktop|cursor|vscode>` is scaffolded for future auto-configuration.
15
+ - **MCP over HTTP/SSE** (`gflow serve`): serves the same MCP server over Server-Sent Events — stream at `/sse`, POST messages to `/messages/`. Binds `127.0.0.1:8000` by default; non-loopback binds require `GFLOW_DAEMON_TOKEN`. Foundation for the forthcoming Gflow Studio Web UI and REST `/api/v1` surface.
16
+ - **Daemon & generation-queue scaffolding** (internal foundation): a FastAPI lifespan daemon, a `FlowWorker` background processor, and a SQLite-backed generation queue (`QueueRepository` + migration `0007_queue`, swept to `failed` on restart). Lays the groundwork for queued asynchronous generation; not yet wired into a user command (`gflow serve` currently runs the MCP/SSE server only).
17
+
18
+ ### Fixed
19
+
20
+ - **Security — `cryptography` advisory** ([GHSA-537c-gmf6-5ccf](https://github.com/advisories/GHSA-537c-gmf6-5ccf)): bumped the locked `cryptography` from 48.0.0 to 49.0.0 (transitive dependency).
21
+
22
+ ### Changed
23
+
24
+ - **CI — dependency CVE gate**: added a `pip-audit` job that audits the locked dependency set on every PR and fails on known advisories.
25
+ - **Code health**: SonarCloud cleanup sweep across the CLI, API, transport drivers, and movie/manifest layers (cognitive-complexity, duplicate-literal, and unused-argument refactors) with no behavioral change.
26
+
10
27
  ## [0.20.1] — 2026-06-16
11
28
 
12
29
  ### Fixed
@@ -1565,7 +1582,8 @@ shell-script template that branches on these codes.
1565
1582
 
1566
1583
  First skeleton. Not functional end-to-end yet.
1567
1584
 
1568
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...HEAD
1585
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...HEAD
1586
+ [0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
1569
1587
  [0.20.1]: https://github.com/ffroliva/gflow-cli/compare/v0.20.0...v0.20.1
1570
1588
  [0.20.0]: https://github.com/ffroliva/gflow-cli/compare/v0.19.0...v0.20.0
1571
1589
  [0.19.0]: https://github.com/ffroliva/gflow-cli/compare/v0.18.0...v0.19.0
@@ -0,0 +1,31 @@
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 (type as plain text in the `agy` TUI prompt):
14
+ - Current task / where we left off → `gflow:status`
15
+ - Starting a new feature → `gflow:predict` → `gflow:scenario` → `gflow:plan <feature>`
16
+ - Touching auth or reCAPTCHA → `gflow:known-issues`
17
+ - Cutting a release → `gflow:release`
18
+ - Before any commit → `gflow:check`
19
+
20
+ ## Gemini-specific
21
+
22
+ - Use specialized skills when relevant (e.g., `find-docs` for library research, `pr-council-review` for PR audits).
23
+ - Maintain memory via the `mcp-mempalace` tool if available.
24
+ - Prioritize **turn efficiency** and **high-signal output**.
25
+
26
+ ## Active phase
27
+
28
+ - **Decoupled Daemon/Worker Plan:** The blueprint for the headless SSE Daemon, SQLite generation queue, and Tauri/React editor is scheduled in [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md) and [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md).
29
+ - **Core Lesson (Retrospective):** Kept `gflow-cli` strictly headless (running Uvicorn and FastMCP over localhost HTTP/SSE). Bypassed browser context locks by serializing task writes in SQLite queue, allowing parallel client database reads via WAL mode.
30
+
31
+ See [PLAN.md](PLAN.md) or type `gflow:status` for the current task. Type `gflow:plan <feature>` to create a new feature plan.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.20.1
3
+ Version: 0.21.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
@@ -39,13 +39,17 @@ Classifier: Topic :: Multimedia :: Video
39
39
  Requires-Python: >=3.11
40
40
  Requires-Dist: browser-cookie3>=0.20.1
41
41
  Requires-Dist: click>=8.1.0
42
+ Requires-Dist: fastapi>=0.115.0
42
43
  Requires-Dist: httpx>=0.27.0
44
+ Requires-Dist: mcp>=1.0.0
43
45
  Requires-Dist: platformdirs>=4.0.0
44
46
  Requires-Dist: playwright>=1.45.0
45
47
  Requires-Dist: pydantic-settings>=2.5.0
46
48
  Requires-Dist: rich>=13.7.0
49
+ Requires-Dist: sse-starlette>=2.0.0
47
50
  Requires-Dist: structlog>=24.0.0
48
51
  Requires-Dist: tenacity>=8.2
52
+ Requires-Dist: uvicorn[standard]>=0.34.0
49
53
  Provides-Extra: chain
50
54
  Requires-Dist: av>=12; extra == 'chain'
51
55
  Provides-Extra: dev
@@ -54,7 +58,7 @@ Requires-Dist: numpy>=1.24; extra == 'dev'
54
58
  Requires-Dist: pyright>=1.1.0; extra == 'dev'
55
59
  Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
56
60
  Requires-Dist: pytest>=8.0.0; extra == 'dev'
57
- Requires-Dist: ruff>=0.15.16; extra == 'dev'
61
+ Requires-Dist: ruff==0.15.18; extra == 'dev'
58
62
  Provides-Extra: gcs
59
63
  Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
60
64
  Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
@@ -67,7 +71,7 @@ Description-Content-Type: text/markdown
67
71
 
68
72
  # gflow-cli
69
73
 
70
- > **Unofficial Python CLI for Google Flow.** Drive [Veo](https://labs.google/fx/tools/flow) (image-to-video, text-to-video) and Imagen (text-to-image) generations from your terminal scripted, batched, pipeline-friendly.
74
+ > Unofficial Python CLI for Google Flow. Drive [Veo](https://labs.google/fx/tools/flow) (image-to-video, text-to-video) and Imagen (text-to-image) from your terminal: scripted, batched, pipeline-ready.
71
75
 
72
76
  [![PyPI version](https://img.shields.io/pypi/v/gflow-cli.svg)](https://pypi.org/project/gflow-cli/)
73
77
  [![CI](https://github.com/ffroliva/gflow-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/ffroliva/gflow-cli/actions/workflows/ci.yml)
@@ -80,26 +84,25 @@ Description-Content-Type: text/markdown
80
84
  [![Tests: TDD](https://img.shields.io/badge/tests-TDD-brightgreen.svg)](CONTRIBUTING.md)
81
85
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ffroliva_gflow-cli&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=ffroliva_gflow-cli)
82
86
 
83
- > ⚠️ **Unofficial. Reverse-engineered. Not affiliated with Google.** Endpoints can change at any time. Full [DISCLAIMER](DISCLAIMER.md).
87
+ > ⚠️ **Unofficial, reverse-engineered, not affiliated with Google.** Endpoints can change without notice. Read the full [DISCLAIMER](DISCLAIMER.md).
84
88
  >
85
- > 🌐 **Headed-browser today.** gflow drives Flow via a persistent Playwright Chromium profile Google's auth + reCAPTCHA gates currently require it. See [Architecture & current limitations](#architecture--current-limitations) for the contributor opportunity.
86
-
89
+ > 🌐 **Headed browser today.** gflow drives Flow through a persistent Playwright Chromium profile, because Google's auth and reCAPTCHA gates require it. The [Architecture](#architecture--current-limitations) section shows where you can help.
87
90
 
88
91
  ## Why gflow-cli?
89
92
 
90
- For Google AI Ultra / Pro subscribers with Veo credits and batch workloads:
93
+ You pay for Google AI Ultra or Pro, you have Veo credits, and you run real batch work. gflow-cli gives you:
91
94
 
92
- - **Burn credits efficiently** `for p in $(cat prompts.txt); do gflow image t2i "$p"; done` _(image batching, plus `gflow video t2v`/`i2v`/`r2v`, all ship today)_
93
- - **Reuse a subject across shots** — `gflow character create` mints a Flow **Character** (face + body reference) so the same person appears consistently from generation to generation
94
- - **Build pipelines** — wire Veo into your content automation, AI video stack, or batch experiments
95
- - **Stay in the terminal** no Chromium UI, no clicking through dialogs (after a one-time `gflow auth login`)
95
+ - **Batch generation.** Loop prompts straight from the shell: `for p in $(cat prompts.txt); do gflow image t2i "$p"; done`. Image batching plus `gflow video t2v` / `i2v` / `r2v` all ship today.
96
+ - **Consistent subjects.** `gflow character create` mints a Flow Character (face and body reference) so the same person appears from one generation to the next.
97
+ - **Pipelines.** Wire Veo into your content automation, AI-video stack, or batch experiments.
98
+ - **Terminal-native.** After one `gflow auth login`, you stay in the shell. No clicking through dialogs.
96
99
 
97
- Same Veo + Imagen models, same quality, same Ultra/Pro billing programmatic.
100
+ Same Veo and Imagen models, same quality, same Ultra/Pro billing, now programmatic.
98
101
 
99
102
  ## 60-second quick start
100
103
 
101
104
  ```bash
102
- # 1 · Install (uv recommended also: pip install gflow-cli)
105
+ # 1 · Install (uv recommended; also: pip install gflow-cli)
103
106
  uv tool install gflow-cli
104
107
  uv tool run --from gflow-cli playwright install chromium # one-time, ~150 MB
105
108
 
@@ -114,26 +117,25 @@ gflow video t2v "Slow cinematic push-in on a sunlit forest clearing" --aspect 16
114
117
  gflow character create --project <id> --name "Aria" --face-prompt "..." --body-prompt "..."
115
118
  ```
116
119
 
117
- Outputs land under `$GFLOW_CLI_OUTPUT_DIR` unless
118
- [`GFLOW_CLI_STORAGE_URI`](docs/EXTERNAL_STORAGE.md) sends generated assets to
119
- S3, MinIO, or Google Cloud Storage. First call is ~30–90 s while Chromium warms;
120
- subsequent calls reuse the warm session.
120
+ Outputs land under `$GFLOW_CLI_OUTPUT_DIR`, or you can route them to S3, MinIO, or Google Cloud Storage with [`GFLOW_CLI_STORAGE_URI`](docs/EXTERNAL_STORAGE.md). The first call takes 30 to 90 seconds while Chromium warms up; later calls reuse the warm session.
121
121
 
122
122
  > **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.
123
123
 
124
- ## In-depth quick start
124
+ For the full 10-minute walkthrough with troubleshooting and multi-account setup, see **[USER_GUIDE: Journey 1](docs/USER_GUIDE.md#journey-1--first-time-setup-10-minutes)**.
125
125
 
126
- See **[USER_GUIDE — Journey 1: First-time setup](docs/USER_GUIDE.md#journey-1--first-time-setup-10-minutes)** for the 10-minute walkthrough with troubleshooting, multi-account setup, and the structured-log primer.
126
+ ## Examples
127
127
 
128
- ## Demo
128
+ One command in, real Flow output back. Left: `gflow image t2i` generating a photorealistic scene in your library. Right: a frame-to-frame transform.
129
+
130
+ ![gflow-cli examples: text-to-image generation, and a before/after frame transform](https://raw.githubusercontent.com/ffroliva/gflow-cli/main/docs/assets/examples.webp)
129
131
 
130
- ![gflow image t2i — single 9:16 prompt, streaming structlog output, PNG on disk](docs/assets/example-run.gif)
132
+ ## Demo
131
133
 
132
- *A single `gflow image t2i "..." --aspect 9:16 --model nano2` call against a logged-in Pro/Ultra profile. Terminal shows the streaming `structlog` JSON for the run, the final `ls` of the written PNG, and nothing else — Chromium drives the Flow editor silently in the background.*
134
+ ![gflow image t2i runs a single 9:16 prompt, streams structlog output, and writes a PNG to disk](https://raw.githubusercontent.com/ffroliva/gflow-cli/main/docs/assets/example-run.gif)
133
135
 
134
- Reproduce the recording: [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (Windows + OBS + ffmpeg + gifski).
136
+ A single `gflow image t2i "..." --aspect 9:16 --model nano2` call against a logged-in Pro/Ultra profile. The terminal streams the run's `structlog` JSON, then lists the written PNG. Chromium drives the Flow editor silently in the background.
135
137
 
136
- **▶ More demos** split-screen (terminal command + Flow generating, side-by-side) and other formats: **[docs/DEMOS.md](docs/DEMOS.md)**.
138
+ Reproduce the recording with [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (Windows, OBS, ffmpeg, gifski). More formats, including the side-by-side split-screen: **[docs/DEMOS.md](docs/DEMOS.md)**.
137
139
 
138
140
  ## Documentation
139
141
 
@@ -143,25 +145,24 @@ Reproduce the recording: [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (W
143
145
  |---|---|
144
146
  | 🎯 **Getting started** | [User Guide](docs/USER_GUIDE.md) · [Usage](docs/USAGE.md) · [Configuration](docs/CONFIGURATION.md) |
145
147
  | **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
146
- | 🎭 **Characters** | [Characters](docs/CHARACTER.md) reusable subjects (`gflow character`) |
148
+ | 🎭 **Characters** | [Characters](docs/CHARACTER.md), reusable subjects (`gflow character`) |
147
149
  | 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
148
- | 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
150
+ | 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
149
151
  | 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
150
152
  | 🤝 **Contributing** | [Contributing](CONTRIBUTING.md) · [Development](docs/DEVELOPMENT.md) · [GitHub workflow](docs/GITHUB.md) |
151
153
 
152
-
153
154
  ## For AI agents & LLMs
154
155
 
155
- gflow-cli ships three agent entry points pick the one your tool reads first.
156
+ gflow-cli ships three agent entry points. Pick the one your tool reads first.
156
157
 
157
158
  | File | Audience | Tools |
158
159
  |---|---|---|
159
- | [**AGENTS.md**](AGENTS.md) | Universal coding-agent spec | Cursor · Codex · Aider · Gemini CLI · Jules · Devin · Windsurf · Zed · Warp · opencode · Copilot · 60k+ repos |
160
+ | [**AGENTS.md**](AGENTS.md) | Universal coding-agent spec | Cursor · Codex · Aider · Gemini CLI · Jules · Devin · Windsurf · Zed · Warp · opencode · Copilot |
160
161
  | [**CLAUDE.md**](CLAUDE.md) | Claude Code's auto-loaded memory | Claude Code |
161
- | [**llms.txt**](llms.txt) | LLM-readable summary (llmstxt.org format) | Paste into ChatGPT / Claude / Gemini to onboard the model |
162
+ | [**llms.txt**](llms.txt) | LLM-readable summary (llmstxt.org format) | Paste into ChatGPT, Claude, or Gemini to onboard the model |
162
163
  | [`skills/gflow-cli/SKILL.md`](skills/gflow-cli/SKILL.md) | Claude Code Skill | Symlink into `~/.claude/skills/` |
163
164
 
164
- **Onboarding any agent in one line:** paste this into your agent of choice
165
+ Onboard any agent in one line. Paste this into your agent of choice:
165
166
 
166
167
  > *"Read [AGENTS.md](https://github.com/ffroliva/gflow-cli/blob/main/AGENTS.md) and [docs/INDEX.md](https://github.com/ffroliva/gflow-cli/blob/main/docs/INDEX.md), then help me with my Flow batch."*
167
168
 
@@ -175,25 +176,27 @@ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (te
175
176
  aisandbox-pa.googleapis.com (Google's private Flow API)
176
177
  ```
177
178
 
178
- **Current transport:** `ui_automation` drives Flow via a persistent Playwright Chromium profile. Production-stable, end-to-end verified per release (see [LIVE_VERIFICATION_*](docs/) per-release evidence files).
179
+ **Current transport:** `ui_automation` drives Flow through a persistent Playwright Chromium profile. It is production-stable and verified end-to-end every release (see the per-release `LIVE_VERIFICATION_*` evidence files).
179
180
 
180
- **What's blocked:** A pure HTTP transport for video generation. The video upload endpoint returns HTTP 401 under non-Chrome browsers + a reCAPTCHA mint we cannot reproduce headlessly. Three earlier HTTP strategies (`evaluate_fetch` / `bearer` / `sapisidhash`) live under `src/gflow_cli/api/transports/experimental/` — they are importable for research but not on the production critical path.
181
+ **What's blocked:** a pure HTTP transport for video generation. The video upload endpoint returns HTTP 401 under non-Chrome browsers plus a reCAPTCHA mint we cannot reproduce headlessly. Three earlier HTTP strategies (`evaluate_fetch`, `bearer`, `sapisidhash`) live under `src/gflow_cli/api/transports/experimental/` for research, off the production path.
181
182
 
182
- **How you can help:** If you have successfully driven `aisandbox-pa.googleapis.com` from outside a real Chrome session or have insight into Google's anti-bot stack here please open an issue. A working REST transport would unlock serverless deployments, true horizontal concurrency, and roughly 10× the project's reach. Details: [docs/ARCHITECTURE.md § Headed-browser dependency](docs/ARCHITECTURE.md#headed-browser-dependency--current-limitation).
183
+ **How you can help:** if you have driven `aisandbox-pa.googleapis.com` from outside a real Chrome session, or you understand Google's anti-bot stack here, please open an issue. A working REST transport would unlock serverless deployments, true horizontal concurrency, and roughly 10x the project's reach. Details: [docs/ARCHITECTURE.md § Headed-browser dependency](docs/ARCHITECTURE.md#headed-browser-dependency--current-limitation).
183
184
 
184
185
  ## Project status
185
186
 
186
- **v0.12.0 — alpha.** Three new capabilities. **`gflow character`** mints reusable, project-scoped Flow **Character** entities — a named subject with reference images, an optional voice, and an optional personality — so the same subject stays consistent across generations (`create` / `list` / `show` / `voices`, #145). **`gflow scene`** composes ordered clips into a scene and renders a credit-free, server-side **extended video** (no local ffmpeg). **`gflow video chain`** links last-frame image-to-video clips from a JSONL manifest into one continuous sequence. This release also fixes create-project generation when Flow surfaces Agent mode as a docked chat panel. Baseline: 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` (v0.11.0 repaired `gflow video i2v`, issue #125, and hardened image-model selection for non-English Flow UIs, #94; v0.10.0 added `--json` across every generation command, a `gflow models` catalog, per-model reference caps, persisted profile identity, external S3 / MinIO / GCS storage, and `gflow data prune`). 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).
187
+ **Alpha.** Image (t2i, i2i, upload) and video (t2v, i2v, r2v) run end-to-end on `ui_automation`, with a 5-model Veo picker plus `--duration` and `--count`. Recent additions: `gflow character` for reusable subjects, `gflow scene` for credit-free server-side stitching, and `gflow video chain` for linked clips. Video `batch` is still queued for Phase B, so use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)).
188
+
189
+ Full milestone history lives in [CHANGELOG.md](CHANGELOG.md). Where the project is heading: [ROADMAP.md](ROADMAP.md).
187
190
 
188
191
  ## License & legal
189
192
 
190
- [MIT License](LICENSE) © 2026 Flavio Oliva (`ffroliva`). The MIT license covers `gflow-cli`'s code only it does not grant rights to Flow, Veo model output, or any Google service. Google's own terms (Labs Additional Terms, Ultra/Pro subscription terms) govern your generations. See [DISCLAIMER](DISCLAIMER.md).
193
+ [MIT License](LICENSE) © 2026 Flavio Oliva (`ffroliva`). The MIT license covers `gflow-cli`'s code only. It grants no rights to Flow, Veo model output, or any Google service. Google's own terms (Labs Additional Terms, Ultra/Pro subscription terms) govern your generations. See the [DISCLAIMER](DISCLAIMER.md).
191
194
 
192
195
  ## Acknowledgements
193
196
 
194
- - [`edge-tts`](https://github.com/rany2/edge-tts) design inspiration for community SDKs over private cloud APIs.
195
- - [`googleapis/python-genai`](https://github.com/googleapis/python-genai) the official Veo SDK that a future provider release may alias.
196
- - [Keysight *Google Labs – Flow AI with Veo3: A Network Traffic Analysis*](https://www.keysight.com/blogs/en/tech/nwvs/2025/08/04/google-flow-ai-har-analysis) independent capture that helped validate the captured route patterns.
197
+ - [`edge-tts`](https://github.com/rany2/edge-tts), design inspiration for community SDKs over private cloud APIs.
198
+ - [`googleapis/python-genai`](https://github.com/googleapis/python-genai), the official Veo SDK that a future provider release may alias.
199
+ - [Keysight, *Google Labs – Flow AI with Veo3: A Network Traffic Analysis*](https://www.keysight.com/blogs/en/tech/nwvs/2025/08/04/google-flow-ai-har-analysis), an independent capture that helped validate the route patterns.
197
200
 
198
201
  ---
199
202
 
@@ -208,4 +211,4 @@ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (te
208
211
  [![GitHub repo size](https://img.shields.io/github/repo-size/ffroliva/gflow-cli?cacheSeconds=3600)](https://github.com/ffroliva/gflow-cli)
209
212
  [![PyPI downloads](https://static.pepy.tech/badge/gflow-cli/month)](https://pepy.tech/project/gflow-cli)
210
213
 
211
- If `gflow-cli` saves you time, please ⭐ the repo it is the cheapest way to support the project.
214
+ If `gflow-cli` saves you time, please ⭐ the repo. It is the cheapest way to support the project.
@@ -358,7 +358,9 @@ The video-generation feature has its own sub-phase plan (spike → Phase A → P
358
358
  - **Phase 3 (PR #90 / [#63](https://github.com/ffroliva/gflow-cli/issues/63), 2026-05-26, develop `9a0896a8`):** replaced `FRAME_SLOTS_STRUCT` with the locale-free pattern `div[type='button'][aria-haspopup='dialog']` (verified via DOM probe — matches exactly 2). Also fixed the End-frame OOB index after Start is attached. **I2V live-proof on de-DE: 124 s, mp4 with `ftyp` magic bytes, both `frame_attached` events fired (Start + End).**
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 (2026-05-30, branch `claude/issue-94-staleness-check-MnsEY`, PR #127):** `IMAGE_MODEL_OPTION_SELECTORS` and `VIDEO_MODEL_OPTION_SELECTORS` converted from `dict[Model, str]` to `dict[Model, tuple[str, ...]]` (cascade discipline; Tier 1 structural slots reserved for future DOM-probe-confirmed anchors). `--lang=en-US` removed from Chromium launch args — locale controlled by `locale=locale_env` Playwright kwarg (persists across all navigations including `/project/<uuid>` deep-links) + `FLOW_URL`'s `?hl=en` on initial load. Branded model names confirmed locale-stable. Four new `TestSelectorLocaleInvariance` tests + four `TestSelectImageModel` runtime tests. **R2V live e2e on non-EN still pending (owner gate — requires authenticated non-EN Chrome profile).**
361
- - [ ] **Model Context Protocol (MCP) Server.** (Backlog) Expose core gflow-cli tools via MCP for language-agnostic agentic access.
361
+ - [ ] **Model Context Protocol (MCP) Server.** (Backlog) Expose core gflow-cli tools via MCP for language-agnostic agentic access. Planned in [PREDICT.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md) / [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md) / [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md).
362
+ - [ ] **Prompt Expansion ("Creative Director" mode).** (Backlog) Add an option to expand prompts using Google's official 5-component formula via Gemini. Planned in [PREDICT.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md) / [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md) / [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md).
363
+ - [ ] **Integrated Filmmaking Studio, Flow Worker & MCP SSE Service.** (Backlog) Port google-flow-worker, construct a local FastAPI/React filmmaking studio dashboard, and support HTTP/SSE MCP. Planned in [DESIGN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md) / [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md).
362
364
  - [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.
363
365
  - [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]]`.
364
366
  - **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]]`.
@@ -662,6 +664,19 @@ Today the CLI writes media to `$GFLOW_CLI_OUTPUT_DIR` on the local filesystem. P
662
664
 
663
665
  ---
664
666
 
667
+ ### Unified Multi-Account Management — BACKLOG
668
+
669
+ **Background:** A key strength of the gflow architecture is its capacity to drive and coordinate across multiple Google Accounts in a unified way. This enables horizontal scale, credit pooling, and parallel batch generation bypassing individual account quotas.
670
+
671
+ **Requirements & Implications:**
672
+ - **Cross-Account Session Inventory:** A unified credential manager tracking persistent browser context directories (`profile_<email_local>`) and session lifespans.
673
+ - **Concurrent Warm Context Pool:** A background daemon scheduling across a warm browser context pool representing multiple active Google Accounts (e.g., executing parallel worker queues on different profiles).
674
+ - **Round-Robin Queue Dispatcher:** A dispatcher that distributes task batches dynamically across profiles based on quota availability or idle status.
675
+ - **Aggregated Provenance Mapping:** The local `gflow.db` data layer indexes projects, operations, and downloaded files back to the generating Google identity.
676
+ - **Studio UI Integration:** Dropdowns displaying connected profiles, quota/credit tracking, active account tags on workflow nodes, and single-click profile swapping.
677
+
678
+ ---
679
+
665
680
  ## 5. Decision log (ADRs in miniature)
666
681
 
667
682
  | # | Decision | Rationale |
@@ -0,0 +1,143 @@
1
+ # gflow-cli
2
+
3
+ > Unofficial Python CLI for Google Flow. Drive [Veo](https://labs.google/fx/tools/flow) (image-to-video, text-to-video) and Imagen (text-to-image) from your terminal: scripted, batched, pipeline-ready.
4
+
5
+ [![PyPI version](https://img.shields.io/pypi/v/gflow-cli.svg)](https://pypi.org/project/gflow-cli/)
6
+ [![CI](https://github.com/ffroliva/gflow-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/ffroliva/gflow-cli/actions/workflows/ci.yml)
7
+ [![Release](https://github.com/ffroliva/gflow-cli/actions/workflows/release.yml/badge.svg)](https://github.com/ffroliva/gflow-cli/actions/workflows/release.yml)
8
+ [![Python versions](https://img.shields.io/pypi/pyversions/gflow-cli.svg)](https://pypi.org/project/gflow-cli/)
9
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
10
+ [![Status: alpha](https://img.shields.io/badge/status-alpha-orange.svg)](docs/PROJECT_STATUS.md)
11
+ [![Code style: ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://github.com/astral-sh/ruff)
12
+ [![Type checked: pyright](https://img.shields.io/badge/type%20checked-pyright-blue.svg)](https://github.com/microsoft/pyright)
13
+ [![Tests: TDD](https://img.shields.io/badge/tests-TDD-brightgreen.svg)](CONTRIBUTING.md)
14
+ [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ffroliva_gflow-cli&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=ffroliva_gflow-cli)
15
+
16
+ > ⚠️ **Unofficial, reverse-engineered, not affiliated with Google.** Endpoints can change without notice. Read the full [DISCLAIMER](DISCLAIMER.md).
17
+ >
18
+ > 🌐 **Headed browser today.** gflow drives Flow through a persistent Playwright Chromium profile, because Google's auth and reCAPTCHA gates require it. The [Architecture](#architecture--current-limitations) section shows where you can help.
19
+
20
+ ## Why gflow-cli?
21
+
22
+ You pay for Google AI Ultra or Pro, you have Veo credits, and you run real batch work. gflow-cli gives you:
23
+
24
+ - **Batch generation.** Loop prompts straight from the shell: `for p in $(cat prompts.txt); do gflow image t2i "$p"; done`. Image batching plus `gflow video t2v` / `i2v` / `r2v` all ship today.
25
+ - **Consistent subjects.** `gflow character create` mints a Flow Character (face and body reference) so the same person appears from one generation to the next.
26
+ - **Pipelines.** Wire Veo into your content automation, AI-video stack, or batch experiments.
27
+ - **Terminal-native.** After one `gflow auth login`, you stay in the shell. No clicking through dialogs.
28
+
29
+ Same Veo and Imagen models, same quality, same Ultra/Pro billing, now programmatic.
30
+
31
+ ## 60-second quick start
32
+
33
+ ```bash
34
+ # 1 · Install (uv recommended; also: pip install gflow-cli)
35
+ uv tool install gflow-cli
36
+ uv tool run --from gflow-cli playwright install chromium # one-time, ~150 MB
37
+
38
+ # 2 · Authenticate (one-time, opens a real Chrome window)
39
+ gflow auth login --browser chrome
40
+
41
+ # 3 · Generate
42
+ gflow image t2i "a hot air balloon over Tokyo at sunrise"
43
+ # or:
44
+ gflow video t2v "Slow cinematic push-in on a sunlit forest clearing" --aspect 16:9
45
+ # or mint a reusable Character (face + body reference):
46
+ gflow character create --project <id> --name "Aria" --face-prompt "..." --body-prompt "..."
47
+ ```
48
+
49
+ Outputs land under `$GFLOW_CLI_OUTPUT_DIR`, or you can route them to S3, MinIO, or Google Cloud Storage with [`GFLOW_CLI_STORAGE_URI`](docs/EXTERNAL_STORAGE.md). The first call takes 30 to 90 seconds while Chromium warms up; later calls reuse the warm session.
50
+
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.
52
+
53
+ For the full 10-minute walkthrough with troubleshooting and multi-account setup, see **[USER_GUIDE: Journey 1](docs/USER_GUIDE.md#journey-1--first-time-setup-10-minutes)**.
54
+
55
+ ## Examples
56
+
57
+ One command in, real Flow output back. Left: `gflow image t2i` generating a photorealistic scene in your library. Right: a frame-to-frame transform.
58
+
59
+ ![gflow-cli examples: text-to-image generation, and a before/after frame transform](https://raw.githubusercontent.com/ffroliva/gflow-cli/main/docs/assets/examples.webp)
60
+
61
+ ## Demo
62
+
63
+ ![gflow image t2i runs a single 9:16 prompt, streams structlog output, and writes a PNG to disk](https://raw.githubusercontent.com/ffroliva/gflow-cli/main/docs/assets/example-run.gif)
64
+
65
+ A single `gflow image t2i "..." --aspect 9:16 --model nano2` call against a logged-in Pro/Ultra profile. The terminal streams the run's `structlog` JSON, then lists the written PNG. Chromium drives the Flow editor silently in the background.
66
+
67
+ Reproduce the recording with [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (Windows, OBS, ffmpeg, gifski). More formats, including the side-by-side split-screen: **[docs/DEMOS.md](docs/DEMOS.md)**.
68
+
69
+ ## Documentation
70
+
71
+ [**docs/INDEX.md**](docs/INDEX.md) is the master routing layer. Quick links:
72
+
73
+ | Topic | Read |
74
+ |---|---|
75
+ | 🎯 **Getting started** | [User Guide](docs/USER_GUIDE.md) · [Usage](docs/USAGE.md) · [Configuration](docs/CONFIGURATION.md) |
76
+ | **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
77
+ | 🎭 **Characters** | [Characters](docs/CHARACTER.md), reusable subjects (`gflow character`) |
78
+ | 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
79
+ | 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
80
+ | 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
81
+ | 🤝 **Contributing** | [Contributing](CONTRIBUTING.md) · [Development](docs/DEVELOPMENT.md) · [GitHub workflow](docs/GITHUB.md) |
82
+
83
+ ## For AI agents & LLMs
84
+
85
+ gflow-cli ships three agent entry points. Pick the one your tool reads first.
86
+
87
+ | File | Audience | Tools |
88
+ |---|---|---|
89
+ | [**AGENTS.md**](AGENTS.md) | Universal coding-agent spec | Cursor · Codex · Aider · Gemini CLI · Jules · Devin · Windsurf · Zed · Warp · opencode · Copilot |
90
+ | [**CLAUDE.md**](CLAUDE.md) | Claude Code's auto-loaded memory | Claude Code |
91
+ | [**llms.txt**](llms.txt) | LLM-readable summary (llmstxt.org format) | Paste into ChatGPT, Claude, or Gemini to onboard the model |
92
+ | [`skills/gflow-cli/SKILL.md`](skills/gflow-cli/SKILL.md) | Claude Code Skill | Symlink into `~/.claude/skills/` |
93
+
94
+ Onboard any agent in one line. Paste this into your agent of choice:
95
+
96
+ > *"Read [AGENTS.md](https://github.com/ffroliva/gflow-cli/blob/main/AGENTS.md) and [docs/INDEX.md](https://github.com/ffroliva/gflow-cli/blob/main/docs/INDEX.md), then help me with my Flow batch."*
97
+
98
+ ## Architecture & current limitations
99
+
100
+ ```text
101
+ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (tests) / [planned: Official Veo]
102
+
103
+ Playwright Chromium (headed login, headless after)
104
+
105
+ aisandbox-pa.googleapis.com (Google's private Flow API)
106
+ ```
107
+
108
+ **Current transport:** `ui_automation` drives Flow through a persistent Playwright Chromium profile. It is production-stable and verified end-to-end every release (see the per-release `LIVE_VERIFICATION_*` evidence files).
109
+
110
+ **What's blocked:** a pure HTTP transport for video generation. The video upload endpoint returns HTTP 401 under non-Chrome browsers plus a reCAPTCHA mint we cannot reproduce headlessly. Three earlier HTTP strategies (`evaluate_fetch`, `bearer`, `sapisidhash`) live under `src/gflow_cli/api/transports/experimental/` for research, off the production path.
111
+
112
+ **How you can help:** if you have driven `aisandbox-pa.googleapis.com` from outside a real Chrome session, or you understand Google's anti-bot stack here, please open an issue. A working REST transport would unlock serverless deployments, true horizontal concurrency, and roughly 10x the project's reach. Details: [docs/ARCHITECTURE.md § Headed-browser dependency](docs/ARCHITECTURE.md#headed-browser-dependency--current-limitation).
113
+
114
+ ## Project status
115
+
116
+ **Alpha.** Image (t2i, i2i, upload) and video (t2v, i2v, r2v) run end-to-end on `ui_automation`, with a 5-model Veo picker plus `--duration` and `--count`. Recent additions: `gflow character` for reusable subjects, `gflow scene` for credit-free server-side stitching, and `gflow video chain` for linked clips. Video `batch` is still queued for Phase B, so use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)).
117
+
118
+ Full milestone history lives in [CHANGELOG.md](CHANGELOG.md). Where the project is heading: [ROADMAP.md](ROADMAP.md).
119
+
120
+ ## License & legal
121
+
122
+ [MIT License](LICENSE) © 2026 Flavio Oliva (`ffroliva`). The MIT license covers `gflow-cli`'s code only. It grants no rights to Flow, Veo model output, or any Google service. Google's own terms (Labs Additional Terms, Ultra/Pro subscription terms) govern your generations. See the [DISCLAIMER](DISCLAIMER.md).
123
+
124
+ ## Acknowledgements
125
+
126
+ - [`edge-tts`](https://github.com/rany2/edge-tts), design inspiration for community SDKs over private cloud APIs.
127
+ - [`googleapis/python-genai`](https://github.com/googleapis/python-genai), the official Veo SDK that a future provider release may alias.
128
+ - [Keysight, *Google Labs – Flow AI with Veo3: A Network Traffic Analysis*](https://www.keysight.com/blogs/en/tech/nwvs/2025/08/04/google-flow-ai-har-analysis), an independent capture that helped validate the route patterns.
129
+
130
+ ---
131
+
132
+ ## Stats
133
+
134
+ [![GitHub stars](https://img.shields.io/github/stars/ffroliva/gflow-cli?style=social&cacheSeconds=3600)](https://github.com/ffroliva/gflow-cli/stargazers)
135
+ [![GitHub forks](https://img.shields.io/github/forks/ffroliva/gflow-cli?style=social&cacheSeconds=3600)](https://github.com/ffroliva/gflow-cli/network/members)
136
+ [![GitHub watchers](https://img.shields.io/github/watchers/ffroliva/gflow-cli?style=social&cacheSeconds=3600)](https://github.com/ffroliva/gflow-cli/watchers)
137
+ [![GitHub issues](https://img.shields.io/github/issues/ffroliva/gflow-cli?cacheSeconds=3600)](https://github.com/ffroliva/gflow-cli/issues)
138
+ [![GitHub pull requests](https://img.shields.io/github/issues-pr/ffroliva/gflow-cli?cacheSeconds=3600)](https://github.com/ffroliva/gflow-cli/pulls)
139
+ [![GitHub last commit](https://img.shields.io/github/last-commit/ffroliva/gflow-cli?cacheSeconds=3600)](https://github.com/ffroliva/gflow-cli/commits/main)
140
+ [![GitHub repo size](https://img.shields.io/github/repo-size/ffroliva/gflow-cli?cacheSeconds=3600)](https://github.com/ffroliva/gflow-cli)
141
+ [![PyPI downloads](https://static.pepy.tech/badge/gflow-cli/month)](https://pepy.tech/project/gflow-cli)
142
+
143
+ If `gflow-cli` saves you time, please ⭐ the repo. It is the cheapest way to support the project.
@@ -23,14 +23,15 @@ Extends the data layer surface from read-only listing to inspection and selectiv
23
23
  - `gflow data export` — JSON / CSV / TSV
24
24
  - `gflow data prune` — retention controls (`--older-than`, `--keep-last-n`)
25
25
 
26
- ## v0.11.0 — Local HTTP API + Web UI
26
+ ## v0.11.0 — Local Studio, Background Worker & MCP SSE Service (in progress / develop)
27
27
 
28
- The API and the UI ship together as one deliverable neither is useful alone. `gflow ui` boots a local HTTP server on `127.0.0.1` that hosts both the API and the UI; everything stays loopback-only.
28
+ The local Web UI Filmmaking Studio, background task worker, and MCP HTTP/SSE service are integrated into a single unified daemon interface under `gflow serve`.
29
29
 
30
- - `gflow ui` single command, single port
31
- - Local REST API over the SQLite catalog with read endpoints for projects / images / videos / profiles
32
- - Web UI consumes the API; browses generations with thumbnails
33
- - Aggregated view across local profiles (read-only)
30
+ - [x] **Uvicorn Daemon:** `gflow serve` starts the local FastAPI/Uvicorn server with background task loop.
31
+ - [x] **MCP SSE Server:** Exposes the MCP server over HTTP/SSE, allowing IDE clients and external tools to run JSON-RPC commands.
32
+ - [x] **Flow Worker Daemon:** Local queue manager and `FlowWorker` background task processor reading from SQLite queue tables and managing sequential profile-locked generation runs.
33
+ - [ ] **REST & Static UI:** FastAPI endpoints for asset management and hosting of the Filmmaking Studio (single-page app).
34
+ - [ ] **Aggregated Management:** Full view of accounts, profiles, projects, and active storyboarding queues.
34
35
 
35
36
  ## v1.0.0 — Stable API
36
37