gflow-cli 0.23.0__tar.gz → 0.24.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 (501) hide show
  1. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/CHANGELOG.md +15 -1
  2. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/PKG-INFO +1 -1
  3. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/INDEX.md +1 -1
  4. gflow_cli-0.24.0/docs/LIVE_VERIFICATION_v0.24.0.md +38 -0
  5. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/MCP.md +2 -2
  6. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/PROJECT_STATUS.md +14 -1
  7. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/USAGE.md +29 -6
  8. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/pyproject.toml +1 -1
  9. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/__init__.py +1 -1
  10. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/_cli_helpers.py +21 -0
  11. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_image.py +6 -19
  12. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_video.py +66 -25
  13. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/tools.py +148 -97
  14. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_launch_kwargs.py +45 -0
  15. gflow_cli-0.24.0/tests/auth/test_cookies.py +107 -0
  16. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_video.py +187 -29
  17. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_helpers.py +10 -1
  18. gflow_cli-0.24.0/tests/mcp/test_tools_helpers.py +149 -0
  19. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/mcp/test_tools_wired.py +94 -0
  20. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/worker/test_daemon.py +30 -0
  21. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/uv.lock +1 -1
  22. gflow_cli-0.23.0/tests/auth/test_cookies.py +0 -51
  23. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/README.md +0 -0
  24. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/active.md +0 -0
  25. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/branch-review.md +0 -0
  26. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/changelog.md +0 -0
  27. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/check.md +0 -0
  28. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/doc-review.md +0 -0
  29. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  30. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  31. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/known-issues.md +0 -0
  32. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/next.md +0 -0
  33. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/plan.md +0 -0
  34. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  35. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/predict.md +0 -0
  36. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/release.md +0 -0
  37. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/scenario.md +0 -0
  38. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/sonar.md +0 -0
  39. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/status.md +0 -0
  40. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.env.template +0 -0
  41. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.gitattributes +0 -0
  42. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/CODEOWNERS +0 -0
  43. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  44. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/copilot-instructions.md +0 -0
  45. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/dependabot.yml +0 -0
  46. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/ci.yml +0 -0
  47. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/external-pr-triage.yml +0 -0
  48. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/governance-advisory.yml +0 -0
  49. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/governance-benchmark.yml +0 -0
  50. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/main-base-guard.yml +0 -0
  51. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/release.yml +0 -0
  52. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.gitignore +0 -0
  53. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.gitleaks.toml +0 -0
  54. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.pre-commit-config.yaml +0 -0
  55. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.secrets.baseline +0 -0
  56. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/AGENTS.md +0 -0
  57. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/CLAUDE.md +0 -0
  58. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/CONFIGURATION.md +0 -0
  59. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/CONTRIBUTING.md +0 -0
  60. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/DISCLAIMER.md +0 -0
  61. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/GEMINI.md +0 -0
  62. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/KNOWN_ISSUES.md +0 -0
  63. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/LICENSE +0 -0
  64. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/PLAN.md +0 -0
  65. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/README.md +0 -0
  66. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/RELEASE.md +0 -0
  67. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/ROADMAP.md +0 -0
  68. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/conftest.py +0 -0
  69. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docker-compose.yml +0 -0
  70. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/AGENT_GUIDE.md +0 -0
  71. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/AGENT_UI_E2E.md +0 -0
  72. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/AGENT_UI_RECON.md +0 -0
  73. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/ARCHITECTURE.md +0 -0
  74. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/AUTHENTICATION.md +0 -0
  75. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/CHARACTER.md +0 -0
  76. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/CHARACTER_RECON.md +0 -0
  77. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/CONFIGURATION.md +0 -0
  78. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/DATA_LAYER.md +0 -0
  79. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/DEBUGGING.md +0 -0
  80. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/DEMOS.md +0 -0
  81. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/DEVELOPMENT.md +0 -0
  82. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/E2E_TESTING.md +0 -0
  83. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/EXTERNAL_STORAGE.md +0 -0
  84. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/GITHUB.md +0 -0
  85. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  86. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  87. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  88. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  89. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  90. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  91. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  92. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  93. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  94. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  95. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  96. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  97. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  98. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  99. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  100. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  101. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  102. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  103. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  104. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  105. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  106. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  107. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/MOVIE.md +0 -0
  108. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/PROMPT_EXPANSION.md +0 -0
  109. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/SECURITY.md +0 -0
  110. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/TOOLS.md +0 -0
  111. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/USER_GUIDE.md +0 -0
  112. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/assets/demo-split-pf.gif +0 -0
  113. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/assets/example-run.gif +0 -0
  114. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/assets/examples.webp +0 -0
  115. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/medium_tutorial.md +0 -0
  116. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/schemas/movie-handoff.schema.json +0 -0
  117. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/sonar-cleanup-tracker.md +0 -0
  118. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  119. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  120. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  121. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  122. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  123. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  124. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  125. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  126. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  127. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  128. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  129. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  130. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/README.md +0 -0
  131. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/batch_from_config.py +0 -0
  132. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/multi_prompt_t2i.py +0 -0
  133. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/sample_config.json +0 -0
  134. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/sample_prompts.txt +0 -0
  135. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/single_image_t2i.py +0 -0
  136. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/workflow_chain.py +0 -0
  137. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/llms.txt +0 -0
  138. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/README.md +0 -0
  139. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/01_upload_image.json +0 -0
  140. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  141. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  142. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/04_archive_workflow.json +0 -0
  143. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/05_createProject.json +0 -0
  144. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/06_batchGenerateImages.json +0 -0
  145. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  146. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  147. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  148. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  149. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  150. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/12_create_scene.json +0 -0
  151. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  152. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/14_get_scene_workflows.json +0 -0
  153. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  154. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/ci/check_doc_links.py +0 -0
  155. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/ci/check_materiality.py +0 -0
  156. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/ci/check_repo_hygiene.py +0 -0
  157. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/debug_editor.py +0 -0
  158. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/debug_gen_settings.py +0 -0
  159. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/debug_settings.py +0 -0
  160. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/_recording_client.py +0 -0
  161. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/_spike_common.py +0 -0
  162. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/active_plan.py +0 -0
  163. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  164. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  165. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  166. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  167. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  168. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  169. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_locale_invariants.py +0 -0
  170. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  171. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/character_create_spike.py +0 -0
  172. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/character_create_spike_v2.py +0 -0
  173. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/dump_character_selectors.js +0 -0
  174. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/make_project.py +0 -0
  175. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/materiality_backtest.py +0 -0
  176. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/monitor_pr_38.py +0 -0
  177. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/patch_character.py +0 -0
  178. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/README.md +0 -0
  179. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/harness.py +0 -0
  180. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/tasks.json +0 -0
  181. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  182. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  183. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  184. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  185. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  186. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  187. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  188. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  189. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  190. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  191. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  192. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  193. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  194. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_patch_entity.py +0 -0
  195. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_patchright.py +0 -0
  196. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/diag/README.md +0 -0
  197. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/diag/capture_flow_traffic.py +0 -0
  198. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/diag/memory_profile.py +0 -0
  199. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/diag/recaptcha_mint.py +0 -0
  200. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  201. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  202. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/record_demo.ps1 +0 -0
  203. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/smoke_image.py +0 -0
  204. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/smoke_real_chrome_image.py +0 -0
  205. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/smoke_video_editor.py +0 -0
  206. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/smoke_worker_style.py +0 -0
  207. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/verify_chrome_auth_viability.py +0 -0
  208. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/README.md +0 -0
  209. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/gflow-cli/SKILL.md +0 -0
  210. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/issue-assessment/SKILL.md +0 -0
  211. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/issue-resolve/SKILL.md +0 -0
  212. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/plan/SKILL.md +0 -0
  213. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/pr-council-review/SKILL.md +0 -0
  214. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/predict/SKILL.md +0 -0
  215. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/scenario/SKILL.md +0 -0
  216. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/status/SKILL.md +0 -0
  217. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/sonar-project.properties +0 -0
  218. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/__main__.py +0 -0
  219. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/__init__.py +0 -0
  220. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_engine.py +0 -0
  221. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_retry.py +0 -0
  222. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  223. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/character.py +0 -0
  224. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/client.py +0 -0
  225. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/dto.py +0 -0
  226. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/image.py +0 -0
  227. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/image_upscale.py +0 -0
  228. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/recaptcha.py +0 -0
  229. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/routes.py +0 -0
  230. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/scene.py +0 -0
  231. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  232. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/_common.py +0 -0
  233. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  234. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/base.py +0 -0
  235. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  236. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  237. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  238. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  239. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  240. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  241. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  242. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  243. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  244. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/ui_automation.py +0 -0
  245. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
  246. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/video.py +0 -0
  247. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/__init__.py +0 -0
  248. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/base.py +0 -0
  249. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/cookies.py +0 -0
  250. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/factory.py +0 -0
  251. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  252. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  253. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/strategies.py +0 -0
  254. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/verification.py +0 -0
  255. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/browser_manager.py +0 -0
  256. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/chain.py +0 -0
  257. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/chain_manifest.py +0 -0
  258. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli.py +0 -0
  259. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_character.py +0 -0
  260. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_data.py +0 -0
  261. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_models.py +0 -0
  262. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_movie.py +0 -0
  263. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_run.py +0 -0
  264. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_scene.py +0 -0
  265. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_tools.py +0 -0
  266. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/composition.py +0 -0
  267. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/config.py +0 -0
  268. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/__init__.py +0 -0
  269. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/chain_repo.py +0 -0
  270. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  271. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  272. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  273. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  274. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  275. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  276. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  277. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  278. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  279. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/models.py +0 -0
  280. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/queries.py +0 -0
  281. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/recorder.py +0 -0
  282. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/redaction.py +0 -0
  283. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/repository.py +0 -0
  284. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/store.py +0 -0
  285. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/errors.py +0 -0
  286. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/exceptions.py +0 -0
  287. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/image_batch.py +0 -0
  288. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/json_output.py +0 -0
  289. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/manifest.py +0 -0
  290. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/__init__.py +0 -0
  291. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/prompts.py +0 -0
  292. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/resources.py +0 -0
  293. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/server.py +0 -0
  294. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/media.py +0 -0
  295. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/movie_manifest.py +0 -0
  296. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/observability.py +0 -0
  297. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/paths.py +0 -0
  298. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/profile_store.py +0 -0
  299. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/services/__init__.py +0 -0
  300. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/services/character_create.py +0 -0
  301. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/storage.py +0 -0
  302. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/__init__.py +0 -0
  303. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/banned.py +0 -0
  304. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  305. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  306. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/expander.py +0 -0
  307. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/invocation.py +0 -0
  308. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/loader.py +0 -0
  309. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/registry.py +0 -0
  310. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/runtime.py +0 -0
  311. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/spec.py +0 -0
  312. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/ui/app.py +0 -0
  313. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/ui/server.py +0 -0
  314. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/worker/daemon.py +0 -0
  315. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/worker/queue.py +0 -0
  316. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tasks/lessons.md +0 -0
  317. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/test_assets/sample_batch.json +0 -0
  318. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/test_assets/sample_batch.tsv +0 -0
  319. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/test_assets/sample_batch_invalid.tsv +0 -0
  320. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/__init__.py +0 -0
  321. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/__init__.py +0 -0
  322. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/fixtures/character_gen_response.json +0 -0
  323. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  324. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  325. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  326. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_bearer_redaction.py +0 -0
  327. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_character.py +0 -0
  328. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client.py +0 -0
  329. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_character.py +0 -0
  330. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_delete_characters.py +0 -0
  331. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_generate_character.py +0 -0
  332. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_image.py +0 -0
  333. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_patch_entity.py +0 -0
  334. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_scene.py +0 -0
  335. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_upscale.py +0 -0
  336. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_concurrency.py +0 -0
  337. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_dto.py +0 -0
  338. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_engine.py +0 -0
  339. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_image.py +0 -0
  340. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_image_dto.py +0 -0
  341. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_image_upscale.py +0 -0
  342. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  343. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_recaptcha.py +0 -0
  344. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_retry.py +0 -0
  345. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_routes.py +0 -0
  346. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_routes_character.py +0 -0
  347. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_routes_scene.py +0 -0
  348. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_sapisidhash_helper.py +0 -0
  349. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_scene_models.py +0 -0
  350. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_video.py +0 -0
  351. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_video_request.py +0 -0
  352. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/__init__.py +0 -0
  353. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/conftest.py +0 -0
  354. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/__init__.py +0 -0
  355. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  356. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/test_factory.py +0 -0
  357. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_base.py +0 -0
  358. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_bearer.py +0 -0
  359. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_common.py +0 -0
  360. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  361. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_factory.py +0 -0
  362. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_fingerprint.py +0 -0
  363. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_sapisidhash.py +0 -0
  364. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_transport_timeout.py +0 -0
  365. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation.py +0 -0
  366. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  367. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  368. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  369. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  370. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/auth/strategies/test_factory.py +0 -0
  371. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/auth/strategies/test_strategies.py +0 -0
  372. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/auth/test_verification.py +0 -0
  373. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/__init__.py +0 -0
  374. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_auth_list.py +0 -0
  375. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_character.py +0 -0
  376. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_character_create.py +0 -0
  377. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_data.py +0 -0
  378. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image.py +0 -0
  379. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  380. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  381. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_upscale.py +0 -0
  382. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_models.py +0 -0
  383. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_movie.py +0 -0
  384. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_run.py +0 -0
  385. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_scene.py +0 -0
  386. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_tools.py +0 -0
  387. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_video_chain.py +0 -0
  388. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_error_handling.py +0 -0
  389. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_movie_manifest.py +0 -0
  390. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_settings_validation.py +0 -0
  391. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  392. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/composition/test_character.py +0 -0
  393. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/composition/test_compose_prompt.py +0 -0
  394. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/composition/test_handoff.py +0 -0
  395. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/conftest.py +0 -0
  396. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/__init__.py +0 -0
  397. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_chain_repo.py +0 -0
  398. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_find_incomplete_character.py +0 -0
  399. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_models.py +0 -0
  400. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_packaging.py +0 -0
  401. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_recorder.py +0 -0
  402. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_recorder_character.py +0 -0
  403. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_redaction.py +0 -0
  404. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_repository.py +0 -0
  405. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_scene_persistence.py +0 -0
  406. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_settings_and_errors.py +0 -0
  407. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_store_migrations.py +0 -0
  408. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/dev/test_recording_client.py +0 -0
  409. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/__init__.py +0 -0
  410. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/conftest.py +0 -0
  411. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  412. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  413. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_chain_e2e.py +0 -0
  414. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_character_create_e2e.py +0 -0
  415. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_daemon_e2e.py +0 -0
  416. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  417. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  418. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  419. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  420. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_json_output_e2e.py +0 -0
  421. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  422. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_scene_compose_live.py +0 -0
  423. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_tools_e2e.py +0 -0
  424. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_transports_e2e.py +0 -0
  425. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  426. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  427. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/__init__.py +0 -0
  428. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/auth.feature +0 -0
  429. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/auth_login.feature +0 -0
  430. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/character_create.feature +0 -0
  431. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/character_read.feature +0 -0
  432. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/conftest.py +0 -0
  433. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/image.feature +0 -0
  434. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/image_upscale.feature +0 -0
  435. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/locale_picker_include.feature +0 -0
  436. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_auth_login_steps.py +0 -0
  437. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_auth_steps.py +0 -0
  438. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_character_create_steps.py +0 -0
  439. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_character_read_steps.py +0 -0
  440. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_image_steps.py +0 -0
  441. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_image_upscale_steps.py +0 -0
  442. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  443. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_step_collision_guard.py +0 -0
  444. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  445. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_video_chain_steps.py +0 -0
  446. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/video_agent_ui.feature +0 -0
  447. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/video_chain.feature +0 -0
  448. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/fixtures/__init__.py +0 -0
  449. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/fixtures/seeded_catalog.py +0 -0
  450. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/image_batch/__init__.py +0 -0
  451. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/image_batch/test_image_manifest.py +0 -0
  452. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/image_batch/test_observability_events.py +0 -0
  453. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/integration/__init__.py +0 -0
  454. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/integration/conftest.py +0 -0
  455. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/integration/constants.py +0 -0
  456. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/integration/test_storage_gcs.py +0 -0
  457. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/integration/test_storage_s3.py +0 -0
  458. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/mcp/__init__.py +0 -0
  459. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/mcp/conftest.py +0 -0
  460. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/mcp/test_server.py +0 -0
  461. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/mcp/test_stdio_transport.py +0 -0
  462. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  463. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  464. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/scripts/test_check_materiality.py +0 -0
  465. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  466. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/scripts/test_materiality_backtest.py +0 -0
  467. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/services/__init__.py +0 -0
  468. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/services/test_character_create_redaction.py +0 -0
  469. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/services/test_character_create_saga.py +0 -0
  470. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  471. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/smoke/__init__.py +0 -0
  472. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  473. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/smoke/test_real_flow.py +0 -0
  474. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_auth.py +0 -0
  475. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_browser_manager.py +0 -0
  476. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_chain.py +0 -0
  477. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_chain_manifest.py +0 -0
  478. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_cli_data.py +0 -0
  479. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_config.py +0 -0
  480. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_conftest_isolation.py +0 -0
  481. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_data_queries.py +0 -0
  482. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_documentation_gate.py +0 -0
  483. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_errors.py +0 -0
  484. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_errors_403.py +0 -0
  485. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_json_output.py +0 -0
  486. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_manifest.py +0 -0
  487. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_marker_registry.py +0 -0
  488. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_media.py +0 -0
  489. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_observability.py +0 -0
  490. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_paths.py +0 -0
  491. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_profile_store.py +0 -0
  492. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_smoke.py +0 -0
  493. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/__init__.py +0 -0
  494. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_banned.py +0 -0
  495. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_expander.py +0 -0
  496. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_invocation.py +0 -0
  497. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_loader.py +0 -0
  498. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_registry.py +0 -0
  499. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_runtime.py +0 -0
  500. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_spec.py +0 -0
  501. {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/ui/test_app.py +0 -0
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.24.0] — 2026-07-01
11
+
12
+ ### Added
13
+
14
+ - **`--project` on `video t2v`/`i2v`/`r2v` (#233)**: generate into an existing Flow
15
+ project instead of always creating a scratch project, matching `image t2i`/`i2i`.
16
+ Lets programmatic callers (e.g. a multi-clip storyboard worker) share one project
17
+ across several video generations instead of leaving one throwaway project per clip.
18
+ - **`project` parameter on the MCP `gflow_generate_image` / `gflow_generate_video`
19
+ tools**: mirrors the CLI `--project` flag so MCP callers can also target an existing
20
+ Flow project (validated against the same id format). Completes `--project` parity
21
+ across the CLI and MCP surfaces.
22
+
10
23
  ## [0.23.0] — 2026-07-01
11
24
 
12
25
  ### Added
@@ -1682,7 +1695,8 @@ shell-script template that branches on these codes.
1682
1695
 
1683
1696
  First skeleton. Not functional end-to-end yet.
1684
1697
 
1685
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.23.0...HEAD
1698
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.24.0...HEAD
1699
+ [0.24.0]: https://github.com/ffroliva/gflow-cli/compare/v0.23.0...v0.24.0
1686
1700
  [0.23.0]: https://github.com/ffroliva/gflow-cli/compare/v0.22.0...v0.23.0
1687
1701
  [0.22.0]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...v0.22.0
1688
1702
  [0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.23.0
3
+ Version: 0.24.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
@@ -117,7 +117,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
117
117
  **"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
118
118
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
119
119
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
120
- **"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
120
+ **"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
121
121
  **"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships.
122
122
  **"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
123
123
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
@@ -0,0 +1,38 @@
1
+ # Live Verification — v0.24.0
2
+
3
+ Release date: 2026-07-01. This release completes `--project` parity: `video
4
+ t2v/i2v/r2v` gain `--project` (#233/#234) and the MCP `gflow_generate_image` /
5
+ `gflow_generate_video` tools gain a `project` parameter (#235) — both let a caller
6
+ target an existing Flow project instead of a scratch one.
7
+
8
+ ## Scope
9
+
10
+ | Change | Surface | Verification |
11
+ |---|---|---|
12
+ | **#234** — `--project` on `video t2v/i2v/r2v` (CLI) | `cli_video.py`, `_cli_helpers.py` | ✅ Automated — behavior tests assert the id threads to `generate_video(project_id=...)` for all three modes; default (no flag) → scratch project; bad id rejected at the CLI boundary. Full council review GREEN + Sonar 100% new-coverage. |
13
+ | **#235** — `project` param on MCP generate tools | `mcp/tools.py` | ✅ Automated — payload-threading tests assert `project` reaches `payload["project_id"]` (image + video), omitted → no `project_id`, bad id rejected before the worker. Reuses the CLI `_FLOW_ID_RE` validator. Council GREEN + Sonar pass. |
14
+
15
+ ## Nature of the change (why automated coverage is sufficient here)
16
+
17
+ Neither change adds new generation plumbing: the worker/daemon already consumed
18
+ `payload["project_id"]` (daemon.py:97 image, :168 video) and `FlowApiClient.generate_video`
19
+ already accepted `project_id`. Both PRs only **surface + validate** the existing
20
+ capability at the CLI and MCP boundaries, and thread it into the already-wired payload.
21
+ The end-to-end "generate into an existing project" path (browser navigation to
22
+ `project_editor_url(locale, project_id)` → `entering_existing_project`) is the same code
23
+ prior releases exercised live for `image t2i --project`.
24
+
25
+ ## Live generation status
26
+
27
+ A live credit-free run of `--project` against real Flow was **not** performed this cycle
28
+ because the available `denon82` profile's Flow session is server-side expired (HTTP 401 —
29
+ see [LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md)); exercising it requires an
30
+ interactive `gflow auth login`. The project-targeting code path is shared with the
31
+ already-live-verified `image t2i --project` path, and is fully covered by the automated
32
+ behavior tests above.
33
+
34
+ ## Automated coverage
35
+
36
+ - Full suite green on both PRs' CI (test matrix 3.11/3.12/3.13) at the merged tree.
37
+ - `pyright src`: 0 errors. `ruff check` / `ruff format --check`: clean.
38
+ - SonarCloud gate green on both PRs (#234 new-coverage 100%; #235 pass).
@@ -45,8 +45,8 @@ Both Click CLI (`src/gflow_cli/cli.py`) and MCP Server (`src/gflow_cli/mcp/`) ar
45
45
  The server registers three protocol surfaces:
46
46
 
47
47
  ### Tools (Executable actions)
48
- * `gflow_generate_image(prompt, model, aspect, count, seed, reference_images, tools, profile)`: Triggers text-to-image / image-to-image (Imagen / Nano Banana). `reference_images` switches to i2i.
49
- * `gflow_generate_video(prompt, mode, aspect, initial_frame, end_frame, reference_images, tools, profile)`: Triggers vertical or landscape video generation (Veo). `mode` is `t2v`/`i2v`/`r2v`; `i2v` requires `initial_frame`, `r2v` requires `reference_images`.
48
+ * `gflow_generate_image(prompt, model, aspect, count, seed, reference_images, tools, profile, project)`: Triggers text-to-image / image-to-image (Imagen / Nano Banana). `reference_images` switches to i2i; `project` generates into an existing Flow project id (mirrors CLI `--project`).
49
+ * `gflow_generate_video(prompt, mode, aspect, initial_frame, end_frame, reference_images, tools, profile, project)`: Triggers vertical or landscape video generation (Veo). `mode` is `t2v`/`i2v`/`r2v`; `i2v` requires `initial_frame`, `r2v` requires `reference_images`; `project` generates into an existing Flow project id (mirrors CLI `--project`).
50
50
  * `gflow_list_projects(profile, limit)`: Queries SQLite catalog for recent generation folders.
51
51
  * `gflow_list_characters(profile)`: Lists Flow Character entities (requires an active browser session).
52
52
 
@@ -4,6 +4,19 @@
4
4
 
5
5
  ## Current release
6
6
 
7
+ **v0.24.0 — alpha.** **`--project` parity across CLI + MCP.** The video commands
8
+ (`video t2v`/`i2v`/`r2v`) gain `--project <id>` to generate into an existing Flow project
9
+ instead of a scratch one (#233/#234), matching `image t2i`/`i2i`; and the MCP
10
+ `gflow_generate_image` / `gflow_generate_video` tools gain a matching `project` parameter
11
+ (#235), so agent callers get the same capability. Both surface an already-wired worker
12
+ capability (`payload["project_id"]`) and validate the id identically. Carries forward
13
+ v0.23.0 (MCP generation live + macOS 401 fix). Verification:
14
+ [LIVE_VERIFICATION_v0.24.0](LIVE_VERIFICATION_v0.24.0.md).
15
+
16
+ **Develop (unreleased, post-v0.24.0):** *(empty — develop is the staging branch for the next release).*
17
+
18
+ <details><summary>v0.23.0 — MCP generation live + macOS 401 fixed</summary>
19
+
7
20
  **v0.23.0 — alpha.** **MCP generation goes live + macOS 401 fixed.** The MCP server's
8
21
  `gflow_generate_image` / `gflow_generate_video` tools — previously non-functional stubs —
9
22
  are now wired end-to-end to the FlowWorker queue (background worker owns download +
@@ -16,7 +29,7 @@ Carries forward v0.22.0 (Tools framework) + v0.21.0 (MCP server). Verification:
16
29
  [LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP wiring proven live; #222
17
30
  reporter-verified e2e on macOS).
18
31
 
19
- **Develop (unreleased, post-v0.23.0):** *(empty — develop is the staging branch for the next release).*
32
+ </details>
20
33
 
21
34
  <details><summary>v0.22.0 — Tools framework ("Creative Director")</summary>
22
35
 
@@ -438,7 +438,11 @@ All prompts in a batch share one Flow project. The editor is opened once; each p
438
438
  Generate a video from a text prompt only.
439
439
 
440
440
  ```text
441
- gflow video t2v PROMPT [--model] [--duration] [--count] [--aspect] [--profile] [-t/--tool] [--out-dir]
441
+ gflow video t2v PROMPT [--model] [--duration] [--count] [--aspect] [--profile] [-t/--tool] [--project] [--out-dir]
442
+
443
+ Options:
444
+ --project ID Generate in this EXISTING Flow project instead of a
445
+ scratch project (see "Sharing one project across calls").
442
446
  ```
443
447
 
444
448
  ```bash
@@ -472,6 +476,8 @@ Arguments:
472
476
  Options:
473
477
  --initial-frame PATH Initial frame to animate. Canonical form; replaces the positional IMAGE.
474
478
  --end-frame PATH Optional end frame — Flow interpolates initial frame -> end frame.
479
+ --project ID Generate in this EXISTING Flow project instead of a
480
+ scratch project (see "Sharing one project across calls").
475
481
  ```
476
482
 
477
483
  ```bash
@@ -491,7 +497,9 @@ images. Per-model cap: `omni-flash` ≤7, the `veo-*` models ≤3. Fires
491
497
  gflow video r2v PROMPT --ref IMG [--ref IMG ...] [--model] [--duration] [--count] [--aspect] [...]
492
498
 
493
499
  Options:
494
- --ref PATH Reference image; repeat for up to 7 (omni-flash) / 3 (veo). [required]
500
+ --ref PATH Reference image; repeat for up to 7 (omni-flash) / 3 (veo). [required]
501
+ --project ID Generate in this EXISTING Flow project instead of a scratch
502
+ project (see "Sharing one project across calls").
495
503
  ```
496
504
 
497
505
  ```bash
@@ -499,6 +507,19 @@ gflow video r2v "a knight in this armor walks forward" --ref armor.png
499
507
  gflow video r2v "blend these worlds" --ref a.png --ref b.png --ref c.png --model omni-flash
500
508
  ```
501
509
 
510
+ ### Sharing one project across calls
511
+
512
+ By default each `video t2v` / `i2v` / `r2v` call creates its own scratch Flow
513
+ project. Pass `--project <id>` (same contract as `image t2i`/`i2i` — see
514
+ [`gflow image t2i`](#gflow-image-t2i)) to generate into an existing project
515
+ instead, e.g. to avoid one-throwaway-project-per-clip when scripting a
516
+ multi-clip storyboard:
517
+
518
+ ```bash
519
+ gflow video t2v "establishing shot" --project PROJ123
520
+ gflow video t2v "close-up reaction" --project PROJ123
521
+ ```
522
+
502
523
  ## `gflow video batch`
503
524
 
504
525
  > ⚠️ **Not yet implemented.** The `batch` subcommand currently exits with
@@ -509,10 +530,12 @@ gflow video r2v "blend these worlds" --ref a.png --ref b.png --ref c.png --model
509
530
  ### Workaround — shell for-loop
510
531
 
511
532
  Until the manifest runner lands, you can drive sequential video generations
512
- through a plain shell loop. Each `gflow video t2v` / `i2v` / `r2v` call opens
513
- its **own Flow project**, so the resulting videos will NOT share a
514
- `project_id` (unlike `gflow image batch`, which mounts one project across
515
- all prompts) — but they DO get generated and downloaded:
533
+ through a plain shell loop. Without `--project`, each `gflow video t2v` /
534
+ `i2v` / `r2v` call opens its **own Flow project**, so the resulting videos
535
+ will NOT share a `project_id` (unlike `gflow image batch`, which mounts one
536
+ project across all prompts) — but they DO get generated and downloaded. Pass
537
+ the same `--project <id>` to every call in the loop (see "Sharing one project
538
+ across calls" above) if you want them to land in one project instead:
516
539
 
517
540
  ```bash
518
541
  # bash / WSL / macOS — one prompt per line
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gflow-cli"
3
- version = "0.23.0"
3
+ version = "0.24.0"
4
4
  description = "Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal."
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -1,3 +1,3 @@
1
1
  """gflow-cli — unofficial CLI for Google Flow."""
2
2
 
3
- __version__ = "0.23.0"
3
+ __version__ = "0.24.0"
@@ -35,6 +35,7 @@ been removed. Both error handlers now import
35
35
 
36
36
  from __future__ import annotations
37
37
 
38
+ import re
38
39
  import sys
39
40
  from pathlib import Path
40
41
  from typing import TYPE_CHECKING, Any, Literal
@@ -70,16 +71,36 @@ _console = Console()
70
71
  # `reportPrivateUsage` rule does NOT honor the PEP 484 `from X import Y as Y`
71
72
  # re-export idiom for underscore names, so __all__ is the practical fix.
72
73
  __all__ = [
74
+ "_FLOW_ID_RE",
73
75
  "_handle_gflow_error",
74
76
  "_handle_unhandled_error",
75
77
  "_make_provider_dir",
76
78
  "_resolve_profile",
79
+ "_validate_project_id",
77
80
  "apply_tool_option",
78
81
  "run_with_handlers",
79
82
  "safe_path_text",
80
83
  "tool_option",
81
84
  ]
82
85
 
86
+ # Flow project ids are interpolated into navigation URLs and CSS selectors
87
+ # (page.goto, `data-tile-id='fe_id_<id>'`) before any other guard runs, so the
88
+ # `--project` option on both `image t2i`/`i2i` and `video t2v`/`i2v`/`r2v`
89
+ # validates against this allowlist at the CLI boundary. Mirrors
90
+ # `routes._PROJECT_ID_RE`. Relocated here (T4b follow-up) so the two call-site
91
+ # modules can't drift out of sync.
92
+ _FLOW_ID_RE = re.compile(r"^[A-Za-z0-9\-]{1,128}$")
93
+
94
+
95
+ def _validate_project_id(
96
+ _ctx: click.Context, param: click.Parameter, value: str | None
97
+ ) -> str | None:
98
+ """Reject a --project id that isn't alphanumeric/hyphen (1-128 chars)."""
99
+ if value is not None and not _FLOW_ID_RE.fullmatch(value):
100
+ msg = "project id must be 1-128 chars of letters, digits, or hyphens."
101
+ raise click.BadParameter(msg, param=param)
102
+ return value
103
+
83
104
 
84
105
  _TOOL_OPTION_HELP = (
85
106
  "Apply a prompt tool before generating, e.g. --tool creative-director or "
@@ -29,8 +29,10 @@ from rich.table import Table
29
29
 
30
30
  from gflow_cli import json_output
31
31
  from gflow_cli._cli_helpers import (
32
+ _FLOW_ID_RE,
32
33
  _make_provider_dir,
33
34
  _resolve_profile,
35
+ _validate_project_id,
34
36
  apply_tool_option,
35
37
  run_with_handlers,
36
38
  safe_path_text,
@@ -106,25 +108,10 @@ _CREATING_PROJECT_MSG = " Creating project..."
106
108
  _T2I_PROJECT_TITLE = "gflow-cli t2i"
107
109
  _I2I_PROJECT_TITLE = "gflow-cli i2i"
108
110
 
109
- # Flow project / character-entity ids interpolated into navigation URLs and UI
110
- # selectors. Mirror routes._PROJECT_ID_RE so untrusted --project / --reference-entity
111
- # values are rejected at the CLI boundary (closes the page.goto + CSS-selector
112
- # injection gaps before the value ever reaches the browser).
113
- _FLOW_ID_RE = re.compile(r"^[A-Za-z0-9\-]{1,128}$")
114
-
115
-
116
- def _validate_project_id(
117
- _ctx: click.Context, param: click.Parameter, value: str | None
118
- ) -> str | None:
119
- """Reject a --project id that isn't alphanumeric/hyphen (1-128 chars).
120
-
121
- The value is interpolated into the editor navigation URL (`page.goto`) before
122
- any other guard runs, so validate here at the boundary.
123
- """
124
- if value is not None and not _FLOW_ID_RE.fullmatch(value):
125
- msg = "project id must be 1-128 chars of letters, digits, or hyphens."
126
- raise click.BadParameter(msg, param=param)
127
- return value
111
+ # `_FLOW_ID_RE` / `_validate_project_id` (Flow project/character-entity id
112
+ # allowlist for --project / --reference-entity) live in gflow_cli._cli_helpers
113
+ # since they're shared with cli_video.py's --project option see that
114
+ # module's docstring for the injection-surface rationale.
128
115
 
129
116
 
130
117
  def _validate_entity_ids(
@@ -19,6 +19,7 @@ from gflow_cli import json_output
19
19
  from gflow_cli._cli_helpers import (
20
20
  _make_provider_dir,
21
21
  _resolve_profile,
22
+ _validate_project_id,
22
23
  apply_tool_option,
23
24
  run_with_handlers,
24
25
  tool_option,
@@ -37,6 +38,14 @@ if TYPE_CHECKING:
37
38
  console = Console()
38
39
  logger = structlog.get_logger(__name__)
39
40
 
41
+ _project_option = click.option(
42
+ "--project",
43
+ "project_id",
44
+ default=None,
45
+ callback=_validate_project_id,
46
+ help=("Generate in this existing Flow project id instead of creating a scratch project."),
47
+ )
48
+
40
49
 
41
50
  def _warn_persistence_failed_after_success(
42
51
  *,
@@ -66,6 +75,7 @@ async def _generate_and_report(
66
75
  out_dir: Path | None,
67
76
  command: str = "video",
68
77
  as_json: bool = False,
78
+ project_id: str | None = None,
69
79
  ) -> None:
70
80
  """Drive FlowApiClient for a single GenerateVideoRequest and print the
71
81
  result (or fail with a non-zero exit). Shared by t2v, i2v, and r2v.
@@ -103,6 +113,7 @@ async def _generate_and_report(
103
113
 
104
114
  result = await client.generate_video(
105
115
  req=request,
116
+ project_id=project_id,
106
117
  out_dir=out_dir,
107
118
  download=True,
108
119
  on_started=on_started,
@@ -160,6 +171,7 @@ async def _run_t2v(
160
171
  as_json: bool = False,
161
172
  original_prompt: str | None = None,
162
173
  tool: AppliedTool | None = None,
174
+ project_id: str | None = None,
163
175
  ) -> None:
164
176
  from gflow_cli.api.video import Aspect, GenerateVideoRequest, Mode, VideoModel
165
177
 
@@ -180,24 +192,38 @@ async def _run_t2v(
180
192
  out_dir=out_dir,
181
193
  command="video t2v",
182
194
  as_json=as_json,
195
+ project_id=project_id,
183
196
  )
184
197
 
185
198
 
199
+ @dataclass(frozen=True)
200
+ class _I2VParams:
201
+ """Bundles image-to-video generation options for :func:`_run_i2v`.
202
+
203
+ Separating these from the profile/output/count fields keeps the function
204
+ signature below Sonar's 13-parameter limit (S107) while preserving every
205
+ CLI option. Mirrors `cli_image.py`'s `_I2IParams`.
206
+ """
207
+
208
+ image: str
209
+ prompt: str
210
+ aspect: str
211
+ end_frame: str | None = None
212
+ model: str | None = None
213
+ duration: int | None = None
214
+ original_prompt: str | None = None
215
+ tool: AppliedTool | None = None
216
+
217
+
186
218
  async def _run_i2v(
187
219
  *,
188
220
  profile_name: str,
189
221
  profile_dir: Path,
190
- image: str,
191
- prompt: str,
192
- aspect: str,
222
+ params: _I2VParams,
193
223
  out_dir: Path | None,
194
- end_frame: str | None = None,
195
- model: str | None = None,
196
- duration: int | None = None,
197
224
  count: int = 1,
198
225
  as_json: bool = False,
199
- original_prompt: str | None = None,
200
- tool: AppliedTool | None = None,
226
+ project_id: str | None = None,
201
227
  ) -> None:
202
228
  from gflow_cli.api.video import (
203
229
  I2V_DEFAULT_MODEL,
@@ -213,7 +239,7 @@ async def _run_i2v(
213
239
  # direct programmatic call can still smuggle it in. omni-flash silently
214
240
  # drops the start/end frames at submit and routes to T2V (issue #125), so
215
241
  # reject it here before any paid call.
216
- resolved_model = VideoModel.from_cli(model)
242
+ resolved_model = VideoModel.from_cli(params.model)
217
243
  if resolved_model is None:
218
244
  resolved_model = I2V_DEFAULT_MODEL
219
245
  elif not resolved_model.supports_i2v_interpolation():
@@ -225,16 +251,16 @@ async def _run_i2v(
225
251
  raise ModelModeIncompatibilityError(detail=msg)
226
252
 
227
253
  request = GenerateVideoRequest(
228
- prompt=prompt,
254
+ prompt=params.prompt,
229
255
  mode=Mode.I2V,
230
- aspect=Aspect.from_cli(aspect),
256
+ aspect=Aspect.from_cli(params.aspect),
231
257
  model=resolved_model,
232
- duration=duration,
258
+ duration=params.duration,
233
259
  count=count,
234
- start_image=Path(image),
235
- end_image=Path(end_frame) if end_frame else None,
236
- original_prompt=original_prompt,
237
- tool=tool,
260
+ start_image=Path(params.image),
261
+ end_image=Path(params.end_frame) if params.end_frame else None,
262
+ original_prompt=params.original_prompt,
263
+ tool=params.tool,
238
264
  )
239
265
  await _generate_and_report(
240
266
  request,
@@ -243,6 +269,7 @@ async def _run_i2v(
243
269
  out_dir=out_dir,
244
270
  command="video i2v",
245
271
  as_json=as_json,
272
+ project_id=project_id,
246
273
  )
247
274
 
248
275
 
@@ -260,6 +287,7 @@ async def _run_r2v(
260
287
  as_json: bool = False,
261
288
  original_prompt: str | None = None,
262
289
  tool: AppliedTool | None = None,
290
+ project_id: str | None = None,
263
291
  ) -> None:
264
292
  from gflow_cli.api.video import Aspect, GenerateVideoRequest, Mode, VideoModel
265
293
 
@@ -281,6 +309,7 @@ async def _run_r2v(
281
309
  out_dir=out_dir,
282
310
  command="video r2v",
283
311
  as_json=as_json,
312
+ project_id=project_id,
284
313
  )
285
314
 
286
315
 
@@ -769,6 +798,7 @@ def video() -> None:
769
798
  "falls back to the original prompt if unset or on error."
770
799
  ),
771
800
  )
801
+ @_project_option
772
802
  @click.option(
773
803
  "--out-dir",
774
804
  "out_dir",
@@ -790,6 +820,7 @@ def t2v(
790
820
  count: int,
791
821
  profile: str | None,
792
822
  tool_specs: tuple[str, ...],
823
+ project_id: str | None,
793
824
  out_dir: Path | None,
794
825
  as_json: bool,
795
826
  ) -> None:
@@ -812,6 +843,7 @@ def t2v(
812
843
  as_json=as_json,
813
844
  original_prompt=original_prompt,
814
845
  tool=applied_tool,
846
+ project_id=project_id,
815
847
  ),
816
848
  cli_command="video t2v",
817
849
  as_json=as_json,
@@ -930,6 +962,7 @@ def _resolve_i2v_args(
930
962
  )
931
963
  @click.option("--profile", default=None, help="Profile name (overrides default).")
932
964
  @tool_option
965
+ @_project_option
933
966
  @click.option(
934
967
  "--out-dir",
935
968
  "out_dir",
@@ -943,7 +976,7 @@ def _resolve_i2v_args(
943
976
  is_flag=True,
944
977
  help="Emit a machine-readable JSON result instead of Rich output.",
945
978
  )
946
- def i2v(
979
+ def i2v( # NOSONAR
947
980
  image: str | None,
948
981
  prompt: str | None,
949
982
  initial_frame: str | None,
@@ -955,6 +988,7 @@ def i2v(
955
988
  count: int,
956
989
  profile: str | None,
957
990
  tool_specs: tuple[str, ...],
991
+ project_id: str | None,
958
992
  out_dir: Path | None,
959
993
  as_json: bool,
960
994
  ) -> None:
@@ -976,21 +1010,25 @@ def i2v(
976
1010
  prompt_to_send, original_prompt, applied_tool = apply_tool_option(
977
1011
  resolved_prompt, tool_specs, category="video", quiet=as_json
978
1012
  )
1013
+ i2v_params = _I2VParams(
1014
+ image=resolved_image,
1015
+ prompt=prompt_to_send,
1016
+ aspect=aspect,
1017
+ end_frame=end_frame,
1018
+ model=model,
1019
+ duration=int(duration) if duration is not None else None,
1020
+ original_prompt=original_prompt,
1021
+ tool=applied_tool,
1022
+ )
979
1023
  run_with_handlers(
980
1024
  lambda: _run_i2v(
981
1025
  profile_name=profile_name,
982
1026
  profile_dir=provider_dir,
983
- image=resolved_image,
984
- prompt=prompt_to_send,
985
- end_frame=end_frame,
986
- aspect=aspect,
987
- model=model,
988
- duration=int(duration) if duration is not None else None,
1027
+ params=i2v_params,
989
1028
  count=count,
990
1029
  out_dir=out_dir,
991
1030
  as_json=as_json,
992
- original_prompt=original_prompt,
993
- tool=applied_tool,
1031
+ project_id=project_id,
994
1032
  ),
995
1033
  cli_command="video i2v",
996
1034
  as_json=as_json,
@@ -1051,6 +1089,7 @@ def i2v(
1051
1089
  )
1052
1090
  @click.option("--profile", default=None, help="Profile name (overrides default).")
1053
1091
  @tool_option
1092
+ @_project_option
1054
1093
  @click.option(
1055
1094
  "--out-dir",
1056
1095
  "out_dir",
@@ -1073,6 +1112,7 @@ def r2v(
1073
1112
  count: int,
1074
1113
  profile: str | None,
1075
1114
  tool_specs: tuple[str, ...],
1115
+ project_id: str | None,
1076
1116
  out_dir: Path | None,
1077
1117
  as_json: bool,
1078
1118
  ) -> None:
@@ -1114,6 +1154,7 @@ def r2v(
1114
1154
  as_json=as_json,
1115
1155
  original_prompt=original_prompt,
1116
1156
  tool=applied_tool,
1157
+ project_id=project_id,
1117
1158
  ),
1118
1159
  cli_command="video r2v",
1119
1160
  as_json=as_json,